summaryrefslogtreecommitdiff
authorTing Li <ting.li@amlogic.com>2016-12-16 08:02:57 (GMT)
committer Ting Li <ting.li@amlogic.com>2016-12-28 03:02:53 (GMT)
commit99598e07981ef108eed185acd1d72030469d6731 (patch)
treeec250c905248a9e2485df5fbe63ef8fb48e9f1e1
parentea1ff8c67a2f4453e14c66cd8046f8df528e4e51 (diff)
downloadOTAUpgrade2-99598e07981ef108eed185acd1d72030469d6731.zip
OTAUpgrade2-99598e07981ef108eed185acd1d72030469d6731.tar.gz
OTAUpgrade2-99598e07981ef108eed185acd1d72030469d6731.tar.bz2
pd#136759 update with update_engine when prop:ro.build.au_update is true
Change-Id: I757acf0cecb3aa309c1259efa19e8c13eade40f8
Diffstat
-rw-r--r--Android.mk3
-rw-r--r--AndroidManifest.xml6
-rw-r--r--res/drawable/progressbar_horizontal_1.xml48
-rw-r--r--res/layout/downloading_process.xml31
-rw-r--r--res/values-zh-rCN/strings.xml2
-rw-r--r--[-rwxr-xr-x]res/values/color.xml2
-rw-r--r--res/values/dimens.xml1
-rw-r--r--res/values/strings.xml1
-rw-r--r--[-rwxr-xr-x]res/values/styles.xml8
-rw-r--r--src/android/os/IUpdateEngineCallback.aidl22
-rw-r--r--src/com/droidlogic/otaupgrade/ABCheckUpService.java166
-rw-r--r--[-rwxr-xr-x]src/com/droidlogic/otaupgrade/BadMovedSDcard.java0
-rw-r--r--src/com/droidlogic/otaupgrade/LoaderReceiver.java6
-rw-r--r--src/com/droidlogic/otaupgrade/UpdateEngine.java160
-rw-r--r--src/com/droidlogic/otaupgrade/UpdateEngineCallback.java133
15 files changed, 583 insertions, 6 deletions
diff --git a/Android.mk b/Android.mk
index 17a96d5..b48c7a5 100644
--- a/Android.mk
+++ b/Android.mk
@@ -4,7 +4,8 @@ include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES := libota
LOCAL_SDK_VERSION := current
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES := $(call all-java-files-under, src)\
+ $(TOP)/src/android/os/IUpdateEngineCallback.aidl
LOCAL_PACKAGE_NAME := OTAUpgrade
LOCAL_CERTIFICATE := platform
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index e2d521c..b77d2ec 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -18,7 +18,9 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" />
-
+ <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
+ <uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
+ <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" />
<uses-sdk
android:minSdkVersion="23"
android:targetSdkVersion="23" />
@@ -76,7 +78,7 @@
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
-
+ <service android:name="com.droidlogic.otaupgrade.ABCheckUpService" ></service>
<service android:name="com.droidlogic.otaupgrade.UpdateService" >
<intent-filter>
<action android:name="com.android.update.action.check" />
diff --git a/res/drawable/progressbar_horizontal_1.xml b/res/drawable/progressbar_horizontal_1.xml
new file mode 100644
index 0000000..8ea06c8
--- a/dev/null
+++ b/res/drawable/progressbar_horizontal_1.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item android:id="@android:id/background">
+ <shape>
+ <corners android:radius="5dip" />
+ <gradient
+ android:startColor="#ff9d9e9d"
+ android:centerColor="#ff5a5d5a"
+ android:centerY="0.75"
+ android:endColor="#ff747674"
+ android:angle="270"
+ />
+ </shape>
+ </item>
+
+ <item android:id="@android:id/secondaryProgress">
+ <clip>
+ <shape>
+ <corners android:radius="5dip" />
+ <gradient
+ android:startColor="#80ffd300"
+ android:centerColor="#80ffb600"
+ android:centerY="0.75"
+ android:endColor="#a0ffcb00"
+ android:angle="270"
+ />
+ </shape>
+ </clip>
+ </item>
+
+ <item android:id="@android:id/progress">
+ <clip>
+ <shape>
+ <corners android:radius="5dip" />
+ <gradient
+ android:startColor="#ffffd300"
+ android:centerColor="#ffffb600"
+ android:centerY="0.75"
+ android:endColor="#ffffcb00"
+ android:angle="270"
+ />
+ </shape>
+ </clip>
+ </item>
+
+</layer-list> \ No newline at end of file
diff --git a/res/layout/downloading_process.xml b/res/layout/downloading_process.xml
new file mode 100644
index 0000000..9a2888a
--- a/dev/null
+++ b/res/layout/downloading_process.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:orientation="vertical"
+ android:layout_height="wrap_content" >
+
+ <TextView
+ android:id="@+id/textView1"
+ android:layout_gravity="left"
+ android:textSize="@dimen/text_size"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/update_download" />
+ <ProgressBar
+ android:id="@+id/progressBar1"
+ android:layout_margin="@dimen/padding_dialog"
+ android:paddingLeft="5dp"
+ android:paddingRight="5dp"
+ android:paddingTop="5dp"
+ style="@style/mProgress_horizontal"
+ android:max="100"
+ android:layout_width="@dimen/dialog_height"
+ android:layout_height="wrap_content" />
+
+ <TextView
+ android:id="@+id/download_percent"
+ android:paddingRight="16dp"
+ android:layout_gravity="right"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"/>
+</LinearLayout>
diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 0eba563..553b55f 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -102,7 +102,7 @@
<string name="backup_result">备份完成</string>
<string name="restore_result">备份已经恢复</string>
<string name="noti_msg">"下载成功"</string>
-
+ <string name="update_download">"升级包下载中"</string>
<string name="remove_hit">"保证外设连接正常,否则备份转存失败"</string>
<string name="prepare_waitting">"数据准备中,确认您的外设中有备份文件"</string>
</resources> \ No newline at end of file
diff --git a/res/values/color.xml b/res/values/color.xml
index 2c88e7a..12ee22b 100755..100644
--- a/res/values/color.xml
+++ b/res/values/color.xml
@@ -9,7 +9,7 @@
<color name="lightyellow" >#FFFFE0</color>
<color name="yellow" >#FFFF00</color>
-
+ <color name="black">#00000000</color>
<color name="snow" >#FFFAFA</color>
</resources> \ No newline at end of file
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index e5361d5..94c9ed8 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -23,4 +23,5 @@
<dimen name="padding_dialog">18dp</dimen>
<dimen name="dialog_size">520dp</dimen>
<dimen name="dialog_height">200dp</dimen>
+
</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 152cda2..c315fe7 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -102,5 +102,6 @@
<string name="restore_result">restore finish</string>
<string name="remove_hit">backup will save to external storage if exists or backup save fail</string>
<string name="noti_msg">Download success</string>
+ <string name="update_download">Update Downloading</string>
<string name="prepare_waitting">"prepare,make sure BACKUP file in your external storage"</string>
</resources> \ No newline at end of file
diff --git a/res/values/styles.xml b/res/values/styles.xml
index 99a644d..5049704 100755..100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -19,7 +19,13 @@
<item name="android:windowIsFloating">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
-
+ <style name="mProgress_horizontal">
+ <item name="android:indeterminateOnly">false</item>
+ <item name="android:progressDrawable">@drawable/progressbar_horizontal_1</item><!-- progress_horizontal -->
+ <item name="android:indeterminateDrawable">@android:drawable/progress_indeterminate_horizontal</item>
+ <item name="android:minHeight">20dip</item>
+ <item name="android:maxHeight">20dip</item>
+ </style>
<style name="Theme_dialog" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item>
diff --git a/src/android/os/IUpdateEngineCallback.aidl b/src/android/os/IUpdateEngineCallback.aidl
new file mode 100644
index 0000000..729abdd
--- a/dev/null
+++ b/src/android/os/IUpdateEngineCallback.aidl
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed 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 android.os;
+
+oneway interface IUpdateEngineCallback {
+ void onStatusUpdate(int status_code, float percentage);
+ void onPayloadApplicationComplete(int error_code);
+}
diff --git a/src/com/droidlogic/otaupgrade/ABCheckUpService.java b/src/com/droidlogic/otaupgrade/ABCheckUpService.java
new file mode 100644
index 0000000..202a440
--- a/dev/null
+++ b/src/com/droidlogic/otaupgrade/ABCheckUpService.java
@@ -0,0 +1,166 @@
+package com.droidlogic.otaupgrade;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+
+import com.amlogic.update.util.UpgradeInfo;
+import com.amlogic.update.util.PrefUtil;
+import android.app.Service;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IBinder;
+import android.util.Log;
+
+public class ABCheckUpService extends Service {
+ private static String TAG = "ABCheckUpService";
+ private HandlerThread mRCThread;
+ private Handler mRCHandler;
+ private static final String AB_UPDATE="ro.build.ab_update";
+ private static final String URL_UPDATE="ro.product.otaupdateurl";
+ public static final String REASON = "reason";
+ public static final String REASON_UPDATE = "update";
+ public static final String REASON_COMPLETE = "complete";
+ private boolean download = false;
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+ mRCThread = new HandlerThread("update");
+ mRCThread.start();
+ mRCHandler = new Handler(mRCThread.getLooper());
+
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+ public String createParams(){
+ PrefUtil pref=new PrefUtil(ABCheckUpService.this);
+ String params = "updating_apk_version="+UpgradeInfo.updating_apk_version;
+ params+="&board="+UpgradeInfo.board;
+ params+="&device="+UpgradeInfo.device;
+ params+="&firmware="+UpgradeInfo.firmware;
+ params+="&id="+pref.getID();
+ params+="&android="+UpgradeInfo.android;
+ params+="&abupdate="+UpgradeInfo.getString(AB_UPDATE);
+ return params;
+ }
+ public String sendPost(String url,String params){
+ PrintWriter out = null;
+ BufferedReader in = null;
+ String result="";
+ try {
+ URL readUrl = new URL(url);
+ URLConnection conn=readUrl.openConnection();
+ conn.setRequestProperty("accept", "*/*");
+ conn.setDoOutput(true);
+ conn.setDoInput(true);
+ out = new PrintWriter(conn.getOutputStream());
+ out.print(params);
+ out.flush();
+ in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
+ String line;
+ while ( ( line=in.readLine() ) != null ) {
+ result+=line;
+ }
+ } catch (MalformedURLException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException ex) {
+ // TODO Auto-generated catch block
+ ex.printStackTrace();
+ }
+ finally{
+ try{
+ if ( out != null ) {
+ out.close();
+ }
+ if ( in != null ) {
+ in.close();
+ }
+ }catch(IOException exp){
+ exp.printStackTrace();
+ }
+ return result;
+ }
+ }
+ private void disableOTA(boolean disable) {
+ PackageManager pmg=ABCheckUpService.this.getPackageManager();
+ ComponentName component=new ComponentName(ABCheckUpService.this,MainActivity.class);
+ int res = pmg.getComponentEnabledSetting(component);
+ if ( disable ) {
+ pmg.setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+ PackageManager.DONT_KILL_APP);
+ }else{
+ pmg.setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
+ PackageManager.DONT_KILL_APP);
+ }
+ }
+ private Runnable update=new Runnable(){
+
+ @Override
+ public void run() {
+ String ab_update = UpgradeInfo.getString(AB_UPDATE);
+ if ( ab_update.equalsIgnoreCase("true") ) {
+ download = true;
+ String url=UpgradeInfo.getString(URL_UPDATE);
+ String params = createParams();
+ Log.d(TAG, "url:"+url+" params="+params);
+ String httpResult = sendPost(url,params);
+ Log.d(TAG, "value:"+httpResult);
+ String[] urlparams=httpResult.split(";");
+ if ( urlparams.length != 2 ) {
+ return;
+ }
+ String[] headers=urlparams[1].split("&");
+ UpdateEngine engine = new UpdateEngine(ABCheckUpService.this);
+ UpdateEngineCallback callback = new UpdateEngineCallback(ABCheckUpService.this);
+ engine.bind(callback.asBinder());
+ Log.d(TAG, "url:"+urlparams[0]+" params="+headers.length);
+ engine.cancel();
+ engine.applyPayload(urlparams[0],0L,0L,headers);
+ }
+ }
+ };
+
+ @Override
+ public void onDestroy() {
+ Log.d(TAG,"onDestroy..............");
+ if ( mRCThread != null ) {
+ mRCThread.quitSafely();
+ mRCThread = null;
+ }
+ }
+
+
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ UpgradeInfo info =new UpgradeInfo(ABCheckUpService.this);
+ String reason = intent.getStringExtra(REASON);
+ Log.d(TAG,"onStartCommand.............."+reason);
+ if ( reason != null && reason.equals(REASON_COMPLETE) ) {
+ String ab_update = UpgradeInfo.getString(AB_UPDATE);
+ if ( ab_update.equalsIgnoreCase("true") ) {
+ disableOTA(true);
+ } else {
+ disableOTA(false);
+ }
+ } else {
+ mRCHandler.post(update);
+ }
+ return super.onStartCommand(intent, flags, startId);
+ }
+
+} \ No newline at end of file
diff --git a/src/com/droidlogic/otaupgrade/BadMovedSDcard.java b/src/com/droidlogic/otaupgrade/BadMovedSDcard.java
index e7a5bd3..e7a5bd3 100755..100644
--- a/src/com/droidlogic/otaupgrade/BadMovedSDcard.java
+++ b/src/com/droidlogic/otaupgrade/BadMovedSDcard.java
diff --git a/src/com/droidlogic/otaupgrade/LoaderReceiver.java b/src/com/droidlogic/otaupgrade/LoaderReceiver.java
index a5b6e0b..1f58473 100644
--- a/src/com/droidlogic/otaupgrade/LoaderReceiver.java
+++ b/src/com/droidlogic/otaupgrade/LoaderReceiver.java
@@ -64,6 +64,9 @@ public class LoaderReceiver extends BroadcastReceiver {
getBackUpFileName();
if ( intent.getAction().equals ( Intent.ACTION_BOOT_COMPLETED ) ||
intent.getAction().equals ( RESTOREDATA ) ) {
+ Intent abcheck = new Intent(mContext, ABCheckUpService.class);
+ abcheck.putExtra(ABCheckUpService.REASON,ABCheckUpService.REASON_COMPLETE);
+ mContext.startService (abcheck);
if (intent.getAction().equals ( Intent.ACTION_BOOT_COMPLETED )) {
mPref.clearData();
}
@@ -101,6 +104,9 @@ public class LoaderReceiver extends BroadcastReceiver {
mContext.startService ( new Intent (
UpdateService.ACTION_AUTOCHECK ) );
}
+ Intent abupdate = new Intent(mContext, ABCheckUpService.class);
+ abupdate.putExtra(ABCheckUpService.REASON,ABCheckUpService.REASON_UPDATE);
+ mContext.startService (abupdate);
}
}
}
diff --git a/src/com/droidlogic/otaupgrade/UpdateEngine.java b/src/com/droidlogic/otaupgrade/UpdateEngine.java
new file mode 100644
index 0000000..fe5486f
--- a/dev/null
+++ b/src/com/droidlogic/otaupgrade/UpdateEngine.java
@@ -0,0 +1,160 @@
+package com.droidlogic.otaupgrade;
+
+
+import android.content.Context;
+import android.os.IBinder;
+import android.os.Parcel;
+import android.os.RemoteException;
+import android.util.Log;
+
+public class UpdateEngine {
+ private static final String TAG = "UpdateEngine";
+ int TRANSACTION_PAYLOAD = IBinder.FIRST_CALL_TRANSACTION;
+ int TRANSACTION_BIND = IBinder.FIRST_CALL_TRANSACTION + 1;
+ int TRANSACTION_SUSPEND = IBinder.FIRST_CALL_TRANSACTION + 2;
+ int TRANSACTION_RESUME = IBinder.FIRST_CALL_TRANSACTION + 3;
+ int TRANSACTION_CANCEL = IBinder.FIRST_CALL_TRANSACTION + 4;
+ int TRANSACTION_RESET_STATUS = IBinder.FIRST_CALL_TRANSACTION + 5;
+ private static final String UPDATE_TOKEN = "android.os.IUpdateEngine";
+ public static final int REMOTE_EXCEPTION = -0xffff;
+ private Context mContxt;
+ private IBinder mIBinder = null;
+
+ public UpdateEngine(Context cxt){
+ mContxt=cxt;
+ try {
+ Object object = Class.forName("android.os.ServiceManager")
+ .getMethod("getService", new Class[] { String.class })
+ .invoke(null, new Object[] { "android.os.UpdateEngineService" });
+ mIBinder = (IBinder)object;
+ }
+ catch (Exception ex) {
+ ex.printStackTrace();
+ Log.e(TAG, "image player init fail:" + ex);
+ }
+ }
+ public int applyPayload(String url, long payload_offset, long payload_size, String[] headerKeyValuePairs){
+ if ( null != mIBinder ) {
+ try {
+ Parcel data=Parcel.obtain();
+ Parcel reply=Parcel.obtain();
+ data.writeInterfaceToken(UPDATE_TOKEN);
+ data.writeString(url);
+ data.writeLong(payload_offset);
+ data.writeLong(payload_size);
+ data.writeStringArray(headerKeyValuePairs);
+ mIBinder.transact(TRANSACTION_PAYLOAD,
+ data, reply, 0);
+ int result = reply.readInt();
+ reply.recycle();
+ data.recycle();
+ return result;
+ } catch (RemoteException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+ return REMOTE_EXCEPTION;
+ }
+ int bind(IBinder callback){
+ if ( null != mIBinder ) {
+ try {
+ Parcel data=Parcel.obtain();
+ Parcel reply=Parcel.obtain();
+ data.writeInterfaceToken(UPDATE_TOKEN);
+ data.writeStrongBinder(callback);
+ mIBinder.transact(TRANSACTION_BIND,
+ data, reply, 0);
+ int result = reply.readInt();
+ reply.recycle();
+ data.recycle();
+ return result;
+ } catch (RemoteException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+ return REMOTE_EXCEPTION;
+ }
+ public int suspend(){
+ if ( null != mIBinder ) {
+ try {
+ Parcel data=Parcel.obtain();
+ Parcel reply=Parcel.obtain();
+ data.writeInterfaceToken(UPDATE_TOKEN);
+ mIBinder.transact(TRANSACTION_SUSPEND,
+ data, reply, 0);
+ int result = reply.readInt();
+ reply.recycle();
+ data.recycle();
+ return result;
+ } catch (RemoteException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+ return REMOTE_EXCEPTION;
+ }
+ public int resume(){
+ if ( null != mIBinder ) {
+ try {
+ Parcel data=Parcel.obtain();
+ Parcel reply=Parcel.obtain();
+ data.writeInterfaceToken(UPDATE_TOKEN);
+ mIBinder.transact(TRANSACTION_RESUME,
+ data, reply, 0);
+ int result = reply.readInt();
+ reply.recycle();
+ data.recycle();
+ return result;
+ } catch (RemoteException e) {
+ e.printStackTrace();
+ }
+
+ }
+ return REMOTE_EXCEPTION;
+ }
+ public int cancel(){
+ if ( null != mIBinder ) {
+ try {
+ Parcel data=Parcel.obtain();
+ Parcel reply=Parcel.obtain();
+ data.writeInterfaceToken(UPDATE_TOKEN);
+ mIBinder.transact(TRANSACTION_CANCEL,
+ data, reply, 0);
+ int result = reply.readInt();
+ reply.recycle();
+ data.recycle();
+ return result;
+ } catch (RemoteException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+ return REMOTE_EXCEPTION;
+ }
+ public int resetStatus(){
+ if ( null != mIBinder ) {
+ try {
+ Parcel data=Parcel.obtain();
+ Parcel reply=Parcel.obtain();
+ data.writeInterfaceToken(UPDATE_TOKEN);
+ mIBinder.transact(TRANSACTION_RESET_STATUS,
+ data, reply, 0);
+ int result = reply.readInt();
+ reply.recycle();
+ data.recycle();
+ return result;
+ } catch (RemoteException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ }
+ return REMOTE_EXCEPTION;
+ }
+} \ No newline at end of file
diff --git a/src/com/droidlogic/otaupgrade/UpdateEngineCallback.java b/src/com/droidlogic/otaupgrade/UpdateEngineCallback.java
new file mode 100644
index 0000000..c0721f3
--- a/dev/null
+++ b/src/com/droidlogic/otaupgrade/UpdateEngineCallback.java
@@ -0,0 +1,133 @@
+package com.droidlogic.otaupgrade;
+
+import android.os.IUpdateEngineCallback;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+import android.graphics.PixelFormat;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
+import android.view.WindowManager;
+import android.view.Gravity;
+import android.view.Display;
+import android.widget.ProgressBar;
+import android.widget.TextView;
+import android.os.Handler;
+import android.os.Message;
+import android.util.DisplayMetrics;
+import android.content.BroadcastReceiver;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.net.NetworkInfo;
+public class UpdateEngineCallback extends IUpdateEngineCallback.Stub{
+ private static int STATUS_IDLE = 0;
+ private static int UPDATE_AVAILABLE = 2;
+ private static int DOWNLOADING = 3;
+ private static int FINALIZING = 5;
+ private static int UPDATED_NEED_REBOOT = 6;
+ private static final String TAG = "UpdateEngineCallback";
+ private static final int MSG_SHOWPROGRESS =0;
+ private static final int MSG_HIDEPROGRESS =1;
+ private static final int MSG_UPDATEPROCESS=2;
+ private Context mContext;
+ private ViewGroup rootView;
+ private WindowManager mWindowManager;
+ private boolean isShowing=false;
+ private ProgressBar mBar;
+ private Handler mHandler;
+ private TextView mText;
+ public UpdateEngineCallback(Context context) {
+ mContext = context;
+ mHandler = new Handler(mContext.getMainLooper()){
+ public void dispatchMessage(Message msg) {
+ switch ( msg.what ) {
+ case MSG_SHOWPROGRESS:
+ showProgress();
+ break;
+ case MSG_HIDEPROGRESS:
+ hideProgress();
+ break;
+ case MSG_UPDATEPROCESS:
+ mBar.setProgress(msg.arg1);
+ if (mText != null) {
+ mText.setText(msg.arg1+"%");
+ }
+ break;
+ }
+ }
+ };
+ }
+ @Override
+ public void onStatusUpdate(int status_code, float percentage){
+ if ( status_code >= UPDATE_AVAILABLE && !isShowing) {
+ mHandler.sendEmptyMessage(MSG_SHOWPROGRESS);
+ registNetWork();
+ }
+ if ( status_code == DOWNLOADING && mBar != null ) {
+ Message msg = mHandler.obtainMessage(MSG_UPDATEPROCESS);
+ msg.arg1 = (int) (percentage*100);
+ mHandler.sendMessage(msg);
+ }else if ( status_code > DOWNLOADING && isShowing ) {
+ mHandler.sendEmptyMessage(MSG_HIDEPROGRESS);
+ }
+ }
+ @Override
+ public void onPayloadApplicationComplete(int error_code){
+ Log.d(TAG,"onPayloadApplicationComplete"+error_code);
+ mHandler.sendEmptyMessage(MSG_HIDEPROGRESS);
+ mContext.unregisterReceiver(mNetWorkListener);
+ }
+ private void showProgress() {
+ isShowing = true;
+ Log.d(TAG,"showProgress");
+ LayoutInflater mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ rootView = (ViewGroup) mInflater.inflate(R.layout.downloading_process, null);
+ rootView.setBackgroundColor(R.color.black);
+ mBar = (ProgressBar)rootView.findViewById(R.id.progressBar1);
+ mText = (TextView)rootView.findViewById(R.id.download_percent);
+ mWindowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
+ WindowManager.LayoutParams mWmParams = new WindowManager.LayoutParams();
+ mWmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
+ Display display = mWindowManager.getDefaultDisplay();
+ DisplayMetrics displayinfo = new DisplayMetrics();
+ display.getMetrics(displayinfo);
+
+ mWmParams.y=displayinfo.heightPixels-rootView.getMeasuredHeight();
+ mWmParams.x=displayinfo.widthPixels-rootView.getMeasuredWidth();
+ mWmParams.width = LayoutParams.WRAP_CONTENT;
+ mWmParams.height = LayoutParams.WRAP_CONTENT;
+ mWmParams.format = PixelFormat.RGBA_8888;
+ mWmParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+ | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN |WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
+ | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
+ mWmParams.gravity = Gravity.CENTER;
+ mWindowManager.addView(rootView, mWmParams);
+ }
+ private void registNetWork() {
+ IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
+ mContext.registerReceiver(mNetWorkListener, intentFilter);
+ }
+ private BroadcastReceiver mNetWorkListener = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ Log.d(TAG,"disconnect.............."+intent.getAction());
+ ConnectivityManager cMgr = ( ConnectivityManager ) mContext.getSystemService ( Context.CONNECTIVITY_SERVICE );
+ NetworkInfo netInfo = ( NetworkInfo ) intent.getExtras ().getParcelable(ConnectivityManager.EXTRA_NETWORK_INFO);
+ if (netInfo != null) {
+ if (netInfo.getState() == NetworkInfo.State.DISCONNECTED ) {
+ mHandler.sendEmptyMessage(MSG_HIDEPROGRESS);
+ }
+
+ }
+ }
+ };
+ private void hideProgress() {
+ isShowing = false;
+ Log.d(TAG,"hideprogress");
+ mWindowManager.removeView(rootView);
+ }
+
+} \ No newline at end of file