package com.rockchip.alexa.jacky.activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.preference.Preference; import android.preference.PreferenceCategory; import android.preference.PreferenceScreen; import android.util.Log; import android.widget.EditText; import android.widget.Toast; import com.coolerfall.download.DownloadCallback; import com.rockchip.alexa.jacky.R; import com.rockchip.alexa.jacky.app.BaseApplication; import com.rockchip.alexa.jacky.app.Context; import com.rockchip.alexa.jacky.utils.Env; import com.rockchip.alexa.jacky.utils.FileUtil; import com.rockchip.alexa.jacky.utils.HttpClientUtil; import com.rockchip.alexa.jacky.utils.HttpDownloader; import com.rockchip.alexa.jacky.utils.NetUtils; import com.rockchip.alexa.jacky.utils.SharedPreference; import com.rockchip.alexa.jacky.utils.UpdateManager; import com.rockchip.alexa.jacky.utils.updater_client; import com.rockchip.alexa.jacky.views.CustomDialog; import com.rockchip.alexa.jacky.views.WakeLockProgressDialog; import java.io.IOException; import java.io.InputStream; /** * Created by cjs on 2017/5/8. */ public class DeviceUpdateActivity extends BasePreferenceActivity { private static final String TAG = "RK_Alexa"; private static boolean firstComeIn = true; public static final int MESSAGE_UPDATE_PREFERENCE = 2; public static final int MESSAGE_REQUEST_FAILED = 3; public static final int MESSAGE_DEVICE_DATA_PREPARED = 7; // device update success and failed public static final int MESSAGE_DEVICE_UPDATE_SUCCESS = 8; public static final int MESSAGE_DEVICE_UPDATE_FAILED = 9; public static final int MESSAGE_DEVICE_REBOOTING = 10; public static final int MESSAGE_DEVICE_UPDATING = 11; public static final int MESSAGE_DEVICE_VERSION_LATEST = 12; private static UpdateManager mUpdateManager; /** * httpDownload tool used for download firmware. */ private HttpDownloader mDownloader; /* * progress dialog is for firmware download progress */ private WakeLockProgressDialog mLoadingDialog; private WakeLockProgressDialog mProgressDialog; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case MESSAGE_UPDATE_PREFERENCE: mLoadingDialog.dismiss(); refreshPreference(mUpdateManager.isUpdatable()); break; case MESSAGE_REQUEST_FAILED: if(!NetUtils.isOpenNetwork(mContext)){ showToastOnUiThread(getString(R.string.request_error_for_network),Toast.LENGTH_SHORT); }else{ showToastOnUiThread(getString(R.string.request_error_for_server),Toast.LENGTH_SHORT); } mLoadingDialog.dismiss(); break; case MESSAGE_DEVICE_DATA_PREPARED: mLoadingDialog.dismiss(); /* new firmware so produce a new update id */ mUpdateManager.resetUpdateId(); sendDeviceData(); break; case MESSAGE_DEVICE_UPDATE_SUCCESS: showToastOnUiThread(getString(R.string.device_update_success),Toast.LENGTH_SHORT); mLoadingDialog.dismiss(); // saved sharePreference value SharedPreference.putString(mContext,UpdateManager.KEY_DEVICE_VERSION_STR,UpdateManager.getUpdateVersionStr()); SharedPreference.putInt(mContext,UpdateManager.KEY_DOWNLOAD_STATE,UpdateManager.DOWNLOAD_STATE_NONE); refreshPreference(mUpdateManager.isUpdatable()); break; case MESSAGE_DEVICE_UPDATE_FAILED: showToastOnUiThread(getString(R.string.device_update_failed),Toast.LENGTH_SHORT); mLoadingDialog.dismiss(); break; case MESSAGE_DEVICE_REBOOTING: onDeviceRebooting(); break; case MESSAGE_DEVICE_UPDATING: onDeviceUpdating(); break; case MESSAGE_DEVICE_VERSION_LATEST: onDeviceVersionLatest(); break; } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "DeviceUpdateActivity onCreate."); addPreferencesFromResource(R.xml.pref_screen_device_update); initData(); initUi(); } private void initData(){ BaseApplication.getApplication().setUpdateHandler(mHandler); if(mUpdateManager == null){ mUpdateManager = new UpdateManager(this); } mDownloader = new HttpDownloader(this); } private void initUi(){ mLoadingDialog = new WakeLockProgressDialog(this); mLoadingDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); mLoadingDialog.setIndeterminate(false); mLoadingDialog.setCancelable(false); mProgressDialog = new WakeLockProgressDialog(this); mProgressDialog.setMessage(getString(R.string.firmware_downloading)); mProgressDialog.setCancelable(false); mProgressDialog.setProgressNumberFormat("%1d MB/%2d MB"); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setButton(DialogInterface.BUTTON_POSITIVE,getString(R.string.firmware_download_backstage), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { mProgressDialog.dismiss(); } }); mProgressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.firmware_download_cancel), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { SharedPreference.putInt(mContext,UpdateManager.KEY_DOWNLOAD_STATE,UpdateManager.DOWNLOAD_STATE_NONE); mDownloader.cancelTask(); } }); if(firstComeIn){ refreshPreference(false); onCheckVersionClick(); }else{ refreshPreference(mUpdateManager.isUpdatable()); } } /** * refresh preference state by the param below * 1.whether is updatable 2.the firmware download State * @param isUpdatable */ private void refreshPreference(boolean isUpdatable){ PreferenceCategory netUpdateCategory = (PreferenceCategory)getPreferenceScreen().findPreference(getString(R.string.pref_category_net_update)); if(prefDownload == null){ prefCheckVersion = netUpdateCategory.findPreference(getString(R.string.pref_update_item_check_version)); prefDownload = netUpdateCategory.findPreference(getString(R.string.pref_update_item_download_update)); } if(isUpdatable){ netUpdateCategory.addPreference(prefDownload); prefCheckVersion.setSummary(R.string.message_new_version_on); int downloadState = SharedPreference.getInt(this,UpdateManager.KEY_DOWNLOAD_STATE,UpdateManager.DOWNLOAD_STATE_NONE); Log.d(TAG, "refreshPreference: downloadState: " + downloadState); if(downloadState == UpdateManager.DOWNLOAD_STATE_DOWNLOADED || downloadState == UpdateManager.DOWNLOAD_STATE_DATA_PREPARED){ prefDownload.setSummary(getString(R.string.message_new_version_has_downloaded)); }else{ prefDownload.setSummary(""); } }else{ netUpdateCategory.removePreference(prefDownload); prefCheckVersion.setSummary(""); } } @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference){ if(preference.getKey().equals(getString(R.string.pref_update_item_check_version))){ onCheckVersionClick(); return true; }else if(preference.getKey().equals(getString(R.string.pref_update_item_download_update))){ int downloadState = SharedPreference.getInt(mContext,UpdateManager.KEY_DOWNLOAD_STATE,UpdateManager.DOWNLOAD_STATE_NONE); switch (downloadState){ case UpdateManager.DOWNLOAD_STATE_DOWNLOADING: mProgressDialog.show(); break; case UpdateManager.DOWNLOAD_STATE_DOWNLOADED: prepareDeviceData(); break; case UpdateManager.DOWNLOAD_STATE_DATA_PREPARED: sendDeviceData(); break; case UpdateManager.DOWNLOAD_STATE_NONE: /*=====================================================*/ if(mUpdateManager.isFirmwareReady()){ Log.d("System.out", "onPreferenceTreeClick: FirmwareReady and reset updateId"); mUpdateManager.resetUpdateId(); SharedPreference.putInt(mContext,UpdateManager.KEY_DOWNLOAD_STATE,UpdateManager.DOWNLOAD_STATE_DOWNLOADED); refreshPreference(mUpdateManager.isUpdatable()); // prepareDeviceData(); return true; } /*=====================================================*/ CustomDialog.Builder builder = new CustomDialog.Builder(DeviceUpdateActivity.this); builder.setMessage(mUpdateManager.getServerVersionUpdateInfo()); builder.setTitle(getString(R.string.str_version_upgrade_info)); builder.setPositiveButton(getResources().getString(R.string.dialog_button_confirm), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // RxPermissions.getInstance(DeviceUpdateActivity.this) // .request(Manifest.permission.WRITE_EXTERNAL_STORAGE); mUpdateManager.initPathFileBeforeDownload(); mDownloader.startDownload(Context.HTTP_IP_ADDRESS + Context.HTTP_REQUEST_FIRMWARE ,UpdateManager.FIRMWARE_PATH,UpdateManager.FIRMWARE_NAME,new DownloadListener()); dialog.dismiss(); mLoadingDialog.setMessage(getString(R.string.connecting_to_server)); mLoadingDialog.show(); } }); builder.setNegativeButton(getResources().getString(R.string.dialog_button_cancel), new android.content.DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); break; } return true; }else if(preference.getKey().equals(getString(R.string.pref_update_item_set_ip))){ final EditText inputServer = new EditText(this); inputServer.setText("http://"); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(getString(R.string.server_ip_set)).setIcon(android.R.drawable.ic_dialog_info).setView(inputServer) .setNegativeButton(getString(R.string.dialog_button_cancel), null); builder.setPositiveButton(getString(R.string.dialog_button_confirm), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Context.HTTP_IP_ADDRESS = inputServer.getText().toString(); Toast.makeText(DeviceUpdateActivity.this,getString(R.string.server_ip_set_success) + Context.HTTP_IP_ADDRESS,Toast.LENGTH_SHORT).show(); } }); builder.show(); return true; } return false; } public void onCheckVersionClick(){ mLoadingDialog.setMessage(getString(R.string.message_get_new_version_ing)); mLoadingDialog.show(); HttpClientUtil.requestGet(Context.HTTP_IP_ADDRESS + Context.HTTP_REQUEST_NEW_VERSION , new HttpClientUtil.RequestStateListener() { @Override public void onRequestResultReceived(InputStream is) { String serverVersionInfo = HttpClientUtil.streamToString(is); mUpdateManager.handlerServerString(serverVersionInfo); mUpdateManager.reInitDownloadStateByCurrent(); if(!firstComeIn) { showToastOnUiThread(mUpdateManager.isUpdatable() ? getString(R.string.message_new_version_on2) : getString(R.string.message_newest_version_on), Toast.LENGTH_SHORT); } firstComeIn = false; mHandler.sendEmptyMessage(MESSAGE_UPDATE_PREFERENCE); } @Override public void onRequestFail(String failString) { Log.d(TAG, "Request failed with failString: "+ failString); mHandler.sendEmptyMessage(MESSAGE_REQUEST_FAILED); } }); } /** * prepare the data that send to device * when firmware version download complete */ private void prepareDeviceData(){ mLoadingDialog.setMessage(getString(R.string.firmware_data_handle_ing)); mLoadingDialog.show(); new Thread(new Runnable() { @Override public void run() { if(mUpdateManager.isFirmwareReady()) { try { FileUtil.unZipFile(UpdateManager.FIRMWARE_PATH + UpdateManager.FIRMWARE_NAME, UpdateManager.UNZIP_FIRMWARE_PATH); } catch (IOException e) { e.printStackTrace(); } SharedPreference.putInt(mContext,UpdateManager.KEY_DOWNLOAD_STATE,UpdateManager.DOWNLOAD_STATE_DATA_PREPARED); mHandler.sendEmptyMessage(MESSAGE_DEVICE_DATA_PREPARED); }else{ showToastOnUiThread(getString(R.string.firmware_data_error),Toast.LENGTH_SHORT); SharedPreference.putInt(mContext,UpdateManager.KEY_DOWNLOAD_STATE,UpdateManager.DOWNLOAD_STATE_NONE); mHandler.sendEmptyMessage(MESSAGE_UPDATE_PREFERENCE); } } }).start(); } /** * tcp connect with device and send needed image to device for update * it used jni for detail realize */ private void sendDeviceData(){ if(!UpdateManager.isImgDataReady()){ showToastOnUiThread(getString(R.string.firmware_data_error),Toast.LENGTH_SHORT); SharedPreference.putInt(mContext,UpdateManager.KEY_DOWNLOAD_STATE,UpdateManager.DOWNLOAD_STATE_DOWNLOADED); refreshPreference(mUpdateManager.isUpdatable()); return; } updater_client.setImageDirectory(UpdateManager.UNZIP_FIRMWARE_PATH); Log.d(TAG, "sendDeviceData: isHost_PREFIX " + Env.getConnectingSSID(mContext).startsWith(Context.HOTSPOT_PREFIX)); Log.d(TAG, "sendDeviceData: isConnected " + Env.isWifiConnected(mContext)); Log.d(TAG, "sendDeviceData: isWifiEnable " + Env.isWifiEnable(mContext)); if (Env.isWifiEnable(mContext) && Env.isWifiConnected(mContext) && Env.getConnectingSSID(mContext).startsWith(Context.HOTSPOT_PREFIX)){ doUpdate(); return; } CustomDialog.Builder builder = new CustomDialog.Builder(mContext); builder.setMessage(getString(R.string.firmware_device_data_send_warn)); builder.setTitle(getString(R.string.dialog_warm)); builder.setPositiveButton(getResources().getString(R.string.dialog_button_confirm), new DialogInterface.OnClickListener() { public void onClick(final DialogInterface dialog, int which) { dialog.dismiss(); Intent intent = new Intent(mContext,HotspotActivity.class); Bundle bundle = new Bundle(); bundle.putBoolean("fromUpdateActivity",true); intent.putExtras(bundle); startActivityForResult(intent,1); } }); builder.setNegativeButton(getResources().getString(R.string.dialog_button_cancel), new android.content.DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.create().show(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent intent){ if(requestCode == 1 && resultCode == RESULT_OK){ doUpdate(); } } private void doUpdate(){ mLoadingDialog.setMessage(getString(R.string.firmware_device_upgrading)); mLoadingDialog.show(); new Thread(new Runnable() { @Override public void run() { updater_client.doUpdater(); mLoadingDialog.dismiss(); } }).start(); } private void onDeviceRebooting(){ mLoadingDialog.setMessage(getString(R.string.firmware_device_rebooting)); mLoadingDialog.show(); } private void onDeviceUpdating(){ mLoadingDialog.setMessage(getString(R.string.firmware_device_upgrading)); mLoadingDialog.show(); } private void onDeviceVersionLatest(){ showToastOnUiThread(getString(R.string.device_version_latest),Toast.LENGTH_SHORT); // saved sharePreference value SharedPreference.putString(mContext,UpdateManager.KEY_DEVICE_VERSION_STR,UpdateManager.getUpdateVersionStr()); SharedPreference.putInt(mContext,UpdateManager.KEY_DOWNLOAD_STATE,UpdateManager.DOWNLOAD_STATE_NONE); refreshPreference(mUpdateManager.isUpdatable()); } private class DownloadListener extends DownloadCallback { @Override public void onStart(int downloadId, long totalBytes) { SharedPreference.putInt(mContext,UpdateManager.KEY_DOWNLOAD_STATE,UpdateManager.DOWNLOAD_STATE_DOWNLOADING); /* save download server info to sharePreference in case of quit when downloading */ mLoadingDialog.dismiss(); SharedPreference.putString(mContext,UpdateManager.KEY_DOWNLOADING_VERSION_STR,mUpdateManager.getServerVersionNumberStr()); mProgressDialog.show(); } @Override public void onRetry(int downloadId) { } @Override public void onProgress(int downloadId, long bytesWritten, long totalBytes) { mProgressDialog.setMax(FileUtil.convertSizeFromBToMB(totalBytes)); mProgressDialog.setProgress(FileUtil.convertSizeFromBToMB(bytesWritten)); SharedPreference.putInt(mContext,UpdateManager.KEY_DOWNLOAD_FIRMWARE_LENGTH,(int)totalBytes); SharedPreference.putInt(mContext,UpdateManager.KEY_DOWNLOAD_STATE,UpdateManager.DOWNLOAD_STATE_DOWNLOADING); } @Override public void onSuccess(int downloadId, String filePath) { mProgressDialog.dismiss(); SharedPreference.putInt(mContext,UpdateManager.KEY_DOWNLOAD_STATE,UpdateManager.DOWNLOAD_STATE_DOWNLOADED); refreshPreference(mUpdateManager.isUpdatable()); prepareDeviceData(); } @Override public void onFailure(int downloadId, int statusCode, String errMsg) { Log.d(TAG, "download failed with errMsg: " + errMsg); SharedPreference.putInt(mContext,UpdateManager.KEY_DOWNLOAD_STATE,UpdateManager.DOWNLOAD_STATE_NONE); showToastOnUiThread(getString(R.string.request_error_for_server),Toast.LENGTH_LONG); mLoadingDialog.dismiss(); mProgressDialog.dismiss(); } } }