Merge "Add subtext to Default apps." into oc-dev
am: 1e775c117a
Change-Id: I5e06cdb4513bbc8e2ee23592e5d90f1a9481f994
This commit is contained in:
@@ -15,9 +15,11 @@
|
|||||||
*/
|
*/
|
||||||
package com.android.settings.applications;
|
package com.android.settings.applications;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.provider.SearchIndexableResource;
|
import android.provider.SearchIndexableResource;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.applications.defaultapps.DefaultBrowserPreferenceController;
|
import com.android.settings.applications.defaultapps.DefaultBrowserPreferenceController;
|
||||||
@@ -29,6 +31,7 @@ import com.android.settings.applications.defaultapps.DefaultWorkBrowserPreferenc
|
|||||||
import com.android.settings.applications.defaultapps.DefaultWorkPhonePreferenceController;
|
import com.android.settings.applications.defaultapps.DefaultWorkPhonePreferenceController;
|
||||||
import com.android.settings.core.PreferenceController;
|
import com.android.settings.core.PreferenceController;
|
||||||
import com.android.settings.dashboard.DashboardFragment;
|
import com.android.settings.dashboard.DashboardFragment;
|
||||||
|
import com.android.settings.dashboard.SummaryLoader;
|
||||||
import com.android.settings.search.BaseSearchIndexProvider;
|
import com.android.settings.search.BaseSearchIndexProvider;
|
||||||
import com.android.settings.search.Indexable;
|
import com.android.settings.search.Indexable;
|
||||||
|
|
||||||
@@ -78,4 +81,55 @@ public class AdvancedAppSettings extends DashboardFragment {
|
|||||||
return Arrays.asList(sir);
|
return Arrays.asList(sir);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static class SummaryProvider implements SummaryLoader.SummaryProvider {
|
||||||
|
|
||||||
|
private final Context mContext;
|
||||||
|
private final SummaryLoader mSummaryLoader;
|
||||||
|
private final DefaultSmsPreferenceController mDefaultSmsPreferenceController;
|
||||||
|
private final DefaultBrowserPreferenceController mDefaultBrowserPreferenceController;
|
||||||
|
private final DefaultPhonePreferenceController mDefaultPhonePreferenceController;
|
||||||
|
|
||||||
|
public SummaryProvider(Context context, SummaryLoader summaryLoader) {
|
||||||
|
mContext = context;
|
||||||
|
mSummaryLoader = summaryLoader;
|
||||||
|
mDefaultSmsPreferenceController = new DefaultSmsPreferenceController(mContext);
|
||||||
|
mDefaultBrowserPreferenceController = new DefaultBrowserPreferenceController(mContext);
|
||||||
|
mDefaultPhonePreferenceController = new DefaultPhonePreferenceController(mContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setListening(boolean listening) {
|
||||||
|
if (!listening) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
CharSequence summary = concatSummaryText(
|
||||||
|
mDefaultSmsPreferenceController.getDefaultAppLabel(),
|
||||||
|
mDefaultBrowserPreferenceController.getDefaultAppLabel());
|
||||||
|
summary = concatSummaryText(summary,
|
||||||
|
mDefaultPhonePreferenceController.getDefaultAppLabel());
|
||||||
|
if (!TextUtils.isEmpty(summary)) {
|
||||||
|
mSummaryLoader.setSummary(this, summary);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private CharSequence concatSummaryText(CharSequence summary1, CharSequence summary2) {
|
||||||
|
if (TextUtils.isEmpty(summary1)) {
|
||||||
|
return summary2;
|
||||||
|
}
|
||||||
|
if (TextUtils.isEmpty(summary2)) {
|
||||||
|
return summary1;
|
||||||
|
}
|
||||||
|
return mContext.getString(R.string.join_many_items_middle, summary1, summary2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY =
|
||||||
|
new SummaryLoader.SummaryProviderFactory() {
|
||||||
|
@Override
|
||||||
|
public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
|
||||||
|
SummaryLoader summaryLoader) {
|
||||||
|
return new AdvancedAppSettings.SummaryProvider(activity, summaryLoader);
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
@@ -49,10 +49,7 @@ public abstract class DefaultAppPreferenceController extends PreferenceControlle
|
|||||||
@Override
|
@Override
|
||||||
public void updateState(Preference preference) {
|
public void updateState(Preference preference) {
|
||||||
final DefaultAppInfo app = getDefaultAppInfo();
|
final DefaultAppInfo app = getDefaultAppInfo();
|
||||||
CharSequence defaultAppLabel = null;
|
CharSequence defaultAppLabel = getDefaultAppLabel();
|
||||||
if (app != null) {
|
|
||||||
defaultAppLabel = app.loadLabel();
|
|
||||||
}
|
|
||||||
if (!TextUtils.isEmpty(defaultAppLabel)) {
|
if (!TextUtils.isEmpty(defaultAppLabel)) {
|
||||||
preference.setSummary(defaultAppLabel);
|
preference.setSummary(defaultAppLabel);
|
||||||
} else {
|
} else {
|
||||||
@@ -84,4 +81,15 @@ public abstract class DefaultAppPreferenceController extends PreferenceControlle
|
|||||||
//By default return null. It's up to subclasses to provide logic.
|
//By default return null. It's up to subclasses to provide logic.
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public CharSequence getDefaultAppLabel() {
|
||||||
|
if (!isAvailable()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
final DefaultAppInfo app = getDefaultAppInfo();
|
||||||
|
if (app != null) {
|
||||||
|
return app.loadLabel();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -51,13 +51,9 @@ public class DefaultBrowserPreferenceController extends DefaultAppPreferenceCont
|
|||||||
@Override
|
@Override
|
||||||
public void updateState(Preference preference) {
|
public void updateState(Preference preference) {
|
||||||
super.updateState(preference);
|
super.updateState(preference);
|
||||||
final DefaultAppInfo defaultApp = getDefaultAppInfo();
|
final CharSequence defaultAppLabel = getDefaultAppLabel();
|
||||||
final CharSequence defaultAppLabel = defaultApp != null ? defaultApp.loadLabel() : null;
|
if (!TextUtils.isEmpty(defaultAppLabel)) {
|
||||||
if (TextUtils.isEmpty(defaultAppLabel)) {
|
preference.setSummary(defaultAppLabel);
|
||||||
final String onlyAppLabel = getOnlyAppLabel();
|
|
||||||
if (!TextUtils.isEmpty(onlyAppLabel)) {
|
|
||||||
preference.setSummary(onlyAppLabel);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,6 +68,19 @@ public class DefaultBrowserPreferenceController extends DefaultAppPreferenceCont
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence getDefaultAppLabel() {
|
||||||
|
if (!isAvailable()) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
final DefaultAppInfo defaultApp = getDefaultAppInfo();
|
||||||
|
final CharSequence defaultAppLabel = defaultApp != null ? defaultApp.loadLabel() : null;
|
||||||
|
if (!TextUtils.isEmpty(defaultAppLabel)) {
|
||||||
|
return defaultAppLabel;
|
||||||
|
}
|
||||||
|
return getOnlyAppLabel();
|
||||||
|
}
|
||||||
|
|
||||||
private List<ResolveInfo> getCandidates() {
|
private List<ResolveInfo> getCandidates() {
|
||||||
return mPackageManager.queryIntentActivitiesAsUser(BROWSE_PROBE, PackageManager.MATCH_ALL,
|
return mPackageManager.queryIntentActivitiesAsUser(BROWSE_PROBE, PackageManager.MATCH_ALL,
|
||||||
mUserId);
|
mUserId);
|
||||||
|
@@ -22,22 +22,30 @@ import com.android.settings.R;
|
|||||||
import com.android.settings.SettingsRobolectricTestRunner;
|
import com.android.settings.SettingsRobolectricTestRunner;
|
||||||
import com.android.settings.TestConfig;
|
import com.android.settings.TestConfig;
|
||||||
|
|
||||||
|
import com.android.settings.applications.defaultapps.DefaultBrowserPreferenceController;
|
||||||
|
import com.android.settings.applications.defaultapps.DefaultPhonePreferenceController;
|
||||||
|
import com.android.settings.applications.defaultapps.DefaultSmsPreferenceController;
|
||||||
|
import com.android.settings.dashboard.SummaryLoader;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.Answers;
|
|
||||||
import org.mockito.Mock;
|
|
||||||
import org.mockito.MockitoAnnotations;
|
import org.mockito.MockitoAnnotations;
|
||||||
|
import org.robolectric.RuntimeEnvironment;
|
||||||
import org.robolectric.annotation.Config;
|
import org.robolectric.annotation.Config;
|
||||||
import org.robolectric.shadows.ShadowApplication;
|
import org.robolectric.util.ReflectionHelpers;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
import static org.mockito.Matchers.anyString;
|
||||||
|
import static org.mockito.Matchers.eq;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.never;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
@RunWith(SettingsRobolectricTestRunner.class)
|
@RunWith(SettingsRobolectricTestRunner.class)
|
||||||
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
|
||||||
public class AdvancedAppSettingsTest {
|
public class AdvancedAppSettingsTest {
|
||||||
|
|
||||||
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
|
|
||||||
private AdvancedAppSettings mFragment;
|
private AdvancedAppSettings mFragment;
|
||||||
@@ -46,8 +54,9 @@ public class AdvancedAppSettingsTest {
|
|||||||
public void setUp() {
|
public void setUp() {
|
||||||
MockitoAnnotations.initMocks(this);
|
MockitoAnnotations.initMocks(this);
|
||||||
|
|
||||||
|
mContext = RuntimeEnvironment.application;
|
||||||
mFragment = new AdvancedAppSettings();
|
mFragment = new AdvancedAppSettings();
|
||||||
mFragment.onAttach(ShadowApplication.getInstance().getApplicationContext());
|
mFragment.onAttach(mContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -56,4 +65,75 @@ public class AdvancedAppSettingsTest {
|
|||||||
R.xml.app_default_settings);
|
R.xml.app_default_settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setListening_shouldUpdateSummary() {
|
||||||
|
final SummaryLoader summaryLoader = mock(SummaryLoader.class);
|
||||||
|
final AdvancedAppSettings.SummaryProvider summaryProvider =
|
||||||
|
new AdvancedAppSettings.SummaryProvider(mContext, summaryLoader);
|
||||||
|
final DefaultSmsPreferenceController defaultSms =
|
||||||
|
mock(DefaultSmsPreferenceController.class);
|
||||||
|
final DefaultBrowserPreferenceController defaultBrowser =
|
||||||
|
mock(DefaultBrowserPreferenceController.class);
|
||||||
|
final DefaultPhonePreferenceController defaultPhone =
|
||||||
|
mock(DefaultPhonePreferenceController.class);
|
||||||
|
ReflectionHelpers.setField(summaryProvider, "mDefaultSmsPreferenceController", defaultSms);
|
||||||
|
ReflectionHelpers.setField(
|
||||||
|
summaryProvider, "mDefaultBrowserPreferenceController", defaultBrowser);
|
||||||
|
ReflectionHelpers.setField(
|
||||||
|
summaryProvider, "mDefaultPhonePreferenceController", defaultPhone);
|
||||||
|
|
||||||
|
// all available
|
||||||
|
when(defaultSms.getDefaultAppLabel()).thenReturn("Sms1");
|
||||||
|
when(defaultBrowser.getDefaultAppLabel()).thenReturn("Browser1");
|
||||||
|
when(defaultPhone.getDefaultAppLabel()).thenReturn("Phone1");
|
||||||
|
summaryProvider.setListening(true);
|
||||||
|
verify(summaryLoader).setSummary(summaryProvider, "Sms1, Browser1, Phone1");
|
||||||
|
|
||||||
|
// 2 available
|
||||||
|
when(defaultSms.getDefaultAppLabel()).thenReturn(null);
|
||||||
|
when(defaultBrowser.getDefaultAppLabel()).thenReturn("Browser1");
|
||||||
|
when(defaultPhone.getDefaultAppLabel()).thenReturn("Phone1");
|
||||||
|
summaryProvider.setListening(true);
|
||||||
|
verify(summaryLoader).setSummary(summaryProvider, "Browser1, Phone1");
|
||||||
|
|
||||||
|
when(defaultSms.getDefaultAppLabel()).thenReturn("Sms1");
|
||||||
|
when(defaultBrowser.getDefaultAppLabel()).thenReturn(null);
|
||||||
|
when(defaultPhone.getDefaultAppLabel()).thenReturn("Phone1");
|
||||||
|
summaryProvider.setListening(true);
|
||||||
|
verify(summaryLoader).setSummary(summaryProvider, "Sms1, Phone1");
|
||||||
|
|
||||||
|
when(defaultSms.getDefaultAppLabel()).thenReturn("Sms1");
|
||||||
|
when(defaultBrowser.getDefaultAppLabel()).thenReturn("Browser1");
|
||||||
|
when(defaultPhone.getDefaultAppLabel()).thenReturn(null);
|
||||||
|
summaryProvider.setListening(true);
|
||||||
|
verify(summaryLoader).setSummary(summaryProvider, "Sms1, Browser1");
|
||||||
|
|
||||||
|
// 1 available
|
||||||
|
when(defaultSms.getDefaultAppLabel()).thenReturn(null);
|
||||||
|
when(defaultBrowser.getDefaultAppLabel()).thenReturn("Browser1");
|
||||||
|
when(defaultPhone.getDefaultAppLabel()).thenReturn(null);
|
||||||
|
summaryProvider.setListening(true);
|
||||||
|
verify(summaryLoader).setSummary(summaryProvider, "Browser1");
|
||||||
|
|
||||||
|
when(defaultSms.getDefaultAppLabel()).thenReturn("Sms1");
|
||||||
|
when(defaultBrowser.getDefaultAppLabel()).thenReturn(null);
|
||||||
|
when(defaultPhone.getDefaultAppLabel()).thenReturn(null);
|
||||||
|
summaryProvider.setListening(true);
|
||||||
|
verify(summaryLoader).setSummary(summaryProvider, "Sms1");
|
||||||
|
|
||||||
|
when(defaultSms.getDefaultAppLabel()).thenReturn(null);
|
||||||
|
when(defaultBrowser.getDefaultAppLabel()).thenReturn(null);
|
||||||
|
when(defaultPhone.getDefaultAppLabel()).thenReturn("Phone1");
|
||||||
|
summaryProvider.setListening(true);
|
||||||
|
verify(summaryLoader).setSummary(summaryProvider, "Phone1");
|
||||||
|
|
||||||
|
// None available
|
||||||
|
when(defaultSms.getDefaultAppLabel()).thenReturn(null);
|
||||||
|
when(defaultBrowser.getDefaultAppLabel()).thenReturn(null);
|
||||||
|
when(defaultPhone.getDefaultAppLabel()).thenReturn(null);
|
||||||
|
summaryProvider.setListening(true);
|
||||||
|
verify(summaryLoader, never()).setSummary(summaryProvider, eq(anyString()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user