From 69de6baa7a5cada29cf319fd622f1a949303e535 Mon Sep 17 00:00:00 2001 From: FongMi Date: Tue, 4 Mar 2025 15:49:08 +0800 Subject: [PATCH] Optimize restore and backup --- .../android/tv/ui/adapter/RestoreAdapter.java | 24 ++++--------------- .../android/tv/ui/dialog/RestoreDialog.java | 13 ++++------ .../com/fongmi/android/tv/db/AppDatabase.java | 15 +++++++++++- .../android/tv/ui/adapter/RestoreAdapter.java | 24 ++++--------------- .../android/tv/ui/dialog/RestoreDialog.java | 4 ---- 5 files changed, 28 insertions(+), 52 deletions(-) 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 index 2afe6500e..c04c2e216 100644 --- 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 @@ -6,8 +6,6 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -import com.fongmi.android.tv.App; -import com.fongmi.android.tv.impl.Callback; import com.fongmi.android.tv.databinding.AdapterRestoreBinding; import com.github.catvod.utils.Path; @@ -21,14 +19,6 @@ public class RestoreAdapter extends RecyclerView.Adapter mItems; - private final Callback callback = new Callback() { - @Override - public void success() { - notifyDataSetChanged(); - mListener.onItemLoaded(); - } - }; - public RestoreAdapter(OnClickListener listener) { this.mItems = new ArrayList<>(); this.mListener = listener; @@ -37,21 +27,17 @@ public class RestoreAdapter extends RecyclerView.Adapter { - File[] files = Path.tv().listFiles(); - if (files == null) files = new File[0]; - for (File file : files) if (file.getName().startsWith("tv") && file.getName().endsWith(".bk.gz")) mItems.add(file); - if (!mItems.isEmpty()) Collections.sort(mItems, (f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())); - App.post(callback::success); - }); + File[] files = Path.tv().listFiles(); + if (files == null) files = new File[0]; + for (File file : files) if (file.getName().startsWith("tv") && file.getName().endsWith(".bk.gz")) mItems.add(file); + if (!mItems.isEmpty()) Collections.sort(mItems, (f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())); + notifyDataSetChanged(); } public int remove(File item) { 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 494add026..3f73775ae 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,7 +2,6 @@ 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; @@ -20,8 +19,8 @@ import java.io.File; public class RestoreDialog implements RestoreAdapter.OnClickListener { private final DialogRestoreBinding binding; + private final RestoreAdapter adapter; private final AlertDialog dialog; - private RestoreAdapter adapter; private Callback callback; public static RestoreDialog create(Activity activity) { @@ -31,6 +30,7 @@ public class RestoreDialog implements RestoreAdapter.OnClickListener { public RestoreDialog(Activity 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(Callback callback) { @@ -40,13 +40,14 @@ public class RestoreDialog implements RestoreAdapter.OnClickListener { } private void setRecyclerView() { + binding.recycler.setAdapter(adapter); binding.recycler.setItemAnimator(null); binding.recycler.setHasFixedSize(false); - binding.recycler.setAdapter(adapter = new RestoreAdapter(this)); 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); @@ -54,12 +55,6 @@ public class RestoreDialog implements RestoreAdapter.OnClickListener { dialog.show(); } - @Override - public void onItemLoaded() { - binding.recycler.setVisibility(adapter.getItemCount() == 0 ? View.GONE : View.VISIBLE); - if (adapter.getItemCount() == 0) dialog.dismiss(); - } - @Override public void onItemClick(File item) { AppDatabase.restore(item, callback); diff --git a/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java b/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java index 4afbe050b..c1952ac52 100644 --- a/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java +++ b/app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java @@ -27,7 +27,10 @@ import com.github.catvod.utils.Path; import java.io.File; import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; import java.util.Date; +import java.util.List; import java.util.Locale; @Database(entities = {Keep.class, Site.class, Live.class, Track.class, Config.class, Device.class, History.class}, version = AppDatabase.VERSION) @@ -50,7 +53,7 @@ public abstract class AppDatabase extends RoomDatabase { public static void backup(com.fongmi.android.tv.impl.Callback callback) { App.execute(() -> { - File file = new File(Path.tv(), "tv-" + new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(new Date()) + ".bk"); + File file = new File(Path.tv(), "tv-" + new SimpleDateFormat("yyyy-MM-ddHHmmssSSS", Locale.getDefault()).format(new Date()) + ".bk"); Backup backup = Backup.create(); if (backup.getConfig().isEmpty()) { App.post(callback::error); @@ -58,6 +61,7 @@ public abstract class AppDatabase extends RoomDatabase { Path.write(file, backup.toString().getBytes()); FileUtil.gzipCompress(file); App.post(callback::success); + cleanOld(); } }); } @@ -77,6 +81,15 @@ public abstract class AppDatabase extends RoomDatabase { }); } + private static void cleanOld() { + List items = new ArrayList<>(); + File[] files = Path.tv().listFiles(); + if (files == null) files = new File[0]; + for (File file : files) if (file.getName().startsWith("tv") && file.getName().endsWith(".bk.gz")) items.add(file); + if (!items.isEmpty()) Collections.sort(items, (f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())); + if (items.size() > 7) for (int i = 7; i < items.size(); i++) Path.clear(items.get(i)); + } + private static AppDatabase create(Context context) { return Room.databaseBuilder(context, AppDatabase.class, NAME) .addMigrations(Migrations.MIGRATION_30_31) diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/RestoreAdapter.java b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/RestoreAdapter.java index 623258080..d072c03cb 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/RestoreAdapter.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/adapter/RestoreAdapter.java @@ -6,9 +6,7 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; -import com.fongmi.android.tv.App; import com.fongmi.android.tv.databinding.AdapterRestoreBinding; -import com.fongmi.android.tv.impl.Callback; import com.github.catvod.utils.Path; import java.io.File; @@ -24,14 +22,6 @@ public class RestoreAdapter extends RecyclerView.Adapter mItems; - private final Callback callback = new Callback() { - @Override - public void success() { - notifyDataSetChanged(); - mListener.onItemLoaded(); - } - }; - public RestoreAdapter(OnClickListener listener) { this.format = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()); this.mItems = new ArrayList<>(); @@ -41,21 +31,17 @@ public class RestoreAdapter extends RecyclerView.Adapter { - File[] files = Path.tv().listFiles(); - if (files == null) files = new File[0]; - for (File file : files) if (file.getName().startsWith("tv") && file.getName().endsWith(".bk.gz")) mItems.add(file); - if (!mItems.isEmpty()) Collections.sort(mItems, (f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())); - App.post(callback::success); - }); + File[] files = Path.tv().listFiles(); + if (files == null) files = new File[0]; + for (File file : files) if (file.getName().startsWith("tv") && file.getName().endsWith(".bk.gz")) mItems.add(file); + if (!mItems.isEmpty()) Collections.sort(mItems, (f1, f2) -> Long.compare(f2.lastModified(), f1.lastModified())); + notifyDataSetChanged(); } public int remove(File item) { diff --git a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/RestoreDialog.java b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/RestoreDialog.java index 0316436a8..11328d229 100644 --- a/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/RestoreDialog.java +++ b/app/src/mobile/java/com/fongmi/android/tv/ui/dialog/RestoreDialog.java @@ -46,10 +46,6 @@ public class RestoreDialog extends BaseDialog implements RestoreAdapter.OnClickL binding.recycler.setHasFixedSize(false); binding.recycler.setAdapter(adapter = new RestoreAdapter(this)); binding.recycler.addItemDecoration(new SpaceItemDecoration(1, 16)); - } - - @Override - public void onItemLoaded() { binding.recycler.setVisibility(adapter.getItemCount() == 0 ? View.GONE : View.VISIBLE); }