diff --git a/README.md b/README.md index 161c0d066..7aaa4374d 100644 --- a/README.md +++ b/README.md @@ -50,16 +50,19 @@ libraries. ```groovy dependencies { // FirebaseUI for Firebase Realtime Database - implementation 'com.firebaseui:firebase-ui-database:4.1.0' + implementation 'com.firebaseui:firebase-ui-database:4.2.0' // FirebaseUI for Cloud Firestore - implementation 'com.firebaseui:firebase-ui-firestore:4.1.0' + implementation 'com.firebaseui:firebase-ui-firestore:4.2.0' // FirebaseUI for Firebase Auth - implementation 'com.firebaseui:firebase-ui-auth:4.1.0' + implementation 'com.firebaseui:firebase-ui-auth:4.2.0' + + // FirebaseUI for Firebase Auth (GitHub provider) + implementation 'com.firebaseui:firebase-ui-auth-github:4.2.0' // FirebaseUI for Cloud Storage - implementation 'com.firebaseui:firebase-ui-storage:4.1.0' + implementation 'com.firebaseui:firebase-ui-storage:4.2.0' } ``` @@ -102,15 +105,15 @@ versions. This means that FirebaseUI has independent dependencies on each of the For best results, your app should depend on a version of each dependency with the same major version number as the version used by FirebaseUI. -As of version `4.1.0`, FirebaseUI has the following dependency versions: +As of version `4.2.0`, FirebaseUI has the following dependency versions: | Library | Version | |----------------------|--------------------------------| -| `firebase-auth` | 16.0.1 | -| `play-services-auth` | 15.0.1 | -| `firebase-database` | 16.0.1 | -| `firebase-firestore` | 17.0.1 | -| `firebase-storage` | 16.0.1 | +| `firebase-auth` | 16.0.3 | +| `play-services-auth` | 16.0.0 | +| `firebase-database` | 16.0.2 | +| `firebase-firestore` | 17.1.0 | +| `firebase-storage` | 16.0.2 | ### Upgrading dependencies diff --git a/app/build.gradle.kts b/app/build.gradle.kts index fe8975455..697e455a8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -7,7 +7,7 @@ android { } buildTypes { - getByName("release") { + named("release").configure { // For the purposes of the sample, allow testing of a proguarded release build // using the debug key signingConfig = signingConfigs["debug"] @@ -32,6 +32,7 @@ dependencies { implementation(Config.Libs.Support.multidex) implementation(project(":auth")) + implementation(project(":auth-github")) implementation(project(":firestore")) implementation(project(":database")) implementation(project(":storage")) @@ -55,6 +56,7 @@ dependencies { implementation(Config.Libs.Misc.butterKnife) annotationProcessor(Config.Libs.Misc.butterKnifeCompiler) debugImplementation(Config.Libs.Misc.leakCanary) + debugImplementation(Config.Libs.Misc.leakCanaryFragments) releaseImplementation(Config.Libs.Misc.leakCanaryNoop) testImplementation(Config.Libs.Misc.leakCanaryNoop) } diff --git a/app/src/main/java/com/firebase/uidemo/FirebaseUIDemo.java b/app/src/main/java/com/firebase/uidemo/FirebaseUIDemo.java index f912d4a50..44c21f6d8 100644 --- a/app/src/main/java/com/firebase/uidemo/FirebaseUIDemo.java +++ b/app/src/main/java/com/firebase/uidemo/FirebaseUIDemo.java @@ -1,23 +1,15 @@ package com.firebase.uidemo; -import android.content.Context; import android.support.multidex.MultiDexApplication; import android.support.v7.app.AppCompatDelegate; import com.squareup.leakcanary.LeakCanary; -import com.squareup.leakcanary.RefWatcher; public class FirebaseUIDemo extends MultiDexApplication { - private RefWatcher mRefWatcher; - static { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO); } - public static RefWatcher getRefWatcher(Context context) { - return ((FirebaseUIDemo) context.getApplicationContext()).mRefWatcher; - } - @Override public void onCreate() { super.onCreate(); @@ -26,6 +18,6 @@ public void onCreate() { // You should not init your app in this process. return; } - mRefWatcher = LeakCanary.install(this); + LeakCanary.install(this); } } diff --git a/app/src/main/java/com/firebase/uidemo/auth/AnonymousUpgradeActivity.java b/app/src/main/java/com/firebase/uidemo/auth/AnonymousUpgradeActivity.java index f2cbf870c..db106193d 100644 --- a/app/src/main/java/com/firebase/uidemo/auth/AnonymousUpgradeActivity.java +++ b/app/src/main/java/com/firebase/uidemo/auth/AnonymousUpgradeActivity.java @@ -3,6 +3,7 @@ import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.text.TextUtils; import android.util.Log; @@ -52,7 +53,7 @@ public class AnonymousUpgradeActivity extends AppCompatActivity { private AuthCredential mPendingCredential; @Override - protected void onCreate(Bundle savedInstanceState) { + protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_anonymous_upgrade); ButterKnife.bind(this); @@ -82,7 +83,6 @@ public void startAuthUI() { Intent intent = AuthUI.getInstance().createSignInIntentBuilder() .setLogo(R.drawable.firebase_auth_120dp) .setAvailableProviders(providers) - .setIsSmartLockEnabled(false) .enableAnonymousUsersAutoUpgrade() .build(); startActivityForResult(intent, RC_SIGN_IN); @@ -127,7 +127,7 @@ public void onComplete(@NonNull Task task) { } @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { IdpResponse response = IdpResponse.fromResultIntent(data); @@ -137,12 +137,13 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { } if (resultCode == RESULT_OK) { setStatus("Signed in as " + getUserIdentifier(FirebaseAuth.getInstance().getCurrentUser())); + } else if (response.getError().getErrorCode() == ErrorCodes.ANONYMOUS_UPGRADE_MERGE_CONFLICT) { + setStatus("Merge conflict: user already exists."); + mResolveMergeButton.setEnabled(true); + mPendingCredential = response.getCredentialForLinking(); } else { - if (response.getError().getErrorCode() == ErrorCodes.ANONYMOUS_UPGRADE_MERGE_CONFLICT) { - setStatus("Merge conflict: user already exists."); - mResolveMergeButton.setEnabled(true); - mPendingCredential = response.getCredentialForLinking(); - } + Toast.makeText(this, "Auth error, see logs", Toast.LENGTH_SHORT).show(); + Log.w(TAG, "Error: " + response.getError().getMessage(), response.getError()); } updateUI(); diff --git a/app/src/main/java/com/firebase/uidemo/auth/AuthUiActivity.java b/app/src/main/java/com/firebase/uidemo/auth/AuthUiActivity.java index c1aeb0632..0b18950ce 100644 --- a/app/src/main/java/com/firebase/uidemo/auth/AuthUiActivity.java +++ b/app/src/main/java/com/firebase/uidemo/auth/AuthUiActivity.java @@ -70,6 +70,7 @@ public class AuthUiActivity extends AppCompatActivity { @BindView(R.id.github_provider) CheckBox mUseGitHubProvider; @BindView(R.id.email_provider) CheckBox mUseEmailProvider; @BindView(R.id.phone_provider) CheckBox mUsePhoneProvider; + @BindView(R.id.anonymous_provider) CheckBox mUseAnonymousProvider; @BindView(R.id.default_theme) RadioButton mDefaultTheme; @BindView(R.id.green_theme) RadioButton mGreenTheme; @@ -103,7 +104,8 @@ public class AuthUiActivity extends AppCompatActivity { @BindView(R.id.allow_new_email_accounts) CheckBox mAllowNewEmailAccounts; @BindView(R.id.require_name) CheckBox mRequireName; - public static Intent createIntent(Context context) { + @NonNull + public static Intent createIntent(@NonNull Context context) { return new Intent(context, AuthUiActivity.class); } @@ -177,7 +179,7 @@ public void onCheckedChanged(CompoundButton compoundButton, boolean checked) { } @OnClick(R.id.sign_in) - public void signIn(View view) { + public void signIn() { startActivityForResult( AuthUI.getInstance().createSignInIntentBuilder() .setTheme(getSelectedTheme()) @@ -192,7 +194,7 @@ public void signIn(View view) { } @OnClick(R.id.sign_in_silent) - public void silentSignIn(View view) { + public void silentSignIn() { AuthUI.getInstance().silentSignIn(this, getSelectedProviders()) .addOnCompleteListener(this, new OnCompleteListener() { @Override @@ -207,7 +209,7 @@ public void onComplete(@NonNull Task task) { } @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { handleSignInResponse(resultCode, data); @@ -224,8 +226,8 @@ protected void onResume() { } } - private void handleSignInResponse(int resultCode, Intent data) { - final IdpResponse response = IdpResponse.fromResultIntent(data); + private void handleSignInResponse(int resultCode, @Nullable Intent data) { + IdpResponse response = IdpResponse.fromResultIntent(data); // Successfully signed in if (resultCode == RESULT_OK) { @@ -249,7 +251,7 @@ private void handleSignInResponse(int resultCode, Intent data) { } } - private void startSignedInActivity(IdpResponse response) { + private void startSignedInActivity(@Nullable IdpResponse response) { startActivity(SignedInActivity.createIntent(this, response)); } @@ -319,6 +321,10 @@ private List getSelectedProviders() { selectedProviders.add(new IdpConfig.PhoneBuilder().build()); } + if (mUseAnonymousProvider.isChecked()) { + selectedProviders.add(new IdpConfig.AnonymousBuilder().build()); + } + return selectedProviders; } 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 f921f310c..e0215891e 100644 --- a/app/src/main/java/com/firebase/uidemo/auth/SignedInActivity.java +++ b/app/src/main/java/com/firebase/uidemo/auth/SignedInActivity.java @@ -67,9 +67,10 @@ public class SignedInActivity extends AppCompatActivity { @BindView(R.id.user_enabled_providers) TextView mEnabledProviders; @BindView(R.id.user_is_new) TextView mIsNewUser; - public static Intent createIntent(Context context, IdpResponse idpResponse) { + @NonNull + public static Intent createIntent(@NonNull Context context, @Nullable IdpResponse response) { return new Intent().setClass(context, SignedInActivity.class) - .putExtra(ExtraConstants.IDP_RESPONSE, idpResponse); + .putExtra(ExtraConstants.IDP_RESPONSE, response); } @Override @@ -164,7 +165,7 @@ private void populateProfile(@Nullable IdpResponse response) { List providers = new ArrayList<>(); if (user.getProviderData().isEmpty()) { - providers.add("Anonymous"); + providers.add(getString(R.string.providers_anonymous)); } else { for (UserInfo info : user.getProviderData()) { switch (info.getProviderId()) { diff --git a/app/src/main/java/com/firebase/uidemo/database/AbstractChat.java b/app/src/main/java/com/firebase/uidemo/database/AbstractChat.java index 31db15c97..46335a011 100644 --- a/app/src/main/java/com/firebase/uidemo/database/AbstractChat.java +++ b/app/src/main/java/com/firebase/uidemo/database/AbstractChat.java @@ -1,20 +1,32 @@ package com.firebase.uidemo.database; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + /** * Common interface for chat messages, helps share code between RTDB and Firestore examples. */ public abstract class AbstractChat { + @Nullable public abstract String getName(); + public abstract void setName(@Nullable String name); + + @Nullable public abstract String getMessage(); + public abstract void setMessage(@Nullable String message); + + @NonNull public abstract String getUid(); + public abstract void setUid(@NonNull String uid); + @Override - public abstract int hashCode(); + public abstract boolean equals(@Nullable Object obj); @Override - public abstract boolean equals(Object obj); + public abstract int hashCode(); } diff --git a/app/src/main/java/com/firebase/uidemo/database/ChatHolder.java b/app/src/main/java/com/firebase/uidemo/database/ChatHolder.java index 1d42e3d8e..7afa9f653 100644 --- a/app/src/main/java/com/firebase/uidemo/database/ChatHolder.java +++ b/app/src/main/java/com/firebase/uidemo/database/ChatHolder.java @@ -3,6 +3,8 @@ import android.graphics.PorterDuff; import android.graphics.drawable.GradientDrawable; import android.graphics.drawable.RotateDrawable; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.view.Gravity; @@ -26,7 +28,7 @@ public class ChatHolder extends RecyclerView.ViewHolder { private final int mGreen300; private final int mGray300; - public ChatHolder(View itemView) { + public ChatHolder(@NonNull View itemView) { super(itemView); mNameField = itemView.findViewById(R.id.name_text); mTextField = itemView.findViewById(R.id.message_text); @@ -38,19 +40,19 @@ public ChatHolder(View itemView) { mGray300 = ContextCompat.getColor(itemView.getContext(), R.color.material_gray_300); } - public void bind(AbstractChat chat) { + public void bind(@NonNull AbstractChat chat) { setName(chat.getName()); - setText(chat.getMessage()); + setMessage(chat.getMessage()); FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser(); setIsSender(currentUser != null && chat.getUid().equals(currentUser.getUid())); } - private void setName(String name) { + private void setName(@Nullable String name) { mNameField.setText(name); } - private void setText(String text) { + private void setMessage(@Nullable String text) { mTextField.setText(text); } diff --git a/app/src/main/java/com/firebase/uidemo/database/firestore/Chat.java b/app/src/main/java/com/firebase/uidemo/database/firestore/Chat.java index 3319309ea..c648e2e8e 100644 --- a/app/src/main/java/com/firebase/uidemo/database/firestore/Chat.java +++ b/app/src/main/java/com/firebase/uidemo/database/firestore/Chat.java @@ -1,5 +1,8 @@ package com.firebase.uidemo.database.firestore; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + import com.firebase.uidemo.database.AbstractChat; import com.google.firebase.firestore.IgnoreExtraProperties; import com.google.firebase.firestore.ServerTimestamp; @@ -17,47 +20,57 @@ public Chat() { // Needed for Firebase } - public Chat(String name, String message, String uid) { + public Chat(@Nullable String name, @Nullable String message, @NonNull String uid) { mName = name; mMessage = message; mUid = uid; } + @Override + @Nullable public String getName() { return mName; } - public void setName(String name) { + @Override + public void setName(@Nullable String name) { mName = name; } + @Override + @Nullable public String getMessage() { return mMessage; } - public void setMessage(String message) { + @Override + public void setMessage(@Nullable String message) { mMessage = message; } + @Override + @NonNull public String getUid() { return mUid; } - public void setUid(String uid) { + @Override + public void setUid(@NonNull String uid) { mUid = uid; } @ServerTimestamp + @Nullable public Date getTimestamp() { return mTimestamp; } - public void setTimestamp(Date timestamp) { + public void setTimestamp(@Nullable Date timestamp) { mTimestamp = timestamp; } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; @@ -78,6 +91,7 @@ public int hashCode() { return result; } + @NonNull @Override public String toString() { return "Chat{" + diff --git a/app/src/main/java/com/firebase/uidemo/database/firestore/FirestoreChatActivity.java b/app/src/main/java/com/firebase/uidemo/database/firestore/FirestoreChatActivity.java index 29db84973..ee66db727 100644 --- a/app/src/main/java/com/firebase/uidemo/database/firestore/FirestoreChatActivity.java +++ b/app/src/main/java/com/firebase/uidemo/database/firestore/FirestoreChatActivity.java @@ -155,7 +155,8 @@ public void onSendClick() { mMessageEdit.setText(""); } - protected RecyclerView.Adapter newAdapter() { + @NonNull + private RecyclerView.Adapter newAdapter() { FirestoreRecyclerOptions options = new FirestoreRecyclerOptions.Builder() .setQuery(sChatQuery, Chat.class) @@ -163,8 +164,9 @@ protected RecyclerView.Adapter newAdapter() { .build(); return new FirestoreRecyclerAdapter(options) { + @NonNull @Override - public ChatHolder onCreateViewHolder(ViewGroup parent, int viewType) { + public ChatHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { return new ChatHolder(LayoutInflater.from(parent.getContext()) .inflate(R.layout.message, parent, false)); } @@ -182,7 +184,7 @@ public void onDataChanged() { }; } - protected void onAddMessage(Chat chat) { + private void onAddMessage(@NonNull Chat chat) { sChatCollection.add(chat).addOnFailureListener(this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { diff --git a/app/src/main/java/com/firebase/uidemo/database/firestore/FirestorePagingActivity.java b/app/src/main/java/com/firebase/uidemo/database/firestore/FirestorePagingActivity.java index f3f92fe34..a74c99890 100644 --- a/app/src/main/java/com/firebase/uidemo/database/firestore/FirestorePagingActivity.java +++ b/app/src/main/java/com/firebase/uidemo/database/firestore/FirestorePagingActivity.java @@ -3,6 +3,7 @@ import android.arch.paging.PagedList; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; @@ -46,7 +47,7 @@ public class FirestorePagingActivity extends AppCompatActivity { private CollectionReference mItemsCollection; @Override - protected void onCreate(Bundle savedInstanceState) { + protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_firestore_paging); ButterKnife.bind(this); @@ -85,7 +86,7 @@ public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, @Override protected void onBindViewHolder(@NonNull ItemViewHolder holder, int position, - Item model) { + @NonNull Item model) { holder.bind(model); } @@ -116,13 +117,13 @@ protected void onLoadingStateChanged(@NonNull LoadingState state) { } @Override - public boolean onCreateOptionsMenu(Menu menu) { + public boolean onCreateOptionsMenu(@NonNull Menu menu) { getMenuInflater().inflate(R.menu.menu_firestore_paging, menu); return true; } @Override - public boolean onOptionsItemSelected(MenuItem item) { + public boolean onOptionsItemSelected(@NonNull MenuItem item) { if (item.getItemId() == R.id.item_add_data) { showToast("Adding data..."); createItems().addOnCompleteListener(this, new OnCompleteListener() { @@ -142,6 +143,7 @@ public void onComplete(@NonNull Task task) { return super.onOptionsItemSelected(item); } + @NonNull private Task createItems() { WriteBatch writeBatch = mFirestore.batch(); @@ -157,18 +159,18 @@ private Task createItems() { return writeBatch.commit(); } - private void showToast(String message) { + private void showToast(@NonNull String message) { Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); } public static class Item { - public String text; + @Nullable public String text; public int value; public Item() {} - public Item(String text, int value) { + public Item(@Nullable String text, int value) { this.text = text; this.value = value; } @@ -183,12 +185,12 @@ public static class ItemViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.item_value) TextView mValueView; - ItemViewHolder(View itemView) { + ItemViewHolder(@NonNull View itemView) { super(itemView); ButterKnife.bind(this, itemView); } - void bind(Item item) { + void bind(@NonNull Item item) { mTextView.setText(item.text); mValueView.setText(String.valueOf(item.value)); } diff --git a/app/src/main/java/com/firebase/uidemo/database/realtime/Chat.java b/app/src/main/java/com/firebase/uidemo/database/realtime/Chat.java index 42e552402..aea91cabf 100644 --- a/app/src/main/java/com/firebase/uidemo/database/realtime/Chat.java +++ b/app/src/main/java/com/firebase/uidemo/database/realtime/Chat.java @@ -1,5 +1,8 @@ package com.firebase.uidemo.database.realtime; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + import com.firebase.uidemo.database.AbstractChat; import com.google.firebase.database.IgnoreExtraProperties; @@ -13,38 +16,44 @@ public Chat() { // Needed for Firebase } - public Chat(String name, String message, String uid) { + public Chat(@Nullable String name, @Nullable String message, @NonNull String uid) { mName = name; mMessage = message; mUid = uid; } + @Override + @Nullable public String getName() { return mName; } - public void setName(String name) { + public void setName(@Nullable String name) { mName = name; } + @Override + @Nullable public String getMessage() { return mMessage; } - public void setMessage(String message) { + public void setMessage(@Nullable String message) { mMessage = message; } + @Override + @NonNull public String getUid() { return mUid; } - public void setUid(String uid) { + public void setUid(@NonNull String uid) { mUid = uid; } @Override - public boolean equals(Object o) { + public boolean equals(@Nullable Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; @@ -64,6 +73,7 @@ public int hashCode() { } @Override + @NonNull public String toString() { return "Chat{" + "mName='" + mName + '\'' + diff --git a/app/src/main/java/com/firebase/uidemo/database/realtime/RealtimeDbChatActivity.java b/app/src/main/java/com/firebase/uidemo/database/realtime/RealtimeDbChatActivity.java index 10e2bb1db..ce3b93efd 100644 --- a/app/src/main/java/com/firebase/uidemo/database/realtime/RealtimeDbChatActivity.java +++ b/app/src/main/java/com/firebase/uidemo/database/realtime/RealtimeDbChatActivity.java @@ -46,6 +46,7 @@ public class RealtimeDbChatActivity extends AppCompatActivity /** * Get the last 50 chat messages. */ + @NonNull protected static final Query sChatQuery = FirebaseDatabase.getInstance().getReference().child("chats").limitToLast(50); @@ -132,6 +133,7 @@ public void onSendClick() { mMessageEdit.setText(""); } + @NonNull protected RecyclerView.Adapter newAdapter() { FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder() @@ -159,7 +161,7 @@ public void onDataChanged() { }; } - protected void onAddMessage(Chat chat) { + protected void onAddMessage(@NonNull Chat chat) { sChatQuery.getRef().push().setValue(chat, new DatabaseReference.CompletionListener() { @Override public void onComplete(DatabaseError error, DatabaseReference reference) { diff --git a/app/src/main/java/com/firebase/uidemo/database/realtime/RealtimeDbChatIndexActivity.java b/app/src/main/java/com/firebase/uidemo/database/realtime/RealtimeDbChatIndexActivity.java index dd956b91f..c7421a798 100644 --- a/app/src/main/java/com/firebase/uidemo/database/realtime/RealtimeDbChatIndexActivity.java +++ b/app/src/main/java/com/firebase/uidemo/database/realtime/RealtimeDbChatIndexActivity.java @@ -16,6 +16,7 @@ public class RealtimeDbChatIndexActivity extends RealtimeDbChatActivity { private DatabaseReference mChatIndicesRef; + @NonNull @Override protected FirebaseRecyclerAdapter newAdapter() { mChatIndicesRef = FirebaseDatabase.getInstance() @@ -31,8 +32,9 @@ protected FirebaseRecyclerAdapter newAdapter() { .build(); return new FirebaseRecyclerAdapter(options) { + @NonNull @Override - public ChatHolder onCreateViewHolder(ViewGroup parent, int viewType) { + public ChatHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { return new ChatHolder(LayoutInflater.from(parent.getContext()) .inflate(R.layout.message, parent, false)); } @@ -51,7 +53,7 @@ public void onDataChanged() { } @Override - protected void onAddMessage(Chat chat) { + protected void onAddMessage(@NonNull Chat chat) { DatabaseReference chatRef = sChatQuery.getRef().push(); mChatIndicesRef.child(chatRef.getKey()).setValue(true); chatRef.setValue(chat); diff --git a/app/src/main/java/com/firebase/uidemo/storage/ImageActivity.java b/app/src/main/java/com/firebase/uidemo/storage/ImageActivity.java index a48c10d08..290161d17 100644 --- a/app/src/main/java/com/firebase/uidemo/storage/ImageActivity.java +++ b/app/src/main/java/com/firebase/uidemo/storage/ImageActivity.java @@ -69,7 +69,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { } @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { + public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_CHOOSE_PHOTO) { diff --git a/app/src/main/java/com/firebase/uidemo/storage/MyAppGlideModule.java b/app/src/main/java/com/firebase/uidemo/storage/MyAppGlideModule.java index ccbffbbf8..1a3c97b6a 100644 --- a/app/src/main/java/com/firebase/uidemo/storage/MyAppGlideModule.java +++ b/app/src/main/java/com/firebase/uidemo/storage/MyAppGlideModule.java @@ -1,6 +1,7 @@ package com.firebase.uidemo.storage; import android.content.Context; +import android.support.annotation.NonNull; import com.bumptech.glide.Glide; import com.bumptech.glide.Registry; @@ -19,7 +20,9 @@ public class MyAppGlideModule extends AppGlideModule { @Override - public void registerComponents(Context context, Glide glide, Registry registry) { + public void registerComponents(@NonNull Context context, + @NonNull Glide glide, + @NonNull Registry registry) { // Register FirebaseImageLoader to handle StorageReference registry.append(StorageReference.class, InputStream.class, new FirebaseImageLoader.Factory()); diff --git a/app/src/main/java/com/firebase/uidemo/util/ConfigurationUtils.java b/app/src/main/java/com/firebase/uidemo/util/ConfigurationUtils.java index 18f3f7d0b..63809340e 100644 --- a/app/src/main/java/com/firebase/uidemo/util/ConfigurationUtils.java +++ b/app/src/main/java/com/firebase/uidemo/util/ConfigurationUtils.java @@ -2,7 +2,7 @@ import android.content.Context; -import android.content.res.Resources; +import android.support.annotation.NonNull; import com.firebase.ui.auth.AuthUI; import com.firebase.uidemo.R; @@ -11,19 +11,23 @@ import java.util.Arrays; import java.util.List; -public class ConfigurationUtils { +public final class ConfigurationUtils { - public static boolean isGoogleMisconfigured(Context context) { + private ConfigurationUtils() { + throw new AssertionError("No instance for you!"); + } + + public static boolean isGoogleMisconfigured(@NonNull Context context) { return AuthUI.UNCONFIGURED_CONFIG_VALUE.equals( context.getString(R.string.default_web_client_id)); } - public static boolean isFacebookMisconfigured(Context context) { + public static boolean isFacebookMisconfigured(@NonNull Context context) { return AuthUI.UNCONFIGURED_CONFIG_VALUE.equals( context.getString(R.string.facebook_application_id)); } - public static boolean isTwitterMisconfigured(Context context) { + public static boolean isTwitterMisconfigured(@NonNull Context context) { List twitterConfigs = Arrays.asList( context.getString(R.string.twitter_consumer_key), context.getString(R.string.twitter_consumer_secret) @@ -32,7 +36,7 @@ public static boolean isTwitterMisconfigured(Context context) { return twitterConfigs.contains(AuthUI.UNCONFIGURED_CONFIG_VALUE); } - public static boolean isGitHubMisconfigured(Context context) { + public static boolean isGitHubMisconfigured(@NonNull Context context) { List gitHubConfigs = Arrays.asList( context.getString(R.string.firebase_web_host), context.getString(R.string.github_client_id), @@ -42,7 +46,8 @@ public static boolean isGitHubMisconfigured(Context context) { return gitHubConfigs.contains(AuthUI.UNCONFIGURED_CONFIG_VALUE); } - public static List getConfiguredProviders(Context context) { + @NonNull + public static List getConfiguredProviders(@NonNull Context context) { List providers = new ArrayList<>(); providers.add(new AuthUI.IdpConfig.EmailBuilder().build()); providers.add(new AuthUI.IdpConfig.PhoneBuilder().build()); diff --git a/app/src/main/java/com/firebase/uidemo/util/SignInResultNotifier.java b/app/src/main/java/com/firebase/uidemo/util/SignInResultNotifier.java index 84612c9af..79ab42714 100644 --- a/app/src/main/java/com/firebase/uidemo/util/SignInResultNotifier.java +++ b/app/src/main/java/com/firebase/uidemo/util/SignInResultNotifier.java @@ -15,7 +15,7 @@ public class SignInResultNotifier implements OnCompleteListener { private Context mContext; - public SignInResultNotifier(Context context) { + public SignInResultNotifier(@NonNull Context context) { mContext = context.getApplicationContext(); } diff --git a/app/src/main/res/layout/auth_ui_layout.xml b/app/src/main/res/layout/auth_ui_layout.xml index 913a58d38..c16c150d1 100644 --- a/app/src/main/res/layout/auth_ui_layout.xml +++ b/app/src/main/res/layout/auth_ui_layout.xml @@ -34,8 +34,8 @@ style="@style/Widget.AppCompat.Button.Colored" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" android:layout_marginTop="16dp" + android:layout_gravity="center" android:text="@string/sign_in_start" />