Преглед изворни кода

Moved ColorChooserDialog from sample project to main library, added a Builder interface.

Aidan Follestad пре 9 година
родитељ
комит
0fc35d165f

+ 86 - 20
sample/src/main/java/com/afollestad/materialdialogssample/ColorChooserDialog.java → library/src/main/java/com/afollestad/materialdialogs/ColorChooserDialog.java

@@ -1,4 +1,4 @@
-package com.afollestad.materialdialogssample;
+package com.afollestad.materialdialogs;
 
 import android.app.Activity;
 import android.app.Dialog;
@@ -18,8 +18,9 @@ import android.view.ViewGroup;
 import android.widget.BaseAdapter;
 import android.widget.GridView;
 
-import com.afollestad.materialdialogs.DialogAction;
-import com.afollestad.materialdialogs.MaterialDialog;
+import com.afollestad.materialdialogs.internal.CircleView;
+
+import java.io.Serializable;
 
 /**
  * @author Aidan Follestad (afollestad)
@@ -321,19 +322,29 @@ public class ColorChooserDialog extends DialogFragment implements View.OnClickLi
     }
 
     private int preselectTop() {
-        return getArguments().getInt("top_level_preselect", -1);
+        return getBuilder().mPreselectTopLevel;
     }
 
     private void preselectTop(int value) {
-        getArguments().putInt("top_level_preselect", value);
+        setBuilder(getBuilder().preselect(value, getBuilder().mPreselectTopLevel));
     }
 
     private int preselectSub() {
-        return getArguments().getInt("sub_level_preselect", -1);
+        return getBuilder().mPreselectSubLevel;
     }
 
     private void preselectSub(int value) {
-        getArguments().putInt("sub_level_preselect", value);
+        setBuilder(getBuilder().preselect(getBuilder().mPreselectTopLevel, value));
+    }
+
+    @StringRes
+    private int title() {
+        Builder builder = getBuilder();
+        int title;
+        if (isInSub()) title = builder.mTitleSub;
+        else title = builder.mTitle;
+        if (title == 0) title = builder.mTitle;
+        return title;
     }
 
     @Override
@@ -347,7 +358,7 @@ public class ColorChooserDialog extends DialogFragment implements View.OnClickLi
                 topIndex(index);
                 isInSub(true);
             }
-            invalidateGrid();
+            invalidate();
         }
     }
 
@@ -358,6 +369,8 @@ public class ColorChooserDialog extends DialogFragment implements View.OnClickLi
     @NonNull
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
+        if (getBuilder() == null)
+            throw new IllegalStateException("ColorChooserDialog should be created using its Builder interface.");
         final int preselectTop = preselectTop();
         if (preselectTop != 0) {
             for (int i = 0; i < TOP_LEVEL_COLORS.length; i++) {
@@ -419,18 +432,19 @@ public class ColorChooserDialog extends DialogFragment implements View.OnClickLi
                         super.onNeutral(dialog);
                         dialog.setActionButton(DialogAction.NEUTRAL, null);
                         isInSub(false);
-                        invalidateGrid();
+                        invalidate();
                     }
                 }).build();
-        invalidateGrid();
+        invalidate();
         return dialog;
     }
 
-    private void invalidateGrid() {
+    private void invalidate() {
         if (mGrid.getAdapter() == null) {
             mGrid.setAdapter(new ColorGridAdapter());
             mGrid.setSelector(ResourcesCompat.getDrawable(getResources(), R.drawable.md_transparent, null));
         } else ((BaseAdapter) mGrid.getAdapter()).notifyDataSetChanged();
+        getDialog().setTitle(title());
     }
 
     private class ColorGridAdapter extends BaseAdapter {
@@ -481,14 +495,66 @@ public class ColorChooserDialog extends DialogFragment implements View.OnClickLi
         }
     }
 
-    public static void show(AppCompatActivity context, @StringRes int title,
-                            @ColorInt int toplevelColor, @ColorInt int subLevelColor) {
-        ColorChooserDialog dialog = new ColorChooserDialog();
-        Bundle args = new Bundle();
-        args.putInt("title", title);
-        args.putInt("top_level_preselect", toplevelColor);
-        args.putInt("sub_level_preselect", subLevelColor);
-        dialog.setArguments(args);
-        dialog.show(context.getSupportFragmentManager(), "COLOR_SELECTOR");
+    public static class Builder implements Serializable {
+
+        @NonNull
+        protected final transient AppCompatActivity mContext;
+        @StringRes
+        protected final int mTitle;
+        @StringRes
+        protected int mTitleSub;
+        @ColorInt
+        protected int mPreselectTopLevel;
+        @ColorInt
+        protected int mPreselectSubLevel;
+
+        public <ActivityType extends AppCompatActivity & ColorCallback> Builder(@NonNull ActivityType context, @StringRes int title) {
+            mContext = context;
+            mTitle = title;
+        }
+
+        @NonNull
+        public Builder titleSub(@StringRes int titleSub) {
+            mTitleSub = titleSub;
+            return this;
+        }
+
+        @NonNull
+        public Builder preselect(@ColorInt int topLevelColor, @ColorInt int subLevelColor) {
+            mPreselectTopLevel = topLevelColor;
+            mPreselectSubLevel = subLevelColor;
+            return this;
+        }
+
+        @NonNull
+        public ColorChooserDialog build() {
+            ColorChooserDialog dialog = new ColorChooserDialog();
+            Bundle args = new Bundle();
+            args.putSerializable("builder", this);
+            dialog.setArguments(args);
+            return dialog;
+        }
+
+        @NonNull
+        public ColorChooserDialog show() {
+            ColorChooserDialog dialog = build();
+            dialog.show(mContext);
+            return dialog;
+        }
+    }
+
+    public Builder getBuilder() {
+        if (getArguments() == null || !getArguments().containsKey("builder")) return null;
+        return (Builder) getArguments().getSerializable("builder");
+    }
+
+    public void setBuilder(Builder builder) {
+        getArguments().putSerializable("builder", builder);
+    }
+
+    @NonNull
+    public ColorChooserDialog show(AppCompatActivity context) {
+        show(context.getSupportFragmentManager(), "[MD_COLOR_CHOOSER]");
+        return this;
     }
 }

+ 1 - 1
sample/src/main/java/com/afollestad/materialdialogssample/CircleView.java → library/src/main/java/com/afollestad/materialdialogs/internal/CircleView.java

@@ -1,4 +1,4 @@
-package com.afollestad.materialdialogssample;
+package com.afollestad.materialdialogs.internal;
 
 import android.content.Context;
 import android.content.res.ColorStateList;

+ 5 - 0
library/src/main/res/values/strings.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="back">Back</string>
+    <string name="done">Done</string>
+</resources>

+ 13 - 6
sample/src/main/java/com/afollestad/materialdialogssample/MainActivity.java

@@ -7,6 +7,7 @@ import android.graphics.drawable.ColorDrawable;
 import android.os.Build;
 import android.os.Bundle;
 import android.support.annotation.StringRes;
+import android.support.v4.content.ContextCompat;
 import android.support.v7.app.AppCompatActivity;
 import android.text.Editable;
 import android.text.Html;
@@ -21,11 +22,13 @@ import android.widget.CompoundButton;
 import android.widget.EditText;
 import android.widget.Toast;
 
+import com.afollestad.materialdialogs.ColorChooserDialog;
 import com.afollestad.materialdialogs.DialogAction;
 import com.afollestad.materialdialogs.GravityEnum;
 import com.afollestad.materialdialogs.MaterialDialog;
 import com.afollestad.materialdialogs.Theme;
 import com.afollestad.materialdialogs.ThemeSingleton;
+import com.afollestad.materialdialogs.internal.CircleView;
 import com.afollestad.materialdialogs.internal.MDTintHelper;
 import com.afollestad.materialdialogs.simplelist.MaterialSimpleListAdapter;
 import com.afollestad.materialdialogs.simplelist.MaterialSimpleListItem;
@@ -558,8 +561,7 @@ public class MainActivity extends AppCompatActivity implements
     private void showCustomWebView() {
         int accentColor = ThemeSingleton.get().widgetColor;
         if (accentColor == 0)
-            accentColor = getResources().getColor(R.color.material_teal_500);
-
+            accentColor = ContextCompat.getColor(this, R.color.material_teal_500);
         ChangelogDialog.create(false, accentColor)
                 .show(getSupportFragmentManager(), "changelog");
     }
@@ -568,16 +570,21 @@ public class MainActivity extends AppCompatActivity implements
     private int subLevelColor;
 
     private void showCustomColorChooser() {
-        ColorChooserDialog.show(this, R.string.color_chooser, topLevelColor, subLevelColor);
+        new ColorChooserDialog.Builder(this, R.string.color_palette)
+                .titleSub(R.string.colors)
+                .preselect(topLevelColor, subLevelColor)
+                .show();
     }
 
+    // Receives callback from color chooser dialog
     @Override
     public void onColorSelection(@StringRes int dialogTitle, int topLevelColor, int subLevelColor) {
         this.topLevelColor = topLevelColor;
         this.subLevelColor = subLevelColor;
-        int color = subLevelColor != 0 ? subLevelColor : topLevelColor;
-        //noinspection ConstantConditions
-        getSupportActionBar().setBackgroundDrawable(new ColorDrawable(color));
+        final int color = subLevelColor != 0 ? subLevelColor : topLevelColor;
+
+        if (getSupportActionBar() != null)
+            getSupportActionBar().setBackgroundDrawable(new ColorDrawable(color));
         ThemeSingleton.get().positiveColor = DialogUtils.getActionTextStateList(this, color);
         ThemeSingleton.get().neutralColor = DialogUtils.getActionTextStateList(this, color);
         ThemeSingleton.get().negativeColor = DialogUtils.getActionTextStateList(this, color);

+ 2 - 0
sample/src/main/res/values/strings.xml

@@ -164,5 +164,7 @@
     <string name="input_content_custominvalidation">Do not type hello, or else!</string>
     <string name="clear_selection">Clear</string>
     <string name="back">Back</string>
+    <string name="color_palette">Color Palette</string>
+    <string name="colors">Colors</string>
 
 </resources>