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; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.DialogInterface; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ActivityInfo; 26eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport android.content.pm.LabeledIntent; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.PackageManager; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.pm.ResolveInfo; 29eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackbornimport android.graphics.drawable.Drawable; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.net.Uri; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PatternMatcher; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ViewGroup; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.LayoutInflater; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.BaseAdapter; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.CheckBox; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.CompoundButton; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ImageView; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.TextView; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Collections; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashSet; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Set; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * This activity is displayed when the system attempts to start an Intent for 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which there is more than one matching activity, allowing the user to decide 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * which to go to. It is not normally used directly by application developers. 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ResolverActivity extends AlertActivity implements 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DialogInterface.OnClickListener, CheckBox.OnCheckedChangeListener { 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private ResolveListAdapter mAdapter; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private CheckBox mAlwaysCheck; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private TextView mClearDefaultHint; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PackageManager mPm; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 61905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn private Intent makeMyIntent() { 62905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn Intent intent = new Intent(getIntent()); 63905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn // The resolver activity is set to be hidden from recent tasks. 64905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn // we don't want this attribute to be propagated to the next activity 65905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn // being launched. Note that if the original Intent also had this 66905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn // flag set, we are now losing it. That should be a very rare case 67905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn // and we can live with this. 68905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn intent.setFlags(intent.getFlags()&~Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 69905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn return intent; 70905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn } 71905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onCreate(Bundle savedInstanceState) { 74905577f6345c014fc2489a8068ea967ba8c18012Dianne Hackborn onCreate(savedInstanceState, makeMyIntent(), 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getResources().getText(com.android.internal.R.string.whichApplication), 76d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0Jeff Hamilton null, null, true); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onCreate(Bundle savedInstanceState, Intent intent, 80d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0Jeff Hamilton CharSequence title, Intent[] initialIntents, List<ResolveInfo> rList, 81bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood boolean alwaysUseOption) { 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onCreate(savedInstanceState); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPm = getPackageManager(); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setComponent(null); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AlertController.AlertParams ap = mAlertParams; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ap.mTitle = title; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ap.mOnClickListener = this; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (alwaysUseOption) { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LayoutInflater inflater = (LayoutInflater) getSystemService( 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context.LAYOUT_INFLATER_SERVICE); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ap.mView = inflater.inflate(R.layout.always_use_checkbox, null); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAlwaysCheck = (CheckBox)ap.mView.findViewById(com.android.internal.R.id.alwaysUse); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAlwaysCheck.setText(R.string.alwaysUse); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAlwaysCheck.setOnCheckedChangeListener(this); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClearDefaultHint = (TextView)ap.mView.findViewById( 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.id.clearDefaultHint); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClearDefaultHint.setVisibility(View.GONE); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 102d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0Jeff Hamilton mAdapter = new ResolveListAdapter(this, intent, initialIntents, rList); 10302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood int count = mAdapter.getCount(); 104bce6f8f249ff2b65df9ed790cc460053ab8eccecMike Lockwood if (count > 1) { 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ap.mAdapter = mAdapter; 10602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } else if (count == 1) { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startActivity(mAdapter.intentForPosition(0)); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finish(); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ap.mMessage = getResources().getText(com.android.internal.R.string.noApplications); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setupAlert(); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onClick(DialogInterface dialog, int which) { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo ri = mAdapter.resolveInfoForPosition(which); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Intent intent = mAdapter.intentForPosition(which); 12002eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood boolean alwaysCheck = (mAlwaysCheck != null && mAlwaysCheck.isChecked()); 12102eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood onIntentSelected(ri, intent, alwaysCheck); 12202eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood finish(); 12302eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood } 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12502eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood protected void onIntentSelected(ResolveInfo ri, Intent intent, boolean alwaysCheck) { 12602eb8746de2d60563ec2751a34d20923192e4293Mike Lockwood if (alwaysCheck) { 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Build a reasonable intent filter, based on what matched. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentFilter filter = new IntentFilter(); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intent.getAction() != null) { 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addAction(intent.getAction()); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Set<String> categories = intent.getCategories(); 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (categories != null) { 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String cat : categories) { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addCategory(cat); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addCategory(Intent.CATEGORY_DEFAULT); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cat = ri.match&IntentFilter.MATCH_CATEGORY_MASK; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uri data = intent.getData(); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cat == IntentFilter.MATCH_CATEGORY_TYPE) { 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String mimeType = intent.resolveType(this); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mimeType != null) { 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter.addDataType(mimeType); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IntentFilter.MalformedMimeTypeException e) { 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("ResolverActivity", e); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project filter = null; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1535ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } 1545ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn if (data != null && data.getScheme() != null) { 1555ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn // We need the data specification if there was no type, 1565ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn // OR if the scheme is not one of our magical "file:" 1575ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn // or "content:" schemes (see IntentFilter for the reason). 1585ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn if (cat != IntentFilter.MATCH_CATEGORY_TYPE 1595ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn || (!"file".equals(data.getScheme()) 1605ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn && !"content".equals(data.getScheme()))) { 1615ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn filter.addDataScheme(data.getScheme()); 1625ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn 1635ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn // Look through the resolved filter to determine which part 1645ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn // of it matched the original Intent. 1655ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn Iterator<IntentFilter.AuthorityEntry> aIt = ri.filter.authoritiesIterator(); 1665ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn if (aIt != null) { 1675ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn while (aIt.hasNext()) { 1685ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn IntentFilter.AuthorityEntry a = aIt.next(); 1695ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn if (a.match(data) >= 0) { 1705ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn int port = a.getPort(); 1715ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn filter.addDataAuthority(a.getHost(), 1725ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn port >= 0 ? Integer.toString(port) : null); 1735ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn break; 1745ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1775ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn Iterator<PatternMatcher> pIt = ri.filter.pathsIterator(); 1785ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn if (pIt != null) { 1795ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn String path = data.getPath(); 1805ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn while (path != null && pIt.hasNext()) { 1815ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn PatternMatcher p = pIt.next(); 1825ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn if (p.match(path)) { 1835ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn filter.addDataPath(p.getPath(), p.getType()); 1845ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn break; 1855ef402baafc4818ccdf2aaec5da9cf25dd1c0e12Dianne Hackborn } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (filter != null) { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = mAdapter.mList.size(); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentName[] set = new ComponentName[N]; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int bestMatch = 0; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo r = mAdapter.mList.get(i).ri; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project set[i] = new ComponentName(r.activityInfo.packageName, 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r.activityInfo.name); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (r.match > bestMatch) bestMatch = r.match; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project getPackageManager().addPreferredActivity(filter, bestMatch, set, 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.getComponent()); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intent != null) { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startActivity(intent); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final class DisplayResolveInfo { 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo ri; 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence displayLabel; 214eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn Drawable displayIcon; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence extendedInfo; 216eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn Intent origIntent; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 218eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn DisplayResolveInfo(ResolveInfo pri, CharSequence pLabel, 219eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn CharSequence pInfo, Intent pOrigIntent) { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ri = pri; 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayLabel = pLabel; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project extendedInfo = pInfo; 223eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn origIntent = pOrigIntent; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final class ResolveListAdapter extends BaseAdapter { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Intent mIntent; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final LayoutInflater mInflater; 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private List<DisplayResolveInfo> mList; 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 233eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn public ResolveListAdapter(Context context, Intent intent, 234d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0Jeff Hamilton Intent[] initialIntents, List<ResolveInfo> rList) { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIntent = new Intent(intent); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mIntent.setComponent(null); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0Jeff Hamilton if (rList == null) { 240d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0Jeff Hamilton rList = mPm.queryIntentActivities( 241d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0Jeff Hamilton intent, PackageManager.MATCH_DEFAULT_ONLY 242d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0Jeff Hamilton | (mAlwaysCheck != null ? PackageManager.GET_RESOLVED_FILTER : 0)); 243d88e9aa575eb3a9d20cdb0e8918d54993e1ce1e0Jeff Hamilton } 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N; 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((rList != null) && ((N = rList.size()) > 0)) { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Only display the first matches that are either of equal 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // priority or have asked to be default options. 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo r0 = rList.get(0); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=1; i<N; i++) { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo ri = rList.get(i); 25143a17654cf4bfe7f1ec22bd8b7b32daccdf27c09Joe Onorato if (false) Log.v( 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "ResolveListActivity", 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r0.activityInfo.name + "=" + 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r0.priority + "/" + r0.isDefault + " vs " + 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ri.activityInfo.name + "=" + 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ri.priority + "/" + ri.isDefault); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (r0.priority != ri.priority || 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r0.isDefault != ri.isDefault) { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (i < N) { 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project rList.remove(i); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N--; 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 1) { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo.DisplayNameComparator rComparator = 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new ResolveInfo.DisplayNameComparator(mPm); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Collections.sort(rList, rComparator); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 270eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn 271eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn mList = new ArrayList<DisplayResolveInfo>(); 272eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn 273eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn // First put the initial items at the top. 274eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn if (initialIntents != null) { 275eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn for (int i=0; i<initialIntents.length; i++) { 276eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn Intent ii = initialIntents[i]; 277eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn if (ii == null) { 278eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn continue; 279eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn } 280eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ActivityInfo ai = ii.resolveActivityInfo( 281eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn getPackageManager(), 0); 282eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn if (ai == null) { 283eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn Log.w("ResolverActivity", "No activity found for " 284eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn + ii); 285eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn continue; 286eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn } 287eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ResolveInfo ri = new ResolveInfo(); 288eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ri.activityInfo = ai; 289eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn if (ii instanceof LabeledIntent) { 290eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn LabeledIntent li = (LabeledIntent)ii; 291eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ri.resolvePackageName = li.getSourcePackage(); 292eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ri.labelRes = li.getLabelResource(); 293eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ri.nonLocalizedLabel = li.getNonLocalizedLabel(); 294eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ri.icon = li.getIconResource(); 295eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn } 296eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn mList.add(new DisplayResolveInfo(ri, 297eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ri.loadLabel(getPackageManager()), null, ii)); 298eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn } 299eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn } 300eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check for applications with same name and use application name or 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // package name if necessary 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r0 = rList.get(0); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int start = 0; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence r0Label = r0.loadLabel(mPm); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 1; i < N; i++) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (r0Label == null) { 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r0Label = r0.activityInfo.packageName; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo ri = rList.get(i); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence riLabel = ri.loadLabel(mPm); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (riLabel == null) { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project riLabel = ri.activityInfo.packageName; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (riLabel.equals(r0Label)) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project processGroup(rList, start, (i-1), r0, r0Label); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r0 = ri; 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project r0Label = riLabel; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project start = i; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Process last group 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project processGroup(rList, start, (N-1), r0, r0Label); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void processGroup(List<ResolveInfo> rList, int start, int end, ResolveInfo ro, 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence roLabel) { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Process labels from start to i 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int num = end - start+1; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (num == 1) { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // No duplicate labels. Use label for entry at start 334eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn mList.add(new DisplayResolveInfo(ro, roLabel, null, null)); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean usePkg = false; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence startApp = ro.activityInfo.applicationInfo.loadLabel(mPm); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startApp == null) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project usePkg = true; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!usePkg) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Use HashSet to track duplicates 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HashSet<CharSequence> duplicates = 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new HashSet<CharSequence>(); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project duplicates.add(startApp); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = start+1; j <= end ; j++) { 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo jRi = rList.get(j); 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence jApp = jRi.activityInfo.applicationInfo.loadLabel(mPm); 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ( (jApp == null) || (duplicates.contains(jApp))) { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project usePkg = true; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project duplicates.add(jApp); 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Clear HashSet for later use 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project duplicates.clear(); 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = start; k <= end; k++) { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ResolveInfo add = rList.get(k); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (usePkg) { 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Use application name for all entries from start to end-1 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mList.add(new DisplayResolveInfo(add, roLabel, 364eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn add.activityInfo.packageName, null)); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Use package name for all entries from start to end-1 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mList.add(new DisplayResolveInfo(add, roLabel, 368eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn add.activityInfo.applicationInfo.loadLabel(mPm), null)); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ResolveInfo resolveInfoForPosition(int position) { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mList == null) { 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mList.get(position).ri; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Intent intentForPosition(int position) { 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mList == null) { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 387eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn DisplayResolveInfo dri = mList.get(position); 388eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn 389eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn Intent intent = new Intent(dri.origIntent != null 390eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ? dri.origIntent : mIntent); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project |Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); 393eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn ActivityInfo ai = dri.ri.activityInfo; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project intent.setComponent(new ComponentName( 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.applicationInfo.packageName, ai.name)); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return intent; 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getCount() { 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mList != null ? mList.size() : 0; 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object getItem(int position) { 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return position; 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getItemId(int position) { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return position; 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public View getView(int position, View convertView, ViewGroup parent) { 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View view; 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (convertView == null) { 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = mInflater.inflate( 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.layout.resolve_list_item, parent, false); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project view = convertView; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bindView(view, mList.get(position)); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return view; 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final void bindView(View view, DisplayResolveInfo info) { 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView text = (TextView)view.findViewById(com.android.internal.R.id.text1); 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TextView text2 = (TextView)view.findViewById(com.android.internal.R.id.text2); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ImageView icon = (ImageView)view.findViewById(R.id.icon); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text.setText(info.displayLabel); 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (info.extendedInfo != null) { 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text2.setVisibility(View.VISIBLE); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text2.setText(info.extendedInfo); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project text2.setVisibility(View.GONE); 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 434eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn if (info.displayIcon == null) { 435eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn info.displayIcon = info.ri.loadIcon(mPm); 436eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn } 437eb034652c2037a47ebfd99779e8383bb8bb528afDianne Hackborn icon.setImageDrawable(info.displayIcon); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mClearDefaultHint == null) return; 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(isChecked) { 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClearDefaultHint.setVisibility(View.VISIBLE); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mClearDefaultHint.setVisibility(View.GONE); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 452