private void publishFirmwareDownloadProgress() { long progress; JSONObject result = new JSONObject(); if (Preference.getString( context, context.getResources().getString(R.string.firmware_download_progress)) != null) { progress = Long.valueOf( Preference.getString( context, context.getResources().getString(R.string.firmware_download_progress))); } else { progress = DEFAULT_STATE_INFO_CODE; } try { result.put("progress", String.valueOf(progress)); sendBroadcast( Constants.Operation.GET_FIRMWARE_UPGRADE_DOWNLOAD_PROGRESS, Constants.Status.SUCCESSFUL, result.toString()); } catch (JSONException e) { Log.e(TAG, "Failed to create JSON object when publishing OTA progress."); sendBroadcast( Constants.Operation.GET_FIRMWARE_UPGRADE_DOWNLOAD_PROGRESS, Constants.Status.SUCCESSFUL, String.valueOf(DEFAULT_STATE_INFO_CODE)); } }
/** Upgrading device firmware over the air (OTA). */ public void upgradeFirmware(boolean isStatusCheck) { Log.i(TAG, "An upgrade has been requested"); Context context = this.getApplicationContext(); Preference.putBoolean( context, context.getResources().getString(R.string.firmware_status_check_in_progress), isStatusCheck); Preference.putString( context, context.getResources().getString(R.string.firmware_download_progress), String.valueOf(DEFAULT_STATE_INFO_CODE)); Preference.putInt( context, context.getResources().getString(R.string.operation_id), operationId); String schedule = null; String server; if (command != null && !command.trim().isEmpty()) { try { JSONObject upgradeData = new JSONObject(command); if (!upgradeData.isNull(context.getResources().getString(R.string.alarm_schedule))) { schedule = (String) upgradeData.get(context.getResources().getString(R.string.alarm_schedule)); } if (!upgradeData.isNull(context.getResources().getString(R.string.firmware_server))) { server = (String) upgradeData.get(context.getResources().getString(R.string.firmware_server)); if (URLUtil.isValidUrl(server)) { Preference.putString( context, context.getResources().getString(R.string.firmware_server), server); } } } catch (JSONException e) { Log.e(TAG, "Firmware upgrade payload parsing failed." + e); } } if (schedule != null && !schedule.trim().isEmpty()) { Log.i(TAG, "Upgrade has been scheduled to " + schedule); Preference.putString( context, context.getResources().getString(R.string.alarm_schedule), schedule); try { AlarmUtils.setOneTimeAlarm(context, schedule, Constants.Operation.UPGRADE_FIRMWARE, null); } catch (ParseException e) { Log.e(TAG, "One time alarm time string parsing failed." + e); } } else { if (isStatusCheck) { Log.i(TAG, "Firmware status check is initiated by admin."); } else { Log.i(TAG, "Upgrade request initiated by admin."); } // Prepare for upgrade OTADownload otaDownload = new OTADownload(context); otaDownload.startOTA(); } }
/** Silently installs the app resides in the provided URI. */ private void silentInstallApp(Context context, String packageUri, String schedule) { if (schedule != null && !schedule.trim().isEmpty() && !schedule.equals("undefined")) { Log.i(TAG, "Silent install has been scheduled to " + schedule); Preference.putString( context, context.getResources().getString(R.string.alarm_schedule), schedule); Preference.putString(context, context.getResources().getString(R.string.app_uri), packageUri); try { AlarmUtils.setOneTimeAlarm( context, schedule, Constants.Operation.SILENT_INSTALL_APPLICATION, packageUri); } catch (ParseException e) { Log.e(TAG, "One time alarm time string parsing failed." + e); } } else { AppUtils.silentInstallApp(context, Uri.parse(packageUri)); } }
/** * Executes device management operations on the device. * * @param code - Operation object. */ public void doTask(String code) { switch (code) { case Constants.Operation.DEVICE_LOCK: enableHardLock(); break; case Constants.Operation.DEVICE_UNLOCK: disableHardLock(); break; case Constants.Operation.ENABLE_ADMIN: startAdmin(); break; case Constants.Operation.UPGRADE_FIRMWARE: upgradeFirmware(false); break; case Constants.Operation.REBOOT: rebootDevice(); break; case Constants.Operation.EXECUTE_SHELL_COMMAND: if (command != null) { executeShellCommand(command); } break; case Constants.Operation.SILENT_INSTALL_APPLICATION: if (appUri != null) { silentInstallApp(getApplicationContext(), appUri, command); } break; case Constants.Operation.SILENT_UPDATE_APPLICATION: if (appUri != null) { silentInstallApp(getApplicationContext(), appUri, command); } break; case Constants.Operation.SILENT_UNINSTALL_APPLICATION: if (appUri != null) { silentUninstallApp(getApplicationContext(), appUri, command); } break; case Constants.Operation.REMOVE_DEVICE_OWNER: SettingsManager.clearDeviceOwner(); break; case Constants.Operation.DISALLOW_ADJUST_VOLUME: SettingsManager.restrict(DISALLOW_ADJUST_VOLUME, restrictionCode); break; case Constants.Operation.DISALLOW_ADD_USER: SettingsManager.restrict(DISALLOW_ADD_USER, restrictionCode); break; case Constants.Operation.DISALLOW_APPS_CONTROL: SettingsManager.restrict(DISALLOW_APPS_CONTROL, restrictionCode); break; case Constants.Operation.DISALLOW_CONFIG_BLUETOOTH: SettingsManager.restrict(DISALLOW_CONFIG_BLUETOOTH, restrictionCode); break; case Constants.Operation.DISALLOW_CONFIG_CELL_BROADCASTS: SettingsManager.restrict(DISALLOW_CONFIG_CELL_BROADCASTS, restrictionCode); break; case Constants.Operation.DISALLOW_CONFIG_CREDENTIALS: SettingsManager.restrict(DISALLOW_CONFIG_CREDENTIALS, restrictionCode); break; case Constants.Operation.DISALLOW_CONFIG_MOBILE_NETWORKS: SettingsManager.restrict(DISALLOW_CONFIG_MOBILE_NETWORKS, restrictionCode); break; case Constants.Operation.DISALLOW_CONFIG_TETHERING: SettingsManager.restrict(DISALLOW_CONFIG_TETHERING, restrictionCode); break; case Constants.Operation.DISALLOW_CONFIG_VPN: SettingsManager.restrict(DISALLOW_CONFIG_VPN, restrictionCode); break; case Constants.Operation.DISALLOW_CONFIG_WIFI: SettingsManager.restrict(DISALLOW_CONFIG_WIFI, restrictionCode); break; case Constants.Operation.DISALLOW_CREATE_WINDOWS: SettingsManager.restrict(DISALLOW_CREATE_WINDOWS, restrictionCode); break; case Constants.Operation.DISALLOW_CROSS_PROFILE_COPY_PASTE: SettingsManager.restrict(DISALLOW_CROSS_PROFILE_COPY_PASTE, restrictionCode); break; case Constants.Operation.DISALLOW_DEBUGGING_FEATURES: SettingsManager.restrict(DISALLOW_DEBUGGING_FEATURES, restrictionCode); break; case Constants.Operation.DISALLOW_FACTORY_RESET: SettingsManager.restrict(DISALLOW_FACTORY_RESET, restrictionCode); break; case Constants.Operation.DISALLOW_INSTALL_APPS: SettingsManager.restrict(DISALLOW_INSTALL_APPS, restrictionCode); break; case Constants.Operation.DISALLOW_INSTALL_UNKNOWN_SOURCES: SettingsManager.restrict(DISALLOW_INSTALL_UNKNOWN_SOURCES, restrictionCode); break; case Constants.Operation.DISALLOW_MODIFY_ACCOUNTS: SettingsManager.restrict(DISALLOW_MODIFY_ACCOUNTS, restrictionCode); break; case Constants.Operation.DISALLOW_MOUNT_PHYSICAL_MEDIA: SettingsManager.restrict(DISALLOW_MOUNT_PHYSICAL_MEDIA, restrictionCode); break; case Constants.Operation.DISALLOW_NETWORK_RESET: SettingsManager.restrict(DISALLOW_NETWORK_RESET, restrictionCode); break; case Constants.Operation.DISALLOW_OUTGOING_BEAM: SettingsManager.restrict(DISALLOW_OUTGOING_BEAM, restrictionCode); break; case Constants.Operation.DISALLOW_OUTGOING_CALLS: SettingsManager.restrict(DISALLOW_OUTGOING_CALLS, restrictionCode); break; case Constants.Operation.DISALLOW_REMOVE_USER: SettingsManager.restrict(DISALLOW_REMOVE_USER, restrictionCode); break; case Constants.Operation.DISALLOW_SAFE_BOOT: SettingsManager.restrict(DISALLOW_SAFE_BOOT, restrictionCode); break; case Constants.Operation.DISALLOW_SHARE_LOCATION: SettingsManager.restrict(DISALLOW_SHARE_LOCATION, restrictionCode); break; case Constants.Operation.DISALLOW_SMS: SettingsManager.restrict(DISALLOW_SMS, restrictionCode); break; case Constants.Operation.DISALLOW_UNINSTALL_APPS: SettingsManager.restrict(DISALLOW_UNINSTALL_APPS, restrictionCode); break; case Constants.Operation.DISALLOW_UNMUTE_MICROPHONE: SettingsManager.restrict(DISALLOW_UNMUTE_MICROPHONE, restrictionCode); break; case Constants.Operation.DISALLOW_USB_FILE_TRANSFER: SettingsManager.restrict(DISALLOW_USB_FILE_TRANSFER, restrictionCode); break; case Constants.Operation.ENSURE_VERIFY_APPS: SettingsManager.restrict(ENSURE_VERIFY_APPS, restrictionCode); break; case Constants.Operation.ALLOW_PARENT_PROFILE_APP_LINKING: SettingsManager.restrict(ALLOW_PARENT_PROFILE_APP_LINKING, restrictionCode); break; case Constants.Operation.AUTO_TIME: SettingsManager.setAutoTimeRequired(restrictionCode); break; case Constants.Operation.SET_SCREEN_CAPTURE_DISABLED: SettingsManager.setScreenCaptureDisabled(restrictionCode); break; case Constants.Operation.APP_RESTRICTION: if (command != null && (command.equals("true") || command.equals("false"))) { SettingsManager.setVisibilityOfApp(appUri, Boolean.parseBoolean(command)); } break; // Only With Android M. case Constants.Operation.SET_STATUS_BAR_DISABLED: SettingsManager.setStatusBarDisabled(restrictionCode); break; case Constants.Operation.GET_FIRMWARE_UPGRADE_PACKAGE_STATUS: Preference.putBoolean( context, context.getResources().getString(R.string.firmware_status_check_in_progress), true); upgradeFirmware(true); break; case Constants.Operation.WIPE_DATA: try { Runtime.getRuntime().exec("sh"); Runtime.getRuntime().exec("am broadcast -a android.intent.action.MASTER_CLEAR"); } catch (IOException e) { Log.e("TAG", "Shell command execution failed." + e); } break; case Constants.Operation.GET_FIRMWARE_UPGRADE_DOWNLOAD_PROGRESS: publishFirmwareDownloadProgress(); break; case Constants.Operation.GET_FIRMWARE_BUILD_DATE: publishFirmwareBuildDate(); break; default: Log.e(TAG, "Invalid operation code received"); break; } }