MediaRouteChooserDialog: Sort routes alphabetically
Bug: 30533647i
Change-Id: I0d860eef8156c9bee9c520f116dfc34bba7712c8
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java
index b435fb0..f492a9a 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java
@@ -21,16 +21,13 @@
import android.app.Dialog;
import android.content.Context;
-import android.content.SharedPreferences;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.net.Uri;
-import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
-import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.v7.media.MediaRouteSelector;
import android.support.v7.media.MediaRouter;
@@ -50,10 +47,8 @@
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
-import java.util.HashMap;
import java.util.List;
/**
@@ -80,8 +75,6 @@
private RouteAdapter mAdapter;
private ListView mListView;
private boolean mAttachedToWindow;
- private AsyncTask<Void, Void, Void> mRefreshRoutesTask;
- private AsyncTask<Void, Void, Void> mOnItemClickTask;
private long mLastUpdateTime;
private final Handler mHandler = new Handler() {
@Override
@@ -203,13 +196,6 @@
mAttachedToWindow = true;
mRouter.addCallback(mSelector, mCallback, MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
- // refreshRoutes() could take some time, so initial list should be shown from the beginning.
- List<MediaRouter.RouteInfo> routes = new ArrayList<>(mRouter.getRoutes());
- onFilterRoutes(routes);
- mRoutes.clear();
- mRoutes.addAll(routes);
- mAdapter.notifyDataSetChanged();
- mLastUpdateTime = 0;
refreshRoutes();
}
@@ -227,45 +213,16 @@
*/
public void refreshRoutes() {
if (mAttachedToWindow) {
- if (mRefreshRoutesTask != null) {
- mRefreshRoutesTask.cancel(true);
- mRefreshRoutesTask = null;
+ ArrayList<MediaRouter.RouteInfo> routes = new ArrayList<>(mRouter.getRoutes());
+ onFilterRoutes(routes);
+ Collections.sort(routes, RouteComparator.sInstance);
+ if (SystemClock.uptimeMillis() - mLastUpdateTime >= UPDATE_ROUTES_DELAY_MS) {
+ updateRoutes(routes);
+ } else {
+ mHandler.removeMessages(MSG_UPDATE_ROUTES);
+ mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_UPDATE_ROUTES, routes),
+ mLastUpdateTime + UPDATE_ROUTES_DELAY_MS);
}
- mRefreshRoutesTask = new AsyncTask<Void, Void, Void>() {
- private ArrayList<MediaRouter.RouteInfo> mNewRoutes;
-
- @Override
- protected void onPreExecute() {
- mNewRoutes = new ArrayList<>(mRouter.getRoutes());
- onFilterRoutes(mNewRoutes);
- }
-
- @Override
- protected Void doInBackground(Void... params) {
- // In API 4 ~ 10, AsyncTasks are running in parallel. Needs synchronization.
- synchronized (MediaRouteChooserDialog.this) {
- if (!isCancelled()) {
- RouteComparator.getInstance(getContext())
- .loadRouteUsageScores(mNewRoutes);
- Collections.sort(mNewRoutes, RouteComparator.sInstance);
- }
- }
- return null;
- }
-
- @Override
- protected void onPostExecute(Void params) {
- mRefreshRoutesTask = null;
- if (SystemClock.uptimeMillis() - mLastUpdateTime >= UPDATE_ROUTES_DELAY_MS) {
- updateRoutes(mNewRoutes);
- } else {
- mHandler.removeMessages(MSG_UPDATE_ROUTES);
- mHandler.sendMessageAtTime(
- mHandler.obtainMessage(MSG_UPDATE_ROUTES, mNewRoutes),
- mLastUpdateTime + UPDATE_ROUTES_DELAY_MS);
- }
- }
- }.execute();
}
}
@@ -344,27 +301,10 @@
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- final MediaRouter.RouteInfo route = getItem(position);
- if (route.isEnabled() && mOnItemClickTask == null) {
- mOnItemClickTask = new AsyncTask<Void, Void, Void>() {
- @Override
- protected void onPreExecute() {
- route.select();
- }
-
- @Override
- protected Void doInBackground(Void... params) {
- RouteComparator.getInstance(getContext())
- .storeRouteUsageScores(route.getId());
- return null;
- }
-
- @Override
- protected void onPostExecute(Void params) {
- dismiss();
- mOnItemClickTask = null;
- }
- }.execute();
+ MediaRouter.RouteInfo route = getItem(position);
+ if (route.isEnabled()) {
+ route.select();
+ dismiss();
}
}
@@ -426,93 +366,11 @@
}
private static final class RouteComparator implements Comparator<MediaRouter.RouteInfo> {
- private static final String PREF_ROUTE_IDS =
- "android.support.v7.app.MediaRouteChooserDialog_route_ids";
- private static final String PREF_USAGE_SCORE_PREFIX =
- "android.support.v7.app.MediaRouteChooserDialog_route_usage_score_";
- // Routes with the usage score less than MIN_USAGE_SCORE are decayed.
- private static final float MIN_USAGE_SCORE = 0.1f;
- private static final float USAGE_SCORE_DECAY_FACTOR = 0.95f;
-
- private static RouteComparator sInstance;
- private final HashMap<String, Float> mRouteUsageScoreMap;
- private final SharedPreferences mPreferences;
-
- public static RouteComparator getInstance(Context context) {
- if (sInstance == null) {
- sInstance = new RouteComparator(context);
- }
- return sInstance;
- }
-
- private RouteComparator(Context context) {
- mRouteUsageScoreMap = new HashMap();
- mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
- }
+ public static final RouteComparator sInstance = new RouteComparator();
@Override
public int compare(MediaRouter.RouteInfo lhs, MediaRouter.RouteInfo rhs) {
- if (lhs == null) {
- return rhs == null ? 0 : -1;
- } else if (rhs == null) {
- return 1;
- }
- Float lhsUsageScore = mRouteUsageScoreMap.get(lhs.getId());
- if (lhsUsageScore == null) {
- lhsUsageScore = 0f;
- }
- Float rhsUsageScore = mRouteUsageScoreMap.get(rhs.getId());
- if (rhsUsageScore == null) {
- rhsUsageScore = 0f;
- }
- if (!lhsUsageScore.equals(rhsUsageScore)) {
- return lhsUsageScore > rhsUsageScore ? -1 : 1;
- }
return lhs.getName().compareTo(rhs.getName());
}
-
- private void loadRouteUsageScores(List<MediaRouter.RouteInfo> routes) {
- for (MediaRouter.RouteInfo route : routes) {
- if (mRouteUsageScoreMap.get(route.getId()) == null) {
- mRouteUsageScoreMap.put(route.getId(),
- mPreferences.getFloat(PREF_USAGE_SCORE_PREFIX + route.getId(), 0f));
- }
- }
- }
-
- private void storeRouteUsageScores(String selectedRouteId) {
- SharedPreferences.Editor prefEditor = mPreferences.edit();
- List<String> routeIds = new ArrayList<>(
- Arrays.asList(mPreferences.getString(PREF_ROUTE_IDS, "").split(",")));
- if (!routeIds.contains(selectedRouteId)) {
- routeIds.add(selectedRouteId);
- }
- StringBuilder routeIdsBuilder = new StringBuilder();
- for (String routeId : routeIds) {
- // The new route usage score is calculated as follows:
- // 1) usageScore * USAGE_SCORE_DECAY_FACTOR + 1, if the route is selected,
- // 2) 0, if usageScore * USAGE_SCORE_DECAY_FACTOR < MIN_USAGE_SCORE, or
- // 3) usageScore * USAGE_SCORE_DECAY_FACTOR, otherwise,
- String routeUsageScoreKey = PREF_USAGE_SCORE_PREFIX + routeId;
- float newUsageScore = mPreferences.getFloat(routeUsageScoreKey, 0f)
- * USAGE_SCORE_DECAY_FACTOR;
- if (selectedRouteId.equals(routeId)) {
- newUsageScore += 1f;
- }
- if (newUsageScore < MIN_USAGE_SCORE) {
- mRouteUsageScoreMap.remove(routeId);
- prefEditor.remove(routeId);
- } else {
- mRouteUsageScoreMap.put(routeId, newUsageScore);
- prefEditor.putFloat(routeUsageScoreKey, newUsageScore);
- if (routeIdsBuilder.length() > 0) {
- routeIdsBuilder.append(',');
- }
- routeIdsBuilder.append(routeId);
- }
- }
- prefEditor.putString(PREF_ROUTE_IDS, routeIdsBuilder.toString());
- prefEditor.commit();
- }
}
}