diff --git a/app/src/main/java/com/muqingbfq/MediaPlayer.java b/app/src/main/java/com/muqingbfq/MediaPlayer.java index 6bb8e80..16c0c4a 100644 --- a/app/src/main/java/com/muqingbfq/MediaPlayer.java +++ b/app/src/main/java/com/muqingbfq/MediaPlayer.java @@ -137,7 +137,6 @@ public class MediaPlayer extends android.media.MediaPlayer { Glide.with(main.application) .asBitmap() .load(bfqkz.xm.picurl) - .error(R.drawable.icon) .listener(new RequestListener() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, @@ -151,9 +150,10 @@ public class MediaPlayer extends android.media.MediaPlayer { byte[] albumImage = id3v2Tag.getAlbumImage(); bfq.bitmap= BitmapFactory.decodeByteArray(albumImage, 0, albumImage.length); + } } catch (Exception a) { - gj.sc("yc:"+a); + gj.sc(getClass() + " yc:" + a); } if (bfqkz.notify != null) { bfqkz.notify.tzl(); diff --git a/app/src/main/java/com/muqingbfq/api/FileDownloader.java b/app/src/main/java/com/muqingbfq/api/FileDownloader.java index 5c1ef0e..ec37041 100644 --- a/app/src/main/java/com/muqingbfq/api/FileDownloader.java +++ b/app/src/main/java/com/muqingbfq/api/FileDownloader.java @@ -3,6 +3,7 @@ package com.muqingbfq.api; import android.content.Context; import android.graphics.Bitmap; +import android.os.Build; import android.widget.TextView; import androidx.annotation.NonNull; @@ -133,11 +134,14 @@ public class FileDownloader { id3v2Tag.setTitle(x.name); id3v2Tag.setArtist(x.zz); id3v2Tag.setAlbum(x.zz); - id3v2Tag.setLyrics(bfq.lrc); + id3v2Tag.setLyrics(com.muqingbfq.api.url.Lrc(x.id)); ByteArrayOutputStream o = new ByteArrayOutputStream(); - bfq.bitmap.compress(Bitmap.CompressFormat.JPEG, 100, o); - byte[] imageData = o.toByteArray(); - id3v2Tag.setAlbumImage(imageData, "image/jpeg"); + Request build = new Request.Builder().url(x.picurl) + .build(); + Response execute = client.newCall(build).execute(); + if (execute.isSuccessful()) { + id3v2Tag.setAlbumImage(execute.body().bytes(), "image/jpeg"); + } o.close(); mp3file.save(wj.mp3 + x.id); outputFile.delete(); diff --git a/app/src/main/java/com/muqingbfq/api/playlist.java b/app/src/main/java/com/muqingbfq/api/playlist.java index c9ca4bf..9a2bbf7 100644 --- a/app/src/main/java/com/muqingbfq/api/playlist.java +++ b/app/src/main/java/com/muqingbfq/api/playlist.java @@ -39,7 +39,7 @@ public class playlist extends Thread { if (wj.cz(wj.gd + uid)) { hq = wj.dqwb(wj.gd + uid); } else { - hq = wl.hq(api + uid + "&limit=30"); + hq = wl.hq(api + uid + "&limit=100" + "&cookie=" + wl.Cookie); } JSONObject json = new JSONObject(hq); JSONArray songs = json.getJSONArray("songs"); diff --git a/app/src/main/java/com/muqingbfq/api/url.java b/app/src/main/java/com/muqingbfq/api/url.java index 5b15d9e..507e448 100644 --- a/app/src/main/java/com/muqingbfq/api/url.java +++ b/app/src/main/java/com/muqingbfq/api/url.java @@ -151,6 +151,10 @@ public class url extends Thread { } } + public static String Lrc(String id) { + return wl.hq("/lyric?id=" + id); + } + public static String picurl(String id) { String hq = wl.hq("/song/detail?ids=" + id); try { diff --git a/app/src/main/java/com/muqingbfq/fragment/Media.java b/app/src/main/java/com/muqingbfq/fragment/Media.java index 70c18b0..9a19b88 100644 --- a/app/src/main/java/com/muqingbfq/fragment/Media.java +++ b/app/src/main/java/com/muqingbfq/fragment/Media.java @@ -1,5 +1,7 @@ package com.muqingbfq.fragment; +import android.graphics.BitmapFactory; + import androidx.annotation.NonNull; import com.google.android.material.slider.Slider; @@ -62,12 +64,7 @@ public class Media { } public Media(ActivityBfqBinding binding) { - binding.tdt.addOnChangeListener(new Slider.OnChangeListener() { - @Override - public void onValueChange(@NonNull Slider slider, float value, boolean fromUser) { - setTime_b(bfq_an.getTime((long) value)); - } - }); + binding.tdt.addOnChangeListener((slider, value, fromUser) -> setTime_b(bfq_an.getTime((long) value))); binding.tdt.addOnSliderTouchListener(new Slider.OnSliderTouchListener() { @Override public void onStartTrackingTouch(@NonNull Slider slider) { @@ -139,6 +136,9 @@ public class Media { if (bfq.view == null) { return; } + if (bfq.bitmap == null) { + bfq.bitmap= BitmapFactory.decodeResource(bfq.view.getResources(), R.drawable.icon); + } main.handler.post(() -> bfq.binding.cardview.setImage(com.muqingbfq.bfq.bitmap)); } } diff --git a/app/src/main/java/com/muqingbfq/fragment/gd.java b/app/src/main/java/com/muqingbfq/fragment/gd.java index 5c61b7b..4cdf713 100644 --- a/app/src/main/java/com/muqingbfq/fragment/gd.java +++ b/app/src/main/java/com/muqingbfq/fragment/gd.java @@ -6,8 +6,6 @@ import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; @@ -21,7 +19,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.muqingbfq.R; -import com.muqingbfq.activity_about_software; +import com.muqingbfq.XM; import com.muqingbfq.api.playlist; import com.muqingbfq.api.resource; import com.muqingbfq.bfq_an; @@ -32,14 +30,13 @@ import com.muqingbfq.mq.gj; import com.muqingbfq.mq.wj; import com.muqingbfq.mq.wl; import com.muqingbfq.view.CardImage; -import com.muqingbfq.XM; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.io.File; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Objects; @@ -61,7 +58,6 @@ public class gd extends com.muqingbfq.mq.FragmentActivity { binding.lb.setLayoutManager(gridLayoutManager); binding.lb.setAdapter(adapter); String id = intent.getStringExtra("id"); -// inflate.bfqDb.setBackground(gd.color); new start(id); } @@ -135,7 +131,7 @@ public class gd extends com.muqingbfq.mq.FragmentActivity { @Override public void onBindViewHolder(@NonNull VH holder, int position) { XM xm = list.get(position); - CARD card = new CARD(xm); + CARD card = new CARD(position); if (bool) { holder.itemView.setOnClickListener(card); holder.itemView.setOnLongClickListener(card); @@ -152,12 +148,13 @@ public class gd extends com.muqingbfq.mq.FragmentActivity { public void run() { super.run(); boolean an = playlist.hq(bfqkz.list, xm.id); + if (bfqkz.ms == 2) { + Collections.shuffle(bfqkz.list); + } main.handler.post(() -> { if (an) { bfq_an.xyq(); tx.setImageResource(R.drawable.bf); - main.edit.putString(main.mp3, xm.id); - main.edit.commit(); gdid = xm.id; } notifyDataSetChanged(); @@ -181,14 +178,16 @@ public class gd extends com.muqingbfq.mq.FragmentActivity { class CARD implements View.OnClickListener , View.OnLongClickListener { - XM xm; + int position; - public CARD(XM xm) { - this.xm = xm; + public CARD(int position) { + this.position = position; } + @Override public void onClick(View view) { Context context = view.getContext(); + XM xm = list.get(position); Intent intent = new Intent(context, mp3.class); intent.putExtra("id", xm.id); intent.putExtra("name", xm.name); @@ -197,66 +196,60 @@ public class gd extends com.muqingbfq.mq.FragmentActivity { @Override public boolean onLongClick(View view) { + XM xm = list.get(position); String[] stringArray = view.getResources() .getStringArray(R.array.gd_list); - new MaterialAlertDialogBuilder(view.getContext()).setItems(stringArray, (dialog, id) -> { - new Thread() { - @Override - public void run() { - if (id == 0) { - String hq = wl.hq(playlist.api + xm.id + "&limit=100"); - if (hq != null) { - wj.xrwb(wj.gd + xm.id, hq); - try { - JSONObject jsonObject = new JSONObject(); - if (wj.cz(wj.gd_xz)) { - jsonObject = new JSONObject(Objects.requireNonNull(wj.dqwb(wj.gd_xz))); + if (!wj.cz(wj.gd + xm.id)) { + stringArray = new String[]{"下载歌单"}; + } + new MaterialAlertDialogBuilder(view.getContext()). + setItems(stringArray, (dialog, id) -> { + new Thread() { + @Override + public void run() { + if (id == 0) { + String hq = wl.hq(playlist.api + xm.id + "&limit=100"); + if (hq != null) { + wj.xrwb(wj.gd + xm.id, hq); + try { + JSONObject jsonObject = new JSONObject(); + if (wj.cz(wj.gd_xz)) { + jsonObject = new JSONObject(Objects.requireNonNull(wj.dqwb(wj.gd_xz))); + } + XM fh = resource.Playlist_content(xm.id); + JSONObject json = new JSONObject(); + json.put("name", fh.name); + json.put("picUrl", fh.picurl); + jsonObject.put(fh.id, json); + wj.xrwb(wj.gd_xz, jsonObject.toString()); + main.handler.post(() -> notifyItemChanged(position)); + } catch (JSONException e) { + gj.sc("list gd onclick thear " + e); + } } - XM fh=resource.Playlist_content(xm.id); - JSONObject json = new JSONObject(); - json.put("name", fh.name); - json.put("picUrl", fh.picurl); - jsonObject.put(fh.id, json); - wj.xrwb(wj.gd_xz, jsonObject.toString()); - main.handler.post(new sx()); - } catch (JSONException e) { - gj.sc("list gd onclick thear " + e); - } - } - } else if (id == 2) { - wj.sc(wj.gd + xm.id); - if (xm.id.equals("mp3_xz.json")) { - wj.sc(new File(wj.mp3)); + } else if (id == 2) { + wj.sc(wj.gd + xm.id); + try { + JSONObject jsonObject = new JSONObject(Objects.requireNonNull(wj.dqwb(wj.gd_xz))); + jsonObject.remove(xm.id); + list.remove(xm); + wj.xrwb(wj.gd_xz, jsonObject.toString()); + } catch (JSONException e) { + gj.sc(e); + } + } + main.handler.post(() -> notifyItemChanged(position)); } - try { - JSONObject jsonObject = new JSONObject(Objects.requireNonNull(wj.dqwb(wj.gd_xz))); - jsonObject.remove(xm.id); - list.remove(xm); - wj.xrwb(wj.gd_xz, jsonObject.toString()); - } catch (JSONException e) { - gj.sc(e); - } - } - main.handler.post(new sx()); - } - }.start(); - // 在这里处理菜单项的点击事件 - dialog.dismiss(); - }).show(); + }.start(); + // 在这里处理菜单项的点击事件 + dialog.dismiss(); + }).show(); return false; } } - class sx implements Runnable { - @SuppressLint("NotifyDataSetChanged") - @Override - public void run() { - notifyDataSetChanged(); - } - } - } static class VH extends RecyclerView.ViewHolder { diff --git a/app/src/main/java/com/muqingbfq/fragment/gd_adapter.java b/app/src/main/java/com/muqingbfq/fragment/gd_adapter.java index 4bbb3ac..d6a57bb 100644 --- a/app/src/main/java/com/muqingbfq/fragment/gd_adapter.java +++ b/app/src/main/java/com/muqingbfq/fragment/gd_adapter.java @@ -5,56 +5,158 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.FrameLayout; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; -import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.muqingbfq.api.resource; -import com.muqingbfq.main; +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import com.muqingbfq.MP3; +import com.muqingbfq.R; import com.muqingbfq.XM; +import com.muqingbfq.api.resource; +import com.muqingbfq.api.url; +import com.muqingbfq.bfq; +import com.muqingbfq.bfqkz; +import com.muqingbfq.databinding.FragmentGdBinding; +import com.muqingbfq.databinding.ListMp3ImageBinding; +import com.muqingbfq.main; +import com.muqingbfq.mq.gj; +import com.muqingbfq.mq.wl; + +import org.json.JSONArray; +import org.json.JSONObject; import java.util.ArrayList; import java.util.List; public class gd_adapter extends Fragment { + List list = new ArrayList<>(); + List listmp3 = new ArrayList<>(); + + FragmentGdBinding binding; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - FrameLayout layout = new FrameLayout(getContext()); - List list = new ArrayList<>(); - RecyclerView recyclerView = new RecyclerView(layout.getContext()); - int k = (int) (main.k / getResources().getDisplayMetrics().density + 0.5f); - GridLayoutManager gridLayoutManager = new GridLayoutManager(layout.getContext(), k / 120); - recyclerView.setLayoutManager(gridLayoutManager); - layout.addView(recyclerView); - gd.baseadapter baseadapter = new gd.baseadapter(getContext(), list); - recyclerView.setAdapter(baseadapter); + binding = FragmentGdBinding.inflate(getLayoutInflater(), container, false); + + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext()); + linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); + binding.recyclerview1.setHasFixedSize(true); + binding.recyclerview1.setNestedScrollingEnabled(false); + binding.recyclerview1.setLayoutManager(linearLayoutManager); + binding.recyclerview1.setAdapter(new gd.baseadapter(getContext(), list)); new Thread() { - @SuppressLint("NotifyDataSetChanged") @Override public void run() { super.run(); resource.recommend(list); - main.handler.post(new sx(baseadapter)); + main.handler.post(new sx()); } }.start(); - return layout; + + binding.recyclerview2.setFocusable(false); + binding.recyclerview2.setLayoutManager(new LinearLayoutManager(getContext()){ + @Override + public boolean canScrollVertically() { + return false; + } + }); + + binding.recyclerview2.setAdapter(new RecyclerView.Adapter() { + @NonNull + @Override + public VH_MP3 onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new VH_MP3(ListMp3ImageBinding.inflate(getLayoutInflater(), parent, false)); + } + + @SuppressLint("NotifyDataSetChanged") + @Override + public void onBindViewHolder(@NonNull VH_MP3 holder, int position) { + MP3 x = listmp3.get(position); + holder.binding.wb1.setText(x.name); + holder.binding.zz.setText(x.zz); + int color = ContextCompat.getColor(getContext(), R.color.text); + if (bfqkz.xm != null && x.id.equals(bfqkz.xm.id)) { + color = ContextCompat.getColor(getContext(), R.color.text_cz); + } + holder.binding.wb1.setTextColor(color); + holder.binding.zz.setTextColor(color); + holder.itemView.setOnClickListener(view -> { + if (bfqkz.xm == null || !bfqkz.xm.id.equals(x.id)) { + bfqkz.xm = x; + new url(x); + notifyDataSetChanged(); + } + bfqkz.list.add(0, x); +// bfqkz.list.addAll(list); + bfq.start(getContext()); + }); + Glide.with(getContext()).load(x.picurl) + .apply(new RequestOptions().placeholder(R.drawable.ic_launcher_foreground)) + .error(R.drawable.ic_launcher_foreground) + .into(holder.binding.imageView); + } + + @Override + public int getItemCount() { + return listmp3.size(); + } + }); + mp3list(); + return binding.getRoot(); } - private class sx implements Runnable { - RecyclerView.Adapter baseadapter; - public sx(RecyclerView.Adapter baseadapter) { - this.baseadapter = baseadapter; - } - @SuppressLint("NotifyDataSetChanged") - @Override - public void run() { - baseadapter.notifyDataSetChanged(); + + class VH_MP3 extends RecyclerView.ViewHolder { + ListMp3ImageBinding binding; + public VH_MP3(@NonNull ListMp3ImageBinding itemView) { + super(itemView.getRoot()); + this.binding = itemView; } } + private class sx implements Runnable { + @SuppressLint("NotifyDataSetChanged") + @Override + public void run() { + binding.recyclerview1.getAdapter().notifyDataSetChanged(); + } + } + + public void mp3list() { + new Thread(){ + @SuppressLint("NotifyDataSetChanged") + @Override + public void run() { + super.run(); + String hq = wl.hq("/recommend/songs" + "?cookie=" + wl.Cookie); + try { + JSONObject jsonObject = new JSONObject(hq); + JSONObject data = jsonObject.getJSONObject("data"); + JSONArray dailySongs = data.getJSONArray("dailySongs"); + for (int i = 0; i < dailySongs.length(); i++) { + JSONObject jsonObject1 = dailySongs.getJSONObject(i); + String id = jsonObject1.getString("id"); + String name = jsonObject1.getString("name"); + JSONArray ar = jsonObject1.getJSONArray("ar"); + StringBuilder zz = new StringBuilder(); + for (int j = 0; j < ar.length(); j++) { + zz.append(ar.getJSONObject(j).getString("name")).append(' '); + } + JSONObject al = jsonObject1.getJSONObject("al"); + String picUrl = al.getString("picUrl"); + listmp3.add(new MP3(id, name, zz.toString(), picUrl)); + } + main.handler.post(() -> binding.recyclerview2.getAdapter().notifyDataSetChanged()); + } catch (Exception e) { + gj.sc(e); + } + } + }.start(); + } } diff --git a/app/src/main/java/com/muqingbfq/fragment/mp3.java b/app/src/main/java/com/muqingbfq/fragment/mp3.java index 460a426..a3aea1e 100644 --- a/app/src/main/java/com/muqingbfq/fragment/mp3.java +++ b/app/src/main/java/com/muqingbfq/fragment/mp3.java @@ -18,7 +18,6 @@ import androidx.recyclerview.widget.RecyclerView; import com.muqingbfq.MP3; import com.muqingbfq.R; -import com.muqingbfq.XM; import com.muqingbfq.api.FileDownloader; import com.muqingbfq.api.playlist; import com.muqingbfq.api.url; diff --git a/app/src/main/java/com/muqingbfq/fragment/wode.java b/app/src/main/java/com/muqingbfq/fragment/wode.java index cd8089a..9e0dc1b 100644 --- a/app/src/main/java/com/muqingbfq/fragment/wode.java +++ b/app/src/main/java/com/muqingbfq/fragment/wode.java @@ -25,6 +25,7 @@ import com.muqingbfq.login.user_editing; import com.muqingbfq.login.user_logs; import com.muqingbfq.login.user_message; import com.muqingbfq.main; +import com.muqingbfq.mq.EditViewDialog; import com.muqingbfq.mq.gj; import com.muqingbfq.mq.wj; import com.muqingbfq.XM; @@ -47,7 +48,7 @@ public class wode extends Fragment { {R.drawable.download, "下载音乐", "mp3_xz.json"}, {R.drawable.like, "喜欢音乐", "mp3_like.json"}, {R.drawable.icon, "本地搜索", ""}, - {R.drawable.icon, "我的歌单", ""}, + {R.drawable.fuwuzhongxing, "更换接口", "API"}, {R.drawable.icon, "导入歌单", ""}, {R.drawable.paihangbang, "排行榜", "排行榜"}, {R.drawable.icon, "开发中", ""} @@ -112,6 +113,23 @@ public class wode extends Fragment { b.putExtra("name", s); getContext().startActivity(b); break; + case "API": + EditViewDialog editViewDialog = new EditViewDialog(getContext(), "更换接口API") + .setMessage("当前接口:\n" + main.api); + editViewDialog.setPositive(view1 -> { + String str = editViewDialog.getEditText(); + boolean http = str.startsWith("http"); + if (str.isEmpty() || !http) { + gj.ts(getContext(), "请输入正确的api"); + } else { + gj.ts(getContext(), "更换成功"); + main.api = str; + wj.xrwb(wj.filesdri+"API.mq", main.api); + editViewDialog.dismiss(); + } + }).show(); + break; + } }); } diff --git a/app/src/main/java/com/muqingbfq/home.java b/app/src/main/java/com/muqingbfq/home.java index 57a0301..e4c0f37 100644 --- a/app/src/main/java/com/muqingbfq/home.java +++ b/app/src/main/java/com/muqingbfq/home.java @@ -154,36 +154,6 @@ public class home extends AppCompatActivity { } }); } - - @Override - protected void onStart() { - super.onStart(); - stopService(new Intent(this, FloatingLyricsService.class)); - } - - ActivityResultLauncher LyricsService = - registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { - if (Settings.canDrawOverlays(this)) { - startService(new Intent(this, FloatingLyricsService.class)); - } - }); - - @Override - protected void onStop() { - super.onStop(); - if (!FloatingLyricsService.get()) { - return; - } - if (!Settings.canDrawOverlays(this)) { - // 无权限,需要申请权限 - Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, - Uri.parse("package:" + getPackageName())); - LyricsService.launch(intent); - } else { - startService(new Intent(this, FloatingLyricsService.class)); - } - } - @Override protected void onPause() { super.onPause(); diff --git a/app/src/main/java/com/muqingbfq/main.java b/app/src/main/java/com/muqingbfq/main.java index 6a56926..6c067fa 100644 --- a/app/src/main/java/com/muqingbfq/main.java +++ b/app/src/main/java/com/muqingbfq/main.java @@ -1,19 +1,29 @@ package com.muqingbfq; import android.annotation.SuppressLint; +import android.app.Activity; import android.app.Application; import android.content.Intent; import android.content.SharedPreferences; +import android.net.Uri; +import android.os.Bundle; import android.os.Handler; import android.os.Looper; +import android.provider.Settings; +import android.text.TextUtils; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; import androidx.appcompat.app.AppCompatDelegate; import com.muqingbfq.login.visitor; import com.muqingbfq.mq.FloatingLyricsService; +import com.muqingbfq.mq.gj; import com.muqingbfq.mq.wj; import com.muqingbfq.mq.wl; +import java.io.File; + public class main extends Application { public static Application application; @@ -24,10 +34,9 @@ public class main extends Application { public static SharedPreferences sp; public static SharedPreferences.Editor edit; - public static String mp3 = "mp3", - Cookie = "Cookie"; public static String account,token; + public int count = 0; @SuppressLint("HardwareIds") @Override public void onCreate() { @@ -35,6 +44,17 @@ public class main extends Application { if (wj.filesdri == null) { new wj(this); } + File file = new File(wj.filesdri + "API.mq"); + if (file.exists()&&file.isFile()) { + String dqwb = wj.dqwb(file.toString()); + if (!TextUtils.isEmpty(dqwb) && dqwb.startsWith("http")) { + api = dqwb; + } else { + file.delete(); + } + } else { + wj.xrwb(file.toString(), main.api); + } application = this; // UUID.randomUUID().toString(); sp = getSharedPreferences("Set_up", MODE_PRIVATE); @@ -48,9 +68,9 @@ public class main extends Application { com.muqingbfq.bfqkz.ms = 1; } try { - wl.Cookie = sp.getString(Cookie, ""); + wl.Cookie = sp.getString("Cookie", ""); } catch (Exception e) { - edit.putString(Cookie, ""); + edit.putString("Cookie", ""); wl.Cookie = ""; bj = true; } @@ -58,7 +78,7 @@ public class main extends Application { edit.commit(); } - wl.Cookie = main.sp.getString(main.Cookie, ""); + wl.Cookie = main.sp.getString("Cookie", ""); if (wl.Cookie.equals("")) { new visitor(); } @@ -71,6 +91,70 @@ public class main extends Application { edit.apply(); } AppCompatDelegate.setDefaultNightMode(i); + + + registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() { + @Override + public void onActivityCreated(Activity activity, Bundle savedInstanceState) { + } + + @Override + public void onActivityStarted(Activity activity) { + if (count == 0) { //后台切换到前台 + gj.sc(">>>>>>>>>>>>>>>>>>>App切到前台"); + if (FloatingLyricsService.lei != null) { + stopService(new Intent(main.this, FloatingLyricsService.class)); + } + } + count++; + } + + @Override + public void onActivityResumed(Activity activity) { + } + + @Override + public void onActivityPaused(Activity activity) { + + } + + @Override + public void onActivityStopped(Activity activity) { + count--; + if (count == 0) { //后台切换到前台 + gj.sc(">>>>>>>>>>>>>>>>>>>App切到后台"); + new Thread(){ + @Override + public void run() { + try { + sleep(1000); + } catch (InterruptedException e) { + e.toString(); + } +// gj.sc(count); + if (count != 0) { + return; + } + if (!FloatingLyricsService.get()) { + return; + } + if (Settings.canDrawOverlays(main.this)) { + startService(new Intent(main.this, FloatingLyricsService.class)); + } + super.run(); + } + }.start(); + } + } + + @Override + public void onActivitySaveInstanceState(Activity activity, Bundle outState) { + } + + @Override + public void onActivityDestroyed(Activity activity) { + } + }); } public static SharedPreferences getSharedPreferences(String string) { diff --git a/app/src/main/java/com/muqingbfq/mq/FloatingLyricsService.java b/app/src/main/java/com/muqingbfq/mq/FloatingLyricsService.java index 17f22d5..2958a5f 100644 --- a/app/src/main/java/com/muqingbfq/mq/FloatingLyricsService.java +++ b/app/src/main/java/com/muqingbfq/mq/FloatingLyricsService.java @@ -31,6 +31,7 @@ import java.lang.reflect.Type; public class FloatingLyricsService extends Service implements View.OnClickListener, View.OnTouchListener { private WindowManager windowManager; private View layout; + public Runnable updateSeekBar = new Runnable() { @Override public void run() { @@ -38,12 +39,17 @@ public class FloatingLyricsService extends Service implements View.OnClickListen long position = bfqkz.mt.getCurrentPosition(); lrcView.setTimeLrc(position); } +/* boolean appInForeground = gj.isAppInForeground(FloatingLyricsService.this); + if (appInForeground) { + layout.setVisibility(View.GONE); + } else { + layout.setVisibility(View.VISIBLE); + }*/ handler.postDelayed(this, 1000); // 每秒更新一次进度 } }; @SuppressLint("StaticFieldLeak") public static FloatingLyricsService lei; - public static boolean get() { File file = new File(wj.filesdri + "FloatingLyricsService.json"); if (file.exists() && file.isFile()) { @@ -81,6 +87,8 @@ public class FloatingLyricsService extends Service implements View.OnClickListen | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; } + + @Override public void onCreate() { super.onCreate(); @@ -168,6 +176,10 @@ public class FloatingLyricsService extends Service implements View.OnClickListen new Gson().toJson(setup)); } public static void baocun(SETUP setup) { + if (setup == null) { + return; + } + wj.xrwb(new File(wj.filesdri + "FloatingLyricsService.json").toString(), new Gson().toJson(setup)); } diff --git a/app/src/main/java/com/muqingbfq/mq/gj.java b/app/src/main/java/com/muqingbfq/mq/gj.java index c331d0c..5d358b4 100644 --- a/app/src/main/java/com/muqingbfq/mq/gj.java +++ b/app/src/main/java/com/muqingbfq/mq/gj.java @@ -1,10 +1,13 @@ package com.muqingbfq.mq; +import android.app.ActivityManager; +import android.app.Service; +import android.app.usage.UsageStats; +import android.app.usage.UsageStatsManager; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; -import android.content.res.Configuration; import android.net.Uri; import android.util.DisplayMetrics; import android.util.Log; @@ -19,6 +22,7 @@ import org.json.JSONObject; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Collections; +import java.util.List; public class gj { public static void ts(Context a, Object b) { @@ -29,17 +33,27 @@ public class gj { main.handler.post(() -> Toast.makeText(context, b.toString(), Toast.LENGTH_SHORT).show()); } + public static boolean isAppInForeground(Context context) { + ActivityManager activityManager = (ActivityManager) context.getSystemService(Service.ACTIVITY_SERVICE); + List runningAppProcessInfoList = activityManager.getRunningAppProcesses(); + if (runningAppProcessInfoList == null) { + Log.d("runningAppProcess:", "runningAppProcessInfoList is null!"); + return false; + } + for (ActivityManager.RunningAppProcessInfo processInfo : runningAppProcessInfoList) { + if (processInfo.processName.equals(context.getPackageName()) && (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND)) { + return true; + } + } + return false; + } public static boolean isTablet(Context context) { boolean b; DisplayMetrics dm = context.getResources().getDisplayMetrics(); main.k = dm.widthPixels; main.g = dm.heightPixels; - if (main.k > main.g) { - b = true; - } else { - b = false; - } + b = main.k > main.g; return b; } public static void sc(Object a) { @@ -122,9 +136,7 @@ public class gj { main.handler.post(() -> new MaterialAlertDialogBuilder(context) .setTitle("更新" + bb) .setMessage(msg+"\n"+"取消后不再提示更新你需要到关于软件手动检测") - .setNegativeButton("取消", (dialogInterface, i) -> { - wj.xrwb(wj.filesdri + "gx.mq", null); - }) + .setNegativeButton("取消", (dialogInterface, i) -> wj.xrwb(wj.filesdri + "gx.mq", null)) .setPositiveButton("更新", (dialogInterface, i) -> context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)))) // new ApkDownloader(context).downloadAndInstall(url, wj.filesdri)) diff --git a/app/src/main/java/com/muqingbfq/mq/wl.java b/app/src/main/java/com/muqingbfq/mq/wl.java index 60f7d96..fd32bc4 100644 --- a/app/src/main/java/com/muqingbfq/mq/wl.java +++ b/app/src/main/java/com/muqingbfq/mq/wl.java @@ -19,7 +19,7 @@ public class wl { public static void setcookie(String cookie) { wl.Cookie = cookie; - main.edit.putString(main.Cookie, cookie); + main.edit.putString("Cookie", cookie); main.edit.commit(); } diff --git a/app/src/main/java/com/muqingbfq/sz.java b/app/src/main/java/com/muqingbfq/sz.java index b67d16f..df674db 100644 --- a/app/src/main/java/com/muqingbfq/sz.java +++ b/app/src/main/java/com/muqingbfq/sz.java @@ -12,7 +12,6 @@ import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.CompoundButton; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; @@ -126,8 +125,15 @@ public class sz extends AppCompatActivity { }); } + public static class setlrc extends Fragment implements Slider.OnSliderTouchListener, Slider.OnChangeListener { + ActivityResultLauncher LyricsService = + registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (Settings.canDrawOverlays(getContext())) { + getContext().startService(new Intent(getContext(), FloatingLyricsService.class)); + } + }); FloatingLyricsService.SETUP setup; ActivitySzSetlrcBinding binding; public Runnable updateSeekBar = new Runnable() { @@ -166,6 +172,8 @@ public class sz extends AppCompatActivity { main.handler.postDelayed(this, 1000); // 每秒更新一次进度 } }; + + @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -203,17 +211,29 @@ public class sz extends AppCompatActivity { .show()); binding.textSlide1.setText(String.valueOf(setup.size)); binding.textSlide2.setText(String.format(Locale.US,"%.2f",setup.Alpha)); + if (setup.i != 0) { + binding.switchA1.setChecked(true); + } main.handler.post(updateSeekBar); } - if (setup.i != 0) { - binding.switchA1.setChecked(true); - } binding.switchA1.setOnCheckedChangeListener((compoundButton, b) -> { if (b) { - setup.i = 1; + if (setup != null) { + setup.i = 1; + } + if (!Settings.canDrawOverlays(getContext())) { + // 无权限,需要申请权限 + Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, + Uri.parse("package:" + getContext().getPackageName())); + LyricsService.launch(intent); + } else { + getContext().startService(new Intent(getContext(), FloatingLyricsService.class)); + } } else { - setup.i = 0; + if (setup != null) { + setup.i = 0; + } home.appCompatActivity .stopService(new Intent(home.appCompatActivity, FloatingLyricsService.class)); @@ -244,11 +264,18 @@ public class sz extends AppCompatActivity { @Override public void onStopTrackingTouch(@NonNull Slider slider) { + if (setup == null) { + return; + } FloatingLyricsService.baocun(setup); } @Override public void onValueChange(@NonNull Slider slider, float value, boolean fromUser) { + if (setup == null) { + return; + } + if (slider == binding.slide1) { setup.size = (int) value; binding.lrctext.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, diff --git a/app/src/main/java/com/muqingbfq/view/LrcView.java b/app/src/main/java/com/muqingbfq/view/LrcView.java index 9ce44e7..2c9df67 100644 --- a/app/src/main/java/com/muqingbfq/view/LrcView.java +++ b/app/src/main/java/com/muqingbfq/view/LrcView.java @@ -1,7 +1,6 @@ package com.muqingbfq.view; import android.annotation.SuppressLint; -import android.app.AlertDialog; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Color; @@ -83,7 +82,6 @@ public class LrcView extends RecyclerView { AttributeSet attrs; boolean Lrcline; LinearLayoutManager linearLayoutManager; - public LrcView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); this.attrs = attrs; @@ -167,7 +165,7 @@ public class LrcView extends RecyclerView { @Override protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) { - return 100f / displayMetrics.densityDpi; + return 50f / displayMetrics.densityDpi; } } @@ -236,19 +234,18 @@ public class LrcView extends RecyclerView { @Override public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View inflate = LayoutInflater.from(getContext()).inflate(R.layout.view_lrc, parent, false); - TextView textView = inflate.findViewById(R.id.text); - textView.setTextColor(TextColor); - textView.setTextSize( - TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, size, - getResources().getDisplayMetrics())); - textView.setAlpha(alpha); - inflate.setOnClickListener(LrcView.this.onClickListener); - return new VH(inflate); } @Override public void onBindViewHolder(@NonNull VH holder, int position) { + TextView textView = holder.textView; + textView.setTextColor(TextColor); + textView.setTextSize( + TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, size, + getResources().getDisplayMetrics())); + textView.setAlpha(alpha); + holder.itemView.setOnClickListener(LrcView.this.onClickListener); if (Lrcline) { if (addOnGlobalLayoutListener) { // 注册布局监听器 diff --git a/app/src/main/java/com/muqingbfq/view/RecyclerViewH.java b/app/src/main/java/com/muqingbfq/view/RecyclerViewH.java new file mode 100644 index 0000000..2a96565 --- /dev/null +++ b/app/src/main/java/com/muqingbfq/view/RecyclerViewH.java @@ -0,0 +1,73 @@ +package com.muqingbfq.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.ViewConfiguration; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.recyclerview.widget.RecyclerView; + +public class RecyclerViewH extends RecyclerView { + public RecyclerViewH(@NonNull Context context) { + super(context); + } + + public RecyclerViewH(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public RecyclerViewH(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + private boolean disallowIntercept = false; + + private int startX = 0; + private int startY = 0; + boolean isDispatch = true; + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + if (isDispatch) { + switch (ev.getAction()) { + case MotionEvent.ACTION_DOWN: + startX = (int) ev.getX(); + startY = (int) ev.getY(); + getParent().requestDisallowInterceptTouchEvent(true); + break; + case MotionEvent.ACTION_MOVE: + int endX = (int) ev.getX(); + int endY = (int) ev.getY(); + int disX = Math.abs(endX - startX); + int disY = Math.abs(endY - startY); + if (Math.abs(disY) > ViewConfiguration.get(getContext()).getScaledTouchSlop()) { + // 当前手指移动距离大于系统认定的最小滚动距离时,不允许父容器拦截触摸事件 + getParent().requestDisallowInterceptTouchEvent(true); + }else + /* + if (disX > disY) { + //为了解决RecyclerView嵌套RecyclerView时横向滑动的问题 + if (disallowIntercept) { + getParent().requestDisallowInterceptTouchEvent(disallowIntercept); + } else { + getParent().requestDisallowInterceptTouchEvent(canScrollHorizontally(startX - endX)); + } + } else { + getParent().requestDisallowInterceptTouchEvent(true); + }*/ + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + getParent().requestDisallowInterceptTouchEvent(false); + break; + } + } + return super.dispatchTouchEvent(ev); + } + @Override + public void requestDisallowInterceptTouchEvent(boolean disallowIntercept) { + this.disallowIntercept = disallowIntercept; + super.requestDisallowInterceptTouchEvent(disallowIntercept); + } + +} diff --git a/app/src/main/res/layout/activity_gd.xml b/app/src/main/res/layout/activity_gd.xml new file mode 100644 index 0000000..959eb9a --- /dev/null +++ b/app/src/main/res/layout/activity_gd.xml @@ -0,0 +1,29 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_user_editing.xml b/app/src/main/res/layout/activity_user_editing.xml index b6362d6..261fbc5 100644 --- a/app/src/main/res/layout/activity_user_editing.xml +++ b/app/src/main/res/layout/activity_user_editing.xml @@ -36,19 +36,14 @@ - - - - - + android:layout_width="68dp" + android:layout_height="68dp" + app:round="16dp" + android:layout_margin="16dp" + app:srcCompat="@drawable/ic_launcher_foreground" /> - - - - + app:round="16dp" + app:srcCompat="@drawable/ic_launcher_foreground" />