From faac37e66b793be9e354ba7b559efcf9c86a56b9 Mon Sep 17 00:00:00 2001 From: okjack Date: Wed, 19 Jun 2024 14:53:05 +0800 Subject: [PATCH] Update Restore --- .../tv/ui/activity/SettingActivity.java | 12 +-- .../android/tv/ui/adapter/BackupAdapter.java | 76 ++++++++++++++++++ .../android/tv/ui/dialog/BackupDialog.java | 69 +++++++++++++++++ .../android/tv/ui/dialog/RestoreDialog.java | 40 ---------- .../leanback/res/layout/adapter_backup.xml | 35 +++++++++ .../android/tv/impl/BackupCallback.java | 9 +++ .../android/tv/impl/RestoreCallback.java | 8 -- .../fongmi/android/tv/utils/FileChooser.java | 5 +- .../android/tv/ui/adapter/BackupAdapter.java | 77 +++++++++++++++++++ .../android/tv/ui/dialog/BackupDialog.java | 64 +++++++++++++++ .../tv/ui/fragment/SettingFragment.java | 16 ++-- app/src/mobile/res/layout/adapter_backup.xml | 30 ++++++++ 12 files changed, 378 insertions(+), 63 deletions(-) create mode 100644 app/src/leanback/java/com/fongmi/android/tv/ui/adapter/BackupAdapter.java create mode 100644 app/src/leanback/java/com/fongmi/android/tv/ui/dialog/BackupDialog.java delete mode 100644 app/src/leanback/java/com/fongmi/android/tv/ui/dialog/RestoreDialog.java create mode 100644 app/src/leanback/res/layout/adapter_backup.xml create mode 100644 app/src/main/java/com/fongmi/android/tv/impl/BackupCallback.java delete mode 100644 app/src/main/java/com/fongmi/android/tv/impl/RestoreCallback.java create mode 100644 app/src/mobile/java/com/fongmi/android/tv/ui/adapter/BackupAdapter.java create mode 100644 app/src/mobile/java/com/fongmi/android/tv/ui/dialog/BackupDialog.java create mode 100644 app/src/mobile/res/layout/adapter_backup.xml 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 ba584c30e..baf4f0d31 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 @@ -21,21 +21,21 @@ import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.databinding.ActivitySettingBinding; import com.fongmi.android.tv.db.AppDatabase; import com.fongmi.android.tv.event.RefreshEvent; +import com.fongmi.android.tv.impl.BackupCallback; import com.fongmi.android.tv.impl.Callback; import com.fongmi.android.tv.impl.ConfigCallback; import com.fongmi.android.tv.impl.DohCallback; import com.fongmi.android.tv.impl.LiveCallback; import com.fongmi.android.tv.impl.ProxyCallback; -import com.fongmi.android.tv.impl.RestoreCallback; import com.fongmi.android.tv.impl.SiteCallback; import com.fongmi.android.tv.player.Source; import com.fongmi.android.tv.ui.base.BaseActivity; +import com.fongmi.android.tv.ui.dialog.BackupDialog; import com.fongmi.android.tv.ui.dialog.ConfigDialog; 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; @@ -52,7 +52,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; -public class SettingActivity extends BaseActivity implements RestoreCallback, ConfigCallback, SiteCallback, LiveCallback, DohCallback, ProxyCallback { +public class SettingActivity extends BaseActivity implements BackupCallback, ConfigCallback, SiteCallback, LiveCallback, DohCallback, ProxyCallback { private ActivitySettingBinding mBinding; private String[] backup; @@ -341,7 +341,7 @@ public class SettingActivity extends BaseActivity implements RestoreCallback, Co } @Override - public void onRestore(File file) { + public void restore(File file) { PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> AppDatabase.restore(file, new Callback() { @Override public void success() { @@ -354,7 +354,9 @@ public class SettingActivity extends BaseActivity implements RestoreCallback, Co } private void onRestore(View view) { - RestoreDialog.create().callback(this).show(getActivity()); + PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> { + if (allGranted) BackupDialog.create(this).show(); + }); } private void initConfig() { diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/BackupAdapter.java b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/BackupAdapter.java new file mode 100644 index 000000000..cc1d36efe --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/adapter/BackupAdapter.java @@ -0,0 +1,76 @@ +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.AdapterBackupBinding; +import com.fongmi.android.tv.db.AppDatabase; +import com.github.catvod.utils.Path; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class BackupAdapter extends RecyclerView.Adapter { + + private final OnClickListener mListener; + private List mItems; + + public BackupAdapter(OnClickListener listener) { + this.mListener = listener; + } + + public interface OnClickListener { + + void onTextClick(String item); + + void onDeleteClick(String item); + } + + public BackupAdapter addAll() { + mItems = new ArrayList<>(); + for(File file : Path.list(Path.tv())) if (file.getAbsolutePath().endsWith(AppDatabase.BACKUP_SUFFIX)) mItems.add(file.getName().replace("." + AppDatabase.BACKUP_SUFFIX, "")); + Collections.sort(mItems); + return this; + } + + public int remove(String item) { + File file = new File(Path.tv(), item + "." + AppDatabase.BACKUP_SUFFIX); + if (file.exists()) file.delete(); + mItems.remove(item); + notifyDataSetChanged(); + return getItemCount(); + } + + @Override + public int getItemCount() { + return mItems.size(); + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(AdapterBackupBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + String item = mItems.get(position); + holder.binding.text.setText(item); + holder.binding.text.setOnClickListener(v -> mListener.onTextClick(item)); + holder.binding.delete.setOnClickListener(v -> mListener.onDeleteClick(item)); + } + + static class ViewHolder extends RecyclerView.ViewHolder { + + private final AdapterBackupBinding binding; + + ViewHolder(@NonNull AdapterBackupBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } +} diff --git a/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/BackupDialog.java b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/BackupDialog.java new file mode 100644 index 000000000..98392ee01 --- /dev/null +++ b/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/BackupDialog.java @@ -0,0 +1,69 @@ +package com.fongmi.android.tv.ui.dialog; + +import android.app.Activity; +import android.view.LayoutInflater; +import android.view.WindowManager; + +import androidx.appcompat.app.AlertDialog; +import com.fongmi.android.tv.databinding.DialogHistoryBinding; +import com.fongmi.android.tv.db.AppDatabase; +import com.fongmi.android.tv.impl.BackupCallback; +import com.fongmi.android.tv.ui.adapter.BackupAdapter; +import com.fongmi.android.tv.ui.custom.SpaceItemDecoration; +import com.fongmi.android.tv.utils.ResUtil; +import com.github.catvod.utils.Path; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +import java.io.File; + +public class BackupDialog implements BackupAdapter.OnClickListener { + + private final DialogHistoryBinding binding; + private final BackupCallback callback; + private final BackupAdapter adapter; + private final AlertDialog dialog; + + public static BackupDialog create(Activity activity) { + return new BackupDialog(activity); + } + + + public BackupDialog(Activity activity) { + this.callback = (BackupCallback) activity; + this.binding = DialogHistoryBinding.inflate(LayoutInflater.from(activity)); + this.dialog = new MaterialAlertDialogBuilder(activity).setView(binding.getRoot()).create(); + this.adapter = new BackupAdapter(this); + } + + public void show() { + setRecyclerView(); + setDialog(); + binding.recycler.requestFocus(); + } + + private void setRecyclerView() { + binding.recycler.setHasFixedSize(true); + binding.recycler.setAdapter(adapter.addAll()); + binding.recycler.addItemDecoration(new SpaceItemDecoration(1, 16)); + } + + 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(); + } + + @Override + public void onTextClick(String item) { + callback.restore(new File(Path.tv(), item + "." + AppDatabase.BACKUP_SUFFIX)); + dialog.dismiss(); + } + + @Override + public void onDeleteClick(String item) { + if (adapter.remove(item) == 0) dialog.dismiss(); + } +} 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 deleted file mode 100644 index c0bf26fa1..000000000 --- a/app/src/leanback/java/com/fongmi/android/tv/ui/dialog/RestoreDialog.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.fongmi.android.tv.ui.dialog; - -import android.app.Activity; -import com.fongmi.android.tv.impl.RestoreCallback; -import com.github.catvod.utils.Path; -import com.obsez.android.lib.filechooser.ChooserDialog; - -import java.io.File; - -public class RestoreDialog { - - private ChooserDialog dialog; - - private RestoreCallback callback; - - public static RestoreDialog create() { - return new RestoreDialog(); - } - - public RestoreDialog callback(RestoreCallback callback) { - this.callback = callback; - return this; - } - - public void show(Activity activity) { - dialog = new ChooserDialog(activity); - dialog.withFilter(false, false, "tv", "backup"); - dialog.withStartFile(Path.tv().getAbsolutePath()); - dialog.withChosenListener(this::onChoosePath); - dialog.withOnBackPressedListener(d -> dialog.goBack()); - dialog.withOnLastBackPressedListener(d -> dialog.dismiss()); - dialog.build().show(); - } - - - private void onChoosePath(String path, File pathFile) { - callback.onRestore(pathFile); - if (dialog != null) dialog.dismiss(); - } -} \ No newline at end of file diff --git a/app/src/leanback/res/layout/adapter_backup.xml b/app/src/leanback/res/layout/adapter_backup.xml new file mode 100644 index 000000000..896a64c52 --- /dev/null +++ b/app/src/leanback/res/layout/adapter_backup.xml @@ -0,0 +1,35 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/android/tv/impl/BackupCallback.java b/app/src/main/java/com/fongmi/android/tv/impl/BackupCallback.java new file mode 100644 index 000000000..e2fed73ce --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/impl/BackupCallback.java @@ -0,0 +1,9 @@ +package com.fongmi.android.tv.impl; + + +import java.io.File; + +public interface BackupCallback { + + void restore(File file); +} 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 fc4fcfdfa..000000000 --- a/app/src/main/java/com/fongmi/android/tv/impl/RestoreCallback.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.fongmi.android.tv.impl; - -import java.io.File; - -public interface RestoreCallback { - - void onRestore(File file); -} \ No newline at end of file diff --git a/app/src/main/java/com/fongmi/android/tv/utils/FileChooser.java b/app/src/main/java/com/fongmi/android/tv/utils/FileChooser.java index 6a68c633c..ac1d4b069 100644 --- a/app/src/main/java/com/fongmi/android/tv/utils/FileChooser.java +++ b/app/src/main/java/com/fongmi/android/tv/utils/FileChooser.java @@ -27,9 +27,8 @@ public class FileChooser { private final Fragment fragment; private static int type; - public static final int TYPE_RESTORE = 0; - public static final int TYPE_APK = 1; - public static final int TYPE_PUSH_WALLPAPER = 2; + public static final int TYPE_APK = 0; + public static final int TYPE_PUSH_WALLPAPER = 1; public static FileChooser from(Fragment fragment) { return new FileChooser(fragment); diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/BackupAdapter.java b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/BackupAdapter.java new file mode 100644 index 000000000..d45da7fb9 --- /dev/null +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/BackupAdapter.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.AdapterBackupBinding; +import com.fongmi.android.tv.db.AppDatabase; +import com.github.catvod.utils.Path; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class BackupAdapter extends RecyclerView.Adapter { + + private final OnClickListener mListener; + private List mItems; + + public BackupAdapter(OnClickListener listener) { + this.mListener = listener; + } + + public interface OnClickListener { + + void onTextClick(String item); + + void onDeleteClick(String item); + } + + public BackupAdapter addAll() { + mItems = new ArrayList<>(); + for(File file : Path.list(Path.tv())) if (file.getAbsolutePath().endsWith(AppDatabase.BACKUP_SUFFIX)) mItems.add(file.getName().replace("." + AppDatabase.BACKUP_SUFFIX, "")); + Collections.sort(mItems); + return this; + } + + public int remove(String item) { + File file = new File(Path.tv(), item + "." + AppDatabase.BACKUP_SUFFIX); + if (file.exists()) file.delete(); + mItems.remove(item); + notifyDataSetChanged(); + return getItemCount(); + } + + @Override + public int getItemCount() { + return mItems.size(); + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + return new ViewHolder(AdapterBackupBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + } + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + String item = mItems.get(position); + holder.binding.text.setText(item); + holder.binding.text.setOnClickListener(v -> mListener.onTextClick(item)); + holder.binding.delete.setOnClickListener(v -> mListener.onDeleteClick(item)); + } + + static class ViewHolder extends RecyclerView.ViewHolder { + + private final AdapterBackupBinding binding; + + ViewHolder(@NonNull AdapterBackupBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + } +} diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/BackupDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/BackupDialog.java new file mode 100644 index 000000000..f3e70ebc6 --- /dev/null +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/BackupDialog.java @@ -0,0 +1,64 @@ +package com.fongmi.android.tv.ui.dialog; + +import android.view.LayoutInflater; + +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.Fragment; + +import com.fongmi.android.tv.databinding.DialogHistoryBinding; +import com.fongmi.android.tv.db.AppDatabase; +import com.fongmi.android.tv.impl.BackupCallback; +import com.fongmi.android.tv.ui.adapter.BackupAdapter; +import com.fongmi.android.tv.ui.custom.SpaceItemDecoration; +import com.github.catvod.utils.Path; +import com.google.android.material.dialog.MaterialAlertDialogBuilder; + +import java.io.File; + +public class BackupDialog implements BackupAdapter.OnClickListener { + + private final DialogHistoryBinding binding; + private final BackupCallback callback; + private final BackupAdapter adapter; + private final AlertDialog dialog; + + public static BackupDialog create(Fragment fragment) { + return new BackupDialog(fragment); + } + + + public BackupDialog(Fragment fragment) { + this.callback = (BackupCallback) fragment; + this.binding = DialogHistoryBinding.inflate(LayoutInflater.from(fragment.getContext())); + this.dialog = new MaterialAlertDialogBuilder(fragment.getActivity()).setView(binding.getRoot()).create(); + this.adapter = new BackupAdapter(this); + } + + public void show() { + setRecyclerView(); + setDialog(); + } + + private void setRecyclerView() { + binding.recycler.setHasFixedSize(true); + binding.recycler.addItemDecoration(new SpaceItemDecoration(1, 8)); + binding.recycler.setAdapter(adapter.addAll()); + } + + private void setDialog() { + if (adapter.getItemCount() == 0) return; + dialog.getWindow().setDimAmount(0); + dialog.show(); + } + + @Override + public void onTextClick(String item) { + callback.restore(new File(Path.tv(), item + "." + AppDatabase.BACKUP_SUFFIX)); + dialog.dismiss(); + } + + @Override + public void onDeleteClick(String item) { + if (adapter.remove(item) == 0) dialog.dismiss(); + } +} diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java index f73b6e02f..2fc9e93e3 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java @@ -25,6 +25,7 @@ import com.fongmi.android.tv.bean.Site; import com.fongmi.android.tv.databinding.FragmentSettingBinding; import com.fongmi.android.tv.db.AppDatabase; import com.fongmi.android.tv.event.RefreshEvent; +import com.fongmi.android.tv.impl.BackupCallback; import com.fongmi.android.tv.impl.Callback; import com.fongmi.android.tv.impl.ConfigCallback; import com.fongmi.android.tv.impl.LiveCallback; @@ -33,6 +34,7 @@ import com.fongmi.android.tv.impl.SiteCallback; import com.fongmi.android.tv.player.Source; import com.fongmi.android.tv.ui.activity.MainActivity; import com.fongmi.android.tv.ui.base.BaseFragment; +import com.fongmi.android.tv.ui.dialog.BackupDialog; import com.fongmi.android.tv.ui.dialog.ConfigDialog; import com.fongmi.android.tv.ui.dialog.HistoryDialog; import com.fongmi.android.tv.ui.dialog.LiveDialog; @@ -59,7 +61,7 @@ import java.io.File; import java.util.ArrayList; import java.util.List; -public class SettingFragment extends BaseFragment implements ConfigCallback, SiteCallback, LiveCallback, ProxyCallback { +public class SettingFragment extends BaseFragment implements BackupCallback, ConfigCallback, SiteCallback, LiveCallback, ProxyCallback { private FragmentSettingBinding mBinding; private String[] backup; @@ -350,14 +352,14 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit } private void onRestore(View view) { - FileChooser.from(this).type(FileChooser.TYPE_RESTORE).show(FileChooser.getUri("TV")); + PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> { + if (allGranted) BackupDialog.create(this).show(); + }); } private void onTransmit(View view) { PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> { - if (allGranted) { - TransmitActionDialog.create(this).show(); - } + if (allGranted) TransmitActionDialog.create(this).show(); }); } @@ -374,7 +376,8 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit VodConfig.get().init().load(getCallback()); } - private void restore(File file) { + @Override + public void restore(File file) { PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> AppDatabase.restore(file, new Callback() { @Override public void success() { @@ -418,7 +421,6 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit if (resultCode != Activity.RESULT_OK || requestCode != FileChooser.REQUEST_PICK_FILE) return; String path = FileChooser.getPathFromUri(getContext(), data.getData()); if (FileChooser.type() == FileChooser.TYPE_APK) TransmitDialog.create().apk(path).show(getActivity()); - else if (FileChooser.type() == FileChooser.TYPE_RESTORE) restore(new File(path)); else if (FileChooser.type() == FileChooser.TYPE_PUSH_WALLPAPER) TransmitDialog.create().wallConfig(path).show(getActivity()); else setConfig(Config.find("file:/" + path.replace(Path.rootPath(), ""), type)); } diff --git a/app/src/mobile/res/layout/adapter_backup.xml b/app/src/mobile/res/layout/adapter_backup.xml new file mode 100644 index 000000000..51df1d212 --- /dev/null +++ b/app/src/mobile/res/layout/adapter_backup.xml @@ -0,0 +1,30 @@ + + + + + + + + \ No newline at end of file