[Slice] Improve "forward" API.

The updated API handles the case that preview panel can be replaced from
InfoFragment into regular SliceFragment after user performs the action
in the external activity through pendingintent.

Test: Manual.

Change-Id: Ie553c33b17f8db8842dfd67a23b4d3329ee3d2f4
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/TwoPanelSettingsFragment.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/TwoPanelSettingsFragment.java
index 8444f6c..c4347b4 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/TwoPanelSettingsFragment.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/TwoPanelSettingsFragment.java
@@ -840,7 +840,7 @@
                     updateInfoFragmentStatus(fragment);
                 }
                 if (chosenPreference instanceof ListPreference) {
-                    onPreferenceFocusedImpl(chosenPreference, true);
+                    refocusPreferenceForceRefresh(chosenPreference);
                 }
             }
         } catch (ClassNotFoundException e) {
@@ -848,6 +848,11 @@
         }
     }
 
+    /** Force refresh preview panel. */
+    public void refocusPreferenceForceRefresh(Preference chosenPreference) {
+        onPreferenceFocusedImpl(chosenPreference, true);
+    }
+
     /** Show error message in preview panel **/
     public void showErrorMessage(String errorMessage) {
         Fragment prefFragment =
@@ -873,7 +878,8 @@
         }
     }
 
-    private static Preference getChosenPreference(Fragment fragment) {
+    /** Get the current chosen preference. */
+    public static Preference getChosenPreference(Fragment fragment) {
         if (!(fragment instanceof LeanbackPreferenceFragment)) {
             return null;
         }
diff --git a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SliceFragment.java b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SliceFragment.java
index 7e926e4..a76ee6e 100644
--- a/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SliceFragment.java
+++ b/TwoPanelSettingsLib/src/com/android/tv/twopanelsettings/slices/SliceFragment.java
@@ -99,6 +99,9 @@
     private Intent mFollowupPendingIntentExtras;
     private Intent mFollowupPendingIntentExtrasCopy;
     private String mLastFocusedPreferenceKey;
+    private boolean mIsMainPanelReady = true;
+
+    private Handler mHandler = new Handler();
     private ContentObserver mContentObserver = new ContentObserver(new Handler()) {
         @Override
         public void onChange(boolean selfChange, Uri uri) {
@@ -216,7 +219,6 @@
     }
 
     private void update() {
-        // TODO: Remove ListContent
         mListContent = new ListContent(mSlice);
         PreferenceScreen preferenceScreen =
                 getPreferenceManager().getPreferenceScreen();
@@ -292,7 +294,6 @@
                 }
             }
         }
-
         updatePreferenceScreen(preferenceScreen, newPrefs);
         if (defaultFocusedKey != null) {
             scrollToPreference(defaultFocusedKey.toString());
@@ -303,6 +304,7 @@
         if (getParentFragment() instanceof TwoPanelSettingsFragment) {
             ((TwoPanelSettingsFragment) getParentFragment()).refocusPreference(this);
         }
+        mIsMainPanelReady = true;
     }
 
 
@@ -319,12 +321,25 @@
     }
 
     private void forward() {
-        if (getCallbackFragment() instanceof TwoPanelSettingsFragment) {
-            TwoPanelSettingsFragment parentFragment =
-                    (TwoPanelSettingsFragment) getCallbackFragment();
-            if (parentFragment.isFragmentInTheMainPanel(this)) {
-                parentFragment.navigateToPreviewFragment();
+        if (mIsMainPanelReady) {
+            if (getCallbackFragment() instanceof TwoPanelSettingsFragment) {
+                TwoPanelSettingsFragment parentFragment =
+                        (TwoPanelSettingsFragment) getCallbackFragment();
+                Preference chosenPreference = parentFragment.getChosenPreference(this);
+                if (chosenPreference == null) {
+                    chosenPreference = findPreference(mLastFocusedPreferenceKey);
+                }
+                if (chosenPreference != null && chosenPreference instanceof HasSliceUri
+                        && ((HasSliceUri) chosenPreference).getUri() != null) {
+                    chosenPreference.setFragment(SliceFragment.class.getCanonicalName());
+                    parentFragment.refocusPreferenceForceRefresh(chosenPreference);
+                }
+                if (parentFragment.isFragmentInTheMainPanel(this)) {
+                    parentFragment.navigateToPreviewFragment();
+                }
             }
+        } else {
+            mHandler.post(() -> forward());
         }
     }
 
@@ -421,7 +436,9 @@
             SliceRadioPreference radioPref = (SliceRadioPreference) preference;
             if (!radioPref.isChecked()) {
                 radioPref.setChecked(true);
-                return true;
+                if (TextUtils.isEmpty(radioPref.getUri())) {
+                    return true;
+                }
             }
 
             logEntrySelected(getPreferenceActionId(preference));
@@ -544,6 +561,7 @@
         } else {
             hideProgressBar();
         }
+        mIsMainPanelReady = false;
         update();
     }