/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.development; import android.app.Activity; import android.app.ActivityManagerNative; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.InstrumentationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; import android.content.pm.ServiceInfo; import android.net.Uri; import android.os.Bundle; import android.os.RemoteException; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class PackageSummary extends Activity { String mPackageName; private TextView mPackage; private ImageView mIconImage; private TextView mClass; private TextView mLabel; private View mDisabled; private View mSystem; private View mDebuggable; private View mNoCode; private View mPersistent; private Button mRestart; private TextView mTask; private TextView mVersion; private TextView mProcess; private TextView mUid; private TextView mSource; private TextView mData; @Override protected void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.package_summary); final PackageManager pm = getPackageManager(); mPackage = (TextView)findViewById(R.id.packageView); mIconImage = (ImageView)findViewById(R.id.icon); mClass = (TextView)findViewById(R.id.classView); mLabel = (TextView)findViewById(R.id.label); mDisabled = findViewById(R.id.disabled); mSystem = findViewById(R.id.system); mDebuggable = findViewById(R.id.debuggable); mNoCode = findViewById(R.id.nocode); mPersistent = findViewById(R.id.persistent); mRestart = (Button)findViewById(R.id.restart); mTask = (TextView)findViewById(R.id.task); mVersion = (TextView)findViewById(R.id.version); mUid = (TextView)findViewById(R.id.uid); mProcess = (TextView)findViewById(R.id.process); mSource = (TextView)findViewById(R.id.source); mData = (TextView)findViewById(R.id.data); mPackageName = getIntent().getData().getSchemeSpecificPart(); PackageInfo info = null; try { info = pm.getPackageInfo(mPackageName, PackageManager.GET_ACTIVITIES | PackageManager.GET_RECEIVERS | PackageManager.GET_SERVICES | PackageManager.GET_PROVIDERS | PackageManager.GET_INSTRUMENTATION); } catch (PackageManager.NameNotFoundException e) { } if (info != null) { mPackage.setText(info.packageName); CharSequence label = null; String appClass = null; if (info.applicationInfo != null) { mIconImage.setImageDrawable( pm.getApplicationIcon(info.applicationInfo)); label = info.applicationInfo.nonLocalizedLabel; appClass = info.applicationInfo.className; if (info.applicationInfo.enabled) { mDisabled.setVisibility(View.GONE); } if ((info.applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM) == 0) { mSystem.setVisibility(View.GONE); } if ((info.applicationInfo.flags&ApplicationInfo.FLAG_DEBUGGABLE) == 0) { mDebuggable.setVisibility(View.GONE); } if ((info.applicationInfo.flags&ApplicationInfo.FLAG_HAS_CODE) != 0) { mNoCode.setVisibility(View.GONE); } if ((info.applicationInfo.flags&ApplicationInfo.FLAG_PERSISTENT) == 0) { mPersistent.setVisibility(View.GONE); } mUid.setText(Integer.toString(info.applicationInfo.uid)); mProcess.setText(info.applicationInfo.processName); if (info.versionName != null) { mVersion.setText(info.versionName + " (#" + info.versionCode + ")"); } else { mVersion.setText("(#" + info.versionCode + ")"); } mSource.setText(info.applicationInfo.sourceDir); mData.setText(info.applicationInfo.dataDir); if (info.applicationInfo.taskAffinity != null) { mTask.setText("\"" + info.applicationInfo.taskAffinity + "\""); } else { mTask.setText("(No Task Affinity)"); } } if (appClass != null) { if (appClass.startsWith(info.packageName + ".")) mClass.setText(appClass.substring(info.packageName.length())); else mClass.setText(appClass); } else { mClass.setText("(No Application Class)"); } if (label != null) { mLabel.setText("\"" + label + "\""); } else { mLabel.setText("(No Label)"); } mRestart.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try { ActivityManagerNative.getDefault().restartPackage(mPackageName); } catch (RemoteException e) { } } }); final LayoutInflater inflate = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); LinearLayout activities = (LinearLayout)findViewById(R.id.activities); LinearLayout receivers = (LinearLayout)findViewById(R.id.receivers); LinearLayout services = (LinearLayout)findViewById(R.id.services); LinearLayout providers = (LinearLayout)findViewById(R.id.providers); LinearLayout instrumentation = (LinearLayout)findViewById(R.id.instrumentation); if (info.activities != null) { final int N = info.activities.length; for (int i=0; i<N; i++) { ActivityInfo ai = info.activities[i]; // If an activity is disabled then the ActivityInfo will be null if (ai != null) { Button view = (Button)inflate.inflate( R.layout.package_item, null, false); view.setOnClickListener(new ActivityOnClick( new ComponentName(ai.applicationInfo.packageName, ai.name))); setItemText(view, info, ai.name); activities.addView(view, lp); } } } else { activities.setVisibility(View.GONE); } if (info.receivers != null) { final int N = info.receivers.length; for (int i=0; i<N; i++) { ActivityInfo ai = info.receivers[i]; Button view = (Button)inflate.inflate( R.layout.package_item, null, false); setItemText(view, info, ai.name); receivers.addView(view, lp); } } else { receivers.setVisibility(View.GONE); } if (info.services != null) { final int N = info.services.length; for (int i=0; i<N; i++) { ServiceInfo si = info.services[i]; Button view = (Button)inflate.inflate( R.layout.package_item, null, false); setItemText(view, info, si.name); services.addView(view, lp); } } else { services.setVisibility(View.GONE); } if (info.providers != null) { final int N = info.providers.length; for (int i=0; i<N; i++) { ProviderInfo pi = info.providers[i]; Button view = (Button)inflate.inflate( R.layout.package_item, null, false); setItemText(view, info, pi.name); providers.addView(view, lp); } } else { providers.setVisibility(View.GONE); } if (info.instrumentation != null) { final int N = info.instrumentation.length; for (int i=0; i<N; i++) { InstrumentationInfo ii = info.instrumentation[i]; Button view = (Button)inflate.inflate( R.layout.package_item, null, false); setItemText(view, info, ii.name); instrumentation.addView(view, lp); } } else { instrumentation.setVisibility(View.GONE); } } // Put focus here, so a button doesn't get focus and cause the // scroll view to move to it. mPackage.requestFocus(); } private final static void setItemText(Button item, PackageInfo pi, String className) { item.setText(className.substring(pi.packageName.length()+1)); } private final class ActivityOnClick implements View.OnClickListener { private final ComponentName mClassName; ActivityOnClick(ComponentName className) { mClassName = className; } public void onClick(View v) { Intent intent = new Intent( null, Uri.fromParts("component", mClassName.flattenToString(), null)); intent.setClass(PackageSummary.this, ShowActivity.class); startActivity(intent); } } }