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