Deprecate SettingsDrawerActivity.openTile.

Use DashboardFeatureProvider to open tile instead. This makes logic more
centralized in one place, and makes logging easier in the future.

Bug: 30137094
Test: RunSettingsRoboTests
Change-Id: I8a028bb7cac8f70f6c237f253be8668cc3ef257e
This commit is contained in:
Fan Zhang
2017-02-13 14:24:36 -08:00
parent 33b0a66aee
commit 628b3cb76e
4 changed files with 71 additions and 18 deletions

View File

@@ -15,6 +15,7 @@
*/ */
package com.android.settings.dashboard; package com.android.settings.dashboard;
import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.res.TypedArray; import android.content.res.TypedArray;
@@ -28,7 +29,6 @@ import android.support.v7.widget.RecyclerView;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.Log; import android.util.Log;
import android.util.TypedValue;
import android.view.ContextThemeWrapper; import android.view.ContextThemeWrapper;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.MenuItem; import android.view.MenuItem;
@@ -61,15 +61,17 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
private final IconCache mCache; private final IconCache mCache;
private final Context mContext; private final Context mContext;
private final MetricsFeatureProvider mMetricsFeatureProvider; private final MetricsFeatureProvider mMetricsFeatureProvider;
private final DashboardFeatureProvider mDashboardFeatureProvider;
private SuggestionParser mSuggestionParser; private SuggestionParser mSuggestionParser;
@VisibleForTesting DashboardData mDashboardData; @VisibleForTesting
DashboardData mDashboardData;
private View.OnClickListener mTileClickListener = new View.OnClickListener() { private View.OnClickListener mTileClickListener = new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
//TODO: get rid of setTag/getTag //TODO: get rid of setTag/getTag
((SettingsActivity) mContext).openTile((Tile) v.getTag()); mDashboardFeatureProvider.openTileIntent((Activity) mContext, (Tile) v.getTag());
} }
}; };
@@ -105,6 +107,8 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
mContext = context; mContext = context;
mMetricsFeatureProvider = metricsFeatureProvider; mMetricsFeatureProvider = metricsFeatureProvider;
mDashboardFeatureProvider = FeatureFactory.getFactory(context)
.getDashboardFeatureProvider(context);
mCache = new IconCache(context); mCache = new IconCache(context);
mSuggestionParser = parser; mSuggestionParser = parser;
@@ -132,9 +136,9 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
public void setCategoriesAndSuggestions(List<DashboardCategory> categories, public void setCategoriesAndSuggestions(List<DashboardCategory> categories,
List<Tile> suggestions) { List<Tile> suggestions) {
// TODO: Better place for tinting? // TODO: Better place for tinting?
final TypedArray a = mContext.obtainStyledAttributes(new int[] { final TypedArray a = mContext.obtainStyledAttributes(new int[]{
FeatureFactory.getFactory(mContext).getDashboardFeatureProvider(mContext).isEnabled() mDashboardFeatureProvider.isEnabled()
? android.R.attr.colorControlNormal : android.R.attr.colorAccent }); ? android.R.attr.colorControlNormal : android.R.attr.colorAccent});
int tintColor = a.getColor(0, mContext.getColor(android.R.color.white)); int tintColor = a.getColor(0, mContext.getColor(android.R.color.white));
a.recycle(); a.recycle();
for (int i = 0; i < categories.size(); i++) { for (int i = 0; i < categories.size(); i++) {
@@ -405,12 +409,10 @@ public class DashboardAdapter extends RecyclerView.Adapter<DashboardAdapter.Dash
final List<Tile> suggestions = mDashboardData.getSuggestions(); final List<Tile> suggestions = mDashboardData.getSuggestions();
final List<DashboardCategory> categories = mDashboardData.getCategories(); final List<DashboardCategory> categories = mDashboardData.getCategories();
if (suggestions != null) { if (suggestions != null) {
outState.putParcelableArrayList(STATE_SUGGESTION_LIST, outState.putParcelableArrayList(STATE_SUGGESTION_LIST, new ArrayList<>(suggestions));
new ArrayList<Tile>(suggestions));
} }
if (categories != null) { if (categories != null) {
outState.putParcelableArrayList(STATE_CATEGORY_LIST, outState.putParcelableArrayList(STATE_CATEGORY_LIST, new ArrayList<>(categories));
new ArrayList<DashboardCategory>(categories));
} }
outState.putInt(STATE_SUGGESTION_MODE, mDashboardData.getSuggestionMode()); outState.putInt(STATE_SUGGESTION_MODE, mDashboardData.getSuggestionMode());
} }

View File

@@ -93,4 +93,9 @@ public interface DashboardFeatureProvider {
*/ */
String getExtraIntentAction(); String getExtraIntentAction();
/**
* Opens a tile to its destination intent.
*/
void openTileIntent(Activity activity, Tile tile);
} }

View File

@@ -21,6 +21,7 @@ import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.VisibleForTesting; import android.support.annotation.VisibleForTesting;
import android.support.v7.preference.Preference; import android.support.v7.preference.Preference;
import android.text.TextUtils; import android.text.TextUtils;
@@ -30,6 +31,7 @@ import com.android.settings.SettingsActivity;
import com.android.settingslib.drawer.CategoryManager; import com.android.settingslib.drawer.CategoryManager;
import com.android.settingslib.drawer.DashboardCategory; import com.android.settingslib.drawer.DashboardCategory;
import com.android.settingslib.drawer.ProfileSelectDialog; import com.android.settingslib.drawer.ProfileSelectDialog;
import com.android.settingslib.drawer.SettingsDrawerActivity;
import com.android.settingslib.drawer.Tile; import com.android.settingslib.drawer.Tile;
import java.util.ArrayList; import java.util.ArrayList;
@@ -149,14 +151,7 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
intent.setAction(action); intent.setAction(action);
} }
pref.setOnPreferenceClickListener(preference -> { pref.setOnPreferenceClickListener(preference -> {
ProfileSelectDialog.updateUserHandlesIfNeeded(mContext, tile); launchIntentOrSelectProfile(activity, tile, intent);
if (tile.userHandle == null) {
activity.startActivityForResult(intent, 0);
} else if (tile.userHandle.size() == 1) {
activity.startActivityForResultAsUser(intent, 0, tile.userHandle.get(0));
} else {
ProfileSelectDialog.show(activity.getFragmentManager(), tile);
}
return true; return true;
}); });
} }
@@ -188,4 +183,33 @@ public class DashboardFeatureProviderImpl implements DashboardFeatureProvider {
public String getExtraIntentAction() { public String getExtraIntentAction() {
return null; return null;
} }
@Override
public void openTileIntent(Activity activity, Tile tile) {
if (tile == null) {
Intent intent = new Intent(Settings.ACTION_SETTINGS).addFlags(
Intent.FLAG_ACTIVITY_CLEAR_TASK);
mContext.startActivity(intent);
return;
}
if (tile.intent == null) {
return;
}
final Intent intent = new Intent(tile.intent)
.putExtra(SettingsDrawerActivity.EXTRA_SHOW_MENU, true)
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
launchIntentOrSelectProfile(activity, tile, intent);
}
private void launchIntentOrSelectProfile(Activity activity, Tile tile, Intent intent) {
ProfileSelectDialog.updateUserHandlesIfNeeded(mContext, tile);
if (tile.userHandle == null) {
activity.startActivityForResult(intent, 0);
} else if (tile.userHandle.size() == 1) {
activity.startActivityForResultAsUser(intent, 0, tile.userHandle.get(0));
} else {
ProfileSelectDialog.show(activity.getFragmentManager(), tile);
}
}
} }

View File

@@ -50,6 +50,7 @@ import java.util.ArrayList;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any; import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq; import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
@@ -140,6 +141,27 @@ public class DashboardFeatureProviderImplTest {
verify(mActivity).getFragmentManager(); verify(mActivity).getFragmentManager();
} }
@Test
public void bindPreference_noFragmentMetadataSingleUser_shouldBindToDirectLaunchIntent() {
final Preference preference = new Preference(
ShadowApplication.getInstance().getApplicationContext());
final Tile tile = new Tile();
tile.metaData = new Bundle();
tile.userHandle = new ArrayList<>();
tile.userHandle.add(mock(UserHandle.class));
tile.intent = new Intent();
tile.intent.setComponent(new ComponentName("pkg", "class"));
when(mActivity.getSystemService(Context.USER_SERVICE))
.thenReturn(mUserManager);
mImpl.bindPreferenceToTile(mActivity, preference, tile, "123", Preference.DEFAULT_ORDER);
preference.getOnPreferenceClickListener().onPreferenceClick(null);
verify(mActivity)
.startActivityForResultAsUser(any(Intent.class), anyInt(), any(UserHandle.class));
}
@Test @Test
public void bindPreference_withNullKeyNullPriority_shouldGenerateKeyAndPriority() { public void bindPreference_withNullKeyNullPriority_shouldGenerateKeyAndPriority() {
final Preference preference = new Preference( final Preference preference = new Preference(