19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.commands.pm;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.app.ActivityManager;
20690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackbornimport android.app.ActivityManagerNative;
216143a02f96a5c6c7a0a84f5dbe70732998256a72Kenny Guyimport android.app.IActivityManager;
22ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport android.app.PackageInstallObserver;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName;
24a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkeyimport android.content.IIntentReceiver;
25a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkeyimport android.content.IIntentSender;
26fbd0e9fa37fc17ccd25e4c1f16195bbd27de3c4cJeff Sharkeyimport android.content.Intent;
27a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkeyimport android.content.IntentSender;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ApplicationInfo;
29039c68e75606e837cf021815a0210836724574adDianne Hackbornimport android.content.pm.FeatureInfo;
30690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackbornimport android.content.pm.IPackageDataObserver;
31ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport android.content.pm.IPackageInstaller;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.IPackageManager;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.InstrumentationInfo;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageInfo;
35ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport android.content.pm.PackageInstaller;
36a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkeyimport android.content.pm.PackageInstaller.SessionInfo;
37a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkeyimport android.content.pm.PackageInstaller.SessionParams;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageItemInfo;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager;
400e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Rootimport android.content.pm.ParceledListSlice;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionGroupInfo;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PermissionInfo;
43742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasaniimport android.content.pm.UserInfo;
44706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich canningsimport android.content.pm.VerificationParams;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri;
48116bdbd823b607d860b039ec334a1f985eed7a7fNarayan Kamathimport android.os.Build;
49f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tateimport android.os.Bundle;
50258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasaniimport android.os.IUserManager;
5131d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guyimport android.os.Process;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.RemoteException;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
54151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasaniimport android.os.UserHandle;
554c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkeyimport android.os.UserManager;
56ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkeyimport android.text.TextUtils;
57ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport android.util.Log;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
59513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkeyimport com.android.internal.content.PackageHelper;
60513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkeyimport com.android.internal.util.ArrayUtils;
61ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport com.android.internal.util.SizedInputStream;
62ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
63ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport libcore.io.IoUtils;
64513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkey
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
66cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport java.io.FileDescriptor;
67ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport java.io.FileInputStream;
68ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport java.io.IOException;
69ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport java.io.InputStream;
70ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkeyimport java.io.OutputStream;
7123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohetimport java.lang.reflect.Field;
7223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohetimport java.lang.reflect.Modifier;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Collections;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Comparator;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.WeakHashMap;
78a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkeyimport java.util.concurrent.SynchronousQueue;
79a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkeyimport java.util.concurrent.TimeUnit;
808a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class Pm {
82ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey    private static final String TAG = "Pm";
83ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    IPackageManager mPm;
85ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey    IPackageInstaller mInstaller;
86258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani    IUserManager mUm;
8723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private WeakHashMap<String, Resources> mResourceCache
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new WeakHashMap<String, Resources>();
9023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String[] mArgs;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private int mNextArg;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String mCurArgData;
9423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
9523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet    private static final String PM_NOT_RUNNING_ERR =
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        "Error: Could not access the Package Manager.  Is the system running?";
9723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static void main(String[] args) {
99ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        try {
100ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            new Pm().run(args);
101ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        } catch (Exception e) {
102ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            Log.e(TAG, "Error", e);
103ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            System.err.println("Error: " + e);
104ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            if (e instanceof RemoteException) {
105ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                System.err.println(PM_NOT_RUNNING_ERR);
106ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            }
107ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        }
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
110ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey    public void run(String[] args) throws IOException, RemoteException {
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean validCommand = false;
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (args.length < 1) {
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            showUsage();
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
117258848d2ae04f447ff1c18023fa76b139fcc0862Amith Yamasani        mUm = IUserManager.Stub.asInterface(ServiceManager.getService("user"));
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPm == null) {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println(PM_NOT_RUNNING_ERR);
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
123ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        mInstaller = mPm.getPackageInstaller();
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mArgs = args;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String op = args[0];
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNextArg = 1;
12823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ("list".equals(op)) {
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            runList();
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ("path".equals(op)) {
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            runPath();
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
139cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        if ("dump".equals(op)) {
140cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn            runDump();
141cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn            return;
142cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        }
143cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ("install".equals(op)) {
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            runInstall();
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
149ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        if ("install-create".equals(op)) {
150ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            runInstallCreate();
151ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            return;
152ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        }
153ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
154ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        if ("install-write".equals(op)) {
155ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            runInstallWrite();
156ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            return;
157ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        }
158ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
159ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        if ("install-commit".equals(op)) {
160ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            runInstallCommit();
161ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            return;
162ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        }
163ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
16416c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey        if ("install-abandon".equals(op) || "install-destroy".equals(op)) {
16516c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey            runInstallAbandon();
166ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            return;
167ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        }
168ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
169ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        if ("set-installer".equals(op)) {
170ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            runSetInstaller();
171ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            return;
172ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        }
173ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ("uninstall".equals(op)) {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            runUninstall();
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
179690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn        if ("clear".equals(op)) {
180690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn            runClear();
181690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn            return;
182690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn        }
183690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ("enable".equals(op)) {
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ("disable".equals(op)) {
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED);
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
1940ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn        if ("disable-user".equals(op)) {
1950ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn            runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER);
1960ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn            return;
1970ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn        }
1980ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn
199fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn        if ("disable-until-used".equals(op)) {
200fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn            runSetEnabledSetting(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED);
201fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn            return;
202fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn        }
203fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn
204e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani        if ("hide".equals(op)) {
205e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani            runSetHiddenSetting(true);
206655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani            return;
207655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        }
208655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani
209e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani        if ("unhide".equals(op)) {
210e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani            runSetHiddenSetting(false);
211655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani            return;
212655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        }
213655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani
214e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        if ("grant".equals(op)) {
215e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            runGrantRevokePermission(true);
216e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            return;
217e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        }
218e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn
219e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        if ("revoke".equals(op)) {
220e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            runGrantRevokePermission(false);
221e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            return;
222e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        }
223e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn
224719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey        if ("set-permission-enforced".equals(op)) {
225719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey            runSetPermissionEnforced();
226719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey            return;
227719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey        }
228719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey
22946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        if ("set-install-location".equals(op)) {
23040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            runSetInstallLocation();
23140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            return;
23240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu        }
23340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu
23446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        if ("get-install-location".equals(op)) {
23540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            runGetInstallLocation();
23640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            return;
23740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu        }
23840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu
239197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        if ("trim-caches".equals(op)) {
240197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            runTrimCaches();
241197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            return;
242197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        }
243197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn
244483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if ("create-user".equals(op)) {
245483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            runCreateUser();
246742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            return;
247742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
248742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani
249483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if ("remove-user".equals(op)) {
250483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            runRemoveUser();
2510b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani            return;
2520b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        }
2530b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani
2544c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey        if ("get-max-users".equals(op)) {
2554c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey            runGetMaxUsers();
2564c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey            return;
2574c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey        }
2584c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey
25920e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey        if ("force-dex-opt".equals(op)) {
26020e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey            runForceDexOpt();
26120e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey            return;
26220e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey        }
26320e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (args.length == 1) {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (args[0].equalsIgnoreCase("-l")) {
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    validCommand = true;
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    runListPackages(false);
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (args[0].equalsIgnoreCase("-lf")){
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    validCommand = true;
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    runListPackages(true);
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (args.length == 2) {
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (args[0].equalsIgnoreCase("-p")) {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    validCommand = true;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    displayPackageFilePath(args[1]);
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } finally {
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (validCommand == false) {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (op != null) {
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    System.err.println("Error: unknown command '" + op + "'");
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                showUsage();
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Execute the list sub-command.
29123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet     *
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pm list [package | packages]
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pm list permission-groups
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pm list permissions
295039c68e75606e837cf021815a0210836724574adDianne Hackborn     * pm list features
296e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn     * pm list libraries
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pm list instrumentation
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void runList() {
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String type = nextArg();
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (type == null) {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println("Error: didn't specify type of data to list");
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ("package".equals(type) || "packages".equals(type)) {
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            runListPackages(false);
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if ("permission-groups".equals(type)) {
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            runListPermissionGroups();
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if ("permissions".equals(type)) {
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            runListPermissions();
311039c68e75606e837cf021815a0210836724574adDianne Hackborn        } else if ("features".equals(type)) {
312039c68e75606e837cf021815a0210836724574adDianne Hackborn            runListFeatures();
313e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else if ("libraries".equals(type)) {
314e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            runListLibraries();
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else if ("instrumentation".equals(type)) {
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            runListInstrumentation();
317483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        } else if ("users".equals(type)) {
318483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            runListUsers();
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println("Error: unknown list type '" + type + "'");
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Lists all the installed packages.
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void runListPackages(boolean showApplicationPackage) {
328e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        int getFlags = 0;
329e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        boolean listDisabled = false, listEnabled = false;
3300f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn        boolean listSystem = false, listThirdParty = false;
33192a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma        boolean listInstaller = false;
332151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani        int userId = UserHandle.USER_OWNER;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String opt;
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while ((opt=nextOption()) != null) {
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (opt.equals("-l")) {
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // old compat
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (opt.equals("-lf")) {
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    showApplicationPackage = true;
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (opt.equals("-f")) {
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    showApplicationPackage = true;
342e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                } else if (opt.equals("-d")) {
343e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    listDisabled = true;
344e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                } else if (opt.equals("-e")) {
345e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    listEnabled = true;
3460f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn                } else if (opt.equals("-s")) {
3470f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn                    listSystem = true;
3480f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn                } else if (opt.equals("-3")) {
3490f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn                    listThirdParty = true;
35092a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma                } else if (opt.equals("-i")) {
35192a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma                    listInstaller = true;
352151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani                } else if (opt.equals("--user")) {
353151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani                    userId = Integer.parseInt(nextArg());
354e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                } else if (opt.equals("-u")) {
355e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    getFlags |= PackageManager.GET_UNINSTALLED_PACKAGES;
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    System.err.println("Error: Unknown option: " + opt);
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException ex) {
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println("Error: " + ex.toString());
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
366e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        String filter = nextArg();
367e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
369151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani            final List<PackageInfo> packages = getInstalledPackages(mPm, getFlags, userId);
37023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int count = packages.size();
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int p = 0 ; p < count ; p++) {
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PackageInfo info = packages.get(p);
374e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if (filter != null && !info.packageName.contains(filter)) {
375e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    continue;
376e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                }
3770f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn                final boolean isSystem =
3780f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn                        (info.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0;
379e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if ((!listDisabled || !info.applicationInfo.enabled) &&
3800f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn                        (!listEnabled || info.applicationInfo.enabled) &&
3810f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn                        (!listSystem || isSystem) &&
3820f1de9adde0b52d2a385a76232bd7ac30c3eeea2Dianne Hackborn                        (!listThirdParty || !isSystem)) {
383e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    System.out.print("package:");
384e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    if (showApplicationPackage) {
385e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        System.out.print(info.applicationInfo.sourceDir);
386e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        System.out.print("=");
387e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    }
38892a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma                    System.out.print(info.packageName);
38992a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma                    if (listInstaller) {
39092a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma                        System.out.print("  installer=");
39192a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma                        System.out.print(mPm.getInstallerPackageName(info.packageName));
39292a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma                    }
39392a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma                    System.out.println();
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println(e.toString());
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println(PM_NOT_RUNNING_ERR);
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
40123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
4020e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root    @SuppressWarnings("unchecked")
403151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani    private List<PackageInfo> getInstalledPackages(IPackageManager pm, int flags, int userId)
4040e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root            throws RemoteException {
405d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn        ParceledListSlice<PackageInfo> slice = pm.getInstalledPackages(flags, userId);
406d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn        return slice.getList();
4070e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root    }
4080e2c0f37d98bb5539b0fe41865aaf1add0ff1bb3Kenny Root
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
410039c68e75606e837cf021815a0210836724574adDianne Hackborn     * Lists all of the features supported by the current device.
411039c68e75606e837cf021815a0210836724574adDianne Hackborn     *
412039c68e75606e837cf021815a0210836724574adDianne Hackborn     * pm list features
413039c68e75606e837cf021815a0210836724574adDianne Hackborn     */
414039c68e75606e837cf021815a0210836724574adDianne Hackborn    private void runListFeatures() {
415039c68e75606e837cf021815a0210836724574adDianne Hackborn        try {
416039c68e75606e837cf021815a0210836724574adDianne Hackborn            List<FeatureInfo> list = new ArrayList<FeatureInfo>();
417039c68e75606e837cf021815a0210836724574adDianne Hackborn            FeatureInfo[] rawList = mPm.getSystemAvailableFeatures();
418039c68e75606e837cf021815a0210836724574adDianne Hackborn            for (int i=0; i<rawList.length; i++) {
419039c68e75606e837cf021815a0210836724574adDianne Hackborn                list.add(rawList[i]);
420039c68e75606e837cf021815a0210836724574adDianne Hackborn            }
421babe28e01c6e845e41f8a7d23ab0b2a2c93a2e6bJoe Malin
422039c68e75606e837cf021815a0210836724574adDianne Hackborn
423039c68e75606e837cf021815a0210836724574adDianne Hackborn            // Sort by name
424039c68e75606e837cf021815a0210836724574adDianne Hackborn            Collections.sort(list, new Comparator<FeatureInfo>() {
425039c68e75606e837cf021815a0210836724574adDianne Hackborn                public int compare(FeatureInfo o1, FeatureInfo o2) {
426039c68e75606e837cf021815a0210836724574adDianne Hackborn                    if (o1.name == o2.name) return 0;
427039c68e75606e837cf021815a0210836724574adDianne Hackborn                    if (o1.name == null) return -1;
428039c68e75606e837cf021815a0210836724574adDianne Hackborn                    if (o2.name == null) return 1;
429039c68e75606e837cf021815a0210836724574adDianne Hackborn                    return o1.name.compareTo(o2.name);
430039c68e75606e837cf021815a0210836724574adDianne Hackborn                }
431039c68e75606e837cf021815a0210836724574adDianne Hackborn            });
432039c68e75606e837cf021815a0210836724574adDianne Hackborn
433039c68e75606e837cf021815a0210836724574adDianne Hackborn            int count = (list != null) ? list.size() : 0;
434039c68e75606e837cf021815a0210836724574adDianne Hackborn            for (int p = 0; p < count; p++) {
435039c68e75606e837cf021815a0210836724574adDianne Hackborn                FeatureInfo fi = list.get(p);
436039c68e75606e837cf021815a0210836724574adDianne Hackborn                System.out.print("feature:");
437039c68e75606e837cf021815a0210836724574adDianne Hackborn                if (fi.name != null) System.out.println(fi.name);
438039c68e75606e837cf021815a0210836724574adDianne Hackborn                else System.out.println("reqGlEsVersion=0x"
439039c68e75606e837cf021815a0210836724574adDianne Hackborn                        + Integer.toHexString(fi.reqGlEsVersion));
440039c68e75606e837cf021815a0210836724574adDianne Hackborn            }
441039c68e75606e837cf021815a0210836724574adDianne Hackborn        } catch (RemoteException e) {
442039c68e75606e837cf021815a0210836724574adDianne Hackborn            System.err.println(e.toString());
443039c68e75606e837cf021815a0210836724574adDianne Hackborn            System.err.println(PM_NOT_RUNNING_ERR);
444039c68e75606e837cf021815a0210836724574adDianne Hackborn        }
445039c68e75606e837cf021815a0210836724574adDianne Hackborn    }
446039c68e75606e837cf021815a0210836724574adDianne Hackborn
447039c68e75606e837cf021815a0210836724574adDianne Hackborn    /**
448e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn     * Lists all of the libraries supported by the current device.
449e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn     *
450e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn     * pm list libraries
451e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn     */
452e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    private void runListLibraries() {
453e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        try {
454e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            List<String> list = new ArrayList<String>();
455e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            String[] rawList = mPm.getSystemSharedLibraryNames();
456e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            for (int i=0; i<rawList.length; i++) {
457e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                list.add(rawList[i]);
458e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
459e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
460e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
461e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            // Sort by name
462e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            Collections.sort(list, new Comparator<String>() {
463e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                public int compare(String o1, String o2) {
464e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    if (o1 == o2) return 0;
465e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    if (o1 == null) return -1;
466e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    if (o2 == null) return 1;
467e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    return o1.compareTo(o2);
468e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                }
469e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            });
470e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
471e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            int count = (list != null) ? list.size() : 0;
472e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            for (int p = 0; p < count; p++) {
473e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                String lib = list.get(p);
474e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                System.out.print("library:");
475e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                System.out.println(lib);
476e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
477e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } catch (RemoteException e) {
478e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            System.err.println(e.toString());
479e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            System.err.println(PM_NOT_RUNNING_ERR);
480e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
481e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    }
482e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn
483e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn    /**
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Lists all of the installed instrumentation, or all for a given package
48523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet     *
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * pm list instrumentation [package] [-f]
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void runListInstrumentation() {
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int flags = 0;      // flags != 0 is only used to request meta-data
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean showPackage = false;
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String targetPackage = null;
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String opt;
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while ((opt=nextArg()) != null) {
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (opt.equals("-f")) {
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    showPackage = true;
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (opt.charAt(0) != '-') {
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    targetPackage = opt;
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    System.err.println("Error: Unknown option: " + opt);
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RuntimeException ex) {
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println("Error: " + ex.toString());
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            List<InstrumentationInfo> list = mPm.queryInstrumentation(targetPackage, flags);
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Sort by target package
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Collections.sort(list, new Comparator<InstrumentationInfo>() {
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int compare(InstrumentationInfo o1, InstrumentationInfo o2) {
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return o1.targetPackage.compareTo(o2.targetPackage);
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            });
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int count = (list != null) ? list.size() : 0;
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int p = 0; p < count; p++) {
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                InstrumentationInfo ii = list.get(p);
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.print("instrumentation:");
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (showPackage) {
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    System.out.print(ii.sourceDir);
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    System.out.print("=");
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ComponentName cn = new ComponentName(ii.packageName, ii.name);
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.print(cn.flattenToShortString());
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.print(" (target=");
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.print(ii.targetPackage);
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println(")");
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println(e.toString());
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println(PM_NOT_RUNNING_ERR);
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Lists all the known permission groups.
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void runListPermissionGroups() {
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            List<PermissionGroupInfo> pgs = mPm.getAllPermissionGroups(0);
54623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int count = pgs.size();
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int p = 0 ; p < count ; p++) {
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PermissionGroupInfo pgi = pgs.get(p);
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.print("permission group:");
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println(pgi.name);
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println(e.toString());
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println(PM_NOT_RUNNING_ERR);
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
55823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String loadText(PackageItemInfo pii, int res, CharSequence nonLocalized) {
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (nonLocalized != null) {
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return nonLocalized.toString();
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5631c3274ca12a6931568693b897c269107f0346eabAli Utku Selen        if (res != 0) {
5641c3274ca12a6931568693b897c269107f0346eabAli Utku Selen            Resources r = getResources(pii);
5651c3274ca12a6931568693b897c269107f0346eabAli Utku Selen            if (r != null) {
5661c3274ca12a6931568693b897c269107f0346eabAli Utku Selen                return r.getString(res);
5671c3274ca12a6931568693b897c269107f0346eabAli Utku Selen            }
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return null;
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
57123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Lists all the permissions in a group.
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void runListPermissions() {
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean labels = false;
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean groups = false;
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean userOnly = false;
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean summary = false;
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean dangerousOnly = false;
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String opt;
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while ((opt=nextOption()) != null) {
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (opt.equals("-f")) {
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    labels = true;
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (opt.equals("-g")) {
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    groups = true;
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (opt.equals("-s")) {
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    groups = true;
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    labels = true;
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    summary = true;
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (opt.equals("-u")) {
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    userOnly = true;
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (opt.equals("-d")) {
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    dangerousOnly = true;
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    System.err.println("Error: Unknown option: " + opt);
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
60123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String grp = nextOption();
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ArrayList<String> groupList = new ArrayList<String>();
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (groups) {
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                List<PermissionGroupInfo> infos =
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPm.getAllPermissionGroups(0);
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int i=0; i<infos.size(); i++) {
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    groupList.add(infos.get(i).name);
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                groupList.add(null);
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                groupList.add(grp);
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
61423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (dangerousOnly) {
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("Dangerous Permissions:");
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("");
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                doListPermissions(groupList, groups, labels, summary,
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        PermissionInfo.PROTECTION_DANGEROUS,
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        PermissionInfo.PROTECTION_DANGEROUS);
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (userOnly) {
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    System.out.println("Normal Permissions:");
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    System.out.println("");
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    doListPermissions(groupList, groups, labels, summary,
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            PermissionInfo.PROTECTION_NORMAL,
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            PermissionInfo.PROTECTION_NORMAL);
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (userOnly) {
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("Dangerous and Normal Permissions:");
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("");
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                doListPermissions(groupList, groups, labels, summary,
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        PermissionInfo.PROTECTION_NORMAL,
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        PermissionInfo.PROTECTION_DANGEROUS);
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("All Permissions:");
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("");
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                doListPermissions(groupList, groups, labels, summary,
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        -10000, 10000);
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println(e.toString());
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println(PM_NOT_RUNNING_ERR);
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
64523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void doListPermissions(ArrayList<String> groupList,
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean groups, boolean labels, boolean summary,
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int startProtectionLevel, int endProtectionLevel)
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throws RemoteException {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i=0; i<groupList.size(); i++) {
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String groupName = groupList.get(i);
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            String prefix = "";
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (groups) {
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (i > 0) System.out.println("");
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (groupName != null) {
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    PermissionGroupInfo pgi = mPm.getPermissionGroupInfo(
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            groupName, 0);
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (summary) {
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Resources res = getResources(pgi);
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (res != null) {
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            System.out.print(loadText(pgi, pgi.labelRes,
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    pgi.nonLocalizedLabel) + ": ");
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            System.out.print(pgi.name + ": ");
66523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        System.out.println((labels ? "+ " : "")
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                + "group:" + pgi.name);
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (labels) {
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            System.out.println("  package:" + pgi.packageName);
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            Resources res = getResources(pgi);
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            if (res != null) {
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                System.out.println("  label:"
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + loadText(pgi, pgi.labelRes,
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                pgi.nonLocalizedLabel));
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                System.out.println("  description:"
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                        + loadText(pgi, pgi.descriptionRes,
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                                pgi.nonLocalizedDescription));
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            }
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    System.out.println(((labels && !summary)
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            ? "+ " : "") + "ungrouped:");
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                prefix = "  ";
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            List<PermissionInfo> ps = mPm.queryPermissionsByGroup(
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    groupList.get(i), 0);
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int count = ps.size();
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean first = true;
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int p = 0 ; p < count ; p++) {
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                PermissionInfo pi = ps.get(p);
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (groups && groupName == null && pi.group != null) {
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
698e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                final int base = pi.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE;
699e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                if (base < startProtectionLevel
700e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                        || base > endProtectionLevel) {
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (summary) {
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (first) {
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        first = false;
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        System.out.print(", ");
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Resources res = getResources(pi);
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (res != null) {
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        System.out.print(loadText(pi, pi.labelRes,
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                pi.nonLocalizedLabel));
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        System.out.print(pi.name);
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    System.out.println(prefix + (labels ? "+ " : "")
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + "permission:" + pi.name);
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (labels) {
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        System.out.println(prefix + "  package:" + pi.packageName);
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        Resources res = getResources(pi);
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (res != null) {
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            System.out.println(prefix + "  label:"
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + loadText(pi, pi.labelRes,
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            pi.nonLocalizedLabel));
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            System.out.println(prefix + "  description:"
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                    + loadText(pi, pi.descriptionRes,
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                            pi.nonLocalizedDescription));
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
730e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                        System.out.println(prefix + "  protectionLevel:"
731e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                                + PermissionInfo.protectionToString(pi.protectionLevel));
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
73523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (summary) {
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println("");
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
74123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void runPath() {
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkg = nextArg();
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg == null) {
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println("Error: no package specified");
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        displayPackageFilePath(pkg);
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
75023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
751cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn    private void runDump() {
752cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        String pkg = nextArg();
753cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        if (pkg == null) {
754cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn            System.err.println("Error: no package specified");
755cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn            return;
756cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        }
757cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        ActivityManager.dumpPackageStateStatic(FileDescriptor.out, pkg);
758cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn    }
759cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn
760ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey    class LocalPackageInstallObserver extends PackageInstallObserver {
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        boolean finished;
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int result;
763f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate        String extraPermission;
764f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate        String extraPackage;
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
766f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate        @Override
767fbd0e9fa37fc17ccd25e4c1f16195bbd27de3c4cJeff Sharkey        public void onPackageInstalled(String name, int status, String msg, Bundle extras) {
768ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            synchronized (this) {
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                finished = true;
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                result = status;
771f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate                if (status == PackageManager.INSTALL_FAILED_DUPLICATE_PERMISSION) {
772f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate                    extraPermission = extras.getString(
773f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate                            PackageManager.EXTRA_FAILURE_EXISTING_PERMISSION);
774f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate                    extraPackage = extras.getString(
775f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate                            PackageManager.EXTRA_FAILURE_EXISTING_PACKAGE);
776f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate                }
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                notifyAll();
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
78123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
78223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet    /**
78323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet     * Converts a failure code into a string by using reflection to find a matching constant
78423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet     * in PackageManager.
78523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet     */
786ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey    private String installFailureToString(LocalPackageInstallObserver obs) {
787f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate        final int result = obs.result;
78823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet        Field[] fields = PackageManager.class.getFields();
78923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet        for (Field f: fields) {
79023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet            if (f.getType() == int.class) {
79123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet                int modifiers = f.getModifiers();
79223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet                // only look at public final static fields.
79323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet                if (((modifiers & Modifier.FINAL) != 0) &&
79423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet                        ((modifiers & Modifier.PUBLIC) != 0) &&
79523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet                        ((modifiers & Modifier.STATIC) != 0)) {
79623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet                    String fieldName = f.getName();
79723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet                    if (fieldName.startsWith("INSTALL_FAILED_") ||
79823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet                            fieldName.startsWith("INSTALL_PARSE_FAILED_")) {
79923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet                        // get the int value and compare it to result.
80023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet                        try {
80123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet                            if (result == f.getInt(null)) {
802f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate                                StringBuilder sb = new StringBuilder(64);
803f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate                                sb.append(fieldName);
804f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate                                if (obs.extraPermission != null) {
805f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate                                    sb.append(" perm=");
806f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate                                    sb.append(obs.extraPermission);
807f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate                                }
808f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate                                if (obs.extraPackage != null) {
809f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate                                    sb.append(" pkg=" + obs.extraPackage);
810f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate                                }
811f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate                                return sb.toString();
81223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet                            }
81323b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet                        } catch (IllegalAccessException e) {
81423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet                            // this shouldn't happen since we only look for public static fields.
81523b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet                        }
81623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet                    }
81723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet                }
81823b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet            }
81923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet        }
82023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
82123b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet        // couldn't find a matching constant? return the value
82223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet        return Integer.toString(result);
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
82423b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
82540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu    private void runSetInstallLocation() {
82640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu        int loc;
82740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu
82840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu        String arg = nextArg();
82940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu        if (arg == null) {
83040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            System.err.println("Error: no install location specified.");
83140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            return;
83240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu        }
83340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu        try {
83440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            loc = Integer.parseInt(arg);
83540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu        } catch (NumberFormatException e) {
83640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            System.err.println("Error: install location has to be a number.");
83740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            return;
83840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu        }
83940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu        try {
84040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            if (!mPm.setInstallLocation(loc)) {
84140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu                System.err.println("Error: install location has to be a number.");
84240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            }
84340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu        } catch (RemoteException e) {
84440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            System.err.println(e.toString());
84540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            System.err.println(PM_NOT_RUNNING_ERR);
84640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu        }
84740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu    }
84840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu
84940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu    private void runGetInstallLocation() {
85040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu        try {
85140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            int loc = mPm.getInstallLocation();
85240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            String locStr = "invalid";
85340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            if (loc == PackageHelper.APP_INSTALL_AUTO) {
85440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu                locStr = "auto";
85540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            } else if (loc == PackageHelper.APP_INSTALL_INTERNAL) {
85640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu                locStr = "internal";
85740e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            } else if (loc == PackageHelper.APP_INSTALL_EXTERNAL) {
85840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu                locStr = "external";
85940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            }
86040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            System.out.println(loc + "[" + locStr + "]");
86140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu        } catch (RemoteException e) {
86240e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            System.err.println(e.toString());
86340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu            System.err.println(PM_NOT_RUNNING_ERR);
86440e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu        }
86540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu    }
86640e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void runInstall() {
868e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey        int installFlags = 0;
869dda003ffa84f986bfaba4344124eafa533f5039dAmith Yamasani        int userId = UserHandle.USER_ALL;
870c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski        String installerPackageName = null;
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String opt;
873ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward
874706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        String originatingUriString = null;
875706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        String referrer = null;
876116bdbd823b607d860b039ec334a1f985eed7a7fNarayan Kamath        String abi = null;
877ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while ((opt=nextOption()) != null) {
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (opt.equals("-l")) {
880ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn                installFlags |= PackageManager.INSTALL_FORWARD_LOCK;
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else if (opt.equals("-r")) {
882ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn                installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
883c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski            } else if (opt.equals("-i")) {
884c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski                installerPackageName = nextOptionData();
885c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski                if (installerPackageName == null) {
886c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski                    System.err.println("Error: no value specified for -i");
887c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski                    return;
888c64322c35212e919906ffd66118c7d5d3ad36636Jacek Surazski                }
889ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn            } else if (opt.equals("-t")) {
890ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn                installFlags |= PackageManager.INSTALL_ALLOW_TEST;
891af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu            } else if (opt.equals("-s")) {
8928946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu                // Override if -s option is specified.
8935b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                installFlags |= PackageManager.INSTALL_EXTERNAL;
89414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu            } else if (opt.equals("-f")) {
89514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu                // Override if -s option is specified.
89614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu                installFlags |= PackageManager.INSTALL_INTERNAL;
8977767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn            } else if (opt.equals("-d")) {
8987767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn                installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
899706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings            } else if (opt.equals("--originating-uri")) {
900706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings                originatingUriString = nextOptionData();
901706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings                if (originatingUriString == null) {
902706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings                    System.err.println("Error: must supply argument for --originating-uri");
903706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings                    return;
904706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings                }
905706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings            } else if (opt.equals("--referrer")) {
906706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings                referrer = nextOptionData();
907706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings                if (referrer == null) {
908706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings                    System.err.println("Error: must supply argument for --referrer");
909706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings                    return;
910706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings                }
911116bdbd823b607d860b039ec334a1f985eed7a7fNarayan Kamath            } else if (opt.equals("--abi")) {
912ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey                abi = checkAbiArgument(nextOptionData());
913dda003ffa84f986bfaba4344124eafa533f5039dAmith Yamasani            } else if (opt.equals("--user")) {
914dda003ffa84f986bfaba4344124eafa533f5039dAmith Yamasani                userId = Integer.parseInt(nextOptionData());
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.err.println("Error: Unknown option: " + opt);
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
921e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey        if (userId == UserHandle.USER_ALL) {
922e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey            userId = UserHandle.USER_OWNER;
923e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey            installFlags |= PackageManager.INSTALL_ALL_USERS;
924e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey        }
925e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey
9265ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root        final Uri verificationURI;
927706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        final Uri originatingURI;
928706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        final Uri referrerURI;
929706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
930706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        if (originatingUriString != null) {
931706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings            originatingURI = Uri.parse(originatingUriString);
932706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        } else {
933706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings            originatingURI = null;
934706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        }
935706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
936706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        if (referrer != null) {
937706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings            referrerURI = Uri.parse(referrer);
938706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        } else {
939706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings            referrerURI = null;
940706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings        }
9415ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root
9425ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root        // Populate apkURI, must be present
9435ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root        final String apkFilePath = nextArg();
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.err.println("\tpkg: " + apkFilePath);
945513a074de68a4772a9900e90f38e74ff92c15e7cJeff Sharkey        if (apkFilePath == null) {
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println("Error: no package specified");
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9505ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root        // Populate verificationURI, optionally present
9515ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root        final String verificationFilePath = nextArg();
9525ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root        if (verificationFilePath != null) {
9535ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root            System.err.println("\tver: " + verificationFilePath);
9545ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root            verificationURI = Uri.fromFile(new File(verificationFilePath));
9555ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root        } else {
9565ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root            verificationURI = null;
9575ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root        }
9585ab2157bf1f105b02d3e2913cd3a33f9765b74caKenny Root
959ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        LocalPackageInstallObserver obs = new LocalPackageInstallObserver();
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
961706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings            VerificationParams verificationParams = new VerificationParams(verificationURI,
96237d83a3caf138e35fa1a355787d20c351f6b37a6Ben Gruver                    originatingURI, referrerURI, VerificationParams.NO_UID, null);
963706e8ba26bf0de19ad5f736516dae40c4c88c2d7rich cannings
964e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey            mPm.installPackageAsUser(apkFilePath, obs.getBinder(), installFlags,
965e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey                    installerPackageName, verificationParams, abi, userId);
96623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            synchronized (obs) {
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                while (!obs.finished) {
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    try {
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        obs.wait();
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } catch (InterruptedException e) {
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (obs.result == PackageManager.INSTALL_SUCCEEDED) {
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    System.out.println("Success");
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    System.err.println("Failure ["
978f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate                            + installFailureToString(obs)
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + "]");
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println(e.toString());
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println(PM_NOT_RUNNING_ERR);
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
98723b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
988ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey    private void runInstallCreate() throws RemoteException {
989e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey        int userId = UserHandle.USER_ALL;
990ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        String installerPackageName = null;
991ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
992a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey        final SessionParams params = new SessionParams(SessionParams.MODE_FULL_INSTALL);
993ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
994ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        String opt;
995ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        while ((opt = nextOption()) != null) {
996ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            if (opt.equals("-l")) {
997ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                params.installFlags |= PackageManager.INSTALL_FORWARD_LOCK;
998ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            } else if (opt.equals("-r")) {
999ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                params.installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
1000ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            } else if (opt.equals("-i")) {
1001ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                installerPackageName = nextArg();
1002ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                if (installerPackageName == null) {
1003ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                    throw new IllegalArgumentException("Missing installer package");
1004ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                }
1005ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            } else if (opt.equals("-t")) {
1006ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                params.installFlags |= PackageManager.INSTALL_ALLOW_TEST;
1007ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            } else if (opt.equals("-s")) {
1008ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                params.installFlags |= PackageManager.INSTALL_EXTERNAL;
1009ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            } else if (opt.equals("-f")) {
1010ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                params.installFlags |= PackageManager.INSTALL_INTERNAL;
1011ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            } else if (opt.equals("-d")) {
1012ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                params.installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
1013e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey            } else if (opt.equals("--originating-uri")) {
1014e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey                params.originatingUri = Uri.parse(nextOptionData());
1015e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey            } else if (opt.equals("--referrer")) {
1016e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey                params.referrerUri = Uri.parse(nextOptionData());
1017ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            } else if (opt.equals("-p")) {
1018a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                params.mode = SessionParams.MODE_INHERIT_EXISTING;
1019941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                params.appPackageName = nextOptionData();
1020941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                if (params.appPackageName == null) {
1021941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                    throw new IllegalArgumentException("Missing inherit package name");
1022941a8ba1a6043cf84a7bf622e44a0b4f7abd0178Jeff Sharkey                }
1023ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            } else if (opt.equals("-S")) {
102416c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey                params.setSize(Long.parseLong(nextOptionData()));
1025ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey            } else if (opt.equals("--abi")) {
1026ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey                params.abiOverride = checkAbiArgument(nextOptionData());
1027e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey            } else if (opt.equals("--user")) {
1028e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey                userId = Integer.parseInt(nextOptionData());
1029ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            } else {
1030ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                throw new IllegalArgumentException("Unknown option " + opt);
1031ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            }
1032ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward        }
1033ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward
1034e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey        if (userId == UserHandle.USER_ALL) {
1035e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey            userId = UserHandle.USER_OWNER;
1036e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey            params.installFlags |= PackageManager.INSTALL_ALL_USERS;
1037e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey        }
1038e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey
1039e980804df16c968c14a56b8853886bf5f049f46eJeff Sharkey        final int sessionId = mInstaller.createSession(params, installerPackageName, userId);
1040ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
1041ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        // NOTE: adb depends on parsing this string
1042ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.out.println("Success: created install session [" + sessionId + "]");
1043ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey    }
1044ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
1045ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey    private void runInstallWrite() throws IOException, RemoteException {
1046ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        long sizeBytes = -1;
1047ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
1048ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        String opt;
1049ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        while ((opt = nextOption()) != null) {
1050ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            if (opt.equals("-S")) {
1051ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                sizeBytes = Long.parseLong(nextOptionData());
1052ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            } else {
1053ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                throw new IllegalArgumentException("Unknown option: " + opt);
1054ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            }
1055ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward        }
1056ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward
1057ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        final int sessionId = Integer.parseInt(nextArg());
1058ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        final String splitName = nextArg();
1059ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward
1060ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        String path = nextArg();
1061ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        if ("-".equals(path)) {
1062ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            path = null;
1063ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        } else if (path != null) {
1064ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            final File file = new File(path);
1065ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            if (file.isFile()) {
1066ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                sizeBytes = file.length();
1067ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            }
1068ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward        }
1069ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward
1070a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey        final SessionInfo info = mInstaller.getSessionInfo(sessionId);
10711cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey
1072ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        PackageInstaller.Session session = null;
1073ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        InputStream in = null;
1074ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        OutputStream out = null;
1075ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        try {
1076ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            session = new PackageInstaller.Session(mInstaller.openSession(sessionId));
1077ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
1078ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            if (path != null) {
1079ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                in = new FileInputStream(path);
1080ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            } else {
1081ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                in = new SizedInputStream(System.in, sizeBytes);
1082ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            }
1083ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            out = session.openWrite(splitName, 0, sizeBytes);
1084ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
10851cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            int total = 0;
10861cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            byte[] buffer = new byte[65536];
10871cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            int c;
10881cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            while ((c = in.read(buffer)) != -1) {
10891cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey                total += c;
10901cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey                out.write(buffer, 0, c);
109116c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey
10921cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey                if (info.sizeBytes > 0) {
10931cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey                    final float fraction = ((float) c / (float) info.sizeBytes);
10941cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey                    session.addProgress(fraction);
10951cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey                }
109616c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey            }
10971cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            session.fsync(out);
1098ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
10991cb2d0d4bba387665128c62c342e59103ea4be26Jeff Sharkey            System.out.println("Success: streamed " + total + " bytes");
1100ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        } finally {
1101ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            IoUtils.closeQuietly(out);
1102ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            IoUtils.closeQuietly(in);
1103ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            IoUtils.closeQuietly(session);
1104ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        }
1105ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey    }
1106ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
1107ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey    private void runInstallCommit() throws RemoteException {
1108ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        final int sessionId = Integer.parseInt(nextArg());
1109ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
1110ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        PackageInstaller.Session session = null;
1111ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        try {
1112ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            session = new PackageInstaller.Session(mInstaller.openSession(sessionId));
1113ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
1114a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey            final LocalIntentReceiver receiver = new LocalIntentReceiver();
1115a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey            session.commit(receiver.getIntentSender());
1116ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
1117a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey            final Intent result = receiver.getResult();
1118a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey            final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
1119a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                    PackageInstaller.STATUS_FAILURE);
1120a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey            if (status == PackageInstaller.STATUS_SUCCESS) {
1121a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                System.out.println("Success");
1122a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey            } else {
1123a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                Log.e(TAG, "Failure details: " + result.getExtras());
1124a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                System.out.println("Failure ["
1125a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                        + result.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE) + "]");
1126a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                return;
1127ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            }
1128ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        } finally {
1129ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            IoUtils.closeQuietly(session);
1130ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        }
1131ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey    }
1132ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
113316c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey    private void runInstallAbandon() throws RemoteException {
1134ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        final int sessionId = Integer.parseInt(nextArg());
1135ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
1136ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        PackageInstaller.Session session = null;
1137ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        try {
1138ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            session = new PackageInstaller.Session(mInstaller.openSession(sessionId));
113916c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey            session.abandon();
1140ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            System.out.println("Success");
1141ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        } finally {
1142ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            IoUtils.closeQuietly(session);
1143ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        }
1144ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey    }
1145ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
1146ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey    private void runSetInstaller() throws RemoteException {
1147ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        final String targetPackage = nextArg();
1148ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        final String installerPackageName = nextArg();
1149ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
1150ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        if (targetPackage == null || installerPackageName == null) {
1151ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey            throw new IllegalArgumentException(
1152ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey                    "must provide both target and installer package names");
1153ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        }
1154ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey
1155ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        mPm.setInstallerPackageName(targetPackage, installerPackageName);
1156ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.out.println("Success");
1157ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward    }
1158ceb1b0bfaea56251796b08c07b963de7403d84ebAnonymous Coward
1159483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    public void runCreateUser() {
11600b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        String name;
11612a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy        int userId = -1;
116231d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy        int flags = 0;
116331d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy        String opt;
116431d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy        while ((opt = nextOption()) != null) {
11652a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy            if ("--profileOf".equals(opt)) {
116631d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy                String optionData = nextOptionData();
116731d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy                if (optionData == null || !isNumber(optionData)) {
116831d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy                    System.err.println("Error: no USER_ID specified");
116931d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy                    showUsage();
117031d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy                    return;
117131d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy                } else {
11722a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy                    userId = Integer.parseInt(optionData);
117331d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy                }
117431d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy            } else if ("--managed".equals(opt)) {
117531d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy                flags |= UserInfo.FLAG_MANAGED_PROFILE;
117631d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy            } else {
117731d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy                System.err.println("Error: unknown option " + opt);
117831d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy                showUsage();
117931d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy                return;
118031d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy            }
118131d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy        }
11820b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        String arg = nextArg();
11830b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        if (arg == null) {
11840b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani            System.err.println("Error: no user name specified.");
11850b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani            return;
11860b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        }
11870b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        name = arg;
11880b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        try {
118931d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy            UserInfo info = null;
11902a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy            if (userId < 0) {
119131d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy                info = mUm.createUser(name, flags);
119231d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy            } else {
11932a764949c943681a4d25a17a0b203a0127a4a486Kenny Guy                info = mUm.createProfileForUser(name, flags, userId);
119431d6776a9225be5d4ae521a5b551f413c9481aa3Kenny Guy            }
1195e6d3ccc99270aaf62808adc7475a25d96664f0fbJeff Sharkey            if (info != null) {
1196e6d3ccc99270aaf62808adc7475a25d96664f0fbJeff Sharkey                System.out.println("Success: created user id " + info.id);
1197e6d3ccc99270aaf62808adc7475a25d96664f0fbJeff Sharkey            } else {
1198483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                System.err.println("Error: couldn't create User.");
11990b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani            }
12000b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        } catch (RemoteException e) {
12010b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani            System.err.println(e.toString());
12020b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani            System.err.println(PM_NOT_RUNNING_ERR);
12030b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        }
12040b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani
12050b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani    }
12060b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani
1207483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    public void runRemoveUser() {
12080b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        int userId;
12090b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        String arg = nextArg();
12100b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        if (arg == null) {
12110b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani            System.err.println("Error: no user id specified.");
12120b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani            return;
12130b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        }
12140b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        try {
12150b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani            userId = Integer.parseInt(arg);
12160b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        } catch (NumberFormatException e) {
1217786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn            System.err.println("Error: user id '" + arg + "' is not a number.");
12180b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani            return;
12190b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        }
12200b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        try {
12214c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey            if (mUm.removeUser(userId)) {
12224c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey                System.out.println("Success: removed user");
12234c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey            } else {
12244c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey                System.err.println("Error: couldn't remove user id " + userId);
12250b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani            }
12260b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        } catch (RemoteException e) {
12270b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani            System.err.println(e.toString());
12280b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani            System.err.println(PM_NOT_RUNNING_ERR);
12290b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani        }
12300b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani    }
12310b285499db739ba50f2f839d633e763c70e67f96Amith Yamasani
1232483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    public void runListUsers() {
1233742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        try {
12346143a02f96a5c6c7a0a84f5dbe70732998256a72Kenny Guy            IActivityManager am = ActivityManagerNative.getDefault();
12356143a02f96a5c6c7a0a84f5dbe70732998256a72Kenny Guy
1236920ace0bbc2d4133dbec991d2636c99a57d6245eAmith Yamasani            List<UserInfo> users = mUm.getUsers(false);
1237742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            if (users == null) {
1238742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                System.err.println("Error: couldn't get users");
1239742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            } else {
1240742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                System.out.println("Users:");
1241742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                for (int i = 0; i < users.size(); i++) {
12426143a02f96a5c6c7a0a84f5dbe70732998256a72Kenny Guy                    String running = am.isUserRunning(users.get(i).id, false) ? " running" : "";
12436143a02f96a5c6c7a0a84f5dbe70732998256a72Kenny Guy                    System.out.println("\t" + users.get(i).toString() + running);
1244742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani                }
1245742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            }
1246742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        } catch (RemoteException e) {
1247742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            System.err.println(e.toString());
1248742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani            System.err.println(PM_NOT_RUNNING_ERR);
1249742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani        }
1250742a67127366c376fdf188ff99ba30b27d3bf90cAmith Yamasani    }
12514c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey
12524c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey    public void runGetMaxUsers() {
12534c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey        System.out.println("Maximum supported users: " + UserManager.getMaxSupportedUsers());
12544c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey    }
12554c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey
125620e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey    public void runForceDexOpt() {
125720e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey        final String packageName = nextArg();
125820e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey        try {
125920e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey            mPm.forceDexOpt(packageName);
126020e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey        } catch (RemoteException e) {
126120e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey            throw e.rethrowAsRuntimeException();
126220e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey        }
126320e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey    }
126420e0c50f601e5930a246d4556118423a49c12ca1Jeff Sharkey
1265a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey    private void runUninstall() throws RemoteException {
1266a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey        int flags = 0;
12671bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy        int userId = UserHandle.USER_ALL;
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12695e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn        String opt;
12705e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn        while ((opt=nextOption()) != null) {
12715e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn            if (opt.equals("-k")) {
1272a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                flags |= PackageManager.DELETE_KEEP_DATA;
12731bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy            } else if (opt.equals("--user")) {
12741bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy                String param = nextArg();
12751bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy                if (isNumber(param)) {
12761bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy                    userId = Integer.parseInt(param);
12771bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy                } else {
12781bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy                    showUsage();
12791bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy                    System.err.println("Error: Invalid user: " + param);
12801bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy                    return;
12811bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy                }
12825e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn            } else {
12835e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn                System.err.println("Error: Unknown option: " + opt);
12845e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn                return;
12855e03e2ca7d25b899b129baad2dd5eca6bf99d88aDianne Hackborn            }
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkg = nextArg();
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg == null) {
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println("Error: no package specified");
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            showUsage();
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12941bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy
12951bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy        if (userId == UserHandle.USER_ALL) {
12961bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy            userId = UserHandle.USER_OWNER;
1297a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey            flags |= PackageManager.DELETE_ALL_USERS;
12981bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy        } else {
12991bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy            PackageInfo info;
13001bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy            try {
13011bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy                info = mPm.getPackageInfo(pkg, 0, userId);
13021bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy            } catch (RemoteException e) {
13031bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy                System.err.println(e.toString());
13041bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy                System.err.println(PM_NOT_RUNNING_ERR);
13051bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy                return;
13061bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy            }
13071bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy            if (info == null) {
13081bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy                System.err.println("Failure - not installed for " + userId);
13091bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy                return;
13101bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy            }
13111bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy            final boolean isSystem =
13121bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy                    (info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
13131bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy            // If we are being asked to delete a system app for just one
13141bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy            // user set flag so it disables rather than reverting to system
13151bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy            // version of the app.
13161bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy            if (isSystem) {
1317a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                flags |= PackageManager.DELETE_SYSTEM_APP;
13181bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy            }
13191bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy        }
13201bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy
1321a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey        final LocalIntentReceiver receiver = new LocalIntentReceiver();
1322a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey        mInstaller.uninstall(pkg, flags, receiver.getIntentSender(), userId);
1323a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey
1324a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey        final Intent result = receiver.getResult();
1325a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey        final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
1326a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                PackageInstaller.STATUS_FAILURE);
1327a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey        if (status == PackageInstaller.STATUS_SUCCESS) {
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.out.println("Success");
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1330a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey            Log.e(TAG, "Failure details: " + result.getExtras());
1331a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey            System.out.println("Failure ["
1332a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                    + result.getStringExtra(PackageInstaller.EXTRA_STATUS_MESSAGE) + "]");
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1336197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn    static class ClearDataObserver extends IPackageDataObserver.Stub {
1337690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn        boolean finished;
1338690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn        boolean result;
1339690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn
1340690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn        @Override
1341690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn        public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException {
1342690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn            synchronized (this) {
1343690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn                finished = true;
1344690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn                result = succeeded;
1345690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn                notifyAll();
1346690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn            }
1347690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn        }
1348690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn    }
1349690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn
1350690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn    private void runClear() {
1351a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey        int userId = 0;
1352a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey        String option = nextOption();
1353a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey        if (option != null && option.equals("--user")) {
1354a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey            String optionData = nextOptionData();
1355a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey            if (optionData == null || !isNumber(optionData)) {
1356a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey                System.err.println("Error: no USER_ID specified");
1357a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey                showUsage();
1358a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey                return;
1359a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey            } else {
1360a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey                userId = Integer.parseInt(optionData);
1361a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey            }
1362a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey        }
1363a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey
1364690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn        String pkg = nextArg();
1365690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn        if (pkg == null) {
1366690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn            System.err.println("Error: no package specified");
1367690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn            showUsage();
1368690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn            return;
1369690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn        }
1370690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn
1371690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn        ClearDataObserver obs = new ClearDataObserver();
1372690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn        try {
1373a83cab0001ca4d90abe622c22a7af1b0da54f739Christopher Tate            ActivityManagerNative.getDefault().clearApplicationUserData(pkg, obs, userId);
1374690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn            synchronized (obs) {
1375690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn                while (!obs.finished) {
1376690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn                    try {
1377690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn                        obs.wait();
1378690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn                    } catch (InterruptedException e) {
1379690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn                    }
1380690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn                }
1381690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn            }
1382690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn
1383690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn            if (obs.result) {
1384690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn                System.err.println("Success");
1385690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn            } else {
1386690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn                System.err.println("Failed");
1387690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn            }
1388690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn        } catch (RemoteException e) {
1389690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn            System.err.println(e.toString());
1390690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn            System.err.println(PM_NOT_RUNNING_ERR);
1391690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn        }
1392690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn    }
1393690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static String enabledSettingToString(int state) {
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (state) {
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case PackageManager.COMPONENT_ENABLED_STATE_DEFAULT:
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "default";
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case PackageManager.COMPONENT_ENABLED_STATE_ENABLED:
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "enabled";
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case PackageManager.COMPONENT_ENABLED_STATE_DISABLED:
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return "disabled";
14020ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn            case PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER:
14030ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn                return "disabled-user";
1404fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn            case PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED:
1405fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn                return "disabled-until-used";
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "unknown";
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
140923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
1410a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey    private static boolean isNumber(String s) {
1411483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        try {
1412483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            Integer.parseInt(s);
1413483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        } catch (NumberFormatException nfe) {
1414483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            return false;
1415483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
1416483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        return true;
1417483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani    }
1418483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void runSetEnabledSetting(int state) {
1420483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        int userId = 0;
1421483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        String option = nextOption();
1422483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        if (option != null && option.equals("--user")) {
1423483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            String optionData = nextOptionData();
1424483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            if (optionData == null || !isNumber(optionData)) {
1425483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                System.err.println("Error: no USER_ID specified");
1426483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                showUsage();
1427483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                return;
1428483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            } else {
1429483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                userId = Integer.parseInt(optionData);
1430483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            }
1431483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani        }
1432483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String pkg = nextArg();
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pkg == null) {
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println("Error: no package or component specified");
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            showUsage();
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ComponentName cn = ComponentName.unflattenFromString(pkg);
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (cn == null) {
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
14423fa3c28a356108a6558b6b54a0b10e1a5cc4f1b6Dianne Hackborn                mPm.setApplicationEnabledSetting(pkg, state, 0, userId,
14433fa3c28a356108a6558b6b54a0b10e1a5cc4f1b6Dianne Hackborn                        "shell:" + android.os.Process.myUid());
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.err.println("Package " + pkg + " new state: "
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + enabledSettingToString(
1446483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        mPm.getApplicationEnabledSetting(pkg, userId)));
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.err.println(e.toString());
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.err.println(PM_NOT_RUNNING_ERR);
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
1453483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                mPm.setComponentEnabledSetting(cn, state, 0, userId);
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.err.println("Component " + cn.toShortString() + " new state: "
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + enabledSettingToString(
1456483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani                        mPm.getComponentEnabledSetting(cn, userId)));
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (RemoteException e) {
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.err.println(e.toString());
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.err.println(PM_NOT_RUNNING_ERR);
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1464e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani    private void runSetHiddenSetting(boolean state) {
1465655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        int userId = 0;
1466655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        String option = nextOption();
1467655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        if (option != null && option.equals("--user")) {
1468655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani            String optionData = nextOptionData();
1469655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani            if (optionData == null || !isNumber(optionData)) {
1470655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani                System.err.println("Error: no USER_ID specified");
1471655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani                showUsage();
1472655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani                return;
1473655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani            } else {
1474655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani                userId = Integer.parseInt(optionData);
1475655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani            }
1476655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        }
1477655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani
1478655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        String pkg = nextArg();
1479655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        if (pkg == null) {
1480655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani            System.err.println("Error: no package or component specified");
1481655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani            showUsage();
1482655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani            return;
1483655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        }
1484655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        try {
1485e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani            mPm.setApplicationHiddenSettingAsUser(pkg, state, userId);
1486e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani            System.err.println("Package " + pkg + " new hidden state: "
1487e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani                    + mPm.getApplicationHiddenSettingAsUser(pkg, userId));
1488655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        } catch (RemoteException e) {
1489655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani            System.err.println(e.toString());
1490655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani            System.err.println(PM_NOT_RUNNING_ERR);
1491655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani        }
1492655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani    }
1493655d0e2029e6ae77a47e922dce4c4989818b8dd1Amith Yamasani
1494e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    private void runGrantRevokePermission(boolean grant) {
1495e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        String pkg = nextArg();
1496e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        if (pkg == null) {
1497e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            System.err.println("Error: no package specified");
1498e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            showUsage();
1499e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            return;
1500e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        }
1501e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        String perm = nextArg();
1502e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        if (perm == null) {
1503e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            System.err.println("Error: no permission specified");
1504e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            showUsage();
1505e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            return;
1506e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        }
1507e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        try {
1508e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            if (grant) {
1509e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                mPm.grantPermission(pkg, perm);
1510e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            } else {
1511e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn                mPm.revokePermission(pkg, perm);
1512e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            }
1513e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        } catch (RemoteException e) {
1514e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            System.err.println(e.toString());
1515e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            System.err.println(PM_NOT_RUNNING_ERR);
1516e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        } catch (IllegalArgumentException e) {
1517e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            System.err.println("Bad argument: " + e.toString());
1518e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            showUsage();
1519e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        } catch (SecurityException e) {
1520e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn            System.err.println("Operation not allowed: " + e.toString());
1521e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        }
1522e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn    }
1523e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn
1524719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey    private void runSetPermissionEnforced() {
1525719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey        final String permission = nextArg();
1526719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey        if (permission == null) {
1527719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey            System.err.println("Error: no permission specified");
1528719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey            showUsage();
1529719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey            return;
1530719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey        }
1531719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey        final String enforcedRaw = nextArg();
1532719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey        if (enforcedRaw == null) {
1533719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey            System.err.println("Error: no enforcement specified");
1534719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey            showUsage();
1535719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey            return;
1536719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey        }
1537719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey        final boolean enforced = Boolean.parseBoolean(enforcedRaw);
1538719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey        try {
1539719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey            mPm.setPermissionEnforced(permission, enforced);
1540719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey        } catch (RemoteException e) {
1541719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey            System.err.println(e.toString());
1542719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey            System.err.println(PM_NOT_RUNNING_ERR);
1543719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey        } catch (IllegalArgumentException e) {
1544719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey            System.err.println("Bad argument: " + e.toString());
1545719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey            showUsage();
1546719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey        } catch (SecurityException e) {
1547719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey            System.err.println("Operation not allowed: " + e.toString());
1548719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey        }
1549719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey    }
1550719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey
1551197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn    static class ClearCacheObserver extends IPackageDataObserver.Stub {
1552197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        boolean finished;
1553197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        boolean result;
1554197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn
1555197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        @Override
1556197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException {
1557197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            synchronized (this) {
1558197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn                finished = true;
1559197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn                result = succeeded;
1560197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn                notifyAll();
1561197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            }
1562197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        }
1563197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn
1564197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn    }
1565197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn
1566197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn    private void runTrimCaches() {
1567197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        String size = nextArg();
1568197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        if (size == null) {
1569197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            System.err.println("Error: no size specified");
1570197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            showUsage();
1571197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            return;
1572197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        }
1573197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        int len = size.length();
1574197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        long multiplier = 1;
1575197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        if (len > 1) {
1576197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            char c = size.charAt(len-1);
1577197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            if (c == 'K' || c == 'k') {
1578197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn                multiplier = 1024L;
1579197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            } else if (c == 'M' || c == 'm') {
1580197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn                multiplier = 1024L*1024L;
1581197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            } else if (c == 'G' || c == 'g') {
1582197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn                multiplier = 1024L*1024L*1024L;
1583197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            } else {
1584197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn                System.err.println("Invalid suffix: " + c);
1585197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn                showUsage();
1586197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn                return;
1587197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            }
1588197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            size = size.substring(0, len-1);
1589197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        }
1590197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        long sizeVal;
1591197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        try {
1592197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            sizeVal = Long.parseLong(size) * multiplier;
1593197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        } catch (NumberFormatException e) {
1594197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            System.err.println("Error: expected number at: " + size);
1595197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            showUsage();
1596197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            return;
1597197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        }
1598197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        ClearDataObserver obs = new ClearDataObserver();
1599197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        try {
1600197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            mPm.freeStorageAndNotify(sizeVal, obs);
1601197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            synchronized (obs) {
1602197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn                while (!obs.finished) {
1603197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn                    try {
1604197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn                        obs.wait();
1605197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn                    } catch (InterruptedException e) {
1606197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn                    }
1607197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn                }
1608197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            }
1609197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        } catch (RemoteException e) {
1610197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            System.err.println(e.toString());
1611197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            System.err.println(PM_NOT_RUNNING_ERR);
1612197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        } catch (IllegalArgumentException e) {
1613197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            System.err.println("Bad argument: " + e.toString());
1614197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            showUsage();
1615197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        } catch (SecurityException e) {
1616197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn            System.err.println("Operation not allowed: " + e.toString());
1617197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        }
1618197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn    }
1619197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Displays the package file for a package.
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param pckg
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void displayPackageFilePath(String pckg) {
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1626483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            PackageInfo info = mPm.getPackageInfo(pckg, 0, 0);
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (info != null && info.applicationInfo != null) {
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.print("package:");
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.out.println(info.applicationInfo.sourceDir);
16308a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey                if (!ArrayUtils.isEmpty(info.applicationInfo.splitSourceDirs)) {
16318a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey                    for (String splitSourceDir : info.applicationInfo.splitSourceDirs) {
16328a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey                        System.out.print("package:");
16338a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey                        System.out.println(splitSourceDir);
16348a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey                    }
16358a4c9721a9e09d20c63381c13fa29bd9f7cbc3e3Jeff Sharkey                }
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println(e.toString());
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println(PM_NOT_RUNNING_ERR);
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
164223b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private Resources getResources(PackageItemInfo pii) {
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Resources res = mResourceCache.get(pii.packageName);
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (res != null) return res;
164623b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
1648483f3b06ea84440a082e21b68ec2c2e54046f5a6Amith Yamasani            ApplicationInfo ai = mPm.getApplicationInfo(pii.packageName, 0, 0);
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            AssetManager am = new AssetManager();
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            am.addAssetPath(ai.publicSourceDir);
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            res = new Resources(am, null, null);
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mResourceCache.put(pii.packageName, res);
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return res;
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println(e.toString());
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            System.err.println(PM_NOT_RUNNING_ERR);
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
166023b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet
1661ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey    private static String checkAbiArgument(String abi) {
1662ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey        if (TextUtils.isEmpty(abi)) {
1663ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey            throw new IllegalArgumentException("Missing ABI argument");
1664ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey        }
1665ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey
16664903f64ba2478849e6c401f42f5a77c1d4f9f7dfNarayan Kamath        if ("-".equals(abi)) {
16674903f64ba2478849e6c401f42f5a77c1d4f9f7dfNarayan Kamath            return abi;
16684903f64ba2478849e6c401f42f5a77c1d4f9f7dfNarayan Kamath        }
16694903f64ba2478849e6c401f42f5a77c1d4f9f7dfNarayan Kamath
1670ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey        final String[] supportedAbis = Build.SUPPORTED_ABIS;
1671ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey        for (String supportedAbi : supportedAbis) {
1672ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey            if (supportedAbi.equals(abi)) {
1673ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey                return abi;
1674ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey            }
1675ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey        }
1676ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey
1677ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey        throw new IllegalArgumentException("ABI " + abi + " not supported on this device");
1678ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey    }
1679ad11eb52fe62b6696df2194cb9e176f7d799e844Jeff Sharkey
1680a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey    private static class LocalIntentReceiver {
1681a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey        private final SynchronousQueue<Intent> mResult = new SynchronousQueue<>();
1682a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey
1683a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey        private IIntentSender.Stub mLocalSender = new IIntentSender.Stub() {
1684a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey            @Override
1685a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey            public int send(int code, Intent intent, String resolvedType,
1686a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                    IIntentReceiver finishedReceiver, String requiredPermission) {
1687a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                try {
1688a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                    mResult.offer(intent, 5, TimeUnit.SECONDS);
1689a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                } catch (InterruptedException e) {
1690a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                    throw new RuntimeException(e);
1691a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                }
1692a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey                return 0;
1693a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey            }
1694a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey        };
1695a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey
1696a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey        public IntentSender getIntentSender() {
1697a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey            return new IntentSender((IIntentSender) mLocalSender);
1698a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey        }
1699a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey
1700a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey        public Intent getResult() {
17015ab6e0bac2de1688f2f4bb0de2c9964a9b15a4e6Jeff Sharkey            try {
17025ab6e0bac2de1688f2f4bb0de2c9964a9b15a4e6Jeff Sharkey                return mResult.take();
17035ab6e0bac2de1688f2f4bb0de2c9964a9b15a4e6Jeff Sharkey            } catch (InterruptedException e) {
17045ab6e0bac2de1688f2f4bb0de2c9964a9b15a4e6Jeff Sharkey                throw new RuntimeException(e);
17055ab6e0bac2de1688f2f4bb0de2c9964a9b15a4e6Jeff Sharkey            }
1706a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey        }
1707a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey    }
1708a0907436c01fd8c545a6b5c7b28bc3bc9db59270Jeff Sharkey
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String nextOption() {
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mNextArg >= mArgs.length) {
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String arg = mArgs[mNextArg];
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!arg.startsWith("-")) {
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNextArg++;
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (arg.equals("--")) {
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (arg.length() > 1 && arg.charAt(1) != '-') {
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (arg.length() > 2) {
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCurArgData = arg.substring(2);
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return arg.substring(0, 2);
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCurArgData = null;
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return arg;
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mCurArgData = null;
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return arg;
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String nextOptionData() {
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mCurArgData != null) {
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurArgData;
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mNextArg >= mArgs.length) {
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String data = mArgs[mNextArg];
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNextArg++;
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private String nextArg() {
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mNextArg >= mArgs.length) {
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return null;
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        String arg = mArgs[mNextArg];
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mNextArg++;
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return arg;
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static void showUsage() {
1756151ec4c9f8ca34625733730a4551a23eb97cda23Amith Yamasani        System.err.println("usage: pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]");
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.err.println("       pm list permission-groups");
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.err.println("       pm list permissions [-g] [-f] [-d] [-u] [GROUP]");
175923b4faf69437b732d681d9bee5c9a84379d5ccadXavier Ducrohet        System.err.println("       pm list instrumentation [-f] [TARGET-PACKAGE]");
1760039c68e75606e837cf021815a0210836724574adDianne Hackborn        System.err.println("       pm list features");
1761e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        System.err.println("       pm list libraries");
17627e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn        System.err.println("       pm list users");
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.err.println("       pm path PACKAGE");
1764cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        System.err.println("       pm dump PACKAGE");
1765ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("       pm install [-lrtsfd] [-i PACKAGE] [PATH]");
1766ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("       pm install-create [-lrtsfdp] [-i PACKAGE] [-S BYTES]");
1767ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("       pm install-write [-S BYTES] SESSION_ID SPLIT_NAME [PATH]");
1768ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("       pm install-commit SESSION_ID");
176916c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey        System.err.println("       pm install-abandon SESSION_ID");
17701bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy        System.err.println("       pm uninstall [-k] [--user USER_ID] PACKAGE");
1771ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("       pm set-installer PACKAGE INSTALLER");
1772a3e9ff7debde50f6b58ebc3033cbbad650c10ac7Jeff Sharkey        System.err.println("       pm clear [--user USER_ID] PACKAGE");
17737e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn        System.err.println("       pm enable [--user USER_ID] PACKAGE_OR_COMPONENT");
17747e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn        System.err.println("       pm disable [--user USER_ID] PACKAGE_OR_COMPONENT");
17757e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn        System.err.println("       pm disable-user [--user USER_ID] PACKAGE_OR_COMPONENT");
1776fd7adedebf88427162a3ce27fcc9cfd3893c869dDianne Hackborn        System.err.println("       pm disable-until-used [--user USER_ID] PACKAGE_OR_COMPONENT");
1777e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani        System.err.println("       pm hide [--user USER_ID] PACKAGE_OR_COMPONENT");
1778e5bcff624fb58b6f95be8ddff7f5b6b3bf5d19c7Amith Yamasani        System.err.println("       pm unhide [--user USER_ID] PACKAGE_OR_COMPONENT");
1779e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        System.err.println("       pm grant PACKAGE PERMISSION");
1780e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        System.err.println("       pm revoke PACKAGE PERMISSION");
178146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("       pm set-install-location [0/auto] [1/internal] [2/external]");
178246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("       pm get-install-location");
1783719a6320a789e76566d6416d5ec35491d21f5c44Jeff Sharkey        System.err.println("       pm set-permission-enforced PERMISSION [true|false]");
1784197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        System.err.println("       pm trim-caches DESIRED_FREE_SPACE");
17851bdbd4be02aec4fd164ba41c164735639b9c7e15Kenny Guy        System.err.println("       pm create-user [--profileOf USER_ID] [--managed] USER_NAME");
17867e0e19d4201374d72b7082492bd269dbdb17d972Dianne Hackborn        System.err.println("       pm remove-user USER_ID");
17874c76ea6b88fad2b0147c050c02c6fd3d886d6743Jeff Sharkey        System.err.println("       pm get-max-users");
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.err.println("");
178946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("pm list packages: prints all packages, optionally only");
179046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("  those whose package name contains the text in FILTER.  Options:");
179146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    -f: see their associated file.");
179246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    -d: filter to only show disbled packages.");
179346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    -e: filter to only show enabled packages.");
179446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    -s: filter to only show system packages.");
179546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    -3: filter to only show third party packages.");
179692a208c6d3e0fdae54bbc942e7e041e48812bcaaAshish Sharma        System.err.println("    -i: see the installer for the packages.");
179746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    -u: also include uninstalled packages.");
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.err.println("");
179946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("pm list permission-groups: prints all known permission groups.");
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.err.println("");
180146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("pm list permissions: prints all known permissions, optionally only");
180246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("  those in GROUP.  Options:");
180346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    -g: organize by group.");
180446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    -f: print all information.");
180546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    -s: short summary.");
180646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    -d: only list dangerous permissions.");
180746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    -u: list only the permissions users will see.");
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.err.println("");
180946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("pm list instrumentation: use to list all test packages; optionally");
181046d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("  supply <TARGET-PACKAGE> to list the test packages for a particular");
181146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("  application.  Options:");
181246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    -f: list the .apk file for the test package.");
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.err.println("");
181446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("pm list features: prints all features of the system.");
1815039c68e75606e837cf021815a0210836724574adDianne Hackborn        System.err.println("");
1816786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn        System.err.println("pm list users: prints all users on the system.");
1817786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn        System.err.println("");
181846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("pm path: print the path to the .apk of the given PACKAGE.");
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.err.println("");
1820ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("pm dump: print system state associated with the given PACKAGE.");
1821ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("");
1822ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("pm install: install a single legacy package");
1823ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("pm install-create: create an install session");
1824ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("    -l: forward lock application");
1825ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("    -r: replace existing application");
1826ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("    -t: allow test packages");
1827ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("    -i: specify the installer package name");
1828ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("    -s: install application on sdcard");
1829ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("    -f: install application on internal flash");
1830ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("    -d: allow version code downgrade");
1831ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("    -p: partial application install");
1832ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("    -S: size in bytes of entire session");
1833ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("");
1834ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("pm install-write: write a package into existing session; path may");
1835ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("  be '-' to read from stdin");
1836ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("    -S: size in bytes of package, required for stdin");
1837cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        System.err.println("");
1838ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("pm install-commit: perform install of fully staged session");
183916c8e3f49497b6046972ae650772f65768366be8Jeff Sharkey        System.err.println("pm install-abandon: abandon session");
1840ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("");
1841ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("pm set-installer: set installer package name");
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.err.println("");
184346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("pm uninstall: removes a package from the system. Options:");
184446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    -k: keep the data and cache directories around after package removal.");
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        System.err.println("");
184646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("pm clear: deletes all data associated with a package.");
1847690d20bb53ba2485f59d128b365eff991d5cc3e6Dianne Hackborn        System.err.println("");
184850707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn        System.err.println("pm enable, disable, disable-user, disable-until-used: these commands");
184950707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn        System.err.println("  change the enabled state of a given package or component (written");
185050707cc8206f0d257ba83de2f1f99c3eaa13a4bdDianne Hackborn        System.err.println("  as \"package/class\").");
185140e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu        System.err.println("");
1852e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        System.err.println("pm grant, revoke: these commands either grant or revoke permissions");
1853e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        System.err.println("  to applications.  Only optional permissions the application has");
1854e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        System.err.println("  declared can be granted or revoked.");
1855e639da7baa23121e35aa06d6e182558e0e755696Dianne Hackborn        System.err.println("");
185646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("pm get-install-location: returns the current install location.");
185746d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    0 [auto]: Let system decide the best location");
185846d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    1 [internal]: Install on internal device storage");
185946d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    2 [external]: Install on external media");
186040e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu        System.err.println("");
186146d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("pm set-install-location: changes the default install location.");
186246d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("  NOTE: this is only intended for debugging; using this can cause");
186346d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("  applications to break and other undersireable behavior.");
186446d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    0 [auto]: Let system decide the best location");
186546d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    1 [internal]: Install on internal device storage");
186646d110329e659cc9cb9514e220ce273701eb151dDianne Hackborn        System.err.println("    2 [external]: Install on external media");
1867197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        System.err.println("");
1868197a0c82a1fbf337ec0a85d36b6b89c3d6e8a0acDianne Hackborn        System.err.println("pm trim-caches: trim cache files to reach the given free space.");
1869786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn        System.err.println("");
1870786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn        System.err.println("pm create-user: create a new user with the given USER_NAME,");
1871786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn        System.err.println("  printing the new user identifier of the user.");
1872786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn        System.err.println("");
1873786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn        System.err.println("pm remove-user: remove the user with the given USER_IDENTIFIER,");
1874786b44046a79d6c4c9cd07f5989d491c7196ad80Dianne Hackborn        System.err.println("  deleting all data associated with that user");
1875ec55ef0934b8e0d1bb705434947de817f7be57f1Jeff Sharkey        System.err.println("");
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1878