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