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 fd1657c5f..f638035e4 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 @@ -545,15 +545,14 @@ public class DetailActivity extends BaseActivity implements CustomKeyDownVod.Lis return true; } - private boolean onReset() { + private void onReset() { getPlayer(isReplay()); - return true; } private boolean onResetToggle() { Prefers.putReset(Math.abs(Prefers.getReset() - 1)); mBinding.control.reset.setText(ResUtil.getStringArray(R.array.select_reset)[Prefers.getReset()]); - return onReset(); + return true; } private void onOpening() { diff --git a/app/src/main/java/com/fongmi/android/tv/Constant.java b/app/src/main/java/com/fongmi/android/tv/Constant.java deleted file mode 100644 index dd1bddc6f..000000000 --- a/app/src/main/java/com/fongmi/android/tv/Constant.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.fongmi.android.tv; - -import java.io.IOException; -import java.util.concurrent.TimeUnit; - -import okhttp3.OkHttpClient; -import okhttp3.Request; - -public class Constant { - - public static final String A = "https://raw.githubusercontent.com/"; - public static final String B = "https://raw.githubusercontents.com/"; - public static final String C = "https://ghproxy.com/"; - public static final String D = "https://raw.iqiq.io/"; - public static final String E = "https://raw.fastgit.org/"; - public static final String REPO = "FongMi/TV/"; - public static final String RELEASE = "release"; - private static final int TIME = 2; - - private static String getProxy() { - if (isOk(A)) return A + REPO; - if (isOk(B)) return B + REPO; - if (isOk(C)) return C + A + REPO; - if (isOk(D)) return D + REPO; - if (isOk(E)) return E + REPO; - return ""; - } - - private static boolean isOk(String url) { - try { - return new OkHttpClient.Builder().connectTimeout(TIME, TimeUnit.SECONDS).build().newCall(new Request.Builder().url(url).build()).execute().code() == 200; - } catch (IOException e) { - return false; - } - } - - public static String getReleasePath(String path) { - return getProxy() + RELEASE + path; - } - - public static String getBranchPath(String branch, String path) { - return getProxy() + branch + path; - } -} diff --git a/app/src/main/java/com/fongmi/android/tv/Github.java b/app/src/main/java/com/fongmi/android/tv/Github.java new file mode 100644 index 000000000..be62a2b4e --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/Github.java @@ -0,0 +1,60 @@ +package com.fongmi.android.tv; + +import android.text.TextUtils; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +import okhttp3.OkHttpClient; +import okhttp3.Request; + +public class Github { + + public static final String A = "https://raw.githubusercontent.com/"; + public static final String B = "https://ghproxy.com/"; + public static final String C = "https://raw.iqiq.io/"; + public static final String REPO = "FongMi/TV/"; + public static final String RELEASE = "release"; + public static final int TIME = 5; + + private String proxy; + + private static class Loader { + static volatile Github INSTANCE = new Github(); + } + + public static Github get() { + return Loader.INSTANCE; + } + + public Github() { + check(A); + check(B); + check(C); + } + + private void check(String url) { + try { + if (getProxy().length() > 0) return; + int code = new OkHttpClient.Builder().connectTimeout(TIME, TimeUnit.SECONDS).build().newCall(new Request.Builder().url(url).build()).execute().code(); + if (code == 200) setProxy(url); + } catch (IOException ignored) { + } + } + + private void setProxy(String url) { + this.proxy = url.equals(B) ? url + A + REPO : url + REPO; + } + + private String getProxy() { + return TextUtils.isEmpty(proxy) ? "" : proxy; + } + + public String getReleasePath(String path) { + return getProxy() + RELEASE + path; + } + + public String getBranchPath(String branch, String path) { + return getProxy() + branch + path; + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/api/Updater.java b/app/src/main/java/com/fongmi/android/tv/api/Updater.java index 6530c9546..a4228b95e 100644 --- a/app/src/main/java/com/fongmi/android/tv/api/Updater.java +++ b/app/src/main/java/com/fongmi/android/tv/api/Updater.java @@ -1,7 +1,6 @@ package com.fongmi.android.tv.api; import android.app.Activity; -import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; @@ -9,9 +8,11 @@ import androidx.appcompat.app.AlertDialog; import com.fongmi.android.tv.App; import com.fongmi.android.tv.BuildConfig; -import com.fongmi.android.tv.Constant; +import com.fongmi.android.tv.Github; import com.fongmi.android.tv.R; import com.fongmi.android.tv.databinding.DialogUpdateBinding; +import com.fongmi.android.tv.net.Callback; +import com.fongmi.android.tv.net.Download; import com.fongmi.android.tv.net.OkHttp; import com.fongmi.android.tv.utils.FileUtil; import com.fongmi.android.tv.utils.Notify; @@ -22,15 +23,14 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import org.json.JSONObject; import java.io.File; -import java.lang.ref.WeakReference; +import java.util.Locale; -public class Updater implements View.OnClickListener { +public class Updater { - private WeakReference activity; + private DialogUpdateBinding binding; private AlertDialog dialog; private String branch; private boolean force; - private String md5; private static class Loader { static volatile Updater INSTANCE = new Updater(); @@ -45,15 +45,15 @@ public class Updater implements View.OnClickListener { } private String getJson() { - return Constant.getBranchPath(branch, "/release/" + BuildConfig.FLAVOR_mode + "-" + branch + ".json"); + return Github.get().getBranchPath(branch, "/release/" + BuildConfig.FLAVOR_mode + "-" + branch + ".json"); } private String getApk() { - return Constant.getBranchPath(branch, "/release/" + BuildConfig.FLAVOR_mode + "-" + BuildConfig.FLAVOR_api + ".apk"); + return Github.get().getBranchPath(branch, "/release/" + BuildConfig.FLAVOR_mode + "-" + BuildConfig.FLAVOR_api + ".apk"); } private Updater() { - this.branch = Constant.RELEASE; + this.branch = Github.RELEASE; } public Updater reset() { @@ -73,62 +73,69 @@ public class Updater implements View.OnClickListener { } public void start(Activity activity) { - this.activity = new WeakReference<>(activity); + this.binding = DialogUpdateBinding.inflate(LayoutInflater.from(activity)); + this.dialog = new MaterialAlertDialogBuilder(activity).setView(binding.getRoot()).setCancelable(false).create(); App.execute(this::doInBackground); } private void doInBackground() { - FileUtil.clearDir(getFile()); - connect(getJson()); - } - - private void connect(String target) { try { - JSONObject object = new JSONObject(OkHttp.newCall(target).execute().body().string()); + JSONObject object = new JSONObject(OkHttp.newCall(getJson()).execute().body().string()); String name = object.optString("name"); String desc = object.optString("desc"); int code = object.optInt("code"); - boolean need = code > BuildConfig.VERSION_CODE; - if (need || force) FileUtil.write(getFile(), OkHttp.newCall(getApk()).execute().body().bytes()); - boolean show = need && Prefers.getUpdate() || force && !Prefers.getApkMd5().equals(md5 = FileUtil.getMd5(getFile())); - if (getFile().exists() && show) App.post(() -> checkActivity(name, desc)); + boolean need = code > BuildConfig.VERSION_CODE && Prefers.getUpdate(); + if (need || force) App.post(() -> show(name, desc)); } catch (Exception e) { e.printStackTrace(); } } - private void checkActivity(String version, String desc) { - if (dialog != null) dialog.dismiss(); - if (activity.get() == null || activity.get().isFinishing()) install(); - else showDialog(version, desc); - } - - private void showDialog(String version, String desc) { - DialogUpdateBinding binding = DialogUpdateBinding.inflate(LayoutInflater.from(activity.get())); - dialog = new MaterialAlertDialogBuilder(activity.get()).setView(binding.getRoot()).create(); + private void show(String version, String desc) { binding.version.setText(ResUtil.getString(R.string.update_version, version)); - binding.confirm.setOnClickListener(this); - binding.cancel.setOnClickListener(this); + binding.confirm.setOnClickListener(this::confirm); + binding.cancel.setOnClickListener(this::cancel); binding.desc.setText(desc); dialog.show(); } - private void install() { - FileUtil.openFile(getFile()); - if (!TextUtils.isEmpty(md5)) Prefers.putApkMD5(md5); - } - private void dismiss() { if (dialog != null) dialog.dismiss(); - this.branch = Constant.RELEASE; + this.branch = Github.RELEASE; this.force = false; - this.md5 = null; } - @Override - public void onClick(View view) { - if (view.getId() == R.id.cancel) Prefers.putUpdate(false); - if (view.getId() == R.id.confirm) install(); + private void cancel(View view) { + Prefers.putUpdate(false); dismiss(); } + + private void confirm(View view) { + binding.confirm.setEnabled(false); + download(); + } + + private void download() { + Download.create(getApk(), getFile(), getCallback()).start(); + } + + private Callback getCallback() { + return new Callback() { + @Override + public void progress(int progress) { + binding.confirm.setText(String.format(Locale.getDefault(), "%1$d%%", progress)); + } + + @Override + public void success() { + FileUtil.openFile(getFile()); + dismiss(); + } + + @Override + public void error() { + dismiss(); + } + }; + } } diff --git a/app/src/main/java/com/fongmi/android/tv/net/Callback.java b/app/src/main/java/com/fongmi/android/tv/net/Callback.java index 788a83379..e7be12307 100644 --- a/app/src/main/java/com/fongmi/android/tv/net/Callback.java +++ b/app/src/main/java/com/fongmi/android/tv/net/Callback.java @@ -13,9 +13,15 @@ public class Callback implements okhttp3.Callback { public void success() { } + public void error() { + } + public void error(@StringRes int resId) { } + public void progress(int progress) { + } + @Override public void onFailure(@NonNull Call call, @NonNull IOException e) { } diff --git a/app/src/main/java/com/fongmi/android/tv/net/Download.java b/app/src/main/java/com/fongmi/android/tv/net/Download.java new file mode 100644 index 000000000..8facf7cf8 --- /dev/null +++ b/app/src/main/java/com/fongmi/android/tv/net/Download.java @@ -0,0 +1,60 @@ +package com.fongmi.android.tv.net; + +import com.fongmi.android.tv.App; +import com.fongmi.android.tv.utils.FileUtil; + +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.util.Objects; + +import okhttp3.Response; + +public class Download { + + private final File file; + private final String url; + private final Callback callback; + + public static Download create(String url, File file, Callback callback) { + return new Download(url, file, callback); + } + + public Download(String url, File file, Callback callback) { + this.url = url; + this.file = file; + this.callback = callback; + } + + public void start() { + App.execute(this::doInBackground); + } + + private void doInBackground() { + try { + FileUtil.clearDir(file); + Response response = OkHttp.newCall(url).execute(); + download(response.body().byteStream(), Double.parseDouble(Objects.requireNonNull(response.header("Content-Length", "1")))); + App.post(callback::success); + } catch (Exception e) { + App.post(callback::error); + e.printStackTrace(); + } + } + + private void download(InputStream is, double length) throws Exception { + FileOutputStream os = new FileOutputStream(file); + try (BufferedInputStream input = new BufferedInputStream(is)) { + byte[] buffer = new byte[4096]; + int readBytes; + long totalBytes = 0; + while ((readBytes = input.read(buffer)) != -1) { + totalBytes += readBytes; + os.write(buffer, 0, readBytes); + int progress = (int) (totalBytes / length * 100.0); + App.post(() -> callback.progress(progress)); + } + } + } +} diff --git a/app/src/main/java/com/fongmi/android/tv/player/source/Force.java b/app/src/main/java/com/fongmi/android/tv/player/source/Force.java index fdb62bbdc..61685bde9 100644 --- a/app/src/main/java/com/fongmi/android/tv/player/source/Force.java +++ b/app/src/main/java/com/fongmi/android/tv/player/source/Force.java @@ -9,8 +9,8 @@ import android.os.IBinder; import android.os.SystemClock; import com.fongmi.android.tv.App; -import com.fongmi.android.tv.Constant; import com.fongmi.android.tv.net.OkHttp; +import com.fongmi.android.tv.Github; import com.fongmi.android.tv.utils.FileUtil; import com.forcetech.Port; import com.gsoft.mitv.MainActivity; @@ -38,7 +38,7 @@ public class Force { private void check() throws Exception { File file = FileUtil.getCacheFile("libmitv.so"); - String url = Constant.getReleasePath("/other/libmitv.so"); + String url = Github.get().getReleasePath("/other/libmitv.so"); if (!file.exists()) FileUtil.write(file, OkHttp.newCall(url).execute().body().bytes()); } 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 8bd5b29ea..40d5e59e7 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 @@ -171,14 +171,6 @@ public class Prefers { put("update", update); } - public static String getApkMd5() { - return getString("apk_md5"); - } - - public static void putApkMD5(String apkMd5) { - put("apk_md5", apkMd5); - } - public static float getThumbnail() { return 0.3f * getQuality() + 0.4f; }