summaryrefslogtreecommitdiffstats
path: root/src/android/support/wearable/view/WearableDialogHelper.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/android/support/wearable/view/WearableDialogHelper.java')
-rw-r--r--src/android/support/wearable/view/WearableDialogHelper.java217
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;
+ }
+ }
+}