Skip to content

Commit 11280c7

Browse files
SUPERCILEXsamtstern
authored andcommitted
Update everything, remove deprecated stuff from updates, make Travis builds less flaky, and update storage sample (#559)
1 parent c91cc64 commit 11280c7

File tree

13 files changed

+102
-86
lines changed

13 files changed

+102
-86
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ android:
1919
- extra-android-m2repository
2020
- extra-google-m2repository
2121
before_script: mv library/google-services.json app/google-services.json
22-
script: ./gradlew clean assembleDebug check
22+
script: ./gradlew clean assembleDebug check -x testReleaseUnitTest # Running release tests fails because Facebook automatically enables app logger.
2323
after_failure:
2424
# tests
2525
- cat app/build/reports/tests/testDebugUnitTest/index.html

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ dependencies {
4242
// The following dependencies are not required to use the Firebase UI library.
4343
// They are used to make some aspects of the demo app implementation simpler for
4444
// demonstrative purposes, and you may find them useful in your own apps; YMMV.
45-
compile 'pub.devrel:easypermissions:0.2.1'
45+
compile 'pub.devrel:easypermissions:0.3.0'
4646
compile 'com.jakewharton:butterknife:8.5.1'
4747
apt 'com.jakewharton:butterknife-compiler:8.5.1'
4848
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'

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>

auth/build.gradle

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,17 @@ android {
1515

1616
buildTypes {
1717
release {
18+
manifestPlaceholders = [enableFbLogging: true]
19+
1820
minifyEnabled false
1921
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
2022
}
23+
24+
debug {
25+
// This is needed for tests to pass. Facebook automatically enables app logging
26+
// which causes a null pointer exception while running tests.
27+
manifestPlaceholders = [enableFbLogging: false]
28+
}
2129
}
2230

2331
testOptions {
@@ -36,7 +44,7 @@ dependencies {
3644
compile "com.google.firebase:firebase-auth:$firebase_version"
3745
compile "com.google.android.gms:play-services-auth:$firebase_version"
3846

39-
compile 'com.facebook.android:facebook-android-sdk:4.18.0'
47+
compile 'com.facebook.android:facebook-android-sdk:4.19.0'
4048
compile("com.twitter.sdk.android:twitter:2.3.0@aar") { transitive = true }
4149

4250
// The following libraries are needed to prevent incompatibilities with the facebook
@@ -45,7 +53,7 @@ dependencies {
4553

4654
testCompile 'junit:junit:4.12'
4755
//noinspection NewerVersionAvailable, GradleDynamicVersion
48-
testCompile 'org.mockito:mockito-core:2.5.+'
56+
testCompile 'org.mockito:mockito-core:2.6.+'
4957
testCompile 'org.robolectric:robolectric:3.2.2'
5058
// See https://github.com/robolectric/robolectric/issues/1932#issuecomment-219796474
5159
testCompile 'org.khronos:opengl-api:gl1.1-android-2.1_r1'

auth/src/main/AndroidManifest.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919
android:name="com.facebook.sdk.ApplicationId"
2020
android:value="@string/facebook_application_id"/>
2121

22+
<meta-data
23+
android:name="com.facebook.sdk.AutoLogAppEventsEnabled"
24+
android:value="${enableFbLogging}"/>
25+
2226
<activity
2327
android:name=".KickoffActivity"
2428
android:label=""

auth/src/main/java/com/firebase/ui/auth/AuthUI.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import android.support.annotation.StyleRes;
2525
import android.support.annotation.VisibleForTesting;
2626

27-
import com.facebook.FacebookSdk;
2827
import com.facebook.login.LoginManager;
2928
import com.firebase.ui.auth.ui.FlowParameters;
3029
import com.firebase.ui.auth.ui.idp.AuthMethodPickerActivity;
@@ -347,9 +346,7 @@ public Void then(@NonNull Task<GoogleApiClient> task) throws Exception {
347346
});
348347

349348
// Facebook sign out
350-
if (FacebookSdk.isInitialized()) {
351-
LoginManager.getInstance().logOut();
352-
}
349+
LoginManager.getInstance().logOut();
353350

354351
// Wait for all tasks to complete
355352
return Tasks.whenAll(disableCredentialsTask, googleSignOutTask);

auth/src/main/java/com/firebase/ui/auth/provider/FacebookProvider.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,16 +71,14 @@ public FacebookProvider(Context context, AuthUI.IdpConfig idpConfig, @StyleRes i
7171
} else {
7272
mScopes = scopes;
7373
}
74-
FacebookSdk.sdkInitialize(appContext);
7574
FacebookSdk.setWebDialogTheme(theme);
7675
}
7776

7877
public static AuthCredential createAuthCredential(IdpResponse response) {
7978
if (!response.getProviderType().equals(FacebookAuthProvider.PROVIDER_ID)) {
8079
return null;
8180
}
82-
return FacebookAuthProvider
83-
.getCredential(response.getIdpToken());
81+
return FacebookAuthProvider.getCredential(response.getIdpToken());
8482
}
8583

8684
@Override

0 commit comments

Comments
 (0)