diff --git a/src/com/android/settings/SettingsInitialize.java b/src/com/android/settings/SettingsInitialize.java index e527ae131df..500ce779ef5 100644 --- a/src/com/android/settings/SettingsInitialize.java +++ b/src/com/android/settings/SettingsInitialize.java @@ -34,7 +34,6 @@ import android.content.pm.ShortcutManager; import android.content.pm.UserInfo; import android.os.UserHandle; import android.os.UserManager; -import android.text.TextUtils; import android.util.Log; import androidx.annotation.VisibleForTesting; @@ -150,10 +149,6 @@ public class SettingsInitialize extends BroadcastReceiver { } private void enableTwoPaneDeepLinkActivityIfNecessary(PackageManager pm, Intent intent) { - if (!TextUtils.equals(intent.getAction(), Intent.ACTION_PRE_BOOT_COMPLETED)) { - return; - } - final ComponentName deepLinkHome = new ComponentName(Utils.SETTINGS_PACKAGE_NAME, SettingsHomepageActivity.ALIAS_DEEP_LINK); final int enableState = SplitController.getInstance().isSplitSupported() diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java index e1360fd4996..e9dcea19471 100644 --- a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java +++ b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java @@ -17,6 +17,7 @@ package com.android.settings.activityembedding; import android.app.Activity; +import android.app.settings.SettingsEnums; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -25,6 +26,7 @@ import android.util.Log; import androidx.annotation.NonNull; import androidx.window.embedding.ActivityFilter; +import androidx.window.embedding.ActivityRule; import androidx.window.embedding.SplitController; import androidx.window.embedding.SplitPairFilter; import androidx.window.embedding.SplitPairRule; @@ -34,6 +36,7 @@ import com.android.settings.Settings; import com.android.settings.SubSettings; import com.android.settings.Utils; import com.android.settings.homepage.SettingsHomepageActivity; +import com.android.settings.overlay.FeatureFactory; import java.util.HashSet; import java.util.Set; @@ -70,6 +73,8 @@ public class ActivityEmbeddingRulesController { null /* secondaryIntentAction */, true /* finishPrimaryWithSecondary */, true /* finishSecondaryWithPrimary */); + // Set rules here to show full screen for specified Activity. + registerAlwaysExpandRule(); } /** Register a SplitPairRule for 2-pane. */ @@ -85,21 +90,31 @@ public class ActivityEmbeddingRulesController { SplitController.getInstance().registerRule(new SplitPairRule(filters, finishPrimaryWithSecondary, - finishSecondaryWithPrimary, true /* clearTop */, + finishSecondaryWithPrimary, + true /* clearTop */, ActivityEmbeddingUtils.getMinCurrentScreenSplitWidthPx(context), ActivityEmbeddingUtils.getMinSmallestScreenSplitWidthPx(context), ActivityEmbeddingUtils.SPLIT_RATIO, LayoutDirection.LOCALE)); } + private void registerAlwaysExpandRule() { + final Set activityFilters = new HashSet<>(); + + final Intent searchIntent = FeatureFactory.getFactory(mContext).getSearchFeatureProvider() + .buildSearchIntent(mContext, SettingsEnums.SETTINGS_HOMEPAGE); + addActivityFilter(activityFilters, searchIntent); + + mSplitController.registerRule(new ActivityRule(activityFilters, true /* alwaysExpand */)); + } + private void registerHomepagePlaceholderRule() { final Set activityFilters = new HashSet<>(); - activityFilters.add(new ActivityFilter(getComponentName(SettingsHomepageActivity.class), - null /* intentAction */)); - activityFilters.add(new ActivityFilter(getComponentName(Settings.class), - null /* intentAction */)); - activityFilters.add(new ActivityFilter(new ComponentName(Utils.SETTINGS_PACKAGE_NAME, - SettingsHomepageActivity.ALIAS_DEEP_LINK), null /* intentAction */)); + addActivityFilter(activityFilters, SettingsHomepageActivity.class); + addActivityFilter(activityFilters, Settings.class); + addActivityFilter(activityFilters, new ComponentName(Utils.SETTINGS_PACKAGE_NAME, + SettingsHomepageActivity.ALIAS_DEEP_LINK)); + final Intent intent = new Intent(); intent.setComponent(getComponentName(Settings.NetworkDashboardActivity.class)); final SplitPlaceholderRule placeholderRule = new SplitPlaceholderRule( @@ -113,6 +128,22 @@ public class ActivityEmbeddingRulesController { mSplitController.registerRule(placeholderRule); } + private void addActivityFilter(Set activityFilters, + Class activityClass) { + activityFilters.add(new ActivityFilter(getComponentName(activityClass), + null /* intentAction */)); + } + + private void addActivityFilter(Set activityFilters, Intent intent) { + activityFilters.add(new ActivityFilter(new ComponentName("*" /* pkg */, "*" /* cls */), + intent.getAction())); + } + + private void addActivityFilter(Set activityFilters, + ComponentName componentName) { + activityFilters.add(new ActivityFilter(componentName, null /* intentAction */)); + } + @NonNull private ComponentName getComponentName(Class activityClass) { return new ComponentName(mContext.getPackageName(), activityClass.getName()); diff --git a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java index bf464a8c364..35af4053f86 100644 --- a/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryAppListPreferenceController.java @@ -102,7 +102,9 @@ public class BatteryAppListPreferenceController extends AbstractPreferenceContro } PowerProfile powerProfile = new PowerProfile(context); - return powerProfile.getAveragePower(PowerProfile.POWER_SCREEN_FULL) + // Cheap hack to try to figure out if the power_profile.xml was populated. + return powerProfile.getAveragePowerForOrdinal( + PowerProfile.POWER_GROUP_DISPLAY_SCREEN_FULL, 0) >= MIN_AVERAGE_POWER_THRESHOLD_MILLI_AMP; } }; diff --git a/src/com/android/settings/homepage/SettingsHomepageActivity.java b/src/com/android/settings/homepage/SettingsHomepageActivity.java index 84eed6da9fb..3e9b9d059f5 100644 --- a/src/com/android/settings/homepage/SettingsHomepageActivity.java +++ b/src/com/android/settings/homepage/SettingsHomepageActivity.java @@ -18,9 +18,11 @@ package com.android.settings.homepage; import android.animation.LayoutTransition; import android.app.ActivityManager; +import android.app.PendingIntent; import android.app.settings.SettingsEnums; import android.content.ComponentName; import android.content.Intent; +import android.content.pm.PackageManager; import android.os.Bundle; import android.text.TextUtils; import android.util.FeatureFlagUtils; @@ -34,15 +36,16 @@ import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; +import androidx.window.embedding.SplitController; import com.android.settings.R; import com.android.settings.Settings; import com.android.settings.Utils; import com.android.settings.accounts.AvatarViewMixin; -import com.android.settings.activityembedding.ActivityEmbeddingRulesController; -import com.android.settings.activityembedding.ActivityEmbeddingUtils; import com.android.settings.core.CategoryMixin; import com.android.settings.core.FeatureFlags; +import com.android.settings.activityembedding.ActivityEmbeddingRulesController; +import com.android.settings.activityembedding.ActivityEmbeddingUtils; import com.android.settings.homepage.contextualcards.ContextualCardsFragment; import com.android.settings.overlay.FeatureFactory; import com.android.settingslib.core.lifecycle.HideNonSystemOverlayMixin; diff --git a/src/com/android/settings/network/EraseEuiccDataDialogFragment.java b/src/com/android/settings/network/EraseEuiccDataDialogFragment.java index a141f0c7bab..819d3b1fc6e 100644 --- a/src/com/android/settings/network/EraseEuiccDataDialogFragment.java +++ b/src/com/android/settings/network/EraseEuiccDataDialogFragment.java @@ -32,7 +32,9 @@ import androidx.fragment.app.FragmentManager; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; +import com.android.settings.network.helper.ConfirmationSimDeletionPredicate; import com.android.settings.system.ResetDashboardFragment; +import com.android.settings.wifi.dpp.WifiDppUtils; public class EraseEuiccDataDialogFragment extends InstrumentedDialogFragment implements DialogInterface.OnClickListener { @@ -73,13 +75,24 @@ public class EraseEuiccDataDialogFragment extends InstrumentedDialogFragment imp } if (which == DialogInterface.BUTTON_POSITIVE) { - AsyncTask.execute(new Runnable() { - @Override - public void run() { - RecoverySystem.wipeEuiccData( - getContext(), PACKAGE_NAME_EUICC_DATA_MANAGEMENT_CALLBACK); - } - }); + if (ConfirmationSimDeletionPredicate.getSingleton().test(getContext())) { + // Create a "verify it's you" verification over keyguard + // when "erase" button been pressed. + // This might protect from erasing by some automation process. + WifiDppUtils.showLockScreen(getContext(), () -> runAsyncWipe()); + } else { + runAsyncWipe(); + } } } + + private void runAsyncWipe() { + AsyncTask.execute(new Runnable() { + @Override + public void run() { + RecoverySystem.wipeEuiccData( + getContext(), PACKAGE_NAME_EUICC_DATA_MANAGEMENT_CALLBACK); + } + }); + } } diff --git a/src/com/android/settings/network/helper/ConfirmationSimDeletionPredicate.java b/src/com/android/settings/network/helper/ConfirmationSimDeletionPredicate.java new file mode 100644 index 00000000000..420f6db6ee1 --- /dev/null +++ b/src/com/android/settings/network/helper/ConfirmationSimDeletionPredicate.java @@ -0,0 +1,66 @@ +/* + * 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.network.helper; + +import android.app.KeyguardManager; +import android.content.Context; +import android.provider.Settings; + +import com.android.settings.R; + +import java.util.function.Predicate; + +/** + * {@link Predicate} for detecting the configuration of confirm SIM deletion. + */ +public class ConfirmationSimDeletionPredicate implements Predicate { + + public static final String KEY_CONFIRM_SIM_DELETION = "confirm_sim_deletion"; + + private static final ConfirmationSimDeletionPredicate sSingleton = + new ConfirmationSimDeletionPredicate(); + + // Get singleton of this predicate + public static final ConfirmationSimDeletionPredicate getSingleton() { + return sSingleton; + } + + /** + * Get default configuration of confirm SIM deletion. + * + * @param Context context + * @return the configuration of confirm SIM deletion + */ + private static boolean getDefaultValue(Context context) { + return context.getResources() + .getBoolean(R.bool.config_sim_deletion_confirmation_default_on); + } + + /** + * Get the configuration of confirm SIM deletion. + * + * @param Context context + * @return the configuration of confirm SIM deletion + */ + public boolean test(Context context) { + final KeyguardManager keyguardManager = context.getSystemService(KeyguardManager.class); + if ((keyguardManager != null) && !keyguardManager.isKeyguardSecure()) { + return false; + } + return Settings.Global.getInt(context.getContentResolver(), KEY_CONFIRM_SIM_DELETION, + getDefaultValue(context) ? 1 : 0) == 1; + } +} diff --git a/src/com/android/settings/security/ConfirmSimDeletionPreferenceController.java b/src/com/android/settings/security/ConfirmSimDeletionPreferenceController.java index bf807a19715..a7185e3f207 100644 --- a/src/com/android/settings/security/ConfirmSimDeletionPreferenceController.java +++ b/src/com/android/settings/security/ConfirmSimDeletionPreferenceController.java @@ -26,6 +26,7 @@ import androidx.preference.TwoStatePreference; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; +import com.android.settings.network.helper.ConfirmationSimDeletionPredicate; import com.android.settings.network.telephony.MobileNetworkUtils; import com.android.settings.overlay.FeatureFactory; import com.android.settings.wifi.dpp.WifiDppUtils; @@ -34,7 +35,8 @@ import com.android.settingslib.core.instrumentation.MetricsFeatureProvider; /** Enable/disable user confirmation before deleting an eSim */ public class ConfirmSimDeletionPreferenceController extends BasePreferenceController implements Preference.OnPreferenceChangeListener{ - public static final String KEY_CONFIRM_SIM_DELETION = "confirm_sim_deletion"; + public static final String KEY_CONFIRM_SIM_DELETION = + ConfirmationSimDeletionPredicate.KEY_CONFIRM_SIM_DELETION; private boolean mConfirmationDefaultOn; private MetricsFeatureProvider mMetricsFeatureProvider;