From 0b4e3c630323f8689acb854738270a2d1c8f6cbf Mon Sep 17 00:00:00 2001 From: Vologhat <47892605+Vologhat@users.noreply.github.com> Date: Wed, 15 Jun 2022 16:41:21 +0300 Subject: [PATCH] added ota --- .../vtosters/lite/ui/fragments/OTADialog.java | 50 +++++++ .../lite/ui/fragments/VTSettings.java | 3 +- .../ru/vtosters/lite/utils/OTAHelper.java | 126 ++++++++++++++++++ smali/AndroidManifest.xml | 2 +- 4 files changed, 179 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/ru/vtosters/lite/ui/fragments/OTADialog.java create mode 100644 app/src/main/java/ru/vtosters/lite/utils/OTAHelper.java diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/OTADialog.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/OTADialog.java new file mode 100644 index 000000000..13d98dd5a --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/OTADialog.java @@ -0,0 +1,50 @@ +package ru.vtosters.lite.ui.fragments; + +import android.app.Activity; +import android.app.ProgressDialog; +import android.content.Context; +import android.widget.Toast; + +import com.vk.core.dialogs.VKProgressDialog; + +import ru.vtosters.lite.utils.OTAHelper; + +public class OTADialog implements OTAHelper.OTAListener { + + private Activity mActivity; + private VKProgressDialog mProgressDialog; + + private OTAHelper mHelper; + + public static OTADialog checkUpdates(Activity activity) { + return new OTADialog(activity); + } + + public OTADialog(Activity activity) { + mActivity = activity; + + mProgressDialog = new VKProgressDialog(activity); + mProgressDialog.setTitle("Проверка обновлений..."); + mProgressDialog.setCancelable(false); + mProgressDialog.show(); + + mHelper = new OTAHelper(this); + mHelper.loadData(); + } + + @Override + public void onUpdateApplied() { + mActivity.runOnUiThread(() -> { + Toast.makeText(mActivity, "Обновления найдены", Toast.LENGTH_SHORT).show(); + mProgressDialog.dismiss(); + }); + } + + @Override + public void onUpdateCanceled() { + mActivity.runOnUiThread(() -> { + Toast.makeText(mActivity, "Обновлений не найдено", Toast.LENGTH_SHORT).show(); + mProgressDialog.dismiss(); + }); + } +} diff --git a/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java b/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java index 5d1fb55a2..06bfabeff 100644 --- a/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java +++ b/app/src/main/java/ru/vtosters/lite/ui/fragments/VTSettings.java @@ -337,7 +337,8 @@ public class VTSettings extends MaterialPreferenceToolbarFragment { }); PreferencesUtil.addPreference(this, "", getString("download_latest_vtl"), "", "ic_download_24", preference -> { - getContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://github.com/vtosters/lite/releases/latest"))); +// getContext().startActivity(new Intent("android.intent.action.VIEW").setData(Uri.parse("https://github.com/vtosters/lite/releases/latest"))); + OTADialog.checkUpdates(p()); return false; }); } diff --git a/app/src/main/java/ru/vtosters/lite/utils/OTAHelper.java b/app/src/main/java/ru/vtosters/lite/utils/OTAHelper.java new file mode 100644 index 000000000..a876334da --- /dev/null +++ b/app/src/main/java/ru/vtosters/lite/utils/OTAHelper.java @@ -0,0 +1,126 @@ +package ru.vtosters.lite.utils; + +import android.util.Log; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; + +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +public class OTAHelper { + + private static final String LATEST_RELEASE_URL = "https://api.github.com/repositories/473685743/releases/latest"; + private static final String LATEST_RELEASE_COMMIT_URL = "https://api.github.com/repositories/473685743/git/ref/tags/%s"; + + private OTAListener mListener; + + private final OkHttpClient mClient = new OkHttpClient(); + + private JSONObject mReleaseJson; + private JSONObject mCommitJson; + + public OTAHelper(OTAListener listener) { + this.mListener = listener; + } + + public void loadData() { + Request release = new Request.Builder() + .url(LATEST_RELEASE_URL) + .build(); + mClient.newCall(release).a(new Callback() { + @Override + public void a(Call call, IOException e) { + Log.d("OTAHelper", "Error while getting latest release info: " + e); + mListener.onUpdateCanceled(); + } + + @Override + public void a(Call call, Response response) throws IOException { + try { + setData(response); + } catch (JSONException | NullPointerException e) { + e.printStackTrace(); + } + + } + }); + } + + void setData(Response response) throws IOException, JSONException { + mReleaseJson = new JSONObject(response.body().string()); + + String tag = mReleaseJson.getString("tag_name"); + Request commit = new Request.Builder() + .url(String.format(LATEST_RELEASE_COMMIT_URL, tag)) + .build(); + mClient.newCall(commit).a(new Callback() { + @Override + public void a(Call call, IOException e) { + Log.d("OTAHelper", "Error while getting latest commit info: " + e); + mListener.onUpdateCanceled(); + } + + @Override + public void a(Call call, Response response) throws IOException { + try { + mCommitJson = new JSONObject(response.body().string()); + if (isNewVersion()) + mListener.onUpdateApplied(); + else mListener.onUpdateCanceled(); + } catch (NullPointerException | JSONException e) { + e.printStackTrace(); + mListener.onUpdateCanceled(); + } + } + }); + } + + public boolean isNewVersion() { + try { + String commitSHA = mCommitJson.getJSONObject("object").getString("sha"); + return !commitSHA.startsWith(About.getBuildNumber()); + } catch (Exception e) { + return false; + } + } + + public String getNewVersionName() { + try { + return mReleaseJson.getString("name"); + } catch (JSONException e) { + return null; + } + } + + public String getUpdateDescription() { + try { + return mReleaseJson.getString("body"); + } catch (JSONException e) { + return null; + } + } + + public String getDownloadUrl() { + try { + return mReleaseJson.getJSONArray("assets") + .getJSONObject(0) + .getString("browser_download_url"); + } catch (JSONException e) { + return null; + } + } + + public interface OTAListener { + + void onUpdateApplied(); + + void onUpdateCanceled(); + + } +} diff --git a/smali/AndroidManifest.xml b/smali/AndroidManifest.xml index 8bd0404e5..f4a78b7f2 100644 --- a/smali/AndroidManifest.xml +++ b/smali/AndroidManifest.xml @@ -66,7 +66,7 @@ - +