diff --git a/.gitignore b/.gitignore
index 3fcdd8f47..0195ac149 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,12 @@
.gradle
*.iml
/local.properties
-.idea
+.idea/**
!.idea/codeStyleSettings.xml
.DS_Store
build
google-services.json
+!/library/google-services.json
+
+crashlytics-build.properties
+auth/src/main/res/values/com_crashlytics_export_strings.xml
diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml
index d83a3d080..d10f95651 100644
--- a/.idea/codeStyleSettings.xml
+++ b/.idea/codeStyleSettings.xml
@@ -49,10 +49,24 @@
+
+
+
+
+
+
+
+
+
+
@@ -62,6 +76,7 @@
+
+
@@ -404,8 +420,28 @@
- .*
- ^$
+ .*:layout_width
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_height
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_.*Start.*
+ http://schemas.android.com/apk/res/android
BY_NAME
@@ -415,17 +451,50 @@
- .*:layout_width
+ .*:layout_.*End.*
http://schemas.android.com/apk/res/android
+ BY_NAME
- .*:layout_height
+ .*:layout_.*Left.*
+ http://schemas.android.com/apk/res/android
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:layout_.*Right.*
+ http://schemas.android.com/apk/res/android
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:layout_.*Top.*
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:layout_.*Bottom.*
http://schemas.android.com/apk/res/android
@@ -464,6 +533,66 @@
BY_NAME
+
+
+
+
+ .*:.*Start.*
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:.*End.*
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:.*Left.*
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:.*Right.*
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:.*Top.*
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:.*Bottom.*
+ http://schemas.android.com/apk/res/android
+
+
+
+
@@ -475,6 +604,77 @@
BY_NAME
+
+
+
+
+ .*:layout_constraintStart.*
+ http://schemas.android.com/apk/res-auto
+
+
+
+
+
+
+
+
+ .*:layout_constraintEnd.*
+ http://schemas.android.com/apk/res-auto
+
+
+
+
+
+
+
+
+ .*:layout_constraintLeft.*
+ http://schemas.android.com/apk/res-auto
+
+
+
+
+
+
+
+
+ .*:layout_constraintRight.*
+ http://schemas.android.com/apk/res-auto
+
+
+
+
+
+
+
+
+ .*:layout_constraintTop.*
+ http://schemas.android.com/apk/res-auto
+
+
+
+
+
+
+
+
+ .*:layout_constraintBottom.*
+ http://schemas.android.com/apk/res-auto
+
+
+
+
+
+
+
+
+ .*
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
diff --git a/.travis.yml b/.travis.yml
index c8bc246f1..507ae8109 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -10,15 +10,18 @@ cache:
- $HOME/.gradle/caches/
- $HOME/.gradle/wrapper/
- $HOME/.android/build-cache
+before_install:
+ - mkdir "$ANDROID_HOME/licenses" || true
+ - echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_HOME/licenses/android-sdk-license"
+ - echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_HOME/licenses/android-sdk-preview-license"
android:
components:
+ # https://github.com/travis-ci/travis-ci/issues/6040#issuecomment-219367943
- tools
- - build-tools-25.0.3
- - android-25
- - platform-tools
- - extra-android-m2repository
- - extra-google-m2repository
-before_script: mv library/google-services.json app/google-services.json
+ - tools
+before_script:
+ - mv library/google-services.json app/google-services.json
+ - ${ANDROID_HOME}tools/bin/sdkmanager --channel=3 "tools" "platform-tools" "build-tools;25.0.3" "platforms;android-25" "extras;google;m2repository"
script: ./gradlew clean assembleDebug check
after_failure:
# tests
diff --git a/README.md b/README.md
index c9ed8246f..98a233ff5 100644
--- a/README.md
+++ b/README.md
@@ -39,16 +39,16 @@ libraries.
```groovy
dependencies {
// FirebaseUI Database only
- compile 'com.firebaseui:firebase-ui-database:1.2.0'
+ compile 'com.firebaseui:firebase-ui-database:2.0.1'
// FirebaseUI Auth only
- compile 'com.firebaseui:firebase-ui-auth:1.2.0'
+ compile 'com.firebaseui:firebase-ui-auth:2.0.1'
// FirebaseUI Storage only
- compile 'com.firebaseui:firebase-ui-storage:1.2.0'
+ compile 'com.firebaseui:firebase-ui-storage:2.0.1'
// Single target that includes all FirebaseUI libraries above
- compile 'com.firebaseui:firebase-ui:1.2.0'
+ compile 'com.firebaseui:firebase-ui:2.0.1'
}
```
@@ -63,7 +63,7 @@ After the project is synchronized, we're ready to start using Firebase functiona
If you are using an old version of FirebaseUI and upgrading, please see the appropriate
migration guide:
- * [Upgrade from 1.2.0 to 2.0](./docs/upgrade-to-2.0.md)
+ * [Upgrade from 1.2.0 to 2.0.x](./docs/upgrade-to-2.0.md)
## Dependencies
@@ -91,6 +91,7 @@ For convenience, here are some recent examples:
| FirebaseUI Version | Firebase/Play Services Version |
|--------------------|--------------------------------|
+| 2.0.1 | 11.0.1 |
| 1.2.0 | 10.2.0 |
| 1.1.1 | 10.0.0 or 10.0.1 |
| 1.0.1 | 10.0.0 or 10.0.1 |
diff --git a/app/build.gradle b/app/build.gradle
index 2b22a1a84..5658ad3cb 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -38,13 +38,13 @@ dependencies {
compile "com.google.firebase:firebase-database:$firebaseVersion"
compile "com.google.firebase:firebase-storage:$firebaseVersion"
- compile('com.facebook.android:facebook-android-sdk:4.22.1')
+ compile('com.facebook.android:facebook-android-sdk:4.23.0')
compile("com.twitter.sdk.android:twitter-core:3.0.0@aar") { transitive = true }
// The following dependencies are not required to use the Firebase UI library.
// They are used to make some aspects of the demo app implementation simpler for
// demonstrative purposes, and you may find them useful in your own apps; YMMV.
- compile 'pub.devrel:easypermissions:0.4.0'
+ compile 'pub.devrel:easypermissions:0.4.2'
compile 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ce2b85437..68a391ea9 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -8,7 +8,7 @@
getSelectedProviders() {
selectedProviders.add(new IdpConfig.Builder(AuthUI.TWITTER_PROVIDER).build());
}
+ if (mUseGitHubProvider.isChecked()) {
+ selectedProviders.add(new IdpConfig.Builder(AuthUI.GITHUB_PROVIDER)
+ .setPermissions(getGitHubPermissions())
+ .build());
+ }
+
if (mUseEmailProvider.isChecked()) {
selectedProviders.add(new IdpConfig.Builder(AuthUI.EMAIL_PROVIDER).build());
}
@@ -380,11 +420,33 @@ private boolean isTwitterConfigured() {
return !twitterConfigs.contains(UNCHANGED_CONFIG_VALUE);
}
+ @MainThread
+ private boolean isGitHubConfigured() {
+ List gitHubConfigs = Arrays.asList(
+ getString(R.string.github_client_id),
+ getString(R.string.github_client_secret)
+ );
+
+ return !gitHubConfigs.contains(UNCHANGED_CONFIG_VALUE);
+ }
+
@MainThread
private void showSnackbar(@StringRes int errorMessageRes) {
Snackbar.make(mRootView, errorMessageRes, Snackbar.LENGTH_LONG).show();
}
+ @MainThread
+ private List getGooglePermissions() {
+ List result = new ArrayList<>();
+ if (mGoogleScopeYoutubeData.isChecked()) {
+ result.add("https://www.googleapis.com/auth/youtube.readonly");
+ }
+ if (mGoogleScopeDriveFile.isChecked()) {
+ result.add(Scopes.DRIVE_FILE);
+ }
+ return result;
+ }
+
@MainThread
private List getFacebookPermissions() {
List result = new ArrayList<>();
@@ -398,13 +460,13 @@ private List getFacebookPermissions() {
}
@MainThread
- private List getGooglePermissions() {
+ private List getGitHubPermissions() {
List result = new ArrayList<>();
- if (mGoogleScopeYoutubeData.isChecked()) {
- result.add("https://www.googleapis.com/auth/youtube.readonly");
+ if (mGitHubScopeRepo.isChecked()) {
+ result.add("repo");
}
- if (mGoogleScopeDriveFile.isChecked()) {
- result.add(Scopes.DRIVE_FILE);
+ if (mGitHubScopeGist.isChecked()) {
+ result.add("gist");
}
return result;
}
diff --git a/app/src/main/java/com/firebase/uidemo/auth/LeakCatcher.java b/app/src/main/java/com/firebase/uidemo/auth/FirebaseUIDemo.java
similarity index 69%
rename from app/src/main/java/com/firebase/uidemo/auth/LeakCatcher.java
rename to app/src/main/java/com/firebase/uidemo/auth/FirebaseUIDemo.java
index e0a3f3b06..f9d7bbe1d 100644
--- a/app/src/main/java/com/firebase/uidemo/auth/LeakCatcher.java
+++ b/app/src/main/java/com/firebase/uidemo/auth/FirebaseUIDemo.java
@@ -2,15 +2,20 @@
import android.app.Application;
import android.content.Context;
+import android.support.v7.app.AppCompatDelegate;
import com.squareup.leakcanary.LeakCanary;
import com.squareup.leakcanary.RefWatcher;
-public class LeakCatcher extends Application {
+public class FirebaseUIDemo extends Application {
private RefWatcher mRefWatcher;
+ static {
+ AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO);
+ }
+
public static RefWatcher getRefWatcher(Context context) {
- return ((LeakCatcher) context.getApplicationContext()).mRefWatcher;
+ return ((FirebaseUIDemo) context.getApplicationContext()).mRefWatcher;
}
@Override
diff --git a/app/src/main/java/com/firebase/uidemo/auth/SignedInActivity.java b/app/src/main/java/com/firebase/uidemo/auth/SignedInActivity.java
index fedb61a13..383cc7d0b 100644
--- a/app/src/main/java/com/firebase/uidemo/auth/SignedInActivity.java
+++ b/app/src/main/java/com/firebase/uidemo/auth/SignedInActivity.java
@@ -42,7 +42,9 @@
import com.google.firebase.auth.FacebookAuthProvider;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
+import com.google.firebase.auth.GithubAuthProvider;
import com.google.firebase.auth.GoogleAuthProvider;
+import com.google.firebase.auth.TwitterAuthProvider;
import java.util.ArrayList;
import java.util.Iterator;
@@ -176,14 +178,25 @@ private void populateProfile() {
Iterator providerIter = user.getProviders().iterator();
while (providerIter.hasNext()) {
String provider = providerIter.next();
- if (GoogleAuthProvider.PROVIDER_ID.equals(provider)) {
- providerList.append("Google");
- } else if (FacebookAuthProvider.PROVIDER_ID.equals(provider)) {
- providerList.append("Facebook");
- } else if (EmailAuthProvider.PROVIDER_ID.equals(provider)) {
- providerList.append("Password");
- } else {
- providerList.append(provider);
+ switch (provider) {
+ case GoogleAuthProvider.PROVIDER_ID:
+ providerList.append("Google");
+ break;
+ case FacebookAuthProvider.PROVIDER_ID:
+ providerList.append("Facebook");
+ break;
+ case TwitterAuthProvider.PROVIDER_ID:
+ providerList.append("Twitter");
+ break;
+ case GithubAuthProvider.PROVIDER_ID:
+ providerList.append("GitHub");
+ break;
+ case EmailAuthProvider.PROVIDER_ID:
+ providerList.append("Password");
+ break;
+ default:
+ providerList.append(provider);
+ break;
}
if (providerIter.hasNext()) {
diff --git a/app/src/main/res/drawable/chat_message_arrow.xml b/app/src/main/res/drawable/chat_message_arrow.xml
index a9f1b5f9b..5063dc73e 100644
--- a/app/src/main/res/drawable/chat_message_arrow.xml
+++ b/app/src/main/res/drawable/chat_message_arrow.xml
@@ -2,14 +2,14 @@
+ android:pivotY="87%"
+ android:toDegrees="45">
-
+ android:width="10dp"
+ android:color="@android:color/transparent" />
+
-
\ No newline at end of file
+
diff --git a/app/src/main/res/drawable/chat_message_background.xml b/app/src/main/res/drawable/chat_message_background.xml
index ebef62f6c..c22c3d71a 100644
--- a/app/src/main/res/drawable/chat_message_background.xml
+++ b/app/src/main/res/drawable/chat_message_background.xml
@@ -2,6 +2,6 @@
-
-
+
+
diff --git a/app/src/main/res/layout/activity_chat.xml b/app/src/main/res/layout/activity_chat.xml
index 1c9c4d8a1..326cfde18 100644
--- a/app/src/main/res/layout/activity_chat.xml
+++ b/app/src/main/res/layout/activity_chat.xml
@@ -10,39 +10,39 @@
android:id="@+id/emptyTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="@string/start_chatting"
- android:padding="16dp" />
+ android:padding="16dp"
+ android:text="@string/start_chatting" />
+ tools:listitem="@layout/message" />
+ android:orientation="horizontal">
+ android:inputType="text" />
+ android:text="@string/send" />
diff --git a/app/src/main/res/layout/activity_chooser.xml b/app/src/main/res/layout/activity_chooser.xml
index 45abf7b4f..83cc55243 100644
--- a/app/src/main/res/layout/activity_chooser.xml
+++ b/app/src/main/res/layout/activity_chooser.xml
@@ -3,15 +3,15 @@
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical"
- android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
- android:paddingTop="@dimen/activity_vertical_margin">
+ android:paddingTop="@dimen/activity_vertical_margin"
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ android:orientation="vertical">
+ android:layout_height="match_parent" />
diff --git a/app/src/main/res/layout/activity_chooser_item.xml b/app/src/main/res/layout/activity_chooser_item.xml
index 76a4a9ba0..c46de3dc0 100644
--- a/app/src/main/res/layout/activity_chooser_item.xml
+++ b/app/src/main/res/layout/activity_chooser_item.xml
@@ -11,10 +11,10 @@
+ android:layout_marginEnd="16dp"
+ android:layout_marginTop="8dp"
+ android:layout_marginBottom="8dp">
+ android:textStyle="bold" />
+ android:textIsSelectable="false" />
diff --git a/app/src/main/res/layout/activity_image.xml b/app/src/main/res/layout/activity_image.xml
index 6246b517b..0a1d2e991 100644
--- a/app/src/main/res/layout/activity_image.xml
+++ b/app/src/main/res/layout/activity_image.xml
@@ -4,31 +4,31 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical"
- android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
+ android:paddingBottom="@dimen/activity_vertical_margin"
+ android:orientation="vertical"
tools:context="com.firebase.uidemo.storage.ImageActivity">
+ android:text="@string/upload" />
+ android:text="@string/choose_image" />
+ android:text="@string/download" />
+ android:text="@string/download" />
@@ -52,6 +52,6 @@
android:scaleType="centerCrop"
android:src="#E6E6E6"
android:visibility="invisible"
- tools:visibility="visible"/>
+ tools:visibility="visible" />
diff --git a/app/src/main/res/layout/auth_ui_layout.xml b/app/src/main/res/layout/auth_ui_layout.xml
index e9e96abff..495672e28 100644
--- a/app/src/main/res/layout/auth_ui_layout.xml
+++ b/app/src/main/res/layout/auth_ui_layout.xml
@@ -14,12 +14,12 @@
+ android:layout_marginBottom="16dp"
+ android:paddingBottom="32dp"
+ android:orientation="vertical">
+ android:text="@string/launch_title" />
+ android:text="@string/sign_in" />
+ android:text="@string/use_theme_header" />
+ android:text="@string/default_theme" />
+ android:text="@string/purple_theme" />
+ android:text="@string/green_theme" />
+ android:text="@string/dark_theme" />
+ android:layout_marginBottom="8dp"
+ android:text="@string/auth_providers_header" />
+ android:text="@string/google_label" />
+ android:text="@string/facebook_label" />
+ android:text="@string/twitter_label" />
+
+
+ android:text="@string/email_label" />
+ android:text="@string/phone_label" />
+ android:layout_marginBottom="8dp"
+ android:text="@string/tos_header" />
+ android:text="@string/google_tos_label" />
+ android:text="@string/firebase_tos_label" />
@@ -151,9 +158,9 @@
style="@style/Base.TextAppearance.AppCompat.Subhead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginBottom="8dp"
android:layout_marginTop="16dp"
- android:text="@string/privacy_policy_header"/>
+ android:layout_marginBottom="8dp"
+ android:text="@string/privacy_policy_header" />
+ android:text="@string/google_privacy_label" />
+ android:text="@string/firebase_privacy_label" />
@@ -179,9 +186,9 @@
style="@style/Base.TextAppearance.AppCompat.Subhead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginBottom="8dp"
android:layout_marginTop="16dp"
- android:text="@string/logo_header"/>
+ android:layout_marginBottom="8dp"
+ android:text="@string/logo_header" />
+ android:text="@string/firebase_logo_label" />
+ android:text="@string/google_logo_label" />
+ android:text="@string/no_logo_label" />
+
+
+
+
+
+
+ android:layout_marginBottom="8dp"
+ android:text="@string/extra_facebook_scopes" />
+ android:text="@string/facebook_scope_friends" />
+ android:text="@string/facebook_scope_photos" />
+ android:layout_marginBottom="8dp"
+ android:text="@string/extra_github_scopes" />
+ android:text="@string/github_scope_repo" />
+ android:text="@string/github_scope_gist" />
+ android:layout_marginBottom="8dp"
+ android:text="@string/other_options_header" />
+ android:text="@string/enable_credential_selector" />
+ android:text="@string/enable_hint_selector" />
+ android:text="@string/allow_new_email_acccount" />
diff --git a/app/src/main/res/layout/message.xml b/app/src/main/res/layout/message.xml
index 55cc1d598..8329166d3 100644
--- a/app/src/main/res/layout/message.xml
+++ b/app/src/main/res/layout/message.xml
@@ -5,17 +5,17 @@
android:id="@+id/message_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingBottom="5dp"
- android:paddingTop="5dp">
+ android:paddingTop="5dp"
+ android:paddingBottom="5dp">
+ android:rotation="180" />
+ tools:text="Hey this is a message, look!" />
+ tools:text="Some User" />
@@ -52,11 +52,11 @@
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_alignEnd="@+id/message"
- android:layout_alignParentTop="true"
- android:layout_alignRight="@+id/message"
android:layout_marginEnd="25dp"
+ android:layout_alignRight="@+id/message"
android:layout_marginRight="25dp"
+ android:layout_alignParentTop="true"
android:background="@drawable/chat_message_arrow"
- android:rotation="180"/>
+ android:rotation="180" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/signed_in_layout.xml b/app/src/main/res/layout/signed_in_layout.xml
index 4ceed3386..0039b9f43 100644
--- a/app/src/main/res/layout/signed_in_layout.xml
+++ b/app/src/main/res/layout/signed_in_layout.xml
@@ -4,17 +4,17 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:clipToPadding="false"
- android:paddingBottom="16dp"
android:paddingTop="16dp"
+ android:paddingBottom="16dp"
+ android:clipToPadding="false"
tools:context=".auth.SignedInActivity">
+ android:text="@string/signed_in_header" />
+ android:text="@string/sign_out" />
+ tools:ignore="ButtonStyle" />
@@ -56,7 +56,7 @@
style="@style/Base.TextAppearance.AppCompat.Subhead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/user_profile_header"/>
+ android:text="@string/user_profile_header" />
+ android:src="@drawable/anon_user_48dp" />
+ android:textIsSelectable="true" />
+ android:textIsSelectable="true" />
+ android:textIsSelectable="true" />
+ android:textIsSelectable="true" />
@@ -116,13 +116,13 @@
style="@style/Base.TextAppearance.AppCompat.Subhead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/idp_token"/>
+ android:text="@string/idp_token" />
+ android:textIsSelectable="true" />
@@ -136,13 +136,13 @@
style="@style/Base.TextAppearance.AppCompat.Subhead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="@string/idp_secret"/>
+ android:text="@string/idp_secret" />
+ android:textIsSelectable="true" />
diff --git a/app/src/main/res/values/config.xml b/app/src/main/res/values/config.xml
index 7d82f1aa1..7454e5954 100644
--- a/app/src/main/res/values/config.xml
+++ b/app/src/main/res/values/config.xml
@@ -4,26 +4,41 @@
use Facebook accounts with the demo application, register an application
and provide your value here.
-->
- CHANGE-ME
+ 654633568031642
- fbYOUR_APP_ID
+ fb654633568031642
- CHANGE-ME
+ ojwOB05fmN2TiNoaZnVQRAp4N
- CHANGE-ME
+ di6UQRwDaxsRQ7RT5M5QcUgq19Dn4NY04QLMjaDhyxqmUy92Pe
+
+
+ a10c87f4aacc7e5ab05a
+
+
+ 583b444835198b8e025062eda2031f89ed62ed07
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 4bb747c6a..094211bff 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -28,6 +28,8 @@
Facebook - configuration missing
Twitter
Twitter - configuration missing
+ GitHub
+ GitHub - configuration missing
Google
Google - configuration missing
Google TOS
@@ -56,8 +58,11 @@
Drive File
Youtube data
Example extra Facebook scopes
- Friends
- Photos
+ Friends
+ Photos
+ Example extra GitHub scopes
+ Repo
+ Gist
IDP Token
IDP Secret
An unknown error occurred
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index f5b6c16fc..849919918 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,7 +1,7 @@
-
-
+
-
+
@@ -237,4 +237,10 @@
- #FFFFFFFF
+
+
diff --git a/auth/src/test/java/com/firebase/ui/auth/testhelpers/ActivityHelperShadow.java b/auth/src/test/java/com/firebase/ui/auth/testhelpers/ActivityHelperShadow.java
deleted file mode 100644
index 6366be617..000000000
--- a/auth/src/test/java/com/firebase/ui/auth/testhelpers/ActivityHelperShadow.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright 2016 Google Inc. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
- * in compliance with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software distributed under the
- * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
- * express or implied. See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.firebase.ui.auth.testhelpers;
-
-import com.firebase.ui.auth.ui.ActivityHelper;
-import com.firebase.ui.auth.util.signincontainer.SaveSmartLock;
-
-import org.robolectric.annotation.Implementation;
-import org.robolectric.annotation.Implements;
-
-@Implements(ActivityHelper.class)
-public class ActivityHelperShadow extends BaseHelperShadow {
-
- public ActivityHelperShadow() {
- super();
- }
-
- @Implementation
- public SaveSmartLock getSaveSmartLockInstance() {
- return sSaveSmartLock;
- }
-}
diff --git a/auth/src/test/java/com/firebase/ui/auth/testhelpers/AuthInstancesShadow.java b/auth/src/test/java/com/firebase/ui/auth/testhelpers/AuthInstancesShadow.java
new file mode 100644
index 000000000..560e6fdab
--- /dev/null
+++ b/auth/src/test/java/com/firebase/ui/auth/testhelpers/AuthInstancesShadow.java
@@ -0,0 +1,77 @@
+package com.firebase.ui.auth.testhelpers;
+
+import android.support.v4.app.FragmentActivity;
+
+import com.firebase.ui.auth.ui.FlowParameters;
+import com.firebase.ui.auth.util.AuthInstances;
+import com.firebase.ui.auth.util.signincontainer.SaveSmartLock;
+import com.google.android.gms.auth.api.credentials.CredentialsApi;
+import com.google.firebase.auth.FirebaseAuth;
+import com.google.firebase.auth.FirebaseUser;
+import com.google.firebase.auth.PhoneAuthProvider;
+
+import org.mockito.Mockito;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+import static org.mockito.Mockito.when;
+
+@Implements(AuthInstances.class)
+public class AuthInstancesShadow {
+
+ public static final FirebaseAuth sFirebaseAuth;
+ public static final FirebaseUser sFirebaseUser;
+ public static final CredentialsApi sCredentialsApi;
+ public static final SaveSmartLock sSaveSmartLock;
+ public static final PhoneAuthProvider sPhoneAuthProvider;
+
+ static {
+ // CredentialsApi
+ sCredentialsApi = Mockito.mock(CredentialsApi.class);
+
+ // FirebaseUser
+ sFirebaseUser = Mockito.mock(FirebaseUser.class);
+ when(sFirebaseUser.getEmail()).thenReturn(TestConstants.EMAIL);
+ when(sFirebaseUser.getDisplayName()).thenReturn(TestConstants.NAME);
+ when(sFirebaseUser.getPhotoUrl()).thenReturn(TestConstants.PHOTO_URI);
+
+ // FirebaseAuth
+ sFirebaseAuth = Mockito.mock(FirebaseAuth.class);
+ when(sFirebaseAuth.getCurrentUser()).thenReturn(sFirebaseUser);
+
+ // SaveSmartLock
+ sSaveSmartLock = Mockito.mock(SaveSmartLock.class);
+
+ // PhoneAuthProvider
+ sPhoneAuthProvider = Mockito.mock(PhoneAuthProvider.class);
+ }
+
+ private AuthInstancesShadow() {}
+
+ @Implementation
+ public static FirebaseAuth getFirebaseAuth(FlowParameters parameters) {
+ return sFirebaseAuth;
+ }
+
+ @Implementation
+ public static CredentialsApi getCredentialsApi() {
+ return sCredentialsApi;
+ }
+
+ @Implementation
+ public static FirebaseUser getCurrentUser(FlowParameters parameters) {
+ return sFirebaseUser;
+ }
+
+ @Implementation
+ public static SaveSmartLock getSaveSmartLockInstance(FragmentActivity activity,
+ FlowParameters parameters) {
+ return sSaveSmartLock;
+ }
+
+ @Implementation
+ public static PhoneAuthProvider getPhoneAuthProviderInstance() {
+ return sPhoneAuthProvider;
+ }
+
+}
diff --git a/auth/src/test/java/com/firebase/ui/auth/testhelpers/BaseHelperShadow.java b/auth/src/test/java/com/firebase/ui/auth/testhelpers/BaseHelperShadow.java
deleted file mode 100644
index 47af92fb6..000000000
--- a/auth/src/test/java/com/firebase/ui/auth/testhelpers/BaseHelperShadow.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package com.firebase.ui.auth.testhelpers;
-
-import android.support.v4.app.FragmentActivity;
-
-import com.firebase.ui.auth.ui.BaseHelper;
-import com.firebase.ui.auth.util.signincontainer.SaveSmartLock;
-import com.google.android.gms.auth.api.credentials.CredentialsApi;
-import com.google.firebase.auth.FirebaseAuth;
-import com.google.firebase.auth.PhoneAuthProvider;
-import com.google.firebase.auth.FirebaseUser;
-
-import org.mockito.Mockito;
-import org.robolectric.annotation.Implementation;
-import org.robolectric.annotation.Implements;
-
-import static org.mockito.Mockito.when;
-
-@Implements(BaseHelper.class)
-public class BaseHelperShadow {
- public static FirebaseAuth sFirebaseAuth;
- public static FirebaseUser sFirebaseUser;
- public static CredentialsApi sCredentialsApi;
- public static SaveSmartLock sSaveSmartLock;
- public static PhoneAuthProvider sPhoneAuthProvider;
-
- public BaseHelperShadow() {
- if (sFirebaseUser == null) {
- sFirebaseUser = Mockito.mock(FirebaseUser.class);
- when(sFirebaseUser.getEmail()).thenReturn(TestConstants.EMAIL);
- when(sFirebaseUser.getDisplayName()).thenReturn(TestConstants.NAME);
- when(sFirebaseUser.getPhotoUrl()).thenReturn(TestConstants.PHOTO_URI);
- }
- if (sFirebaseAuth == null) {
- sFirebaseAuth = Mockito.mock(FirebaseAuth.class);
- when(sFirebaseAuth.getCurrentUser()).thenReturn(sFirebaseUser);
- }
- if (sCredentialsApi == null) {
- sCredentialsApi = Mockito.mock(CredentialsApi.class);
- }
- if (sSaveSmartLock == null) {
- sSaveSmartLock = Mockito.mock(SaveSmartLock.class);
- }
- if (sPhoneAuthProvider == null) {
- sPhoneAuthProvider = Mockito.mock(PhoneAuthProvider.class);
- }
- }
-
- @Implementation
- public FirebaseAuth getFirebaseAuth() {
- return sFirebaseAuth;
- }
-
- @Implementation
- public CredentialsApi getCredentialsApi() {
- return sCredentialsApi;
- }
-
- @Implementation
- public SaveSmartLock getSaveSmartLockInstance(FragmentActivity activity) {
- return sSaveSmartLock;
- }
-
- @Implementation
- public PhoneAuthProvider getPhoneAuthProviderInstance() {
- return sPhoneAuthProvider;
- }
-}
diff --git a/auth/src/test/java/com/firebase/ui/auth/testhelpers/CustomRobolectricGradleTestRunner.java b/auth/src/test/java/com/firebase/ui/auth/testhelpers/CustomRobolectricGradleTestRunner.java
index 12344596d..fa30fdc07 100644
--- a/auth/src/test/java/com/firebase/ui/auth/testhelpers/CustomRobolectricGradleTestRunner.java
+++ b/auth/src/test/java/com/firebase/ui/auth/testhelpers/CustomRobolectricGradleTestRunner.java
@@ -17,8 +17,7 @@
import com.facebook.login.LoginManager;
import com.firebase.ui.auth.provider.FacebookProvider;
import com.firebase.ui.auth.provider.GoogleProvider;
-import com.firebase.ui.auth.ui.ActivityHelper;
-import com.firebase.ui.auth.ui.BaseHelper;
+import com.firebase.ui.auth.util.AuthInstances;
import org.junit.runners.model.InitializationError;
import org.robolectric.RobolectricTestRunner;
@@ -34,8 +33,7 @@ public CustomRobolectricGradleTestRunner(Class> klass) throws InitializationEr
public InstrumentationConfiguration createClassLoaderConfig(Config config) {
InstrumentationConfiguration.Builder builder = InstrumentationConfiguration.newBuilder();
- builder.addInstrumentedClass(BaseHelper.class.getName());
- builder.addInstrumentedClass(ActivityHelper.class.getName());
+ builder.addInstrumentedClass(AuthInstances.class.getName());
builder.addInstrumentedClass(FacebookProvider.class.getName());
builder.addInstrumentedClass(GoogleProvider.class.getName());
builder.addInstrumentedClass(LoginManager.class.getName());
diff --git a/auth/src/test/java/com/firebase/ui/auth/testhelpers/FakeAuthResult.java b/auth/src/test/java/com/firebase/ui/auth/testhelpers/FakeAuthResult.java
index 7179b056e..f405277ba 100644
--- a/auth/src/test/java/com/firebase/ui/auth/testhelpers/FakeAuthResult.java
+++ b/auth/src/test/java/com/firebase/ui/auth/testhelpers/FakeAuthResult.java
@@ -27,7 +27,7 @@ private FakeAuthResult() {
@Override
public FirebaseUser getUser() {
- return BaseHelperShadow.sFirebaseUser;
+ return AuthInstancesShadow.getCurrentUser(null);
}
@Override
diff --git a/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java b/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java
index 97c0b5baa..8ec719385 100644
--- a/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java
+++ b/auth/src/test/java/com/firebase/ui/auth/testhelpers/TestHelper.java
@@ -80,7 +80,7 @@ public static void verifySmartLockSave(String providerId, String email,
ArgumentCaptor passwordCaptor = ArgumentCaptor.forClass(String.class);
ArgumentCaptor idpResponseCaptor = ArgumentCaptor.forClass(IdpResponse.class);
- verify(ActivityHelperShadow.sSaveSmartLock).saveCredentialsOrFinish(
+ verify(AuthInstancesShadow.sSaveSmartLock).saveCredentialsOrFinish(
userCaptor.capture(),
passwordCaptor.capture(),
idpResponseCaptor.capture());
diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/RecoverPasswordActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/RecoverPasswordActivityTest.java
index 91a92ac7a..df6a87795 100644
--- a/auth/src/test/java/com/firebase/ui/auth/ui/email/RecoverPasswordActivityTest.java
+++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/RecoverPasswordActivityTest.java
@@ -19,9 +19,8 @@
import com.firebase.ui.auth.BuildConfig;
import com.firebase.ui.auth.R;
-import com.firebase.ui.auth.testhelpers.ActivityHelperShadow;
+import com.firebase.ui.auth.testhelpers.AuthInstancesShadow;
import com.firebase.ui.auth.testhelpers.AutoCompleteTask;
-import com.firebase.ui.auth.testhelpers.BaseHelperShadow;
import com.firebase.ui.auth.testhelpers.CustomRobolectricGradleTestRunner;
import com.firebase.ui.auth.testhelpers.TestConstants;
import com.firebase.ui.auth.testhelpers.TestHelper;
@@ -57,13 +56,14 @@ private RecoverPasswordActivity createActivity() {
}
@Test
- @Config(shadows = {BaseHelperShadow.class, ActivityHelperShadow.class})
+ @Config(shadows = {AuthInstancesShadow.class})
public void testNextButton_sendsEmail() {
RecoverPasswordActivity recoverPasswordActivity = createActivity();
+
Button nextButton = (Button) recoverPasswordActivity.findViewById(R.id.button_done);
- when(ActivityHelperShadow.sFirebaseAuth.sendPasswordResetEmail(TestConstants.EMAIL))
+ when(AuthInstancesShadow.sFirebaseAuth.sendPasswordResetEmail(TestConstants.EMAIL))
.thenReturn(new AutoCompleteTask(null, true, null));
nextButton.performClick();
- verify(ActivityHelperShadow.sFirebaseAuth).sendPasswordResetEmail(TestConstants.EMAIL);
+ verify(AuthInstancesShadow.sFirebaseAuth).sendPasswordResetEmail(TestConstants.EMAIL);
}
}
diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java
index 560efa0d1..b002cb074 100644
--- a/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java
+++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/RegisterEmailActivityTest.java
@@ -23,9 +23,8 @@
import com.firebase.ui.auth.AuthUI;
import com.firebase.ui.auth.BuildConfig;
import com.firebase.ui.auth.R;
-import com.firebase.ui.auth.testhelpers.ActivityHelperShadow;
+import com.firebase.ui.auth.testhelpers.AuthInstancesShadow;
import com.firebase.ui.auth.testhelpers.AutoCompleteTask;
-import com.firebase.ui.auth.testhelpers.BaseHelperShadow;
import com.firebase.ui.auth.testhelpers.CustomRobolectricGradleTestRunner;
import com.firebase.ui.auth.testhelpers.FakeAuthResult;
import com.firebase.ui.auth.testhelpers.TestConstants;
@@ -100,11 +99,10 @@ public void testSignUpButton_validatesFields() {
}
@Test
- @Config(shadows = {BaseHelperShadow.class, ActivityHelperShadow.class})
+ @Config(shadows = {AuthInstancesShadow.class})
public void testSignUpButton_successfulRegistrationShouldContinueToSaveCredentials() {
// init mocks
- new BaseHelperShadow();
- reset(BaseHelperShadow.sSaveSmartLock);
+ reset(AuthInstancesShadow.sSaveSmartLock);
TestHelper.initializeApp(RuntimeEnvironment.application);
RegisterEmailActivity registerEmailActivity = createActivity();
@@ -120,10 +118,10 @@ public void testSignUpButton_successfulRegistrationShouldContinueToSaveCredentia
name.setText(TestConstants.NAME);
password.setText(TestConstants.PASSWORD);
- when(BaseHelperShadow.sFirebaseUser.updateProfile(any(UserProfileChangeRequest.class)))
+ when(AuthInstancesShadow.sFirebaseUser.updateProfile(any(UserProfileChangeRequest.class)))
.thenReturn(new AutoCompleteTask(null, true, null));
- when(BaseHelperShadow.sFirebaseAuth
+ when(AuthInstancesShadow.sFirebaseAuth
.createUserWithEmailAndPassword(
TestConstants.EMAIL,
TestConstants.PASSWORD))
diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/email/WelcomeBackPasswordPromptTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/email/WelcomeBackPasswordPromptTest.java
index 27df90f1d..3ef3be1ab 100644
--- a/auth/src/test/java/com/firebase/ui/auth/ui/email/WelcomeBackPasswordPromptTest.java
+++ b/auth/src/test/java/com/firebase/ui/auth/ui/email/WelcomeBackPasswordPromptTest.java
@@ -22,9 +22,8 @@
import com.firebase.ui.auth.BuildConfig;
import com.firebase.ui.auth.IdpResponse;
import com.firebase.ui.auth.R;
-import com.firebase.ui.auth.testhelpers.ActivityHelperShadow;
import com.firebase.ui.auth.testhelpers.AutoCompleteTask;
-import com.firebase.ui.auth.testhelpers.BaseHelperShadow;
+import com.firebase.ui.auth.testhelpers.AuthInstancesShadow;
import com.firebase.ui.auth.testhelpers.CustomRobolectricGradleTestRunner;
import com.firebase.ui.auth.testhelpers.FakeAuthResult;
import com.firebase.ui.auth.testhelpers.TestConstants;
@@ -90,17 +89,16 @@ public void testSignInButton_validatesFields() {
}
@Test
- @Config(shadows = {BaseHelperShadow.class, ActivityHelperShadow.class})
+ @Config(shadows = {AuthInstancesShadow.class})
public void testSignInButton_signsInAndSavesCredentials() {
// initialize mocks
- new ActivityHelperShadow();
- reset(ActivityHelperShadow.sSaveSmartLock);
+ reset(AuthInstancesShadow.sSaveSmartLock);
WelcomeBackPasswordPrompt welcomeBackActivity = createActivity();
EditText passwordField = (EditText) welcomeBackActivity.findViewById(R.id.password);
passwordField.setText(TestConstants.PASSWORD);
- when(ActivityHelperShadow.sFirebaseAuth.signInWithEmailAndPassword(
+ when(AuthInstancesShadow.sFirebaseAuth.signInWithEmailAndPassword(
TestConstants.EMAIL,
TestConstants.PASSWORD)).thenReturn(
new AutoCompleteTask<>(FakeAuthResult.INSTANCE, true, null));
@@ -108,7 +106,7 @@ public void testSignInButton_signsInAndSavesCredentials() {
Button signIn = (Button) welcomeBackActivity.findViewById(R.id.button_done);
signIn.performClick();
- verify(ActivityHelperShadow.sFirebaseAuth).signInWithEmailAndPassword(
+ verify(AuthInstancesShadow.sFirebaseAuth).signInWithEmailAndPassword(
TestConstants.EMAIL,
TestConstants.PASSWORD);
diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java
index c56a44500..3ff03197f 100644
--- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java
+++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/AuthMethodPickerActivityTest.java
@@ -22,9 +22,9 @@
import com.firebase.ui.auth.AuthUI;
import com.firebase.ui.auth.BuildConfig;
import com.firebase.ui.auth.R;
-import com.firebase.ui.auth.testhelpers.ActivityHelperShadow;
+import com.firebase.ui.auth.provider.GitHubRedirectActivity;
+import com.firebase.ui.auth.testhelpers.AuthInstancesShadow;
import com.firebase.ui.auth.testhelpers.AutoCompleteTask;
-import com.firebase.ui.auth.testhelpers.BaseHelperShadow;
import com.firebase.ui.auth.testhelpers.CustomRobolectricGradleTestRunner;
import com.firebase.ui.auth.testhelpers.FacebookProviderShadow;
import com.firebase.ui.auth.testhelpers.FakeAuthResult;
@@ -36,6 +36,7 @@
import com.firebase.ui.auth.ui.phone.PhoneVerificationActivity;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.FacebookAuthProvider;
+import com.google.firebase.auth.GithubAuthProvider;
import com.google.firebase.auth.GoogleAuthProvider;
import com.google.firebase.auth.TwitterAuthProvider;
@@ -72,6 +73,7 @@ public void testAllProvidersArePopulated() {
AuthUI.FACEBOOK_PROVIDER,
AuthUI.GOOGLE_PROVIDER,
AuthUI.TWITTER_PROVIDER,
+ AuthUI.GITHUB_PROVIDER,
AuthUI.EMAIL_PROVIDER,
AuthUI.PHONE_VERIFICATION_PROVIDER);
@@ -117,15 +119,14 @@ public void testPhoneLoginFlow() {
}
@Test
- @Config(shadows = {BaseHelperShadow.class, ActivityHelperShadow.class})
+ @Config(shadows = {AuthInstancesShadow.class, AuthInstancesShadow.class})
public void testFacebookLoginFlow() {
// initialize mocks
- new ActivityHelperShadow();
- reset(ActivityHelperShadow.sSaveSmartLock);
+ reset(AuthInstancesShadow.sSaveSmartLock);
- when(BaseHelperShadow.sFirebaseUser.getProviders())
+ when(AuthInstancesShadow.sFirebaseUser.getProviders())
.thenReturn(Arrays.asList(FacebookAuthProvider.PROVIDER_ID));
- when(ActivityHelperShadow.sFirebaseAuth.signInWithCredential((AuthCredential) any()))
+ when(AuthInstancesShadow.sFirebaseAuth.signInWithCredential((AuthCredential) any()))
.thenReturn(new AutoCompleteTask<>(FakeAuthResult.INSTANCE, true, null));
List providers = Arrays.asList(AuthUI.FACEBOOK_PROVIDER);
@@ -140,20 +141,19 @@ public void testFacebookLoginFlow() {
}
@Test
- @Config(shadows = {GoogleProviderShadow.class, BaseHelperShadow.class, ActivityHelperShadow.class})
+ @Config(shadows = {GoogleProviderShadow.class, AuthInstancesShadow.class, AuthInstancesShadow.class})
public void testGoogleLoginFlow() {
// initialize mocks
- new ActivityHelperShadow();
- reset(ActivityHelperShadow.sSaveSmartLock);
+ reset(AuthInstancesShadow.sSaveSmartLock);
List providers = Arrays.asList(AuthUI.GOOGLE_PROVIDER);
AuthMethodPickerActivity authMethodPickerActivity = createActivity(providers);
- when(BaseHelperShadow.sFirebaseUser.getProviders())
+ when(AuthInstancesShadow.sFirebaseUser.getProviders())
.thenReturn(Arrays.asList(GoogleAuthProvider.PROVIDER_ID));
- when(ActivityHelperShadow.sFirebaseAuth.signInWithCredential((AuthCredential) any()))
+ when(AuthInstancesShadow.sFirebaseAuth.signInWithCredential((AuthCredential) any()))
.thenReturn(new AutoCompleteTask<>(FakeAuthResult.INSTANCE, true, null));
Button googleButton = (Button) authMethodPickerActivity.findViewById(R.id.google_button);
@@ -165,19 +165,18 @@ public void testGoogleLoginFlow() {
}
@Test
- @Config(shadows = {ActivityHelperShadow.class})
+ @Config(shadows = {AuthInstancesShadow.class})
public void testTwitterLoginFlowStarts() {
List providers = Arrays.asList(AuthUI.TWITTER_PROVIDER);
AuthMethodPickerActivity authMethodPickerActivity = createActivity(providers);
- when(BaseHelperShadow.sFirebaseUser.getProviders())
+ when(AuthInstancesShadow.sFirebaseUser.getProviders())
.thenReturn(Arrays.asList(TwitterAuthProvider.PROVIDER_ID));
- when(ActivityHelperShadow.sFirebaseAuth.signInWithCredential(any(AuthCredential.class)))
+ when(AuthInstancesShadow.sFirebaseAuth.signInWithCredential(any(AuthCredential.class)))
.thenReturn(new AutoCompleteTask<>(FakeAuthResult.INSTANCE, true, null));
- Button twitterButton =
- (Button) authMethodPickerActivity.findViewById(R.id.twitter_button);
+ Button twitterButton = (Button) authMethodPickerActivity.findViewById(R.id.twitter_button);
assertNotNull(twitterButton);
twitterButton.performClick();
@@ -187,6 +186,29 @@ public void testTwitterLoginFlowStarts() {
assertTrue(nextIntent.intent.getComponent().getClassName().contains("com.twitter.sdk"));
}
+ @Test
+ @Config(shadows = {AuthInstancesShadow.class})
+ public void testGitHubLoginFlowStarts() {
+ List providers = Arrays.asList(AuthUI.GITHUB_PROVIDER);
+
+ AuthMethodPickerActivity authMethodPickerActivity = createActivity(providers);
+
+ when(AuthInstancesShadow.sFirebaseUser.getProviders())
+ .thenReturn(Arrays.asList(GithubAuthProvider.PROVIDER_ID));
+
+ when(AuthInstancesShadow.sFirebaseAuth.signInWithCredential(any(AuthCredential.class)))
+ .thenReturn(new AutoCompleteTask<>(FakeAuthResult.INSTANCE, true, null));
+ Button gitHubButton = (Button) authMethodPickerActivity.findViewById(R.id.github_button);
+
+ assertNotNull(gitHubButton);
+ gitHubButton.performClick();
+ ShadowActivity.IntentForResult nextIntent =
+ Shadows.shadowOf(authMethodPickerActivity).getNextStartedActivityForResult();
+
+ assertTrue(nextIntent.intent.getComponent()
+ .getClassName()
+ .equals(GitHubRedirectActivity.class.getName())); }
+
private AuthMethodPickerActivity createActivity(List providers) {
Intent startIntent = AuthMethodPickerActivity.createIntent(
RuntimeEnvironment.application,
diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java
index 3c2ab870a..6bb22abab 100644
--- a/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java
+++ b/auth/src/test/java/com/firebase/ui/auth/ui/idp/CredentialSignInHandlerTest.java
@@ -14,22 +14,20 @@
package com.firebase.ui.auth.ui.idp;
-import android.app.Activity;
import android.content.Intent;
import com.firebase.ui.auth.BuildConfig;
import com.firebase.ui.auth.IdpResponse;
-import com.firebase.ui.auth.testhelpers.ActivityHelperShadow;
+import com.firebase.ui.auth.testhelpers.AuthInstancesShadow;
import com.firebase.ui.auth.testhelpers.AutoCompleteTask;
-import com.firebase.ui.auth.testhelpers.BaseHelperShadow;
import com.firebase.ui.auth.testhelpers.CustomRobolectricGradleTestRunner;
import com.firebase.ui.auth.testhelpers.FakeAuthResult;
import com.firebase.ui.auth.testhelpers.FakeProviderQueryResult;
import com.firebase.ui.auth.testhelpers.TestConstants;
import com.firebase.ui.auth.testhelpers.TestHelper;
-import com.firebase.ui.auth.ui.ActivityHelper;
import com.firebase.ui.auth.ui.AppCompatBase;
import com.firebase.ui.auth.ui.FlowParameters;
+import com.firebase.ui.auth.ui.ProgressDialogHolder;
import com.firebase.ui.auth.ui.User;
import com.firebase.ui.auth.ui.accountlink.WelcomeBackIdpPrompt;
import com.firebase.ui.auth.ui.accountlink.WelcomeBackPasswordPrompt;
@@ -61,7 +59,7 @@
import static org.mockito.Mockito.when;
@RunWith(CustomRobolectricGradleTestRunner.class)
-@Config(constants = BuildConfig.class, sdk = 25, shadows = {ActivityHelperShadow.class})
+@Config(constants = BuildConfig.class, sdk = 25)
public class CredentialSignInHandlerTest {
private static final int RC_ACCOUNT_LINK = 3;
private static final String LINKING_ERROR = "ERROR_TEST_LINKING";
@@ -74,10 +72,9 @@ public void setUp() {
}
@Test
- @Config(shadows = {BaseHelperShadow.class})
+ @Config(shadows = {AuthInstancesShadow.class})
public void testSignInSucceeded() {
AppCompatBase mockActivity = mock(AppCompatBase.class);
- ActivityHelper mockActivityHelper = mock(ActivityHelper.class);
IdpResponse idpResponse =
new IdpResponse.Builder(GoogleAuthProvider.PROVIDER_ID, TestConstants.EMAIL)
.setToken(TestConstants.TOKEN)
@@ -85,31 +82,25 @@ public void testSignInSucceeded() {
SaveSmartLock smartLock = mock(SaveSmartLock.class);
CredentialSignInHandler credentialSignInHandler = new CredentialSignInHandler(
mockActivity,
- mockActivityHelper,
smartLock,
RC_ACCOUNT_LINK,
idpResponse);
- when(mockActivityHelper.getFlowParams()).thenReturn(
+ when(mockActivity.getFlowParams()).thenReturn(
TestHelper.getFlowParameters(Collections.emptyList()));
credentialSignInHandler.onComplete(Tasks.forResult(FakeAuthResult.INSTANCE));
ArgumentCaptor smartLockCaptor = ArgumentCaptor.forClass(SaveSmartLock.class);
- ArgumentCaptor activityCaptor = ArgumentCaptor.forClass(Activity.class);
ArgumentCaptor firebaseUserCaptor = ArgumentCaptor.forClass(FirebaseUser.class);
ArgumentCaptor idpResponseCaptor = ArgumentCaptor.forClass(IdpResponse.class);
- ArgumentCaptor passwordCaptor = ArgumentCaptor.forClass(String.class);
- verify(mockActivityHelper).saveCredentialsOrFinish(
+ verify(mockActivity).saveCredentialsOrFinish(
smartLockCaptor.capture(),
- activityCaptor.capture(),
firebaseUserCaptor.capture(),
- passwordCaptor.capture(), // Needed to make Mockito happy
idpResponseCaptor.capture());
assertEquals(smartLock, smartLockCaptor.getValue());
- assertEquals(mockActivity, activityCaptor.getValue());
- assertEquals(BaseHelperShadow.sFirebaseUser, firebaseUserCaptor.getValue());
+ assertEquals(AuthInstancesShadow.sFirebaseUser, firebaseUserCaptor.getValue());
IdpResponse response = idpResponseCaptor.getValue();
assertEquals(idpResponse.getProviderType(), response.getProviderType());
@@ -119,26 +110,27 @@ public void testSignInSucceeded() {
}
@Test
+ @Config(shadows = {AuthInstancesShadow.class})
public void testSignInFailed_withFacebookAlreadyLinked() {
AppCompatBase mockActivity = mock(AppCompatBase.class);
- ActivityHelper mockActivityHelper = mock(ActivityHelper.class);
- FirebaseAuth mockFirebaseAuth = mock(FirebaseAuth.class);
IdpResponse idpResponse =
new IdpResponse.Builder(GoogleAuthProvider.PROVIDER_ID, TestConstants.EMAIL)
.setToken(TestConstants.TOKEN)
.build();
CredentialSignInHandler credentialSignInHandler = new CredentialSignInHandler(
mockActivity,
- mockActivityHelper,
null,
RC_ACCOUNT_LINK,
idpResponse);
FlowParameters mockFlowParams = mock(FlowParameters.class);
- when(mockActivityHelper.getFirebaseAuth()).thenReturn(mockFirebaseAuth);
- when(mockActivityHelper.getFlowParams()).thenReturn(mockFlowParams);
+ when(mockActivity.getFlowParams()).thenReturn(mockFlowParams);
+
+ ProgressDialogHolder mockHolder = mock(ProgressDialogHolder.class);
+ when(mockActivity.getDialogHolder()).thenReturn(mockHolder);
// pretend the account has Facebook linked already
+ FirebaseAuth mockFirebaseAuth = AuthInstancesShadow.sFirebaseAuth;
when(mockFirebaseAuth.fetchProvidersForEmail(TestConstants.EMAIL)).thenReturn(
new AutoCompleteTask(
new FakeProviderQueryResult(
@@ -167,31 +159,32 @@ public void testSignInFailed_withFacebookAlreadyLinked() {
}
@Test
+ @Config(shadows = {AuthInstancesShadow.class})
public void testSignInFailed_withPasswordAccountAlreadyLinked() {
AppCompatBase mockActivity = mock(AppCompatBase.class);
- ActivityHelper mockActivityHelper = mock(ActivityHelper.class);
- FirebaseAuth mockFirebaseAuth = mock(FirebaseAuth.class);
IdpResponse idpResponse =
new IdpResponse.Builder(GoogleAuthProvider.PROVIDER_ID, TestConstants.EMAIL)
.setToken(TestConstants.TOKEN)
.build();
CredentialSignInHandler credentialSignInHandler = new CredentialSignInHandler(
mockActivity,
- mockActivityHelper,
null,
RC_ACCOUNT_LINK,
idpResponse);
- Task mockTask = mock(Task.class);
FlowParameters mockFlowParams = mock(FlowParameters.class);
+ when(mockActivity.getFlowParams()).thenReturn(mockFlowParams);
+
+ ProgressDialogHolder mockHolder = mock(ProgressDialogHolder.class);
+ when(mockActivity.getDialogHolder()).thenReturn(mockHolder);
// pretend there was already an account with this email
+ Task mockTask = mock(Task.class);
when(mockTask.getException()).thenReturn(
new FirebaseAuthUserCollisionException(LINKING_ERROR, LINKING_EXPLANATION));
- when(mockActivityHelper.getFirebaseAuth()).thenReturn(mockFirebaseAuth);
- when(mockActivityHelper.getFlowParams()).thenReturn(mockFlowParams);
// pretend the account has a Password account linked already
+ FirebaseAuth mockFirebaseAuth = AuthInstancesShadow.sFirebaseAuth;
when(mockFirebaseAuth.fetchProvidersForEmail(TestConstants.EMAIL)).thenReturn(
new AutoCompleteTask(
new FakeProviderQueryResult(
diff --git a/auth/src/test/java/com/firebase/ui/auth/ui/phone/PhoneVerificationActivityTest.java b/auth/src/test/java/com/firebase/ui/auth/ui/phone/PhoneVerificationActivityTest.java
index b6bae9a35..a6d481dfd 100644
--- a/auth/src/test/java/com/firebase/ui/auth/ui/phone/PhoneVerificationActivityTest.java
+++ b/auth/src/test/java/com/firebase/ui/auth/ui/phone/PhoneVerificationActivityTest.java
@@ -25,14 +25,11 @@
import com.firebase.ui.auth.AuthUI;
import com.firebase.ui.auth.BuildConfig;
import com.firebase.ui.auth.R;
-import com.firebase.ui.auth.testhelpers.ActivityHelperShadow;
import com.firebase.ui.auth.testhelpers.AutoCompleteTask;
-import com.firebase.ui.auth.testhelpers.BaseHelperShadow;
+import com.firebase.ui.auth.testhelpers.AuthInstancesShadow;
import com.firebase.ui.auth.testhelpers.CustomRobolectricGradleTestRunner;
import com.firebase.ui.auth.testhelpers.FakeAuthResult;
import com.firebase.ui.auth.testhelpers.TestHelper;
-import com.firebase.ui.auth.ui.BaseHelper;
-import com.google.firebase.auth.AdditionalUserInfo;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuthException;
@@ -56,13 +53,13 @@
import java.util.Collections;
import java.util.concurrent.TimeUnit;
+import static com.firebase.ui.auth.ui.phone.PhoneTestConstants.PHONE;
import static com.firebase.ui.auth.ui.phone.PhoneTestConstants.PHONE_NO_COUNTRY_CODE;
import static com.firebase.ui.auth.ui.phone.PhoneTestConstants.YE_COUNTRY_CODE;
import static com.firebase.ui.auth.ui.phone.PhoneTestConstants.YE_RAW_PHONE;
import static com.firebase.ui.auth.ui.phone.PhoneVerificationActivity.AUTO_RETRIEVAL_TIMEOUT_MILLIS;
import static com.firebase.ui.auth.ui.phone.PhoneVerificationActivity.ERROR_INVALID_PHONE;
import static com.firebase.ui.auth.ui.phone.PhoneVerificationActivity.ERROR_INVALID_VERIFICATION;
-import static com.firebase.ui.auth.ui.phone.PhoneTestConstants.PHONE;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
@@ -84,6 +81,7 @@ public class PhoneVerificationActivityTest {
private Button mSendCodeButton;
private EditText mPhoneEditText;
private CountryListSpinner mCountryListSpinner;
+
@Captor
ArgumentCaptor callbacksArgumentCaptor;
@Mock
@@ -150,9 +148,9 @@ public void testBadPhoneNumber_showsInlineError() {
}
@Test
- @Config(shadows = {BaseHelperShadow.class, ActivityHelperShadow.class})
+ @Config(shadows = {AuthInstancesShadow.class})
public void testVerifyPhoneNumberInvalidPhoneException_showsInlineError() {
- reset(BaseHelperShadow.sPhoneAuthProvider);
+ reset(AuthInstancesShadow.sPhoneAuthProvider);
mActivity.verifyPhoneNumber(PHONE, false);
AlertDialog alert = ShadowAlertDialog.getLatestAlertDialog();
@@ -161,7 +159,7 @@ public void testVerifyPhoneNumberInvalidPhoneException_showsInlineError() {
assertEquals(mActivity.getString(R.string.verifying), sAlert.getMessage());
//was upstream method invoked
- verify(ActivityHelperShadow.sPhoneAuthProvider).verifyPhoneNumber(eq(PHONE), eq
+ verify(AuthInstancesShadow.sPhoneAuthProvider).verifyPhoneNumber(eq(PHONE), eq
(AUTO_RETRIEVAL_TIMEOUT_MILLIS), eq(TimeUnit.MILLISECONDS), eq(mActivity),
callbacksArgumentCaptor.capture(), isNull(PhoneAuthProvider.ForceResendingToken
.class));
@@ -176,12 +174,12 @@ public void testVerifyPhoneNumberInvalidPhoneException_showsInlineError() {
}
@Test
- @Config(shadows = {BaseHelperShadow.class, ActivityHelperShadow.class})
+ @Config(shadows = {AuthInstancesShadow.class})
public void testVerifyPhoneNumberNoMsgException_showsAlertDialog() {
- reset(BaseHelperShadow.sPhoneAuthProvider);
+ reset(AuthInstancesShadow.sPhoneAuthProvider);
mActivity.verifyPhoneNumber(PHONE, false);
- verify(ActivityHelperShadow.sPhoneAuthProvider).verifyPhoneNumber(eq(PHONE), eq
+ verify(AuthInstancesShadow.sPhoneAuthProvider).verifyPhoneNumber(eq(PHONE), eq
(AUTO_RETRIEVAL_TIMEOUT_MILLIS), eq(TimeUnit.MILLISECONDS), eq(mActivity),
callbacksArgumentCaptor.capture(), isNull(PhoneAuthProvider.ForceResendingToken
.class));
@@ -196,17 +194,17 @@ public void testVerifyPhoneNumberNoMsgException_showsAlertDialog() {
}
@Test
- @Config(shadows = {BaseHelperShadow.class, ActivityHelperShadow.class})
+ @Config(shadows = {AuthInstancesShadow.class})
public void testVerifyPhoneNumber_success() {
- reset(BaseHelperShadow.sPhoneAuthProvider);
+ reset(AuthInstancesShadow.sPhoneAuthProvider);
testSendConfirmationCode();
}
@Test
- @Config(shadows = {BaseHelperShadow.class, ActivityHelperShadow.class})
+ @Config(shadows = {AuthInstancesShadow.class})
public void testSubmitCode_badCodeShowsAlertDialog() {
- reset(BaseHelperShadow.sPhoneAuthProvider);
- when(ActivityHelperShadow.sFirebaseAuth.signInWithCredential(any(AuthCredential.class)))
+ reset(AuthInstancesShadow.sPhoneAuthProvider);
+ when(AuthInstancesShadow.sFirebaseAuth.signInWithCredential(any(AuthCredential.class)))
.thenReturn(new AutoCompleteTask(null, true, new
FirebaseAuthInvalidCredentialsException(ERROR_INVALID_VERIFICATION,
"any_msg")));
@@ -229,9 +227,9 @@ public void testSubmitCode_badCodeShowsAlertDialog() {
}
@Test
- @Config(shadows = {BaseHelperShadow.class, ActivityHelperShadow.class})
+ @Config(shadows = {AuthInstancesShadow.class})
public void testresendCode_invokesUpstream() {
- reset(BaseHelperShadow.sPhoneAuthProvider);
+ reset(AuthInstancesShadow.sPhoneAuthProvider);
testSendConfirmationCode();
//test resend code invisible
@@ -249,25 +247,25 @@ public void testresendCode_invokesUpstream() {
assertEquals(View.GONE, r.getVisibility());
//verify resend code was called
- verify(ActivityHelperShadow.sPhoneAuthProvider).verifyPhoneNumber(eq(PHONE), eq
+ verify(AuthInstancesShadow.sPhoneAuthProvider).verifyPhoneNumber(eq(PHONE), eq
(AUTO_RETRIEVAL_TIMEOUT_MILLIS), eq(TimeUnit.MILLISECONDS), eq(mActivity),
callbacksArgumentCaptor.capture(), eq(forceResendingToken));
}
@Test
- @Config(shadows = {BaseHelperShadow.class, ActivityHelperShadow.class})
+ @Config(shadows = {AuthInstancesShadow.class})
public void testAutoVerify() {
- reset(BaseHelperShadow.sPhoneAuthProvider);
- reset(BaseHelperShadow.sSaveSmartLock);
- reset(BaseHelperShadow.sFirebaseAuth);
+ reset(AuthInstancesShadow.sPhoneAuthProvider);
+ reset(AuthInstancesShadow.sSaveSmartLock);
+ reset(AuthInstancesShadow.sFirebaseAuth);
- when(BaseHelperShadow.sFirebaseUser.getPhoneNumber()).thenReturn(PHONE);
- when(BaseHelperShadow.sFirebaseUser.getEmail()).thenReturn(null);
- when(ActivityHelperShadow.sFirebaseAuth.signInWithCredential(any(AuthCredential.class)))
+ when(AuthInstancesShadow.sFirebaseUser.getPhoneNumber()).thenReturn(PHONE);
+ when(AuthInstancesShadow.sFirebaseUser.getEmail()).thenReturn(null);
+ when(AuthInstancesShadow.sFirebaseAuth.signInWithCredential(any(AuthCredential.class)))
.thenReturn(new AutoCompleteTask(FakeAuthResult.INSTANCE
, true, null));
mActivity.verifyPhoneNumber(PHONE, false);
- verify(ActivityHelperShadow.sPhoneAuthProvider).verifyPhoneNumber(eq(PHONE), eq
+ verify(AuthInstancesShadow.sPhoneAuthProvider).verifyPhoneNumber(eq(PHONE), eq
(AUTO_RETRIEVAL_TIMEOUT_MILLIS), eq(TimeUnit.MILLISECONDS), eq(mActivity),
callbacksArgumentCaptor.capture(), isNull(PhoneAuthProvider.ForceResendingToken
.class));
@@ -276,22 +274,21 @@ public void testAutoVerify() {
= callbacksArgumentCaptor.getValue();
onVerificationStateChangedCallbacks.onVerificationCompleted(credential);
- verify(ActivityHelperShadow.sFirebaseAuth).signInWithCredential(any(AuthCredential.class));
+ verify(AuthInstancesShadow.sFirebaseAuth).signInWithCredential(any(AuthCredential.class));
}
@Test
- @Config(shadows = {BaseHelperShadow.class, ActivityHelperShadow.class})
+ @Config(shadows = {AuthInstancesShadow.class})
public void testSMSAutoRetrieval() {
- reset(BaseHelperShadow.sPhoneAuthProvider);
- reset(BaseHelperShadow.sSaveSmartLock);
+ reset(AuthInstancesShadow.sPhoneAuthProvider);
+ reset(AuthInstancesShadow.sSaveSmartLock);
when(credential.getSmsCode()).thenReturn("123456");
- when(BaseHelperShadow.sFirebaseUser.getPhoneNumber()).thenReturn(PHONE);
- when(BaseHelperShadow.sFirebaseUser.getEmail()).thenReturn(null);
+ when(AuthInstancesShadow.sFirebaseUser.getPhoneNumber()).thenReturn(PHONE);
+ when(AuthInstancesShadow.sFirebaseUser.getEmail()).thenReturn(null);
- when(ActivityHelperShadow.sFirebaseAuth.signInWithCredential(any(AuthCredential.class)))
- .thenReturn(new AutoCompleteTask(FakeAuthResult.INSTANCE
- , true, null));
+ when(AuthInstancesShadow.sFirebaseAuth.signInWithCredential(any(AuthCredential.class)))
+ .thenReturn(new AutoCompleteTask(FakeAuthResult.INSTANCE, true, null));
PhoneAuthProvider.OnVerificationStateChangedCallbacks callbacks =
testSendConfirmationCode();
callbacks.onVerificationCompleted(credential);
@@ -301,13 +298,13 @@ public void testSMSAutoRetrieval() {
//verify confirmation code set
assertEquals("1 2 3 4 5 6", mConfirmationCodeEditText.getText().toString());
//verify credential saves
- verify(ActivityHelperShadow.sFirebaseAuth).signInWithCredential(credential);
+ verify(AuthInstancesShadow.sFirebaseAuth).signInWithCredential(credential);
}
@Test
- @Config(shadows = {BaseHelperShadow.class, ActivityHelperShadow.class})
+ @Config(shadows = {AuthInstancesShadow.class})
public void testEditPhoneNumber_togglesFragments() {
- reset(BaseHelperShadow.sPhoneAuthProvider);
+ reset(AuthInstancesShadow.sPhoneAuthProvider);
testSendConfirmationCode();
TextView mEditPhoneTextView = (TextView) mActivity.findViewById(R.id.edit_phone_number);
mEditPhoneTextView.performClick();
@@ -326,7 +323,7 @@ public void testEditPhoneNumber_togglesFragments() {
private PhoneAuthProvider.OnVerificationStateChangedCallbacks testSendConfirmationCode() {
mActivity.verifyPhoneNumber(PHONE, false);
- verify(ActivityHelperShadow.sPhoneAuthProvider).verifyPhoneNumber(eq(PHONE), eq
+ verify(AuthInstancesShadow.sPhoneAuthProvider).verifyPhoneNumber(eq(PHONE), eq
(AUTO_RETRIEVAL_TIMEOUT_MILLIS), eq(TimeUnit.MILLISECONDS), eq(mActivity),
callbacksArgumentCaptor.capture(), isNull(PhoneAuthProvider.ForceResendingToken
.class));
diff --git a/build.gradle b/build.gradle
index b87124738..71e319871 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,19 +2,21 @@ apply from: 'constants.gradle'
buildscript {
repositories {
+ google()
jcenter()
mavenLocal()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.1'
- classpath 'com.google.gms:google-services:3.0.0'
+ classpath 'com.google.gms:google-services:3.1.0'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.7.3'
}
}
allprojects {
repositories {
+ google()
jcenter()
mavenLocal()
mavenCentral()
diff --git a/constants.gradle b/constants.gradle
index 4106025f8..7e9a3781c 100644
--- a/constants.gradle
+++ b/constants.gradle
@@ -1,15 +1,15 @@
project.ext {
submodules = ['database', 'auth', 'storage']
group = 'com.firebaseui'
- version = '2.0.0-SNAPSHOT'
+ version = '2.0.1'
pomdesc = 'Firebase UI Android'
compileSdk = 25
targetSdk = 25
minSdk = 14
- buildTools = '25.0.3'
+ buildTools = '25.0.3' // Remember to also update in .travis.yml
- firebaseVersion = '11.0.0'
- supportLibraryVersion = '25.3.1'
+ firebaseVersion = '11.0.1'
+ supportLibraryVersion = '25.4.0'
}
diff --git a/database/README.md b/database/README.md
index 9b54a4263..8b0d06788 100644
--- a/database/README.md
+++ b/database/README.md
@@ -27,7 +27,7 @@ public static class Chat {
// Needed for Firebase
}
- public Chat(String name, String message, String uid) {
+ public Chat(String name, String uid, String message) {
mName = name;
mMessage = message;
mUid = uid;
diff --git a/database/src/main/java/com/firebase/ui/database/FirebaseListAdapter.java b/database/src/main/java/com/firebase/ui/database/FirebaseListAdapter.java
index 07f5a76bf..08b90c8bb 100644
--- a/database/src/main/java/com/firebase/ui/database/FirebaseListAdapter.java
+++ b/database/src/main/java/com/firebase/ui/database/FirebaseListAdapter.java
@@ -1,8 +1,10 @@
package com.firebase.ui.database;
import android.app.Activity;
+import android.content.Context;
import android.support.annotation.LayoutRes;
import android.util.Log;
+import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
@@ -27,21 +29,21 @@
public abstract class FirebaseListAdapter extends BaseAdapter implements FirebaseAdapter {
private static final String TAG = "FirebaseListAdapter";
- protected final Activity mActivity;
+ protected final Context mContext;
protected final ObservableSnapshotArray mSnapshots;
protected final int mLayout;
/**
- * @param activity The {@link Activity} containing the {@link ListView}
- * @param modelLayout This is the layout used to represent a single list item. You will be
- * responsible for populating an instance of the corresponding view with the
- * data from an instance of modelClass.
+ * @param context The {@link Activity} containing the {@link ListView}
* @param snapshots The data used to populate the adapter
+ * @param modelLayout This is the layout used to represent a single list item. You will be
+ * responsible for populating an instance of the corresponding view with the
+ * data from an instance of modelClass.
*/
- public FirebaseListAdapter(Activity activity,
+ public FirebaseListAdapter(Context context,
ObservableSnapshotArray snapshots,
@LayoutRes int modelLayout) {
- mActivity = activity;
+ mContext = context;
mSnapshots = snapshots;
mLayout = modelLayout;
@@ -54,23 +56,23 @@ public FirebaseListAdapter(Activity activity,
* @param query The Firebase location to watch for data changes. Can also be a slice of a
* location, using some combination of {@code limit()}, {@code startAt()}, and
* {@code endAt()}. Note, this can also be a {@link DatabaseReference}.
- * @see #FirebaseListAdapter(Activity, ObservableSnapshotArray, int)
+ * @see #FirebaseListAdapter(Context, ObservableSnapshotArray, int)
*/
- public FirebaseListAdapter(Activity activity,
+ public FirebaseListAdapter(Context context,
SnapshotParser parser,
@LayoutRes int modelLayout,
Query query) {
- this(activity, new FirebaseArray<>(query, parser), modelLayout);
+ this(context, new FirebaseArray<>(query, parser), modelLayout);
}
/**
- * @see #FirebaseListAdapter(Activity, SnapshotParser, int, Query)
+ * @see #FirebaseListAdapter(Context, SnapshotParser, int, Query)
*/
- public FirebaseListAdapter(Activity activity,
+ public FirebaseListAdapter(Context context,
Class modelClass,
@LayoutRes int modelLayout,
Query query) {
- this(activity, new ClassSnapshotParser<>(modelClass), modelLayout, query);
+ this(context, new ClassSnapshotParser<>(modelClass), modelLayout, query);
}
@Override
@@ -126,7 +128,7 @@ public long getItemId(int i) {
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
if (view == null) {
- view = mActivity.getLayoutInflater().inflate(mLayout, viewGroup, false);
+ view = LayoutInflater.from(mContext).inflate(mLayout, viewGroup, false);
}
T model = getItem(position);
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index abd8d2b92..ccc774a9f 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index d6bab735a..d98748dae 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Mon Apr 24 13:49:38 PDT 2017
+#Wed Jun 14 20:14:54 PDT 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.0-all.zip
diff --git a/gradlew b/gradlew
index 4453ccea3..cccdd3d51 100755
--- a/gradlew
+++ b/gradlew
@@ -33,11 +33,11 @@ DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
-warn ( ) {
+warn () {
echo "$*"
}
-die ( ) {
+die () {
echo
echo "$*"
echo
@@ -155,7 +155,7 @@ if $cygwin ; then
fi
# Escape application args
-save ( ) {
+save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
diff --git a/library/google-services.json b/library/google-services.json
index ca94ded87..3a601f53b 100644
--- a/library/google-services.json
+++ b/library/google-services.json
@@ -1,43 +1,35 @@
{
"project_info": {
- "project_number": "",
- "firebase_url": "",
- "project_id": "",
- "storage_bucket": ""
+ "project_number": "123456789000",
+ "firebase_url": "https://firebase-ui.firebaseio.com",
+ "project_id": "firebase-ui",
+ "storage_bucket": "firebase-ui.appspot.com"
},
"client": [
{
"client_info": {
- "mobilesdk_app_id": "",
+ "mobilesdk_app_id": "1:123456789000:android:f1bf012572b04063",
"android_client_info": {
"package_name": "com.firebase.uidemo"
}
},
"oauth_client": [
{
- "client_id": "",
+ "client_id": "123456789000-hjugbg6ud799v4c49dim8ce2usclthar.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "com.firebase.uidemo",
- "certificate_hash": ""
+ "certificate_hash": "4C20644DE36B8F89D25650C7D1FF9FBAE650FDF7"
}
},
{
- "client_id": "316052285104-forh4hpe453p0u45ij8j68hk61pjfnvf.apps.googleusercontent.com",
- "client_type": 1,
- "android_info": {
- "package_name": "com.firebase.uidemo",
- "certificate_hash": "FE3B409037A5F3C394E4DA3F697A1A737205EC67"
- }
- },
- {
- "client_id": "316052285104-rjq9h4q1gbv4cio1nbfht08p4fl3977d.apps.googleusercontent.com",
+ "client_id": "123456789000-e4uksm38sne0bqrj6uvkbo4oiu4hvigl.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
- "current_key": ""
+ "current_key": "AIzbSzCn1N6LWIe6wthYyrgUUSAlUsdqMb-wvTo"
}
],
"services": {
diff --git a/library/quality/lint-baseline.xml b/library/quality/lint-baseline.xml
index 99eba2aad..3d4f73381 100644
--- a/library/quality/lint-baseline.xml
+++ b/library/quality/lint-baseline.xml
@@ -29,4 +29,25 @@
column="13"/>
+
+
+
+
+
diff --git a/library/quality/quality.gradle b/library/quality/quality.gradle
index 0f84db913..472b13742 100644
--- a/library/quality/quality.gradle
+++ b/library/quality/quality.gradle
@@ -7,11 +7,11 @@ def configDir = "${project.rootDir}/library/quality"
def reportsDir = "${project.buildDir}/reports"
checkstyle {
- toolVersion = '7.7'
+ toolVersion = '7.8'
}
pmd {
- toolVersion = '5.6.0'
+ toolVersion = '5.7.0'
}
task checkstyle(type: Checkstyle) {