Update the instruction images in Accessibility tutorial dialog.
1. Update the material next style. 2. Support for Lottie image. Bug: 195094388 Test: manual test Change-Id: I57306532b10e91c927bdc1ef5e115f41bc7a939b
This commit is contained in:
@@ -29,12 +29,14 @@ import android.text.Spannable;
|
|||||||
import android.text.SpannableString;
|
import android.text.SpannableString;
|
||||||
import android.text.SpannableStringBuilder;
|
import android.text.SpannableStringBuilder;
|
||||||
import android.text.style.ImageSpan;
|
import android.text.style.ImageSpan;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.Gravity;
|
import android.view.Gravity;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.TextureView;
|
import android.view.TextureView;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
|
import android.widget.FrameLayout;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.TextSwitcher;
|
import android.widget.TextSwitcher;
|
||||||
@@ -42,8 +44,10 @@ import android.widget.TextView;
|
|||||||
|
|
||||||
import androidx.annotation.AnimRes;
|
import androidx.annotation.AnimRes;
|
||||||
import androidx.annotation.ColorInt;
|
import androidx.annotation.ColorInt;
|
||||||
|
import androidx.annotation.DrawableRes;
|
||||||
import androidx.annotation.IntDef;
|
import androidx.annotation.IntDef;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.RawRes;
|
||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
@@ -54,6 +58,9 @@ import androidx.viewpager.widget.ViewPager;
|
|||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
|
||||||
|
import com.airbnb.lottie.LottieAnimationView;
|
||||||
|
import com.airbnb.lottie.LottieDrawable;
|
||||||
|
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -64,6 +71,8 @@ import java.util.List;
|
|||||||
* accessibility services.
|
* accessibility services.
|
||||||
*/
|
*/
|
||||||
public final class AccessibilityGestureNavigationTutorial {
|
public final class AccessibilityGestureNavigationTutorial {
|
||||||
|
private static final String TAG = "AccessibilityGestureNavigationTutorial";
|
||||||
|
|
||||||
/** IntDef enum for dialog type. */
|
/** IntDef enum for dialog type. */
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
@IntDef({
|
@IntDef({
|
||||||
@@ -239,7 +248,7 @@ public final class AccessibilityGestureNavigationTutorial {
|
|||||||
@NonNull
|
@NonNull
|
||||||
@Override
|
@Override
|
||||||
public Object instantiateItem(@NonNull ViewGroup container, int position) {
|
public Object instantiateItem(@NonNull ViewGroup container, int position) {
|
||||||
final View itemView = mTutorialPages.get(position).getImageView();
|
final View itemView = mTutorialPages.get(position).getIllustrationView();
|
||||||
container.addView(itemView);
|
container.addView(itemView);
|
||||||
return itemView;
|
return itemView;
|
||||||
}
|
}
|
||||||
@@ -257,7 +266,7 @@ public final class AccessibilityGestureNavigationTutorial {
|
|||||||
@Override
|
@Override
|
||||||
public void destroyItem(@NonNull ViewGroup container, int position,
|
public void destroyItem(@NonNull ViewGroup container, int position,
|
||||||
@NonNull Object object) {
|
@NonNull Object object) {
|
||||||
final View itemView = mTutorialPages.get(position).getImageView();
|
final View itemView = mTutorialPages.get(position).getIllustrationView();
|
||||||
container.removeView(itemView);
|
container.removeView(itemView);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -270,6 +279,34 @@ public final class AccessibilityGestureNavigationTutorial {
|
|||||||
return imageView;
|
return imageView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static View createIllustrationView(Context context, @DrawableRes int imageRes) {
|
||||||
|
final View illustrationFrame = inflateAndInitIllustrationFrame(context);
|
||||||
|
final LottieAnimationView lottieView = illustrationFrame.findViewById(R.id.image);
|
||||||
|
lottieView.setImageResource(imageRes);
|
||||||
|
|
||||||
|
return illustrationFrame;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static View createIllustrationViewWithImageRawResource(Context context,
|
||||||
|
@RawRes int imageRawRes) {
|
||||||
|
final View illustrationFrame = inflateAndInitIllustrationFrame(context);
|
||||||
|
final LottieAnimationView lottieView = illustrationFrame.findViewById(R.id.image);
|
||||||
|
lottieView.setFailureListener(
|
||||||
|
result -> Log.w(TAG, "Invalid image raw resource id: " + imageRawRes,
|
||||||
|
result));
|
||||||
|
lottieView.setAnimation(imageRawRes);
|
||||||
|
lottieView.setRepeatCount(LottieDrawable.INFINITE);
|
||||||
|
lottieView.playAnimation();
|
||||||
|
|
||||||
|
return illustrationFrame;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static View inflateAndInitIllustrationFrame(Context context) {
|
||||||
|
final LayoutInflater inflater = context.getSystemService(LayoutInflater.class);
|
||||||
|
|
||||||
|
return inflater.inflate(R.layout.accessibility_lottie_animation_view, /* root= */ null);
|
||||||
|
}
|
||||||
|
|
||||||
private static View createShortcutNavigationContentView(Context context, int shortcutTypes) {
|
private static View createShortcutNavigationContentView(Context context, int shortcutTypes) {
|
||||||
final LayoutInflater inflater = context.getSystemService(LayoutInflater.class);
|
final LayoutInflater inflater = context.getSystemService(LayoutInflater.class);
|
||||||
final View contentView = inflater.inflate(
|
final View contentView = inflater.inflate(
|
||||||
@@ -325,7 +362,7 @@ public final class AccessibilityGestureNavigationTutorial {
|
|||||||
|
|
||||||
private static TutorialPage createSoftwareTutorialPage(@NonNull Context context) {
|
private static TutorialPage createSoftwareTutorialPage(@NonNull Context context) {
|
||||||
final CharSequence title = getSoftwareTitle(context);
|
final CharSequence title = getSoftwareTitle(context);
|
||||||
final ImageView image = createSoftwareImage(context);
|
final View image = createSoftwareImage(context);
|
||||||
final CharSequence instruction = getSoftwareInstruction(context);
|
final CharSequence instruction = getSoftwareInstruction(context);
|
||||||
final ImageView indicatorIcon =
|
final ImageView indicatorIcon =
|
||||||
createImageView(context, R.drawable.ic_accessibility_page_indicator);
|
createImageView(context, R.drawable.ic_accessibility_page_indicator);
|
||||||
@@ -337,8 +374,8 @@ public final class AccessibilityGestureNavigationTutorial {
|
|||||||
private static TutorialPage createHardwareTutorialPage(@NonNull Context context) {
|
private static TutorialPage createHardwareTutorialPage(@NonNull Context context) {
|
||||||
final CharSequence title =
|
final CharSequence title =
|
||||||
context.getText(R.string.accessibility_tutorial_dialog_title_volume);
|
context.getText(R.string.accessibility_tutorial_dialog_title_volume);
|
||||||
final ImageView image =
|
final View image =
|
||||||
createImageView(context, R.drawable.accessibility_shortcut_type_hardware);
|
createIllustrationView(context, R.drawable.accessibility_shortcut_type_hardware);
|
||||||
final ImageView indicatorIcon =
|
final ImageView indicatorIcon =
|
||||||
createImageView(context, R.drawable.ic_accessibility_page_indicator);
|
createImageView(context, R.drawable.ic_accessibility_page_indicator);
|
||||||
final CharSequence instruction =
|
final CharSequence instruction =
|
||||||
@@ -351,8 +388,9 @@ public final class AccessibilityGestureNavigationTutorial {
|
|||||||
private static TutorialPage createTripleTapTutorialPage(@NonNull Context context) {
|
private static TutorialPage createTripleTapTutorialPage(@NonNull Context context) {
|
||||||
final CharSequence title =
|
final CharSequence title =
|
||||||
context.getText(R.string.accessibility_tutorial_dialog_title_triple);
|
context.getText(R.string.accessibility_tutorial_dialog_title_triple);
|
||||||
final ImageView image =
|
final View image =
|
||||||
createImageView(context, R.raw.accessibility_shortcut_type_triple_tap);
|
createIllustrationViewWithImageRawResource(context,
|
||||||
|
R.raw.accessibility_shortcut_type_triple_tap);
|
||||||
final CharSequence instruction =
|
final CharSequence instruction =
|
||||||
context.getText(R.string.accessibility_tutorial_dialog_message_triple);
|
context.getText(R.string.accessibility_tutorial_dialog_message_triple);
|
||||||
final ImageView indicatorIcon =
|
final ImageView indicatorIcon =
|
||||||
@@ -381,7 +419,7 @@ public final class AccessibilityGestureNavigationTutorial {
|
|||||||
return tutorialPages;
|
return tutorialPages;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ImageView createSoftwareImage(Context context) {
|
private static View createSoftwareImage(Context context) {
|
||||||
int resId;
|
int resId;
|
||||||
if (AccessibilityUtil.isFloatingMenuEnabled(context)) {
|
if (AccessibilityUtil.isFloatingMenuEnabled(context)) {
|
||||||
resId = R.drawable.accessibility_shortcut_type_software_floating;
|
resId = R.drawable.accessibility_shortcut_type_software_floating;
|
||||||
@@ -392,7 +430,7 @@ public final class AccessibilityGestureNavigationTutorial {
|
|||||||
} else {
|
} else {
|
||||||
resId = R.drawable.accessibility_shortcut_type_software;
|
resId = R.drawable.accessibility_shortcut_type_software;
|
||||||
}
|
}
|
||||||
return createImageView(context, resId);
|
return createIllustrationView(context, resId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static CharSequence getSoftwareTitle(Context context) {
|
private static CharSequence getSoftwareTitle(Context context) {
|
||||||
@@ -444,24 +482,26 @@ public final class AccessibilityGestureNavigationTutorial {
|
|||||||
|
|
||||||
private static class TutorialPage {
|
private static class TutorialPage {
|
||||||
private final CharSequence mTitle;
|
private final CharSequence mTitle;
|
||||||
private final ImageView mImageView;
|
private final View mIllustrationView;
|
||||||
private final ImageView mIndicatorIcon;
|
private final ImageView mIndicatorIcon;
|
||||||
private final CharSequence mInstruction;
|
private final CharSequence mInstruction;
|
||||||
|
|
||||||
TutorialPage(CharSequence title, ImageView imageView, ImageView indicatorIcon,
|
TutorialPage(CharSequence title, View illustrationView, ImageView indicatorIcon,
|
||||||
CharSequence instruction) {
|
CharSequence instruction) {
|
||||||
this.mTitle = title;
|
this.mTitle = title;
|
||||||
this.mImageView = imageView;
|
this.mIllustrationView = illustrationView;
|
||||||
this.mIndicatorIcon = indicatorIcon;
|
this.mIndicatorIcon = indicatorIcon;
|
||||||
this.mInstruction = instruction;
|
this.mInstruction = instruction;
|
||||||
|
|
||||||
|
setupIllustrationChildViewsGravity();
|
||||||
}
|
}
|
||||||
|
|
||||||
public CharSequence getTitle() {
|
public CharSequence getTitle() {
|
||||||
return mTitle;
|
return mTitle;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ImageView getImageView() {
|
public View getIllustrationView() {
|
||||||
return mImageView;
|
return mIllustrationView;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ImageView getIndicatorIcon() {
|
public ImageView getIndicatorIcon() {
|
||||||
@@ -471,6 +511,23 @@ public final class AccessibilityGestureNavigationTutorial {
|
|||||||
public CharSequence getInstruction() {
|
public CharSequence getInstruction() {
|
||||||
return mInstruction;
|
return mInstruction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setupIllustrationChildViewsGravity() {
|
||||||
|
final View backgroundView = mIllustrationView.findViewById(R.id.image_background);
|
||||||
|
initViewGravity(backgroundView);
|
||||||
|
|
||||||
|
final View lottieView = mIllustrationView.findViewById(R.id.image);
|
||||||
|
initViewGravity(lottieView);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initViewGravity(@NonNull View view) {
|
||||||
|
final FrameLayout.LayoutParams layoutParams =
|
||||||
|
new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,
|
||||||
|
FrameLayout.LayoutParams.WRAP_CONTENT);
|
||||||
|
layoutParams.gravity = Gravity.CENTER;
|
||||||
|
|
||||||
|
view.setLayoutParams(layoutParams);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class TutorialPageChangeListener implements ViewPager.OnPageChangeListener {
|
private static class TutorialPageChangeListener implements ViewPager.OnPageChangeListener {
|
||||||
|
Reference in New Issue
Block a user