diff options
author | Dianne Hackborn <hackbod@google.com> | 2017-10-20 16:16:32 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2017-10-25 12:19:26 -0700 |
commit | c81983a0c3d7bfe8384dbf48909f4bcf300e36d2 (patch) | |
tree | 5bde759ec82eb5330ff0f79f277d137b9efb1be4 /cmds/pm | |
parent | 8664028d4f0642ea44c83f87a85184813ac39972 (diff) |
Start removing remaining pm code to package manager
Everything is now moved out of the pm command except for
the various install commands. I am going to hold of on
those since they require doing some resolution with the
current implementations in the package manager to make
sure they match and behave identically to the implementations
currently in the pm command. But other than that, everything
in pm is now just redirecting over to "cmd package".
Also fix up some of the dumpsys output of a few other sevices
when asking to print the data for a particular package, so
the "pm dump" command gives a little more sane result.
Test: manual
Change-Id: I139e06e560203b72243d7eea9543c2240db0f8f8
Diffstat (limited to 'cmds/pm')
-rw-r--r-- | cmds/pm/src/com/android/commands/pm/Pm.java | 890 |
1 files changed, 9 insertions, 881 deletions
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java index 60ec8a96f325..29433f3fc14f 100644 --- a/cmds/pm/src/com/android/commands/pm/Pm.java +++ b/cmds/pm/src/com/android/commands/pm/Pm.java @@ -116,9 +116,8 @@ public final class Pm { } public int run(String[] args) throws RemoteException { - boolean validCommand = false; if (args.length < 1) { - return showUsage(); + return runShellCommand("package", mArgs); } mAm = IAccountManager.Stub.asInterface(ServiceManager.getService(Context.ACCOUNT_SERVICE)); mUm = IUserManager.Stub.asInterface(ServiceManager.getService(Context.USER_SERVICE)); @@ -134,18 +133,6 @@ public final class Pm { String op = args[0]; mNextArg = 1; - if ("list".equals(op)) { - return runList(); - } - - if ("path".equals(op)) { - return runPath(); - } - - if ("dump".equals(op)) { - return runDump(); - } - if ("install".equals(op)) { return runInstall(); } @@ -166,134 +153,7 @@ public final class Pm { return runInstallAbandon(); } - if ("set-installer".equals(op)) { - return runSetInstaller(); - } - - if ("uninstall".equals(op)) { - return runUninstall(); - } - - if ("clear".equals(op)) { - return runClear(); - } - - if ("enable".equals(op)) { - return runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); - } - - if ("disable".equals(op)) { - return runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); - } - - if ("disable-user".equals(op)) { - return runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER); - } - - if ("disable-until-used".equals(op)) { - return runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED); - } - - if ("default-state".equals(op)) { - return runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT); - } - - if ("hide".equals(op)) { - return runSetHiddenSetting(true); - } - - if ("unhide".equals(op)) { - return runSetHiddenSetting(false); - } - - if ("grant".equals(op)) { - return runGrantRevokePermission(true); - } - - if ("revoke".equals(op)) { - return runGrantRevokePermission(false); - } - - if ("reset-permissions".equals(op)) { - return runResetPermissions(); - } - - if ("set-permission-enforced".equals(op)) { - return runSetPermissionEnforced(); - } - - if ("set-app-link".equals(op)) { - return runSetAppLink(); - } - - if ("get-app-link".equals(op)) { - return runGetAppLink(); - } - - if ("set-install-location".equals(op)) { - return runSetInstallLocation(); - } - - if ("get-install-location".equals(op)) { - return runGetInstallLocation(); - } - - if ("trim-caches".equals(op)) { - return runTrimCaches(); - } - - if ("create-user".equals(op)) { - return runCreateUser(); - } - - if ("remove-user".equals(op)) { - return runRemoveUser(); - } - - if ("get-max-users".equals(op)) { - return runGetMaxUsers(); - } - - if ("force-dex-opt".equals(op)) { - return runForceDexOpt(); - } - - if ("move-package".equals(op)) { - return runMovePackage(); - } - - if ("move-primary-storage".equals(op)) { - return runMovePrimaryStorage(); - } - - if ("set-user-restriction".equals(op)) { - return runSetUserRestriction(); - } - - try { - if (args.length == 1) { - if (args[0].equalsIgnoreCase("-l")) { - validCommand = true; - return runShellCommand("package", new String[] { "list", "package" }); - } else if (args[0].equalsIgnoreCase("-lf")) { - validCommand = true; - return runShellCommand("package", new String[] { "list", "package", "-f" }); - } - } else if (args.length == 2) { - if (args[0].equalsIgnoreCase("-p")) { - validCommand = true; - return displayPackageFilePath(args[1], UserHandle.USER_SYSTEM); - } - } - return 1; - } finally { - if (validCommand == false) { - if (op != null) { - System.err.println("Error: unknown command '" + op + "'"); - } - showUsage(); - } - } + return runShellCommand("package", mArgs); } static final class MyShellCallback extends ShellCallback { @@ -704,59 +564,6 @@ public final class Pm { } } - /** - * Execute the list sub-command. - * - * pm list [package | packages] - * pm list permission-groups - * pm list permissions - * pm list features - * pm list libraries - * pm list instrumentation - */ - private int runList() { - final String type = nextArg(); - if ("users".equals(type)) { - return runShellCommand("user", new String[] { "list" }); - } - return runShellCommand("package", mArgs); - } - - private int runUninstall() { - return runShellCommand("package", mArgs); - } - - private int runPath() { - int userId = UserHandle.USER_SYSTEM; - String option = nextOption(); - if (option != null && option.equals("--user")) { - String optionData = nextOptionData(); - if (optionData == null || !isNumber(optionData)) { - System.err.println("Error: no USER_ID specified"); - return showUsage(); - } else { - userId = Integer.parseInt(optionData); - } - } - - String pkg = nextArg(); - if (pkg == null) { - System.err.println("Error: no package specified"); - return 1; - } - return displayPackageFilePath(pkg, userId); - } - - private int runDump() { - String pkg = nextArg(); - if (pkg == null) { - System.err.println("Error: no package specified"); - return 1; - } - ActivityManager.dumpPackageStateStatic(FileDescriptor.out, pkg); - return 0; - } - class LocalPackageInstallObserver extends PackageInstallObserver { boolean finished; int result; @@ -779,403 +586,16 @@ public final class Pm { } } - // pm set-app-link [--user USER_ID] PACKAGE {always|ask|always-ask|never|undefined} - private int runSetAppLink() { - int userId = UserHandle.USER_SYSTEM; - - String opt; - while ((opt = nextOption()) != null) { - if (opt.equals("--user")) { - userId = Integer.parseInt(nextOptionData()); - if (userId < 0) { - System.err.println("Error: user must be >= 0"); - return 1; - } - } else { - System.err.println("Error: unknown option: " + opt); - return showUsage(); - } - } - - // Package name to act on; required - final String pkg = nextArg(); - if (pkg == null) { - System.err.println("Error: no package specified."); - return showUsage(); - } - - // State to apply; {always|ask|never|undefined}, required - final String modeString = nextArg(); - if (modeString == null) { - System.err.println("Error: no app link state specified."); - return showUsage(); - } - - final int newMode; - switch (modeString.toLowerCase()) { - case "undefined": - newMode = INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; - break; - - case "always": - newMode = INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS; - break; - - case "ask": - newMode = INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK; - break; - - case "always-ask": - newMode = INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK; - break; - - case "never": - newMode = INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER; - break; - - default: - System.err.println("Error: unknown app link state '" + modeString + "'"); - return 1; - } - - try { - final PackageInfo info = mPm.getPackageInfo(pkg, 0, userId); - if (info == null) { - System.err.println("Error: package " + pkg + " not found."); - return 1; - } - - if ((info.applicationInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS) == 0) { - System.err.println("Error: package " + pkg + " does not handle web links."); - return 1; - } - - if (!mPm.updateIntentVerificationStatus(pkg, newMode, userId)) { - System.err.println("Error: unable to update app link status for " + pkg); - return 1; - } - } catch (Exception e) { - System.err.println(e.toString()); - System.err.println(PM_NOT_RUNNING_ERR); - return 1; - } - - return 0; - } - - // pm get-app-link [--user USER_ID] PACKAGE - private int runGetAppLink() { - int userId = UserHandle.USER_SYSTEM; - - String opt; - while ((opt = nextOption()) != null) { - if (opt.equals("--user")) { - userId = Integer.parseInt(nextOptionData()); - if (userId < 0) { - System.err.println("Error: user must be >= 0"); - return 1; - } - } else { - System.err.println("Error: unknown option: " + opt); - return showUsage(); - } - } - - // Package name to act on; required - final String pkg = nextArg(); - if (pkg == null) { - System.err.println("Error: no package specified."); - return showUsage(); - } - - try { - final PackageInfo info = mPm.getPackageInfo(pkg, 0, userId); - if (info == null) { - System.err.println("Error: package " + pkg + " not found."); - return 1; - } - - if ((info.applicationInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS) == 0) { - System.err.println("Error: package " + pkg + " does not handle web links."); - return 1; - } - - System.out.println(linkStateToString(mPm.getIntentVerificationStatus(pkg, userId))); - } catch (Exception e) { - System.err.println(e.toString()); - System.err.println(PM_NOT_RUNNING_ERR); - return 1; - } - - return 0; - } - - private String linkStateToString(int state) { - switch (state) { - case INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED: return "undefined"; - case INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ASK: return "ask"; - case INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS: return "always"; - case INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER: return "never"; - case INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK : return "always ask"; - } - return "Unknown link state: " + state; - } - - private int runSetInstallLocation() { - int loc; - - String arg = nextArg(); - if (arg == null) { - System.err.println("Error: no install location specified."); - return 1; - } - try { - loc = Integer.parseInt(arg); - } catch (NumberFormatException e) { - System.err.println("Error: install location has to be a number."); - return 1; - } - try { - if (!mPm.setInstallLocation(loc)) { - System.err.println("Error: install location has to be a number."); - return 1; - } - return 0; - } catch (RemoteException e) { - System.err.println(e.toString()); - System.err.println(PM_NOT_RUNNING_ERR); - return 1; - } - } - - private int runGetInstallLocation() { - try { - int loc = mPm.getInstallLocation(); - String locStr = "invalid"; - if (loc == PackageHelper.APP_INSTALL_AUTO) { - locStr = "auto"; - } else if (loc == PackageHelper.APP_INSTALL_INTERNAL) { - locStr = "internal"; - } else if (loc == PackageHelper.APP_INSTALL_EXTERNAL) { - locStr = "external"; - } - System.out.println(loc + "[" + locStr + "]"); - return 0; - } catch (RemoteException e) { - System.err.println(e.toString()); - System.err.println(PM_NOT_RUNNING_ERR); - return 1; - } - } - - private int runSetInstaller() throws RemoteException { - final String targetPackage = nextArg(); - final String installerPackageName = nextArg(); - - if (targetPackage == null || installerPackageName == null) { - throw new IllegalArgumentException( - "must provide both target and installer package names"); - } - - mPm.setInstallerPackageName(targetPackage, installerPackageName); - System.out.println("Success"); - return 0; - } - - public int runCreateUser() { - String name; - int userId = -1; - int flags = 0; - String opt; - while ((opt = nextOption()) != null) { - if ("--profileOf".equals(opt)) { - String optionData = nextOptionData(); - if (optionData == null || !isNumber(optionData)) { - System.err.println("Error: no USER_ID specified"); - return showUsage(); - } else { - userId = Integer.parseInt(optionData); - } - } else if ("--managed".equals(opt)) { - flags |= UserInfo.FLAG_MANAGED_PROFILE; - } else if ("--restricted".equals(opt)) { - flags |= UserInfo.FLAG_RESTRICTED; - } else if ("--ephemeral".equals(opt)) { - flags |= UserInfo.FLAG_EPHEMERAL; - } else if ("--guest".equals(opt)) { - flags |= UserInfo.FLAG_GUEST; - } else if ("--demo".equals(opt)) { - flags |= UserInfo.FLAG_DEMO; - } else { - System.err.println("Error: unknown option " + opt); - return showUsage(); - } - } - String arg = nextArg(); - if (arg == null) { - System.err.println("Error: no user name specified."); - return 1; - } - name = arg; - try { - UserInfo info; - if ((flags & UserInfo.FLAG_RESTRICTED) != 0) { - // In non-split user mode, userId can only be SYSTEM - int parentUserId = userId >= 0 ? userId : UserHandle.USER_SYSTEM; - info = mUm.createRestrictedProfile(name, parentUserId); - mAm.addSharedAccountsFromParentUser(parentUserId, userId, - (Process.myUid() == Process.ROOT_UID) ? "root" : "com.android.shell"); - } else if (userId < 0) { - info = mUm.createUser(name, flags); - } else { - info = mUm.createProfileForUser(name, flags, userId, null); - } - - if (info != null) { - System.out.println("Success: created user id " + info.id); - return 0; - } else { - System.err.println("Error: couldn't create User."); - return 1; - } - } catch (RemoteException e) { - System.err.println(e.toString()); - System.err.println(PM_NOT_RUNNING_ERR); - return 1; - } - } - - public int runRemoveUser() { - int userId; - String arg = nextArg(); - if (arg == null) { - System.err.println("Error: no user id specified."); - return 1; - } - try { - userId = Integer.parseInt(arg); - } catch (NumberFormatException e) { - System.err.println("Error: user id '" + arg + "' is not a number."); - return 1; - } - try { - if (mUm.removeUser(userId)) { - System.out.println("Success: removed user"); - return 0; - } else { - System.err.println("Error: couldn't remove user id " + userId); - return 1; - } - } catch (RemoteException e) { - System.err.println(e.toString()); - System.err.println(PM_NOT_RUNNING_ERR); - return 1; - } - } - - public int runGetMaxUsers() { - System.out.println("Maximum supported users: " + UserManager.getMaxSupportedUsers()); - return 0; - } - - public int runForceDexOpt() { - final String packageName = nextArg(); - try { - mPm.forceDexOpt(packageName); - return 0; - } catch (RemoteException e) { - throw e.rethrowAsRuntimeException(); - } - } - - public int runMovePackage() { - final String packageName = nextArg(); - String volumeUuid = nextArg(); - if ("internal".equals(volumeUuid)) { - volumeUuid = null; - } - - try { - final int moveId = mPm.movePackage(packageName, volumeUuid); - - int status = mPm.getMoveStatus(moveId); - while (!PackageManager.isMoveStatusFinished(status)) { - SystemClock.sleep(DateUtils.SECOND_IN_MILLIS); - status = mPm.getMoveStatus(moveId); - } - - if (status == PackageManager.MOVE_SUCCEEDED) { - System.out.println("Success"); - return 0; - } else { - System.err.println("Failure [" + status + "]"); - return 1; - } - } catch (RemoteException e) { - throw e.rethrowAsRuntimeException(); - } - } - - public int runMovePrimaryStorage() { - String volumeUuid = nextArg(); - if ("internal".equals(volumeUuid)) { - volumeUuid = null; - } - - try { - final int moveId = mPm.movePrimaryStorage(volumeUuid); - - int status = mPm.getMoveStatus(moveId); - while (!PackageManager.isMoveStatusFinished(status)) { - SystemClock.sleep(DateUtils.SECOND_IN_MILLIS); - status = mPm.getMoveStatus(moveId); - } - - if (status == PackageManager.MOVE_SUCCEEDED) { - System.out.println("Success"); - return 0; - } else { - System.err.println("Failure [" + status + "]"); - return 1; - } - } catch (RemoteException e) { - throw e.rethrowAsRuntimeException(); - } - } - - public int runSetUserRestriction() { - int userId = UserHandle.USER_SYSTEM; - String opt = nextOption(); - if (opt != null && "--user".equals(opt)) { - String arg = nextArg(); - if (arg == null || !isNumber(arg)) { - System.err.println("Error: valid userId not specified"); - return 1; - } - userId = Integer.parseInt(arg); - } - - String restriction = nextArg(); - String arg = nextArg(); - boolean value; - if ("1".equals(arg)) { - value = true; - } else if ("0".equals(arg)) { - value = false; - } else { - System.err.println("Error: valid value not specified"); - return 1; - } + private static boolean isNumber(String s) { try { - mUm.setUserRestriction(restriction, value, userId); - return 0; - } catch (RemoteException e) { - System.err.println(e.toString()); - return 1; + Integer.parseInt(s); + } catch (NumberFormatException nfe) { + return false; } + return true; } - static class ClearDataObserver extends IPackageDataObserver.Stub { + static class ClearCacheObserver extends IPackageDataObserver.Stub { boolean finished; boolean result; @@ -1187,242 +607,10 @@ public final class Pm { notifyAll(); } } - } - - private int runClear() { - int userId = UserHandle.USER_SYSTEM; - String option = nextOption(); - if (option != null && option.equals("--user")) { - String optionData = nextOptionData(); - if (optionData == null || !isNumber(optionData)) { - System.err.println("Error: no USER_ID specified"); - return showUsage(); - } else { - userId = Integer.parseInt(optionData); - } - } - - String pkg = nextArg(); - if (pkg == null) { - System.err.println("Error: no package specified"); - return showUsage(); - } - - ClearDataObserver obs = new ClearDataObserver(); - try { - ActivityManager.getService().clearApplicationUserData(pkg, obs, userId); - synchronized (obs) { - while (!obs.finished) { - try { - obs.wait(); - } catch (InterruptedException e) { - } - } - } - - if (obs.result) { - System.out.println("Success"); - return 0; - } else { - System.err.println("Failed"); - return 1; - } - } catch (RemoteException e) { - System.err.println(e.toString()); - System.err.println(PM_NOT_RUNNING_ERR); - return 1; - } - } - - private static String enabledSettingToString(int state) { - switch (state) { - case PackageManager.COMPONENT_ENABLED_STATE_DEFAULT: - return "default"; - case PackageManager.COMPONENT_ENABLED_STATE_ENABLED: - return "enabled"; - case PackageManager.COMPONENT_ENABLED_STATE_DISABLED: - return "disabled"; - case PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER: - return "disabled-user"; - case PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED: - return "disabled-until-used"; - } - return "unknown"; - } - - private static boolean isNumber(String s) { - try { - Integer.parseInt(s); - } catch (NumberFormatException nfe) { - return false; - } - return true; - } - - private int runSetEnabledSetting(int state) { - int userId = UserHandle.USER_SYSTEM; - String option = nextOption(); - if (option != null && option.equals("--user")) { - String optionData = nextOptionData(); - if (optionData == null || !isNumber(optionData)) { - System.err.println("Error: no USER_ID specified"); - return showUsage(); - } else { - userId = Integer.parseInt(optionData); - } - } - - String pkg = nextArg(); - if (pkg == null) { - System.err.println("Error: no package or component specified"); - return showUsage(); - } - ComponentName cn = ComponentName.unflattenFromString(pkg); - if (cn == null) { - try { - mPm.setApplicationEnabledSetting(pkg, state, 0, userId, - "shell:" + android.os.Process.myUid()); - System.out.println("Package " + pkg + " new state: " - + enabledSettingToString( - mPm.getApplicationEnabledSetting(pkg, userId))); - return 0; - } catch (RemoteException e) { - System.err.println(e.toString()); - System.err.println(PM_NOT_RUNNING_ERR); - return 1; - } - } else { - try { - mPm.setComponentEnabledSetting(cn, state, 0, userId); - System.out.println("Component " + cn.toShortString() + " new state: " - + enabledSettingToString( - mPm.getComponentEnabledSetting(cn, userId))); - return 0; - } catch (RemoteException e) { - System.err.println(e.toString()); - System.err.println(PM_NOT_RUNNING_ERR); - return 1; - } - } - } - - private int runSetHiddenSetting(boolean state) { - int userId = UserHandle.USER_SYSTEM; - String option = nextOption(); - if (option != null && option.equals("--user")) { - String optionData = nextOptionData(); - if (optionData == null || !isNumber(optionData)) { - System.err.println("Error: no USER_ID specified"); - return showUsage(); - } else { - userId = Integer.parseInt(optionData); - } - } - - String pkg = nextArg(); - if (pkg == null) { - System.err.println("Error: no package or component specified"); - return showUsage(); - } - try { - mPm.setApplicationHiddenSettingAsUser(pkg, state, userId); - System.out.println("Package " + pkg + " new hidden state: " - + mPm.getApplicationHiddenSettingAsUser(pkg, userId)); - return 0; - } catch (RemoteException e) { - System.err.println(e.toString()); - System.err.println(PM_NOT_RUNNING_ERR); - return 1; - } - } - - private int runGrantRevokePermission(boolean grant) { - int userId = UserHandle.USER_SYSTEM; - - String opt = null; - while ((opt = nextOption()) != null) { - if (opt.equals("--user")) { - userId = Integer.parseInt(nextArg()); - } - } - - String pkg = nextArg(); - if (pkg == null) { - System.err.println("Error: no package specified"); - return showUsage(); - } - String perm = nextArg(); - if (perm == null) { - System.err.println("Error: no permission specified"); - return showUsage(); - } - - try { - if (grant) { - mPm.grantRuntimePermission(pkg, perm, userId); - } else { - mPm.revokeRuntimePermission(pkg, perm, userId); - } - return 0; - } catch (RemoteException e) { - System.err.println(e.toString()); - System.err.println(PM_NOT_RUNNING_ERR); - return 1; - } catch (IllegalArgumentException e) { - System.err.println("Bad argument: " + e.toString()); - return showUsage(); - } catch (SecurityException e) { - System.err.println("Operation not allowed: " + e.toString()); - return 1; - } - } - - private int runResetPermissions() { - try { - mPm.resetRuntimePermissions(); - return 0; - } catch (RemoteException e) { - System.err.println(e.toString()); - System.err.println(PM_NOT_RUNNING_ERR); - return 1; - } catch (IllegalArgumentException e) { - System.err.println("Bad argument: " + e.toString()); - return showUsage(); - } catch (SecurityException e) { - System.err.println("Operation not allowed: " + e.toString()); - return 1; - } - } - private int runSetPermissionEnforced() { - final String permission = nextArg(); - if (permission == null) { - System.err.println("Error: no permission specified"); - return showUsage(); - } - final String enforcedRaw = nextArg(); - if (enforcedRaw == null) { - System.err.println("Error: no enforcement specified"); - return showUsage(); - } - final boolean enforced = Boolean.parseBoolean(enforcedRaw); - try { - mPm.setPermissionEnforced(permission, enforced); - return 0; - } catch (RemoteException e) { - System.err.println(e.toString()); - System.err.println(PM_NOT_RUNNING_ERR); - return 1; - } catch (IllegalArgumentException e) { - System.err.println("Bad argument: " + e.toString()); - return showUsage(); - } catch (SecurityException e) { - System.err.println("Operation not allowed: " + e.toString()); - return 1; - } } - static class ClearCacheObserver extends IPackageDataObserver.Stub { + static class ClearDataObserver extends IPackageDataObserver.Stub { boolean finished; boolean result; @@ -1434,66 +622,6 @@ public final class Pm { notifyAll(); } } - - } - - private int runTrimCaches() { - String size = nextArg(); - if (size == null) { - System.err.println("Error: no size specified"); - return showUsage(); - } - long multiplier = 1; - int len = size.length(); - char c = size.charAt(len - 1); - if (c < '0' || c > '9') { - if (c == 'K' || c == 'k') { - multiplier = 1024L; - } else if (c == 'M' || c == 'm') { - multiplier = 1024L*1024L; - } else if (c == 'G' || c == 'g') { - multiplier = 1024L*1024L*1024L; - } else { - System.err.println("Invalid suffix: " + c); - return showUsage(); - } - size = size.substring(0, len-1); - } - long sizeVal; - try { - sizeVal = Long.parseLong(size) * multiplier; - } catch (NumberFormatException e) { - System.err.println("Error: expected number at: " + size); - return showUsage(); - } - String volumeUuid = nextArg(); - if ("internal".equals(volumeUuid)) { - volumeUuid = null; - } - ClearDataObserver obs = new ClearDataObserver(); - try { - mPm.freeStorageAndNotify(volumeUuid, sizeVal, - StorageManager.FLAG_ALLOCATE_DEFY_ALL_RESERVED, obs); - synchronized (obs) { - while (!obs.finished) { - try { - obs.wait(); - } catch (InterruptedException e) { - } - } - } - return 0; - } catch (RemoteException e) { - System.err.println(e.toString()); - System.err.println(PM_NOT_RUNNING_ERR); - return 1; - } catch (IllegalArgumentException e) { - System.err.println("Bad argument: " + e.toString()); - return showUsage(); - } catch (SecurityException e) { - System.err.println("Operation not allowed: " + e.toString()); - return 1; - } } /** |