diff options
author | Powei Feng <powei@google.com> | 2016-04-10 21:15:59 -0700 |
---|---|---|
committer | Powei Feng <powei@google.com> | 2016-04-11 15:03:06 -0700 |
commit | f95e0a8d4a27d101dc4c42a2989c553d306f2033 (patch) | |
tree | ad516f83f01137be715939a3f6f7feba2a487ad4 | |
parent | dc041645dce86b20141a5bcfc48889376f3ea3d0 (diff) | |
download | TvSettings-f95e0a8d4a27d101dc4c42a2989c553d306f2033.tar.gz |
Select correct item after wifi list updates
Picking up the discussion from ag/903250. We are not being able to
select an item immediately after update and before update animation
completes (b/28120126). This workaround delays the selection until
after the animation completes.
b/28066812
Change-Id: I484d4cb520882a770beabacb4051ebec67aee2ed
-rw-r--r-- | Settings/src/com/android/tv/settings/connectivity/setup/SelectFromListWizardFragment.java | 54 | ||||
-rw-r--r-- | Settings/src/com/android/tv/settings/connectivity/setup/WifiSetupActivity.java | 3 |
2 files changed, 52 insertions, 5 deletions
diff --git a/Settings/src/com/android/tv/settings/connectivity/setup/SelectFromListWizardFragment.java b/Settings/src/com/android/tv/settings/connectivity/setup/SelectFromListWizardFragment.java index 2fbdae126..7e674c6d7 100644 --- a/Settings/src/com/android/tv/settings/connectivity/setup/SelectFromListWizardFragment.java +++ b/Settings/src/com/android/tv/settings/connectivity/setup/SelectFromListWizardFragment.java @@ -33,6 +33,7 @@ import android.support.v7.widget.util.SortedListAdapterCallback; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver.OnPreDrawListener; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.FrameLayout; @@ -294,7 +295,7 @@ public class SelectFromListWizardFragment extends Fragment { @Override public boolean areContentsTheSame(ListItem oldItem, ListItem newItem) { - return oldItem.equals(newItem); + return comparator.compare(oldItem, newItem) == 0; } @Override @@ -381,6 +382,7 @@ public class SelectFromListWizardFragment extends Fragment { private static final String EXTRA_DESCRIPTION = "description"; private static final String EXTRA_LIST_ELEMENTS = "list_elements"; private static final String EXTRA_LAST_SELECTION = "last_selection"; + private static final int SELECT_ITEM_DELAY = 100; public static SelectFromListWizardFragment newInstance(String title, String description, ArrayList<ListItem> listElements, ListItem lastSelection) { @@ -398,6 +400,8 @@ public class SelectFromListWizardFragment extends Fragment { private View mMainView; private VerticalGridView mListView; private String mLastSelectedName; + private OnPreDrawListener mOnListPreDrawListener; + private Runnable mSelectItemRunnable; private void updateSelected(String lastSelectionName) { SortedList<ListItem> items = ((VerticalListAdapter) mListView.getAdapter()).getItems(); @@ -408,12 +412,41 @@ public class SelectFromListWizardFragment extends Fragment { break; } } + mLastSelectedName = lastSelectionName; } public void update(List<ListItem> listElements) { - VerticalListAdapter adapter = (VerticalListAdapter) mListView.getAdapter(); - adapter.updateItems(listElements); - updateSelected(mLastSelectedName); + // We want keep the highlight on the same selected item from before the update. This is + // currently not possible (b/28120126). So we post a runnable to run after the update + // completes. + if (mSelectItemRunnable != null) { + mHandler.removeCallbacks(mSelectItemRunnable); + } + + final String lastSelected = mLastSelectedName; + mSelectItemRunnable = () -> { + updateSelected(lastSelected); + if (mOnListPreDrawListener != null) { + mListView.getViewTreeObserver().removeOnPreDrawListener(mOnListPreDrawListener); + mOnListPreDrawListener = null; + } + mSelectItemRunnable = null; + }; + + if (mOnListPreDrawListener != null) { + mListView.getViewTreeObserver().removeOnPreDrawListener(mOnListPreDrawListener); + } + + mOnListPreDrawListener = () -> { + mHandler.removeCallbacks(mSelectItemRunnable); + // Pre-draw can be called multiple times per update. We delay the runnable to select + // the item so that it will only run after the last pre-draw of this batch of update. + mHandler.postDelayed(mSelectItemRunnable, SELECT_ITEM_DELAY); + return true; + }; + + mListView.getViewTreeObserver().addOnPreDrawListener(mOnListPreDrawListener); + ((VerticalListAdapter) mListView.getAdapter()).updateItems(listElements); } @Override @@ -496,6 +529,19 @@ public class SelectFromListWizardFragment extends Fragment { } @Override + public void onPause() { + super.onPause(); + if (mSelectItemRunnable != null) { + mHandler.removeCallbacks(mSelectItemRunnable); + mSelectItemRunnable = null; + } + if (mOnListPreDrawListener != null) { + mListView.getViewTreeObserver().removeOnPreDrawListener(mOnListPreDrawListener); + mOnListPreDrawListener = null; + } + } + + @Override public void onResume() { super.onResume(); mHandler.post(new Runnable() { diff --git a/Settings/src/com/android/tv/settings/connectivity/setup/WifiSetupActivity.java b/Settings/src/com/android/tv/settings/connectivity/setup/WifiSetupActivity.java index 3dc73a78e..807f41e0f 100644 --- a/Settings/src/com/android/tv/settings/connectivity/setup/WifiSetupActivity.java +++ b/Settings/src/com/android/tv/settings/connectivity/setup/WifiSetupActivity.java @@ -118,7 +118,8 @@ public class WifiSetupActivity extends WifiMultiPagedFormActivity mUserActivityListener = new FormPageDisplayer.UserActivityListener() { @Override public void onUserActivity() { - mNextNetworkRefreshTime = System.currentTimeMillis() + NETWORK_REFRESH_BUFFER_DURATION; + mNextNetworkRefreshTime = + System.currentTimeMillis() + NETWORK_REFRESH_BUFFER_DURATION; } }; |