浏览代码

File, folder, and color chooser dialogs can use Fragments to receive callbacks

Aidan Follestad 7 年之前
父节点
当前提交
dd5d870463

+ 28 - 18
commons/src/main/java/com/afollestad/materialdialogs/color/ColorChooserDialog.java

@@ -69,6 +69,7 @@ public class ColorChooserDialog extends DialogFragment
 
   public ColorChooserDialog() {}
 
+  @SuppressWarnings("unused")
   @Nullable
   public static ColorChooserDialog findVisible(
       FragmentManager fragmentManager, @ColorChooserTag String tag) {
@@ -112,8 +113,8 @@ public class ColorChooserDialog extends DialogFragment
     super.onAttach(context);
     if (getActivity() instanceof ColorCallback) {
       callback = (ColorCallback) getActivity();
-    } else if (getParentFragment() instanceof ColorCallback) {
-      callback = (ColorCallback) getParentFragment();
+    } else if (getTargetFragment() instanceof ColorCallback) {
+      callback = (ColorCallback) getTargetFragment();
     } else {
       throw new IllegalStateException(
           "ColorChooserDialog needs to be shown from an Activity/Fragment implementing ColorCallback.");
@@ -582,7 +583,7 @@ public class ColorChooserDialog extends DialogFragment
   }
 
   @NonNull
-  public ColorChooserDialog show(FragmentManager fragmentManager) {
+  public ColorChooserDialog show() {
     String tag;
     Builder builder = getBuilder();
     if (builder.colorsTop != null) {
@@ -592,16 +593,20 @@ public class ColorChooserDialog extends DialogFragment
     } else {
       tag = TAG_PRIMARY;
     }
+
+    final FragmentManager fragmentManager =
+        builder.fragment != null
+            ? builder.fragment.getChildFragmentManager()
+            : builder.activity.getSupportFragmentManager();
+    if (builder.fragment != null) {
+      setTargetFragment(builder.fragment, 67);
+    }
+
     dismissIfNecessary(fragmentManager, tag);
     show(fragmentManager, tag);
     return this;
   }
 
-  @NonNull
-  public ColorChooserDialog show(FragmentActivity fragmentActivity) {
-    return show(fragmentActivity.getSupportFragmentManager());
-  }
-
   @Retention(RetentionPolicy.SOURCE)
   @StringDef({TAG_PRIMARY, TAG_ACCENT, TAG_CUSTOM})
   public @interface ColorChooserTag {}
@@ -615,7 +620,9 @@ public class ColorChooserDialog extends DialogFragment
 
   public static class Builder implements Serializable {
 
-    final transient Context context;
+    @Nullable final transient FragmentActivity activity;
+    @Nullable final transient Fragment fragment;
+
     @Nullable String mediumFont;
     @Nullable String regularFont;
     @StringRes final int title;
@@ -637,8 +644,15 @@ public class ColorChooserDialog extends DialogFragment
     boolean allowUserCustomAlpha = true;
     boolean setPreselectionColor = false;
 
-    public Builder(Context context, @StringRes int title) {
-      this.context = context;
+    public <T extends FragmentActivity & ColorCallback> Builder(T activity, @StringRes int title) {
+      this.activity = activity;
+      this.fragment = null;
+      this.title = title;
+    }
+
+    public <T extends Fragment & ColorCallback> Builder(T fragment, @StringRes int title) {
+      this.activity = null;
+      this.fragment = fragment;
       this.title = title;
     }
 
@@ -725,6 +739,7 @@ public class ColorChooserDialog extends DialogFragment
 
     @NonNull
     public Builder customColors(@ArrayRes int topLevel, @Nullable int[][] subLevel) {
+      final Context context = fragment != null ? fragment.getContext() : activity;
       colorsTop = DialogUtils.getColorArray(context, topLevel);
       colorsSub = subLevel;
       return this;
@@ -752,16 +767,11 @@ public class ColorChooserDialog extends DialogFragment
     }
 
     @NonNull
-    public ColorChooserDialog show(FragmentManager fragmentManager) {
+    public ColorChooserDialog show() {
       ColorChooserDialog dialog = build();
-      dialog.show(fragmentManager);
+      dialog.show();
       return dialog;
     }
-
-    @NonNull
-    public ColorChooserDialog show(FragmentActivity fragmentActivity) {
-      return show(fragmentActivity.getSupportFragmentManager());
-    }
   }
 
   private class ColorGridAdapter extends BaseAdapter {

+ 29 - 19
commons/src/main/java/com/afollestad/materialdialogs/folderselector/FileChooserDialog.java

@@ -89,7 +89,7 @@ public class FileChooserDialog extends DialogFragment implements MaterialDialog.
     return null;
   }
 
-  boolean fileIsMimeType(File file, String mimeType, MimeTypeMap mimeTypeMap) {
+  boolean fileIsMimeType(File file, @Nullable String mimeType, MimeTypeMap mimeTypeMap) {
     if (mimeType == null || mimeType.equals("*/*")) {
       return true;
     } else {
@@ -222,26 +222,31 @@ public class FileChooserDialog extends DialogFragment implements MaterialDialog.
     super.onAttach(context);
     if (getActivity() instanceof FileCallback) {
       callback = (FileCallback) getActivity();
-    } else if (getParentFragment() instanceof FileCallback) {
-      callback = (FileCallback) getParentFragment();
+    } else if (getTargetFragment() instanceof FileCallback) {
+      callback = (FileCallback) getTargetFragment();
     } else {
       throw new IllegalStateException(
           "FileChooserDialog needs to be shown from an Activity/Fragment implementing FileCallback.");
     }
   }
 
-  public void show(FragmentManager fragmentManager) {
+  public void show() {
+    final FragmentManager fragmentManager =
+        getBuilder().fragment != null
+            ? getBuilder().fragment.getChildFragmentManager()
+            : getBuilder().activity.getSupportFragmentManager();
+
     final String tag = getBuilder().tag;
     Fragment frag = fragmentManager.findFragmentByTag(tag);
     if (frag != null) {
       ((DialogFragment) frag).dismiss();
       fragmentManager.beginTransaction().remove(frag).commit();
     }
-    show(fragmentManager, tag);
-  }
 
-  public void show(FragmentActivity fragmentActivity) {
-    show(fragmentActivity.getSupportFragmentManager());
+    if (getBuilder().fragment != null) {
+      setTargetFragment(getBuilder().fragment, 65);
+    }
+    show(fragmentManager, tag);
   }
 
   @NonNull
@@ -264,7 +269,9 @@ public class FileChooserDialog extends DialogFragment implements MaterialDialog.
 
   public static class Builder implements Serializable {
 
-    final transient Context context;
+    transient FragmentActivity activity;
+    transient Fragment fragment;
+
     @StringRes int cancelButton;
     String initialPath;
     String mimeType;
@@ -274,14 +281,23 @@ public class FileChooserDialog extends DialogFragment implements MaterialDialog.
     @Nullable String mediumFont;
     @Nullable String regularFont;
 
-    public Builder(Context context) {
-      this.context = context;
+    private Builder() {
       cancelButton = android.R.string.cancel;
       initialPath = Environment.getExternalStorageDirectory().getAbsolutePath();
       mimeType = null;
       goUpLabel = "...";
     }
 
+    public <T extends FragmentActivity & FileCallback> Builder(T activity) {
+      this();
+      this.activity = activity;
+    }
+
+    public <T extends Fragment & FileCallback> Builder(T fragment) {
+      this();
+      this.fragment = fragment;
+    }
+
     @NonNull
     public Builder typeface(@Nullable String medium, @Nullable String regular) {
       this.mediumFont = medium;
@@ -341,20 +357,14 @@ public class FileChooserDialog extends DialogFragment implements MaterialDialog.
     }
 
     @NonNull
-    public FileChooserDialog show(FragmentManager fragmentManager) {
+    public FileChooserDialog show() {
       FileChooserDialog dialog = build();
-      dialog.show(fragmentManager);
+      dialog.show();
       return dialog;
     }
-
-    @NonNull
-    public FileChooserDialog show(FragmentActivity fragmentActivity) {
-      return show(fragmentActivity.getSupportFragmentManager());
-    }
   }
 
   private static class FileSorter implements Comparator<File> {
-
     @Override
     public int compare(File lhs, File rhs) {
       if (lhs.isDirectory() && !rhs.isDirectory()) {

+ 27 - 18
commons/src/main/java/com/afollestad/materialdialogs/folderselector/FolderChooserDialog.java

@@ -73,7 +73,6 @@ public class FolderChooserDialog extends DialogFragment implements MaterialDialo
   }
 
   @SuppressWarnings("ConstantConditions")
-  @NonNull
   @Override
   public Dialog onCreateDialog(Bundle savedInstanceState) {
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
@@ -208,25 +207,30 @@ public class FolderChooserDialog extends DialogFragment implements MaterialDialo
     super.onAttach(context);
     if (getActivity() instanceof FolderCallback) {
       callback = (FolderCallback) getActivity();
-    } else if (getParentFragment() instanceof FolderCallback) {
-      callback = (FolderCallback) getParentFragment();
+    } else if (getTargetFragment() instanceof FolderCallback) {
+      callback = (FolderCallback) getTargetFragment();
     } else {
       throw new IllegalStateException(
           "FolderChooserDialog needs to be shown from an Activity/Fragment implementing FolderCallback.");
     }
   }
 
-  public void show(FragmentActivity fragmentActivity) {
-    show(fragmentActivity.getSupportFragmentManager());
-  }
+  public void show() {
+    final FragmentManager fragmentManager =
+        getBuilder().fragment != null
+            ? getBuilder().fragment.getChildFragmentManager()
+            : getBuilder().activity.getSupportFragmentManager();
 
-  public void show(FragmentManager fragmentManager) {
     final String tag = getBuilder().tag;
     Fragment frag = fragmentManager.findFragmentByTag(tag);
     if (frag != null) {
       ((DialogFragment) frag).dismiss();
       fragmentManager.beginTransaction().remove(frag).commit();
     }
+
+    if (getBuilder().fragment != null) {
+      setTargetFragment(getBuilder().fragment, 63);
+    }
     show(fragmentManager, tag);
   }
 
@@ -245,7 +249,9 @@ public class FolderChooserDialog extends DialogFragment implements MaterialDialo
 
   public static class Builder implements Serializable {
 
-    final transient Context context;
+    transient FragmentActivity activity;
+    transient Fragment fragment;
+
     @StringRes int chooseButton;
     @StringRes int cancelButton;
     String initialPath;
@@ -256,14 +262,23 @@ public class FolderChooserDialog extends DialogFragment implements MaterialDialo
     @Nullable String mediumFont;
     @Nullable String regularFont;
 
-    public Builder(Context context) {
-      this.context = context;
+    private Builder() {
       chooseButton = R.string.md_choose_label;
       cancelButton = android.R.string.cancel;
       goUpLabel = "...";
       initialPath = Environment.getExternalStorageDirectory().getAbsolutePath();
     }
 
+    public <T extends FragmentActivity & FolderCallback> Builder(T activity) {
+      this();
+      this.activity = activity;
+    }
+
+    public <T extends Fragment & FolderCallback> Builder(T fragment) {
+      this();
+      this.fragment = fragment;
+    }
+
     @NonNull
     public Builder typeface(@Nullable String medium, @Nullable String regular) {
       this.mediumFont = medium;
@@ -327,20 +342,14 @@ public class FolderChooserDialog extends DialogFragment implements MaterialDialo
     }
 
     @NonNull
-    public FolderChooserDialog show(FragmentManager fragmentManager) {
+    public FolderChooserDialog show() {
       FolderChooserDialog dialog = build();
-      dialog.show(fragmentManager);
+      dialog.show();
       return dialog;
     }
-
-    @NonNull
-    public FolderChooserDialog show(FragmentActivity fragmentActivity) {
-      return show(fragmentActivity.getSupportFragmentManager());
-    }
   }
 
   private static class FolderSorter implements Comparator<File> {
-
     @Override
     public int compare(File lhs, File rhs) {
       return lhs.getName().compareTo(rhs.getName());

+ 2 - 5
sample/src/main/java/com/afollestad/materialdialogssample/MainActivity.java

@@ -25,7 +25,8 @@ import android.view.View;
 import android.widget.CheckBox;
 import android.widget.EditText;
 import android.widget.Toast;
-
+import butterknife.ButterKnife;
+import butterknife.OnClick;
 import com.afollestad.materialdialogs.DialogAction;
 import com.afollestad.materialdialogs.GravityEnum;
 import com.afollestad.materialdialogs.MaterialDialog;
@@ -40,12 +41,8 @@ import com.afollestad.materialdialogs.internal.ThemeSingleton;
 import com.afollestad.materialdialogs.simplelist.MaterialSimpleListAdapter;
 import com.afollestad.materialdialogs.simplelist.MaterialSimpleListItem;
 import com.afollestad.materialdialogs.util.DialogUtils;
-
 import java.io.File;
 
-import butterknife.ButterKnife;
-import butterknife.OnClick;
-
 /** @author Aidan Follestad (afollestad) */
 public class MainActivity extends AppCompatActivity
     implements FolderChooserDialog.FolderCallback,