diff options
Diffstat (limited to 'src/android/support/wearable/view/WearableDialogHelper.java')
-rw-r--r-- | src/android/support/wearable/view/WearableDialogHelper.java | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/src/android/support/wearable/view/WearableDialogHelper.java b/src/android/support/wearable/view/WearableDialogHelper.java new file mode 100644 index 00000000..0bdc1cc9 --- /dev/null +++ b/src/android/support/wearable/view/WearableDialogHelper.java @@ -0,0 +1,217 @@ +/* + * Copyright (C) 2016 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 android.support.wearable.view; + +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.support.annotation.DrawableRes; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.annotation.VisibleForTesting; +import android.util.Log; +import android.widget.Button; + +/** + * Helper to add icons to AlertDialog buttons.AlertDialog buttons. + */ +public class WearableDialogHelper { + private static final String TAG = "WearableDialogHelper"; + + private int mPositiveIconId; + private Drawable mPositiveIcon; + + private int mNeutralIconId; + private Drawable mNeutralIcon; + + private int mNegativeIconId; + private Drawable mNegativeIcon; + + @VisibleForTesting /* package */ Resources mResources; + @VisibleForTesting /* package */ Resources.Theme mTheme; + + /** + * Convenience constructor, equivalent to {@code new WearableDialogHelper(context.getResources(), + * context.getTheme())}. + */ + public WearableDialogHelper(@NonNull Context context) { + this(context.getResources(), context.getTheme()); + } + + /** + * @param resources the Resources used to obtain Drawables from resource IDs. + * @param theme the Theme used to properly obtain Drawables from resource IDs. + */ + public WearableDialogHelper(@NonNull Resources resources, @NonNull Resources.Theme theme) { + mResources = resources; + mTheme = theme; + } + + @Nullable + public Drawable getPositiveIcon() { + return resolveDrawable(mPositiveIcon, mPositiveIconId); + } + + @Nullable + public Drawable getNegativeIcon() { + return resolveDrawable(mNegativeIcon, mNegativeIconId); + } + + @Nullable + public Drawable getNeutralIcon() { + return resolveDrawable(mNeutralIcon, mNeutralIconId); + } + + @NonNull + public WearableDialogHelper setPositiveIcon(@DrawableRes int resId) { + mPositiveIconId = resId; + mPositiveIcon = null; + return this; + } + + @NonNull + public WearableDialogHelper setPositiveIcon(@Nullable Drawable icon) { + mPositiveIcon = icon; + mPositiveIconId = 0; + return this; + } + + @NonNull + public WearableDialogHelper setNegativeIcon(@DrawableRes int resId) { + mNegativeIconId = resId; + mNegativeIcon = null; + return this; + } + + @NonNull + public WearableDialogHelper setNegativeIcon(@Nullable Drawable icon) { + mNegativeIcon = icon; + mNegativeIconId = 0; + return this; + } + + @NonNull + public WearableDialogHelper setNeutralIcon(@DrawableRes int resId) { + mNeutralIconId = resId; + mNeutralIcon = null; + return this; + } + + @NonNull + public WearableDialogHelper setNeutralIcon(@Nullable Drawable icon) { + mNeutralIcon = icon; + mNeutralIconId = 0; + return this; + } + + /** + * Applies the button icons setup in the helper to the buttons in the dialog. + * + * <p>Note that this should be called after {@code AlertDialog.create()}, NOT {@code + * AlertDialog.Builder.create()}. Calling {@code AlertDialog.Builder.show()} would also accomplish + * the same thing. + * + * @param dialog the AlertDialog to style with the helper. + */ + public void apply(@NonNull AlertDialog dialog) { + applyButton(dialog.getButton(DialogInterface.BUTTON_POSITIVE), getPositiveIcon()); + applyButton(dialog.getButton(DialogInterface.BUTTON_NEGATIVE), getNegativeIcon()); + applyButton(dialog.getButton(DialogInterface.BUTTON_NEUTRAL), getNeutralIcon()); + } + + /** Applies the specified drawable to the button. */ + @VisibleForTesting + /* package */ void applyButton(@Nullable Button button, @Nullable Drawable drawable) { + if (button != null) { + button.setCompoundDrawablesRelativeWithIntrinsicBounds(drawable, null, null, null); + button.setAllCaps(false); + } else if (drawable != null) { + Log.w(TAG, "non-null drawable used with missing button, did you call AlertDialog.create()?"); + } + } + + /** Obtain a drawable between a drawable and a resource ID. */ + @VisibleForTesting + /* package */ Drawable resolveDrawable(@Nullable Drawable drawable, @DrawableRes int resId) { + return drawable == null && resId != 0 ? mResources.getDrawable(resId, mTheme) : drawable; + } + + /** Convenience builder to generate an AlertDialog with icons in buttons. */ + public static class DialogBuilder extends AlertDialog.Builder { + private final WearableDialogHelper mHelper; + + public DialogBuilder(Context context) { + super(context); + mHelper = new WearableDialogHelper(context.getResources(), context.getTheme()); + } + + public DialogBuilder(Context context, int themeResId) { + super(context, themeResId); + mHelper = new WearableDialogHelper(context.getResources(), context.getTheme()); + } + + public WearableDialogHelper getHelper() { + return mHelper; + } + + public DialogBuilder setPositiveIcon(@DrawableRes int iconId) { + mHelper.setPositiveIcon(iconId); + return this; + } + + public DialogBuilder setPositiveIcon(@Nullable Drawable icon) { + mHelper.setPositiveIcon(icon); + return this; + } + + public DialogBuilder setNegativeIcon(@DrawableRes int iconId) { + mHelper.setNegativeIcon(iconId); + return this; + } + + public DialogBuilder setNegativeIcon(@Nullable Drawable icon) { + mHelper.setNegativeIcon(icon); + return this; + } + + public DialogBuilder setNeutralIcon(@DrawableRes int iconId) { + mHelper.setNeutralIcon(iconId); + return this; + } + + public DialogBuilder setNeutralIcon(@Nullable Drawable icon) { + mHelper.setNeutralIcon(icon); + return this; + } + + @Override + public AlertDialog create() { + final AlertDialog dialog = super.create(); + dialog.create(); + mHelper.apply(dialog); + return dialog; + } + + @Override + public AlertDialog show() { + final AlertDialog dialog = this.create(); + dialog.show(); + return dialog; + } + } +} |