diff --git a/res/drawable/ic_private_space_icon.xml b/res/drawable/ic_private_space_icon.xml
new file mode 100644
index 00000000000..fc0894d1fe0
--- /dev/null
+++ b/res/drawable/ic_private_space_icon.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
diff --git a/res/drawable/ic_privatespace_icon.xml b/res/drawable/ic_privatespace_icon.xml
deleted file mode 100644
index b651f5235e0..00000000000
--- a/res/drawable/ic_privatespace_icon.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
diff --git a/res/drawable/private_space_choose_lock_illustration.xml b/res/drawable/private_space_choose_lock_illustration.xml
new file mode 100644
index 00000000000..f943cb8229d
--- /dev/null
+++ b/res/drawable/private_space_choose_lock_illustration.xml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/drawable/private_space_illustration.xml b/res/drawable/private_space_illustration.xml
new file mode 100644
index 00000000000..7f2dba873bc
--- /dev/null
+++ b/res/drawable/private_space_illustration.xml
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/drawable/private_space_setup_notification_illustration.xml b/res/drawable/private_space_setup_notification_illustration.xml
new file mode 100644
index 00000000000..ecdb486aa8a
--- /dev/null
+++ b/res/drawable/private_space_setup_notification_illustration.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/drawable/private_space_setup_preinstalled_illustration.xml b/res/drawable/private_space_setup_preinstalled_illustration.xml
new file mode 100644
index 00000000000..2f01f01c8af
--- /dev/null
+++ b/res/drawable/private_space_setup_preinstalled_illustration.xml
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/drawable/private_space_setup_sharing_illustration.xml b/res/drawable/private_space_setup_sharing_illustration.xml
new file mode 100644
index 00000000000..8cfa77f7af7
--- /dev/null
+++ b/res/drawable/private_space_setup_sharing_illustration.xml
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/res/drawable/privatespace_lock_placeholder.xml b/res/drawable/privatespace_lock_placeholder.xml
deleted file mode 100644
index 815ffd70d60..00000000000
--- a/res/drawable/privatespace_lock_placeholder.xml
+++ /dev/null
@@ -1,78 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/res/drawable/privatespace_setup_flow_placeholder.xml b/res/drawable/privatespace_setup_flow_placeholder.xml
deleted file mode 100644
index a4ff1252502..00000000000
--- a/res/drawable/privatespace_setup_flow_placeholder.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/res/layout/privatespace_advancing_screen.xml b/res/layout/private_space_advancing_screen.xml
similarity index 91%
rename from res/layout/privatespace_advancing_screen.xml
rename to res/layout/private_space_advancing_screen.xml
index 3a85b160222..35d6462651f 100644
--- a/res/layout/privatespace_advancing_screen.xml
+++ b/res/layout/private_space_advancing_screen.xml
@@ -20,18 +20,18 @@
android:id="@+id/private_space_autoadvance_screen"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:icon="@drawable/ic_privatespace_icon">
+ android:icon="@drawable/ic_private_space_icon">
+ android:src="@null"/>
+ android:icon="@drawable/ic_private_space_icon">
+ android:src="@drawable/private_space_illustration"/>
diff --git a/res/layout/privatespace_setlock_screen.xml b/res/layout/private_space_setlock_screen.xml
similarity index 93%
rename from res/layout/privatespace_setlock_screen.xml
rename to res/layout/private_space_setlock_screen.xml
index 72119484ac3..64a2ff2339e 100644
--- a/res/layout/privatespace_setlock_screen.xml
+++ b/res/layout/private_space_setlock_screen.xml
@@ -37,7 +37,7 @@
android:layout_height="match_parent"
android:scaleType="fitCenter"
android:contentDescription="@null"
- android:src="@drawable/privatespace_lock_placeholder"/>
+ android:src="@drawable/private_space_choose_lock_illustration"/>
\ No newline at end of file
diff --git a/res/layout/privatespace_setup_success.xml b/res/layout/private_space_setup_success.xml
similarity index 79%
rename from res/layout/privatespace_setup_success.xml
rename to res/layout/private_space_setup_success.xml
index e3e6b683698..759373f8267 100644
--- a/res/layout/privatespace_setup_success.xml
+++ b/res/layout/private_space_setup_success.xml
@@ -24,4 +24,13 @@
app:sucHeaderText="@string/private_space_success_title"
app:sudDescriptionText="@string/private_space_access_text"
android:icon="@drawable/ic_privatespace_done">
+
+
+
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 3e0b8d93381..4b96486be7b 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -473,4 +473,8 @@
1000dp
+
+
+ 80dp
+ 24dp
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 17569e0958c..836a27f0a5c 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -10802,6 +10802,8 @@
Change
Open
+
+ None selected
diff --git a/res/xml/private_space_settings.xml b/res/xml/private_space_settings.xml
index a3dfbf22906..0ed9c93fb84 100644
--- a/res/xml/private_space_settings.xml
+++ b/res/xml/private_space_settings.xml
@@ -23,9 +23,9 @@
settings:searchable="false">
+ settings:lottie_rawRes="@drawable/private_space_illustration"/>
= MAX_SELECTABLE_PROVIDERS) {
+ if (hasProviderLimitBeenReached()) {
return false;
} else {
mEnabledPackageNames.add(packageName);
@@ -623,6 +623,19 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
return mIconResizer.createIconThumbnail(providerIcon);
}
+ private boolean hasProviderLimitBeenReached() {
+ return hasProviderLimitBeenReached(mEnabledPackageNames.size());
+ }
+
+ @VisibleForTesting
+ public static boolean hasProviderLimitBeenReached(int enabledAdditionalProviderCount) {
+ // If the number of package names has reached the maximum limit then
+ // we should stop any new packages from being added. We will also
+ // reserve one place for the primary provider so if the max limit is
+ // five providers this will be four additional plus the primary.
+ return (enabledAdditionalProviderCount + 1) >= MAX_SELECTABLE_PROVIDERS;
+ }
+
private CombiPreference addProviderPreference(
@NonNull Context prefContext,
@NonNull CharSequence title,
@@ -648,19 +661,18 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
pref.setPreferenceListener(
new CombiPreference.OnCombiPreferenceClickListener() {
@Override
- public void onCheckChanged(CombiPreference p, boolean isChecked) {
+ public boolean onCheckChanged(CombiPreference p, boolean isChecked) {
if (isChecked) {
- if (mEnabledPackageNames.size() >= MAX_SELECTABLE_PROVIDERS) {
+ if (hasProviderLimitBeenReached()) {
// Show the error if too many enabled.
- pref.setChecked(false);
final DialogFragment fragment = newErrorDialogFragment();
if (fragment == null || mFragmentManager == null) {
- return;
+ return false;
}
fragment.show(mFragmentManager, ErrorDialogFragment.TAG);
- return;
+ return false;
}
togglePackageNameEnabled(packageName);
@@ -672,6 +684,8 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
} else {
togglePackageNameDisabled(packageName);
}
+
+ return true;
}
@Override
@@ -989,8 +1003,13 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
@Override
public void onClick(View buttonView) {
// Forward the event.
- if (mSwitch != null) {
- mOnClickListener.onCheckChanged(CombiPreference.this, mSwitch.isChecked());
+ if (mSwitch != null && mOnClickListener != null) {
+ if (!mOnClickListener.onCheckChanged(CombiPreference.this, mSwitch.isChecked())) {
+ // The update was not successful since there were too
+ // many enabled providers to manually reset any state.
+ mChecked = false;
+ mSwitch.setChecked(false);
+ }
}
}
}
@@ -1004,7 +1023,7 @@ public class CredentialManagerPreferenceController extends BasePreferenceControl
public interface OnCombiPreferenceClickListener {
/** Called when the check is updated */
- void onCheckChanged(CombiPreference p, boolean isChecked);
+ boolean onCheckChanged(CombiPreference p, boolean isChecked);
/** Called when the left side is clicked. */
void onLeftSideClicked();
diff --git a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
index 49dd7cde221..032402fb157 100644
--- a/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
+++ b/src/com/android/settings/applications/credentials/DefaultCombinedPreferenceController.java
@@ -114,7 +114,7 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon
@Nullable CharSequence packageName,
@Nullable CharSequence settingsActivity) {
if (appName == null) {
- preference.setTitle(R.string.app_list_preference_none);
+ preference.setTitle(R.string.credman_app_list_preference_none);
} else {
preference.setTitle(appName);
}
@@ -144,7 +144,7 @@ public class DefaultCombinedPreferenceController extends DefaultAppPreferenceCon
// Hide the open button if there is no defined settings activity.
primaryPref.setOpenButtonVisible(!TextUtils.isEmpty(settingsActivity));
- primaryPref.setButtonsVisible(appName != null);
+ primaryPref.setButtonsCompactMode(appName != null);
}
}
diff --git a/src/com/android/settings/applications/credentials/PrimaryProviderPreference.java b/src/com/android/settings/applications/credentials/PrimaryProviderPreference.java
index b8e2529dee7..84459e057ab 100644
--- a/src/com/android/settings/applications/credentials/PrimaryProviderPreference.java
+++ b/src/com/android/settings/applications/credentials/PrimaryProviderPreference.java
@@ -46,7 +46,7 @@ public class PrimaryProviderPreference extends GearPreference {
private @Nullable View mButtonFrameView = null;
private @Nullable View mGearView = null;
private @Nullable Delegate mDelegate = null;
- private boolean mButtonsVisible = false;
+ private boolean mButtonsCompactMode = false;
private boolean mOpenButtonVisible = false;
/** Called to send messages back to the parent controller. */
@@ -141,26 +141,7 @@ public class PrimaryProviderPreference extends GearPreference {
});
mButtonFrameView = holder.findViewById(R.id.credman_button_frame);
- mButtonFrameView.setVisibility(mButtonsVisible ? View.VISIBLE : View.GONE);
-
- // There is a special case where if the provider == none then we should
- // hide the buttons and when the preference is tapped we can open the
- // provider selection dialog.
- setOnPreferenceClickListener(
- new Preference.OnPreferenceClickListener() {
- public boolean onPreferenceClick(@NonNull Preference preference) {
- return handlePreferenceClickNewSettingsUi();
- }
- });
- }
-
- private boolean handlePreferenceClickNewSettingsUi() {
- if (mDelegate != null && !mButtonsVisible) {
- mDelegate.onChangeButtonClicked();
- return true;
- }
-
- return false;
+ updateButtonFramePadding();
}
public void setOpenButtonVisible(boolean isVisible) {
@@ -172,12 +153,27 @@ public class PrimaryProviderPreference extends GearPreference {
mOpenButtonVisible = isVisible;
}
- public void setButtonsVisible(boolean isVisible) {
- if (mButtonFrameView != null) {
- setVisibility(mButtonFrameView, isVisible);
+ private void updateButtonFramePadding() {
+ if (mButtonFrameView == null) {
+ return;
}
- mButtonsVisible = isVisible;
+ int paddingLeft = mButtonsCompactMode ?
+ getContext().getResources().getDimensionPixelSize(
+ R.dimen.credman_primary_provider_pref_left_padding) :
+ getContext().getResources().getDimensionPixelSize(
+ R.dimen.credman_primary_provider_pref_left_padding_compact);
+
+ mButtonFrameView.setPadding(
+ paddingLeft,
+ mButtonFrameView.getPaddingTop(),
+ mButtonFrameView.getPaddingRight(),
+ mButtonFrameView.getPaddingBottom());
+ }
+
+ public void setButtonsCompactMode(boolean isCompactMode) {
+ mButtonsCompactMode = isCompactMode;
+ updateButtonFramePadding();
}
public void setDelegate(@NonNull Delegate delegate) {
diff --git a/src/com/android/settings/display/DisplayFeatureProvider.java b/src/com/android/settings/display/DisplayFeatureProvider.java
new file mode 100644
index 00000000000..a7c8dbb71a1
--- /dev/null
+++ b/src/com/android/settings/display/DisplayFeatureProvider.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2024 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.display;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.TogglePreferenceController;
+
+/** Feature provider for display settings */
+public interface DisplayFeatureProvider {
+
+ /** Create toggle preference */
+ @Nullable
+ TogglePreferenceController createAdditionalPreference(@NonNull Context context);
+
+ /** Update toggle preference */
+ void updatePreference(@Nullable TogglePreferenceController togglePreferenceController);
+
+ /** Add toggle preference to PreferenceScreen */
+ void addToScreen(@Nullable TogglePreferenceController togglePreferenceController,
+ @NonNull PreferenceScreen screen);
+}
diff --git a/src/com/android/settings/display/DisplayFeatureProviderImpl.java b/src/com/android/settings/display/DisplayFeatureProviderImpl.java
new file mode 100644
index 00000000000..c9ec791a922
--- /dev/null
+++ b/src/com/android/settings/display/DisplayFeatureProviderImpl.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2024 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.display;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.preference.PreferenceScreen;
+
+import com.android.settings.core.TogglePreferenceController;
+
+public class DisplayFeatureProviderImpl implements DisplayFeatureProvider {
+
+ @Override
+ @Nullable
+ public TogglePreferenceController createAdditionalPreference(@NonNull Context context) {
+ return null;
+ }
+
+ @Override
+ public void updatePreference(@Nullable TogglePreferenceController togglePreferenceController) {
+
+ }
+
+ @Override
+ public void addToScreen(@Nullable TogglePreferenceController togglePreferenceController,
+ @NonNull PreferenceScreen screen) {
+
+ }
+}
diff --git a/src/com/android/settings/display/ScreenTimeoutSettings.java b/src/com/android/settings/display/ScreenTimeoutSettings.java
index 1c99d5f70a8..2d229a3cfe7 100644
--- a/src/com/android/settings/display/ScreenTimeoutSettings.java
+++ b/src/com/android/settings/display/ScreenTimeoutSettings.java
@@ -34,9 +34,11 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.util.Log;
+import androidx.annotation.Nullable;
import androidx.preference.PreferenceScreen;
import com.android.settings.R;
+import com.android.settings.core.TogglePreferenceController;
import com.android.settings.flags.Flags;
import com.android.settings.overlay.FeatureFactory;
import com.android.settings.search.BaseSearchIndexProvider;
@@ -106,6 +108,9 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment
@VisibleForTesting
AdaptiveSleepBatterySaverPreferenceController mAdaptiveSleepBatterySaverPreferenceController;
+ @Nullable
+ TogglePreferenceController mAdditionalTogglePreferenceController;
+
public ScreenTimeoutSettings() {
super();
mMetricsFeatureProvider = FeatureFactory.getFeatureFactory().getMetricsFeatureProvider();
@@ -133,6 +138,8 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment
com.android.settingslib.widget.preference.footer.R.layout.preference_footer);
mPrivacyManager = SensorPrivacyManager.getInstance(context);
mPrivacyChangedListener = (sensor, enabled) -> mAdaptiveSleepController.updatePreference();
+ mAdditionalTogglePreferenceController = FeatureFactory.getFeatureFactory()
+ .getDisplayFeatureProvider().createAdditionalPreference(context);
}
@Override
@@ -164,6 +171,8 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment
mReceiver, new IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED));
mPrivacyManager.addSensorPrivacyListener(CAMERA, mPrivacyChangedListener);
mIsUserAuthenticated = false;
+ FeatureFactory.getFeatureFactory().getDisplayFeatureProvider().updatePreference(
+ mAdditionalTogglePreferenceController);
}
@Override
@@ -210,6 +219,9 @@ public class ScreenTimeoutSettings extends RadioButtonPickerFragment
mPrivacyPreference.setLayoutResource(
com.android.settingslib.widget.preference.footer.R.layout.preference_footer);
+ FeatureFactory.getFeatureFactory().getDisplayFeatureProvider()
+ .addToScreen(mAdditionalTogglePreferenceController, screen);
+
if (isScreenAttentionAvailable(getContext())) {
mAdaptiveSleepPermissionController.addToScreen(screen);
mAdaptiveSleepCameraStatePreferenceController.addToScreen(screen);
diff --git a/src/com/android/settings/overlay/FeatureFactory.kt b/src/com/android/settings/overlay/FeatureFactory.kt
index 8a68122361b..37507a82274 100644
--- a/src/com/android/settings/overlay/FeatureFactory.kt
+++ b/src/com/android/settings/overlay/FeatureFactory.kt
@@ -29,6 +29,7 @@ import com.android.settings.connecteddevice.stylus.StylusFeatureProvider
import com.android.settings.dashboard.DashboardFeatureProvider
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider
import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProvider
+import com.android.settings.display.DisplayFeatureProvider
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider
import com.android.settings.fuelgauge.BatterySettingsFeatureProvider
import com.android.settings.fuelgauge.BatteryStatusFeatureProvider
@@ -176,6 +177,11 @@ abstract class FeatureFactory {
*/
abstract val privateSpaceLoginFeatureProvider: PrivateSpaceLoginFeatureProvider
+ /**
+ * Gets implementation for Display feature.
+ */
+ abstract val displayFeatureProvider: DisplayFeatureProvider
+
companion object {
private var _factory: FeatureFactory? = null
diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.kt b/src/com/android/settings/overlay/FeatureFactoryImpl.kt
index 28dbb23b245..e0313b7b7f1 100644
--- a/src/com/android/settings/overlay/FeatureFactoryImpl.kt
+++ b/src/com/android/settings/overlay/FeatureFactoryImpl.kt
@@ -45,6 +45,8 @@ import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider
import com.android.settings.dashboard.suggestions.SuggestionFeatureProviderImpl
import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProvider
import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProviderImpl
+import com.android.settings.display.DisplayFeatureProvider
+import com.android.settings.display.DisplayFeatureProviderImpl
import com.android.settings.enterprise.EnterprisePrivacyFeatureProviderImpl
import com.android.settings.fuelgauge.BatterySettingsFeatureProviderImpl
import com.android.settings.fuelgauge.BatteryStatusFeatureProviderImpl
@@ -190,4 +192,7 @@ open class FeatureFactoryImpl : FeatureFactory() {
override val privateSpaceLoginFeatureProvider: PrivateSpaceLoginFeatureProvider by lazy {
PrivateSpaceLoginFeatureProviderImpl()
}
+ override val displayFeatureProvider: DisplayFeatureProvider by lazy {
+ DisplayFeatureProviderImpl()
+ }
}
diff --git a/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java b/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java
index 9e905f215cc..13c0681a06a 100644
--- a/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java
+++ b/src/com/android/settings/privatespace/AutoAdvanceSetupFragment.java
@@ -59,11 +59,11 @@ public class AutoAdvanceSetupFragment extends InstrumentedFragment {
private static final List> HEADER_IMAGE_PAIRS =
ImmutableList.of(
new Pair(R.string.private_space_notifications_hidden_title,
- R.drawable.privatespace_setup_flow_placeholder),
+ R.drawable.private_space_setup_notification_illustration),
new Pair(R.string.private_space_share_photos_title,
- R.drawable.privatespace_setup_flow_placeholder),
+ R.drawable.private_space_setup_sharing_illustration),
new Pair(R.string.private_space_apps_installed_title,
- R.drawable.privatespace_setup_flow_placeholder));
+ R.drawable.private_space_setup_preinstalled_illustration));
private Runnable mUpdateScreenResources =
new Runnable() {
@@ -116,7 +116,7 @@ public class AutoAdvanceSetupFragment extends InstrumentedFragment {
}
mRootView =
(GlifLayout)
- inflater.inflate(R.layout.privatespace_advancing_screen, container, false);
+ inflater.inflate(R.layout.private_space_advancing_screen, container, false);
mRootView.getHeaderTextView().setMaxLines(HEADER_TEXT_MAX_LINES);
updateHeaderAndImage();
mHandler = new Handler(Looper.getMainLooper());
@@ -157,7 +157,7 @@ public class AutoAdvanceSetupFragment extends InstrumentedFragment {
private void updateHeaderAndImage() {
mRootView.setHeaderText(HEADER_IMAGE_PAIRS.get(mScreenTitleIndex).first);
- ((ImageView) mRootView.findViewById(R.id.placeholder_image))
+ ((ImageView) mRootView.findViewById(R.id.setup_advance_image))
.setImageResource(HEADER_IMAGE_PAIRS.get(mScreenTitleIndex).second);
startFadeInAnimation();
}
@@ -166,7 +166,7 @@ public class AutoAdvanceSetupFragment extends InstrumentedFragment {
ValueAnimator textView = ObjectAnimator.ofFloat(
mRootView.getHeaderTextView(), View.ALPHA, 0f, 1f);
ValueAnimator imageView = ObjectAnimator.ofFloat(
- mRootView.findViewById(R.id.placeholder_image), View.ALPHA, 0, 1f);
+ mRootView.findViewById(R.id.setup_advance_image), View.ALPHA, 0, 1f);
AnimatorSet fadeIn = new AnimatorSet();
fadeIn.playTogether(textView, imageView);
fadeIn.setDuration(ANIMATION_DURATION_MILLIS).start();
@@ -177,7 +177,7 @@ public class AutoAdvanceSetupFragment extends InstrumentedFragment {
ValueAnimator textView = ObjectAnimator.ofFloat(
mRootView.getHeaderTextView(), View.ALPHA, 1f, 0f);
ValueAnimator imageView = ObjectAnimator.ofFloat(
- mRootView.findViewById(R.id.placeholder_image), View.ALPHA, 1f, 0f);
+ mRootView.findViewById(R.id.setup_advance_image), View.ALPHA, 1f, 0f);
fadeOut.playTogether(textView, imageView);
fadeOut.setDuration(ANIMATION_DURATION_MILLIS).start();
fadeOut.addListener(new AnimatorListenerAdapter() {
diff --git a/src/com/android/settings/privatespace/PrivateSpaceEducation.java b/src/com/android/settings/privatespace/PrivateSpaceEducation.java
index e54982b344c..7b06f5b9ded 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceEducation.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceEducation.java
@@ -48,7 +48,7 @@ public class PrivateSpaceEducation extends InstrumentedFragment {
}
GlifLayout rootView =
(GlifLayout)
- inflater.inflate(R.layout.privatespace_education_screen, container, false);
+ inflater.inflate(R.layout.private_space_education_screen, container, false);
final FooterBarMixin mixin = rootView.getMixin(FooterBarMixin.class);
mixin.setPrimaryButton(
new FooterButton.Builder(getContext())
diff --git a/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java b/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java
index 9e2e5cce03e..56add6d807e 100644
--- a/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java
+++ b/src/com/android/settings/privatespace/PrivateSpaceSetLockFragment.java
@@ -56,7 +56,7 @@ public class PrivateSpaceSetLockFragment extends InstrumentedFragment {
}
GlifLayout rootView =
(GlifLayout)
- inflater.inflate(R.layout.privatespace_setlock_screen, container, false);
+ inflater.inflate(R.layout.private_space_setlock_screen, container, false);
final FooterBarMixin mixin = rootView.getMixin(FooterBarMixin.class);
mixin.setPrimaryButton(
new FooterButton.Builder(getContext())
diff --git a/src/com/android/settings/privatespace/SetupSuccessFragment.java b/src/com/android/settings/privatespace/SetupSuccessFragment.java
index b1e0edcc3f7..13de1fc94fc 100644
--- a/src/com/android/settings/privatespace/SetupSuccessFragment.java
+++ b/src/com/android/settings/privatespace/SetupSuccessFragment.java
@@ -52,7 +52,7 @@ public class SetupSuccessFragment extends InstrumentedFragment {
}
GlifLayout rootView =
(GlifLayout)
- inflater.inflate(R.layout.privatespace_setup_success, container, false);
+ inflater.inflate(R.layout.private_space_setup_success, container, false);
final FooterBarMixin mixin = rootView.getMixin(FooterBarMixin.class);
mixin.setPrimaryButton(
new FooterButton.Builder(getContext())
diff --git a/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java b/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java
index 05855e4f348..546320c2aac 100644
--- a/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java
+++ b/src/com/android/settings/webview/WebViewUpdateServiceWrapper.java
@@ -20,12 +20,12 @@ import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
-import android.os.RemoteException;
import android.util.Log;
import android.webkit.IWebViewUpdateService;
import android.webkit.UserPackage;
import android.webkit.WebViewFactory;
import android.webkit.WebViewProviderInfo;
+import android.webkit.WebViewUpdateManager;
import android.widget.Toast;
import androidx.annotation.Nullable;
@@ -44,8 +44,12 @@ public class WebViewUpdateServiceWrapper {
*/
public PackageInfo getCurrentWebViewPackage() {
try {
- return WebViewFactory.getUpdateService().getCurrentWebViewPackage();
- } catch (RemoteException e) {
+ if (android.webkit.Flags.updateServiceIpcWrapper()) {
+ return WebViewUpdateManager.getInstance().getCurrentWebViewPackage();
+ } else {
+ return WebViewFactory.getUpdateService().getCurrentWebViewPackage();
+ }
+ } catch (Exception e) {
Log.e(TAG, e.toString());
}
return null;
@@ -59,8 +63,13 @@ public class WebViewUpdateServiceWrapper {
public List getValidWebViewApplicationInfos(Context context) {
WebViewProviderInfo[] providers = null;
try {
- providers = WebViewFactory.getUpdateService().getValidWebViewPackages();
- } catch (RemoteException e) {
+ if (android.webkit.Flags.updateServiceIpcWrapper()) {
+ providers = context.getSystemService(WebViewUpdateManager.class)
+ .getValidWebViewPackages();
+ } else {
+ providers = WebViewFactory.getUpdateService().getValidWebViewPackages();
+ }
+ } catch (Exception e) {
}
List pkgs = new ArrayList<>();
for (WebViewProviderInfo provider : providers) {
@@ -80,10 +89,15 @@ public class WebViewUpdateServiceWrapper {
*/
public boolean setWebViewProvider(String packageName) {
try {
- return packageName.equals(
- WebViewFactory.getUpdateService().changeProviderAndSetting(packageName));
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException when trying to change provider to " + packageName, e);
+ if (android.webkit.Flags.updateServiceIpcWrapper()) {
+ return packageName.equals(
+ WebViewUpdateManager.getInstance().changeProviderAndSetting(packageName));
+ } else {
+ return packageName.equals(
+ WebViewFactory.getUpdateService().changeProviderAndSetting(packageName));
+ }
+ } catch (Exception e) {
+ Log.e(TAG, "Exception when trying to change provider to " + packageName, e);
}
return false;
}
@@ -112,18 +126,23 @@ public class WebViewUpdateServiceWrapper {
*/
@Nullable
public String getDefaultWebViewPackageName() {
+ WebViewProviderInfo provider = null;
try {
- IWebViewUpdateService service = WebViewFactory.getUpdateService();
- if (service != null) {
- WebViewProviderInfo provider = service.getDefaultWebViewPackage();
- if (provider != null) {
- return provider.packageName;
+ if (android.webkit.Flags.updateServiceIpcWrapper()) {
+ WebViewUpdateManager manager = WebViewUpdateManager.getInstance();
+ if (manager != null) {
+ provider = manager.getDefaultWebViewPackage();
+ }
+ } else {
+ IWebViewUpdateService service = WebViewFactory.getUpdateService();
+ if (service != null) {
+ provider = service.getDefaultWebViewPackage();
}
}
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException when trying to fetch default WebView package Name", e);
+ } catch (Exception e) {
+ Log.e(TAG, "Exception when trying to fetch default WebView package Name", e);
}
- return null;
+ return provider != null ? provider.packageName : null;
}
static final int PACKAGE_FLAGS = PackageManager.MATCH_ANY_USER;
diff --git a/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
index 5a5008c26bf..a11b226db28 100644
--- a/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
@@ -33,6 +33,7 @@ import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProvider;
import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProviderImpl;
+import com.android.settings.display.DisplayFeatureProvider;
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
import com.android.settings.fuelgauge.BatterySettingsFeatureProvider;
import com.android.settings.fuelgauge.BatteryStatusFeatureProvider;
@@ -101,6 +102,7 @@ public class FakeFeatureFactory extends FeatureFactory {
public OnboardingFeatureProvider mOnboardingFeatureProvider;
public FastPairFeatureProvider mFastPairFeatureProvider;
public PrivateSpaceLoginFeatureProvider mPrivateSpaceLoginFeatureProvider;
+ public DisplayFeatureProvider mDisplayFeatureProvider;
/**
* Call this in {@code @Before} method of the test class to use fake factory.
@@ -149,6 +151,7 @@ public class FakeFeatureFactory extends FeatureFactory {
mOnboardingFeatureProvider = mock(OnboardingFeatureProvider.class);
mFastPairFeatureProvider = mock(FastPairFeatureProvider.class);
mPrivateSpaceLoginFeatureProvider = mock(PrivateSpaceLoginFeatureProvider.class);
+ mDisplayFeatureProvider = mock(DisplayFeatureProvider.class);
}
@Override
@@ -331,5 +334,10 @@ public class FakeFeatureFactory extends FeatureFactory {
public PrivateSpaceLoginFeatureProvider getPrivateSpaceLoginFeatureProvider() {
return mPrivateSpaceLoginFeatureProvider;
}
+
+ @Override
+ public DisplayFeatureProvider getDisplayFeatureProvider() {
+ return mDisplayFeatureProvider;
+ }
}
diff --git a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
index 9b098a7e5ca..4048c24754d 100644
--- a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
+++ b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
@@ -30,6 +30,7 @@ import com.android.settings.connecteddevice.stylus.StylusFeatureProvider
import com.android.settings.dashboard.DashboardFeatureProvider
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider
import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProvider
+import com.android.settings.display.DisplayFeatureProvider
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider
import com.android.settings.fuelgauge.BatterySettingsFeatureProvider
import com.android.settings.fuelgauge.BatteryStatusFeatureProvider
@@ -146,4 +147,6 @@ class FakeFeatureFactory : FeatureFactory() {
get() = TODO("Not yet implemented")
override val privateSpaceLoginFeatureProvider: PrivateSpaceLoginFeatureProvider
get() = TODO("Not yet implemented")
+ override val displayFeatureProvider: DisplayFeatureProvider
+ get() = TODO("Not yet implemented")
}
diff --git a/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java b/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java
index b5aeac75ff7..0a04a739b53 100644
--- a/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/applications/credentials/CredentialManagerPreferenceControllerTest.java
@@ -217,33 +217,33 @@ public class CredentialManagerPreferenceControllerTest {
assertThat(controller.isHiddenDueToNoProviderSet()).isFalse();
assertThat(controller.getAvailabilityStatus()).isEqualTo(AVAILABLE);
- // Ensure that we stay under 5 providers.
+ // Ensure that we stay under 5 providers (one is reserved for primary).
assertThat(controller.togglePackageNameEnabled("com.android.provider1")).isTrue();
assertThat(controller.togglePackageNameEnabled("com.android.provider2")).isTrue();
assertThat(controller.togglePackageNameEnabled("com.android.provider3")).isTrue();
assertThat(controller.togglePackageNameEnabled("com.android.provider4")).isTrue();
- assertThat(controller.togglePackageNameEnabled("com.android.provider5")).isTrue();
+ assertThat(controller.togglePackageNameEnabled("com.android.provider5")).isFalse();
assertThat(controller.togglePackageNameEnabled("com.android.provider6")).isFalse();
// Check that they are all actually registered.
Set enabledProviders = controller.getEnabledProviders();
- assertThat(enabledProviders.size()).isEqualTo(5);
+ assertThat(enabledProviders.size()).isEqualTo(4);
assertThat(enabledProviders.contains("com.android.provider1")).isTrue();
assertThat(enabledProviders.contains("com.android.provider2")).isTrue();
assertThat(enabledProviders.contains("com.android.provider3")).isTrue();
assertThat(enabledProviders.contains("com.android.provider4")).isTrue();
- assertThat(enabledProviders.contains("com.android.provider5")).isTrue();
+ assertThat(enabledProviders.contains("com.android.provider5")).isFalse();
assertThat(enabledProviders.contains("com.android.provider6")).isFalse();
// Check that the settings string has the right component names.
List enabledServices = controller.getEnabledSettings();
- assertThat(enabledServices.size()).isEqualTo(6);
+ assertThat(enabledServices.size()).isEqualTo(5);
assertThat(enabledServices.contains("com.android.provider1/ClassA")).isTrue();
assertThat(enabledServices.contains("com.android.provider1/ClassB")).isTrue();
assertThat(enabledServices.contains("com.android.provider2/ClassA")).isTrue();
assertThat(enabledServices.contains("com.android.provider3/ClassA")).isTrue();
assertThat(enabledServices.contains("com.android.provider4/ClassA")).isTrue();
- assertThat(enabledServices.contains("com.android.provider5/ClassA")).isTrue();
+ assertThat(enabledServices.contains("com.android.provider5/ClassA")).isFalse();
assertThat(enabledServices.contains("com.android.provider6/ClassA")).isFalse();
// Toggle the provider disabled.
@@ -251,22 +251,22 @@ public class CredentialManagerPreferenceControllerTest {
// Check that the provider was removed from the list of providers.
Set currentlyEnabledProviders = controller.getEnabledProviders();
- assertThat(currentlyEnabledProviders.size()).isEqualTo(4);
+ assertThat(currentlyEnabledProviders.size()).isEqualTo(3);
assertThat(currentlyEnabledProviders.contains("com.android.provider1")).isTrue();
assertThat(currentlyEnabledProviders.contains("com.android.provider2")).isFalse();
assertThat(currentlyEnabledProviders.contains("com.android.provider3")).isTrue();
assertThat(currentlyEnabledProviders.contains("com.android.provider4")).isTrue();
- assertThat(currentlyEnabledProviders.contains("com.android.provider5")).isTrue();
+ assertThat(currentlyEnabledProviders.contains("com.android.provider5")).isFalse();
assertThat(currentlyEnabledProviders.contains("com.android.provider6")).isFalse();
// Check that the provider was removed from the list of services stored in the setting.
List currentlyEnabledServices = controller.getEnabledSettings();
- assertThat(currentlyEnabledServices.size()).isEqualTo(5);
+ assertThat(currentlyEnabledServices.size()).isEqualTo(4);
assertThat(currentlyEnabledServices.contains("com.android.provider1/ClassA")).isTrue();
assertThat(currentlyEnabledServices.contains("com.android.provider1/ClassB")).isTrue();
assertThat(currentlyEnabledServices.contains("com.android.provider3/ClassA")).isTrue();
assertThat(currentlyEnabledServices.contains("com.android.provider4/ClassA")).isTrue();
- assertThat(currentlyEnabledServices.contains("com.android.provider5/ClassA")).isTrue();
+ assertThat(currentlyEnabledServices.contains("com.android.provider5/ClassA")).isFalse();
assertThat(currentlyEnabledServices.contains("com.android.provider6/ClassA")).isFalse();
}
@@ -528,6 +528,17 @@ public class CredentialManagerPreferenceControllerTest {
assertThat(thumbnail.getIntrinsicWidth()).isEqualTo(getIconSize());
}
+ @Test
+ public void testProviderLimitReached() {
+ // The limit is 5 with one slot reserved for primary.
+ assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(0)).isFalse();
+ assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(1)).isFalse();
+ assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(2)).isFalse();
+ assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(3)).isFalse();
+ assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(4)).isTrue();
+ assertThat(CredentialManagerPreferenceController.hasProviderLimitBeenReached(5)).isTrue();
+ }
+
private int getIconSize() {
final Resources resources = mContext.getResources();
return (int) resources.getDimension(android.R.dimen.app_icon_size);
diff --git a/tests/unit/src/com/android/settings/applications/credentials/PrimaryProviderPreferenceTest.java b/tests/unit/src/com/android/settings/applications/credentials/PrimaryProviderPreferenceTest.java
index 51a1fc41e30..9ea16bba1f0 100644
--- a/tests/unit/src/com/android/settings/applications/credentials/PrimaryProviderPreferenceTest.java
+++ b/tests/unit/src/com/android/settings/applications/credentials/PrimaryProviderPreferenceTest.java
@@ -114,50 +114,21 @@ public class PrimaryProviderPreferenceTest {
}
@Test
- public void ensureButtonsClicksCallDelegate_newDesign_buttonsHidden() {
+ public void ensureButtonsClicksCallDelegate_newDesign_buttonsCompactMode() {
if (!PrimaryProviderPreference.shouldUseNewSettingsUi()) {
return;
}
PrimaryProviderPreference ppp = createTestPreferenceWithNewLayout();
+ int initialPaddingLeft = ppp.getButtonFrameView().getPaddingLeft();
- // Test that the buttons are visible.
- assertThat(ppp.getButtonFrameView()).isNotNull();
- assertThat(ppp.getButtonFrameView().getVisibility()).isEqualTo(View.GONE);
- assertThat(mReceivedChangeButtonClicked).isFalse();
+ // If we show the buttons the left padding should be updated.
+ ppp.setButtonsCompactMode(true);
+ assertThat(ppp.getButtonFrameView().getPaddingLeft()).isNotEqualTo(initialPaddingLeft);
- // If we show the buttons the visiblility should be updated.
- ppp.setButtonsVisible(true);
- assertThat(ppp.getButtonFrameView().getVisibility()).isEqualTo(View.VISIBLE);
-
- // If we hide the buttons the visibility should be updated.
- ppp.setButtonsVisible(false);
- assertThat(ppp.getButtonFrameView().getVisibility()).isEqualTo(View.GONE);
- }
-
- @Test
- public void ensureButtonsClicksCallDelegate_oldDesign() {
- if (PrimaryProviderPreference.shouldUseNewSettingsUi()) {
- return;
- }
-
- PrimaryProviderPreference ppp = createTestPreference("preference_widget_gear");
-
- // Test that clicking the preference results in the delegate being
- // called.
- assertThat(mReceivedOpenButtonClicked).isFalse();
- ppp.getOnPreferenceClickListener().onPreferenceClick(ppp);
- assertThat(mReceivedOpenButtonClicked).isTrue();
-
- // Test that the gear button is present and visible.
- assertThat(ppp.getGearView()).isNotNull();
- assertThat(ppp.getGearView().getVisibility()).isEqualTo(View.VISIBLE);
-
- // Test that clicking the gear button results in the delegate being
- // called.
- assertThat(mReceivedChangeButtonClicked).isFalse();
- ppp.getGearView().performClick();
- assertThat(mReceivedChangeButtonClicked).isTrue();
+ // If we hide the buttons the left padding should be updated.
+ ppp.setButtonsCompactMode(false);
+ assertThat(ppp.getButtonFrameView().getPaddingLeft()).isEqualTo(initialPaddingLeft);
}
private PrimaryProviderPreference createTestPreferenceWithNewLayout() {
diff --git a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
index 6c4c5b4eae7..9e7948c7da8 100644
--- a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -33,6 +33,7 @@ import com.android.settings.dashboard.DashboardFeatureProvider;
import com.android.settings.dashboard.suggestions.SuggestionFeatureProvider;
import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProvider;
import com.android.settings.deviceinfo.hardwareinfo.HardwareInfoFeatureProviderImpl;
+import com.android.settings.display.DisplayFeatureProvider;
import com.android.settings.enterprise.EnterprisePrivacyFeatureProvider;
import com.android.settings.fuelgauge.BatterySettingsFeatureProvider;
import com.android.settings.fuelgauge.BatteryStatusFeatureProvider;
@@ -100,6 +101,7 @@ public class FakeFeatureFactory extends FeatureFactory {
public OnboardingFeatureProvider mOnboardingFeatureProvider;
public FastPairFeatureProvider mFastPairFeatureProvider;
public PrivateSpaceLoginFeatureProvider mPrivateSpaceLoginFeatureProvider;
+ public DisplayFeatureProvider mDisplayFeatureProvider;
/** Call this in {@code @Before} method of the test class to use fake factory. */
public static FakeFeatureFactory setupForTest() {
@@ -150,6 +152,7 @@ public class FakeFeatureFactory extends FeatureFactory {
mOnboardingFeatureProvider = mock(OnboardingFeatureProvider.class);
mFastPairFeatureProvider = mock(FastPairFeatureProvider.class);
mPrivateSpaceLoginFeatureProvider = mock(PrivateSpaceLoginFeatureProvider.class);
+ mDisplayFeatureProvider = mock(DisplayFeatureProvider.class);
}
@Override
@@ -332,4 +335,9 @@ public class FakeFeatureFactory extends FeatureFactory {
public PrivateSpaceLoginFeatureProvider getPrivateSpaceLoginFeatureProvider() {
return mPrivateSpaceLoginFeatureProvider;
}
+
+ @Override
+ public DisplayFeatureProvider getDisplayFeatureProvider() {
+ return mDisplayFeatureProvider;
+ }
}