diff options
author | Tony Mantler <nicoya@google.com> | 2016-05-23 13:07:24 -0700 |
---|---|---|
committer | Tony Mantler <nicoya@google.com> | 2016-05-23 13:08:35 -0700 |
commit | 736544bb567c0cf30d39ec34757cf34c61594305 (patch) | |
tree | ad658e87e061608173d230a9aee17e752ed9e6ef | |
parent | 2cef8a1883044ba5990460b95021a32694f134c1 (diff) | |
download | TvSettings-736544bb567c0cf30d39ec34757cf34c61594305.tar.gz |
Fix handling of app uninstalls in AppManagementFragment
Add more checks for mEntry being null
Fix nested fragment transaction handling
Fix some incorrect bail-out logic
b/28884409
Change-Id: I2c3c268a2cccf2349f8faaeaaac5ce7db86fc4f6
-rw-r--r-- | Settings/src/com/android/tv/settings/device/apps/AppManagementFragment.java | 58 |
1 files changed, 36 insertions, 22 deletions
diff --git a/Settings/src/com/android/tv/settings/device/apps/AppManagementFragment.java b/Settings/src/com/android/tv/settings/device/apps/AppManagementFragment.java index d46f2529d..796d048d4 100644 --- a/Settings/src/com/android/tv/settings/device/apps/AppManagementFragment.java +++ b/Settings/src/com/android/tv/settings/device/apps/AppManagementFragment.java @@ -64,6 +64,14 @@ public class AppManagementFragment extends LeanbackPreferenceFragment { private NotificationsPreference mNotificationsPreference; private final Handler mHandler = new Handler(); + private Runnable mBailoutRunnable = new Runnable() { + @Override + public void run() { + if (isResumed() && !getFragmentManager().popBackStackImmediate()) { + getActivity().onBackPressed(); + } + } + }; public static void prepareArgs(@NonNull Bundle args, String packageName) { args.putString(ARG_PACKAGE_NAME, packageName); @@ -77,14 +85,7 @@ public class AppManagementFragment extends LeanbackPreferenceFragment { mPackageManager = activity.getPackageManager(); mApplicationsState = ApplicationsState.getInstance(activity.getApplication()); mSession = mApplicationsState.newSession(mCallbacks); - final int userId = UserHandle.myUserId(); - mEntry = mApplicationsState.getEntry(mPackageName, userId); - if (mEntry == null) { - // This is unlikely to happen - Log.d(TAG, "App not found, trying to bail out"); - navigateBack(); - return; - } + mEntry = mApplicationsState.getEntry(mPackageName, UserHandle.myUserId()); super.onCreate(savedInstanceState); } @@ -94,19 +95,32 @@ public class AppManagementFragment extends LeanbackPreferenceFragment { super.onResume(); mSession.resume(); - mClearDefaultsPreference.refresh(); - mEnableDisablePreference.refresh(); + if (mEntry == null) { + Log.w(TAG, "App not found, trying to bail out"); + navigateBack(); + } + + if (mClearDefaultsPreference != null) { + mClearDefaultsPreference.refresh(); + } + if (mEnableDisablePreference != null) { + mEnableDisablePreference.refresh(); + } } @Override public void onPause() { super.onPause(); mSession.pause(); + mHandler.removeCallbacks(mBailoutRunnable); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); + if (mEntry == null) { + return; + } switch (requestCode) { case REQUEST_UNINSTALL: if (resultCode == Activity.RESULT_OK) { @@ -131,19 +145,13 @@ public class AppManagementFragment extends LeanbackPreferenceFragment { } private void navigateBack() { - if (!getFragmentManager().popBackStackImmediate()) { - getActivity().onBackPressed(); - } + // need to post this to avoid recursing in the fragment manager. + mHandler.removeCallbacks(mBailoutRunnable); + mHandler.post(mBailoutRunnable); } @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { - if (mEntry == null) { - // This is unlikely to happen - Log.d(TAG, "App not found, trying to bail out"); - navigateBack(); - return; - } final Context themedContext = getPreferenceManager().getContext(); final PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(themedContext); @@ -217,11 +225,17 @@ public class AppManagementFragment extends LeanbackPreferenceFragment { } public String getAppName() { + if (mEntry == null) { + return null; + } mEntry.ensureLabel(getActivity()); return mEntry.label; } public Drawable getAppIcon() { + if (mEntry == null) { + return null; + } mApplicationsState.ensureIcon(mEntry); return mEntry.icon; } @@ -319,13 +333,13 @@ public class AppManagementFragment extends LeanbackPreferenceFragment { @Override public void onPackageListChanged() { + if (mEntry == null) { + return; + } final int userId = UserHandle.getUserId(mEntry.info.uid); mEntry = mApplicationsState.getEntry(mPackageName, userId); if (mEntry == null) { - // This is unlikely to happen - Log.d(TAG, "App not found, trying to bail out"); navigateBack(); - return; } onCreatePreferences(null, null); } |