Merge "Add string for instant app launch button."
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 93677d3..ad11706 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -6319,13 +6319,6 @@
<!-- Applicaitons with restrictions - settings button [CHAR LIMIT=30] -->
<string name="apps_with_restrictions_settings_button">Expand settings for application</string>
- <!-- Warning message when changing a global setting for a tablet.[CHAR LIMIT=none] -->
- <string name="global_change_warning" product="tablet">This setting affects all users on this tablet.</string>
- <!-- Warning message when changing a global setting for a phone.[CHAR LIMIT=none] -->
- <string name="global_change_warning" product="default">This setting affects all users on this phone.</string>
- <!-- Warning message title for global locale change [CHAR LIMIT=40] -->
- <string name="global_locale_change_title">Change language</string>
-
<!-- NFC payment settings --><skip/>
<string name="nfc_payment_settings_title">Tap & pay</string>
<!-- Caption for button linking to a page explaining how Tap and Pay works-->
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 1a32127..a989c34 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -23,9 +23,7 @@
import android.annotation.Nullable;
import android.app.ActivityManager;
-import android.app.AlertDialog;
import android.app.AppGlobals;
-import android.app.Dialog;
import android.app.Fragment;
import android.app.IActivityManager;
import android.app.KeyguardManager;
@@ -34,7 +32,6 @@
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
@@ -52,9 +49,6 @@
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.hardware.fingerprint.FingerprintManager;
-import android.icu.text.RelativeDateTimeFormatter;
-import android.icu.text.RelativeDateTimeFormatter.RelativeUnit;
-import android.icu.util.ULocale;
import android.net.ConnectivityManager;
import android.net.LinkProperties;
import android.net.Network;
@@ -107,7 +101,6 @@
import com.android.settings.wrapper.FingerprintManagerWrapper;
import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
-import com.android.settingslib.utils.StringUtil;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Iterator;
@@ -237,16 +230,6 @@
return null;
}
- /**
- * Returns the default link's IP addresses, if any, taking into account IPv4 and IPv6 style
- * addresses.
- * @return the formatted and newline-separated IP addresses, or null if none.
- */
- public static String getDefaultIpAddresses(ConnectivityManager cm) {
- LinkProperties prop = cm.getActiveLinkProperties();
- return formatIpAddresses(prop);
- }
-
private static String formatIpAddresses(LinkProperties prop) {
if (prop == null) return null;
Iterator<InetAddress> iter = prop.getAllAddresses().iterator();
@@ -400,23 +383,6 @@
}
}
- /** Not global warming, it's global change warning. */
- public static Dialog buildGlobalChangeWarningDialog(final Context context, int titleResId,
- final Runnable positiveAction) {
- final AlertDialog.Builder builder = new AlertDialog.Builder(context);
- builder.setTitle(titleResId);
- builder.setMessage(R.string.global_change_warning);
- builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- positiveAction.run();
- }
- });
- builder.setNegativeButton(android.R.string.cancel, null);
-
- return builder.create();
- }
-
public static boolean hasMultipleUsers(Context context) {
return ((UserManager) context.getSystemService(Context.USER_SERVICE))
.getUsers().size() > 1;
@@ -477,21 +443,12 @@
* @param resultTo Option fragment that should receive the result of the activity launch.
* @param resultRequestCode If resultTo is non-null, this is the request code in which
* to report the result.
- * @param titleResPackageName Optional package name for the resource id of the title.
* @param titleResId resource id for the String to display for the title of this set
* of preferences.
* @param title String to display for the title of this set of preferences.
* @param metricsCategory The current metricsCategory for logging source when fragment starts
*/
public static void startWithFragment(Context context, String fragmentName, Bundle args,
- Fragment resultTo, int resultRequestCode, String titleResPackageName, int titleResId,
- CharSequence title, int metricsCategory) {
- startWithFragment(context, fragmentName, args, resultTo, resultRequestCode,
- titleResPackageName, titleResId, title, false /* not a shortcut */,
- metricsCategory);
- }
-
- public static void startWithFragment(Context context, String fragmentName, Bundle args,
Fragment resultTo, int resultRequestCode, int titleResId,
CharSequence title, boolean isShortcut, int metricsCategory) {
Intent intent = onBuildStartFragmentIntent(context, fragmentName, args,
@@ -511,7 +468,6 @@
Intent.FLAG_ACTIVITY_NEW_TASK);
}
-
public static void startWithFragment(Context context, String fragmentName, Bundle args,
Fragment resultTo, int resultRequestCode, String titleResPackageName, int titleResId,
CharSequence title, boolean isShortcut, int metricsCategory, int flags) {
diff --git a/src/com/android/settings/accounts/AccountDashboardFragment.java b/src/com/android/settings/accounts/AccountDashboardFragment.java
index 0a4c343..9702102 100644
--- a/src/com/android/settings/accounts/AccountDashboardFragment.java
+++ b/src/com/android/settings/accounts/AccountDashboardFragment.java
@@ -22,6 +22,7 @@
import android.os.UserHandle;
import android.provider.SearchIndexableResource;
import android.text.BidiFormatter;
+import android.text.TextUtils;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
@@ -94,17 +95,21 @@
if (types == null || types.length == 0) {
summary = mContext.getString(R.string.account_dashboard_default_summary);
} else {
- // Show up to 3 account types
- final int size = Math.min(3, types.length);
+ // Show up to 3 account types, ignore any null value
+ int accountToAdd = Math.min(3, types.length);
- for (int i = 0; i < size; i++) {
+ for (int i = 0; i < types.length && accountToAdd > 0; i++) {
final CharSequence label = authHelper.getLabelForType(mContext, types[i]);
+ if (TextUtils.isEmpty(label)) {
+ continue;
+ }
if (summary == null) {
summary = bidiFormatter.unicodeWrap(label);
} else {
summary = mContext.getString(R.string.join_many_items_middle, summary,
bidiFormatter.unicodeWrap(label));
}
+ accountToAdd--;
}
}
mSummaryLoader.setSummary(this, summary);
diff --git a/src/com/android/settings/accounts/AccountTypePreference.java b/src/com/android/settings/accounts/AccountTypePreference.java
index 574cbd5..e08f113 100644
--- a/src/com/android/settings/accounts/AccountTypePreference.java
+++ b/src/com/android/settings/accounts/AccountTypePreference.java
@@ -28,11 +28,13 @@
import android.support.v7.preference.Preference.OnPreferenceClickListener;
import com.android.settings.Utils;
+import com.android.settings.core.SubSettingLauncher;
import com.android.settings.widget.AppPreference;
public class AccountTypePreference extends AppPreference implements OnPreferenceClickListener {
/**
* Title of the tile that is shown to the user.
+ *
* @attr ref android.R.styleable#PreferenceHeader_title
*/
private final CharSequence mTitle;
@@ -56,6 +58,7 @@
/**
* Full class name of the fragment to display when this tile is
* selected.
+ *
* @attr ref android.R.styleable#PreferenceHeader_fragment
*/
private final String mFragment;
@@ -92,19 +95,21 @@
public boolean onPreferenceClick(Preference preference) {
if (mFragment != null) {
UserManager userManager =
- (UserManager) getContext().getSystemService(Context.USER_SERVICE);
+ (UserManager) getContext().getSystemService(Context.USER_SERVICE);
UserHandle user = mFragmentArguments.getParcelable(EXTRA_USER);
if (user != null && Utils.startQuietModeDialogIfNecessary(getContext(), userManager,
- user.getIdentifier())) {
+ user.getIdentifier())) {
return true;
} else if (user != null && Utils.unlockWorkProfileIfNecessary(getContext(),
- user.getIdentifier())) {
+ user.getIdentifier())) {
return true;
}
- Utils.startWithFragment(getContext(), mFragment, mFragmentArguments,
- null /* resultTo */, 0 /* resultRequestCode */, mTitleResPackageName,
- mTitleResId, null /* title */,false /* isShortCut */, mMetricsCategory,
- 0 /* flag */);
+ new SubSettingLauncher(getContext())
+ .setDestination(mFragment)
+ .setArguments(mFragmentArguments)
+ .setTitle(mTitleResPackageName, mTitleResId)
+ .setSourceMetricsCategory(mMetricsCategory)
+ .launch();
return true;
}
return false;
diff --git a/src/com/android/settings/core/SubSettingLauncher.java b/src/com/android/settings/core/SubSettingLauncher.java
new file mode 100644
index 0000000..a787972
--- /dev/null
+++ b/src/com/android/settings/core/SubSettingLauncher.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.core;
+
+import android.annotation.StringRes;
+import android.app.Fragment;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.support.annotation.VisibleForTesting;
+
+import com.android.settings.SettingsActivity;
+import com.android.settings.SubSettings;
+import com.android.settingslib.core.instrumentation.VisibilityLoggerMixin;
+
+public class SubSettingLauncher {
+
+ private final Context mContext;
+ private final LaunchRequest mLaunchRequest;
+ private boolean mLaunched;
+
+ public SubSettingLauncher(Context context) {
+ if (context == null) {
+ throw new IllegalArgumentException("Context must be non-null.");
+ }
+ mContext = context;
+ mLaunchRequest = new LaunchRequest();
+ }
+
+ public SubSettingLauncher setDestination(String fragmentName) {
+ mLaunchRequest.destinationName = fragmentName;
+ return this;
+ }
+
+ public SubSettingLauncher setTitle(@StringRes int titleResId) {
+ return setTitle(null /*titlePackageName*/, titleResId);
+ }
+
+ public SubSettingLauncher setTitle(String titlePackageName, @StringRes int titleResId) {
+ mLaunchRequest.titleResPackageName = titlePackageName;
+ mLaunchRequest.titleResId = titleResId;
+ mLaunchRequest.title = null;
+ return this;
+ }
+
+ public SubSettingLauncher setTitle(CharSequence title) {
+ mLaunchRequest.title = title;
+ return this;
+ }
+
+ public SubSettingLauncher setIsShortCut(boolean isShortCut) {
+ mLaunchRequest.isShortCut = isShortCut;
+ return this;
+ }
+
+ public SubSettingLauncher setArguments(Bundle arguments) {
+ mLaunchRequest.arguments = arguments;
+ return this;
+ }
+
+ public SubSettingLauncher setSourceMetricsCategory(int sourceMetricsCategory) {
+ mLaunchRequest.sourceMetricsCategory = sourceMetricsCategory;
+ return this;
+ }
+
+ public SubSettingLauncher setResultListener(Fragment listener, int resultRequestCode) {
+ mLaunchRequest.mRequestCode = resultRequestCode;
+ mLaunchRequest.mResultListener = listener;
+ return this;
+ }
+
+ public SubSettingLauncher addFlags(int flags) {
+ mLaunchRequest.flags |= flags;
+ return this;
+ }
+
+ public SubSettingLauncher setUserHandle(UserHandle userHandle) {
+ mLaunchRequest.userHandle = userHandle;
+ return this;
+ }
+
+ public void launch() {
+ if (mLaunched) {
+ throw new IllegalStateException(
+ "This launcher has already been executed. Do not reuse");
+ }
+ mLaunched = true;
+ final Intent intent = new Intent(Intent.ACTION_MAIN);
+ intent.setClass(mContext, SubSettings.class);
+
+ intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, mLaunchRequest.destinationName);
+ intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS, mLaunchRequest.arguments);
+ intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RES_PACKAGE_NAME,
+ mLaunchRequest.titleResPackageName);
+ intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID,
+ mLaunchRequest.titleResId);
+ intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE, mLaunchRequest.title);
+ intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_AS_SHORTCUT,
+ mLaunchRequest.isShortCut);
+ intent.putExtra(VisibilityLoggerMixin.EXTRA_SOURCE_METRICS_CATEGORY,
+ mLaunchRequest.sourceMetricsCategory);
+ intent.addFlags(mLaunchRequest.flags);
+
+ if (mLaunchRequest.userHandle != null
+ && mLaunchRequest.userHandle.getIdentifier() != UserHandle.myUserId()) {
+ launchAsUser(mContext, intent, mLaunchRequest.userHandle);
+ } else if (mLaunchRequest.mResultListener != null) {
+ launchForResult(mLaunchRequest.mResultListener, intent, mLaunchRequest.mRequestCode);
+ } else {
+ launch(intent);
+ }
+ }
+
+ @VisibleForTesting
+ void launch(Intent intent) {
+ mContext.startActivity(intent);
+ }
+
+ private static void launchForResult(Fragment listener, Intent intent, int requestCode) {
+ listener.getActivity().startActivityForResult(intent, requestCode);
+ }
+
+ private static void launchAsUser(Context context, Intent intent, UserHandle userHandle) {
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ context.startActivityAsUser(intent, userHandle);
+ }
+
+ /**
+ * Simple container that has information about how to launch a subsetting.
+ */
+ static class LaunchRequest {
+ String destinationName;
+ int titleResId;
+ String titleResPackageName;
+ CharSequence title;
+ boolean isShortCut;
+ int sourceMetricsCategory;
+ int flags;
+ Fragment mResultListener;
+ int mRequestCode;
+ UserHandle userHandle;
+ Bundle arguments;
+ }
+}
diff --git a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
index 275af3d..29d66bd 100644
--- a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
+++ b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
@@ -19,12 +19,11 @@
import android.util.ArrayMap;
import com.android.settings.DisplaySettings;
-import com.android.settings.accounts.AccountDetailDashboardFragment;
import com.android.settings.accounts.AccountDashboardFragment;
+import com.android.settings.accounts.AccountDetailDashboardFragment;
import com.android.settings.applications.AppAndNotificationDashboardFragment;
import com.android.settings.applications.DefaultAppSettings;
import com.android.settings.connecteddevice.AdvancedConnectedDeviceDashboardFragment;
-import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragmentOld;
import com.android.settings.development.DevelopmentSettingsDashboardFragment;
import com.android.settings.deviceinfo.StorageDashboardFragment;
import com.android.settings.fuelgauge.PowerUsageSummary;
@@ -60,9 +59,6 @@
PARENT_TO_CATEGORY_KEY_MAP = new ArrayMap<>();
PARENT_TO_CATEGORY_KEY_MAP.put(
NetworkDashboardFragment.class.getName(), CategoryKey.CATEGORY_NETWORK);
- //TODO(b/69471219): update ConnectedDeviceDashboardFragment once new feature is done.
- PARENT_TO_CATEGORY_KEY_MAP.put(ConnectedDeviceDashboardFragmentOld.class.getName(),
- CategoryKey.CATEGORY_DEVICE);
PARENT_TO_CATEGORY_KEY_MAP.put(AdvancedConnectedDeviceDashboardFragment.class.getName(),
CategoryKey.CATEGORY_DEVICE);
PARENT_TO_CATEGORY_KEY_MAP.put(AppAndNotificationDashboardFragment.class.getName(),
diff --git a/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java
index 9371019..3ed9717 100644
--- a/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accounts/AccountDashboardFragmentTest.java
@@ -17,6 +17,9 @@
import static com.android.settings.accounts.AccountDashboardFragmentTest
.ShadowAuthenticationHelper.LABELS;
+import static com.android.settings.accounts.AccountDashboardFragmentTest
+ .ShadowAuthenticationHelper.TYPES;
+
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@@ -75,7 +78,6 @@
ShadowAuthenticationHelper.class
})
public void updateSummary_hasAccount_shouldDisplayUpTo3AccountTypes() {
- ShadowAuthenticationHelper.setHasAccount(true);
final SummaryLoader loader = mock(SummaryLoader.class);
final Activity activity = Robolectric.buildActivity(Activity.class).setup().get();
@@ -91,7 +93,7 @@
ShadowAuthenticationHelper.class
})
public void updateSummary_noAccount_shouldDisplayDefaultSummary() {
- ShadowAuthenticationHelper.setHasAccount(false);
+ ShadowAuthenticationHelper.setEnabledAccount(null);
final SummaryLoader loader = mock(SummaryLoader.class);
final Activity activity = Robolectric.buildActivity(Activity.class).setup().get();
@@ -104,6 +106,24 @@
}
@Test
+ @Config(shadows = {
+ ShadowAuthenticationHelper.class
+ })
+ public void updateSummary_noAccountTypeLabel_shouldNotDisplayNullEntry() {
+ final SummaryLoader loader = mock(SummaryLoader.class);
+ final Activity activity = Robolectric.buildActivity(Activity.class).setup().get();
+ final String[] enabledAccounts = {TYPES[0], "unlabled_account_type", TYPES[1]};
+ ShadowAuthenticationHelper.setEnabledAccount(enabledAccounts);
+
+ final SummaryLoader.SummaryProvider provider = mFragment.SUMMARY_PROVIDER_FACTORY
+ .createSummaryProvider(activity, loader);
+ provider.setListening(true);
+
+ // should only show the 2 accounts with labels
+ verify(loader).setSummary(provider, LABELS[0] + ", " + LABELS[1]);
+ }
+
+ @Test
public void testSearchIndexProvider_shouldIndexResource() {
final List<SearchIndexableResource> indexRes =
AccountDashboardFragment.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(
@@ -118,26 +138,25 @@
public static class ShadowAuthenticationHelper {
static final String[] TYPES = new String[] {"type1", "type2", "type3", "type4"};
- static final String[] LABELS = new String[] {"LABEL1", "LABEL2",
- "LABEL3", "LABEL4"};
- private static boolean sHasAccount = true;
+ static final String[] LABELS = new String[] {"LABEL1", "LABEL2", "LABEL3", "LABEL4"};
+ private static String[] sEnabledAccount = TYPES;
public void __constructor__(Context context, UserHandle userHandle,
AuthenticatorHelper.OnAccountsUpdateListener listener) {
}
- public static void setHasAccount(boolean hasAccount) {
- sHasAccount = hasAccount;
+ public static void setEnabledAccount(String[] enabledAccount) {
+ sEnabledAccount = enabledAccount;
}
@Resetter
public static void reset() {
- sHasAccount = true;
+ sEnabledAccount = TYPES;
}
@Implementation
public String[] getEnabledAccountTypes() {
- return sHasAccount ? TYPES : null;
+ return sEnabledAccount;
}
@Implementation
@@ -151,7 +170,7 @@
} else if (TextUtils.equals(accountType, TYPES[3])) {
return LABELS[3];
}
- return "no_label";
+ return null;
}
}
}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment2Test.java b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment2Test.java
index 3eacd7a..5aa3933 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment2Test.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment2Test.java
@@ -72,11 +72,6 @@
}
@Test
- public void testCategory_isConnectedDevice() {
- assertThat(mFragment.getCategoryKey()).isEqualTo(CategoryKey.CATEGORY_DEVICE);
- }
-
- @Test
public void testSearchIndexProvider_shouldIndexResource() {
final List<SearchIndexableResource> indexRes =
mFragment.SEARCH_INDEX_DATA_PROVIDER.getXmlResourcesToIndex(mContext,
diff --git a/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java b/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java
new file mode 100644
index 0000000..abb3312
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/core/SubSettingLauncherTest.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.core;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.content.Intent;
+
+import com.android.settings.SettingsActivity;
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class SubSettingLauncherTest {
+
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ mContext = RuntimeEnvironment.application;
+ }
+
+ @Test(expected = IllegalStateException.class)
+ public void cannotReuseLauncher() {
+ final SubSettingLauncher launcher = spy(new SubSettingLauncher(mContext));
+ doNothing().when(launcher).launch(any(Intent.class));
+ launcher.launch();
+ launcher.launch();
+ }
+
+ @Test
+ public void launch_shouldIncludeAllParams() {
+ final ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class);
+ final SubSettingLauncher launcher = spy(new SubSettingLauncher(mContext));
+ launcher.setTitle("123")
+ .setDestination(SubSettingLauncherTest.class.getName())
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ .launch();
+ doNothing().when(launcher).launch(any(Intent.class));
+ verify(launcher).launch(intentArgumentCaptor.capture());
+ final Intent intent = intentArgumentCaptor.getValue();
+
+ assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE))
+ .isEqualTo("123");
+ assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
+ .isEqualTo(SubSettingLauncherTest.class.getName());
+ assertThat(intent.getFlags()).isEqualTo(Intent.FLAG_ACTIVITY_NEW_TASK);
+ }
+}