19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.internal.app; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.R; 20e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackbornimport com.android.internal.content.PackageMonitor; 21e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn 22c587861fe8c59b7f112c333838630b54ab2b38afAdam Powellimport android.app.ActivityManager; 235320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackbornimport android.app.ActivityManagerNative; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo; 29eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport android.content.pm.LabeledIntent; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 31c587861fe8c59b7f112c333838630b54ab2b38afAdam Powellimport android.content.pm.PackageManager.NameNotFoundException; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ResolveInfo; 33c587861fe8c59b7f112c333838630b54ab2b38afAdam Powellimport android.content.res.Resources; 34eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport android.graphics.drawable.Drawable; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PatternMatcher; 385320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackbornimport android.os.Process; 395320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackbornimport android.os.RemoteException; 40f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackbornimport android.os.UserHandle; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 422d80962b2e93ae4e59d0197487bd0f6aad4cf26eAdam Powellimport android.view.LayoutInflater; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 452d80962b2e93ae4e59d0197487bd0f6aad4cf26eAdam Powellimport android.widget.AdapterView; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.BaseAdapter; 47c587861fe8c59b7f112c333838630b54ab2b38afAdam Powellimport android.widget.Button; 48c587861fe8c59b7f112c333838630b54ab2b38afAdam Powellimport android.widget.GridView; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ImageView; 502d80962b2e93ae4e59d0197487bd0f6aad4cf26eAdam Powellimport android.widget.ListView; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.TextView; 522d80962b2e93ae4e59d0197487bd0f6aad4cf26eAdam Powell 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Collections; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashSet; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This activity is displayed when the system attempts to start an Intent for 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which there is more than one matching activity, allowing the user to decide 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which to go to. It is not normally used directly by application developers. 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 65c587861fe8c59b7f112c333838630b54ab2b38afAdam Powellpublic class ResolverActivity extends AlertActivity implements AdapterView.OnItemClickListener { 66c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell private static final String TAG = "ResolverActivity"; 67c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell 685320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn private int mLaunchedFromUid; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ResolveListAdapter mAdapter; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PackageManager mPm; 71c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell private boolean mAlwaysUseOption; 72c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell private boolean mShowExtended; 73c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell private GridView mGrid; 74c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell private Button mAlwaysButton; 75c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell private Button mOnceButton; 76c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell private int mIconDpi; 77c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell private int mIconSize; 78589e6f960db7f3c208a218b7d035f01d0c8460abAdam Powell private int mMaxColumns; 79d81cc4ab5a07f4a6c5e553cb67c3aa4fe1dc8b6eAdam Powell private int mLastSelected = GridView.INVALID_POSITION; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 81d44713a63d51ba7f186c775c2a32f3c2ce018037Dianne Hackborn private boolean mRegistered; 82e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn private final PackageMonitor mPackageMonitor = new PackageMonitor() { 83e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn @Override public void onSomePackagesChanged() { 84e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn mAdapter.handlePackagesChanged(); 85e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn } 86e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn }; 87e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn 88905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn private Intent makeMyIntent() { 89905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn Intent intent = new Intent(getIntent()); 90905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn // The resolver activity is set to be hidden from recent tasks. 91905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn // we don't want this attribute to be propagated to the next activity 92905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn // being launched. Note that if the original Intent also had this 93905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn // flag set, we are now losing it. That should be a very rare case 94905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn // and we can live with this. 95905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn intent.setFlags(intent.getFlags()&~Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 96905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn return intent; 97905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn } 98905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onCreate(Bundle savedInstanceState) { 101905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn onCreate(savedInstanceState, makeMyIntent(), 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getResources().getText(com.android.internal.R.string.whichApplication), 103d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0Jeff Hamilton null, null, true); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onCreate(Bundle savedInstanceState, Intent intent, 107d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0Jeff Hamilton CharSequence title, Intent[] initialIntents, List<ResolveInfo> rList, 108bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood boolean alwaysUseOption) { 109c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell setTheme(R.style.Theme_DeviceDefault_Light_Dialog_Alert); 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onCreate(savedInstanceState); 1115320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn try { 1125320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn mLaunchedFromUid = ActivityManagerNative.getDefault().getLaunchedFromUid( 1135320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn getActivityToken()); 1145320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn } catch (RemoteException e) { 1155320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn mLaunchedFromUid = -1; 1165320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn } 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm = getPackageManager(); 118c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell mAlwaysUseOption = alwaysUseOption; 119589e6f960db7f3c208a218b7d035f01d0c8460abAdam Powell mMaxColumns = getResources().getInteger(R.integer.config_maxResolverActivityColumns); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setComponent(null); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AlertController.AlertParams ap = mAlertParams; 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ap.mTitle = title; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 126d0d7503fd3e941113094532f28986f49b11b5fdbDianne Hackborn mPackageMonitor.register(this, getMainLooper(), false); 127d44713a63d51ba7f186c775c2a32f3c2ce018037Dianne Hackborn mRegistered = true; 128e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn 129c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell final ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 130c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell mIconDpi = am.getLauncherLargeIconDensity(); 131c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell mIconSize = am.getLauncherLargeIconSize(); 132c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell 1335320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn mAdapter = new ResolveListAdapter(this, intent, initialIntents, rList, 1345320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn mLaunchedFromUid); 13502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood int count = mAdapter.getCount(); 136f02b60aa4f367516f40cf3d60fffae0c6fe3e1b8Dianne Hackborn if (mLaunchedFromUid < 0 || UserHandle.isIsolated(mLaunchedFromUid)) { 1375320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn // Gulp! 1385320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn finish(); 1395320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn return; 1405320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn } else if (count > 1) { 141c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell ap.mView = getLayoutInflater().inflate(R.layout.resolver_grid, null); 142c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell mGrid = (GridView) ap.mView.findViewById(R.id.resolver_grid); 143c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell mGrid.setAdapter(mAdapter); 144c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell mGrid.setOnItemClickListener(this); 145c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell mGrid.setOnItemLongClickListener(new ItemLongClickListener()); 146c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell 147c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell if (alwaysUseOption) { 148c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell mGrid.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 149c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } 150c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell 151c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell resizeGrid(); 15202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } else if (count == 1) { 153203a2f464cef0d873ba8a6193e288fd25b6dc907Amith Yamasani startActivity(mAdapter.intentForPosition(0)); 154d44713a63d51ba7f186c775c2a32f3c2ce018037Dianne Hackborn mPackageMonitor.unregister(); 155d44713a63d51ba7f186c775c2a32f3c2ce018037Dianne Hackborn mRegistered = false; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finish(); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 159c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell ap.mMessage = getResources().getText(R.string.noApplications); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setupAlert(); 1632d80962b2e93ae4e59d0197487bd0f6aad4cf26eAdam Powell 164c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell if (alwaysUseOption) { 165c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell final ViewGroup buttonLayout = (ViewGroup) findViewById(R.id.button_bar); 1665320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn if (buttonLayout != null) { 1675320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn buttonLayout.setVisibility(View.VISIBLE); 1685320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn mAlwaysButton = (Button) buttonLayout.findViewById(R.id.button_always); 1695320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn mOnceButton = (Button) buttonLayout.findViewById(R.id.button_once); 1705320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn } else { 1715320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn mAlwaysUseOption = false; 1725320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn } 173c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } 174c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } 175c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell 176c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell void resizeGrid() { 177c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell final int itemCount = mAdapter.getCount(); 178589e6f960db7f3c208a218b7d035f01d0c8460abAdam Powell mGrid.setNumColumns(Math.min(itemCount, mMaxColumns)); 179c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } 180c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell 181c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell Drawable getIcon(Resources res, int resId) { 182c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell Drawable result; 183c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell try { 184c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell result = res.getDrawableForDensity(resId, mIconDpi); 185c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } catch (Resources.NotFoundException e) { 186c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell result = null; 187c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } 188c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell 189c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell return result; 190c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } 191c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell 192c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell Drawable loadIconForResolveInfo(ResolveInfo ri) { 193c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell Drawable dr; 194c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell try { 195c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell if (ri.resolvePackageName != null && ri.icon != 0) { 196c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell dr = getIcon(mPm.getResourcesForApplication(ri.resolvePackageName), ri.icon); 197c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell if (dr != null) { 198c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell return dr; 199c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } 200c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } 201c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell final int iconRes = ri.getIconResource(); 202c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell if (iconRes != 0) { 203c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell dr = getIcon(mPm.getResourcesForApplication(ri.activityInfo.packageName), iconRes); 204c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell if (dr != null) { 205c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell return dr; 206c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } 207c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } 208c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } catch (NameNotFoundException e) { 209c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell Log.e(TAG, "Couldn't find resources for package", e); 2102d80962b2e93ae4e59d0197487bd0f6aad4cf26eAdam Powell } 211c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell return ri.loadIcon(mPm); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 214e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn @Override 215e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn protected void onRestart() { 216e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn super.onRestart(); 217d44713a63d51ba7f186c775c2a32f3c2ce018037Dianne Hackborn if (!mRegistered) { 218d44713a63d51ba7f186c775c2a32f3c2ce018037Dianne Hackborn mPackageMonitor.register(this, getMainLooper(), false); 219d44713a63d51ba7f186c775c2a32f3c2ce018037Dianne Hackborn mRegistered = true; 220d44713a63d51ba7f186c775c2a32f3c2ce018037Dianne Hackborn } 221e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn mAdapter.handlePackagesChanged(); 222e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn } 223e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn 224e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn @Override 225e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn protected void onStop() { 226e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn super.onStop(); 227d44713a63d51ba7f186c775c2a32f3c2ce018037Dianne Hackborn if (mRegistered) { 228d44713a63d51ba7f186c775c2a32f3c2ce018037Dianne Hackborn mPackageMonitor.unregister(); 229d44713a63d51ba7f186c775c2a32f3c2ce018037Dianne Hackborn mRegistered = false; 230d44713a63d51ba7f186c775c2a32f3c2ce018037Dianne Hackborn } 2315320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn if ((getIntent().getFlags()&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) { 2325320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn // This resolver is in the unusual situation where it has been 2335320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn // launched at the top of a new task. We don't let it be added 2345320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn // to the recent tasks shown to the user, and we need to make sure 2355320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn // that each time we are launched we get the correct launching 2365320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn // uid (not re-using the same resolver from an old launching uid), 2375320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn // so we will now finish ourself since being no longer visible, 2385320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn // the user probably can't get back to us. 2395320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn if (!isChangingConfigurations()) { 2405320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn finish(); 2415320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn } 2425320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn } 243e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn } 244e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn 245c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell @Override 2469bee4664f8bc615ad463af5317c77e98744c368aAdam Powell protected void onRestoreInstanceState(Bundle savedInstanceState) { 2479bee4664f8bc615ad463af5317c77e98744c368aAdam Powell super.onRestoreInstanceState(savedInstanceState); 2489bee4664f8bc615ad463af5317c77e98744c368aAdam Powell if (mAlwaysUseOption) { 2499bee4664f8bc615ad463af5317c77e98744c368aAdam Powell final int checkedPos = mGrid.getCheckedItemPosition(); 2509bee4664f8bc615ad463af5317c77e98744c368aAdam Powell final boolean enabled = checkedPos != GridView.INVALID_POSITION; 251d81cc4ab5a07f4a6c5e553cb67c3aa4fe1dc8b6eAdam Powell mLastSelected = checkedPos; 2529bee4664f8bc615ad463af5317c77e98744c368aAdam Powell mAlwaysButton.setEnabled(enabled); 2539bee4664f8bc615ad463af5317c77e98744c368aAdam Powell mOnceButton.setEnabled(enabled); 2549bee4664f8bc615ad463af5317c77e98744c368aAdam Powell if (enabled) { 2559bee4664f8bc615ad463af5317c77e98744c368aAdam Powell mGrid.setSelection(checkedPos); 2569bee4664f8bc615ad463af5317c77e98744c368aAdam Powell } 2579bee4664f8bc615ad463af5317c77e98744c368aAdam Powell } 2589bee4664f8bc615ad463af5317c77e98744c368aAdam Powell } 2599bee4664f8bc615ad463af5317c77e98744c368aAdam Powell 2609bee4664f8bc615ad463af5317c77e98744c368aAdam Powell @Override 261c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 262d81cc4ab5a07f4a6c5e553cb67c3aa4fe1dc8b6eAdam Powell final int checkedPos = mGrid.getCheckedItemPosition(); 263d81cc4ab5a07f4a6c5e553cb67c3aa4fe1dc8b6eAdam Powell final boolean hasValidSelection = checkedPos != GridView.INVALID_POSITION; 264bdda4e74d447812beb92504dc426c9385b3072d1Adam Powell if (mAlwaysUseOption && (!hasValidSelection || mLastSelected != checkedPos)) { 265d81cc4ab5a07f4a6c5e553cb67c3aa4fe1dc8b6eAdam Powell mAlwaysButton.setEnabled(hasValidSelection); 266d81cc4ab5a07f4a6c5e553cb67c3aa4fe1dc8b6eAdam Powell mOnceButton.setEnabled(hasValidSelection); 267d81cc4ab5a07f4a6c5e553cb67c3aa4fe1dc8b6eAdam Powell if (hasValidSelection) { 2689bee4664f8bc615ad463af5317c77e98744c368aAdam Powell mGrid.smoothScrollToPosition(checkedPos); 2699bee4664f8bc615ad463af5317c77e98744c368aAdam Powell } 270d81cc4ab5a07f4a6c5e553cb67c3aa4fe1dc8b6eAdam Powell mLastSelected = checkedPos; 271c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } else { 272c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell startSelected(position, false); 273c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } 274c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } 275c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell 276c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell public void onButtonClick(View v) { 277c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell final int id = v.getId(); 278c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell startSelected(mGrid.getCheckedItemPosition(), id == R.id.button_always); 279c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell dismiss(); 280c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } 281c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell 282c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell void startSelected(int which, boolean always) { 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo ri = mAdapter.resolveInfoForPosition(which); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = mAdapter.intentForPosition(which); 285c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell onIntentSelected(ri, intent, always); 28602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood finish(); 28702eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28902eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood protected void onIntentSelected(ResolveInfo ri, Intent intent, boolean alwaysCheck) { 29002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood if (alwaysCheck) { 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Build a reasonable intent filter, based on what matched. 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentFilter filter = new IntentFilter(); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intent.getAction() != null) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(intent.getAction()); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Set<String> categories = intent.getCategories(); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (categories != null) { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String cat : categories) { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addCategory(cat); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addCategory(Intent.CATEGORY_DEFAULT); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cat = ri.match&IntentFilter.MATCH_CATEGORY_MASK; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri data = intent.getData(); 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cat == IntentFilter.MATCH_CATEGORY_TYPE) { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String mimeType = intent.resolveType(this); 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mimeType != null) { 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addDataType(mimeType); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IntentFilter.MalformedMimeTypeException e) { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("ResolverActivity", e); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter = null; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3175ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } 3185ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn if (data != null && data.getScheme() != null) { 3195ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn // We need the data specification if there was no type, 3205ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn // OR if the scheme is not one of our magical "file:" 3215ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn // or "content:" schemes (see IntentFilter for the reason). 3225ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn if (cat != IntentFilter.MATCH_CATEGORY_TYPE 3235ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn || (!"file".equals(data.getScheme()) 3245ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn && !"content".equals(data.getScheme()))) { 3255ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn filter.addDataScheme(data.getScheme()); 3265ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn 3275ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn // Look through the resolved filter to determine which part 3285ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn // of it matched the original Intent. 3295ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn Iterator<IntentFilter.AuthorityEntry> aIt = ri.filter.authoritiesIterator(); 3305ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn if (aIt != null) { 3315ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn while (aIt.hasNext()) { 3325ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn IntentFilter.AuthorityEntry a = aIt.next(); 3335ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn if (a.match(data) >= 0) { 3345ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn int port = a.getPort(); 3355ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn filter.addDataAuthority(a.getHost(), 3365ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn port >= 0 ? Integer.toString(port) : null); 3375ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn break; 3385ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3415ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn Iterator<PatternMatcher> pIt = ri.filter.pathsIterator(); 3425ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn if (pIt != null) { 3435ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn String path = data.getPath(); 3445ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn while (path != null && pIt.hasNext()) { 3455ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn PatternMatcher p = pIt.next(); 3465ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn if (p.match(path)) { 3475ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn filter.addDataPath(p.getPath(), p.getType()); 3485ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn break; 3495ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (filter != null) { 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mAdapter.mList.size(); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName[] set = new ComponentName[N]; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int bestMatch = 0; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo r = mAdapter.mList.get(i).ri; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project set[i] = new ComponentName(r.activityInfo.packageName, 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.activityInfo.name); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (r.match > bestMatch) bestMatch = r.match; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getPackageManager().addPreferredActivity(filter, bestMatch, set, 366203a2f464cef0d873ba8a6193e288fd25b6dc907Amith Yamasani intent.getComponent()); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intent != null) { 371203a2f464cef0d873ba8a6193e288fd25b6dc907Amith Yamasani startActivity(intent); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 375c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell void showAppDetails(ResolveInfo ri) { 376c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell Intent in = new Intent().setAction("android.settings.APPLICATION_DETAILS_SETTINGS") 3770fc5b2bea09a6d320884c5b12577caf426f547c1Adam Powell .setData(Uri.fromParts("package", ri.activityInfo.packageName, null)) 3780fc5b2bea09a6d320884c5b12577caf426f547c1Adam Powell .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET); 379203a2f464cef0d873ba8a6193e288fd25b6dc907Amith Yamasani startActivity(in); 380c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } 381c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final class DisplayResolveInfo { 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo ri; 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence displayLabel; 385eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn Drawable displayIcon; 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence extendedInfo; 387eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn Intent origIntent; 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn DisplayResolveInfo(ResolveInfo pri, CharSequence pLabel, 390eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn CharSequence pInfo, Intent pOrigIntent) { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ri = pri; 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayLabel = pLabel; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project extendedInfo = pInfo; 394eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn origIntent = pOrigIntent; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final class ResolveListAdapter extends BaseAdapter { 399e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn private final Intent[] mInitialIntents; 400e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn private final List<ResolveInfo> mBaseResolveList; 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Intent mIntent; 4025320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn private final int mLaunchedFromUid; 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final LayoutInflater mInflater; 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 405e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn private List<ResolveInfo> mCurrentResolveList; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private List<DisplayResolveInfo> mList; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 408eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn public ResolveListAdapter(Context context, Intent intent, 4095320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn Intent[] initialIntents, List<ResolveInfo> rList, int launchedFromUid) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIntent = new Intent(intent); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIntent.setComponent(null); 412e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn mInitialIntents = initialIntents; 413e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn mBaseResolveList = rList; 4145320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn mLaunchedFromUid = launchedFromUid; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 416e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn rebuildList(); 417e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn } 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 419e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn public void handlePackagesChanged() { 420c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell final int oldItemCount = getCount(); 421e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn rebuildList(); 422e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn notifyDataSetChanged(); 423e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn if (mList.size() <= 0) { 424e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn // We no longer have any items... just finish the activity. 425e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn finish(); 426e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn } 427c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell 428c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell final int newItemCount = getCount(); 429c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell if (newItemCount != oldItemCount) { 430c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell resizeGrid(); 431c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell } 432e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn } 433e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn 434e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn private void rebuildList() { 435e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn if (mBaseResolveList != null) { 436e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn mCurrentResolveList = mBaseResolveList; 437e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn } else { 438203a2f464cef0d873ba8a6193e288fd25b6dc907Amith Yamasani mCurrentResolveList = mPm.queryIntentActivities( 439e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn mIntent, PackageManager.MATCH_DEFAULT_ONLY 440203a2f464cef0d873ba8a6193e288fd25b6dc907Amith Yamasani | (mAlwaysUseOption ? PackageManager.GET_RESOLVED_FILTER : 0)); 4415320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn // Filter out any activities that the launched uid does not 4425320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn // have permission for. We don't do this when we have an explicit 4435320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn // list of resolved activities, because that only happens when 4445320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn // we are being subclassed, so we can safely launch whatever 4455320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn // they gave us. 4465320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn if (mCurrentResolveList != null) { 4475320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn for (int i=mCurrentResolveList.size()-1; i >= 0; i--) { 4485320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn ActivityInfo ai = mCurrentResolveList.get(i).activityInfo; 4495320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn int granted = ActivityManager.checkComponentPermission( 4505320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn ai.permission, mLaunchedFromUid, 4515320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn ai.applicationInfo.uid, ai.exported); 4525320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn if (granted != PackageManager.PERMISSION_GRANTED) { 4535320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn // Access not allowed! 4545320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn mCurrentResolveList.remove(i); 4555320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn } 4565320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn } 4575320eb8938098c9824093f7f842a0a97bbc190a4Dianne Hackborn } 458d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0Jeff Hamilton } 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N; 460e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn if ((mCurrentResolveList != null) && ((N = mCurrentResolveList.size()) > 0)) { 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Only display the first matches that are either of equal 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // priority or have asked to be default options. 463e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn ResolveInfo r0 = mCurrentResolveList.get(0); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=1; i<N; i++) { 465e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn ResolveInfo ri = mCurrentResolveList.get(i); 46643a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato if (false) Log.v( 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "ResolveListActivity", 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r0.activityInfo.name + "=" + 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r0.priority + "/" + r0.isDefault + " vs " + 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ri.activityInfo.name + "=" + 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ri.priority + "/" + ri.isDefault); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (r0.priority != ri.priority || 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r0.isDefault != ri.isDefault) { 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 475e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn mCurrentResolveList.remove(i); 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 1) { 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo.DisplayNameComparator rComparator = 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new ResolveInfo.DisplayNameComparator(mPm); 483e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn Collections.sort(mCurrentResolveList, rComparator); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 485eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn 486eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn mList = new ArrayList<DisplayResolveInfo>(); 487eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn 488eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn // First put the initial items at the top. 489e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn if (mInitialIntents != null) { 490e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn for (int i=0; i<mInitialIntents.length; i++) { 491e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn Intent ii = mInitialIntents[i]; 492eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn if (ii == null) { 493eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn continue; 494eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn } 495eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ActivityInfo ai = ii.resolveActivityInfo( 496eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn getPackageManager(), 0); 497eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn if (ai == null) { 498eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn Log.w("ResolverActivity", "No activity found for " 499eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn + ii); 500eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn continue; 501eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn } 502eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ResolveInfo ri = new ResolveInfo(); 503eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ri.activityInfo = ai; 504eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn if (ii instanceof LabeledIntent) { 505eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn LabeledIntent li = (LabeledIntent)ii; 506eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ri.resolvePackageName = li.getSourcePackage(); 507eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ri.labelRes = li.getLabelResource(); 508eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ri.nonLocalizedLabel = li.getNonLocalizedLabel(); 509eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ri.icon = li.getIconResource(); 510eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn } 511eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn mList.add(new DisplayResolveInfo(ri, 512eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ri.loadLabel(getPackageManager()), null, ii)); 513eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn } 514eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn } 515eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check for applications with same name and use application name or 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // package name if necessary 518e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn r0 = mCurrentResolveList.get(0); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int start = 0; 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence r0Label = r0.loadLabel(mPm); 521c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell mShowExtended = false; 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 1; i < N; i++) { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (r0Label == null) { 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r0Label = r0.activityInfo.packageName; 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 526e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn ResolveInfo ri = mCurrentResolveList.get(i); 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence riLabel = ri.loadLabel(mPm); 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (riLabel == null) { 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project riLabel = ri.activityInfo.packageName; 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (riLabel.equals(r0Label)) { 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 534e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn processGroup(mCurrentResolveList, start, (i-1), r0, r0Label); 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r0 = ri; 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r0Label = riLabel; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project start = i; 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Process last group 540e8f2c7ff5abe339061f1823362e12b912c430c1aDianne Hackborn processGroup(mCurrentResolveList, start, (N-1), r0, r0Label); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void processGroup(List<ResolveInfo> rList, int start, int end, ResolveInfo ro, 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence roLabel) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Process labels from start to i 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int num = end - start+1; 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (num == 1) { 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // No duplicate labels. Use label for entry at start 550eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn mList.add(new DisplayResolveInfo(ro, roLabel, null, null)); 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 552c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell mShowExtended = true; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean usePkg = false; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence startApp = ro.activityInfo.applicationInfo.loadLabel(mPm); 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startApp == null) { 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project usePkg = true; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!usePkg) { 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Use HashSet to track duplicates 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HashSet<CharSequence> duplicates = 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new HashSet<CharSequence>(); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project duplicates.add(startApp); 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = start+1; j <= end ; j++) { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo jRi = rList.get(j); 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence jApp = jRi.activityInfo.applicationInfo.loadLabel(mPm); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ( (jApp == null) || (duplicates.contains(jApp))) { 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project usePkg = true; 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project duplicates.add(jApp); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Clear HashSet for later use 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project duplicates.clear(); 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = start; k <= end; k++) { 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo add = rList.get(k); 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (usePkg) { 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Use application name for all entries from start to end-1 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mList.add(new DisplayResolveInfo(add, roLabel, 581eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn add.activityInfo.packageName, null)); 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Use package name for all entries from start to end-1 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mList.add(new DisplayResolveInfo(add, roLabel, 585eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn add.activityInfo.applicationInfo.loadLabel(mPm), null)); 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ResolveInfo resolveInfoForPosition(int position) { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mList == null) { 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mList.get(position).ri; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent intentForPosition(int position) { 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mList == null) { 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 604eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn DisplayResolveInfo dri = mList.get(position); 605eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn 606eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn Intent intent = new Intent(dri.origIntent != null 607eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ? dri.origIntent : mIntent); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project |Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); 610eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ActivityInfo ai = dri.ri.activityInfo; 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setComponent(new ComponentName( 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.applicationInfo.packageName, ai.name)); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return intent; 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getCount() { 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mList != null ? mList.size() : 0; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object getItem(int position) { 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return position; 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getItemId(int position) { 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return position; 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View view; 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (convertView == null) { 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = mInflater.inflate( 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.layout.resolve_list_item, parent, false); 633c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell 634c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell // Fix the icon size even if we have different sized resources 635c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell ImageView icon = (ImageView)view.findViewById(R.id.icon); 636c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) icon.getLayoutParams(); 637c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell lp.width = lp.height = mIconSize; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = convertView; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bindView(view, mList.get(position)); 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return view; 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final void bindView(View view, DisplayResolveInfo info) { 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView text = (TextView)view.findViewById(com.android.internal.R.id.text1); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView text2 = (TextView)view.findViewById(com.android.internal.R.id.text2); 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ImageView icon = (ImageView)view.findViewById(R.id.icon); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text.setText(info.displayLabel); 650c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell if (mShowExtended) { 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text2.setVisibility(View.VISIBLE); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text2.setText(info.extendedInfo); 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text2.setVisibility(View.GONE); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 656eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn if (info.displayIcon == null) { 657c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell info.displayIcon = loadIconForResolveInfo(info.ri); 658eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn } 659eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn icon.setImageDrawable(info.displayIcon); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6632d80962b2e93ae4e59d0197487bd0f6aad4cf26eAdam Powell class ItemLongClickListener implements AdapterView.OnItemLongClickListener { 6642d80962b2e93ae4e59d0197487bd0f6aad4cf26eAdam Powell 6652d80962b2e93ae4e59d0197487bd0f6aad4cf26eAdam Powell @Override 6662d80962b2e93ae4e59d0197487bd0f6aad4cf26eAdam Powell public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 6672d80962b2e93ae4e59d0197487bd0f6aad4cf26eAdam Powell ResolveInfo ri = mAdapter.resolveInfoForPosition(position); 668c587861fe8c59b7f112c333838630b54ab2b38afAdam Powell showAppDetails(ri); 6692d80962b2e93ae4e59d0197487bd0f6aad4cf26eAdam Powell return true; 6702d80962b2e93ae4e59d0197487bd0f6aad4cf26eAdam Powell } 6712d80962b2e93ae4e59d0197487bd0f6aad4cf26eAdam Powell 6722d80962b2e93ae4e59d0197487bd0f6aad4cf26eAdam Powell } 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 675