summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPowei Feng <powei@google.com>2016-04-10 21:15:59 -0700
committerPowei Feng <powei@google.com>2016-04-11 15:03:06 -0700
commitf95e0a8d4a27d101dc4c42a2989c553d306f2033 (patch)
treead516f83f01137be715939a3f6f7feba2a487ad4
parentdc041645dce86b20141a5bcfc48889376f3ea3d0 (diff)
downloadTvSettings-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.java54
-rw-r--r--Settings/src/com/android/tv/settings/connectivity/setup/WifiSetupActivity.java3
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;
}
};