Loading res/layout/dialog_autoclick_delay_before_click.xml +1 −1 Original line number Diff line number Diff line Loading @@ -101,6 +101,7 @@ android:id="@+id/sliderContainer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" app:constraint_referenced_ids="accessibility_autoclick_custom_value, accessibility_autoclick_custom_value_decrease, accessibility_autoclick_custom_slider, Loading @@ -110,7 +111,6 @@ android:id="@+id/accessibility_autoclick_custom_value" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="value" android:textColor="?android:attr/textColorPrimary" app:layout_constrainedHeight="true" app:layout_constrainedWidth="true" Loading src/com/android/settings/accessibility/AutoclickDelayDialogFragment.java +60 −7 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.settings.accessibility; import static android.view.accessibility.AccessibilityManager.AUTOCLICK_DELAY_WITH_INDICATOR_DEFAULT; import static com.android.settings.accessibility.AutoclickUtils.AUTOCLICK_DELAY_STEP; import android.app.Dialog; import android.app.settings.SettingsEnums; import android.os.Bundle; Loading @@ -28,10 +30,13 @@ import android.view.View; import android.view.accessibility.AccessibilityManager; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.SeekBar; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.constraintlayout.widget.Group; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; Loading Loading @@ -70,6 +75,11 @@ public class AutoclickDelayDialogFragment extends InstrumentedDialogFragment { getRadioButtonLabels(dialogView); RadioGroup radioGroup = dialogView.findViewById( R.id.autoclick_delay_before_click_value_group); SeekBar customProgressBar = dialogView.findViewById( R.id.accessibility_autoclick_custom_slider); TextView customValueTextView = dialogView.findViewById( R.id.accessibility_autoclick_custom_value); Group sliderContainer = dialogView.findViewById(R.id.sliderContainer); AlertDialog alertDialog = new AlertDialog.Builder(getContext()) .setView(dialogView) Loading @@ -82,46 +92,89 @@ public class AutoclickDelayDialogFragment extends InstrumentedDialogFragment { if (RADIO_BUTTON_ID_TO_DELAY_TIME .containsKey(checkedRadioButtonId)) { delay = RADIO_BUTTON_ID_TO_DELAY_TIME.get(checkedRadioButtonId); } else { delay = seekBarProgressToDelay(customProgressBar.getProgress()); } // TODO(b/390460859): Add custom seekbar for other delay time values. updateAutoclickDelay(delay); }) .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss()) .create(); radioGroup.setOnCheckedChangeListener((buttonView, checkedId) -> { customValueTextView.setText(delayTimeToString( seekBarProgressToDelay(customProgressBar.getProgress()))); sliderContainer.setVisibility( isCustomButtonChecked(checkedId) ? View.VISIBLE : View.GONE); }); customProgressBar.setOnSeekBarChangeListener( new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged( @NonNull SeekBar seekBar, int progress, boolean fromUser) { CharSequence threshold = delayTimeToString(seekBarProgressToDelay(progress)); customValueTextView.setText(threshold); } @Override public void onStartTrackingTouch(@NonNull SeekBar seekBar) { } @Override public void onStopTrackingTouch(@NonNull SeekBar seekBar) { } }); if (savedInstanceState == null) { initStateBasedOnDelay(radioGroup); initStateBasedOnDelay(radioGroup, customValueTextView, customProgressBar); } return alertDialog; } private void initStateBasedOnDelay(@NonNull RadioGroup radioGroup) { // TODO(b/390460859): Add custom seekbar for other delay time values. private void initStateBasedOnDelay(@NonNull RadioGroup radioGroup, @NonNull TextView customValueTextView, @NonNull SeekBar customProgressBar) { final int autoclickDelay = Settings.Secure.getInt(getContext().getContentResolver(), Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY, AccessibilityManager.AUTOCLICK_DELAY_WITH_INDICATOR_DEFAULT); customValueTextView.setText(delayTimeToString(autoclickDelay)); customProgressBar.setProgress(autoclickDelay / AUTOCLICK_DELAY_STEP); Integer radioButtonId = RADIO_BUTTON_ID_TO_DELAY_TIME.inverse().get(autoclickDelay); if (radioButtonId != null) { radioGroup.check(radioButtonId); } else { radioGroup.check(R.id.accessibility_autoclick_dialog_custom); } } private boolean isCustomButtonChecked(int checkedId) { return checkedId == R.id.accessibility_autoclick_dialog_custom; } private void getRadioButtonLabels(@NonNull View dialogView) { for (Integer radioButtonId : RADIO_BUTTON_ID_TO_DELAY_TIME.keySet()) { RadioButton radioButton = dialogView.findViewById(radioButtonId); if (radioButton != null) { radioButton.setText(AutoclickUtils.getAutoclickDelaySummary( getContext(), R.string.accessibility_autoclick_delay_unit_second, radioButton.setText(delayTimeToString( RADIO_BUTTON_ID_TO_DELAY_TIME.get(radioButtonId))); } } } /** Converts seek bar preference progress value to autoclick delay associated with it. */ private int seekBarProgressToDelay(int progress) { return progress * AUTOCLICK_DELAY_STEP; } private CharSequence delayTimeToString(int delayMillis) { return AutoclickUtils.getAutoclickDelaySummary(getContext(), R.string.accessibility_autoclick_delay_unit_second, delayMillis); } /** Updates autoclick delay time. */ public void updateAutoclickDelay(int delay) { private void updateAutoclickDelay(int delay) { Settings.Secure.putInt( getContext().getContentResolver(), Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY, Loading tests/robotests/src/com/android/settings/accessibility/AutoclickDelayDialogFragmentTest.java +47 −0 Original line number Diff line number Diff line Loading @@ -18,13 +18,18 @@ package com.android.settings.accessibility; import static android.view.accessibility.AccessibilityManager.AUTOCLICK_DELAY_WITH_INDICATOR_DEFAULT; import static com.android.settings.accessibility.AutoclickUtils.AUTOCLICK_DELAY_STEP; import static com.google.common.truth.Truth.assertThat; import android.os.Bundle; import android.provider.Settings; import android.view.View; import android.widget.RadioGroup; import android.widget.SeekBar; import androidx.appcompat.app.AlertDialog; import androidx.constraintlayout.widget.Group; import androidx.fragment.app.testing.FragmentScenario; import androidx.lifecycle.Lifecycle; import androidx.test.core.app.ApplicationProvider; Loading @@ -40,6 +45,7 @@ import org.robolectric.shadows.ShadowLooper; @RunWith(RobolectricTestRunner.class) public class AutoclickDelayDialogFragmentTest { private static final int TEST_SEEK_BAR_PROGRESS = 5; private AutoclickDelayDialogFragment mFragment; private AlertDialog mDialog; private FragmentScenario<AutoclickDelayDialogFragment> mFragmentScenario; Loading Loading @@ -96,4 +102,45 @@ public class AutoclickDelayDialogFragmentTest { assertThat(autoclickDelay).isEqualTo(800); } @Test public void performClickOnNonCustomRadioButton_sliderGroupIsGone() { assertThat(mDialog.isShowing()).isTrue(); Group sliderContainer = mDialog.findViewById(R.id.sliderContainer); assertThat(sliderContainer.getVisibility()).isEqualTo(View.GONE); RadioGroup radioGroup = mDialog.findViewById( R.id.autoclick_delay_before_click_value_group); radioGroup.check(R.id.accessibility_autoclick_dialog_custom); assertThat(sliderContainer.getVisibility()).isEqualTo(View.VISIBLE); radioGroup.check(R.id.accessibility_autoclick_dialog_800ms); assertThat(sliderContainer.getVisibility()).isEqualTo(View.GONE); } @Test public void performUpdateOnSeekBar_updatesAutoclickDelay() { assertThat(mDialog.isShowing()).isTrue(); RadioGroup radioGroup = mDialog.findViewById( R.id.autoclick_delay_before_click_value_group); radioGroup.check(R.id.accessibility_autoclick_dialog_custom); SeekBar customProgressBar = mDialog.findViewById( R.id.accessibility_autoclick_custom_slider); assertThat(customProgressBar.getVisibility()).isEqualTo(View.VISIBLE); customProgressBar.setProgress(TEST_SEEK_BAR_PROGRESS); ShadowLooper.idleMainLooper(); mDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick(); ShadowLooper.idleMainLooper(); final int autoclickDelay = Settings.Secure.getInt( ApplicationProvider.getApplicationContext().getContentResolver(), Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY, AUTOCLICK_DELAY_WITH_INDICATOR_DEFAULT); assertThat(autoclickDelay).isEqualTo( TEST_SEEK_BAR_PROGRESS * AUTOCLICK_DELAY_STEP); } } Loading
res/layout/dialog_autoclick_delay_before_click.xml +1 −1 Original line number Diff line number Diff line Loading @@ -101,6 +101,7 @@ android:id="@+id/sliderContainer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" app:constraint_referenced_ids="accessibility_autoclick_custom_value, accessibility_autoclick_custom_value_decrease, accessibility_autoclick_custom_slider, Loading @@ -110,7 +111,6 @@ android:id="@+id/accessibility_autoclick_custom_value" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="value" android:textColor="?android:attr/textColorPrimary" app:layout_constrainedHeight="true" app:layout_constrainedWidth="true" Loading
src/com/android/settings/accessibility/AutoclickDelayDialogFragment.java +60 −7 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.settings.accessibility; import static android.view.accessibility.AccessibilityManager.AUTOCLICK_DELAY_WITH_INDICATOR_DEFAULT; import static com.android.settings.accessibility.AutoclickUtils.AUTOCLICK_DELAY_STEP; import android.app.Dialog; import android.app.settings.SettingsEnums; import android.os.Bundle; Loading @@ -28,10 +30,13 @@ import android.view.View; import android.view.accessibility.AccessibilityManager; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.SeekBar; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.constraintlayout.widget.Group; import com.android.settings.R; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; Loading Loading @@ -70,6 +75,11 @@ public class AutoclickDelayDialogFragment extends InstrumentedDialogFragment { getRadioButtonLabels(dialogView); RadioGroup radioGroup = dialogView.findViewById( R.id.autoclick_delay_before_click_value_group); SeekBar customProgressBar = dialogView.findViewById( R.id.accessibility_autoclick_custom_slider); TextView customValueTextView = dialogView.findViewById( R.id.accessibility_autoclick_custom_value); Group sliderContainer = dialogView.findViewById(R.id.sliderContainer); AlertDialog alertDialog = new AlertDialog.Builder(getContext()) .setView(dialogView) Loading @@ -82,46 +92,89 @@ public class AutoclickDelayDialogFragment extends InstrumentedDialogFragment { if (RADIO_BUTTON_ID_TO_DELAY_TIME .containsKey(checkedRadioButtonId)) { delay = RADIO_BUTTON_ID_TO_DELAY_TIME.get(checkedRadioButtonId); } else { delay = seekBarProgressToDelay(customProgressBar.getProgress()); } // TODO(b/390460859): Add custom seekbar for other delay time values. updateAutoclickDelay(delay); }) .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss()) .create(); radioGroup.setOnCheckedChangeListener((buttonView, checkedId) -> { customValueTextView.setText(delayTimeToString( seekBarProgressToDelay(customProgressBar.getProgress()))); sliderContainer.setVisibility( isCustomButtonChecked(checkedId) ? View.VISIBLE : View.GONE); }); customProgressBar.setOnSeekBarChangeListener( new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged( @NonNull SeekBar seekBar, int progress, boolean fromUser) { CharSequence threshold = delayTimeToString(seekBarProgressToDelay(progress)); customValueTextView.setText(threshold); } @Override public void onStartTrackingTouch(@NonNull SeekBar seekBar) { } @Override public void onStopTrackingTouch(@NonNull SeekBar seekBar) { } }); if (savedInstanceState == null) { initStateBasedOnDelay(radioGroup); initStateBasedOnDelay(radioGroup, customValueTextView, customProgressBar); } return alertDialog; } private void initStateBasedOnDelay(@NonNull RadioGroup radioGroup) { // TODO(b/390460859): Add custom seekbar for other delay time values. private void initStateBasedOnDelay(@NonNull RadioGroup radioGroup, @NonNull TextView customValueTextView, @NonNull SeekBar customProgressBar) { final int autoclickDelay = Settings.Secure.getInt(getContext().getContentResolver(), Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY, AccessibilityManager.AUTOCLICK_DELAY_WITH_INDICATOR_DEFAULT); customValueTextView.setText(delayTimeToString(autoclickDelay)); customProgressBar.setProgress(autoclickDelay / AUTOCLICK_DELAY_STEP); Integer radioButtonId = RADIO_BUTTON_ID_TO_DELAY_TIME.inverse().get(autoclickDelay); if (radioButtonId != null) { radioGroup.check(radioButtonId); } else { radioGroup.check(R.id.accessibility_autoclick_dialog_custom); } } private boolean isCustomButtonChecked(int checkedId) { return checkedId == R.id.accessibility_autoclick_dialog_custom; } private void getRadioButtonLabels(@NonNull View dialogView) { for (Integer radioButtonId : RADIO_BUTTON_ID_TO_DELAY_TIME.keySet()) { RadioButton radioButton = dialogView.findViewById(radioButtonId); if (radioButton != null) { radioButton.setText(AutoclickUtils.getAutoclickDelaySummary( getContext(), R.string.accessibility_autoclick_delay_unit_second, radioButton.setText(delayTimeToString( RADIO_BUTTON_ID_TO_DELAY_TIME.get(radioButtonId))); } } } /** Converts seek bar preference progress value to autoclick delay associated with it. */ private int seekBarProgressToDelay(int progress) { return progress * AUTOCLICK_DELAY_STEP; } private CharSequence delayTimeToString(int delayMillis) { return AutoclickUtils.getAutoclickDelaySummary(getContext(), R.string.accessibility_autoclick_delay_unit_second, delayMillis); } /** Updates autoclick delay time. */ public void updateAutoclickDelay(int delay) { private void updateAutoclickDelay(int delay) { Settings.Secure.putInt( getContext().getContentResolver(), Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY, Loading
tests/robotests/src/com/android/settings/accessibility/AutoclickDelayDialogFragmentTest.java +47 −0 Original line number Diff line number Diff line Loading @@ -18,13 +18,18 @@ package com.android.settings.accessibility; import static android.view.accessibility.AccessibilityManager.AUTOCLICK_DELAY_WITH_INDICATOR_DEFAULT; import static com.android.settings.accessibility.AutoclickUtils.AUTOCLICK_DELAY_STEP; import static com.google.common.truth.Truth.assertThat; import android.os.Bundle; import android.provider.Settings; import android.view.View; import android.widget.RadioGroup; import android.widget.SeekBar; import androidx.appcompat.app.AlertDialog; import androidx.constraintlayout.widget.Group; import androidx.fragment.app.testing.FragmentScenario; import androidx.lifecycle.Lifecycle; import androidx.test.core.app.ApplicationProvider; Loading @@ -40,6 +45,7 @@ import org.robolectric.shadows.ShadowLooper; @RunWith(RobolectricTestRunner.class) public class AutoclickDelayDialogFragmentTest { private static final int TEST_SEEK_BAR_PROGRESS = 5; private AutoclickDelayDialogFragment mFragment; private AlertDialog mDialog; private FragmentScenario<AutoclickDelayDialogFragment> mFragmentScenario; Loading Loading @@ -96,4 +102,45 @@ public class AutoclickDelayDialogFragmentTest { assertThat(autoclickDelay).isEqualTo(800); } @Test public void performClickOnNonCustomRadioButton_sliderGroupIsGone() { assertThat(mDialog.isShowing()).isTrue(); Group sliderContainer = mDialog.findViewById(R.id.sliderContainer); assertThat(sliderContainer.getVisibility()).isEqualTo(View.GONE); RadioGroup radioGroup = mDialog.findViewById( R.id.autoclick_delay_before_click_value_group); radioGroup.check(R.id.accessibility_autoclick_dialog_custom); assertThat(sliderContainer.getVisibility()).isEqualTo(View.VISIBLE); radioGroup.check(R.id.accessibility_autoclick_dialog_800ms); assertThat(sliderContainer.getVisibility()).isEqualTo(View.GONE); } @Test public void performUpdateOnSeekBar_updatesAutoclickDelay() { assertThat(mDialog.isShowing()).isTrue(); RadioGroup radioGroup = mDialog.findViewById( R.id.autoclick_delay_before_click_value_group); radioGroup.check(R.id.accessibility_autoclick_dialog_custom); SeekBar customProgressBar = mDialog.findViewById( R.id.accessibility_autoclick_custom_slider); assertThat(customProgressBar.getVisibility()).isEqualTo(View.VISIBLE); customProgressBar.setProgress(TEST_SEEK_BAR_PROGRESS); ShadowLooper.idleMainLooper(); mDialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick(); ShadowLooper.idleMainLooper(); final int autoclickDelay = Settings.Secure.getInt( ApplicationProvider.getApplicationContext().getContentResolver(), Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY, AUTOCLICK_DELAY_WITH_INDICATOR_DEFAULT); assertThat(autoclickDelay).isEqualTo( TEST_SEEK_BAR_PROGRESS * AUTOCLICK_DELAY_STEP); } }