InstalledAppDetails.java revision 8e1b0fb77ce50ddc99a596da48b65190e2708362
1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * use this file except in compliance with the License. You may obtain a copy
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * of the License at
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * License for the specific language governing permissions and limitations
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * under the License.
17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings;
20afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
21afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport com.android.settings.R;
22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity;
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.ActivityManager;
24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.AlertDialog;
2550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.app.Dialog;
26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageDataObserver;
3250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.IPackageDeleteObserver;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageStatsObserver;
3450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.content.pm.PackageInfo;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageStats;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message;
4250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapuimport android.os.RemoteException;
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Config;
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.ComponentName;
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions;
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView;
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout;
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities.
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0.
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option.
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application.
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpublic class InstalledAppDetails extends Activity implements View.OnClickListener, DialogInterface.OnClickListener  {
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String TAG="InstalledAppDetails";
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int _UNKNOWN_APP=R.string.unknown;
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ApplicationInfo mAppInfo;
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mAppButton;
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mActivitiesButton;
7150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private boolean localLOGV = false;
7250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private TextView mAppVersion;
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mTotalSize;
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mAppSize;
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mDataSize;
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PkgSizeObserver mSizeObserver;
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearUserDataObserver mClearDataObserver;
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Views related to cache info
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private View mCachePanel;
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mCacheSize;
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mClearCacheButton;
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearCacheObserver mClearCacheObserver;
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mForceStopButton;
84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    PackageStats mSizeInfo;
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mManageSpaceButton;
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PackageManager mPm;
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    //internal constants used in Handler
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_SUCCESSFUL = 1;
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_FAILED = 2;
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_USER_DATA = 1;
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int GET_PKG_SIZE = 2;
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_CACHE = 3;
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String ATTR_PACKAGE_STATS="PackageStats";
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // invalid size value used initially and also when size retrieval through PackageManager
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // fails for whatever reason
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int SIZE_INVALID = -1;
100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Resource strings
102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mInvalidSizeStr;
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingStr;
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mAppButtonText;
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
10650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Dialog identifiers used in showDialog
10750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_BASE = 0;
10850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CLEAR_DATA = DLG_BASE + 1;
10950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_FACTORY_RESET = DLG_BASE + 2;
11050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_APP_NOT_FOUND = DLG_BASE + 3;
11150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private static final int DLG_CANNOT_CLEAR_DATA = DLG_BASE + 4;
11250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Possible btn states
114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private enum AppButtonStates {
115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        CLEAR_DATA,
116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        UNINSTALL,
11750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        FACTORY_RESET,
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        NONE
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private AppButtonStates mAppButtonState;
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Handler mHandler = new Handler() {
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void handleMessage(Message msg) {
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            switch (msg.what) {
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_USER_DATA:
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    processClearMsg(msg);
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case GET_PKG_SIZE:
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    refreshSizeInfo(msg);
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_CACHE:
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    // Refresh size info
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                default:
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearUserDataObserver extends IPackageDataObserver.Stub {
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project       public void onRemoveCompleted(final String packageName, final boolean succeeded) {
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           mHandler.sendMessage(msg);
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class PkgSizeObserver extends IPackageStatsObserver.Stub {
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public int idx;
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) {
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             Message msg = mHandler.obtainMessage(GET_PKG_SIZE);
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             Bundle data = new Bundle();
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             data.putParcelable(ATTR_PACKAGE_STATS, pStats);
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             msg.setData(data);
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mHandler.sendMessage(msg);
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
16050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearCacheObserver extends IPackageDataObserver.Stub {
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mHandler.sendMessage(msg);
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String getSizeStr(long size) {
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (size == SIZE_INVALID) {
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return mInvalidSizeStr.toString();
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return Formatter.formatFileSize(this, size);
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle icicle) {
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
18050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get package manager
181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPm = getPackageManager();
18250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application's name from intent
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = getIntent();
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final String packageName = intent.getStringExtra(ManageApplications.APP_PKG_NAME);
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mComputingStr = getText(R.string.computing_size);
186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Try retrieving package stats again
187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        CharSequence totalSizeStr, appSizeStr, dataSizeStr;
188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        totalSizeStr = appSizeStr = dataSizeStr = mComputingStr;
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "Have to compute package sizes");
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mSizeObserver = new PkgSizeObserver();
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        try {
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppInfo = mPm.getApplicationInfo(packageName,
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    PackageManager.GET_UNINSTALLED_PACKAGES);
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } catch (NameNotFoundException e) {
195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.e(TAG, "Exception when retrieving package:"+packageName, e);
19650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            showDialogInner(DLG_APP_NOT_FOUND);
19750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return;
198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
19950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setContentView(R.layout.installed_app_details);
200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        //TODO download str and download url
20150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Set default values on sizes
202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTotalSize = (TextView)findViewById(R.id.total_size_text);
203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTotalSize.setText(totalSizeStr);
204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppSize = (TextView)findViewById(R.id.application_size_text);
205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppSize.setText(appSizeStr);
206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDataSize = (TextView)findViewById(R.id.data_size_text);
207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDataSize.setText(dataSizeStr);
20850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Get AppButton
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mAppButton = ((Button)findViewById(R.id.uninstall_button));
21050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Get ManageSpaceButton
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mManageSpaceButton = (Button)findViewById(R.id.manage_space_button);
212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(mAppInfo.manageSpaceActivityName != null) {
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mManageSpaceButton.setVisibility(View.VISIBLE);
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mManageSpaceButton.setOnClickListener(this);
215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         // Cache section
217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mCachePanel = findViewById(R.id.cache_panel);
218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mCacheSize = (TextView) findViewById(R.id.cache_size_text);
219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mCacheSize.setText(mComputingStr);
220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mClearCacheButton = (Button) findViewById(R.id.clear_cache_button);
221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mForceStopButton = (Button) findViewById(R.id.force_stop_button);
222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mForceStopButton.setOnClickListener(this);
22350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Get list of preferred activities
224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mActivitiesButton = (Button)findViewById(R.id.clear_activities_button);
225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         List<ComponentName> prefActList = new ArrayList<ComponentName>();
22650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Intent list cannot be null. so pass empty list
227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         List<IntentFilter> intentList = new ArrayList<IntentFilter>();
228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mPm.getPreferredActivities(intentList,  prefActList, packageName);
229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list");
230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         TextView autoLaunchView = (TextView)findViewById(R.id.auto_launch);
231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(prefActList.size() <= 0) {
23250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu             // Disable clear activities button
233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             autoLaunchView.setText(R.string.auto_launch_disable_text);
234afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mActivitiesButton.setEnabled(false);
235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         } else {
236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             autoLaunchView.setText(R.string.auto_launch_enable_text);
237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mActivitiesButton.setOnClickListener(this);
238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
24050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Security permissions section
241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section);
242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName);
243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(asp.getPermissionCount() > 0) {
244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             permsView.setVisibility(View.VISIBLE);
245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             // Make the security sections header visible
246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             LinearLayout securityList = (LinearLayout) permsView.findViewById(
247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                     R.id.security_settings_list);
248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             securityList.addView(asp.getPermissionsView());
249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         } else {
250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             permsView.setVisibility(View.GONE);
251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
25450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void refreshAppAttributes(PackageInfo pkgInfo) {
25550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setAppLabelAndIcon();
25650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
25750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setAppVersion(pkgInfo);
25850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setAppBtnState();
25950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Refresh size info
260a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu        if (mAppInfo != null && mAppInfo.packageName != null) {
261a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu            mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
262a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu        }
263a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu    }
264a5feaa76ef2303f802aa8057b418d9e5081af492Suchi Amalapurapu
26550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Utility method to set applicaiton label and icon.
26650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void setAppLabelAndIcon() {
26750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        ((ImageView)findViewById(R.id.app_icon)).setImageDrawable(mAppInfo.loadIcon(mPm));
26850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        //set application name TODO version
26950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        CharSequence appName = mAppInfo.loadLabel(mPm);
27050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        if(appName == null) {
27150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            appName = getString(_UNKNOWN_APP);
27250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
27350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        ((TextView)findViewById(R.id.app_name)).setText(appName);
27450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
27550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
27650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Utility method to set application version
27750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void setAppVersion(PackageInfo pkgInfo) {
27850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Version number of application
27950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        mAppVersion = ((TextView)findViewById(R.id.app_version));
28050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        if (pkgInfo != null) {
28150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.VISIBLE);
28250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setText(getString(R.string.version_text,
2838e1b0fb77ce50ddc99a596da48b65190e2708362Elliott Hughes                    String.valueOf(pkgInfo.versionName)));
28450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } else {
28550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppVersion.setVisibility(View.GONE);
28650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
28750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
28850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
28950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    // Utility method to set button state
29050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void setAppBtnState() {
29150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        boolean visible = true;
29250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        if  ((mAppInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
29350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            if ((mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
29450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                mAppButtonState = AppButtonStates.FACTORY_RESET;
29550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                mAppButtonText = getText(R.string.app_factory_reset);
29650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            } else {
29750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                if ((mAppInfo.flags & ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA) == 0) {
29850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    // Hide button if diableClearUserData is set
29950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    mAppButtonState = AppButtonStates.NONE;
30050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    visible = false;
30150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                } else {
30250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    mAppButtonState = AppButtonStates.CLEAR_DATA;
30350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    mAppButtonText = getText(R.string.clear_user_data_text);
304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
30550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            }
30650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } else {
30750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppButtonState = AppButtonStates.UNINSTALL;
30850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppButtonText = getText(R.string.uninstall_text);
30950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
31050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        if(visible) {
31150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppButton.setText(mAppButtonText);
31250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppButton.setVisibility(View.VISIBLE);
31350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } else {
31450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppButton.setVisibility(View.GONE);
31550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
31650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
31750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
31850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
31950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    public void onStart() {
32050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        super.onStart();
32150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        PackageInfo pkgInfo;
32250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        // Get application info again to refresh changed properties of application
32350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        try {
32450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            mAppInfo = mPm.getApplicationInfo(mAppInfo.packageName,
32550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    PackageManager.GET_UNINSTALLED_PACKAGES);
32650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            pkgInfo = mPm.getPackageInfo(mAppInfo.packageName, 0);
32750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        } catch (NameNotFoundException e) {
32850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            Log.e(TAG, "Exception when retrieving package:" + mAppInfo.packageName, e);
32950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            showDialogInner(DLG_APP_NOT_FOUND);
33050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return;
33150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
33250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        refreshAppAttributes(pkgInfo);
333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setIntentAndFinish(boolean finish, boolean appChanged) {
336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
337afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = new Intent();
338afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ManageApplications.APP_CHG, appChanged);
339afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        setResult(ManageApplications.RESULT_OK, intent);
340afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppButton.setEnabled(false);
341afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(finish) {
342afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            finish();
343afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
344afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
345afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
346afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle get size info notification from observer when
348afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete. The current user data
349afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * info has to be refreshed in the manage applications screen as well as the current screen.
350afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void refreshSizeInfo(Message msg) {
352afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean changed = false;
353afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PackageStats newPs = msg.getData().getParcelable(ATTR_PACKAGE_STATS);
354afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        long newTot = newPs.cacheSize+newPs.codeSize+newPs.dataSize;
355afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(mSizeInfo == null) {
356afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mSizeInfo = newPs;
357afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            String str = getSizeStr(newTot);
358afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mTotalSize.setText(str);
359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppSize.setText(getSizeStr(newPs.codeSize));
360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mDataSize.setText(getSizeStr(newPs.dataSize));
361afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mCacheSize.setText(getSizeStr(newPs.cacheSize));
362afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
363afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            long oldTot = mSizeInfo.cacheSize+mSizeInfo.codeSize+mSizeInfo.dataSize;
364afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newTot != oldTot) {
365afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                String str = getSizeStr(newTot);
366afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mTotalSize.setText(str);
367afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
368afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
369afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.codeSize != mSizeInfo.codeSize) {
370afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppSize.setText(getSizeStr(newPs.codeSize));
371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
373afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.dataSize != mSizeInfo.dataSize) {
374afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mDataSize.setText(getSizeStr(newPs.dataSize));
375afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
376afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
377afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.cacheSize != mSizeInfo.cacheSize) {
378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mCacheSize.setText(getSizeStr(newPs.cacheSize));
379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
380afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(changed) {
382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mSizeInfo = newPs;
383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
384afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
385afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
386afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        long data = mSizeInfo.dataSize;
387afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Disable button if data is 0
388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(mAppButtonState != AppButtonStates.NONE){
389afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppButton.setText(mAppButtonText);
390afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if((mAppButtonState == AppButtonStates.CLEAR_DATA) && (data == 0)) {
391afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppButton.setEnabled(false);
392afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
393afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppButton.setEnabled(true);
394afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppButton.setOnClickListener(this);
395afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        refreshCacheInfo(newPs.cacheSize);
398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
400afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void refreshCacheInfo(long cacheSize) {
401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Set cache info
402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mCacheSize.setText(getSizeStr(cacheSize));
403afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (cacheSize <= 0) {
404afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearCacheButton.setEnabled(false);
405afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
406afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearCacheButton.setOnClickListener(this);
407afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
408afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
411afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle clear message notification from observer when
412afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete
413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
414afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void processClearMsg(Message msg) {
415afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int result = msg.arg1;
416afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(result == OP_SUCCESSFUL) {
418afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Cleared user data for system package:"+packageName);
419afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.getPackageSizeInfo(packageName, mSizeObserver);
420afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
421afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppButton.setText(R.string.clear_user_data_text);
422afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppButton.setEnabled(true);
423afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
424afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
425afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
426afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
427afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to initiate clearing user data when the user clicks the clear data
428afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * button for a system package
429afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
430afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private  void initiateClearUserDataForSysPkg() {
431afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppButton.setEnabled(false);
432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        //invoke uninstall or clear user data based on sysPackage
433afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Log.i(TAG, "Clearing user data for system package");
435afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(mClearDataObserver == null) {
436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearDataObserver = new ClearUserDataObserver();
437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
439afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
440afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(!res) {
44150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            // Clearing data failed for some obscure reason. Just log error for now
442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
44350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            showDialogInner(DLG_CANNOT_CLEAR_DATA);
444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
445afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppButton.setText(R.string.recompute_size);
446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
447afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
44950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void showDialogInner(int id) {
45050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        //removeDialog(id);
45150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        showDialog(id);
45250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
45350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
45450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    @Override
45550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    public Dialog onCreateDialog(int id) {
45650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        switch (id) {
45750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_CLEAR_DATA:
45850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
45950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.clear_data_dlg_title))
46050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
46150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.clear_data_dlg_text))
46250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setPositiveButton(R.string.dlg_ok, this)
46350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, this)
46450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
46550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_FACTORY_RESET:
46650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
46750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.app_factory_reset_dlg_title))
46850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
46950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.app_factory_reset_dlg_text))
47050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setPositiveButton(R.string.dlg_ok, this)
47150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setNegativeButton(R.string.dlg_cancel, this)
47250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
47350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_APP_NOT_FOUND:
47450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
47550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.app_not_found_dlg_title))
47650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
47750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.app_not_found_dlg_title))
47850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setNeutralButton(getString(R.string.dlg_ok),
47950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    new DialogInterface.OnClickListener() {
48050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
48150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    //force to recompute changed value
48250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    setIntentAndFinish(true, true);
48350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                }
48450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            })
48550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
48650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        case DLG_CANNOT_CLEAR_DATA:
48750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            return new AlertDialog.Builder(this)
48850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setTitle(getString(R.string.clear_failed_dlg_title))
48950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setIcon(android.R.drawable.ic_dialog_alert)
49050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setMessage(getString(R.string.clear_failed_dlg_text))
49150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .setNeutralButton(R.string.dlg_ok,
49250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    new DialogInterface.OnClickListener() {
49350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                public void onClick(DialogInterface dialog, int which) {
49450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    //force to recompute changed value
49550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                    setIntentAndFinish(false, false);
49650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                }
49750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            })
49850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            .create();
49950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        }
50050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        return null;
50150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
50250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
50350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    private void uninstallPkg(String packageName) {
50450b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu         // Create new intent to launch Uninstaller activity
50550b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Uri packageURI = Uri.parse("package:"+packageName);
50650b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
50750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        startActivity(uninstallIntent);
50850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu        setIntentAndFinish(true, true);
50950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu    }
51050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu
511afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
512afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Method implementing functionality of buttons clicked
513afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see android.view.View.OnClickListener#onClick(android.view.View)
514afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
515afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(View v) {
516afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
517afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(v == mAppButton) {
51850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            if (mAppButtonState == AppButtonStates.CLEAR_DATA) {
51950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                showDialogInner(DLG_CLEAR_DATA);
52050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            } else if (mAppButtonState == AppButtonStates.FACTORY_RESET) {
52150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                showDialogInner(DLG_FACTORY_RESET);
52250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            } else if (mAppButtonState == AppButtonStates.UNINSTALL) {
52350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                uninstallPkg(packageName);
524afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
525afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mActivitiesButton) {
526afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.clearPackagePreferredActivities(packageName);
527afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mActivitiesButton.setEnabled(false);
528afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mManageSpaceButton) {
529afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Intent intent = new Intent(Intent.ACTION_DEFAULT);
530afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            intent.setClassName(mAppInfo.packageName, mAppInfo.manageSpaceActivityName);
531afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            startActivityForResult(intent, -1);
532afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mClearCacheButton) {
533afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Lazy initialization of observer
534afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mClearCacheObserver == null) {
535afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mClearCacheObserver = new ClearCacheObserver();
536afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
537afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
538afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mForceStopButton) {
539afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            ActivityManager am = (ActivityManager)getSystemService(
540afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    Context.ACTIVITY_SERVICE);
541afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            am.restartPackage(packageName);
542afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
543afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
544afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
545afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(DialogInterface dialog, int which) {
546afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(which == AlertDialog.BUTTON_POSITIVE) {
54750b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            if (mAppButtonState == AppButtonStates.CLEAR_DATA) {
54850b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                // Invoke uninstall or clear user data based on sysPackage
54950b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                initiateClearUserDataForSysPkg();
55050b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            } else if (mAppButtonState == AppButtonStates.FACTORY_RESET) {
55150b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                // Initiate package installer to delete package
55250b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu                uninstallPkg(mAppInfo.packageName);
55350b516760af7755f178d32861e2aaafb0c2bfda1Suchi Amalapurapu            }
554afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
555afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            //cancel do nothing just retain existing screen
556afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
557afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
558afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
559afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
560