InstalledAppDetails.java revision afc4ab2ffbb8327ddce9907961295a32cbf49d0f
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;
25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.DialogInterface;
27afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Intent;
28afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.IntentFilter;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageDataObserver;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.IPackageStatsObserver;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageStats;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.net.Uri;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Handler;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Message;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.text.format.Formatter;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Config;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.List;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.ComponentName;
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AppSecurityPermissions;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Button;
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ImageView;
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.LinearLayout;
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
52afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
53afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display application information from Settings. This activity presents
54afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * extended information associated with a package like code, data, total size, permissions
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * used by the application and also the set of default launchable activities.
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For system applications, an option to clear user data is displayed only if data size is > 0.
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * System applications that do not want clear user data do not have this option.
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * For non-system applications, there is no option to clear data. Instead there is an option to
59afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * uninstall the application.
60afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
61afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpublic class InstalledAppDetails extends Activity implements View.OnClickListener, DialogInterface.OnClickListener  {
62afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String TAG="InstalledAppDetails";
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int _UNKNOWN_APP=R.string.unknown;
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ApplicationInfo mAppInfo;
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mAppButton;
66afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mActivitiesButton;
67afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private boolean mCanUninstall;
68afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private boolean localLOGV=Config.LOGV || false;
69afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mAppSnippetSize;
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mTotalSize;
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mAppSize;
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mDataSize;
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PkgSizeObserver mSizeObserver;
74afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearUserDataObserver mClearDataObserver;
75afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Views related to cache info
76afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private View mCachePanel;
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private TextView mCacheSize;
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mClearCacheButton;
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private ClearCacheObserver mClearCacheObserver;
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mForceStopButton;
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
82afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    PackageStats mSizeInfo;
83afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Button mManageSpaceButton;
84afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PackageManager mPm;
85afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    //internal constants used in Handler
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_SUCCESSFUL = 1;
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int OP_FAILED = 2;
89afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_USER_DATA = 1;
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int GET_PKG_SIZE = 2;
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int CLEAR_CACHE = 3;
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final String ATTR_PACKAGE_STATS="PackageStats";
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // invalid size value used initially and also when size retrieval through PackageManager
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // fails for whatever reason
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private static final int SIZE_INVALID = -1;
97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Resource strings
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mInvalidSizeStr;
100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mComputingStr;
101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private CharSequence mAppButtonText;
102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    // Possible btn states
104afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private enum AppButtonStates {
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        CLEAR_DATA,
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        UNINSTALL,
107afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        NONE
108afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private AppButtonStates mAppButtonState;
110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
111afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private Handler mHandler = new Handler() {
112afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void handleMessage(Message msg) {
113afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            switch (msg.what) {
114afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_USER_DATA:
115afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    processClearMsg(msg);
116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case GET_PKG_SIZE:
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    refreshSizeInfo(msg);
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
120afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                case CLEAR_CACHE:
121afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    // Refresh size info
122afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    mPm.getPackageSizeInfo(mAppInfo.packageName, mSizeObserver);
123afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
124afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                default:
125afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    break;
126afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
127afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
128afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    };
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
130afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private boolean isUninstallable() {
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (((mAppInfo.flags&ApplicationInfo.FLAG_SYSTEM) != 0) &&
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                ((mAppInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0)) {
133afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return false;
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return true;
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
138afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearUserDataObserver extends IPackageDataObserver.Stub {
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project       public void onRemoveCompleted(final String packageName, final boolean succeeded) {
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           final Message msg = mHandler.obtainMessage(CLEAR_USER_DATA);
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           mHandler.sendMessage(msg);
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
144afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
146afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class PkgSizeObserver extends IPackageStatsObserver.Stub {
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public int idx;
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) {
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             Message msg = mHandler.obtainMessage(GET_PKG_SIZE);
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             Bundle data = new Bundle();
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             data.putParcelable(ATTR_PACKAGE_STATS, pStats);
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             msg.setData(data);
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mHandler.sendMessage(msg);
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class ClearCacheObserver extends IPackageDataObserver.Stub {
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            final Message msg = mHandler.obtainMessage(CLEAR_CACHE);
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            msg.arg1 = succeeded?OP_SUCCESSFUL:OP_FAILED;
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mHandler.sendMessage(msg);
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     }
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private String getSizeStr(long size) {
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (size == SIZE_INVALID) {
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return mInvalidSizeStr.toString();
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        return Formatter.formatFileSize(this, size);
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setAppBtnState() {
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean visible = false;
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(mCanUninstall) {
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            //app can clear user data
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if((mAppInfo.flags & ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA)
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    == ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA) {
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppButtonText = getText(R.string.clear_user_data_text);
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project               mAppButtonState = AppButtonStates.CLEAR_DATA;
181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project               visible = true;
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                //hide button if diableClearUserData is set
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                visible = false;
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppButtonState = AppButtonStates.NONE;
186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            visible = true;
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppButtonState = AppButtonStates.UNINSTALL;
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppButtonText = getText(R.string.uninstall_text);
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(visible) {
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppButton.setText(mAppButtonText);
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppButton.setVisibility(View.VISIBLE);
195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppButton.setVisibility(View.GONE);
197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    @Override
202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle icicle) {
203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        //get package manager
205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPm = getPackageManager();
206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        //get application's name from intent
207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = getIntent();
208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        final String packageName = intent.getStringExtra(ManageApplications.APP_PKG_NAME);
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mComputingStr = getText(R.string.computing_size);
210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Try retrieving package stats again
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        CharSequence totalSizeStr, appSizeStr, dataSizeStr;
212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        totalSizeStr = appSizeStr = dataSizeStr = mComputingStr;
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "Have to compute package sizes");
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mSizeObserver = new PkgSizeObserver();
215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPm.getPackageSizeInfo(packageName, mSizeObserver);
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        try {
218afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppInfo = mPm.getApplicationInfo(packageName,
219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    PackageManager.GET_UNINSTALLED_PACKAGES);
220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } catch (NameNotFoundException e) {
221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.e(TAG, "Exception when retrieving package:"+packageName, e);
222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            displayErrorDialog(R.string.app_not_found_dlg_text, true, true);
223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        setContentView(R.layout.installed_app_details);
225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        ((ImageView)findViewById(R.id.app_icon)).setImageDrawable(mAppInfo.loadIcon(mPm));
226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        //set application name TODO version
227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        CharSequence appName = mAppInfo.loadLabel(mPm);
228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(appName == null) {
229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            appName = getString(_UNKNOWN_APP);
230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        ((TextView)findViewById(R.id.app_name)).setText(appName);
232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppSnippetSize = ((TextView)findViewById(R.id.app_size));
233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppSnippetSize.setText(totalSizeStr);
234afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        //TODO download str and download url
235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        //set values on views
236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTotalSize = (TextView)findViewById(R.id.total_size_text);
237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mTotalSize.setText(totalSizeStr);
238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppSize = (TextView)findViewById(R.id.application_size_text);
239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppSize.setText(appSizeStr);
240afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDataSize = (TextView)findViewById(R.id.data_size_text);
241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mDataSize.setText(dataSizeStr);
242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mAppButton = ((Button)findViewById(R.id.uninstall_button));
244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        //determine if app is a system app
245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mCanUninstall = !isUninstallable();
246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(localLOGV) Log.i(TAG, "Is systemPackage "+mCanUninstall);
247afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         setAppBtnState();
248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mManageSpaceButton = (Button)findViewById(R.id.manage_space_button);
249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(mAppInfo.manageSpaceActivityName != null) {
250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mManageSpaceButton.setVisibility(View.VISIBLE);
251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mManageSpaceButton.setOnClickListener(this);
252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         // Cache section
255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mCachePanel = findViewById(R.id.cache_panel);
256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mCacheSize = (TextView) findViewById(R.id.cache_size_text);
257afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mCacheSize.setText(mComputingStr);
258afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mClearCacheButton = (Button) findViewById(R.id.clear_cache_button);
259afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mForceStopButton = (Button) findViewById(R.id.force_stop_button);
260afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mForceStopButton.setOnClickListener(this);
261afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
262afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         //clear activities
263afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mActivitiesButton = (Button)findViewById(R.id.clear_activities_button);
264afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         List<ComponentName> prefActList = new ArrayList<ComponentName>();
265afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         //intent list cannot be null. so pass empty list
266afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         List<IntentFilter> intentList = new ArrayList<IntentFilter>();
267afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         mPm.getPreferredActivities(intentList,  prefActList, packageName);
268afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(localLOGV) Log.i(TAG, "Have "+prefActList.size()+" number of activities in prefered list");
269afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         TextView autoLaunchView = (TextView)findViewById(R.id.auto_launch);
270afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(prefActList.size() <= 0) {
271afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             //disable clear activities button
272afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             autoLaunchView.setText(R.string.auto_launch_disable_text);
273afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mActivitiesButton.setEnabled(false);
274afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         } else {
275afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             autoLaunchView.setText(R.string.auto_launch_enable_text);
276afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             mActivitiesButton.setOnClickListener(this);
277afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
278afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
279afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         // security permissions section
280afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         LinearLayout permsView = (LinearLayout) findViewById(R.id.permissions_section);
281afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         AppSecurityPermissions asp = new AppSecurityPermissions(this, packageName);
282afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         if(asp.getPermissionCount() > 0) {
283afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             permsView.setVisibility(View.VISIBLE);
284afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             // Make the security sections header visible
285afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             LinearLayout securityList = (LinearLayout) permsView.findViewById(
286afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                     R.id.security_settings_list);
287afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             securityList.addView(asp.getPermissionsView());
288afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         } else {
289afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project             permsView.setVisibility(View.GONE);
290afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         }
291afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
292afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
293afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void displayErrorDialog(int msgId, final boolean finish, final boolean changed) {
294afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        //display confirmation dialog
295afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        new AlertDialog.Builder(this)
296afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        .setTitle(getString(R.string.app_not_found_dlg_title))
297afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        .setIcon(android.R.drawable.ic_dialog_alert)
298afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        .setMessage(getString(msgId))
299afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        .setNeutralButton(getString(R.string.dlg_ok),
300afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                new DialogInterface.OnClickListener() {
301afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    public void onClick(DialogInterface dialog, int which) {
302afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                        //force to recompute changed value
303afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                        setIntentAndFinish(finish, changed);
304afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    }
305afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
306afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        )
307afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        .show();
308afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
309afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
310afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void setIntentAndFinish(boolean finish, boolean appChanged) {
311afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(localLOGV) Log.i(TAG, "appChanged="+appChanged);
312afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Intent intent = new Intent();
313afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        intent.putExtra(ManageApplications.APP_CHG, appChanged);
314afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        setResult(ManageApplications.RESULT_OK, intent);
315afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppButton.setEnabled(false);
316afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(finish) {
317afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            finish();
318afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
319afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
320afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
321afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
322afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle get size info notification from observer when
323afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete. The current user data
324afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * info has to be refreshed in the manage applications screen as well as the current screen.
325afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
326afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void refreshSizeInfo(Message msg) {
327afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean changed = false;
328afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        PackageStats newPs = msg.getData().getParcelable(ATTR_PACKAGE_STATS);
329afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        long newTot = newPs.cacheSize+newPs.codeSize+newPs.dataSize;
330afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(mSizeInfo == null) {
331afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mSizeInfo = newPs;
332afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            String str = getSizeStr(newTot);
333afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mTotalSize.setText(str);
334afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppSnippetSize.setText(str);
335afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppSize.setText(getSizeStr(newPs.codeSize));
336afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mDataSize.setText(getSizeStr(newPs.dataSize));
337afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mCacheSize.setText(getSizeStr(newPs.cacheSize));
338afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
339afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            long oldTot = mSizeInfo.cacheSize+mSizeInfo.codeSize+mSizeInfo.dataSize;
340afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newTot != oldTot) {
341afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                String str = getSizeStr(newTot);
342afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mTotalSize.setText(str);
343afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppSnippetSize.setText(str);
344afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
345afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
346afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.codeSize != mSizeInfo.codeSize) {
347afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppSize.setText(getSizeStr(newPs.codeSize));
348afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
349afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
350afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.dataSize != mSizeInfo.dataSize) {
351afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mDataSize.setText(getSizeStr(newPs.dataSize));
352afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
353afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
354afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(newPs.cacheSize != mSizeInfo.cacheSize) {
355afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mCacheSize.setText(getSizeStr(newPs.cacheSize));
356afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                changed = true;
357afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
358afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(changed) {
359afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mSizeInfo = newPs;
360afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
361afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
362afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
363afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        long data = mSizeInfo.dataSize;
364afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Disable button if data is 0
365afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(mAppButtonState != AppButtonStates.NONE){
366afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppButton.setText(mAppButtonText);
367afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if((mAppButtonState == AppButtonStates.CLEAR_DATA) && (data == 0)) {
368afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppButton.setEnabled(false);
369afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
370afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppButton.setEnabled(true);
371afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppButton.setOnClickListener(this);
372afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
373afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
374afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        refreshCacheInfo(newPs.cacheSize);
375afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
376afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
377afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void refreshCacheInfo(long cacheSize) {
378afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // Set cache info
379afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mCacheSize.setText(getSizeStr(cacheSize));
380afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if (cacheSize <= 0) {
381afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearCacheButton.setEnabled(false);
382afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
383afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearCacheButton.setOnClickListener(this);
384afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
385afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
386afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
387afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
388afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to handle clear message notification from observer when
389afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * the async operation from PackageManager is complete
390afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
391afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private void processClearMsg(Message msg) {
392afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        int result = msg.arg1;
393afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
394afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(result == OP_SUCCESSFUL) {
395afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Cleared user data for system package:"+packageName);
396afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.getPackageSizeInfo(packageName, mSizeObserver);
397afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
398afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppButton.setText(R.string.clear_user_data_text);
399afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppButton.setEnabled(true);
400afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
401afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
402afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
403afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /*
404afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * Private method to initiate clearing user data when the user clicks the clear data
405afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * button for a system package
406afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
407afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private  void initiateClearUserDataForSysPkg() {
408afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAppButton.setEnabled(false);
409afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        //invoke uninstall or clear user data based on sysPackage
410afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
411afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        Log.i(TAG, "Clearing user data for system package");
412afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(mClearDataObserver == null) {
413afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mClearDataObserver = new ClearUserDataObserver();
414afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
415afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
416afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        boolean res = am.clearApplicationUserData(packageName, mClearDataObserver);
417afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(!res) {
418afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            //doesnt initiate clear. some error. should not happen but just log error for now
419afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Log.i(TAG, "Couldnt clear application user data for package:"+packageName);
420afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            displayErrorDialog(R.string.clear_data_failed, false, false);
421afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
422afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mAppButton.setText(R.string.recompute_size);
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     * Method implementing functionality of buttons clicked
428afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     * @see android.view.View.OnClickListener#onClick(android.view.View)
429afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project     */
430afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(View v) {
431afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        String packageName = mAppInfo.packageName;
432afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(v == mAppButton) {
433afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if(mCanUninstall) {
434afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                //display confirmation dialog
435afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                new AlertDialog.Builder(this)
436afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                .setTitle(getString(R.string.clear_data_dlg_title))
437afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                .setIcon(android.R.drawable.ic_dialog_alert)
438afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                .setMessage(getString(R.string.clear_data_dlg_text))
439afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                .setPositiveButton(R.string.dlg_ok, this)
440afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                .setNegativeButton(R.string.dlg_cancel, this)
441afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                .show();
442afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
443afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                //create new intent to launch Uninstaller activity
444afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Uri packageURI = Uri.parse("package:"+packageName);
445afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                Intent uninstallIntent = new Intent(Intent.ACTION_DELETE, packageURI);
446afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                startActivity(uninstallIntent);
447afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                setIntentAndFinish(true, true);
448afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
449afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mActivitiesButton) {
450afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.clearPackagePreferredActivities(packageName);
451afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mActivitiesButton.setEnabled(false);
452afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if(v == mManageSpaceButton) {
453afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            Intent intent = new Intent(Intent.ACTION_DEFAULT);
454afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            intent.setClassName(mAppInfo.packageName, mAppInfo.manageSpaceActivityName);
455afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            startActivityForResult(intent, -1);
456afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mClearCacheButton) {
457afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Lazy initialization of observer
458afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mClearCacheObserver == null) {
459afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                mClearCacheObserver = new ClearCacheObserver();
460afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
461afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mPm.deleteApplicationCacheFiles(packageName, mClearCacheObserver);
462afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else if (v == mForceStopButton) {
463afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            ActivityManager am = (ActivityManager)getSystemService(
464afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                    Context.ACTIVITY_SERVICE);
465afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            am.restartPackage(packageName);
466afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
467afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
468afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
469afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onClick(DialogInterface dialog, int which) {
470afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        if(which == AlertDialog.BUTTON_POSITIVE) {
471afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            //invoke uninstall or clear user data based on sysPackage
472afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            initiateClearUserDataForSysPkg();
473afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        } else {
474afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            //cancel do nothing just retain existing screen
475afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
476afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
477afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
478afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
479