Fix the “screen lock option” and password restriction view are
in the wrong position on PIN/Password/Pattern in the landscape mode. 1. Move the description position under the GlifLayout header 2. Move the position "Screen lock options" button under the GlifLayout header Bug: 272676038 Bug: 285271342 Test: manully test with reproducible steps: STEPS TO REPRODUCE: 1. Go through the setup flow 2. Continue steps until “set pin” page 3. The “screen lock option” is in the wrong position Test: make RunSettingsRoboTests ROBOTEST_FILTER="com.android.settings .password.SetupChooseLockPasswordTest" Change-Id: I24464e6b7e93f20abbeb59426919ed7fec5c7cbb
This commit is contained in:
@@ -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"
|
||||||
|
@@ -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>
|
||||||
|
@@ -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"
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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
|
||||||
|
@@ -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 {
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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)
|
||||||
|
@@ -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));
|
||||||
|
@@ -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() {
|
||||||
|
Reference in New Issue
Block a user