From 3b1c956f39cfb4b583fd4c64c276fbc53f797764 Mon Sep 17 00:00:00 2001 From: FongMi Date: Thu, 26 Dec 2024 23:23:51 +0800 Subject: [PATCH] Rewrite backup and restore - part 2 --- .../android/tv/ui/activity/HomeActivity.java | 19 +---- .../tv/ui/activity/SettingActivity.java | 50 +++++++---- .../android/tv/ui/adapter/RestoreAdapter.java | 77 +++++++++++++++++ .../android/tv/ui/dialog/RestoreDialog.java | 52 ++++++++---- .../leanback/res/layout/activity_setting.xml | 83 +++++++++++-------- .../leanback/res/layout/adapter_restore.xml | 35 ++++++++ .../leanback/res/layout/dialog_restore.xml | 50 ++--------- .../leanback/res/values-zh-rCN/strings.xml | 3 - .../leanback/res/values-zh-rTW/strings.xml | 3 - app/src/leanback/res/values/strings.xml | 3 - .../java/com/fongmi/android/tv/Setting.java | 8 -- .../android/tv/impl/RestoreCallback.java | 6 -- 12 files changed, 235 insertions(+), 154 deletions(-) create mode 100644 app/src/leanback/java/com/fongmi/android/tv/ui/adapter/RestoreAdapter.java create mode 100644 app/src/leanback/res/layout/adapter_restore.xml delete mode 100644 app/src/main/java/com/fongmi/android/tv/impl/RestoreCallback.java 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 7766fc188..3373e6ee6 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 @@ -1,9 +1,7 @@ package com.fongmi.android.tv.ui.activity; -import android.Manifest; import android.content.Intent; import android.graphics.drawable.Drawable; -import android.text.TextUtils; import android.view.KeyEvent; import android.view.View; @@ -43,7 +41,6 @@ import com.fongmi.android.tv.event.CastEvent; import com.fongmi.android.tv.event.RefreshEvent; import com.fongmi.android.tv.event.ServerEvent; import com.fongmi.android.tv.impl.Callback; -import com.fongmi.android.tv.impl.RestoreCallback; import com.fongmi.android.tv.model.SiteViewModel; import com.fongmi.android.tv.player.Source; import com.fongmi.android.tv.server.Server; @@ -51,7 +48,6 @@ import com.fongmi.android.tv.ui.base.BaseActivity; import com.fongmi.android.tv.ui.custom.CustomRowPresenter; import com.fongmi.android.tv.ui.custom.CustomSelector; import com.fongmi.android.tv.ui.custom.CustomTitleView; -import com.fongmi.android.tv.ui.dialog.RestoreDialog; import com.fongmi.android.tv.ui.dialog.SiteDialog; import com.fongmi.android.tv.ui.presenter.FuncPresenter; import com.fongmi.android.tv.ui.presenter.HeaderPresenter; @@ -65,14 +61,13 @@ import com.fongmi.android.tv.utils.Notify; import com.fongmi.android.tv.utils.ResUtil; import com.fongmi.android.tv.utils.UrlUtil; import com.google.common.collect.Lists; -import com.permissionx.guolindev.PermissionX; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.List; -public class HomeActivity extends BaseActivity implements CustomTitleView.Listener, RestoreCallback, VodPresenter.OnClickListener, FuncPresenter.OnClickListener, HistoryPresenter.OnClickListener { +public class HomeActivity extends BaseActivity implements CustomTitleView.Listener, VodPresenter.OnClickListener, FuncPresenter.OnClickListener, HistoryPresenter.OnClickListener { private ActivityHomeBinding mBinding; private ArrayObjectAdapter mHistoryAdapter; @@ -190,7 +185,6 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen @Override public void error(String msg) { - if (TextUtils.isEmpty(msg) && AppDatabase.getBackup().exists() && !VodConfig.hasUrl() && !LiveConfig.hasUrl()) RestoreDialog.create(getActivity()).show(); mBinding.progressLayout.showContent(); mResult = Result.empty(); Notify.show(msg); @@ -439,17 +433,6 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen getVideo(); } - @Override - public void onRestore() { - PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> AppDatabase.restore(new Callback() { - @Override - public void success() { - if (allGranted) mBinding.progressLayout.showProgress(); - if (allGranted) initConfig(); - } - })); - } - @Override public void setSite(Site item) { VodConfig.get().setHome(item); 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 0c2a3ac7c..19fc4428f 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 @@ -33,6 +33,7 @@ import com.fongmi.android.tv.ui.dialog.DohDialog; import com.fongmi.android.tv.ui.dialog.HistoryDialog; import com.fongmi.android.tv.ui.dialog.LiveDialog; import com.fongmi.android.tv.ui.dialog.ProxyDialog; +import com.fongmi.android.tv.ui.dialog.RestoreDialog; import com.fongmi.android.tv.ui.dialog.SiteDialog; import com.fongmi.android.tv.utils.FileUtil; import com.fongmi.android.tv.utils.Notify; @@ -49,7 +50,6 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit private ActivitySettingBinding mBinding; private String[] quality; - private String[] backup; private String[] size; private int type; @@ -91,7 +91,6 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit mBinding.proxyText.setText(getProxy(Setting.getProxy())); mBinding.incognitoText.setText(getSwitch(Setting.isIncognito())); mBinding.sizeText.setText((size = ResUtil.getStringArray(R.array.select_size))[Setting.getSize()]); - mBinding.backupText.setText((backup = ResUtil.getStringArray(R.array.select_backup))[Setting.getBackupMode()]); mBinding.qualityText.setText((quality = ResUtil.getStringArray(R.array.select_quality))[Setting.getQuality()]); setCacheText(); } @@ -114,13 +113,13 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit mBinding.cache.setOnClickListener(this::onCache); mBinding.backup.setOnClickListener(this::onBackup); mBinding.player.setOnClickListener(this::onPlayer); + mBinding.restore.setOnClickListener(this::onRestore); mBinding.version.setOnClickListener(this::onVersion); mBinding.vod.setOnLongClickListener(this::onVodEdit); mBinding.vodHome.setOnClickListener(this::onVodHome); mBinding.live.setOnLongClickListener(this::onLiveEdit); mBinding.liveHome.setOnClickListener(this::onLiveHome); mBinding.wall.setOnLongClickListener(this::onWallEdit); - mBinding.backup.setOnLongClickListener(this::onBackupMode); mBinding.vodHistory.setOnClickListener(this::onVodHistory); mBinding.version.setOnLongClickListener(this::onVersionDev); mBinding.liveHistory.setOnClickListener(this::onLiveHistory); @@ -145,23 +144,23 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit switch (config.getType()) { case 0: Notify.progress(this); - VodConfig.load(config, getCallback()); + VodConfig.load(config, getCallback(0)); mBinding.vodUrl.setText(config.getDesc()); break; case 1: Notify.progress(this); - LiveConfig.load(config, getCallback()); + LiveConfig.load(config, getCallback(1)); mBinding.liveUrl.setText(config.getDesc()); break; case 2: Notify.progress(this); - WallConfig.load(config, getCallback()); + WallConfig.load(config, getCallback(2)); mBinding.wallUrl.setText(config.getDesc()); break; } } - private Callback getCallback() { + private Callback getCallback(int type) { return new Callback() { @Override public void success(String result) { @@ -170,18 +169,18 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit @Override public void success() { - setConfig(); + setConfig(type); } @Override public void error(String msg) { Notify.show(msg); - setConfig(); + setConfig(type); } }; } - private void setConfig() { + private void setConfig(int type) { switch (type) { case 0: setCacheText(); @@ -322,7 +321,7 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit Notify.progress(getActivity()); Setting.putDoh(doh.toString()); mBinding.dohText.setText(doh.getName()); - VodConfig.load(Config.vod(), getCallback()); + VodConfig.load(Config.vod(), getCallback(0)); } private void onProxy(View view) { @@ -335,7 +334,7 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit Setting.putProxy(proxy); OkHttp.get().setProxy(proxy); Notify.progress(getActivity()); - VodConfig.load(Config.vod(), getCallback()); + VodConfig.load(Config.vod(), getCallback(0)); mBinding.proxyText.setText(getProxy(proxy)); } @@ -352,15 +351,30 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> AppDatabase.backup(new Callback() { @Override public void success() { - Notify.show(R.string.backed); + Notify.show(R.string.backup_success); } })); } - private boolean onBackupMode(View view) { - int index = Setting.getBackupMode(); - Setting.putBackupMode(index = index == backup.length - 1 ? 0 : ++index); - mBinding.backupText.setText(backup[index]); - return true; + private void onRestore(View view) { + PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> RestoreDialog.create(this).show(new Callback() { + @Override + public void success() { + Notify.show(R.string.restore_success); + Notify.progress(getActivity()); + initConfig(); + } + + @Override + public void error() { + Notify.show(R.string.restore_fail); + } + })); + } + + private void initConfig() { + WallConfig.get().init(); + LiveConfig.get().init().load(); + VodConfig.get().init().load(getCallback(0)); } } diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/RestoreAdapter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/RestoreAdapter.java new file mode 100644 index 000000000..d3f89a3f0 --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/RestoreAdapter.java @@ -0,0 +1,77 @@ +package com.fongmi.android.tv.ui.adapter; + +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.fongmi.android.tv.databinding.AdapterRestoreBinding; +import com.github.catvod.utils.Path; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class RestoreAdapter extends RecyclerView.Adapter { + + private final OnClickListener mListener; + private final List mItems; + + public RestoreAdapter(OnClickListener listener) { + this.mItems = new ArrayList<>(); + this.mListener = listener; + this.addAll(); + } + + public interface OnClickListener { + + void onItemClick(File item); + + void onDeleteClick(File item); + } + + public void addAll() { + File[] files = Path.tv().listFiles(); + if (files == null || files.length == 0) return; + for (File file : files) if (file.getName().startsWith("tv") && file.getName().endsWith(".bk.gz")) mItems.add(file); + notifyDataSetChanged(); + } + + public void remove(File item) { + int position = mItems.indexOf(item); + if (position == -1) return; + Path.clear(item); + mItems.remove(position); + notifyItemRemoved(position); + } + + @Override + public int getItemCount() { + return mItems.size(); + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(AdapterRestoreBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + File item = mItems.get(position); + holder.binding.text.setText(item.getName()); + holder.binding.text.setOnClickListener(v -> mListener.onItemClick(item)); + holder.binding.delete.setOnClickListener(v -> mListener.onDeleteClick(item)); + } + + public static class ViewHolder extends RecyclerView.ViewHolder { + + private final AdapterRestoreBinding binding; + + public ViewHolder(@NonNull AdapterRestoreBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } +} diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/RestoreDialog.java b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/RestoreDialog.java index 449009653..3253477b1 100644 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/RestoreDialog.java +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/RestoreDialog.java @@ -2,51 +2,67 @@ package com.fongmi.android.tv.ui.dialog; import android.app.Activity; import android.view.LayoutInflater; -import android.view.View; +import android.view.WindowManager; import androidx.appcompat.app.AlertDialog; import com.fongmi.android.tv.databinding.DialogRestoreBinding; -import com.fongmi.android.tv.impl.RestoreCallback; +import com.fongmi.android.tv.db.AppDatabase; +import com.fongmi.android.tv.impl.Callback; +import com.fongmi.android.tv.ui.adapter.RestoreAdapter; +import com.fongmi.android.tv.ui.custom.SpaceItemDecoration; +import com.fongmi.android.tv.utils.ResUtil; import com.google.android.material.dialog.MaterialAlertDialogBuilder; -public class RestoreDialog { +import java.io.File; + +public class RestoreDialog implements RestoreAdapter.OnClickListener { private final DialogRestoreBinding binding; - private final RestoreCallback callback; + private final RestoreAdapter adapter; private final AlertDialog dialog; + private Callback callback; public static RestoreDialog create(Activity activity) { return new RestoreDialog(activity); } public RestoreDialog(Activity activity) { - this.callback = (RestoreCallback) activity; this.binding = DialogRestoreBinding.inflate(LayoutInflater.from(activity)); this.dialog = new MaterialAlertDialogBuilder(activity).setView(binding.getRoot()).create(); + this.adapter = new RestoreAdapter(this); } - public void show() { - initDialog(); - initEvent(); + public void show(Callback callback) { + this.callback = callback; + setRecyclerView(); + setDialog(); } - private void initDialog() { - dialog.getWindow().setDimAmount(0); - dialog.show(); + private void setRecyclerView() { + binding.recycler.setAdapter(adapter); + binding.recycler.setHasFixedSize(false); + binding.recycler.addItemDecoration(new SpaceItemDecoration(1, 16)); } - private void initEvent() { - binding.positive.setOnClickListener(this::onPositive); - binding.negative.setOnClickListener(this::onNegative); + private void setDialog() { + if (adapter.getItemCount() == 0) return; + WindowManager.LayoutParams params = dialog.getWindow().getAttributes(); + params.width = (int) (ResUtil.getScreenWidth() * 0.4f); + dialog.getWindow().setAttributes(params); + dialog.getWindow().setDimAmount(0); + dialog.show(); } - private void onPositive(View view) { - callback.onRestore(); + @Override + public void onItemClick(File item) { + AppDatabase.restore(item, callback); dialog.dismiss(); } - private void onNegative(View view) { - dialog.dismiss(); + @Override + public void onDeleteClick(File item) { + if (adapter.getItemCount() == 1) dialog.dismiss(); + adapter.remove(item); } } \ No newline at end of file diff --git a/app/src/leanback/res/layout/activity_setting.xml b/app/src/leanback/res/layout/activity_setting.xml index 1c6de5f3a..ee00263c8 100644 --- a/app/src/leanback/res/layout/activity_setting.xml +++ b/app/src/leanback/res/layout/activity_setting.xml @@ -397,6 +397,52 @@ + + + + + + + + + + + + + + + + tools:text="1.2.1" /> - - - - - - - - \ No newline at end of file diff --git a/app/src/leanback/res/layout/adapter_restore.xml b/app/src/leanback/res/layout/adapter_restore.xml new file mode 100644 index 000000000..da423e6cf --- /dev/null +++ b/app/src/leanback/res/layout/adapter_restore.xml @@ -0,0 +1,35 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/leanback/res/layout/dialog_restore.xml b/app/src/leanback/res/layout/dialog_restore.xml index 8ba2450c7..29632553f 100644 --- a/app/src/leanback/res/layout/dialog_restore.xml +++ b/app/src/leanback/res/layout/dialog_restore.xml @@ -1,47 +1,9 @@ - - - - - - - - - - - - \ No newline at end of file + android:padding="16dp" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" + app:maxHeight="352dp" /> \ No newline at end of file diff --git a/app/src/leanback/res/values-zh-rCN/strings.xml b/app/src/leanback/res/values-zh-rCN/strings.xml index af41e9a20..c031f9cb4 100644 --- a/app/src/leanback/res/values-zh-rCN/strings.xml +++ b/app/src/leanback/res/values-zh-rCN/strings.xml @@ -17,7 +17,4 @@ 推送剪贴板内容 使用手机扫描二维码,或于浏览器访问地址\n%s - - 是否要还原备份数据? - \ No newline at end of file diff --git a/app/src/leanback/res/values-zh-rTW/strings.xml b/app/src/leanback/res/values-zh-rTW/strings.xml index 6b72eba63..403a145b2 100644 --- a/app/src/leanback/res/values-zh-rTW/strings.xml +++ b/app/src/leanback/res/values-zh-rTW/strings.xml @@ -17,7 +17,4 @@ 推送剪貼簿內容 使用手機掃描 QR Code,或於瀏覽器輸入網址\n%s - - 是否要還原備份資料? - \ No newline at end of file diff --git a/app/src/leanback/res/values/strings.xml b/app/src/leanback/res/values/strings.xml index 537457c4c..b091a85d3 100644 --- a/app/src/leanback/res/values/strings.xml +++ b/app/src/leanback/res/values/strings.xml @@ -17,7 +17,4 @@ Push clipboard content Scan QR Code or enter the URL in browser\n%s - - Restore backup data? - \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/android/tv/Setting.java b/app/src/main/java/com/fongmi/android/tv/Setting.java index f9bbf74bb..0d7c4c718 100644 --- a/app/src/main/java/com/fongmi/android/tv/Setting.java +++ b/app/src/main/java/com/fongmi/android/tv/Setting.java @@ -161,14 +161,6 @@ public class Setting { Prefers.put("sync_mode", mode); } - public static int getBackupMode() { - return Prefers.getInt("backup_mode"); - } - - public static void putBackupMode(int auto) { - Prefers.put("backup_mode", auto); - } - public static boolean isIncognito() { return Prefers.getBoolean("incognito"); } diff --git a/app/src/main/java/com/fongmi/android/tv/impl/RestoreCallback.java b/app/src/main/java/com/fongmi/android/tv/impl/RestoreCallback.java deleted file mode 100644 index 57b975851..000000000 --- a/app/src/main/java/com/fongmi/android/tv/impl/RestoreCallback.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.fongmi.android.tv.impl; - -public interface RestoreCallback { - - void onRestore(); -}