Merge "Add exclusive attribute to suggestion category"

This commit is contained in:
Maurice Lam
2017-03-29 01:25:21 +00:00
committed by Android (Google) Code Review
4 changed files with 124 additions and 63 deletions

View File

@@ -106,11 +106,11 @@ public class SuggestionParser {
public SuggestionParser(
Context context, SharedPreferences sharedPrefs, int orderXml, String smartDismissControl) {
mContext = context;
mSuggestionList = (List<SuggestionCategory>) new SuggestionOrderInflater(mContext)
.parse(orderXml);
mSharedPrefs = sharedPrefs;
mSmartDismissControl = smartDismissControl;
this(
context,
sharedPrefs,
(List<SuggestionCategory>) new SuggestionOrderInflater(context).parse(orderXml),
smartDismissControl);
}
public SuggestionParser(Context context, SharedPreferences sharedPrefs, int orderXml) {
@@ -118,12 +118,15 @@ public class SuggestionParser {
}
@VisibleForTesting
public SuggestionParser(Context context, SharedPreferences sharedPrefs) {
public SuggestionParser(
Context context,
SharedPreferences sharedPrefs,
List<SuggestionCategory> suggestionList,
String smartDismissControl) {
mContext = context;
mSuggestionList = new ArrayList<SuggestionCategory>();
mSuggestionList = suggestionList;
mSharedPrefs = sharedPrefs;
mSmartDismissControl = DEFAULT_SMART_DISMISS_CONTROL;
Log.wtf(TAG, "Only use this constructor for testing");
mSmartDismissControl = smartDismissControl;
}
public List<Tile> getSuggestions() {
@@ -134,7 +137,19 @@ public class SuggestionParser {
List<Tile> suggestions = new ArrayList<>();
final int N = mSuggestionList.size();
for (int i = 0; i < N; i++) {
readSuggestions(mSuggestionList.get(i), suggestions, isSmartSuggestionEnabled);
final SuggestionCategory category = mSuggestionList.get(i);
if (category.exclusive) {
// If suggestions from an exclusive category are present, parsing is stopped
// and only suggestions from that category are displayed. Note that subsequent
// exclusive categories are also ignored.
List<Tile> exclusiveSuggestions = new ArrayList<>();
readSuggestions(category, exclusiveSuggestions, isSmartSuggestionEnabled);
if (!exclusiveSuggestions.isEmpty()) {
return exclusiveSuggestions;
}
} else {
readSuggestions(category, suggestions, isSmartSuggestionEnabled);
}
}
return suggestions;
}
@@ -368,6 +383,7 @@ public class SuggestionParser {
public String category;
public String pkg;
public boolean multiple;
public boolean exclusive;
}
private static class SuggestionOrderInflater {
@@ -377,6 +393,7 @@ public class SuggestionParser {
private static final String ATTR_CATEGORY = "category";
private static final String ATTR_PACKAGE = "package";
private static final String ATTR_MULTIPLE = "multiple";
private static final String ATTR_EXCLUSIVE = "exclusive";
private final Context mContext;
@@ -451,6 +468,9 @@ public class SuggestionParser {
category.pkg = attrs.getAttributeValue(null, ATTR_PACKAGE);
String multiple = attrs.getAttributeValue(null, ATTR_MULTIPLE);
category.multiple = !TextUtils.isEmpty(multiple) && Boolean.parseBoolean(multiple);
String exclusive = attrs.getAttributeValue(null, ATTR_EXCLUSIVE);
category.exclusive =
!TextUtils.isEmpty(exclusive) && Boolean.parseBoolean(exclusive);
return category;
} else {
throw new IllegalArgumentException("Unknown item " + name);

View File

@@ -15,6 +15,8 @@
-->
<optional-steps>
<step category="com.android.settings.suggested.category.DEFERRED_SETUP"
exclusive="true" />
<step category="com.android.settings.suggested.category.LOCK_SCREEN" />
<step category="com.android.settings.suggested.category.EMAIL" />
<step category="com.android.settings.suggested.category.PARTNER_ACCOUNT"

View File

@@ -16,11 +16,12 @@
package com.android.settingslib;
import static com.google.common.truth.Truth.assertThat;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.preference.PreferenceManager;
@@ -31,59 +32,59 @@ import com.android.settingslib.drawer.TileUtilsTest;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.robolectric.res.ResourceLoader;
import org.robolectric.res.builder.DefaultPackageManager;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
@RunWith(SettingLibRobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
public class SuggestionParserTest {
@Mock
private PackageManager mPackageManager;
private Context mContext;
private SuggestionParser mSuggestionParser;
private SuggestionParser.SuggestionCategory mSuggestioCategory;
private SuggestionParser.SuggestionCategory mMultipleCategory;
private SuggestionParser.SuggestionCategory mExclusiveCategory;
private List<Tile> mSuggestionsBeforeDismiss;
private List<Tile> mSuggestionsAfterDismiss;
private SharedPreferences mPrefs;
private Tile mSuggestion;
private List<ResolveInfo> mInfo;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
when(mContext.getPackageManager()).thenReturn(mPackageManager);
RuntimeEnvironment.setRobolectricPackageManager(
new TestPackageManager(RuntimeEnvironment.getAppResourceLoader()));
mContext = RuntimeEnvironment.application;
mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);
mSuggestion = new Tile();
mSuggestion.intent = new Intent("action");
mSuggestion.intent.setComponent(new ComponentName("pkg", "cls"));
mSuggestion.metaData = new Bundle();
mMultipleCategory = new SuggestionParser.SuggestionCategory();
mMultipleCategory.category = "category1";
mMultipleCategory.multiple = true;
mExclusiveCategory = new SuggestionParser.SuggestionCategory();
mExclusiveCategory.category = "category2";
mExclusiveCategory.exclusive = true;
mSuggestionParser = new SuggestionParser(
mContext, mPrefs, R.xml.suggestion_ordering, "0,0");
mSuggestioCategory = new SuggestionParser.SuggestionCategory();
mSuggestioCategory.category = "category1";
mSuggestioCategory.multiple = true;
mInfo = new ArrayList<>();
mContext, mPrefs, Arrays.asList(mMultipleCategory, mExclusiveCategory), "0,0");
ResolveInfo info1 = TileUtilsTest.newInfo(true, "category1");
info1.activityInfo.packageName = "pkg";
ResolveInfo info2 = TileUtilsTest.newInfo(true, "category1");
info2.activityInfo.packageName = "pkg2";
mInfo.add(info1);
mInfo.add(info2);
when(mPackageManager.queryIntentActivitiesAsUser(
any(Intent.class), anyInt(), anyInt())).thenReturn(mInfo);
ResolveInfo info3 = TileUtilsTest.newInfo(true, "category2");
info3.activityInfo.packageName = "pkg3";
Intent intent1 = new Intent(Intent.ACTION_MAIN).addCategory("category1");
Intent intent2 = new Intent(Intent.ACTION_MAIN).addCategory("category2");
RuntimeEnvironment.getRobolectricPackageManager().addResolveInfoForIntent(intent1, info1);
RuntimeEnvironment.getRobolectricPackageManager().addResolveInfoForIntent(intent1, info2);
RuntimeEnvironment.getRobolectricPackageManager().addResolveInfoForIntent(intent2, info3);
}
@Test
@@ -99,30 +100,64 @@ public class SuggestionParserTest {
@Test
public void testGetSuggestions_withoutSmartSuggestions() {
readAndDismissSuggestion(false);
mSuggestionParser.readSuggestions(mSuggestioCategory, mSuggestionsAfterDismiss, false);
assertThat(mSuggestionsBeforeDismiss.size()).isEqualTo(2);
assertThat(mSuggestionsAfterDismiss.size()).isEqualTo(1);
mSuggestionParser.readSuggestions(mMultipleCategory, mSuggestionsAfterDismiss, false);
assertThat(mSuggestionsBeforeDismiss).hasSize(2);
assertThat(mSuggestionsAfterDismiss).hasSize(1);
assertThat(mSuggestionsBeforeDismiss.get(1)).isEqualTo(mSuggestionsAfterDismiss.get(0));
}
@Test
public void testGetSuggestions_withSmartSuggestions() {
readAndDismissSuggestion(true);
assertThat(mSuggestionsBeforeDismiss.size()).isEqualTo(2);
assertThat(mSuggestionsAfterDismiss.size()).isEqualTo(2);
assertThat(mSuggestionsBeforeDismiss).hasSize(2);
assertThat(mSuggestionsAfterDismiss).hasSize(2);
assertThat(mSuggestionsBeforeDismiss).isEqualTo(mSuggestionsAfterDismiss);
}
@Test
public void testGetSuggestion_exclusiveNotAvailable() {
RuntimeEnvironment.getRobolectricPackageManager().removeResolveInfosForIntent(
new Intent(Intent.ACTION_MAIN).addCategory("category2"),
"pkg3");
// If exclusive item is not available, the other categories should be shown
final List<Tile> suggestions = mSuggestionParser.getSuggestions();
assertThat(suggestions).hasSize(2);
assertThat(suggestions.get(0).category).isEqualTo("category1");
assertThat(suggestions.get(1).category).isEqualTo("category1");
}
@Test
public void testGetSuggestions_exclusive() {
final List<Tile> suggestions = mSuggestionParser.getSuggestions();
assertThat(suggestions).hasSize(1);
assertThat(suggestions.get(0).category).isEqualTo("category2");
}
private void readAndDismissSuggestion(boolean isSmartSuggestionEnabled) {
mSuggestionsBeforeDismiss = new ArrayList<Tile>();
mSuggestionsAfterDismiss = new ArrayList<Tile>();
mSuggestionsBeforeDismiss = new ArrayList<>();
mSuggestionsAfterDismiss = new ArrayList<>();
mSuggestionParser.readSuggestions(
mSuggestioCategory, mSuggestionsBeforeDismiss, isSmartSuggestionEnabled);
if (mSuggestionParser.dismissSuggestion(
mSuggestionsBeforeDismiss.get(0), isSmartSuggestionEnabled)) {
mInfo.remove(0);
mMultipleCategory, mSuggestionsBeforeDismiss, isSmartSuggestionEnabled);
final Tile suggestion = mSuggestionsBeforeDismiss.get(0);
if (mSuggestionParser.dismissSuggestion(suggestion, isSmartSuggestionEnabled)) {
RuntimeEnvironment.getRobolectricPackageManager().removeResolveInfosForIntent(
new Intent(Intent.ACTION_MAIN).addCategory(suggestion.category),
suggestion.intent.getComponent().getPackageName());
}
mSuggestionParser.readSuggestions(
mSuggestioCategory, mSuggestionsAfterDismiss, isSmartSuggestionEnabled);
mMultipleCategory, mSuggestionsAfterDismiss, isSmartSuggestionEnabled);
}
private static class TestPackageManager extends DefaultPackageManager {
TestPackageManager(ResourceLoader appResourceLoader) {
super(appResourceLoader);
}
@Override
public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int flags, int userId) {
return super.queryIntentActivities(intent, flags);
}
}
}

View File

@@ -16,11 +16,22 @@
package com.android.settingslib.drawer;
import android.app.ActivityManager;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import android.content.IContentProvider;
import static org.mockito.Mockito.when;
import android.app.ActivityManager;
import android.content.ContentResolver;
import android.content.Context;
import android.content.IContentProvider;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
@@ -40,34 +51,23 @@ import android.util.Pair;
import com.android.settingslib.SuggestionParser;
import com.android.settingslib.TestConfig;
import com.android.settingslib.drawer.TileUtilsTest;
import static org.mockito.Mockito.atLeastOnce;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.shadows.ShadowApplication;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import org.mockito.ArgumentCaptor;
@RunWith(RobolectricTestRunner.class)
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
@@ -179,7 +179,11 @@ public class TileUtilsTest {
false /* checkCategory */);
assertThat(outTiles.size()).isEqualTo(1);
SuggestionParser parser = new SuggestionParser(mContext, null);
SuggestionParser parser = new SuggestionParser(
mContext,
null,
Collections.emptyList(),
"0,10");
parser.filterSuggestions(outTiles, 0, false);
assertThat(outTiles.size()).isEqualTo(0);
}