You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by mi...@apache.org on 2018/03/13 02:17:32 UTC
[2/3] incubator-weex git commit: +[android] playground auto check for
update
+[android] playground auto check for update
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/1294abff
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/1294abff
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/1294abff
Branch: refs/heads/master
Commit: 1294abffcde6dab79a0521e917fb444d9a6116fd
Parents: 0763bd4
Author: misakuo <mi...@apache.org>
Authored: Fri Mar 9 17:32:27 2018 +0800
Committer: misakuo <mi...@apache.org>
Committed: Fri Mar 9 17:32:27 2018 +0800
----------------------------------------------------------------------
.../playground/app/src/main/AndroidManifest.xml | 14 ++
.../java/com/alibaba/weex/IndexActivity.java | 3 +
.../alibaba/weex/update/CheckForUpdateUtil.java | 140 +++++++++++++++++++
.../com/alibaba/weex/update/Downloader.java | 112 +++++++++++++++
.../com/alibaba/weex/update/UpdateService.java | 108 ++++++++++++++
.../res/layout/common_update_notify_dialog.xml | 24 ++++
.../app/src/main/res/values-zh-rCN/strings.xml | 8 ++
.../app/src/main/res/values/strings.xml | 8 ++
.../app/src/main/res/xml/filepaths.xml | 6 +
9 files changed, 423 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1294abff/android/playground/app/src/main/AndroidManifest.xml
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/AndroidManifest.xml b/android/playground/app/src/main/AndroidManifest.xml
index 6e7338a..22128e2 100755
--- a/android/playground/app/src/main/AndroidManifest.xml
+++ b/android/playground/app/src/main/AndroidManifest.xml
@@ -118,6 +118,20 @@ under the License.
android:stateNotNeeded="true"/>
<activity android:name="com.alibaba.weex.BenchmarkActivity"
android:screenOrientation="portrait"/>
+
+ <service
+ android:name=".update.UpdateService"
+ android:exported="false" />
+
+ <provider
+ android:name="android.support.v4.content.FileProvider"
+ android:authorities="com.alibaba.weex.fileprovider"
+ android:grantUriPermissions="true"
+ android:exported="false">
+ <meta-data
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/filepaths" />
+ </provider>
</application>
</manifest>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1294abff/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java b/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java
index 3cc1c5e..e4bbe99 100644
--- a/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java
+++ b/android/playground/app/src/main/java/com/alibaba/weex/IndexActivity.java
@@ -40,6 +40,7 @@ import android.widget.TextView;
import android.widget.Toast;
import com.alibaba.weex.commons.AbstractWeexActivity;
+import com.alibaba.weex.update.CheckForUpdateUtil;
import com.google.zxing.client.android.CaptureActivity;
import com.taobao.weex.WXRenderErrorCode;
import com.taobao.weex.WXSDKEngine;
@@ -103,6 +104,8 @@ public class IndexActivity extends AbstractWeexActivity {
};
LocalBroadcastManager.getInstance(this).registerReceiver(mReloadReceiver, new IntentFilter(WXSDKEngine.JS_FRAMEWORK_RELOAD));
+
+ CheckForUpdateUtil.checkForUpdate(this);
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1294abff/android/playground/app/src/main/java/com/alibaba/weex/update/CheckForUpdateUtil.java
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/java/com/alibaba/weex/update/CheckForUpdateUtil.java b/android/playground/app/src/main/java/com/alibaba/weex/update/CheckForUpdateUtil.java
new file mode 100644
index 0000000..219c132
--- /dev/null
+++ b/android/playground/app/src/main/java/com/alibaba/weex/update/CheckForUpdateUtil.java
@@ -0,0 +1,140 @@
+package com.alibaba.weex.update;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+
+import com.alibaba.weex.R;
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.adapter.IWXHttpAdapter;
+import com.taobao.weex.common.WXRequest;
+import com.taobao.weex.common.WXResponse;
+import com.taobao.weex.utils.WXLogUtils;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by moxun on 2018/3/9.
+ */
+
+public class CheckForUpdateUtil {
+ public static void checkForUpdate(final Context context) {
+ PackageManager pm = context.getPackageManager();
+ try {
+ PackageInfo info = pm.getPackageInfo(context.getPackageName(), 0);
+ if (info != null) {
+ int versionCode = info.versionCode;
+ String updateUrl = "http://dotwe.org/release/latest?v=" + versionCode;
+ WXRequest request = new WXRequest();
+ request.method = "GET";
+ request.url = updateUrl;
+ WXLogUtils.d("Update", "check for update: " + versionCode);
+ WXSDKManager.getInstance().getIWXHttpAdapter().sendRequest(request, new IWXHttpAdapter.OnHttpListener() {
+ @Override
+ public void onHttpStart() {
+
+ }
+
+ @Override
+ public void onHeadersReceived(int statusCode, Map<String, List<String>> headers) {
+
+ }
+
+ @Override
+ public void onHttpUploadProgress(int uploadProgress) {
+
+ }
+
+ @Override
+ public void onHttpResponseProgress(int loadedLength) {
+
+ }
+
+ @Override
+ public void onHttpFinish(final WXResponse response) {
+ if (!response.statusCode.equals("200")) {
+ WXLogUtils.e("Update", "failed: " + response.statusCode);
+ return;
+ }
+ WXSDKManager.getInstance().getWXRenderManager().postOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ String s = new String(response.originalData);
+ if (!TextUtils.isEmpty(s)) {
+ try {
+ WXLogUtils.d("Update", s);
+ JSONObject object = new JSONObject(s);
+ JSONObject params = object.optJSONObject("params");
+ if (params != null) {
+ boolean hasUpdate = params.optBoolean("hasUpdate", false);
+ if (hasUpdate) {
+ String version = params.optString("version", "latest");
+ String updateDate = params.optString("updateDate", "");
+ final String updateUrl = params.optString("updateUrl", "");
+ String updateDescription = params.optString("updateDescription", null);
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(context);
+
+ View view = LayoutInflater.from(context).inflate(R.layout.common_update_notify_dialog, null);
+ TextView textView = (TextView) view.findViewById(R.id.common_update_dialog_msg);
+ textView.setText(getMsg(version, updateDate, updateDescription));
+ builder.setCancelable(false)
+ .setView(view)
+ .setPositiveButton(R.string.update_now, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ UpdateService.startActionUpdate(context, updateUrl);
+ dialog.dismiss();
+ }
+ });
+
+ builder.setNegativeButton(R.string.update_remind_later, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+ }
+ });
+
+ builder.create().show();
+ }
+ }
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }, 0);
+ }
+ });
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private static String getMsg(String v, String date, String desc) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(getStringRes(R.string.update_version)).append(v).append("\n")
+ .append(getStringRes(R.string.update_date)).append(date).append("\n")
+ .append(getStringRes(R.string.update_desc)).append(desc);
+ return sb.toString();
+ }
+
+ public static String getStringRes(int id) {
+ if (WXEnvironment.getApplication() != null) {
+ return WXEnvironment.getApplication().getString(id);
+ }
+ return "";
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1294abff/android/playground/app/src/main/java/com/alibaba/weex/update/Downloader.java
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/java/com/alibaba/weex/update/Downloader.java b/android/playground/app/src/main/java/com/alibaba/weex/update/Downloader.java
new file mode 100644
index 0000000..8356652
--- /dev/null
+++ b/android/playground/app/src/main/java/com/alibaba/weex/update/Downloader.java
@@ -0,0 +1,112 @@
+package com.alibaba.weex.update;
+
+import com.squareup.okhttp.Callback;
+import com.squareup.okhttp.OkHttpClient;
+import com.squareup.okhttp.Request;
+import com.squareup.okhttp.Response;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.utils.WXLogUtils;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * Created by moxun on 2018/3/9.
+ */
+
+public class Downloader {
+
+ public static void download(String url, final DownloadCallback callback) {
+ OkHttpClient client = new OkHttpClient();
+ Request request = new Request.Builder()
+ .url(url)
+ .get()
+ .build();
+
+ client.newCall(request).enqueue(new Callback() {
+ @Override
+ public void onFailure(Request request, IOException e) {
+ callback.onError(e);
+ }
+
+ @Override
+ public void onResponse(Response response) throws IOException {
+ callback.handleResponse(response);
+ }
+ });
+ }
+
+ public abstract static class DownloadCallback {
+ private String destDirPath;
+ private String destFileName;
+
+ public abstract void onProgress(float progress);
+
+ public abstract void onResponse(File file);
+
+ public abstract void onError(Exception e);
+
+ public DownloadCallback(String destDirPath, String destFileName) {
+ this.destDirPath = destDirPath;
+ this.destFileName = destFileName;
+ }
+
+ private void handleResponse(Response response) throws IOException {
+ final File file = saveToFile(response);
+ if (file != null && file.exists() && file.length() > 0) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ onResponse(file);
+ }
+ });
+ } else {
+ onError(new RuntimeException("Failed to save file"));
+ }
+ }
+
+ private File saveToFile(Response response) throws IOException {
+ InputStream is = null;
+ byte[] buf = new byte[40960];
+ int len = 0;
+ FileOutputStream fos = null;
+ try {
+ is = response.body().byteStream();
+ final long total = response.body().contentLength();
+ long sum = 0;
+
+ WXLogUtils.e(total + "");
+
+ File dir = new File(destDirPath);
+ if (!dir.exists()) {
+ dir.mkdirs();
+ }
+ File file = new File(dir, destFileName);
+ fos = new FileOutputStream(file);
+ while ((len = is.read(buf)) != -1) {
+ sum += len;
+ fos.write(buf, 0, len);
+ final long finalSum = sum;
+
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ onProgress(finalSum * 1.0f / total);
+ }
+ });
+ }
+ fos.flush();
+ return file;
+ } finally {
+ if (is != null) is.close();
+ if (fos != null) fos.close();
+ }
+ }
+
+ private void runOnUiThread(Runnable task) {
+ WXSDKManager.getInstance().getWXRenderManager().postOnUiThread(task, 0);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1294abff/android/playground/app/src/main/java/com/alibaba/weex/update/UpdateService.java
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/java/com/alibaba/weex/update/UpdateService.java b/android/playground/app/src/main/java/com/alibaba/weex/update/UpdateService.java
new file mode 100644
index 0000000..390ee47
--- /dev/null
+++ b/android/playground/app/src/main/java/com/alibaba/weex/update/UpdateService.java
@@ -0,0 +1,108 @@
+package com.alibaba.weex.update;
+
+import android.app.IntentService;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.os.Build;
+import android.support.v4.content.FileProvider;
+import android.support.v7.app.NotificationCompat;
+import android.widget.Toast;
+
+import com.alibaba.weex.BuildConfig;
+import com.alibaba.weex.R;
+import com.taobao.weex.WXEnvironment;
+import com.taobao.weex.WXSDKManager;
+import com.taobao.weex.utils.WXLogUtils;
+
+import java.io.File;
+
+public class UpdateService extends IntentService {
+
+ private static final String ACTION_UPDATE = "com.taobao.weex.service.action.UPDATE";
+ private static final String EXTRA_URL = "com.taobao.weex.service.extra.URL";
+ private final int NOTIFY_ID = 10006024;
+
+ private NotificationManager manager;
+ private NotificationCompat.Builder builder;
+
+ public static void startActionUpdate(Context context, String url) {
+ Intent intent = new Intent(context, UpdateService.class);
+ intent.setAction(ACTION_UPDATE);
+ intent.putExtra(EXTRA_URL, url);
+ context.startService(intent);
+ }
+
+ public UpdateService() {
+ super("UpdateService");
+ }
+
+ @Override
+ protected void onHandleIntent(Intent intent) {
+ if (intent != null) {
+ final String action = intent.getAction();
+ if (ACTION_UPDATE.equals(action)) {
+ final String url = intent.getStringExtra(EXTRA_URL);
+ handleActionUpdate(url);
+ }
+ }
+ }
+
+ private void handleActionUpdate(String url) {
+ manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
+ builder = new NotificationCompat.Builder(this);
+ builder.setContentTitle(CheckForUpdateUtil.getStringRes(R.string.update_downloading))
+ .setContentText(CheckForUpdateUtil.getStringRes(R.string.update_progress) + " 0%")
+ .setTicker(CheckForUpdateUtil.getStringRes(R.string.update_downloading))
+ .setWhen(System.currentTimeMillis())
+ .setPriority(Notification.PRIORITY_DEFAULT)
+ .setSmallIcon(R.mipmap.ic_launcher)
+ .setProgress(100, 0, false);
+ manager.notify(NOTIFY_ID, builder.build());
+
+ WXLogUtils.e("Update", "start download");
+ Downloader.download(url, new Downloader.DownloadCallback(getCacheDir().getAbsolutePath(), "playground.apk") {
+
+ @Override
+ public void onProgress(float progress) {
+ if (progress * 100 - progress >= 1) {
+ int p = (int) (progress * 100);
+ builder.setContentText(CheckForUpdateUtil.getStringRes(R.string.update_progress) + p + "%");
+ builder.setProgress(100, p, false);
+ manager.notify(NOTIFY_ID, builder.build());
+ WXLogUtils.d("Update", "progress:" + p);
+ }
+ }
+
+ @Override
+ public void onResponse(File file) {
+ WXLogUtils.d("Update", "success: " + file.getAbsolutePath());
+ manager.cancel(NOTIFY_ID);
+ Uri uri = Uri.fromFile(file);
+ Intent installIntent = new Intent(Intent.ACTION_VIEW);
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ installIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+ Uri contentUri = FileProvider.getUriForFile(WXEnvironment.getApplication(), BuildConfig.APPLICATION_ID + ".fileprovider", file);
+ installIntent.setDataAndType(contentUri, "application/vnd.android.package-archive");
+ } else {
+ installIntent.setDataAndType(uri, "application/vnd.android.package-archive");
+ installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+ startActivity(installIntent);
+ }
+
+ @Override
+ public void onError(final Exception e) {
+ WXSDKManager.getInstance().getWXRenderManager().postOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(UpdateService.this, "Failed to update:" + e.getMessage(), Toast.LENGTH_SHORT).show();
+ }
+ }, 0);
+ }
+ });
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1294abff/android/playground/app/src/main/res/layout/common_update_notify_dialog.xml
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/res/layout/common_update_notify_dialog.xml b/android/playground/app/src/main/res/layout/common_update_notify_dialog.xml
new file mode 100644
index 0000000..8b2987b
--- /dev/null
+++ b/android/playground/app/src/main/res/layout/common_update_notify_dialog.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:padding="16dp">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:gravity="center"
+ android:text="@string/update_found_new_version"
+ android:textColor="#030303"
+ android:textSize="20sp" />
+
+ <TextView
+ android:id="@+id/common_update_dialog_msg"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="14dp"
+ android:textColor="#030303"
+ android:textSize="16sp" />
+
+</LinearLayout>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1294abff/android/playground/app/src/main/res/values-zh-rCN/strings.xml
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/res/values-zh-rCN/strings.xml b/android/playground/app/src/main/res/values-zh-rCN/strings.xml
index 162f15c..e912d80 100755
--- a/android/playground/app/src/main/res/values-zh-rCN/strings.xml
+++ b/android/playground/app/src/main/res/values-zh-rCN/strings.xml
@@ -142,5 +142,13 @@
<string name="wifi_changing_network">连接到 Wi-Fi \u2026</string>
<string name="cpu_not_support_tip">对不起,您当前的设备是X86架构.\n我们只支持ARM架构的设备!</string>
+ <string name="update_found_new_version">发现新版本</string>
+ <string name="update_downloading">正在下载更新</string>
+ <string name="update_progress">进度:</string>
+ <string name="update_now">立即更新</string>
+ <string name="update_remind_later">稍后提醒</string>
+ <string name="update_version">版本号:</string>
+ <string name="update_date">更新日期:</string>
+ <string name="update_desc">更新内容:</string>
</resources>
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1294abff/android/playground/app/src/main/res/values/strings.xml
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/res/values/strings.xml b/android/playground/app/src/main/res/values/strings.xml
index f352c18..f3160cb 100755
--- a/android/playground/app/src/main/res/values/strings.xml
+++ b/android/playground/app/src/main/res/values/strings.xml
@@ -40,4 +40,12 @@ under the License.
"WXMainActivity"
</string>
<string name="title_activity_dynamic">DynamicActivity</string>
+ <string name="update_found_new_version">New version is available</string>
+ <string name="update_downloading">Downloading updates</string>
+ <string name="update_progress">Progress: </string>
+ <string name="update_now">Update Now</string>
+ <string name="update_remind_later">Remind Later</string>
+ <string name="update_version">Version: </string>
+ <string name="update_date">Date: </string>
+ <string name="update_desc">Updates: </string>
</resources>
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/1294abff/android/playground/app/src/main/res/xml/filepaths.xml
----------------------------------------------------------------------
diff --git a/android/playground/app/src/main/res/xml/filepaths.xml b/android/playground/app/src/main/res/xml/filepaths.xml
new file mode 100644
index 0000000..8b373df
--- /dev/null
+++ b/android/playground/app/src/main/res/xml/filepaths.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<paths>
+ <cache-path
+ name="local_apk_cache"
+ path="."/>
+</paths>
\ No newline at end of file