Merge pull request #445 from okcaptain/dev

Dev
pull/446/head
okcaptain 2 years ago committed by GitHub
commit 4b2b34f07b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 16
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/HomeActivity.java
  2. 47
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/SettingActivity.java
  3. 56
      app/src/leanback/java/com/fongmi/android/tv/ui/dialog/RestoreDialog.java
  4. 59
      app/src/leanback/res/layout/activity_setting.xml
  5. 8
      app/src/main/java/com/fongmi/android/tv/Setting.java
  6. 39
      app/src/main/java/com/fongmi/android/tv/db/AppDatabase.java
  7. 6
      app/src/main/java/com/fongmi/android/tv/impl/RestoreCallback.java
  8. 32
      app/src/main/java/com/fongmi/android/tv/utils/FileUtil.java
  9. 8
      app/src/main/res/values-zh-rCN/strings.xml
  10. 8
      app/src/main/res/values-zh-rTW/strings.xml
  11. 8
      app/src/main/res/values/strings.xml
  12. 19
      app/src/mobile/java/com/fongmi/android/tv/ui/activity/MainActivity.java
  13. 44
      app/src/mobile/java/com/fongmi/android/tv/ui/fragment/SettingFragment.java
  14. 18
      app/src/mobile/res/layout/fragment_setting.xml
  15. 25
      catvod/src/main/java/com/github/catvod/net/OkDns.java
  16. 2
      catvod/src/main/java/com/github/catvod/net/OkHttp.java
  17. 4
      catvod/src/main/java/com/github/catvod/utils/Path.java

@ -47,7 +47,6 @@ 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.ConfigCallback;
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;
@ -55,7 +54,6 @@ import com.fongmi.android.tv.ui.base.BaseActivity;
import com.fongmi.android.tv.ui.custom.CustomTitleView;
import com.fongmi.android.tv.ui.dialog.HistoryDialog;
import com.fongmi.android.tv.ui.dialog.MenuDialog;
import com.fongmi.android.tv.ui.dialog.RestoreDialog;
import com.fongmi.android.tv.ui.dialog.SiteDialog;
import com.fongmi.android.tv.ui.fragment.HomeFragment;
import com.fongmi.android.tv.ui.fragment.VodFragment;
@ -79,7 +77,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class HomeActivity extends BaseActivity implements CustomTitleView.Listener, RestoreCallback, TypePresenter.OnClickListener, ConfigCallback {
public class HomeActivity extends BaseActivity implements CustomTitleView.Listener, TypePresenter.OnClickListener, ConfigCallback {
public ActivityHomeBinding mBinding;
private ArrayObjectAdapter mAdapter;
@ -331,7 +329,6 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
@Override
public void error(String msg) {
if (TextUtils.isEmpty(msg) && AppDatabase.getBackup().exists()) RestoreDialog.create(getActivity()).show();
if (getHomeFragment().init) getHomeFragment().mBinding.progressLayout.showContent();
else App.post(() -> getHomeFragment().mBinding.progressLayout.showContent(), 1000);
mResult = Result.empty();
@ -341,17 +338,6 @@ public class HomeActivity extends BaseActivity implements CustomTitleView.Listen
};
}
@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 && getHomeFragment().init) getHomeFragment().mBinding.progressLayout.showProgress();
if (allGranted) initConfig();
}
}));
}
private void load(Config config, String success) {
switch (config.getType()) {
case 0:

@ -3,11 +3,14 @@ package com.fongmi.android.tv.ui.activity;
import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.util.Base64;
import android.view.View;
import androidx.viewbinding.ViewBinding;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.BuildConfig;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.Setting;
import com.fongmi.android.tv.Updater;
import com.fongmi.android.tv.api.config.LiveConfig;
@ -24,6 +27,7 @@ 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.ExoUtil;
import com.fongmi.android.tv.ui.base.BaseActivity;
@ -32,20 +36,24 @@ 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;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.UrlUtil;
import com.github.catvod.bean.Doh;
import com.github.catvod.net.OkHttp;
import com.permissionx.guolindev.PermissionX;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class SettingActivity extends BaseActivity implements ConfigCallback, SiteCallback, LiveCallback, DohCallback, ProxyCallback {
public class SettingActivity extends BaseActivity implements RestoreCallback, ConfigCallback, SiteCallback, LiveCallback, DohCallback, ProxyCallback {
private ActivitySettingBinding mBinding;
private String[] backup;
private int type;
public static void start(Activity activity) {
@ -73,10 +81,10 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit
mBinding.vodUrl.setText(VodConfig.getDesc());
mBinding.liveUrl.setText(LiveConfig.getDesc());
mBinding.wallUrl.setText(WallConfig.getDesc());
mBinding.backupText.setText(AppDatabase.getDate());
mBinding.dohText.setText(getDohList()[getDohIndex()]);
mBinding.versionText.setText(BuildConfig.VERSION_NAME);
mBinding.proxyText.setText(UrlUtil.scheme(Setting.getProxy()));
mBinding.backupText.setText((backup = ResUtil.getStringArray(R.array.select_backup))[Setting.getBackupMode()]);
mBinding.aboutText.setText(BuildConfig.FLAVOR_mode + "-" + BuildConfig.FLAVOR_api + "-" + BuildConfig.FLAVOR_abi);
setCacheText();
}
@ -99,6 +107,7 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit
mBinding.cache.setOnClickListener(this::onCache);
mBinding.cache.setOnLongClickListener(this::onCacheLongClick);
mBinding.backup.setOnClickListener(this::onBackup);
mBinding.restore.setOnClickListener(this::onRestore);
mBinding.player.setOnClickListener(this::onPlayer);
mBinding.danmu.setOnClickListener(this::onDanmu);
mBinding.version.setOnClickListener(this::onVersion);
@ -107,7 +116,7 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit
mBinding.live.setOnLongClickListener(this::onLiveEdit);
mBinding.liveHome.setOnClickListener(this::onLiveHome);
mBinding.wall.setOnLongClickListener(this::onWallEdit);
mBinding.backup.setOnLongClickListener(this::onBackupAuto);
mBinding.backup.setOnLongClickListener(this::onBackupMode);
mBinding.vodHistory.setOnClickListener(this::onVodHistory);
mBinding.version.setOnLongClickListener(this::onVersionDev);
mBinding.liveHistory.setOnClickListener(this::onLiveHistory);
@ -334,18 +343,42 @@ public class SettingActivity extends BaseActivity implements ConfigCallback, Sit
return true;
}
@Override
public void onRestore(File file) {
PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> AppDatabase.restore(file, new Callback() {
@Override
public void success() {
if (allGranted) {
Notify.progress(getActivity());
App.post(() -> initConfig(), 3000);
}
}
}));
}
private void onRestore(View view) {
RestoreDialog.create().callback(this).show(getActivity());
}
private void initConfig() {
WallConfig.get().init();
LiveConfig.get().init().load();
VodConfig.get().init().load(getCallback());
}
private void onBackup(View view) {
PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> AppDatabase.backup(new Callback() {
@Override
public void success() {
mBinding.backupText.setText(AppDatabase.getDate());
Notify.show(R.string.backed);
}
}));
}
private boolean onBackupAuto(View view) {
Setting.putBackupAuto(!Setting.isBackupAuto());
mBinding.backupText.setText(AppDatabase.getDate());
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;
}

@ -1,52 +1,40 @@
package com.fongmi.android.tv.ui.dialog;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import androidx.appcompat.app.AlertDialog;
import com.fongmi.android.tv.databinding.DialogRestoreBinding;
import com.fongmi.android.tv.impl.RestoreCallback;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.github.catvod.utils.Path;
import com.obsez.android.lib.filechooser.ChooserDialog;
import java.io.File;
public class RestoreDialog {
private final DialogRestoreBinding binding;
private final RestoreCallback callback;
private final AlertDialog dialog;
private ChooserDialog dialog;
public static RestoreDialog create(Activity activity) {
return new RestoreDialog(activity);
}
private RestoreCallback callback;
public RestoreDialog(Activity activity) {
this.callback = (RestoreCallback) activity;
this.binding = DialogRestoreBinding.inflate(LayoutInflater.from(activity));
this.dialog = new MaterialAlertDialogBuilder(activity).setView(binding.getRoot()).create();
public static RestoreDialog create() {
return new RestoreDialog();
}
public void show() {
initDialog();
initEvent();
public RestoreDialog callback(RestoreCallback callback) {
this.callback = callback;
return this;
}
private void initDialog() {
dialog.getWindow().setDimAmount(0);
dialog.show();
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 initEvent() {
binding.positive.setOnClickListener(this::onPositive);
binding.negative.setOnClickListener(this::onNegative);
}
private void onPositive(View view) {
callback.onRestore();
dialog.dismiss();
}
private void onNegative(View view) {
dialog.dismiss();
private void onChoosePath(String path, File pathFile) {
callback.onRestore(pathFile);
if (dialog != null) dialog.dismiss();
}
}

@ -326,7 +326,7 @@
android:orientation="horizontal">
<LinearLayout
android:id="@+id/doh"
android:id="@+id/backup"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
@ -340,23 +340,23 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="@string/setting_doh"
android:text="@string/setting_backup"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/dohText"
android:id="@+id/backupText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:textColor="@color/white"
android:textSize="18sp"
tools:text="Google" />
tools:text="Auto" />
</LinearLayout>
<LinearLayout
android:id="@+id/backup"
android:id="@+id/restore"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
@ -369,19 +369,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="@string/setting_backup"
android:text="@string/setting_restore"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/backupText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:textColor="@color/white"
android:textSize="18sp"
tools:text="20231103" />
</LinearLayout>
</LinearLayout>
@ -422,7 +413,7 @@
</LinearLayout>
<LinearLayout
android:id="@+id/version"
android:id="@+id/doh"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
@ -435,18 +426,18 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="@string/setting_version"
android:text="@string/setting_doh"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/versionText"
android:id="@+id/dohText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:textColor="@color/white"
android:textSize="18sp"
tools:text="1.2.1" />
tools:text="Google" />
</LinearLayout>
</LinearLayout>
@ -457,6 +448,36 @@
android:layout_marginTop="16dp"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/version"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:background="@drawable/selector_item"
android:focusable="true"
android:focusableInTouchMode="true"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="@string/setting_version"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/versionText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="end"
android:textColor="@color/white"
android:textSize="18sp"
tools:text="1.2.1" />
</LinearLayout>
<LinearLayout
android:id="@+id/about"
android:layout_width="0dp"

@ -314,12 +314,12 @@ public class Setting {
Prefers.put("exo_tunnel", tunnel);
}
public static boolean isBackupAuto() {
return Prefers.getBoolean("backup_auto");
public static int getBackupMode() {
return Prefers.getInt("backup_mode");
}
public static void putBackupAuto(boolean auto) {
Prefers.put("backup_auto", auto);
public static void putBackupMode(int auto) {
Prefers.put("backup_mode", auto);
}
public static float getThumbnail() {

@ -10,7 +10,6 @@ import androidx.room.migration.Migration;
import androidx.sqlite.db.SupportSQLiteDatabase;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.Setting;
import com.fongmi.android.tv.bean.Config;
import com.fongmi.android.tv.bean.Device;
@ -26,7 +25,7 @@ import com.fongmi.android.tv.db.dao.KeepDao;
import com.fongmi.android.tv.db.dao.LiveDao;
import com.fongmi.android.tv.db.dao.SiteDao;
import com.fongmi.android.tv.db.dao.TrackDao;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.FileUtil;
import com.fongmi.android.tv.utils.Util;
import com.github.catvod.utils.Path;
import com.github.catvod.utils.Prefers;
@ -41,6 +40,7 @@ public abstract class AppDatabase extends RoomDatabase {
public static final int VERSION = 30;
public static final String NAME = "tv";
public static final String SYMBOL = "@@@";
public static final String BACKUP_SUFFIX = "tv.backup";
private static volatile AppDatabase instance;
@ -49,37 +49,36 @@ public abstract class AppDatabase extends RoomDatabase {
return instance;
}
public static File getBackup() {
return new File(Path.tv(), NAME);
}
public static String getDate() {
return Setting.isBackupAuto() ? ResUtil.getString(R.string.setting_backup_auto) : getBackup().exists() ? Util.format(new SimpleDateFormat("MMdd", Locale.getDefault()), getBackup().lastModified()) : "";
}
public static void backup() {
if (Setting.isBackupAuto()) backup(new com.fongmi.android.tv.impl.Callback());
if (Setting.getBackupMode() == 0) backup(new com.fongmi.android.tv.impl.Callback());
}
public static void backup(com.fongmi.android.tv.impl.Callback callback) {
App.execute(() -> {
File restore = Path.restore();
if (!restore.exists()) return;
File db = App.get().getDatabasePath(NAME).getAbsoluteFile();
File wal = App.get().getDatabasePath(NAME + "-wal").getAbsoluteFile();
File shm = App.get().getDatabasePath(NAME + "-shm").getAbsoluteFile();
if (db.exists()) Path.copy(db, new File(Path.tv(), db.getName()));
if (wal.exists()) Path.copy(wal, new File(Path.tv(), wal.getName()));
if (shm.exists()) Path.copy(shm, new File(Path.tv(), shm.getName()));
Prefers.backup(new File(Path.tv(), NAME + "-pref"));
if (db.exists()) Path.copy(db, new File(restore, db.getName()));
if (wal.exists()) Path.copy(wal, new File(restore, wal.getName()));
if (shm.exists()) Path.copy(shm, new File(restore, shm.getName()));
Prefers.backup(new File(restore, NAME + "-pref"));
String time = Util.format(new SimpleDateFormat("yyyyMMddHHmm", Locale.getDefault()), (new File(restore, db.getName())).lastModified());
FileUtil.zipFolder(restore, new File(Path.tv(), time + "." + BACKUP_SUFFIX));
App.post(callback::success);
});
}
public static void restore(com.fongmi.android.tv.impl.Callback callback) {
public static void restore(File file, com.fongmi.android.tv.impl.Callback callback) {
App.execute(() -> {
File db = new File(Path.tv(), NAME);
File wal = new File(Path.tv(), NAME + "-wal");
File shm = new File(Path.tv(), NAME + "-shm");
File pref = new File(Path.tv(), NAME + "-pref");
File restore = Path.restore();
if (!restore.exists()) return;
FileUtil.unzip(file, restore);
File db = new File(restore, NAME);
File wal = new File(restore, NAME + "-wal");
File shm = new File(restore, NAME + "-shm");
File pref = new File(restore, NAME + "-pref");
if (db.exists()) Path.copy(db, App.get().getDatabasePath(db.getName()).getAbsoluteFile());
if (wal.exists()) Path.copy(wal, App.get().getDatabasePath(wal.getName()).getAbsoluteFile());
if (shm.exists()) Path.copy(shm, App.get().getDatabasePath(shm.getName()).getAbsoluteFile());

@ -1,6 +1,8 @@
package com.fongmi.android.tv.impl;
import java.io.File;
public interface RestoreCallback {
void onRestore();
}
void onRestore(File file);
}

@ -12,11 +12,14 @@ import com.fongmi.android.tv.impl.Callback;
import com.github.catvod.utils.Path;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.net.URLConnection;
import java.text.DecimalFormat;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
public class FileUtil {
@ -32,6 +35,35 @@ public class FileUtil {
App.get().startActivity(intent);
}
public static void zipFolder(File folder, File zip) {
try {
ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zip));
folderToZip("", folder, zipOut);
zipOut.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void folderToZip(String parentPath, File folder, ZipOutputStream zipOut) throws Exception {
for (File file : folder.listFiles()) {
if (file.isDirectory()) {
folderToZip(parentPath + file.getName() + "/", file, zipOut);
continue;
}
ZipEntry zipEntry = new ZipEntry(parentPath + file.getName());
zipOut.putNextEntry(zipEntry);
FileInputStream in = new FileInputStream(file);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
zipOut.write(buffer, 0, bytesRead);
}
in.close();
}
}
public static void unzip(File target, File path) {
try (ZipFile zip = new ZipFile(target)) {
Enumeration<?> entries = zip.entries();

@ -95,7 +95,7 @@
<string name="setting_proxy">Proxy</string>
<string name="setting_cache">缓存</string>
<string name="setting_backup">备份</string>
<string name="setting_backup_auto">自动</string>
<string name="setting_restore">恢复</string>
<string name="setting_version">版本</string>
<string name="setting_about">关于</string>
<string name="setting_storage">权限</string>
@ -176,6 +176,7 @@
<!-- Hint -->
<string name="copied">已复制</string>
<string name="backed">备份成功</string>
<string name="config_refreshed">接口已刷新</string>
<!-- UNIT -->
@ -183,6 +184,11 @@
<string name="times"></string>
<string name="lines"></string>
<string-array name="select_backup">
<item>自动</item>
<item>手动</item>
</string-array>
<string-array name="select_decode">
<item>软解</item>
<item>硬解</item>

@ -95,7 +95,7 @@
<string name="setting_proxy">Proxy</string>
<string name="setting_cache">暫存</string>
<string name="setting_backup">備份</string>
<string name="setting_backup_auto">自動</string>
<string name="setting_restore">恢復</string>
<string name="setting_version">版本</string>
<string name="setting_about">關於</string>
<string name="setting_storage">權限</string>
@ -177,6 +177,7 @@
<!-- Hint -->
<string name="copied">已複製</string>
<string name="backed">備份成功</string>
<string name="config_refreshed">接口已刷新</string>
<!-- UNIT -->
@ -184,6 +185,11 @@
<string name="times"></string>
<string name="lines"></string>
<string-array name="select_backup">
<item>自動</item>
<item>手動</item>
</string-array>
<string-array name="select_decode">
<item>軟解</item>
<item>硬解</item>

@ -95,7 +95,7 @@
<string name="setting_proxy">Proxy</string>
<string name="setting_cache">Cache</string>
<string name="setting_backup">Backup</string>
<string name="setting_backup_auto">Auto</string>
<string name="setting_restore">Restore</string>
<string name="setting_version">Version</string>
<string name="setting_about">About</string>
<string name="setting_storage">Permission</string>
@ -176,6 +176,7 @@
<!-- Hint -->
<string name="copied">Copied</string>
<string name="backed">Backup successful</string>
<string name="config_refreshed">Config rereshed</string>
<!-- UNIT -->
@ -183,6 +184,11 @@
<string name="times">times</string>
<string name="lines">lines</string>
<string-array name="select_backup">
<item>Auto</item>
<item>Manual</item>
</string-array>
<string-array name="select_decode">
<item>Soft</item>
<item>Hard</item>

@ -1,11 +1,9 @@
package com.fongmi.android.tv.ui.activity;
import android.Manifest;
import android.app.PendingIntent;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.MenuItem;
import android.view.View;
@ -41,9 +39,7 @@ import com.fongmi.android.tv.ui.fragment.VodFragment;
import com.fongmi.android.tv.utils.FileChooser;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.android.tv.utils.UrlUtil;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.google.android.material.navigation.NavigationBarView;
import com.permissionx.guolindev.PermissionX;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
@ -122,7 +118,6 @@ public class MainActivity extends BaseActivity implements NavigationBarView.OnIt
@Override
public void error(String msg) {
if (TextUtils.isEmpty(msg) && AppDatabase.getBackup().exists()) showRestoreDialog();
RefreshEvent.config();
StateEvent.empty();
Notify.show(msg);
@ -130,20 +125,6 @@ public class MainActivity extends BaseActivity implements NavigationBarView.OnIt
};
}
private void showRestoreDialog() {
new MaterialAlertDialogBuilder(this).setTitle(R.string.dialog_restore).setMessage(R.string.dialog_restore_msg).setNegativeButton(R.string.dialog_negative, null).setPositiveButton(R.string.dialog_positive, (dialog, which) -> onRestore()).show();
}
private 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) StateEvent.progress();
if (allGranted) initConfig();
}
}));
}
private void loadLive(String url) {
LiveConfig.load(Config.find(url, 1), new Callback() {
@Override

@ -11,6 +11,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewbinding.ViewBinding;
import com.fongmi.android.tv.App;
import com.fongmi.android.tv.BuildConfig;
import com.fongmi.android.tv.R;
import com.fongmi.android.tv.Setting;
@ -40,6 +41,7 @@ import com.fongmi.android.tv.ui.dialog.SiteDialog;
import com.fongmi.android.tv.utils.FileChooser;
import com.fongmi.android.tv.utils.FileUtil;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.android.tv.utils.ResUtil;
import com.fongmi.android.tv.utils.UrlUtil;
import com.github.catvod.bean.Doh;
import com.github.catvod.net.OkHttp;
@ -47,12 +49,14 @@ import com.github.catvod.utils.Path;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import com.permissionx.guolindev.PermissionX;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class SettingFragment extends BaseFragment implements ConfigCallback, SiteCallback, LiveCallback, ProxyCallback {
private FragmentSettingBinding mBinding;
private String[] backup;
private int type;
public static SettingFragment newInstance() {
@ -83,9 +87,9 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit
mBinding.vodUrl.setText(VodConfig.getDesc());
mBinding.liveUrl.setText(LiveConfig.getDesc());
mBinding.wallUrl.setText(WallConfig.getDesc());
mBinding.backupText.setText(AppDatabase.getDate());
mBinding.dohText.setText(getDohList()[getDohIndex()]);
mBinding.versionText.setText(BuildConfig.VERSION_NAME);
mBinding.backupText.setText((backup = ResUtil.getStringArray(R.array.select_backup))[Setting.getBackupMode()]);
mBinding.aboutText.setText(BuildConfig.FLAVOR_mode + "-" + BuildConfig.FLAVOR_api + "-" + BuildConfig.FLAVOR_abi);
mBinding.proxyText.setText(UrlUtil.scheme(Setting.getProxy()));
setCacheText();
@ -109,6 +113,7 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit
mBinding.cache.setOnClickListener(this::onCache);
mBinding.cache.setOnLongClickListener(this::onCacheLongClick);
mBinding.backup.setOnClickListener(this::onBackup);
mBinding.restore.setOnClickListener(this::onRestore);
mBinding.player.setOnClickListener(this::onPlayer);
mBinding.version.setOnClickListener(this::onVersion);
mBinding.vod.setOnLongClickListener(this::onVodEdit);
@ -116,7 +121,7 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit
mBinding.live.setOnLongClickListener(this::onLiveEdit);
mBinding.liveHome.setOnClickListener(this::onLiveHome);
mBinding.wall.setOnLongClickListener(this::onWallEdit);
mBinding.backup.setOnLongClickListener(this::onBackupAuto);
mBinding.backup.setOnLongClickListener(this::onBackupMode);
mBinding.vodHistory.setOnClickListener(this::onVodHistory);
mBinding.version.setOnLongClickListener(this::onVersionDev);
mBinding.liveHistory.setOnClickListener(this::onLiveHistory);
@ -341,18 +346,41 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit
return true;
}
private void onRestore(View view) {
FileChooser.from(this).show();
}
private void initConfig() {
WallConfig.get().init();
LiveConfig.get().init().load();
VodConfig.get().init().load(getCallback());
}
private 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() {
if (allGranted) {
Notify.progress(getActivity());
App.post(() -> initConfig(), 3000);
}
}
}));
}
private void onBackup(View view) {
PermissionX.init(this).permissions(Manifest.permission.WRITE_EXTERNAL_STORAGE).request((allGranted, grantedList, deniedList) -> AppDatabase.backup(new Callback() {
@Override
public void success() {
mBinding.backupText.setText(AppDatabase.getDate());
Notify.show(R.string.backed);
}
}));
}
private boolean onBackupAuto(View view) {
Setting.putBackupAuto(!Setting.isBackupAuto());
mBinding.backupText.setText(AppDatabase.getDate());
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;
}
@ -370,6 +398,8 @@ public class SettingFragment extends BaseFragment implements ConfigCallback, Sit
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode != Activity.RESULT_OK || requestCode != FileChooser.REQUEST_PICK_FILE) return;
setConfig(Config.find("file:/" + FileChooser.getPathFromUri(getContext(), data.getData()).replace(Path.rootPath(), ""), type));
String path = FileChooser.getPathFromUri(getContext(), data.getData());
if (path.endsWith(AppDatabase.BACKUP_SUFFIX)) restore(new File(path));
else setConfig(Config.find("file:/" + path.replace(Path.rootPath(), ""), type));
}
}

@ -355,6 +355,24 @@
</LinearLayout>
<LinearLayout
android:id="@+id/restore"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@drawable/shape_item"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:text="@string/setting_restore"
android:textColor="@color/white"
android:textSize="16sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/version"
android:layout_width="match_parent"

@ -0,0 +1,25 @@
package com.github.catvod.net;
import androidx.annotation.NonNull;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import okhttp3.Dns;
public class OkDns implements Dns {
@NonNull
@Override
public List<InetAddress> lookup(@NonNull String hostname) throws UnknownHostException {
List<InetAddress> items = new ArrayList<>();
for (InetAddress address : InetAddress.getAllByName(hostname)) {
if (address instanceof Inet4Address) items.add(0, address);
else items.add(address);
}
return items;
}
}

@ -49,7 +49,7 @@ public class OkHttp {
}
public static Dns dns() {
return get().dns != null ? get().dns : Dns.SYSTEM;
return get().dns != null ? get().dns : new OkDns();
}
public void setDoh(Doh doh) {

@ -88,6 +88,10 @@ public class Path {
return mkdir(new File(cache() + File.separator + "thunder"));
}
public static File restore() {
return mkdir(new File(cache() + File.separator + "restore"));
}
public static File root(String name) {
return new File(root(), name);
}

Loading…
Cancel
Save