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; + } }