AppInfoBase.java revision 39de7aedee622984cbfccca09bf2116381571d81
17dd252788645e940eada959bdde927426e2531c9Paul Duffin/*
27dd252788645e940eada959bdde927426e2531c9Paul Duffin * Copyright (C) 2015 The Android Open Source Project
37dd252788645e940eada959bdde927426e2531c9Paul Duffin *
47dd252788645e940eada959bdde927426e2531c9Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
57dd252788645e940eada959bdde927426e2531c9Paul Duffin * you may not use this file except in compliance with the License.
67dd252788645e940eada959bdde927426e2531c9Paul Duffin * You may obtain a copy of the License at
77dd252788645e940eada959bdde927426e2531c9Paul Duffin *
87dd252788645e940eada959bdde927426e2531c9Paul Duffin *      http://www.apache.org/licenses/LICENSE-2.0
97dd252788645e940eada959bdde927426e2531c9Paul Duffin *
107dd252788645e940eada959bdde927426e2531c9Paul Duffin * Unless required by applicable law or agreed to in writing, software
117dd252788645e940eada959bdde927426e2531c9Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
127dd252788645e940eada959bdde927426e2531c9Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137dd252788645e940eada959bdde927426e2531c9Paul Duffin * See the License for the specific language governing permissions and
147dd252788645e940eada959bdde927426e2531c9Paul Duffin * limitations under the License.
157dd252788645e940eada959bdde927426e2531c9Paul Duffin */
167dd252788645e940eada959bdde927426e2531c9Paul Duffin
177dd252788645e940eada959bdde927426e2531c9Paul Duffinpackage com.android.settings.applications;
187dd252788645e940eada959bdde927426e2531c9Paul Duffin
197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.app.Activity;
207dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.app.AlertDialog;
217dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.app.Dialog;
227dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.app.DialogFragment;
233ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffinimport android.app.Fragment;
247dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.app.admin.DevicePolicyManager;
257dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.content.BroadcastReceiver;
267dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.content.Context;
277dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.content.Intent;
287dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.content.IntentFilter;
297dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.content.pm.PackageInfo;
307dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.content.pm.PackageManager;
317dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.content.pm.PackageManager.NameNotFoundException;
327dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.hardware.usb.IUsbManager;
337dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.os.Bundle;
347dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.os.IBinder;
357dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.os.ServiceManager;
367dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.os.UserHandle;
377dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.os.UserManager;
387dd252788645e940eada959bdde927426e2531c9Paul Duffinimport android.util.Log;
397dd252788645e940eada959bdde927426e2531c9Paul Duffin
407dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.android.internal.logging.nano.MetricsProto;
417dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.android.settings.SettingsActivity;
427dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.android.settings.SettingsPreferenceFragment;
437dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.android.settings.Utils;
447dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.android.settings.core.instrumentation.InstrumentedDialogFragment;
457dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.android.settings.overlay.FeatureFactory;
467dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.android.settingslib.RestrictedLockUtils;
477dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.android.settingslib.applications.ApplicationsState;
487dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.android.settingslib.applications.ApplicationsState.AppEntry;
497dd252788645e940eada959bdde927426e2531c9Paul Duffin
507dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.ArrayList;
517dd252788645e940eada959bdde927426e2531c9Paul Duffin
527dd252788645e940eada959bdde927426e2531c9Paul Duffinimport static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
537dd252788645e940eada959bdde927426e2531c9Paul Duffin
540888a09821a98ac0680fad765217302858e70fa4Paul Duffinpublic abstract class AppInfoBase extends SettingsPreferenceFragment
557dd252788645e940eada959bdde927426e2531c9Paul Duffin        implements ApplicationsState.Callbacks {
567dd252788645e940eada959bdde927426e2531c9Paul Duffin
570888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public static final String ARG_PACKAGE_NAME = "package";
587dd252788645e940eada959bdde927426e2531c9Paul Duffin    public static final String ARG_PACKAGE_UID = "uid";
597dd252788645e940eada959bdde927426e2531c9Paul Duffin
607dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected static final String TAG = AppInfoBase.class.getSimpleName();
617dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected static final boolean localLOGV = false;
627dd252788645e940eada959bdde927426e2531c9Paul Duffin
637dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected EnforcedAdmin mAppsControlDisallowedAdmin;
647dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected boolean mAppsControlDisallowedBySystem;
657dd252788645e940eada959bdde927426e2531c9Paul Duffin
667dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected ApplicationFeatureProvider mApplicationFeatureProvider;
677dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected ApplicationsState mState;
687dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected ApplicationsState.Session mSession;
697dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected ApplicationsState.AppEntry mAppEntry;
707dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected PackageInfo mPackageInfo;
717dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected int mUserId;
727dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected String mPackageName;
737dd252788645e940eada959bdde927426e2531c9Paul Duffin
747dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected IUsbManager mUsbManager;
757dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected DevicePolicyManager mDpm;
767dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected UserManager mUserManager;
777dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected PackageManager mPm;
787dd252788645e940eada959bdde927426e2531c9Paul Duffin
797dd252788645e940eada959bdde927426e2531c9Paul Duffin    // Dialog identifiers used in showDialog
807dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected static final int DLG_BASE = 0;
817dd252788645e940eada959bdde927426e2531c9Paul Duffin
827dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected boolean mFinishing;
837dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected boolean mListeningToPackageRemove;
847dd252788645e940eada959bdde927426e2531c9Paul Duffin
857dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
867dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void onCreate(Bundle savedInstanceState) {
877dd252788645e940eada959bdde927426e2531c9Paul Duffin        super.onCreate(savedInstanceState);
887dd252788645e940eada959bdde927426e2531c9Paul Duffin        mFinishing = false;
897dd252788645e940eada959bdde927426e2531c9Paul Duffin        final Activity activity = getActivity();
907dd252788645e940eada959bdde927426e2531c9Paul Duffin        mApplicationFeatureProvider = FeatureFactory.getFactory(activity)
917dd252788645e940eada959bdde927426e2531c9Paul Duffin                .getApplicationFeatureProvider(activity);
927dd252788645e940eada959bdde927426e2531c9Paul Duffin        mState = ApplicationsState.getInstance(activity.getApplication());
937dd252788645e940eada959bdde927426e2531c9Paul Duffin        mSession = mState.newSession(this);
947dd252788645e940eada959bdde927426e2531c9Paul Duffin        mDpm = (DevicePolicyManager) activity.getSystemService(Context.DEVICE_POLICY_SERVICE);
957dd252788645e940eada959bdde927426e2531c9Paul Duffin        mUserManager = (UserManager) activity.getSystemService(Context.USER_SERVICE);
960888a09821a98ac0680fad765217302858e70fa4Paul Duffin        mPm = activity.getPackageManager();
970888a09821a98ac0680fad765217302858e70fa4Paul Duffin        IBinder b = ServiceManager.getService(Context.USB_SERVICE);
980888a09821a98ac0680fad765217302858e70fa4Paul Duffin        mUsbManager = IUsbManager.Stub.asInterface(b);
990888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1000888a09821a98ac0680fad765217302858e70fa4Paul Duffin        retrieveAppEntry();
1010888a09821a98ac0680fad765217302858e70fa4Paul Duffin        startListeningToPackageRemove();
1020888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1030888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1040888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
1050888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void onResume() {
1060888a09821a98ac0680fad765217302858e70fa4Paul Duffin        super.onResume();
1070888a09821a98ac0680fad765217302858e70fa4Paul Duffin        mSession.resume();
1080888a09821a98ac0680fad765217302858e70fa4Paul Duffin        mAppsControlDisallowedAdmin = RestrictedLockUtils.checkIfRestrictionEnforced(getActivity(),
1090888a09821a98ac0680fad765217302858e70fa4Paul Duffin                UserManager.DISALLOW_APPS_CONTROL, mUserId);
1100888a09821a98ac0680fad765217302858e70fa4Paul Duffin        mAppsControlDisallowedBySystem = RestrictedLockUtils.hasBaseUserRestriction(getActivity(),
1110888a09821a98ac0680fad765217302858e70fa4Paul Duffin                UserManager.DISALLOW_APPS_CONTROL, mUserId);
1120888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1130888a09821a98ac0680fad765217302858e70fa4Paul Duffin        if (!refreshUi()) {
1140888a09821a98ac0680fad765217302858e70fa4Paul Duffin            setIntentAndFinish(true, true);
1150888a09821a98ac0680fad765217302858e70fa4Paul Duffin        }
1160888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1170888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1180888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
1190888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void onPause() {
1200888a09821a98ac0680fad765217302858e70fa4Paul Duffin        mSession.pause();
1210888a09821a98ac0680fad765217302858e70fa4Paul Duffin        super.onPause();
1220888a09821a98ac0680fad765217302858e70fa4Paul Duffin    }
1230888a09821a98ac0680fad765217302858e70fa4Paul Duffin
1240888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
1257dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void onDestroy() {
1267dd252788645e940eada959bdde927426e2531c9Paul Duffin        stopListeningToPackageRemove();
1277dd252788645e940eada959bdde927426e2531c9Paul Duffin        mSession.release();
1287dd252788645e940eada959bdde927426e2531c9Paul Duffin        super.onDestroy();
1297dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1307dd252788645e940eada959bdde927426e2531c9Paul Duffin
1317dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected String retrieveAppEntry() {
1327dd252788645e940eada959bdde927426e2531c9Paul Duffin        final Bundle args = getArguments();
1337dd252788645e940eada959bdde927426e2531c9Paul Duffin        mPackageName = (args != null) ? args.getString(ARG_PACKAGE_NAME) : null;
1347dd252788645e940eada959bdde927426e2531c9Paul Duffin        if (mPackageName == null) {
1357dd252788645e940eada959bdde927426e2531c9Paul Duffin            Intent intent = (args == null) ?
1367dd252788645e940eada959bdde927426e2531c9Paul Duffin                    getActivity().getIntent() : (Intent) args.getParcelable("intent");
1377dd252788645e940eada959bdde927426e2531c9Paul Duffin            if (intent != null) {
1387dd252788645e940eada959bdde927426e2531c9Paul Duffin                mPackageName = intent.getData().getSchemeSpecificPart();
1393ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin            }
1407dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
1417dd252788645e940eada959bdde927426e2531c9Paul Duffin        mUserId = UserHandle.myUserId();
1427dd252788645e940eada959bdde927426e2531c9Paul Duffin        mAppEntry = mState.getEntry(mPackageName, mUserId);
1430888a09821a98ac0680fad765217302858e70fa4Paul Duffin        if (mAppEntry != null) {
1440888a09821a98ac0680fad765217302858e70fa4Paul Duffin            // Get application info again to refresh changed properties of application
1457dd252788645e940eada959bdde927426e2531c9Paul Duffin            try {
1467dd252788645e940eada959bdde927426e2531c9Paul Duffin                mPackageInfo = mPm.getPackageInfo(mAppEntry.info.packageName,
1477dd252788645e940eada959bdde927426e2531c9Paul Duffin                        PackageManager.MATCH_DISABLED_COMPONENTS |
1487dd252788645e940eada959bdde927426e2531c9Paul Duffin                        PackageManager.MATCH_ANY_USER |
1497dd252788645e940eada959bdde927426e2531c9Paul Duffin                        PackageManager.GET_SIGNATURES |
1507dd252788645e940eada959bdde927426e2531c9Paul Duffin                        PackageManager.GET_PERMISSIONS);
1517dd252788645e940eada959bdde927426e2531c9Paul Duffin            } catch (NameNotFoundException e) {
1527dd252788645e940eada959bdde927426e2531c9Paul Duffin                Log.e(TAG, "Exception when retrieving package:" + mAppEntry.info.packageName, e);
1537dd252788645e940eada959bdde927426e2531c9Paul Duffin            }
1547dd252788645e940eada959bdde927426e2531c9Paul Duffin        } else {
1557dd252788645e940eada959bdde927426e2531c9Paul Duffin            Log.w(TAG, "Missing AppEntry; maybe reinstalling?");
1567dd252788645e940eada959bdde927426e2531c9Paul Duffin            mPackageInfo = null;
1577dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
1587dd252788645e940eada959bdde927426e2531c9Paul Duffin
1597dd252788645e940eada959bdde927426e2531c9Paul Duffin        return mPackageName;
1607dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1617dd252788645e940eada959bdde927426e2531c9Paul Duffin
1627dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected void setIntentAndFinish(boolean finish, boolean appChanged) {
1637dd252788645e940eada959bdde927426e2531c9Paul Duffin        if (localLOGV) Log.i(TAG, "appChanged="+appChanged);
1647dd252788645e940eada959bdde927426e2531c9Paul Duffin        Intent intent = new Intent();
1657dd252788645e940eada959bdde927426e2531c9Paul Duffin        intent.putExtra(ManageApplications.APP_CHG, appChanged);
1667dd252788645e940eada959bdde927426e2531c9Paul Duffin        SettingsActivity sa = (SettingsActivity)getActivity();
1677dd252788645e940eada959bdde927426e2531c9Paul Duffin        sa.finishPreferencePanel(this, Activity.RESULT_OK, intent);
1687dd252788645e940eada959bdde927426e2531c9Paul Duffin        mFinishing = true;
1697dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1707dd252788645e940eada959bdde927426e2531c9Paul Duffin
1717dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected void showDialogInner(int id, int moveErrorCode) {
1727dd252788645e940eada959bdde927426e2531c9Paul Duffin        DialogFragment newFragment = MyAlertDialogFragment.newInstance(id, moveErrorCode);
1737dd252788645e940eada959bdde927426e2531c9Paul Duffin        newFragment.setTargetFragment(this, 0);
1747dd252788645e940eada959bdde927426e2531c9Paul Duffin        newFragment.show(getFragmentManager(), "dialog " + id);
1757dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1767dd252788645e940eada959bdde927426e2531c9Paul Duffin
1777dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected abstract boolean refreshUi();
1787dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected abstract AlertDialog createDialog(int id, int errorCode);
1797dd252788645e940eada959bdde927426e2531c9Paul Duffin
1807dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
1817dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void onRunningStateChanged(boolean running) {
1827dd252788645e940eada959bdde927426e2531c9Paul Duffin        // No op.
1837dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1847dd252788645e940eada959bdde927426e2531c9Paul Duffin
1857dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
1867dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void onRebuildComplete(ArrayList<AppEntry> apps) {
1877dd252788645e940eada959bdde927426e2531c9Paul Duffin        // No op.
1887dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1897dd252788645e940eada959bdde927426e2531c9Paul Duffin
1907dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
1917dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void onPackageIconChanged() {
1927dd252788645e940eada959bdde927426e2531c9Paul Duffin        // No op.
1937dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1947dd252788645e940eada959bdde927426e2531c9Paul Duffin
1957dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
1967dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void onPackageSizeChanged(String packageName) {
1977dd252788645e940eada959bdde927426e2531c9Paul Duffin        // No op.
1987dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
1997dd252788645e940eada959bdde927426e2531c9Paul Duffin
2007dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
2017dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void onAllSizesComputed() {
2027dd252788645e940eada959bdde927426e2531c9Paul Duffin        // No op.
2037dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2047dd252788645e940eada959bdde927426e2531c9Paul Duffin
2050888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
2060888a09821a98ac0680fad765217302858e70fa4Paul Duffin    public void onLauncherInfoChanged() {
2070888a09821a98ac0680fad765217302858e70fa4Paul Duffin        // No op.
2087dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2097dd252788645e940eada959bdde927426e2531c9Paul Duffin
2107dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
2117dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void onLoadEntriesCompleted() {
2127dd252788645e940eada959bdde927426e2531c9Paul Duffin        // No op.
2137dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2147dd252788645e940eada959bdde927426e2531c9Paul Duffin
2157dd252788645e940eada959bdde927426e2531c9Paul Duffin    @Override
2167dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void onPackageListChanged() {
2177dd252788645e940eada959bdde927426e2531c9Paul Duffin        if (!refreshUi()) {
2187dd252788645e940eada959bdde927426e2531c9Paul Duffin            setIntentAndFinish(true, true);
2197dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
2207dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2217dd252788645e940eada959bdde927426e2531c9Paul Duffin
2227dd252788645e940eada959bdde927426e2531c9Paul Duffin    public static void startAppInfoFragment(Class<?> fragment, int titleRes,
2237dd252788645e940eada959bdde927426e2531c9Paul Duffin            String pkg, int uid, Fragment source, int request, int sourceMetricsCategory) {
2247dd252788645e940eada959bdde927426e2531c9Paul Duffin        startAppInfoFragment(fragment, titleRes, pkg, uid, source.getActivity(), request,
2257dd252788645e940eada959bdde927426e2531c9Paul Duffin                sourceMetricsCategory);
2267dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2277dd252788645e940eada959bdde927426e2531c9Paul Duffin
2287dd252788645e940eada959bdde927426e2531c9Paul Duffin    public static void startAppInfoFragment(Class<?> fragment, int titleRes,
2297dd252788645e940eada959bdde927426e2531c9Paul Duffin            String pkg, int uid, Activity source, int request, int sourceMetricsCategory) {
2307dd252788645e940eada959bdde927426e2531c9Paul Duffin        Bundle args = new Bundle();
2317dd252788645e940eada959bdde927426e2531c9Paul Duffin        args.putString(AppInfoBase.ARG_PACKAGE_NAME, pkg);
2327dd252788645e940eada959bdde927426e2531c9Paul Duffin        args.putInt(AppInfoBase.ARG_PACKAGE_UID, uid);
2337dd252788645e940eada959bdde927426e2531c9Paul Duffin
2347dd252788645e940eada959bdde927426e2531c9Paul Duffin        Intent intent = Utils.onBuildStartFragmentIntent(source, fragment.getName(),
2357dd252788645e940eada959bdde927426e2531c9Paul Duffin                args, null, titleRes, null, false, sourceMetricsCategory);
2367dd252788645e940eada959bdde927426e2531c9Paul Duffin        source.startActivityForResultAsUser(intent, request,
2373ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin                new UserHandle(UserHandle.getUserId(uid)));
2387dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2397dd252788645e940eada959bdde927426e2531c9Paul Duffin
2407dd252788645e940eada959bdde927426e2531c9Paul Duffin    public static class MyAlertDialogFragment extends InstrumentedDialogFragment {
2417dd252788645e940eada959bdde927426e2531c9Paul Duffin
2420888a09821a98ac0680fad765217302858e70fa4Paul Duffin        private static final String ARG_ID = "id";
2430888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2440888a09821a98ac0680fad765217302858e70fa4Paul Duffin        @Override
2450888a09821a98ac0680fad765217302858e70fa4Paul Duffin        public int getMetricsCategory() {
2460888a09821a98ac0680fad765217302858e70fa4Paul Duffin            return MetricsProto.MetricsEvent.DIALOG_APP_INFO_ACTION;
2470888a09821a98ac0680fad765217302858e70fa4Paul Duffin        }
2480888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2490888a09821a98ac0680fad765217302858e70fa4Paul Duffin        @Override
2507dd252788645e940eada959bdde927426e2531c9Paul Duffin        public Dialog onCreateDialog(Bundle savedInstanceState) {
2517dd252788645e940eada959bdde927426e2531c9Paul Duffin            int id = getArguments().getInt(ARG_ID);
2527dd252788645e940eada959bdde927426e2531c9Paul Duffin            int errorCode = getArguments().getInt("moveError");
2537dd252788645e940eada959bdde927426e2531c9Paul Duffin            Dialog dialog = ((AppInfoBase) getTargetFragment()).createDialog(id, errorCode);
2547dd252788645e940eada959bdde927426e2531c9Paul Duffin            if (dialog == null) {
2557dd252788645e940eada959bdde927426e2531c9Paul Duffin                throw new IllegalArgumentException("unknown id " + id);
2567dd252788645e940eada959bdde927426e2531c9Paul Duffin            }
2577dd252788645e940eada959bdde927426e2531c9Paul Duffin            return dialog;
2587dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
2597dd252788645e940eada959bdde927426e2531c9Paul Duffin
2607dd252788645e940eada959bdde927426e2531c9Paul Duffin        public static MyAlertDialogFragment newInstance(int id, int errorCode) {
2617dd252788645e940eada959bdde927426e2531c9Paul Duffin            MyAlertDialogFragment dialogFragment = new MyAlertDialogFragment();
2627dd252788645e940eada959bdde927426e2531c9Paul Duffin            Bundle args = new Bundle();
2637dd252788645e940eada959bdde927426e2531c9Paul Duffin            args.putInt(ARG_ID, id);
2647dd252788645e940eada959bdde927426e2531c9Paul Duffin            args.putInt("moveError", errorCode);
2657dd252788645e940eada959bdde927426e2531c9Paul Duffin            dialogFragment.setArguments(args);
2667dd252788645e940eada959bdde927426e2531c9Paul Duffin            return dialogFragment;
2677dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
2687dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2697dd252788645e940eada959bdde927426e2531c9Paul Duffin
2700888a09821a98ac0680fad765217302858e70fa4Paul Duffin    protected void startListeningToPackageRemove() {
2717dd252788645e940eada959bdde927426e2531c9Paul Duffin        if (mListeningToPackageRemove) {
2727dd252788645e940eada959bdde927426e2531c9Paul Duffin            return;
2737dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
2747dd252788645e940eada959bdde927426e2531c9Paul Duffin        mListeningToPackageRemove = true;
2757dd252788645e940eada959bdde927426e2531c9Paul Duffin        final IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED);
2767dd252788645e940eada959bdde927426e2531c9Paul Duffin        filter.addDataScheme("package");
2777dd252788645e940eada959bdde927426e2531c9Paul Duffin        getContext().registerReceiver(mPackageRemovedReceiver, filter);
2787dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2797dd252788645e940eada959bdde927426e2531c9Paul Duffin
2807dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected void stopListeningToPackageRemove() {
2817dd252788645e940eada959bdde927426e2531c9Paul Duffin        if (!mListeningToPackageRemove) {
2827dd252788645e940eada959bdde927426e2531c9Paul Duffin            return;
2830888a09821a98ac0680fad765217302858e70fa4Paul Duffin        }
2847dd252788645e940eada959bdde927426e2531c9Paul Duffin        mListeningToPackageRemove = false;
2857dd252788645e940eada959bdde927426e2531c9Paul Duffin        getContext().unregisterReceiver(mPackageRemovedReceiver);
2867dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2877dd252788645e940eada959bdde927426e2531c9Paul Duffin
2887dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected void onPackageRemoved() {
2897dd252788645e940eada959bdde927426e2531c9Paul Duffin        getActivity().finishAndRemoveTask();
2907dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2910888a09821a98ac0680fad765217302858e70fa4Paul Duffin
2927dd252788645e940eada959bdde927426e2531c9Paul Duffin    protected final BroadcastReceiver mPackageRemovedReceiver = new BroadcastReceiver() {
2933ecfa412eddc4b084663f38d562537b86b9734d5Paul Duffin        @Override
2947dd252788645e940eada959bdde927426e2531c9Paul Duffin        public void onReceive(Context context, Intent intent) {
2957dd252788645e940eada959bdde927426e2531c9Paul Duffin            String packageName = intent.getData().getSchemeSpecificPart();
2967dd252788645e940eada959bdde927426e2531c9Paul Duffin            if (!mFinishing && mAppEntry.info.packageName.equals(packageName)) {
2970888a09821a98ac0680fad765217302858e70fa4Paul Duffin                onPackageRemoved();
2980888a09821a98ac0680fad765217302858e70fa4Paul Duffin            }
2997dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
3007dd252788645e940eada959bdde927426e2531c9Paul Duffin    };
3017dd252788645e940eada959bdde927426e2531c9Paul Duffin
3027dd252788645e940eada959bdde927426e2531c9Paul Duffin}
3037dd252788645e940eada959bdde927426e2531c9Paul Duffin