summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTony Mantler <nicoya@google.com>2016-05-23 13:07:24 -0700
committerTony Mantler <nicoya@google.com>2016-05-23 13:08:35 -0700
commit736544bb567c0cf30d39ec34757cf34c61594305 (patch)
treead658e87e061608173d230a9aee17e752ed9e6ef
parent2cef8a1883044ba5990460b95021a32694f134c1 (diff)
downloadTvSettings-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.java58
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);
}