You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
FONGMITV/app/src/mobile/java/com/fongmi/android/tv/Updater.java

139 lines
4.0 KiB

package com.fongmi.android.tv;
import android.app.Activity;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import androidx.appcompat.app.AlertDialog;
import com.fongmi.android.tv.databinding.DialogUpdateBinding;
import com.fongmi.android.tv.utils.Download;
import com.fongmi.android.tv.utils.FileUtil;
import com.fongmi.android.tv.utils.Notify;
import com.fongmi.android.tv.utils.ResUtil;
import com.github.catvod.net.OkHttp;
import com.github.catvod.utils.Github;
import com.github.catvod.utils.Path;
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
import org.json.JSONObject;
import java.io.File;
import java.util.Locale;
public class Updater implements Download.Callback {
private DialogUpdateBinding binding;
private final Download download;
private AlertDialog dialog;
private boolean dev;
private File getFile() {
return Path.cache("update.apk");
}
private String getJson() {
return Github.getJson(dev, BuildConfig.FLAVOR_mode);
}
private String getApk() {
return Github.getApk(dev, BuildConfig.FLAVOR_mode + "-" + BuildConfig.FLAVOR_api + "-" + BuildConfig.FLAVOR_abi);
}
public static Updater create() {
return new Updater();
}
public Updater() {
this.download = Download.create(getApk(), getFile(), this);
}
public Updater force() {
Notify.show(R.string.update_check);
Setting.putUpdate(true);
return this;
}
public Updater release() {
this.dev = false;
return this;
}
public Updater dev() {
this.dev = true;
return this;
}
private Updater check() {
dismiss();
return this;
}
public void start(Activity activity) {
App.execute(() -> doInBackground(activity));
}
private boolean need(int code, String name) {
return Setting.getUpdate() && (dev ? !name.equals(BuildConfig.VERSION_NAME) && code >= BuildConfig.VERSION_CODE : code > BuildConfig.VERSION_CODE);
}
private void doInBackground(Activity activity) {
try {
JSONObject object = new JSONObject(OkHttp.string(getJson()));
String name = object.optString("name");
String desc = object.optString("desc");
int code = object.optInt("code");
if (need(code, name)) App.post(() -> show(activity, name, desc));
} catch (Exception e) {
e.printStackTrace();
}
}
private void show(Activity activity, String version, String desc) {
binding = DialogUpdateBinding.inflate(LayoutInflater.from(activity));
check().create(activity, ResUtil.getString(R.string.update_version, version)).show();
dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(this::confirm);
dialog.getButton(DialogInterface.BUTTON_NEGATIVE).setOnClickListener(this::cancel);
binding.desc.setText(desc);
}
private AlertDialog create(Activity activity, String title) {
return dialog = new MaterialAlertDialogBuilder(activity).setTitle(title).setView(binding.getRoot()).setPositiveButton(R.string.update_confirm, null).setNegativeButton(R.string.dialog_negative, null).setCancelable(false).create();
}
private void cancel(View view) {
Setting.putUpdate(false);
download.cancel();
dialog.dismiss();
}
private void confirm(View view) {
view.setEnabled(false);
download.start();
}
private void dismiss() {
try {
if (dialog != null) dialog.dismiss();
} catch (Exception ignored) {
}
}
@Override
public void progress(int progress) {
dialog.getButton(DialogInterface.BUTTON_POSITIVE).setText(String.format(Locale.getDefault(), "%1$d%%", progress));
}
@Override
public void error(String msg) {
Notify.show(msg);
dismiss();
}
@Override
public void success(File file) {
FileUtil.openFile(file);
dismiss();
}
}