MainActivity.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. package com.norman.webviewup.demo;
  2. import android.app.Activity;
  3. import android.content.DialogInterface;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.text.TextUtils;
  7. import android.util.Log;
  8. import android.view.View;
  9. import android.webkit.WebView;
  10. import android.widget.ProgressBar;
  11. import android.widget.TextView;
  12. import android.widget.Toast;
  13. import androidx.annotation.Nullable;
  14. import androidx.appcompat.app.AlertDialog;
  15. import com.norman.webviewup.lib.UpgradeCallback;
  16. import com.norman.webviewup.lib.WebViewUpgrade;
  17. import com.norman.webviewup.lib.source.UpgradeAssetSource;
  18. import com.norman.webviewup.lib.source.UpgradePackageSource;
  19. import com.norman.webviewup.lib.source.UpgradeSource;
  20. import com.norman.webviewup.lib.source.download.UpgradeDownloadSource;
  21. import com.norman.webviewup.lib.util.ProcessUtils;
  22. import com.norman.webviewup.lib.util.VersionUtils;
  23. import java.io.File;
  24. import java.util.Arrays;
  25. import java.util.HashMap;
  26. import java.util.List;
  27. import java.util.Map;
  28. public class MainActivity extends Activity implements UpgradeCallback {
  29. private static final Map<String, List<UpgradeInfo>> UPGRADE_PACKAGE_MAP = new HashMap<>();
  30. static {
  31. UPGRADE_PACKAGE_MAP.put("arm", Arrays.asList(
  32. new UpgradeInfo(
  33. "com.google.android.webview",
  34. "122.0.6261.64",
  35. "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.google.android.webview_122.0.6261.64_armeabi-v7a.zip",
  36. "网络"),
  37. new UpgradeInfo(
  38. "com.android.webview",
  39. "113.0.5672.136",
  40. "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.android.webview_113.0.5672.13_armeabi-v7a.zip",
  41. "网络"),
  42. new UpgradeInfo(
  43. "com.huawei.webview",
  44. "14.0.0.331",
  45. "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.huawei.webview_14.0.0.331_arm64-v8a_armeabi-v7a.zip",
  46. "网络"),
  47. new UpgradeInfo(
  48. "com.android.chrome",
  49. "122.0.6261.43",
  50. "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.android.chrome_122.0.6261.64_armeabi-v7a.zip",
  51. "网络"),
  52. new UpgradeInfo("com.amazon.webview.chromium",
  53. "118-5993-tv.5993.155.51",
  54. "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.amazon.webview.chromium_118-5993-tv.5993.155.51_armeabi-v7a.zip",
  55. "网络"),
  56. new UpgradeInfo("com.amazon.webview.chromium",
  57. "118-5993-tv.5993.155.51",
  58. "com.webview.chromium_118-5993-tv.5993.155.51_armeabi-v7a.apk",
  59. "内置"),
  60. new UpgradeInfo(
  61. "com.android.chrome",
  62. "122.0.6261.43",
  63. "",
  64. "安装包")
  65. ));
  66. UPGRADE_PACKAGE_MAP.put("arm64", Arrays.asList(
  67. new UpgradeInfo(
  68. "com.huawei.webview",
  69. "14.0.0.331",
  70. "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.huawei.webview_14.0.0.331_arm64-v8a_armeabi-v7a.zip")
  71. ));
  72. UPGRADE_PACKAGE_MAP.put("x86", Arrays.asList(
  73. new UpgradeInfo(
  74. "com.google.android.webview",
  75. "122.0.6261.64",
  76. "https://mirror.ghproxy.com/https://raw.githubusercontent.com/JonaNorman/ShareFile/main/com.google.android.webview_122.0.6261.64_x86.zip")
  77. ));
  78. }
  79. ProgressBar progressBar;
  80. TextView systemWebViewPackageTextView;
  81. TextView upgradeWebViewPackageTextView;
  82. TextView upgradeStatusTextView;
  83. TextView upgradeErrorTextView;
  84. TextView upgradeProgressTextView;
  85. UpgradeInfo selectUpgradeInfo;
  86. protected void onCreate(Bundle savedInstanceState) {
  87. super.onCreate(savedInstanceState);
  88. setContentView(R.layout.activity_main);
  89. WebViewUpgrade.addUpgradeCallback(this);
  90. progressBar = findViewById(R.id.upgradeProgressBar);
  91. systemWebViewPackageTextView = findViewById(R.id.systemWebViewPackageTextView);
  92. upgradeWebViewPackageTextView = findViewById(R.id.upgradeWebViewPackageTextView);
  93. upgradeStatusTextView = findViewById(R.id.upgradeStatusTextView);
  94. upgradeErrorTextView = findViewById(R.id.upgradeErrorTextView);
  95. upgradeProgressTextView = findViewById(R.id.upgradeProgressTextView);
  96. updateSystemWebViewPackageInfo();
  97. updateSystemWebViewPackageInfo();
  98. updateUpgradeWebViewStatus();
  99. findViewById(R.id.upgradeButton).setOnClickListener(new View.OnClickListener() {
  100. @Override
  101. public void onClick(View v) {
  102. showChooseWebViewDialog();
  103. }
  104. });
  105. findViewById(R.id.webViewButton).setOnClickListener(new View.OnClickListener() {
  106. @Override
  107. public void onClick(View v) {
  108. startActivity(new Intent(MainActivity.this, WebViewActivity.class));
  109. }
  110. });
  111. }
  112. @Override
  113. protected void onDestroy() {
  114. super.onDestroy();
  115. WebViewUpgrade.removeUpgradeCallback(this);
  116. }
  117. @Override
  118. public void onUpgradeProcess(float percent) {
  119. updateUpgradeWebViewStatus();
  120. }
  121. @Override
  122. public void onUpgradeComplete() {
  123. updateUpgradeWebViewStatus();
  124. Toast.makeText(getApplicationContext(), "webView upgrade success", Toast.LENGTH_SHORT).show();
  125. }
  126. @Override
  127. public void onUpgradeError(Throwable throwable) {
  128. Toast.makeText(getApplicationContext(), "webView upgrade fail", Toast.LENGTH_SHORT).show();
  129. Log.e("MainActivity", "message:" + throwable.getMessage() + "\nstackTrace:" + Log.getStackTraceString(throwable));
  130. updateUpgradeWebViewStatus();
  131. }
  132. private void showChooseWebViewDialog() {
  133. AlertDialog.Builder builder = new AlertDialog.Builder(this);
  134. builder.setTitle("Choose WebView");
  135. List<UpgradeInfo> upgradeInfoList = UPGRADE_PACKAGE_MAP.get(ProcessUtils.getCurrentInstruction());
  136. String[] items = new String[upgradeInfoList.size()];
  137. for (int i = 0; i < items.length; i++) {
  138. items[i] = upgradeInfoList.get(i).title;
  139. }
  140. builder.setItems(items, new DialogInterface.OnClickListener() {
  141. @Override
  142. public void onClick(DialogInterface dialog, int which) {
  143. dialog.dismiss();
  144. if (WebViewUpgrade.isProcessing()) {
  145. Toast.makeText(getApplicationContext(), "webView is being upgraded, please wait", Toast.LENGTH_LONG).show();
  146. } else if (WebViewUpgrade.isCompleted()) {
  147. Toast.makeText(getApplicationContext(), "webView is already upgrade success,not support dynamic switch", Toast.LENGTH_LONG).show();
  148. } else {
  149. UpgradeInfo upgradeInfo = upgradeInfoList.get(which);
  150. if (WebViewUpgrade.getSystemWebViewPackageName().equals(upgradeInfo.packageName)
  151. && VersionUtils.compareVersion( WebViewUpgrade.getSystemWebViewPackageVersion(),upgradeInfo.versionName) >= 0) {
  152. Toast.makeText(getApplicationContext(), "system webView is larger than the one to be upgraded, so there is no need to upgrade", Toast.LENGTH_LONG).show();
  153. return;
  154. }
  155. selectUpgradeInfo = upgradeInfo;
  156. UpgradeSource upgradeSource = getUpgradeSource(upgradeInfo);
  157. if (upgradeSource == null) {
  158. return;
  159. }
  160. WebViewUpgrade.upgrade(upgradeSource);
  161. updateUpgradeWebViewPackageInfo();
  162. updateUpgradeWebViewStatus();
  163. }
  164. }
  165. });
  166. AlertDialog dialog = builder.create();
  167. dialog.show();
  168. }
  169. @Nullable
  170. private UpgradeSource getUpgradeSource(UpgradeInfo upgradeInfo) {
  171. UpgradeSource upgradeSource = null;
  172. if (upgradeInfo.extraInfo.equals("网络")) {
  173. upgradeSource = new UpgradeDownloadSource(
  174. getApplicationContext(),
  175. upgradeInfo.url,
  176. new File(getApplicationContext().getFilesDir(), upgradeInfo.packageName + "/" + upgradeInfo.versionName + ".apk")
  177. );
  178. } else if (upgradeInfo.extraInfo.equals("内置")) {
  179. upgradeSource = new UpgradeAssetSource(
  180. getApplicationContext(),
  181. upgradeInfo.url,
  182. new File(getApplicationContext().getFilesDir(), upgradeInfo.packageName + "/" + upgradeInfo.versionName + ".apk")
  183. );
  184. } else if (upgradeInfo.extraInfo.equals("安装包")) {
  185. upgradeSource = new UpgradePackageSource(
  186. getApplicationContext(),
  187. upgradeInfo.packageName
  188. );
  189. }
  190. return upgradeSource;
  191. }
  192. private void updateSystemWebViewPackageInfo() {
  193. String systemWebViewPackageName = WebViewUpgrade.getSystemWebViewPackageName();
  194. String systemWebViewPackageVersion = WebViewUpgrade.getSystemWebViewPackageVersion();
  195. String systemWebViewPackageInfo = "unknown";
  196. if (!TextUtils.isEmpty(systemWebViewPackageName)
  197. || !TextUtils.isEmpty(systemWebViewPackageVersion)) {
  198. systemWebViewPackageInfo = (!TextUtils.isEmpty(systemWebViewPackageName) ? systemWebViewPackageName : "unknown")
  199. + ":" + (!TextUtils.isEmpty(systemWebViewPackageVersion) ? systemWebViewPackageVersion : "unknown");
  200. }
  201. systemWebViewPackageTextView.setText(systemWebViewPackageInfo);
  202. }
  203. private void updateUpgradeWebViewPackageInfo() {
  204. String upgradeWebViewPackageName = selectUpgradeInfo != null ? selectUpgradeInfo.packageName : null;
  205. String upgradeWebViewPackageVersion = selectUpgradeInfo != null ? selectUpgradeInfo.versionName : null;
  206. String upgradeWebViewPackageInfo = "";
  207. if (!TextUtils.isEmpty(upgradeWebViewPackageName)
  208. || !TextUtils.isEmpty(upgradeWebViewPackageVersion)) {
  209. upgradeWebViewPackageInfo = (!TextUtils.isEmpty(upgradeWebViewPackageName) ? upgradeWebViewPackageName : "unknown")
  210. + ":" + (!TextUtils.isEmpty(upgradeWebViewPackageVersion) ? upgradeWebViewPackageVersion : "unknown");
  211. } else {
  212. upgradeWebViewPackageInfo = "";
  213. }
  214. upgradeWebViewPackageTextView.setText(upgradeWebViewPackageInfo);
  215. }
  216. private void updateUpgradeWebViewStatus() {
  217. if (WebViewUpgrade.isProcessing()) {
  218. upgradeStatusTextView.setText("upgrading...");
  219. } else if (WebViewUpgrade.isFailed()) {
  220. upgradeStatusTextView.setText("fail");
  221. } else if (WebViewUpgrade.isCompleted()) {
  222. upgradeStatusTextView.setText("complete");
  223. } else {
  224. upgradeStatusTextView.setText("");
  225. }
  226. int process = (int) (WebViewUpgrade.getUpgradeProcess() * 100);
  227. progressBar.setProgress(process);
  228. upgradeProgressTextView.setText(process + "%");
  229. Throwable throwable = WebViewUpgrade.getUpgradeError();
  230. if (throwable == null) {
  231. upgradeErrorTextView.setText("");
  232. } else {
  233. upgradeErrorTextView.setText("message:" + throwable.getMessage() + "\nstackTrace:" + Log.getStackTraceString(throwable));
  234. }
  235. }
  236. static class UpgradeInfo {
  237. public UpgradeInfo(String packageName, String versionName, String url, String extraInfo) {
  238. this.title = packageName + "\n" + versionName;
  239. this.extraInfo = !TextUtils.isEmpty(extraInfo) ? extraInfo : "";
  240. if (!extraInfo.isEmpty()) {
  241. this.title = this.title + "\n" + extraInfo;
  242. }
  243. this.url = url;
  244. this.packageName = packageName;
  245. this.versionName = versionName;
  246. }
  247. public UpgradeInfo(String packageName, String versionName, String url) {
  248. this(packageName, versionName, url, "");
  249. }
  250. String title;
  251. String url;
  252. String packageName;
  253. String versionName;
  254. String extraInfo;
  255. }
  256. }