Merge "Update "Mobile network standby" attribute label into "Mobile network"" into sc-v2-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 7ed69e5..bb72e95 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -233,7 +233,8 @@
<activity android:name=".network.telephony.MobileNetworkActivity"
android:label="@string/network_settings_title"
android:exported="true"
- android:launchMode="singleTask">
+ android:launchMode="singleTask"
+ android:configChanges="orientation|screenSize|keyboardHidden">
<intent-filter android:priority="1">
<!-- Displays the MobileNetworkActivity and opt-in dialog for capability discovery. -->
<action android:name="android.telephony.ims.action.SHOW_CAPABILITY_DISCOVERY_OPT_IN" />
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3a38499..2642b32 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1921,9 +1921,6 @@
<!-- Bluetooth device details companion apps. The body of confirmation dialog for remove association. [CHAR LIMIT=60] -->
<string name="bluetooth_companion_app_body"><xliff:g id="app_name" example="App Name">%1$s</xliff:g> app will no longer connect to your <xliff:g id="device_name" example="Device Name">%2$s</xliff:g></string>
- <!-- Bluetooth device details. The body of a confirmation dialog for unpairing a paired device. [CHAR LIMIT=NONE] -->
- <string name="bluetooth_untethered_unpair_dialog_body"><xliff:g id="device_name" example="Jack's headphone">%1$s</xliff:g> will no longer be paired with any device linked to this account</string>
-
<!-- Bluetooth device details. In the confirmation dialog for unpairing a paired device, this is the label on the button that will complete the unpairing action. -->
<string name="bluetooth_unpair_dialog_forget_confirm_button">Forget device</string>
<!-- Bluetooth device details companion apps. In the confirmation dialog for removing an associated app, this is the label on the button that will complete the disassociate action. [CHAR LIMIT=80] -->
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index df30d8b..9c81895 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -255,7 +255,8 @@
// Should happen before any call to getIntent()
getMetaData();
final Intent intent = getIntent();
- if (launchHomepageForTwoPaneDeepLink(intent)) {
+ if (shouldShowTwoPaneDeepLink(intent)) {
+ launchHomepageForTwoPaneDeepLink(intent);
finishAndRemoveTask();
return;
}
@@ -368,16 +369,13 @@
intent.getBooleanExtra(EXTRA_SHOW_FRAGMENT_AS_SUBSETTING, false);
}
- /** Returns true if the Activity is started by a deep link intent for large screen devices. */
- private boolean launchHomepageForTwoPaneDeepLink(Intent intent) {
- if (!shouldShowTwoPaneDeepLink(intent)) {
- return false;
- }
-
+ /**
+ * Returns the deep link trampoline intent for large screen devices.
+ */
+ public static Intent getTrampolineIntent(Intent intent, String highlightMenuKey) {
final Intent detailIntent = new Intent(intent);
// It's a deep link intent, SettingsHomepageActivity will set SplitPairRule and start it.
final Intent trampolineIntent = new Intent(ACTION_SETTINGS_EMBED_DEEP_LINK_ACTIVITY);
-
trampolineIntent.replaceExtras(detailIntent);
// Relay detail intent data to prevent failure of Intent#ParseUri.
@@ -391,22 +389,27 @@
trampolineIntent.putExtra(EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI,
detailIntent.toUri(Intent.URI_INTENT_SCHEME));
- if (detailIntent.getBooleanExtra(EXTRA_IS_FROM_SLICE, false)) {
- trampolineIntent.setClass(this, SliceDeepLinkHomepageActivity.class);
+ trampolineIntent.putExtra(EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY,
+ highlightMenuKey);
+ trampolineIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+ return trampolineIntent;
+ }
+
+ private void launchHomepageForTwoPaneDeepLink(Intent intent) {
+ final Intent trampolineIntent;
+ if (intent.getBooleanExtra(EXTRA_IS_FROM_SLICE, false)) {
// Get menu key for slice deep link case.
- final String highlightMenuKey = detailIntent.getStringExtra(
+ final String highlightMenuKey = intent.getStringExtra(
EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY);
if (!TextUtils.isEmpty(highlightMenuKey)) {
mHighlightMenuKey = highlightMenuKey;
}
+ trampolineIntent = getTrampolineIntent(intent, mHighlightMenuKey);
+ trampolineIntent.setClass(this, SliceDeepLinkHomepageActivity.class);
+ } else {
+ trampolineIntent = getTrampolineIntent(intent, mHighlightMenuKey);
}
-
- trampolineIntent.putExtra(EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY,
- mHighlightMenuKey);
- trampolineIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
startActivity(trampolineIntent);
-
- return true;
}
private boolean shouldShowTwoPaneDeepLink(Intent intent) {
diff --git a/src/com/android/settings/biometrics/combination/BiometricSettingsAppPreferenceController.java b/src/com/android/settings/biometrics/combination/BiometricSettingsAppPreferenceController.java
index 6351621..a46ae7a 100644
--- a/src/com/android/settings/biometrics/combination/BiometricSettingsAppPreferenceController.java
+++ b/src/com/android/settings/biometrics/combination/BiometricSettingsAppPreferenceController.java
@@ -95,6 +95,6 @@
@Override
public int getSliceHighlightMenuRes() {
// not needed since it's not sliceable
- return 0;
+ return NO_RES;
}
}
diff --git a/src/com/android/settings/biometrics/combination/BiometricSettingsKeyguardPreferenceController.java b/src/com/android/settings/biometrics/combination/BiometricSettingsKeyguardPreferenceController.java
index 4101963..2d22558 100644
--- a/src/com/android/settings/biometrics/combination/BiometricSettingsKeyguardPreferenceController.java
+++ b/src/com/android/settings/biometrics/combination/BiometricSettingsKeyguardPreferenceController.java
@@ -77,6 +77,6 @@
@Override
public int getSliceHighlightMenuRes() {
// not needed since it's not sliceable
- return 0;
+ return NO_RES;
}
}
diff --git a/src/com/android/settings/biometrics/face/FaceSettingsPreferenceController.java b/src/com/android/settings/biometrics/face/FaceSettingsPreferenceController.java
index a8bff6b..bda078f 100644
--- a/src/com/android/settings/biometrics/face/FaceSettingsPreferenceController.java
+++ b/src/com/android/settings/biometrics/face/FaceSettingsPreferenceController.java
@@ -55,6 +55,6 @@
@Override
public int getSliceHighlightMenuRes() {
// not needed since it's not sliceable
- return 0;
+ return NO_RES;
}
}
diff --git a/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java b/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java
index 6d8fb33..1da8672 100644
--- a/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java
+++ b/src/com/android/settings/bluetooth/ForgetDeviceDialogFragment.java
@@ -29,7 +29,6 @@
import com.android.settings.R;
import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
-import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -73,8 +72,6 @@
};
Context context = getContext();
mDevice = getDevice(context);
- final boolean untetheredHeadset = BluetoothUtils.getBooleanMetaData(
- mDevice.getDevice(), BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET);
AlertDialog dialog = new AlertDialog.Builder(context)
.setPositiveButton(R.string.bluetooth_unpair_dialog_forget_confirm_button,
@@ -82,9 +79,7 @@
.setNegativeButton(android.R.string.cancel, null)
.create();
dialog.setTitle(R.string.bluetooth_unpair_dialog_title);
- dialog.setMessage(context.getString(untetheredHeadset
- ? R.string.bluetooth_untethered_unpair_dialog_body
- : R.string.bluetooth_unpair_dialog_body,
+ dialog.setMessage(context.getString(R.string.bluetooth_unpair_dialog_body,
mDevice.getName()));
return dialog;
}
diff --git a/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceController.java b/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceController.java
index 2bab3e9..93e6d0a 100644
--- a/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceController.java
+++ b/src/com/android/settings/datetime/LocationTimeZoneDetectionPreferenceController.java
@@ -120,7 +120,7 @@
@Override
public int getSliceHighlightMenuRes() {
// not needed since it's not sliceable
- return 0;
+ return NO_RES;
}
@Override
diff --git a/src/com/android/settings/emergency/EmergencyGestureSoundPreferenceController.java b/src/com/android/settings/emergency/EmergencyGestureSoundPreferenceController.java
index 3d6695b..52694af 100644
--- a/src/com/android/settings/emergency/EmergencyGestureSoundPreferenceController.java
+++ b/src/com/android/settings/emergency/EmergencyGestureSoundPreferenceController.java
@@ -55,7 +55,7 @@
@Override
public int getSliceHighlightMenuRes() {
// not needed since it's not sliceable
- return 0;
+ return NO_RES;
}
@Override
diff --git a/src/com/android/settings/flashlight/FlashlightSlice.java b/src/com/android/settings/flashlight/FlashlightSlice.java
index f18d712..eaf059a 100644
--- a/src/com/android/settings/flashlight/FlashlightSlice.java
+++ b/src/com/android/settings/flashlight/FlashlightSlice.java
@@ -120,7 +120,7 @@
@Override
public int getSliceHighlightMenuRes() {
// no landing page in Settings
- return 0;
+ return NO_RES;
}
private static String getCameraId(Context context) throws CameraAccessException {
diff --git a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
index b599207..cd518a6 100644
--- a/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
+++ b/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetail.java
@@ -270,6 +270,7 @@
initHeader();
if (mEnableTriState) {
+ mOptimizationMode = mBatteryOptimizeUtils.getAppOptimizationMode();
initPreferenceForTriState(getContext());
final String packageName = mBatteryOptimizeUtils.getPackageName();
FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider()
@@ -286,21 +287,18 @@
public void onPause() {
super.onPause();
if (mEnableTriState) {
- Log.d(TAG, "Leave with mode: " + getSelectedPreference());
- mBatteryOptimizeUtils.setAppUsageState(getSelectedPreference());
- }
- }
+ final int selectedPreference = getSelectedPreference();
- @Override
- public void onDestroy() {
- super.onDestroy();
- notifyBackupManager();
+ notifyBackupManager();
+ logMetricCategory(selectedPreference);
+ mBatteryOptimizeUtils.setAppUsageState(selectedPreference);
+ Log.d(TAG, "Leave with mode: " + selectedPreference);
+ }
}
@VisibleForTesting
void notifyBackupManager() {
- if (mEnableTriState
- && mOptimizationMode != mBatteryOptimizeUtils.getAppOptimizationMode()) {
+ if (mOptimizationMode != mBatteryOptimizeUtils.getAppOptimizationMode()) {
final BackupManager backupManager = mBackupManager != null
? mBackupManager : new BackupManager(getContext());
backupManager.dataChanged();
@@ -461,32 +459,42 @@
updatePreferenceState(mUnrestrictedPreference, selectedKey);
updatePreferenceState(mOptimizePreference, selectedKey);
updatePreferenceState(mRestrictedPreference, selectedKey);
-
- // Logs metric.
- int metricCategory = 0;
- if (selectedKey.equals(mUnrestrictedPreference.getKey())) {
- metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_UNRESTRICTED;
- } else if (selectedKey.equals(mOptimizePreference.getKey())) {
- metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_OPTIMIZED;
- } else if (selectedKey.equals(mRestrictedPreference.getKey())) {
- metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_RESTRICTED;
- }
- if (metricCategory != 0) {
- FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider()
- .action(
- getContext(),
- metricCategory,
- new Pair(ConvertUtils.METRIC_KEY_PACKAGE,
- mBatteryOptimizeUtils.getPackageName()),
- new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE,
- getArguments().getString(EXTRA_POWER_USAGE_PERCENT)));
- }
}
private void updatePreferenceState(RadioButtonPreference preference, String selectedKey) {
preference.setChecked(selectedKey.equals(preference.getKey()));
}
+ private void logMetricCategory(int selectedKey) {
+ if (selectedKey == mOptimizationMode) {
+ return;
+ }
+
+ int metricCategory = 0;
+ switch (selectedKey) {
+ case BatteryOptimizeUtils.MODE_UNRESTRICTED:
+ metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_UNRESTRICTED;
+ break;
+ case BatteryOptimizeUtils.MODE_OPTIMIZED:
+ metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_OPTIMIZED;
+ break;
+ case BatteryOptimizeUtils.MODE_RESTRICTED:
+ metricCategory = SettingsEnums.ACTION_APP_BATTERY_USAGE_RESTRICTED;
+ break;
+ }
+
+ if (metricCategory != 0) {
+ FeatureFactory.getFactory(getContext()).getMetricsFeatureProvider()
+ .action(
+ getContext(),
+ metricCategory,
+ new Pair(ConvertUtils.METRIC_KEY_PACKAGE,
+ mBatteryOptimizeUtils.getPackageName()),
+ new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE,
+ getArguments().getString(EXTRA_POWER_USAGE_PERCENT)));
+ }
+ }
+
private void onCreateForTriState(String packageName) {
mUnrestrictedPreference = findPreference(KEY_PREF_UNRESTRICTED);
mOptimizePreference = findPreference(KEY_PREF_OPTIMIZED);
@@ -498,7 +506,6 @@
mBatteryOptimizeUtils = new BatteryOptimizeUtils(
getContext(), getArguments().getInt(EXTRA_UID), packageName);
- mOptimizationMode = mBatteryOptimizeUtils.getAppOptimizationMode();
}
private int getSelectedPreference() {
diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java
index 2bbc11e..ae8c61e 100644
--- a/src/com/android/settings/homepage/SettingsHomepageActivity.java
+++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java
@@ -27,6 +27,7 @@
import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
+import android.util.ArraySet;
import android.util.FeatureFlagUtils;
import android.util.Log;
import android.view.View;
@@ -54,6 +55,7 @@
import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin;
import java.net.URISyntaxException;
+import java.util.Set;
/** Settings homepage activity */
public class SettingsHomepageActivity extends FragmentActivity implements
@@ -79,10 +81,27 @@
private View mHomepageView;
private View mSuggestionView;
private CategoryMixin mCategoryMixin;
+ private Set<HomepageLoadedListener> mLoadedListeners;
- @Override
- public CategoryMixin getCategoryMixin() {
- return mCategoryMixin;
+ /** A listener receiving homepage loaded events. */
+ public interface HomepageLoadedListener {
+ /** Called when the homepage is loaded. */
+ void onHomepageLoaded();
+ }
+
+ /**
+ * Try to register a {@link HomepageLoadedListener}. If homepage is already loaded, the
+ * listener will not be notified.
+ *
+ * @return Whether the listener should be registered.
+ */
+ public boolean registerHomepageLoadedListenerIfNeeded(HomepageLoadedListener listener) {
+ if (mHomepageView == null) {
+ return false;
+ } else {
+ mLoadedListeners.add(listener);
+ return true;
+ }
}
/**
@@ -97,17 +116,25 @@
mSuggestionView.setVisibility(showSuggestion ? View.VISIBLE : View.GONE);
mHomepageView.setVisibility(View.VISIBLE);
mHomepageView = null;
+ mLoadedListeners.forEach(listener -> listener.onHomepageLoaded());
+ mLoadedListeners.clear();
+ }
+
+ @Override
+ public CategoryMixin getCategoryMixin() {
+ return mCategoryMixin;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- ((SettingsApplication) getApplication()).setHomeActivity(this);
+ setHomeActivity();
setContentView(R.layout.settings_homepage_container);
final View appBar = findViewById(R.id.app_bar_container);
appBar.setMinimumHeight(getSearchBoxHeight());
initHomepageContainer();
+ mLoadedListeners = new ArraySet<>();
final Toolbar toolbar = findViewById(R.id.search_action_bar);
FeatureFactory.getFactory(this).getSearchFeatureProvider()
@@ -158,6 +185,10 @@
launchDeepLinkIntentToRight();
}
+ protected void setHomeActivity() {
+ ((SettingsApplication) getApplication()).setHomeActivity(this);
+ }
+
private void showSuggestionFragment() {
final Class<? extends Fragment> fragment = FeatureFactory.getFactory(this)
.getSuggestionFeatureProvider(this).getContextualSuggestionFragment();
diff --git a/src/com/android/settings/homepage/SliceDeepLinkHomepageActivity.java b/src/com/android/settings/homepage/SliceDeepLinkHomepageActivity.java
index 2f83612..61e946d 100644
--- a/src/com/android/settings/homepage/SliceDeepLinkHomepageActivity.java
+++ b/src/com/android/settings/homepage/SliceDeepLinkHomepageActivity.java
@@ -21,6 +21,11 @@
/** Activity for Slices to launch Settings deep link page */
public class SliceDeepLinkHomepageActivity extends SettingsHomepageActivity {
@Override
+ protected void setHomeActivity() {
+ // do not overwrite homepage activity in SettingsApplication
+ }
+
+ @Override
protected ComponentName getDeepLinkComponent() {
return new ComponentName(getApplicationContext(), getClass());
}
diff --git a/src/com/android/settings/homepage/TopLevelSettings.java b/src/com/android/settings/homepage/TopLevelSettings.java
index d3bfa02..e9c7ef8 100644
--- a/src/com/android/settings/homepage/TopLevelSettings.java
+++ b/src/com/android/settings/homepage/TopLevelSettings.java
@@ -101,7 +101,7 @@
public boolean onPreferenceTreeClick(Preference preference) {
// Register SplitPairRule for SubSettings.
ActivityEmbeddingRulesController.registerSubSettingsPairRuleIfNeeded(getContext(),
- true /* clearTop*/);
+ true /* clearTop */);
setHighlightPreferenceKey(preference.getKey());
return super.onPreferenceTreeClick(preference);
@@ -184,6 +184,15 @@
}
}
+ /** Disable highlight on the menu entry */
+ public void disableMenuHighlight() {
+ if (mTopLevelAdapter == null) {
+ return;
+ }
+ mHighlightedPreferenceKey = null;
+ mTopLevelAdapter.highlightPreference(mHighlightedPreferenceKey, /* scrollNeeded= */ false);
+ }
+
@Override
protected boolean shouldForceRoundedIcon() {
return getContext().getResources()
@@ -202,7 +211,8 @@
Log.d(TAG, "onCreateAdapter, pref key: " + mHighlightedPreferenceKey);
mTopLevelAdapter = new HighlightableTopLevelPreferenceAdapter(
- getActivity(), preferenceScreen, getListView(), mHighlightedPreferenceKey);
+ (SettingsHomepageActivity) getActivity(), preferenceScreen, getListView(),
+ mHighlightedPreferenceKey);
return mTopLevelAdapter;
}
diff --git a/src/com/android/settings/network/telephony/TelephonyTogglePreferenceController.java b/src/com/android/settings/network/telephony/TelephonyTogglePreferenceController.java
index 46f279d..e3609cb 100644
--- a/src/com/android/settings/network/telephony/TelephonyTogglePreferenceController.java
+++ b/src/com/android/settings/network/telephony/TelephonyTogglePreferenceController.java
@@ -68,7 +68,7 @@
@Override
public int getSliceHighlightMenuRes() {
// not needed since it's not sliceable
- return 0;
+ return NO_RES;
}
/**
diff --git a/src/com/android/settings/notification/BubbleNotificationPreferenceController.java b/src/com/android/settings/notification/BubbleNotificationPreferenceController.java
index 9e35664..eeb9924 100644
--- a/src/com/android/settings/notification/BubbleNotificationPreferenceController.java
+++ b/src/com/android/settings/notification/BubbleNotificationPreferenceController.java
@@ -91,7 +91,7 @@
@Override
public int getSliceHighlightMenuRes() {
// not needed since it's not sliceable
- return 0;
+ return NO_RES;
}
@Override
diff --git a/src/com/android/settings/search/SearchFeatureProvider.java b/src/com/android/settings/search/SearchFeatureProvider.java
index 05fd2ae..9b081e1 100644
--- a/src/com/android/settings/search/SearchFeatureProvider.java
+++ b/src/com/android/settings/search/SearchFeatureProvider.java
@@ -19,7 +19,6 @@
import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO;
import android.annotation.NonNull;
-import android.app.Activity;
import android.app.ActivityOptions;
import android.content.ComponentName;
import android.content.Context;
@@ -30,8 +29,12 @@
import android.view.ViewGroup;
import android.widget.Toolbar;
+import androidx.fragment.app.FragmentActivity;
+
import com.android.settings.R;
import com.android.settings.Utils;
+import com.android.settings.activityembedding.ActivityEmbeddingUtils;
+import com.android.settings.homepage.TopLevelSettings;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.search.SearchIndexableResources;
@@ -66,7 +69,7 @@
/**
* Initializes the search toolbar.
*/
- default void initSearchToolbar(Activity activity, Toolbar toolbar, int pageId) {
+ default void initSearchToolbar(FragmentActivity activity, Toolbar toolbar, int pageId) {
if (activity == null || toolbar == null) {
return;
}
@@ -91,7 +94,8 @@
toolbar.setOnClickListener(tb -> {
final Context context = activity.getApplicationContext();
- final Intent intent = buildSearchIntent(context, pageId);
+ final Intent intent = buildSearchIntent(context, pageId)
+ .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
if (activity.getPackageManager().queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY).isEmpty()) {
@@ -103,8 +107,19 @@
FeatureFactory.getFactory(context).getMetricsFeatureProvider()
.logSettingsTileClick(KEY_HOMEPAGE_SEARCH_BAR, pageId);
- final Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(activity).toBundle();
- activity.startActivity(intent, bundle);
+
+ if (ActivityEmbeddingUtils.isEmbeddingActivityEnabled(context)) {
+ final TopLevelSettings fragment = (TopLevelSettings) activity
+ .getSupportFragmentManager().findFragmentById(R.id.main_content);
+ if (fragment != null) {
+ fragment.disableMenuHighlight();
+ }
+ activity.startActivity(intent);
+ } else {
+ final Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(activity)
+ .toBundle();
+ activity.startActivity(intent, bundle);
+ }
});
}
diff --git a/src/com/android/settings/search/SearchResultTrampoline.java b/src/com/android/settings/search/SearchResultTrampoline.java
index 3414efe..d20a2ea 100644
--- a/src/com/android/settings/search/SearchResultTrampoline.java
+++ b/src/com/android/settings/search/SearchResultTrampoline.java
@@ -20,52 +20,102 @@
import static com.android.settings.SettingsActivity.EXTRA_SHOW_FRAGMENT_TAB;
import android.app.Activity;
+import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
import com.android.settings.SettingsActivity;
import com.android.settings.SubSettings;
import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
+import com.android.settings.activityembedding.ActivityEmbeddingUtils;
import com.android.settings.overlay.FeatureFactory;
+import java.net.URISyntaxException;
+
/**
* A trampoline activity that launches setting result page.
*/
public class SearchResultTrampoline extends Activity {
+ private static final String TAG = "SearchResultTrampoline";
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ final ComponentName callingActivity = getCallingActivity();
// First make sure caller has privilege to launch a search result page.
FeatureFactory.getFactory(this)
.getSearchFeatureProvider()
- .verifyLaunchSearchResultPageCaller(this, getCallingActivity());
+ .verifyLaunchSearchResultPageCaller(this, callingActivity);
// Didn't crash, proceed and launch the result as a subsetting.
- final Intent intent = getIntent();
+ Intent intent = getIntent();
+ final String highlightMenuKey = intent.getStringExtra(
+ Settings.EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_HIGHLIGHT_MENU_KEY);
- // Hack to take EXTRA_FRAGMENT_ARG_KEY from intent and set into
- // EXTRA_SHOW_FRAGMENT_ARGUMENTS. This is necessary because intent could be from external
- // caller and args may not persisted.
- final String settingKey = intent.getStringExtra(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY);
- final int tab = intent.getIntExtra(EXTRA_SHOW_FRAGMENT_TAB, 0);
- final Bundle args = new Bundle();
- args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, settingKey);
- args.putInt(EXTRA_SHOW_FRAGMENT_TAB, tab);
- intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
+ final String fragment = intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT);
+ if (!TextUtils.isEmpty(fragment)) {
+ // Hack to take EXTRA_FRAGMENT_ARG_KEY from intent and set into
+ // EXTRA_SHOW_FRAGMENT_ARGUMENTS. This is necessary because intent could be from
+ // external caller and args may not persisted.
+ final String settingKey = intent.getStringExtra(
+ SettingsActivity.EXTRA_FRAGMENT_ARG_KEY);
+ final int tab = intent.getIntExtra(EXTRA_SHOW_FRAGMENT_TAB, 0);
+ final Bundle args = new Bundle();
+ args.putString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY, settingKey);
+ args.putInt(EXTRA_SHOW_FRAGMENT_TAB, tab);
+ intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
- // Register SplirPairRule for SubSettings, set clearTop false to prevent unexpected back
- // navigation behavior.
- ActivityEmbeddingRulesController.registerSubSettingsPairRuleIfNeeded(this /* context */,
- false /* clearTop*/);
+ // Reroute request to SubSetting.
+ intent.setClass(this /* context */, SubSettings.class);
+ } else {
+ // Direct link case
+ final String intentUriString = intent.getStringExtra(
+ Settings.EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI);
+ if (TextUtils.isEmpty(intentUriString)) {
+ Log.e(TAG, "No EXTRA_SETTINGS_EMBEDDED_DEEP_LINK_INTENT_URI for deep link");
+ finish();
+ return;
+ }
- // Reroute request to SubSetting.
- intent.setClass(this /* context */, SubSettings.class)
- .addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
- startActivity(intent);
+ try {
+ intent = Intent.parseUri(intentUriString, Intent.URI_INTENT_SCHEME);
+ } catch (URISyntaxException e) {
+ Log.e(TAG, "Failed to parse deep link intent: " + e);
+ finish();
+ return;
+ }
+ }
+
+ intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+
+ if (!ActivityEmbeddingUtils.isEmbeddingActivityEnabled(this)) {
+ startActivity(intent);
+ } else if (isFromSettingsIntelligence(callingActivity)) {
+ // Register SplitPairRule for SubSettings, set clearTop false to prevent unexpected back
+ // navigation behavior.
+ ActivityEmbeddingRulesController.registerSubSettingsPairRuleIfNeeded(this,
+ false /* clearTop */);
+ // TODO: pass menu key to homepage
+ intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(intent);
+ } else {
+ // Two-pane case
+ intent.setFlags(intent.getFlags() & ~Intent.FLAG_ACTIVITY_NEW_TASK);
+ startActivity(SettingsActivity.getTrampolineIntent(intent, highlightMenuKey));
+ }
// Done.
finish();
}
+ private boolean isFromSettingsIntelligence(ComponentName callingActivity) {
+ return callingActivity != null && TextUtils.equals(
+ callingActivity.getPackageName(),
+ FeatureFactory.getFactory(this).getSearchFeatureProvider()
+ .getSettingsIntelligencePkgName(this));
+ }
}
diff --git a/src/com/android/settings/search/SettingsSearchIndexablesProvider.java b/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
index feb9510..d6635a1 100644
--- a/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
+++ b/src/com/android/settings/search/SettingsSearchIndexablesProvider.java
@@ -365,7 +365,6 @@
// The classname and intent information comes from the PreIndexData
// This will be more clear when provider conversion is done at PreIndex time.
raw.className = bundle.getTargetClass().getName();
-
}
rawList.addAll(providerRaws);
}
diff --git a/src/com/android/settings/slices/Sliceable.java b/src/com/android/settings/slices/Sliceable.java
index 31555df..406cb3a 100644
--- a/src/com/android/settings/slices/Sliceable.java
+++ b/src/com/android/settings/slices/Sliceable.java
@@ -25,6 +25,7 @@
import android.net.Uri;
import android.widget.Toast;
+import androidx.annotation.StringRes;
import androidx.slice.Slice;
import com.android.settings.R;
@@ -135,10 +136,16 @@
}
/**
- * @return a resource ID that indicates which menu entry should be highlighted in multi-pane
- * mode.
+ * Used to mark a {@link Sliceable} that has no highlight menu string resource.
*/
- default int getSliceHighlightMenuRes() {
- return 0;
+ int NO_RES = 0;
+
+ /**
+ * @return a string resource declared in res/values/menu_keys.xml that indicates which menu
+ * entry should be highlighted in two-pane mode, or {@link #NO_RES} representing highlighting is
+ * not applicable.
+ */
+ @StringRes default int getSliceHighlightMenuRes() {
+ return NO_RES;
}
}
diff --git a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
index 19a91f6..bf92bbd 100644
--- a/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
+++ b/src/com/android/settings/widget/HighlightableTopLevelPreferenceAdapter.java
@@ -16,7 +16,6 @@
package com.android.settings.widget;
-import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
@@ -34,6 +33,7 @@
import com.android.settings.Utils;
import com.android.settings.activityembedding.ActivityEmbeddingUtils;
+import com.android.settings.homepage.SettingsHomepageActivity;
/**
* Adapter for highlighting top level preferences
@@ -54,7 +54,7 @@
final int mIconColorHighlight;
private final Context mContext;
- private final Activity mActivity;
+ private final SettingsHomepageActivity mHomepageActivity;
private final RecyclerView mRecyclerView;
private final int mNormalBackgroundRes;
private String mHighlightKey;
@@ -63,13 +63,13 @@
private boolean mHighlightNeeded;
private boolean mScrolled;
- public HighlightableTopLevelPreferenceAdapter(Activity activity,
+ public HighlightableTopLevelPreferenceAdapter(SettingsHomepageActivity homepageActivity,
PreferenceGroup preferenceGroup, RecyclerView recyclerView, String key) {
super(preferenceGroup);
mRecyclerView = recyclerView;
mHighlightKey = key;
mContext = preferenceGroup.getContext();
- mActivity = activity;
+ mHomepageActivity = homepageActivity;
final TypedValue outValue = new TypedValue();
mContext.getTheme().resolveAttribute(android.R.attr.selectableItemBackground,
outValue, true /* resolveRefs */);
@@ -115,7 +115,7 @@
* A function can highlight a specific setting in recycler view.
*/
public void requestHighlight() {
- if (mRecyclerView == null || TextUtils.isEmpty(mHighlightKey)) {
+ if (mRecyclerView == null) {
return;
}
@@ -194,6 +194,11 @@
return;
}
+ if (mHomepageActivity.registerHomepageLoadedListenerIfNeeded(
+ () -> scrollToPositionIfNeeded(position))) {
+ return;
+ }
+
// Only when the recyclerView is loaded, it can be scrolled
final View view = mRecyclerView.getChildAt(position);
if (view == null) {
@@ -236,6 +241,6 @@
}
private boolean isHighlightNeeded() {
- return ActivityEmbeddingUtils.isTwoPaneResolution(mActivity);
+ return ActivityEmbeddingUtils.isTwoPaneResolution(mHomepageActivity);
}
}
diff --git a/src/com/android/settings/wifi/RequestToggleWiFiActivity.java b/src/com/android/settings/wifi/RequestToggleWiFiActivity.java
index 34ef7cf..6887b78 100644
--- a/src/com/android/settings/wifi/RequestToggleWiFiActivity.java
+++ b/src/com/android/settings/wifi/RequestToggleWiFiActivity.java
@@ -19,6 +19,8 @@
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
import android.app.Activity;
+import android.app.ActivityManager;
+import android.app.IActivityManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
@@ -29,11 +31,13 @@
import android.content.pm.PackageManager;
import android.net.wifi.WifiManager;
import android.os.Bundle;
+import android.os.RemoteException;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.NonNull;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.AlertActivity;
import com.android.settings.R;
@@ -63,6 +67,8 @@
private @NonNull WifiManager mWiFiManager;
private @NonNull CharSequence mAppLabel;
+ @VisibleForTesting
+ protected IActivityManager mActivityManager = ActivityManager.getService();
private int mState = STATE_UNKNOWN;
private int mLastUpdateState = STATE_UNKNOWN;
@@ -75,20 +81,8 @@
setResult(Activity.RESULT_CANCELED);
- String packageName = getIntent().getStringExtra(Intent.EXTRA_PACKAGE_NAME);
- if (TextUtils.isEmpty(packageName)) {
- finish();
- return;
- }
-
- try {
- ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo(
- packageName, 0);
- mAppLabel = applicationInfo.loadSafeLabel(getPackageManager(),
- PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX, PackageItemInfo.SAFE_LABEL_FLAG_TRIM
- | PackageItemInfo.SAFE_LABEL_FLAG_FIRST_LINE);
- } catch (PackageManager.NameNotFoundException e) {
- Log.e(LOG_TAG, "Couldn't find app with package name " + packageName);
+ mAppLabel = getAppLabel();
+ if (TextUtils.isEmpty(mAppLabel)) {
finish();
return;
}
@@ -140,7 +134,6 @@
@Override
protected void onStart() {
super.onStart();
-
mReceiver.register();
final int wifiState = mWiFiManager.getWifiState();
@@ -223,6 +216,32 @@
super.onStop();
}
+ @VisibleForTesting
+ protected CharSequence getAppLabel() {
+ String packageName;
+ try {
+ packageName = mActivityManager.getLaunchedFromPackage(getActivityToken());
+ if (TextUtils.isEmpty(packageName)) {
+ Log.d(LOG_TAG, "Package name is null");
+ return null;
+ }
+ } catch (RemoteException e) {
+ Log.e(LOG_TAG, "Can not get the package from activity manager");
+ return null;
+ }
+
+ try {
+ ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo(
+ packageName, 0);
+ return applicationInfo.loadSafeLabel(getPackageManager(),
+ PackageItemInfo.DEFAULT_MAX_LABEL_SIZE_PX, PackageItemInfo.SAFE_LABEL_FLAG_TRIM
+ | PackageItemInfo.SAFE_LABEL_FLAG_FIRST_LINE);
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(LOG_TAG, "Couldn't find app with package name " + packageName);
+ return null;
+ }
+ }
+
private void updateUi() {
if (mLastUpdateState == mState) {
return;
diff --git a/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java b/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java
index 7b5eaa9..6bf9104 100644
--- a/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java
+++ b/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java
@@ -16,9 +16,14 @@
package com.android.settings.wifi.addappnetworks;
+import android.app.ActivityManager;
+import android.app.IActivityManager;
import android.content.Intent;
import android.os.Bundle;
+import android.os.RemoteException;
import android.provider.Settings;
+import android.text.TextUtils;
+import android.util.Log;
import android.view.Gravity;
import android.view.Window;
import android.view.WindowManager;
@@ -48,12 +53,17 @@
@VisibleForTesting
final Bundle mBundle = new Bundle();
+ @VisibleForTesting
+ IActivityManager mActivityManager = ActivityManager.getService();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings_panel);
- showAddNetworksFragment();
+ if (!showAddNetworksFragment()) {
+ finish();
+ return;
+ }
getLifecycle().addObserver(new HideNonSystemOverlayMixin(this));
// Move the window to the bottom of screen, and make it take up the entire screen width.
@@ -67,13 +77,22 @@
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
- showAddNetworksFragment();
+ if (!showAddNetworksFragment()) {
+ finish();
+ return;
+ }
}
@VisibleForTesting
- void showAddNetworksFragment() {
+ protected boolean showAddNetworksFragment() {
+ String packageName = getCallingAppPackageName();
+ if (TextUtils.isEmpty(packageName)) {
+ Log.d(TAG, "Package name is null");
+ return false;
+ }
+
// TODO: Check the new intent status.
- mBundle.putString(KEY_CALLING_PACKAGE_NAME, getCallingPackage());
+ mBundle.putString(KEY_CALLING_PACKAGE_NAME, packageName);
mBundle.putParcelableArrayList(Settings.EXTRA_WIFI_NETWORK_LIST,
getIntent().getParcelableArrayListExtra(Settings.EXTRA_WIFI_NETWORK_LIST));
@@ -86,5 +105,19 @@
} else {
((AddAppNetworksFragment) fragment).createContent(mBundle);
}
+
+ return true;
+ }
+
+ @VisibleForTesting
+ protected String getCallingAppPackageName() {
+ String packageName;
+ try {
+ packageName = mActivityManager.getLaunchedFromPackage(getActivityToken());
+ } catch (RemoteException e) {
+ Log.e(TAG, "Can not get the package from activity manager");
+ return null;
+ }
+ return packageName;
}
}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java b/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java
index b4f4f97..5c23238 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/ForgetDeviceDialogFragmentTest.java
@@ -99,20 +99,6 @@
}
@Test
- public void createDialog_untetheredDevice_showUntetheredMessage() {
- when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET))
- .thenReturn("true".getBytes());
-
- FragmentController.setupFragment(mFragment, FragmentActivity.class,
- 0 /* containerViewId */, null /* bundle */);
- final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
- ShadowAlertDialogCompat shadowDialog = ShadowAlertDialogCompat.shadowOf(dialog);
-
- assertThat(shadowDialog.getMessage()).isEqualTo(
- mContext.getString(R.string.bluetooth_untethered_unpair_dialog_body, DEVICE_NAME));
- }
-
- @Test
public void createDialog_normalDevice_showNormalMessage() {
when(mBluetoothDevice.getMetadata(BluetoothDevice.METADATA_IS_UNTETHERED_HEADSET))
.thenReturn("false".getBytes());
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
index 3501726..db002cb 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java
@@ -792,14 +792,39 @@
assertThat(mOptimizePreference.isChecked()).isTrue();
assertThat(mRestrictedPreference.isChecked()).isFalse();
assertThat(mUnrestrictedPreference.isChecked()).isFalse();
+ }
+
+ @Test
+ public void testOnPause_optimizationModeChanged_logPreference() {
+ final int mode = BatteryOptimizeUtils.MODE_RESTRICTED;
+ mFragment.mOptimizationMode = mode;
+ when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(mode);
+ mOptimizePreference.setKey(KEY_PREF_OPTIMIZED);
+
+ mFragment.onRadioButtonClicked(mOptimizePreference);
+ mFragment.onPause();
+
verify(mMetricsFeatureProvider)
- .action(
- mContext,
- SettingsEnums.ACTION_APP_BATTERY_USAGE_OPTIMIZED,
- (Pair<Integer, Object>[]) new Pair[] {
- new Pair(ConvertUtils.METRIC_KEY_PACKAGE, null),
- new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE, "app label")
- });
+ .action(
+ mContext,
+ SettingsEnums.ACTION_APP_BATTERY_USAGE_OPTIMIZED,
+ (Pair<Integer, Object>[]) new Pair[] {
+ new Pair(ConvertUtils.METRIC_KEY_PACKAGE, null),
+ new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE, "app label")
+ });
+ }
+
+ @Test
+ public void testOnPause_optimizationModeIsNotChanged_notInvokeLogging() {
+ final int mode = BatteryOptimizeUtils.MODE_OPTIMIZED;
+ mFragment.mOptimizationMode = mode;
+ when(mBatteryOptimizeUtils.getAppOptimizationMode()).thenReturn(mode);
+ mOptimizePreference.setKey(KEY_PREF_OPTIMIZED);
+
+ mFragment.onRadioButtonClicked(mOptimizePreference);
+ mFragment.onPause();
+
+ verifyZeroInteractions(mMetricsFeatureProvider);
}
@Test
@@ -831,7 +856,7 @@
.thenReturn(BatteryOptimizeUtils.MODE_UNRESTRICTED);
mFragment.mEnableTriState = false;
- mFragment.notifyBackupManager();
+ mFragment.onPause();
verifyZeroInteractions(mBackupManager);
}
diff --git a/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
index 444a813..5de57b6 100644
--- a/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/search/SearchFeatureProviderImplTest.java
@@ -19,7 +19,6 @@
import static com.google.common.truth.Truth.assertThat;
-import android.app.Activity;
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Intent;
@@ -29,6 +28,8 @@
import android.provider.Settings;
import android.widget.Toolbar;
+import androidx.fragment.app.FragmentActivity;
+
import com.android.settings.R;
import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowUtils;
@@ -46,13 +47,13 @@
public class SearchFeatureProviderImplTest {
private SearchFeatureProviderImpl mProvider;
- private Activity mActivity;
+ private FragmentActivity mActivity;
private ShadowPackageManager mPackageManager;
@Before
public void setUp() {
FakeFeatureFactory.setupForTest();
- mActivity = Robolectric.setupActivity(Activity.class);
+ mActivity = Robolectric.setupActivity(FragmentActivity.class);
mProvider = new SearchFeatureProviderImpl();
mPackageManager = Shadows.shadowOf(mActivity.getPackageManager());
Settings.Global.putInt(mActivity.getContentResolver(),
diff --git a/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivityTest.java b/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivityTest.java
index b614698..39408e2 100644
--- a/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivityTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivityTest.java
@@ -18,27 +18,70 @@
import static com.google.common.truth.Truth.assertThat;
-import static org.robolectric.Shadows.shadowOf;
+import android.annotation.Nullable;
+import android.app.IActivityManager;
+import android.os.RemoteException;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
@RunWith(RobolectricTestRunner.class)
public class AddAppNetworksActivityTest {
+ @Mock
+ private IActivityManager mIActivityManager;
+
+ private AddAppNetworksActivity mActivity;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+
+ mActivity = Robolectric.buildActivity(AddAppNetworksActivity.class).create().get();
+ mActivity.mActivityManager = mIActivityManager;
+ }
+
@Test
- public void startActivity_withPackageName_bundleShouldHaveRightPackageName() {
- final String packageName = RuntimeEnvironment.application.getPackageName();
- final AddAppNetworksActivity activity =
- Robolectric.buildActivity(AddAppNetworksActivity.class).create().get();
- shadowOf(activity).setCallingPackage(packageName);
+ public void getCallingAppPackageName_nullPackageName_returnNotNull() {
+ fakeCallingPackage("com.android.settings");
- activity.showAddNetworksFragment();
+ assertThat(mActivity.getCallingAppPackageName()).isNotNull();
+ }
- assertThat(activity.mBundle.getString(AddAppNetworksActivity.KEY_CALLING_PACKAGE_NAME))
- .isEqualTo(packageName);
+ @Test
+ public void getCallingAppPackageName_withPackageName_returnNull() {
+ fakeCallingPackage(null);
+
+ assertThat(mActivity.getCallingAppPackageName()).isNull();
+ }
+
+ @Test
+ public void showAddNetworksFragment_nullPackageName_returnFalse() {
+ fakeCallingPackage(null);
+
+ assertThat(mActivity.showAddNetworksFragment()).isFalse();
+ }
+
+ @Test
+ public void showAddNetworksFragment_withPackageName_returnTrue() {
+ fakeCallingPackage("com.android.settings");
+
+ assertThat(mActivity.showAddNetworksFragment()).isTrue();
+ }
+
+ private void fakeCallingPackage(@Nullable String packageName) {
+ try {
+ when(mIActivityManager.getLaunchedFromPackage(any())).thenReturn(packageName);
+ } catch (RemoteException e) {
+ // Do nothing.
+ }
}
}
diff --git a/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java b/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java
index df6a38b..8687e5a 100644
--- a/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java
+++ b/tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java
@@ -305,7 +305,7 @@
@Override
public int getSliceHighlightMenuRes() {
- return 0;
+ return NO_RES;
}
}
diff --git a/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java b/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
index 490b7bd..38347e9 100644
--- a/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
+++ b/tests/unit/src/com/android/settings/slices/SpecialCaseSliceManagerTest.java
@@ -146,7 +146,7 @@
@Override
public int getSliceHighlightMenuRes() {
- return 0;
+ return NO_RES;
}
}
}
diff --git a/tests/unit/src/com/android/settings/wifi/RequestToggleWiFiActivityTest.java b/tests/unit/src/com/android/settings/wifi/RequestToggleWiFiActivityTest.java
new file mode 100644
index 0000000..0e3dd40
--- /dev/null
+++ b/tests/unit/src/com/android/settings/wifi/RequestToggleWiFiActivityTest.java
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2021 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.wifi;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+import android.annotation.Nullable;
+import android.app.IActivityManager;
+import android.content.Context;
+import android.content.Intent;
+import android.net.wifi.WifiManager;
+import android.os.RemoteException;
+
+import androidx.test.core.app.ActivityScenario;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+@RunWith(AndroidJUnit4.class)
+public class RequestToggleWiFiActivityTest {
+
+ @Rule
+ public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+ @Spy
+ private final Context mContext = ApplicationProvider.getApplicationContext();
+ @Mock
+ private WifiManager mWifiManager;
+ @Mock
+ private IActivityManager mIActivityManager;
+
+ private ActivityScenario<RequestToggleWiFiActivity> mActivityScenario;
+ private RequestToggleWiFiActivity mActivity;
+
+ @Before
+ public void setUp() {
+ when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
+ when(mWifiManager.getWifiState()).thenReturn(WifiManager.WIFI_STATE_DISABLED);
+
+ mActivityScenario = ActivityScenario.launch(new Intent(WifiManager.ACTION_REQUEST_ENABLE));
+ mActivityScenario.onActivity(activity -> mActivity = activity);
+
+ }
+
+ @After
+ public void cleanUp() {
+ mActivity = null;
+ if (mActivityScenario != null) {
+ mActivityScenario.close();
+ }
+ }
+
+ @Test
+ public void getAppLabel_nullPackageName_returnNull() {
+ fakeCallingPackage(null);
+
+ assertThat(mActivity.getAppLabel()).isNull();
+ }
+
+ @Test
+ public void getAppLabel_settingsPackageName_returnNotNull() {
+ fakeCallingPackage("com.android.settings");
+
+ assertThat(mActivity.getAppLabel()).isNotNull();
+ }
+
+ private void fakeCallingPackage(@Nullable String packageName) {
+ assertThat(mActivity).isNotNull();
+ mActivity.mActivityManager = mIActivityManager;
+ try {
+ when(mIActivityManager.getLaunchedFromPackage(any())).thenReturn(packageName);
+ } catch (RemoteException e) {
+ // Do nothing.
+ }
+ }
+}