Skip to content

Commit 2d0ff11

Browse files
committed
Add permanently denied permission handling and sign result notification unification
Signed-off-by: Alex Saveau <[email protected]>
1 parent 1d9c937 commit 2d0ff11

File tree

4 files changed

+71
-58
lines changed

4 files changed

+71
-58
lines changed

app/src/main/java/com/firebase/uidemo/database/ChatActivity.java

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515
package com.firebase.uidemo.database;
1616

17-
import android.content.Context;
1817
import android.os.Bundle;
1918
import android.support.annotation.NonNull;
2019
import android.support.v7.app.AppCompatActivity;
@@ -29,9 +28,8 @@
2928

3029
import com.firebase.ui.database.FirebaseRecyclerAdapter;
3130
import com.firebase.uidemo.R;
32-
import com.google.android.gms.tasks.OnCompleteListener;
31+
import com.firebase.uidemo.util.SignInResultNotifier;
3332
import com.google.android.gms.tasks.OnSuccessListener;
34-
import com.google.android.gms.tasks.Task;
3533
import com.google.firebase.auth.AuthResult;
3634
import com.google.firebase.auth.FirebaseAuth;
3735
import com.google.firebase.auth.FirebaseUser;
@@ -188,24 +186,4 @@ private void updateUI() {
188186
mSendButton.setEnabled(isSignedIn());
189187
mMessageEdit.setEnabled(isSignedIn());
190188
}
191-
192-
/**
193-
* Notifies the user of sign in successes or failures beyond the lifecycle of an activity.
194-
*/
195-
private static class SignInResultNotifier implements OnCompleteListener<AuthResult> {
196-
private Context mContext;
197-
198-
public SignInResultNotifier(Context context) {
199-
mContext = context.getApplicationContext();
200-
}
201-
202-
@Override
203-
public void onComplete(@NonNull Task<AuthResult> task) {
204-
if (task.isSuccessful()) {
205-
Toast.makeText(mContext, R.string.signed_in, Toast.LENGTH_SHORT).show();
206-
} else {
207-
Toast.makeText(mContext, R.string.sign_in_failed, Toast.LENGTH_SHORT).show();
208-
}
209-
}
210-
}
211189
}

app/src/main/java/com/firebase/uidemo/storage/ImageActivity.java

Lines changed: 39 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -16,30 +16,31 @@
1616
import com.bumptech.glide.Glide;
1717
import com.firebase.ui.storage.images.FirebaseImageLoader;
1818
import com.firebase.uidemo.R;
19-
import com.google.android.gms.tasks.OnCompleteListener;
19+
import com.firebase.uidemo.util.SignInResultNotifier;
2020
import com.google.android.gms.tasks.OnFailureListener;
2121
import com.google.android.gms.tasks.OnSuccessListener;
22-
import com.google.android.gms.tasks.Task;
23-
import com.google.firebase.auth.AuthResult;
2422
import com.google.firebase.auth.FirebaseAuth;
2523
import com.google.firebase.storage.FirebaseStorage;
2624
import com.google.firebase.storage.StorageReference;
2725
import com.google.firebase.storage.UploadTask;
2826

27+
import java.util.Collections;
28+
import java.util.List;
2929
import java.util.UUID;
3030

3131
import butterknife.BindView;
3232
import butterknife.ButterKnife;
3333
import butterknife.OnClick;
3434
import pub.devrel.easypermissions.AfterPermissionGranted;
35+
import pub.devrel.easypermissions.AppSettingsDialog;
3536
import pub.devrel.easypermissions.EasyPermissions;
3637

37-
@SuppressWarnings("LogConditional")
38-
public class ImageActivity extends AppCompatActivity {
38+
public class ImageActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks {
3939

4040
private static final String TAG = "ImageDemo";
4141
private static final int RC_CHOOSE_PHOTO = 101;
4242
private static final int RC_IMAGE_PERMS = 102;
43+
private static final String PERMS = Manifest.permission.READ_EXTERNAL_STORAGE;
4344

4445
private StorageReference mImageRef;
4546

@@ -61,21 +62,9 @@ protected void onCreate(Bundle savedInstanceState) {
6162
// By default, Firebase Storage files require authentication to read or write.
6263
// For this sample to function correctly, enable Anonymous Auth in the Firebase console:
6364
// https://console.firebase.google.com/project/_/authentication/providers
64-
FirebaseAuth.getInstance().signInAnonymously()
65-
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
66-
@Override
67-
public void onComplete(@NonNull Task<AuthResult> task) {
68-
Log.d(TAG, "signInAnonymously:" + task.isSuccessful());
69-
if (!task.isSuccessful()) {
70-
Log.w(TAG, "signInAnonymously", task.getException());
71-
Log.w(TAG, getString(R.string.anonymous_auth_failed_msg));
72-
73-
Toast.makeText(ImageActivity.this,
74-
getString(R.string.anonymous_auth_failed_toast),
75-
Toast.LENGTH_SHORT).show();
76-
}
77-
}
78-
});
65+
FirebaseAuth.getInstance()
66+
.signInAnonymously()
67+
.addOnCompleteListener(new SignInResultNotifier(this));
7968
}
8069

8170
@Override
@@ -89,30 +78,26 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) {
8978
} else {
9079
Toast.makeText(this, "No image chosen", Toast.LENGTH_SHORT).show();
9180
}
81+
} else if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE
82+
&& EasyPermissions.hasPermissions(this, PERMS)) {
83+
choosePhoto();
9284
}
9385
}
9486

95-
@Override
96-
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
97-
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
98-
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
99-
}
100-
10187
@OnClick(R.id.button_choose_photo)
10288
@AfterPermissionGranted(RC_IMAGE_PERMS)
10389
protected void choosePhoto() {
104-
String perm = Manifest.permission.READ_EXTERNAL_STORAGE;
105-
if (!EasyPermissions.hasPermissions(this, perm)) {
90+
if (!EasyPermissions.hasPermissions(this, PERMS)) {
10691
EasyPermissions.requestPermissions(this, getString(R.string.rational_image_perm),
107-
RC_IMAGE_PERMS, perm);
92+
RC_IMAGE_PERMS, PERMS);
10893
return;
10994
}
11095

11196
Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
11297
startActivityForResult(i, RC_CHOOSE_PHOTO);
11398
}
11499

115-
protected void uploadPhoto(Uri uri) {
100+
private void uploadPhoto(Uri uri) {
116101
// Reset UI
117102
hideDownloadUI();
118103
Toast.makeText(this, "Uploading...", Toast.LENGTH_SHORT).show();
@@ -124,10 +109,11 @@ protected void uploadPhoto(Uri uri) {
124109
.addOnSuccessListener(this, new OnSuccessListener<UploadTask.TaskSnapshot>() {
125110
@Override
126111
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
112+
//noinspection LogConditional
127113
Log.d(TAG, "uploadPhoto:onSuccess:" +
128114
taskSnapshot.getMetadata().getReference().getPath());
129115
Toast.makeText(ImageActivity.this, "Image uploaded",
130-
Toast.LENGTH_SHORT).show();
116+
Toast.LENGTH_SHORT).show();
131117

132118
showDownloadUI();
133119
}
@@ -137,7 +123,7 @@ public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
137123
public void onFailure(@NonNull Exception e) {
138124
Log.w(TAG, "uploadPhoto:onError", e);
139125
Toast.makeText(ImageActivity.this, "Upload failed",
140-
Toast.LENGTH_SHORT).show();
126+
Toast.LENGTH_SHORT).show();
141127
}
142128
});
143129
}
@@ -165,4 +151,25 @@ private void showDownloadUI() {
165151

166152
mImageView.setVisibility(View.VISIBLE);
167153
}
154+
155+
@Override
156+
public void onRequestPermissionsResult(int requestCode,
157+
String[] permissions,
158+
int[] grantResults) {
159+
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
160+
EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
161+
}
162+
163+
@Override
164+
public void onPermissionsGranted(int requestCode, List<String> perms) {
165+
// See #choosePhoto with @AfterPermissionGranted
166+
}
167+
168+
@Override
169+
public void onPermissionsDenied(int requestCode, List<String> perms) {
170+
if (EasyPermissions.somePermissionPermanentlyDenied(this,
171+
Collections.singletonList(PERMS))) {
172+
new AppSettingsDialog.Builder(this).build().show();
173+
}
174+
}
168175
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.firebase.uidemo.util;
2+
3+
import android.content.Context;
4+
import android.support.annotation.NonNull;
5+
import android.widget.Toast;
6+
7+
import com.firebase.uidemo.R;
8+
import com.google.android.gms.tasks.OnCompleteListener;
9+
import com.google.android.gms.tasks.Task;
10+
import com.google.firebase.auth.AuthResult;
11+
12+
/**
13+
* Notifies the user of sign in successes or failures beyond the lifecycle of an activity.
14+
*/
15+
public class SignInResultNotifier implements OnCompleteListener<AuthResult> {
16+
private Context mContext;
17+
18+
public SignInResultNotifier(Context context) {
19+
mContext = context.getApplicationContext();
20+
}
21+
22+
@Override
23+
public void onComplete(@NonNull Task<AuthResult> task) {
24+
if (task.isSuccessful()) {
25+
Toast.makeText(mContext, R.string.signed_in, Toast.LENGTH_SHORT).show();
26+
} else {
27+
Toast.makeText(mContext, R.string.anonymous_auth_failed_msg, Toast.LENGTH_LONG).show();
28+
}
29+
}
30+
}

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,7 @@
4848
<string name="other_options_header">Other Options:</string>
4949
<string name="enable_smartlock">Enable SmartLock for Passwords</string>
5050
<string name="rational_image_perm">This sample will read an image from local storage to upload to Firebase Storage.</string>
51-
<string name="anonymous_auth_failed_toast">Authentication failed, uploads and downloads will not work.</string>
52-
<string name="anonymous_auth_failed_msg">Anonymous authentication failed. Make sure your device is online and that Anonymous Auth is configured in your Firebase project(https://console.firebase.google.com/project/_/authentication/providers)</string>
51+
<string name="anonymous_auth_failed_msg">Anonymous authentication failed, various components of the demo will not work. Make sure your device is online and that Anonymous Auth is configured in your Firebase project(https://console.firebase.google.com/project/_/authentication/providers)</string>
5352
<string name="extra_google_scopes">Example extra Google scopes</string>
5453
<string name="games">Games</string>
5554
<string name="extra_facebook_scopes">Example extra Facebook scopes</string>
@@ -69,5 +68,4 @@
6968
<!-- strings for database demo activities -->
7069
<string name="start_chatting">No messages. Start chatting at the bottom!</string>
7170
<string name="signed_in">Signed In</string>
72-
<string name="sign_in_failed">Sign In Failed</string>
7371
</resources>

0 commit comments

Comments
 (0)