1 /*
2  * Copyright (C) 2007 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.development;
18 
19 import android.app.Activity;
20 import android.app.ActivityManager;
21 import android.content.ComponentName;
22 import android.content.Context;
23 import android.content.Intent;
24 import android.content.pm.ActivityInfo;
25 import android.content.pm.ApplicationInfo;
26 import android.content.pm.InstrumentationInfo;
27 import android.content.pm.PackageInfo;
28 import android.content.pm.PackageManager;
29 import android.content.pm.ProviderInfo;
30 import android.content.pm.ServiceInfo;
31 import android.net.Uri;
32 import android.os.Bundle;
33 import android.util.Log;
34 import android.view.LayoutInflater;
35 import android.view.View;
36 import android.widget.Button;
37 import android.widget.ImageView;
38 import android.widget.LinearLayout;
39 import android.widget.TextView;
40 
41 public class PackageSummary extends Activity {
42 
43     String mPackageName;
44     private TextView mPackage;
45     private ImageView mIconImage;
46     private TextView mClass;
47     private TextView mLabel;
48     private View mDisabled;
49     private View mSystem;
50     private View mDebuggable;
51     private View mNoCode;
52     private View mPersistent;
53     private Button mRestart;
54     private TextView mTask;
55     private TextView mVersion;
56     private TextView mProcess;
57     private TextView mUid;
58     private TextView mSource;
59     private TextView mData;
60 
61     @Override
onCreate(Bundle icicle)62     protected void onCreate(Bundle icicle) {
63         super.onCreate(icicle);
64 
65         setContentView(R.layout.package_summary);
66 
67         final PackageManager pm = getPackageManager();
68 
69         mPackage = (TextView)findViewById(R.id.packageView);
70         mIconImage = (ImageView)findViewById(R.id.icon);
71         mClass = (TextView)findViewById(R.id.classView);
72         mLabel = (TextView)findViewById(R.id.label);
73         mDisabled = findViewById(R.id.disabled);
74         mSystem = findViewById(R.id.system);
75         mDebuggable = findViewById(R.id.debuggable);
76         mNoCode = findViewById(R.id.nocode);
77         mPersistent = findViewById(R.id.persistent);
78         mRestart = (Button)findViewById(R.id.restart);
79         mTask = (TextView)findViewById(R.id.task);
80         mVersion = (TextView)findViewById(R.id.version);
81         mUid = (TextView)findViewById(R.id.uid);
82         mProcess = (TextView)findViewById(R.id.process);
83         mSource = (TextView)findViewById(R.id.source);
84         mData = (TextView)findViewById(R.id.data);
85 
86         mPackageName = getIntent().getData().getSchemeSpecificPart();
87         PackageInfo info = null;
88         try {
89             info = pm.getPackageInfo(mPackageName,
90                 PackageManager.GET_ACTIVITIES | PackageManager.GET_RECEIVERS
91                 | PackageManager.GET_SERVICES | PackageManager.GET_PROVIDERS
92                 | PackageManager.GET_INSTRUMENTATION
93                 | PackageManager.GET_DISABLED_COMPONENTS);
94         } catch (PackageManager.NameNotFoundException e) {
95         }
96 
97         if (info != null) {
98             mPackage.setText(info.packageName);
99             CharSequence label = null;
100             String appClass = null;
101             if (info.applicationInfo != null) {
102                 mIconImage.setImageDrawable(
103                     pm.getApplicationIcon(info.applicationInfo));
104                 label = info.applicationInfo.nonLocalizedLabel;
105                 appClass = info.applicationInfo.className;
106                 if (info.applicationInfo.enabled) {
107                     mDisabled.setVisibility(View.GONE);
108                 }
109                 if ((info.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) {
110                     mSystem.setVisibility(View.GONE);
111                 }
112                 if ((info.applicationInfo.flags&ApplicationInfo.FLAG_DEBUGGABLE) == 0) {
113                     mDebuggable.setVisibility(View.GONE);
114                 }
115                 if ((info.applicationInfo.flags&ApplicationInfo.FLAG_HAS_CODE) != 0) {
116                     mNoCode.setVisibility(View.GONE);
117                 }
118                 if ((info.applicationInfo.flags&ApplicationInfo.FLAG_PERSISTENT) == 0) {
119                     mPersistent.setVisibility(View.GONE);
120                 }
121                 mUid.setText(Integer.toString(info.applicationInfo.uid));
122                 mProcess.setText(info.applicationInfo.processName);
123                 if (info.versionName != null) {
124                     mVersion.setText(info.versionName + " (#" + info.versionCode + ")");
125                 } else {
126                     mVersion.setText("(#" + info.versionCode + ")");
127                 }
128                 mSource.setText(info.applicationInfo.sourceDir);
129                 mData.setText(info.applicationInfo.dataDir);
130                 if (info.applicationInfo.taskAffinity != null) {
131                     mTask.setText("\"" + info.applicationInfo.taskAffinity + "\"");
132                 } else {
133                     mTask.setText("(No Task Affinity)");
134                 }
135             }
136             if (appClass != null) {
137                 if (appClass.startsWith(info.packageName + "."))
138                     mClass.setText(appClass.substring(info.packageName.length()));
139                 else
140                     mClass.setText(appClass);
141             } else {
142                 mClass.setText("(No Application Class)");
143             }
144             if (label != null) {
145                 mLabel.setText("\"" + label + "\"");
146             } else {
147                 mLabel.setText("(No Label)");
148             }
149 
150             mRestart.setOnClickListener(new View.OnClickListener() {
151                 public void onClick(View v) {
152                     ActivityManager am = (ActivityManager)getSystemService(
153                             Context.ACTIVITY_SERVICE);
154                     am.killBackgroundProcesses(mPackageName);
155                 }
156             });
157 
158             final LayoutInflater inflate =
159                 (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
160             LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
161                 LinearLayout.LayoutParams.WRAP_CONTENT,
162                 LinearLayout.LayoutParams.WRAP_CONTENT);
163             LinearLayout activities = (LinearLayout)findViewById(R.id.activities);
164             LinearLayout receivers = (LinearLayout)findViewById(R.id.receivers);
165             LinearLayout services = (LinearLayout)findViewById(R.id.services);
166             LinearLayout providers = (LinearLayout)findViewById(R.id.providers);
167             LinearLayout instrumentation = (LinearLayout)findViewById(R.id.instrumentation);
168 
169             if (info.activities != null) {
170                 final int N = info.activities.length;
171                 for (int i=0; i<N; i++) {
172                     ActivityInfo ai = info.activities[i];
173                     // If an activity is disabled then the ActivityInfo will be null
174                     if (ai != null) {
175                         Button view = (Button)inflate.inflate(
176                                 R.layout.package_item, null, false);
177                         view.setOnClickListener(new ActivityOnClick(
178                                 new ComponentName(ai.applicationInfo.packageName,
179                                                   ai.name)));
180                         setItemText(view, info, ai.name);
181                         activities.addView(view, lp);
182                     }
183                 }
184             } else {
185                 activities.setVisibility(View.GONE);
186             }
187 
188             if (info.receivers != null) {
189                 final int N = info.receivers.length;
190                 for (int i=0; i<N; i++) {
191                     ActivityInfo ai = info.receivers[i];
192                     Button view = (Button)inflate.inflate(
193                         R.layout.package_item, null, false);
194                     Log.i("foo", "Receiver #" + i + " of " + N + ": " + ai);
195                     setItemText(view, info, ai.name);
196                     receivers.addView(view, lp);
197                 }
198             } else {
199                 receivers.setVisibility(View.GONE);
200             }
201 
202             if (info.services != null) {
203                 final int N = info.services.length;
204                 for (int i=0; i<N; i++) {
205                     ServiceInfo si = info.services[i];
206                     Button view = (Button)inflate.inflate(
207                         R.layout.package_item, null, false);
208                     setItemText(view, info, si.name);
209                     services.addView(view, lp);
210                 }
211             } else {
212                 services.setVisibility(View.GONE);
213             }
214 
215             if (info.providers != null) {
216                 final int N = info.providers.length;
217                 for (int i=0; i<N; i++) {
218                     ProviderInfo pi = info.providers[i];
219                     Button view = (Button)inflate.inflate(
220                         R.layout.package_item, null, false);
221                     setItemText(view, info, pi.name);
222                     providers.addView(view, lp);
223                 }
224             } else {
225                 providers.setVisibility(View.GONE);
226             }
227 
228             if (info.instrumentation != null) {
229                 final int N = info.instrumentation.length;
230                 for (int i=0; i<N; i++) {
231                     InstrumentationInfo ii = info.instrumentation[i];
232                     Button view = (Button)inflate.inflate(
233                         R.layout.package_item, null, false);
234                     setItemText(view, info, ii.name);
235                     instrumentation.addView(view, lp);
236                 }
237             } else {
238                 instrumentation.setVisibility(View.GONE);
239             }
240 
241         }
242 
243         // Put focus here, so a button doesn't get focus and cause the
244         // scroll view to move to it.
245         mPackage.requestFocus();
246     }
247 
setItemText(Button item, PackageInfo pi, String className)248     private final static void setItemText(Button item, PackageInfo pi,
249                                           String className)
250     {
251         item.setText(className.substring(className.lastIndexOf('.')+1));
252     }
253 
254     private final class ActivityOnClick implements View.OnClickListener
255     {
256         private final ComponentName mClassName;
ActivityOnClick(ComponentName className)257         ActivityOnClick(ComponentName className) {
258             mClassName = className;
259         }
260 
onClick(View v)261         public void onClick(View v) {
262             Intent intent = new Intent(
263                 null, Uri.fromParts("component",
264                     mClassName.flattenToString(), null));
265             intent.setClass(PackageSummary.this, ShowActivity.class);
266             startActivity(intent);
267         }
268     }
269 }
270