Optimize Update UX

pull/123/head
FongMi 3 years ago
parent c396278a8a
commit 8f97f2a32d
  1. 5
      app/src/leanback/java/com/fongmi/android/tv/ui/activity/DetailActivity.java
  2. 44
      app/src/main/java/com/fongmi/android/tv/Constant.java
  3. 60
      app/src/main/java/com/fongmi/android/tv/Github.java
  4. 91
      app/src/main/java/com/fongmi/android/tv/api/Updater.java
  5. 6
      app/src/main/java/com/fongmi/android/tv/net/Callback.java
  6. 60
      app/src/main/java/com/fongmi/android/tv/net/Download.java
  7. 4
      app/src/main/java/com/fongmi/android/tv/player/source/Force.java
  8. 8
      app/src/main/java/com/fongmi/android/tv/utils/Prefers.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() {

@ -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;
}
}

@ -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;
}
}

@ -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> 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();
}
};
}
}

@ -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) {
}

@ -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));
}
}
}
}

@ -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());
}

@ -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;
}

Loading…
Cancel
Save