Skip to content

Commit 1526e64

Browse files
author
Rafael Dominiquini
committed
Allow clients to customize Snackbars and Dialogs
1 parent fd262e4 commit 1526e64

File tree

8 files changed

+130
-43
lines changed

8 files changed

+130
-43
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ buildscript {
33
jcenter()
44
}
55
dependencies {
6-
classpath 'com.android.tools.build:gradle:1.3.0'
6+
classpath 'com.android.tools.build:gradle:2.1.2'
77
}
88
}
99

dexter/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn
33

44
android {
55
compileSdkVersion 23
6-
buildToolsVersion "23.0.2"
6+
buildToolsVersion "23.0.3"
77

88
defaultConfig {
99
minSdkVersion 10
@@ -20,8 +20,8 @@ android {
2020

2121
dependencies {
2222
compile fileTree(dir: 'libs', include: ['*.jar'])
23-
compile 'com.android.support:appcompat-v7:23.2.1'
24-
compile 'com.android.support:design:23.2.1'
23+
compile 'com.android.support:appcompat-v7:23.4.0'
24+
compile 'com.android.support:design:23.4.0'
2525
testCompile 'junit:junit:4.12'
2626
testCompile "org.mockito:mockito-core:1.9.5"
2727
}

dexter/src/main/java/com/karumi/dexter/listener/multi/DialogOnAnyDeniedMultiplePermissionsListener.java

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,15 @@
1616

1717
package com.karumi.dexter.listener.multi;
1818

19+
import com.karumi.dexter.MultiplePermissionsReport;
20+
1921
import android.app.AlertDialog;
2022
import android.app.Dialog;
2123
import android.content.Context;
2224
import android.content.DialogInterface;
2325
import android.graphics.drawable.Drawable;
2426
import android.support.annotation.DrawableRes;
2527
import android.support.annotation.StringRes;
26-
import com.karumi.dexter.MultiplePermissionsReport;
2728

2829
/**
2930
* Utility listener that shows a {@link Dialog} with a minimum configuration when the user rejects
@@ -36,14 +37,16 @@ public class DialogOnAnyDeniedMultiplePermissionsListener extends EmptyMultipleP
3637
private final String message;
3738
private final String positiveButtonText;
3839
private final Drawable icon;
40+
private final DialogFactory dialogFactory;
3941

4042
private DialogOnAnyDeniedMultiplePermissionsListener(Context context, String title,
41-
String message, String positiveButtonText, Drawable icon) {
43+
String message, String positiveButtonText, Drawable icon, DialogFactory factory) {
4244
this.context = context;
4345
this.title = title;
4446
this.message = message;
4547
this.positiveButtonText = positiveButtonText;
4648
this.icon = icon;
49+
this.dialogFactory = factory;
4750
}
4851

4952
@Override public void onPermissionsChecked(MultiplePermissionsReport report) {
@@ -55,16 +58,22 @@ private DialogOnAnyDeniedMultiplePermissionsListener(Context context, String tit
5558
}
5659

5760
private void showDialog() {
58-
new AlertDialog.Builder(context)
59-
.setTitle(title)
60-
.setMessage(message)
61-
.setPositiveButton(positiveButtonText, new DialogInterface.OnClickListener() {
62-
@Override public void onClick(DialogInterface dialog, int which) {
63-
dialog.dismiss();
64-
}
65-
})
66-
.setIcon(icon)
67-
.show();
61+
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context)
62+
.setTitle(title)
63+
.setMessage(message)
64+
.setPositiveButton(positiveButtonText, new DialogInterface.OnClickListener() {
65+
@Override
66+
public void onClick(DialogInterface dialog, int which) {
67+
dialog.dismiss();
68+
}
69+
})
70+
.setIcon(icon);
71+
72+
if(dialogFactory != null) {
73+
dialogFactory.showDialog(dialogBuilder);
74+
} else {
75+
dialogBuilder.show();
76+
}
6877
}
6978

7079
/**
@@ -77,6 +86,7 @@ public static class Builder {
7786
private String message;
7887
private String buttonText;
7988
private Drawable icon;
89+
private DialogFactory dialogFactory;
8090

8191
private Builder(Context context) {
8292
this.context = context;
@@ -126,11 +136,21 @@ public Builder withIcon(@DrawableRes int resId) {
126136
return this;
127137
}
128138

139+
public Builder withDialogFactory(DialogFactory factory) {
140+
this.dialogFactory = factory;
141+
return this;
142+
}
143+
129144
public DialogOnAnyDeniedMultiplePermissionsListener build() {
130145
String title = this.title == null ? "" : this.title;
131146
String message = this.message == null ? "" : this.message;
132147
String buttonText = this.buttonText == null ? "" : this.buttonText;
133-
return new DialogOnAnyDeniedMultiplePermissionsListener(context, title, message, buttonText, icon);
148+
return new DialogOnAnyDeniedMultiplePermissionsListener(context, title, message, buttonText, icon, dialogFactory);
134149
}
135150
}
151+
152+
public interface DialogFactory {
153+
154+
void showDialog(AlertDialog.Builder dialogBuilder);
155+
}
136156
}

dexter/src/main/java/com/karumi/dexter/listener/multi/SnackbarOnAnyDeniedMultiplePermissionsListener.java

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package com.karumi.dexter.listener.multi;
1818

19+
import com.karumi.dexter.MultiplePermissionsReport;
20+
1921
import android.content.Context;
2022
import android.content.Intent;
2123
import android.net.Uri;
@@ -24,7 +26,6 @@
2426
import android.support.design.widget.Snackbar;
2527
import android.view.View;
2628
import android.view.ViewGroup;
27-
import com.karumi.dexter.MultiplePermissionsReport;
2829

2930
/**
3031
* Utility listener that shows a {@link Snackbar} with a custom text whenever a permission has been
@@ -37,6 +38,7 @@ public class SnackbarOnAnyDeniedMultiplePermissionsListener extends EmptyMultipl
3738
private final String buttonText;
3839
private final View.OnClickListener onButtonClickListener;
3940
private final Snackbar.Callback snackbarCallback;
41+
private final SnackbarFactory snackbarFactory;
4042

4143
/**
4244
* @param rootView Parent view to show the snackbar
@@ -45,12 +47,13 @@ public class SnackbarOnAnyDeniedMultiplePermissionsListener extends EmptyMultipl
4547
* @param onButtonClickListener Action performed when the user clicks the snackbar button
4648
*/
4749
private SnackbarOnAnyDeniedMultiplePermissionsListener(ViewGroup rootView, String text,
48-
String buttonText, View.OnClickListener onButtonClickListener, Snackbar.Callback snackbarCallback) {
50+
String buttonText, View.OnClickListener onButtonClickListener, Snackbar.Callback snackbarCallback, SnackbarFactory factory) {
4951
this.rootView = rootView;
5052
this.text = text;
5153
this.buttonText = buttonText;
5254
this.onButtonClickListener = onButtonClickListener;
5355
this.snackbarCallback = snackbarCallback;
56+
this.snackbarFactory = factory;
5457
}
5558

5659
@Override public void onPermissionsChecked(MultiplePermissionsReport report) {
@@ -69,7 +72,12 @@ private void showSnackbar() {
6972
if (snackbarCallback != null) {
7073
snackbar.setCallback(snackbarCallback);
7174
}
72-
snackbar.show();
75+
76+
if (snackbarFactory != null) {
77+
snackbarFactory.showSnackbar(snackbar);
78+
} else {
79+
snackbar.show();
80+
}
7381
}
7482

7583
/**
@@ -82,6 +90,7 @@ public static class Builder {
8290
private String buttonText;
8391
private View.OnClickListener onClickListener;
8492
private Snackbar.Callback snackbarCallback;
93+
private SnackbarFactory snackbarFactory;
8594

8695
private Builder(ViewGroup rootView, String text) {
8796
this.rootView = rootView;
@@ -146,12 +155,24 @@ public Builder withCallback(Snackbar.Callback callback) {
146155
return this;
147156
}
148157

158+
/**
159+
* Adds a factor to handle the snackbar.
160+
*/
161+
public Builder withSnackbarFactory(SnackbarFactory factory) {
162+
this.snackbarFactory = factory;
163+
return this;
164+
}
165+
149166
/**
150167
* Builds a new instance of {@link SnackbarOnAnyDeniedMultiplePermissionsListener}
151168
*/
152169
public SnackbarOnAnyDeniedMultiplePermissionsListener build() {
153-
return new SnackbarOnAnyDeniedMultiplePermissionsListener(rootView, text, buttonText, onClickListener,
154-
snackbarCallback);
170+
return new SnackbarOnAnyDeniedMultiplePermissionsListener(rootView, text, buttonText, onClickListener, snackbarCallback, snackbarFactory);
155171
}
156172
}
173+
174+
public interface SnackbarFactory {
175+
176+
void showSnackbar(Snackbar snackbar);
177+
}
157178
}

dexter/src/main/java/com/karumi/dexter/listener/single/DialogOnDeniedPermissionListener.java

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@
1616

1717
package com.karumi.dexter.listener.single;
1818

19+
import com.karumi.dexter.listener.PermissionDeniedResponse;
20+
1921
import android.app.AlertDialog;
2022
import android.content.Context;
2123
import android.content.DialogInterface;
2224
import android.graphics.drawable.Drawable;
2325
import android.support.annotation.DrawableRes;
2426
import android.support.annotation.StringRes;
25-
import com.karumi.dexter.listener.PermissionDeniedResponse;
2627

2728
/**
2829
* Utility listener that shows a {@link android.app.Dialog} with a minimum configuration when the
@@ -35,29 +36,41 @@ public class DialogOnDeniedPermissionListener extends EmptyPermissionListener {
3536
private final String message;
3637
private final String positiveButtonText;
3738
private final Drawable icon;
39+
private final DialogFactory dialogFactory;
3840

3941
private DialogOnDeniedPermissionListener(Context context, String title, String message,
40-
String positiveButtonText, Drawable icon) {
42+
String positiveButtonText, Drawable icon, DialogFactory factory) {
4143
this.context = context;
4244
this.title = title;
4345
this.message = message;
4446
this.positiveButtonText = positiveButtonText;
4547
this.icon = icon;
48+
this.dialogFactory = factory;
4649
}
4750

4851
@Override public void onPermissionDenied(PermissionDeniedResponse response) {
4952
super.onPermissionDenied(response);
5053

51-
new AlertDialog.Builder(context)
52-
.setTitle(title)
53-
.setMessage(message)
54-
.setPositiveButton(positiveButtonText, new DialogInterface.OnClickListener() {
55-
@Override public void onClick(DialogInterface dialog, int which) {
56-
dialog.dismiss();
57-
}
58-
})
59-
.setIcon(icon)
60-
.show();
54+
showDialog();
55+
}
56+
57+
private void showDialog() {
58+
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context)
59+
.setTitle(title)
60+
.setMessage(message)
61+
.setPositiveButton(positiveButtonText, new DialogInterface.OnClickListener() {
62+
@Override
63+
public void onClick(DialogInterface dialog, int which) {
64+
dialog.dismiss();
65+
}
66+
})
67+
.setIcon(icon);
68+
69+
if(dialogFactory != null) {
70+
dialogFactory.showDialog(dialogBuilder);
71+
} else {
72+
dialogBuilder.show();
73+
}
6174
}
6275

6376
/**
@@ -70,6 +83,7 @@ public static class Builder {
7083
private String message;
7184
private String buttonText;
7285
private Drawable icon;
86+
private DialogFactory dialogFactory;
7387

7488
private Builder(Context context) {
7589
this.context = context;
@@ -119,11 +133,21 @@ public Builder withIcon(@DrawableRes int resId) {
119133
return this;
120134
}
121135

136+
public Builder withDialogFactory(DialogFactory factory) {
137+
this.dialogFactory = factory;
138+
return this;
139+
}
140+
122141
public DialogOnDeniedPermissionListener build() {
123142
String title = this.title == null ? "" : this.title;
124143
String message = this.message == null ? "" : this.message;
125144
String buttonText = this.buttonText == null ? "" : this.buttonText;
126-
return new DialogOnDeniedPermissionListener(context, title, message, buttonText, icon);
145+
return new DialogOnDeniedPermissionListener(context, title, message, buttonText, icon, dialogFactory);
127146
}
128147
}
148+
149+
public interface DialogFactory {
150+
151+
void showDialog(AlertDialog.Builder dialogBuilder);
152+
}
129153
}

0 commit comments

Comments
 (0)