Merge "Fix the “screen lock option” and password restriction view are in the wrong position on PIN/Password/Pattern in the landscape mode." into udc-qpr-dev am: 5a0d4d1cc3

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/23712165

Change-Id: I8c58292e2b93f0e827d059c44046002d72eb772b
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Jason Chang
2023-07-10 03:41:17 +00:00
committed by Automerger Merge Worker
12 changed files with 112 additions and 39 deletions

View File

@@ -38,15 +38,6 @@
android:paddingRight="0dp" android:paddingRight="0dp"
android:paddingBottom="0dp"> android:paddingBottom="0dp">
<!-- TODO b/249974175 Move into Glif header mixin -->
<Button
android:id="@+id/screen_lock_options"
style="@style/SudGlifButton.Tertiary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/setup_lock_settings_options_button_label"
android:visibility="gone"/>
<com.google.android.setupdesign.view.FillContentLayout <com.google.android.setupdesign.view.FillContentLayout
style="@style/LockPatternContainerStyle" style="@style/LockPatternContainerStyle"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@@ -61,12 +61,6 @@
android:imeOptions="actionNext|flagNoExtractUi|flagForceAscii" android:imeOptions="actionNext|flagNoExtractUi|flagForceAscii"
style="@style/TextAppearance.PasswordEntry"/> style="@style/TextAppearance.PasswordEntry"/>
<androidx.recyclerview.widget.RecyclerView
android:layout_marginTop="8dp"
android:id="@+id/password_requirements_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<CheckBox <CheckBox
android:id="@+id/auto_pin_confirm_enabler" android:id="@+id/auto_pin_confirm_enabler"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
@@ -91,14 +85,6 @@
android:textSize="16sp" android:textSize="16sp"
android:visibility="gone" /> android:visibility="gone" />
<Button
android:id="@+id/screen_lock_options"
style="@style/SudGlifButton.Tertiary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/setup_lock_settings_options_button_label"
android:visibility="gone" />
</LinearLayout> </LinearLayout>
</com.google.android.setupdesign.GlifLayout> </com.google.android.setupdesign.GlifLayout>

View File

@@ -36,14 +36,6 @@
android:paddingLeft="0dp" android:paddingLeft="0dp"
android:paddingRight="0dp"> android:paddingRight="0dp">
<Button
android:id="@+id/screen_lock_options"
style="@style/LockPatternButtonStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/setup_lock_settings_options_button_label"
android:visibility="gone"/>
<com.google.android.setupdesign.view.FillContentLayout <com.google.android.setupdesign.view.FillContentLayout
style="@style/LockPatternContainerStyle" style="@style/LockPatternContainerStyle"
android:layout_width="wrap_content" android:layout_width="wrap_content"

View File

@@ -229,6 +229,15 @@
<!-- Minimum height for setting a lock pattern --> <!-- Minimum height for setting a lock pattern -->
<dimen name="choose_lockscreen_min_height">200dp</dimen> <dimen name="choose_lockscreen_min_height">200dp</dimen>
<!-- Choose lock Password requirement dimensions -->
<dimen name="password_requirement_view_margin_top">16dp</dimen>
<!-- Screen lock option button dimensions -->
<dimen name="screen_lock_options_button_margin_top">32dp</dimen>
<!-- Choose lock Password requirement font size -->
<dimen name="password_requirement_font_size">16sp</dimen>
<!-- Select dialog --> <!-- Select dialog -->
<dimen name="select_dialog_padding_start">20dp</dimen> <dimen name="select_dialog_padding_start">20dp</dimen>
<dimen name="select_dialog_item_margin_start">12dp</dimen> <dimen name="select_dialog_item_margin_start">12dp</dimen>

View File

@@ -40,4 +40,8 @@
<!-- For a layout container to add AppLocaleDetails into --> <!-- For a layout container to add AppLocaleDetails into -->
<item type="id" name="layout_app_locale_details" /> <item type="id" name="layout_app_locale_details" />
<!-- For screen lock options button -->
<item type="id" name="screen_lock_options" />
</resources> </resources>

View File

@@ -947,4 +947,10 @@
<item name="biometricsEnrollProgressHelp">@color/udfps_enroll_progress_help</item> <item name="biometricsEnrollProgressHelp">@color/udfps_enroll_progress_help</item>
<item name="biometricsEnrollProgressHelpWithTalkback">@color/udfps_enroll_progress_help_with_talkback</item> <item name="biometricsEnrollProgressHelpWithTalkback">@color/udfps_enroll_progress_help_with_talkback</item>
</style> </style>
<style name="ScreenLockPasswordHintTextFontStyle">
<item name="android:textColor">?android:attr/textColorPrimary</item>
<item name="android:fontFamily">google-sans-text</item>
</style>
</resources> </resources>

View File

@@ -74,9 +74,11 @@ import android.view.WindowManager;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.ImeAwareEditText; import android.widget.ImeAwareEditText;
import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener; import android.widget.TextView.OnEditorActionListener;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes; import androidx.annotation.StringRes;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
@@ -517,7 +519,9 @@ public class ChooseLockPassword extends SettingsActivity {
|| DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == mPasswordType || DevicePolicyManager.PASSWORD_QUALITY_ALPHANUMERIC == mPasswordType
|| DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == mPasswordType; || DevicePolicyManager.PASSWORD_QUALITY_COMPLEX == mPasswordType;
setupPasswordRequirementsView(view); final LinearLayout headerLayout = view.findViewById(
R.id.sud_layout_header);
setupPasswordRequirementsView(headerLayout);
mPasswordRestrictionView.setLayoutManager(new LinearLayoutManager(getActivity())); mPasswordRestrictionView.setLayoutManager(new LinearLayoutManager(getActivity()));
mPasswordEntry = view.findViewById(R.id.password_entry); mPasswordEntry = view.findViewById(R.id.password_entry);
@@ -626,11 +630,33 @@ public class ChooseLockPassword extends SettingsActivity {
} }
} }
private void setupPasswordRequirementsView(View view) { private void setupPasswordRequirementsView(@Nullable ViewGroup view) {
mPasswordRestrictionView = view.findViewById(R.id.password_requirements_view); if (view == null) {
return;
}
createHintMessageView(view);
mPasswordRestrictionView.setLayoutManager(new LinearLayoutManager(getActivity())); mPasswordRestrictionView.setLayoutManager(new LinearLayoutManager(getActivity()));
mPasswordRequirementAdapter = new PasswordRequirementAdapter(); mPasswordRequirementAdapter = new PasswordRequirementAdapter(getActivity());
mPasswordRestrictionView.setAdapter(mPasswordRequirementAdapter); mPasswordRestrictionView.setAdapter(mPasswordRequirementAdapter);
view.addView(mPasswordRestrictionView);
}
private void createHintMessageView(ViewGroup view) {
if (mPasswordRestrictionView != null) {
return;
}
final TextView sucTitleView = view.findViewById(R.id.suc_layout_title);
final ViewGroup.MarginLayoutParams titleLayoutParams =
(ViewGroup.MarginLayoutParams) sucTitleView.getLayoutParams();
mPasswordRestrictionView = new RecyclerView(getActivity());
final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(titleLayoutParams.leftMargin, getResources().getDimensionPixelSize(
R.dimen.password_requirement_view_margin_top), titleLayoutParams.leftMargin, 0);
mPasswordRestrictionView.setLayoutParams(lp);
} }
@Override @Override

View File

@@ -16,6 +16,7 @@
package com.android.settings.password; package com.android.settings.password;
import android.content.Context;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@@ -31,9 +32,12 @@ import com.android.settings.password.PasswordRequirementAdapter.PasswordRequirem
*/ */
public class PasswordRequirementAdapter extends public class PasswordRequirementAdapter extends
RecyclerView.Adapter<PasswordRequirementViewHolder> { RecyclerView.Adapter<PasswordRequirementViewHolder> {
private String[] mRequirements;
public PasswordRequirementAdapter() { private String[] mRequirements;
private Context mContext;
public PasswordRequirementAdapter(Context context) {
mContext = context;
setHasStableIds(true); setHasStableIds(true);
} }
@@ -61,7 +65,12 @@ public class PasswordRequirementAdapter extends
@Override @Override
public void onBindViewHolder(PasswordRequirementViewHolder holder, int position) { public void onBindViewHolder(PasswordRequirementViewHolder holder, int position) {
final int fontSize = mContext.getResources().getDimensionPixelSize(
R.dimen.password_requirement_font_size);
holder.mDescriptionText.setText(mRequirements[position]); holder.mDescriptionText.setText(mRequirements[position]);
holder.mDescriptionText.setTextAppearance(R.style.ScreenLockPasswordHintTextFontStyle);
holder.mDescriptionText.setTextSize(fontSize / mContext.getResources()
.getDisplayMetrics().scaledDensity);
} }
public static class PasswordRequirementViewHolder extends RecyclerView.ViewHolder { public static class PasswordRequirementViewHolder extends RecyclerView.ViewHolder {

View File

@@ -27,7 +27,13 @@ import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.UserHandle; import android.os.UserHandle;
import android.util.Log; import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.android.settings.R;
import com.android.settings.Utils; import com.android.settings.Utils;
public final class PasswordUtils extends com.android.settingslib.Utils { public final class PasswordUtils extends com.android.settingslib.Utils {
@@ -97,4 +103,25 @@ public final class PasswordUtils extends com.android.settingslib.Utils {
Log.v(TAG, "Could not talk to activity manager.", e); Log.v(TAG, "Could not talk to activity manager.", e);
} }
} }
/** Setup screen lock options button under the Glif Header. */
public static void setupScreenLockOptionsButton(Context context, View view, Button optButton) {
final LinearLayout headerLayout = view.findViewById(
R.id.sud_layout_header);
final TextView sucTitleView = headerLayout.findViewById(R.id.suc_layout_title);
if (headerLayout != null && sucTitleView != null) {
final ViewGroup.MarginLayoutParams layoutTitleParams =
(ViewGroup.MarginLayoutParams) sucTitleView.getLayoutParams();
final ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
lp.leftMargin = layoutTitleParams.leftMargin;
lp.topMargin = (int) context.getResources().getDimensionPixelSize(
R.dimen.screen_lock_options_button_margin_top);
optButton.setPadding(0, 0, 0, 0);
optButton.setLayoutParams(lp);
optButton.setText(context.getString(R.string.setup_lock_settings_options_button_label));
headerLayout.addView(optButton);
}
}
} }

View File

@@ -24,6 +24,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.ContextThemeWrapper;
import android.view.View; import android.view.View;
import android.widget.Button; import android.widget.Button;
@@ -97,7 +98,10 @@ public class SetupChooseLockPassword extends ChooseLockPassword {
} }
if (showOptionsButton && anyOptionsShown) { if (showOptionsButton && anyOptionsShown) {
mOptionsButton = view.findViewById(R.id.screen_lock_options); mOptionsButton = new Button(new ContextThemeWrapper(getActivity(),
R.style.SudGlifButton_Tertiary));
mOptionsButton.setId(R.id.screen_lock_options);
PasswordUtils.setupScreenLockOptionsButton(getActivity(), view, mOptionsButton);
mOptionsButton.setVisibility(View.VISIBLE); mOptionsButton.setVisibility(View.VISIBLE);
mOptionsButton.setOnClickListener((btn) -> mOptionsButton.setOnClickListener((btn) ->
ChooseLockTypeDialogFragment.newInstance(mUserId) ChooseLockTypeDialogFragment.newInstance(mUserId)

View File

@@ -23,6 +23,7 @@ import static com.android.internal.widget.LockPatternUtils.CREDENTIAL_TYPE_PATTE
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@@ -83,7 +84,10 @@ public class SetupChooseLockPattern extends ChooseLockPattern {
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = super.onCreateView(inflater, container, savedInstanceState); View view = super.onCreateView(inflater, container, savedInstanceState);
if (!getResources().getBoolean(R.bool.config_lock_pattern_minimal_ui)) { if (!getResources().getBoolean(R.bool.config_lock_pattern_minimal_ui)) {
mOptionsButton = view.findViewById(R.id.screen_lock_options); mOptionsButton = new Button(new ContextThemeWrapper(getActivity(),
R.style.SudGlifButton_Tertiary));
mOptionsButton.setId(R.id.screen_lock_options);
PasswordUtils.setupScreenLockOptionsButton(getActivity(), view, mOptionsButton);
mOptionsButton.setOnClickListener((btn) -> mOptionsButton.setOnClickListener((btn) ->
ChooseLockTypeDialogFragment.newInstance(mUserId) ChooseLockTypeDialogFragment.newInstance(mUserId)
.show(getChildFragmentManager(), TAG_SKIP_SCREEN_LOCK_DIALOG)); .show(getChildFragmentManager(), TAG_SKIP_SCREEN_LOCK_DIALOG));

View File

@@ -26,6 +26,7 @@ import android.os.Bundle;
import android.view.View; import android.view.View;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.Button; import android.widget.Button;
import android.widget.LinearLayout;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
@@ -106,6 +107,20 @@ public class SetupChooseLockPasswordTest {
assertThat(ShadowDialog.getLatestDialog()).isNotNull(); assertThat(ShadowDialog.getLatestDialog()).isNotNull();
} }
@Test
public void createActivity_withShowOptionsButtonExtra_shouldShowButtonUnderSudHeader() {
SetupChooseLockPassword activity = createSetupChooseLockPassword();
final LinearLayout headerLayout = activity.findViewById(
R.id.sud_layout_header);
assertThat(headerLayout).isNotNull();
final Button optionsButton = headerLayout.findViewById(R.id.screen_lock_options);
assertThat(optionsButton).isNotNull();
optionsButton.performClick();
assertThat(ShadowDialog.getLatestDialog()).isNotNull();
}
@Test @Test
@Config(shadows = ShadowChooseLockGenericController.class) @Config(shadows = ShadowChooseLockGenericController.class)
public void createActivity_withShowOptionsButtonExtra_buttonNotVisibleIfNoVisibleLockTypes() { public void createActivity_withShowOptionsButtonExtra_buttonNotVisibleIfNoVisibleLockTypes() {