author | Ting 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) |
commit | 99598e07981ef108eed185acd1d72030469d6731 (patch) | |
tree | ec250c905248a9e2485df5fbe63ef8fb48e9f1e1 | |
parent | ea1ff8c67a2f4453e14c66cd8046f8df528e4e51 (diff) | |
download | OTAUpgrade2-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
-rw-r--r-- | Android.mk | 3 | ||||
-rw-r--r-- | AndroidManifest.xml | 6 | ||||
-rw-r--r-- | res/drawable/progressbar_horizontal_1.xml | 48 | ||||
-rw-r--r-- | res/layout/downloading_process.xml | 31 | ||||
-rw-r--r-- | res/values-zh-rCN/strings.xml | 2 | ||||
-rw-r--r--[-rwxr-xr-x] | res/values/color.xml | 2 | ||||
-rw-r--r-- | res/values/dimens.xml | 1 | ||||
-rw-r--r-- | res/values/strings.xml | 1 | ||||
-rw-r--r--[-rwxr-xr-x] | res/values/styles.xml | 8 | ||||
-rw-r--r-- | src/android/os/IUpdateEngineCallback.aidl | 22 | ||||
-rw-r--r-- | src/com/droidlogic/otaupgrade/ABCheckUpService.java | 166 | ||||
-rw-r--r--[-rwxr-xr-x] | src/com/droidlogic/otaupgrade/BadMovedSDcard.java | 0 | ||||
-rw-r--r-- | src/com/droidlogic/otaupgrade/LoaderReceiver.java | 6 | ||||
-rw-r--r-- | src/com/droidlogic/otaupgrade/UpdateEngine.java | 160 | ||||
-rw-r--r-- | src/com/droidlogic/otaupgrade/UpdateEngineCallback.java | 133 |
15 files changed, 583 insertions, 6 deletions
@@ -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 |