diff --git a/app/build.gradle b/app/build.gradle index fb8f7705d..31c73e7ad 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -72,7 +72,7 @@ dependencies { implementation 'androidx.room:room-runtime:2.4.3' implementation 'cat.ereza:customactivityoncrash:2.4.0' implementation 'com.github.bassaer:materialdesigncolors:1.0.0' - implementation 'com.github.bumptech.glide:glide:4.14.1' + implementation 'com.github.bumptech.glide:glide:4.14.2' implementation 'com.google.android.material:material:1.7.0' implementation 'com.google.code.gson:gson:2.9.1' implementation 'com.google.zxing:core:3.5.0' @@ -84,5 +84,5 @@ dependencies { implementation('org.simpleframework:simple-xml:2.7.1') { exclude group: 'stax', module: 'stax-api' exclude group: 'xpp3', module: 'xpp3' } leanbackImplementation 'androidx.leanback:leanback:1.2.0-alpha02' annotationProcessor 'androidx.room:room-compiler:2.4.3' - annotationProcessor 'com.github.bumptech.glide:compiler:4.14.1' + annotationProcessor 'com.github.bumptech.glide:compiler:4.14.2' } \ No newline at end of file diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java index 2bde6264a..ed1a5631e 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java @@ -150,7 +150,6 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis @Override protected void initEvent() { - EventBus.getDefault().register(this); mControl.replay.setOnClickListener(view -> getPlayer(true)); mBinding.video.setOnClickListener(view -> enterFullscreen()); mBinding.desc.setOnClickListener(view -> onDesc()); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java index 4eec34e08..464d26126 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java @@ -87,7 +87,6 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen @Override protected void initEvent() { - EventBus.getDefault().register(this); mBinding.title.setListener(this); mBinding.recycler.addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() { @Override @@ -252,6 +251,7 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen @Subscribe(threadMode = ThreadMode.MAIN) public void onRefreshEvent(RefreshEvent event) { + super.onRefreshEvent(event); switch (event.getType()) { case VIDEO: getVideo(); diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/KeepActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/KeepActivity.java index dfec16492..d0e5ff371 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/KeepActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/KeepActivity.java @@ -36,7 +36,6 @@ public class KeepActivity extends BaseActivity implements KeepAdapter.OnClickLis @Override protected void initView() { - EventBus.getDefault().register(this); setRecyclerView(); getKeep(); } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java index df4ca2b70..1b6450e16 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/LiveActivity.java @@ -109,7 +109,6 @@ public class LiveActivity extends BaseActivity implements GroupPresenter.OnClick protected void initEvent() { mBinding.group.setListener(this); mBinding.channel.setListener(this); - EventBus.getDefault().register(this); getPlayerView().setOnClickListener(view -> toggle()); mBinding.group.addOnChildViewHolderSelectedListener(new OnChildViewHolderSelectedListener() { @Override diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java index 11fde230a..217c8f0d7 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java @@ -8,10 +8,12 @@ import android.net.Uri; import android.os.Build; import android.os.Environment; import android.provider.Settings; +import android.text.TextUtils; import android.view.View; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; import androidx.annotation.RequiresApi; import androidx.core.content.ContextCompat; import androidx.viewbinding.ViewBinding; @@ -29,15 +31,23 @@ import com.fongmi.android.tv.impl.ConfigCallback; import com.fongmi.android.tv.impl.LiveCallback; import com.fongmi.android.tv.impl.SiteCallback; import com.fongmi.android.tv.net.Callback; +import com.fongmi.android.tv.net.OKHttp; import com.fongmi.android.tv.ui.custom.dialog.ConfigDialog; import com.fongmi.android.tv.ui.custom.dialog.HistoryDialog; import com.fongmi.android.tv.ui.custom.dialog.LiveDialog; import com.fongmi.android.tv.ui.custom.dialog.SiteDialog; +import com.fongmi.android.tv.utils.FileUtil; import com.fongmi.android.tv.utils.Notify; import com.fongmi.android.tv.utils.Prefers; import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.Updater; +import java.io.File; +import java.io.IOException; + +import okhttp3.Call; +import okhttp3.Response; + public class SettingActivity extends BaseActivity implements ConfigCallback, SiteCallback, LiveCallback { private final ActivityResultLauncher launcherString = registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> loadConfig()); @@ -59,15 +69,17 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit protected void initView() { mBinding.vodUrl.setText(ApiConfig.getUrl()); mBinding.liveUrl.setText(LiveConfig.getUrl()); + mBinding.versionText.setText(BuildConfig.VERSION_NAME); + mBinding.wallpaperUrl.setText(ApiConfig.get().getWallpaper()); mBinding.sizeText.setText(ResUtil.getStringArray(R.array.select_size)[Prefers.getSize()]); mBinding.scaleText.setText(ResUtil.getStringArray(R.array.select_scale)[Prefers.getScale()]); mBinding.renderText.setText(ResUtil.getStringArray(R.array.select_render)[Prefers.getRender()]); mBinding.qualityText.setText(ResUtil.getStringArray(R.array.select_quality)[Prefers.getQuality()]); - mBinding.versionText.setText(BuildConfig.VERSION_NAME); } @Override protected void initEvent() { + mBinding.wallpaper.setOnClickListener(view -> Notify.show("下個版本見")); mBinding.vodHome.setOnClickListener(view -> SiteDialog.create(this).show()); mBinding.liveHome.setOnClickListener(view -> LiveDialog.create(this).show()); mBinding.vod.setOnClickListener(view -> ConfigDialog.create(this).type(0).show()); @@ -75,6 +87,8 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit mBinding.vodHistory.setOnClickListener(view -> HistoryDialog.create(this).type(0).show()); mBinding.liveHistory.setOnClickListener(view -> HistoryDialog.create(this).type(1).show()); mBinding.version.setOnClickListener(view -> Updater.create(this).force().start()); + mBinding.wallpaperDefault.setOnClickListener(this::setWallpaperDefault); + mBinding.wallpaperRefresh.setOnClickListener(this::setWallpaperRefresh); mBinding.quality.setOnClickListener(this::setQuality); mBinding.render.setOnClickListener(this::setRender); mBinding.scale.setOnClickListener(this::setScale); @@ -135,6 +149,7 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit private void refresh(int resId) { Notify.dismiss(); Notify.show(resId); + mBinding.wallpaperUrl.setText(ApiConfig.get().getWallpaper()); if (resId != 0) config.delete(); if (config.isLive()) return; RefreshEvent.history(); @@ -181,4 +196,23 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit mBinding.sizeText.setText(array[index]); RefreshEvent.size(); } + + private void setWallpaperDefault(View view) { + int index = Prefers.getWallpaper(); + Prefers.putWallpaper(index == 4 ? 1 : ++index); + RefreshEvent.wallpaper(); + } + + private void setWallpaperRefresh(View view) { + if (TextUtils.isEmpty(ApiConfig.get().getWallpaper())) return; + OKHttp.newCall(ApiConfig.get().getWallpaper()).enqueue(new Callback() { + @Override + public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException { + File file = FileUtil.write(FileUtil.getWallpaper(0), response.body().bytes()); + if (!file.exists() || file.length() == 0) return; + Prefers.putWallpaper(0); + RefreshEvent.wallpaper(); + } + }); + } } diff --git a/app/src/leanback/res/drawable-nodpi/wallpaper_3.webp b/app/src/leanback/res/drawable-nodpi/wallpaper_3.webp new file mode 100644 index 000000000..1830f00e6 Binary files /dev/null and b/app/src/leanback/res/drawable-nodpi/wallpaper_3.webp differ diff --git a/app/src/leanback/res/drawable-nodpi/wallpaper_4.webp b/app/src/leanback/res/drawable-nodpi/wallpaper_4.webp new file mode 100644 index 000000000..a89e0a1a1 Binary files /dev/null and b/app/src/leanback/res/drawable-nodpi/wallpaper_4.webp differ diff --git a/app/src/leanback/res/layout/activity_setting.xml b/app/src/leanback/res/layout/activity_setting.xml index 56b6260ac..e49bfb16d 100644 --- a/app/src/leanback/res/layout/activity_setting.xml +++ b/app/src/leanback/res/layout/activity_setting.xml @@ -72,7 +72,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" - android:nextFocusDown="@id/render" android:orientation="horizontal"> + + + + + + + + + + + + + + + + lives; private JarLoader jLoader; private PyLoader pLoader; + private String wallpaper; private Handler handler; private Config config; private Parse parse; @@ -97,6 +98,7 @@ public class ApiConfig { this.parses.clear(); this.jLoader.clear(); this.pLoader.clear(); + this.wallpaper = null; LiveConfig.get().remove(lives); return this; } @@ -130,7 +132,7 @@ public class ApiConfig { private void parseConfig(JsonObject object, Callback callback) { try { parseJson(object); - jLoader.parseJar("", Json.safeString(object, "spider", "")); + jLoader.parseJar("", Json.safeString(object, "spider")); config.json(object.toString()).update(); handler.post(callback::success); } catch (Exception e) { @@ -157,6 +159,7 @@ public class ApiConfig { } if (home == null) setHome(sites.isEmpty() ? new Site() : sites.get(0)); if (parse == null) setParse(parses.isEmpty() ? new Parse() : parses.get(0)); + setWallpaper(Json.safeString(object, "wallpaper")); flags.addAll(Json.safeListString(object, "flags")); ads.addAll(Json.safeListString(object, "ads")); } @@ -207,20 +210,24 @@ public class ApiConfig { return lives == null ? Collections.emptyList() : lives; } - public void setLives(List lives) { - this.lives = lives; - } - public List getParses() { return parses == null ? Collections.emptyList() : parses; } + public List getFlags() { + return flags == null ? Collections.emptyList() : flags; + } + public String getAds() { return ads == null ? "" : ads.toString(); } - public List getFlags() { - return flags == null ? Collections.emptyList() : flags; + public String getWallpaper() { + return TextUtils.isEmpty(wallpaper) ? "" : wallpaper; + } + + public void setWallpaper(String wallpaper) { + this.wallpaper = wallpaper; } public Config getConfig() { diff --git a/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java b/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java index cde35a6f8..452370beb 100644 --- a/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java +++ b/app/src/main/java/com/fongmi/android/tv/event/RefreshEvent.java @@ -26,6 +26,10 @@ public class RefreshEvent { EventBus.getDefault().post(new RefreshEvent(Type.SIZE)); } + public static void wallpaper() { + EventBus.getDefault().post(new RefreshEvent(Type.WALLPAPER)); + } + private RefreshEvent(Type type) { this.type = type; } @@ -35,6 +39,6 @@ public class RefreshEvent { } public enum Type { - IMAGE, VIDEO, HISTORY, KEEP, SIZE + IMAGE, VIDEO, HISTORY, KEEP, SIZE, WALLPAPER } } diff --git a/app/src/main/java/com/fongmi/android/tv/ui/activity/BaseActivity.java b/app/src/main/java/com/fongmi/android/tv/ui/activity/BaseActivity.java index 7d5a8f42f..e22b60fd7 100644 --- a/app/src/main/java/com/fongmi/android/tv/ui/activity/BaseActivity.java +++ b/app/src/main/java/com/fongmi/android/tv/ui/activity/BaseActivity.java @@ -3,14 +3,25 @@ package com.fongmi.android.tv.ui.activity; import android.app.Activity; import android.content.res.Configuration; import android.content.res.Resources; +import android.graphics.drawable.Drawable; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.viewbinding.ViewBinding; +import com.fongmi.android.tv.event.RefreshEvent; +import com.fongmi.android.tv.utils.FileUtil; +import com.fongmi.android.tv.utils.Prefers; +import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.Utils; +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.io.File; + import me.jessyan.autosize.AutoSizeCompat; public abstract class BaseActivity extends AppCompatActivity { @@ -21,7 +32,9 @@ public abstract class BaseActivity extends AppCompatActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(getBinding().getRoot()); + EventBus.getDefault().register(this); Utils.hideSystemUI(this); + setWallpaper(); initView(); initEvent(); } @@ -36,13 +49,24 @@ public abstract class BaseActivity extends AppCompatActivity { protected void initEvent() { } - protected void hackResources() { + private void setWallpaper() { + File file = FileUtil.getWallpaper(Prefers.getWallpaper()); + if (file.exists() && file.length() > 0) getWindow().setBackgroundDrawable(Drawable.createFromPath(file.getPath())); + else getWindow().setBackgroundDrawableResource(ResUtil.getDrawable(file.getName())); + } + + private void hackResources() { try { AutoSizeCompat.autoConvertDensityOfGlobal(super.getResources()); } catch (Exception ignored) { } } + @Subscribe(threadMode = ThreadMode.MAIN) + public void onRefreshEvent(RefreshEvent event) { + if (event.getType() == RefreshEvent.Type.WALLPAPER) setWallpaper(); + } + @Override public Resources getResources() { hackResources(); diff --git a/app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java index 738630cdd..02dbd7cdc 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java @@ -15,6 +15,7 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.IOException; import java.io.InputStreamReader; import java.net.URLConnection; import java.security.MessageDigest; @@ -47,6 +48,10 @@ public class FileUtil { return getCacheFile(Utils.getMD5(fileName).concat(".jar")); } + public static File getWallpaper(int index) { + return getCacheFile("wallpaper_" + index); + } + public static File getLocal(String path) { if (path.contains(getRootPath())) return new File(path); return new File(path.replace("file:/", getRootPath())); @@ -61,7 +66,7 @@ public class FileUtil { return TextUtils.isEmpty(mimeType) ? "*/*" : mimeType; } - public static File write(File file, byte[] data) throws Exception { + public static File write(File file, byte[] data) throws IOException { FileOutputStream fos = new FileOutputStream(file); fos.write(data); fos.flush(); diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Json.java b/app/src/main/java/com/fongmi/android/tv/utils/Json.java index 6cd811f7e..aada8ab26 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Json.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Json.java @@ -21,9 +21,9 @@ public class Json { } } - public static String safeString(JsonObject obj, String key, String value) { + public static String safeString(JsonObject obj, String key) { if (obj.has(key)) return obj.getAsJsonPrimitive(key).getAsString().trim(); - else return value; + else return ""; } public static List safeListString(JsonObject obj, String key) { diff --git a/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java b/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java index bd1e3782c..ef433792c 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/Prefers.java @@ -59,6 +59,14 @@ public class Prefers { put("keep", keep); } + public static int getWallpaper() { + return getInt("wallpaper", 1); + } + + public static void putWallpaper(int wallpaper) { + put("wallpaper", wallpaper); + } + public static int getRender() { return getInt("render", 0); } @@ -68,7 +76,7 @@ public class Prefers { } public static int getQuality() { - return getInt("quality", 1); + return getInt("quality", 2); } public static void putQuality(int quality) { diff --git a/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java b/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java index 187ee7e2f..27c09ae66 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/ResUtil.java @@ -40,6 +40,10 @@ public class ResUtil { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getDisplayMetrics()); } + public static int getDrawable(String resId) { + return App.get().getResources().getIdentifier(resId, "drawable", App.get().getPackageName()); + } + public static String getString(@StringRes int resId) { return App.get().getString(resId); } diff --git a/app/src/main/res/drawable-nodpi/radio.webp b/app/src/main/res/drawable-nodpi/radio.webp new file mode 100644 index 000000000..00d392c79 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/radio.webp differ diff --git a/app/src/main/res/drawable/ic_refresh.xml b/app/src/main/res/drawable/ic_refresh.xml new file mode 100644 index 000000000..21957cd41 --- /dev/null +++ b/app/src/main/res/drawable/ic_refresh.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/radio.png b/app/src/main/res/drawable/radio.png deleted file mode 100644 index 5abe3e119..000000000 Binary files a/app/src/main/res/drawable/radio.png and /dev/null differ diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index f872a82fc..30cee700c 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -61,6 +61,7 @@ 点播 直播 + 壁纸 渲染方式 缩放比例 图片品质 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index b26107640..340407b39 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -61,6 +61,7 @@ 點播 直播 + 壁紙 渲染方式 縮放比例 圖片品質 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2eb1e942a..fd2109570 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -61,6 +61,7 @@ Vod Live + Wallpaper Render type Scale type Image quality