blob: 62e0c9a9feb793d74674cb54f823cb894f9e5627 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.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.v4.app.NotificationCompat;
import android.widget.Toast;
import com.taobao.weex.WXEnvironment;
import com.taobao.weex.WXSDKManager;
import com.taobao.weex.utils.WXLogUtils;
import java.io.File;
import org.apache.weex.R;
import org.apache.weex.BuildConfig;
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);
}
});
}
}