Skip to content

The Big Kahuna #390

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 45 commits into from
Nov 4, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
e3a731a
Add Twitter as an IDP (#268)
amandle Aug 26, 2016
afbf1ed
SmartLock Deletion
samtstern Sep 13, 2016
2ccaa0b
Merge pull request #302 from samtstern/version-1.0.0-dev
samtstern Sep 14, 2016
dc44c2d
Merge branch 'master' into version-1.0.0-dev
samtstern Sep 15, 2016
f6d2e12
Merge branch 'master' into version-1.0.0-dev
samtstern Sep 16, 2016
7167718
Check for null password or lack of network
samtstern Sep 16, 2016
df0eca0
Merge pull request #308 from samtstern/version-1.0.0-dev
samtstern Sep 23, 2016
38e251f
Merge branch 'version-1.0.0-dev' of github.com:firebase/FirebaseUI-An…
samtstern Oct 10, 2016
6cb6abb
Merge branch 'master' into version-1.0.0-dev
samtstern Oct 10, 2016
41e7054
Update README.md
SUPERCILEX Oct 12, 2016
d41f3bd
Merge pull request #351 from SUPERCILEX/patch-1
samtstern Oct 12, 2016
73571fb
Merge branch 'master' into version-1.0.0-dev
samtstern Oct 13, 2016
ceb4d13
Fix bug in Smart Lock not restoring Twitter credentials (#356)
SUPERCILEX Oct 17, 2016
f0d4d15
Merge branch 'master' into version-1.0.0-dev
samtstern Oct 17, 2016
897b455
Specify additonal scopes thorugh code rather than config.xml (#342)
amandle Oct 17, 2016
068899c
Return tokens on successful sign in with an IDP (#362)
amandle Oct 19, 2016
94ec596
Flip incorrect assertEquals statements
SUPERCILEX Oct 19, 2016
9a33e10
Checked call to AutoCompleteTask.java
SUPERCILEX Oct 19, 2016
313dd50
Update RegisterEmailActivityTest.java
SUPERCILEX Oct 19, 2016
9b98c12
Merge pull request #365 from SUPERCILEX/fix-tests
samtstern Oct 19, 2016
fd4de5a
Audit for missed instances of Twitter (#366)
amandle Oct 19, 2016
baab107
Refactor SaveCredentialsActivity (#343)
SUPERCILEX Oct 21, 2016
98fc39b
Better facebook error handling (#368)
amandle Oct 21, 2016
e8baa0e
Add support for dark themes (#367)
amandle Oct 21, 2016
6483745
Better logging when IDP login fails.
Oct 21, 2016
301c25a
Add Twitter and Facebook IDP SmartLock support
Oct 22, 2016
a1b2414
Merge branch 'master' into version-1.0.0-dev
samtstern Oct 23, 2016
4a40143
Merge pull request #372 from amandle/smartlock_idps
samtstern Oct 25, 2016
0f894a9
Merge pull request #371 from amandle/log_login_errors
samtstern Oct 25, 2016
f0a27b9
Remove unused save credentials layout
Oct 25, 2016
74df4b3
Fix whoopsie doodles in README.md (#373)
SUPERCILEX Oct 25, 2016
0ed44c2
Add proposed Twitter Client Secret warning #269
Oct 26, 2016
0d14c2e
consumer secret not client secret
Oct 26, 2016
132c949
Merge pull request #381 from amandle/twitter_warning
samtstern Oct 26, 2016
8b2503f
Merge pull request #378 from amandle/remove_save_credentials_layout
samtstern Oct 26, 2016
932cb3d
Clean up the logic around starting the linking flow (#377)
amandle Oct 26, 2016
2b9020b
Various bugfixes for 1.0 (#380)
amandle Oct 26, 2016
f9d4ab6
Bugfixes for older versions of Android (#382)
amandle Oct 28, 2016
cce75a8
Fix issues found by round of manual test (#383)
amandle Nov 1, 2016
5a4b661
Support for joins (#276)
SUPERCILEX Nov 1, 2016
d76f948
Fix for header text misalignment, and remove unused layout (#386)
amandle Nov 3, 2016
cc6bef8
Merge branch 'master' into version-1.0.0-dev
samtstern Nov 4, 2016
3f81b9f
Version 1.0.0
samtstern Nov 4, 2016
40434fc
Update README
samtstern Nov 4, 2016
dcebaed
Add instructions for adding the Fabric repository (#391)
amandle Nov 4, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,16 @@ libraries.
```groovy
dependencies {
// FirebaseUI Database only
compile 'com.firebaseui:firebase-ui-database:0.6.2'
compile 'com.firebaseui:firebase-ui-database:1.0.0'

// FirebaseUI Auth only
compile 'com.firebaseui:firebase-ui-auth:0.6.2'
compile 'com.firebaseui:firebase-ui-auth:1.0.0'

// FirebaseUI Storage only
compile 'com.firebaseui:firebase-ui-storage:0.6.2'
compile 'com.firebaseui:firebase-ui-storage:1.0.0'

// Single target that includes all FirebaseUI libraries above
compile 'com.firebaseui:firebase-ui:0.6.2'
compile 'com.firebaseui:firebase-ui:1.0.0'
}
```

Expand Down Expand Up @@ -67,6 +67,7 @@ For convenience, here are some examples:

| FirebaseUI Version | Firebase/Play Services Version |
|--------------------|--------------------------------|
| 1.0.0 | 9.8.0 |
| 0.6.2 | 9.8.0 |
| 0.6.1 | 9.6.1 |
| 0.6.0 | 9.6.0 |
Expand Down
144 changes: 135 additions & 9 deletions app/src/main/java/com/firebase/uidemo/auth/AuthUiActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,22 @@
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.RadioButton;

import android.widget.TextView;
import com.firebase.ui.auth.AuthUI;
import com.firebase.ui.auth.AuthUI.IdpConfig;
import com.firebase.ui.auth.IdpResponse;
import com.firebase.ui.auth.ui.ResultCodes;
import com.firebase.uidemo.R;
import com.google.android.gms.common.Scopes;
import com.google.firebase.auth.FirebaseAuth;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
Expand Down Expand Up @@ -60,6 +69,9 @@ public class AuthUiActivity extends AppCompatActivity {
@BindView(R.id.purple_theme)
RadioButton mUsePurpleTheme;

@BindView(R.id.dark_theme)
RadioButton mUseDarkTheme;

@BindView(R.id.email_provider)
CheckBox mUseEmailProvider;

Expand All @@ -69,6 +81,9 @@ public class AuthUiActivity extends AppCompatActivity {
@BindView(R.id.facebook_provider)
CheckBox mUseFacebookProvider;

@BindView(R.id.twitter_provider)
CheckBox mUseTwitterProvider;

@BindView(R.id.google_tos)
RadioButton mUseGoogleTos;

Expand All @@ -93,13 +108,31 @@ public class AuthUiActivity extends AppCompatActivity {
@BindView(R.id.smartlock_enabled)
CheckBox mEnableSmartLock;

@BindView(R.id.facebook_scopes_label)
TextView mFacebookScopesLabel;

@BindView(R.id.facebook_scope_friends)
CheckBox mFacebookScopeFriends;

@BindView(R.id.facebook_scope_photos)
CheckBox mFacebookScopePhotos;

@BindView(R.id.google_scopes_label)
TextView mGoogleScopesLabel;

@BindView(R.id.google_scope_drive_file)
CheckBox mGoogleScopeDriveFile;

@BindView(R.id.google_scope_games)
CheckBox mGoogleScopeGames;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

FirebaseAuth auth = FirebaseAuth.getInstance();
if (auth.getCurrentUser() != null) {
startActivity(SignedInActivity.createIntent(this));
startActivity(SignedInActivity.createIntent(this, null));
finish();
}

Expand All @@ -110,17 +143,42 @@ public void onCreate(Bundle savedInstanceState) {
mUseGoogleProvider.setChecked(false);
mUseGoogleProvider.setEnabled(false);
mUseGoogleProvider.setText(R.string.google_label_missing_config);
setGoogleScopesEnabled(false);
} else {
setGoogleScopesEnabled(mUseGoogleProvider.isChecked());
mUseGoogleProvider.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
setGoogleScopesEnabled(checked);
}
});
}

if (!isFacebookConfigured()) {
mUseFacebookProvider.setChecked(false);
mUseFacebookProvider.setEnabled(false);
mUseFacebookProvider.setText(R.string.facebook_label_missing_config);
setFacebookScopesEnabled(false);
} else {
setFacebookScopesEnabled(mUseFacebookProvider.isChecked());
mUseFacebookProvider.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
setFacebookScopesEnabled(checked);
}
});
}

if (!isTwitterConfigured()) {
mUseTwitterProvider.setChecked(false);
mUseTwitterProvider.setEnabled(false);
mUseTwitterProvider.setText(R.string.twitter_label_missing_config);
}

if (!isGoogleConfigured() || !isFacebookConfigured()) {
if (!isGoogleConfigured() || !isFacebookConfigured() || !isTwitterConfigured()) {
showSnackbar(R.string.configuration_required);
}

}

@OnClick(R.id.sign_in)
Expand All @@ -147,10 +205,25 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
showSnackbar(R.string.unknown_response);
}


@MainThread
private void setGoogleScopesEnabled(boolean enabled) {
mGoogleScopesLabel.setEnabled(enabled);
mGoogleScopeDriveFile.setEnabled(enabled);
mGoogleScopeGames.setEnabled(enabled);
}

@MainThread
private void setFacebookScopesEnabled(boolean enabled) {
mFacebookScopesLabel.setEnabled(enabled);
mFacebookScopeFriends.setEnabled(enabled);
mFacebookScopePhotos.setEnabled(enabled);
}

@MainThread
private void handleSignInResponse(int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
startActivity(SignedInActivity.createIntent(this));
startActivity(SignedInActivity.createIntent(this, IdpResponse.fromResultIntent(data)));
finish();
return;
}
Expand All @@ -160,6 +233,11 @@ private void handleSignInResponse(int resultCode, Intent data) {
return;
}

if (resultCode == ResultCodes.RESULT_NO_NETWORK) {
showSnackbar(R.string.no_internet_connection);
return;
}

showSnackbar(R.string.unknown_sign_in_response);
}

Expand All @@ -174,6 +252,10 @@ private int getSelectedTheme() {
return R.style.PurpleTheme;
}

if (mUseDarkTheme.isChecked()) {
return R.style.DarkTheme;
}

return R.style.GreenTheme;
}

Expand All @@ -189,22 +271,32 @@ private int getSelectedLogo() {
}

@MainThread
private String[] getSelectedProviders() {
ArrayList<String> selectedProviders = new ArrayList<>();
private List<IdpConfig> getSelectedProviders() {
List<IdpConfig> selectedProviders = new ArrayList<>();

if (mUseEmailProvider.isChecked()) {
selectedProviders.add(AuthUI.EMAIL_PROVIDER);
selectedProviders.add(new IdpConfig.Builder(AuthUI.EMAIL_PROVIDER).build());
}

if (mUseFacebookProvider.isChecked()) {
selectedProviders.add(AuthUI.FACEBOOK_PROVIDER);
selectedProviders.add(
new IdpConfig.Builder(AuthUI.FACEBOOK_PROVIDER)
.setPermissions(getFacebookPermissions())
.build());
}

if (mUseGoogleProvider.isChecked()) {
selectedProviders.add(AuthUI.GOOGLE_PROVIDER);
selectedProviders.add(
new IdpConfig.Builder(AuthUI.GOOGLE_PROVIDER)
.setPermissions(getGooglePermissions())
.build());
}

if (mUseTwitterProvider.isChecked()) {
selectedProviders.add(new IdpConfig.Builder(AuthUI.TWITTER_PROVIDER).build());
}

return selectedProviders.toArray(new String[selectedProviders.size()]);
return selectedProviders;
}

@MainThread
Expand All @@ -228,11 +320,45 @@ private boolean isFacebookConfigured() {
getResources().getString(R.string.facebook_application_id));
}

@MainThread
private boolean isTwitterConfigured() {
List<String> twitterConfigs = Arrays.asList(
getResources().getString(R.string.twitter_consumer_key),
getResources().getString(R.string.twitter_consumer_secret)
);

return !twitterConfigs.contains(UNCHANGED_CONFIG_VALUE);
}

@MainThread
private void showSnackbar(@StringRes int errorMessageRes) {
Snackbar.make(mRootView, errorMessageRes, Snackbar.LENGTH_LONG).show();
}

@MainThread
private List<String> getFacebookPermissions() {
List<String> result = new ArrayList<>();
if (mFacebookScopeFriends.isChecked()) {
result.add("user_friends");
}
if (mFacebookScopePhotos.isChecked()) {
result.add("user_photos");
}
return result;
}

@MainThread
private List<String> getGooglePermissions() {
List<String> result = new ArrayList<>();
if (mGoogleScopeGames.isChecked()) {
result.add(Scopes.GAMES);
}
if (mGoogleScopeDriveFile.isChecked()) {
result.add(Scopes.DRIVE_FILE);
}
return result;
}

public static Intent createIntent(Context context) {
Intent in = new Intent();
in.setClass(context, AuthUiActivity.class);
Expand Down
38 changes: 28 additions & 10 deletions app/src/main/java/com/firebase/uidemo/auth/SignedInActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,12 @@
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import com.bumptech.glide.Glide;
import com.firebase.ui.auth.AuthUI;
import com.firebase.ui.auth.IdpResponse;
import com.firebase.uidemo.R;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
Expand All @@ -39,14 +42,10 @@
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.GoogleAuthProvider;

import java.util.Iterator;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

public class SignedInActivity extends AppCompatActivity {
private static final String EXTRA_IDP_RESPONSE = "extra_idp_response";

@BindView(android.R.id.content)
View mRootView;
Expand Down Expand Up @@ -77,6 +76,7 @@ public void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.signed_in_layout);
ButterKnife.bind(this);
populateProfile();
populateIdpToken();
}

@OnClick(R.id.sign_out)
Expand Down Expand Up @@ -114,9 +114,8 @@ public void onClick(DialogInterface dialogInterface, int i) {
}

private void deleteAccount() {
FirebaseAuth.getInstance()
.getCurrentUser()
.delete()
AuthUI.getInstance()
.delete(this)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
Expand Down Expand Up @@ -174,15 +173,34 @@ private void populateProfile() {
mEnabledProviders.setText(providerList);
}

private void populateIdpToken() {
IdpResponse idpResponse = getIntent().getParcelableExtra(EXTRA_IDP_RESPONSE);
if (idpResponse != null) {
String token = idpResponse.getIdpToken();
String secret = idpResponse.getIdpSecret();
if (token == null) {
findViewById(R.id.idp_token_layout).setVisibility(View.GONE);
} else {
((TextView) findViewById(R.id.idp_token)).setText(token);
}
if (secret == null) {
findViewById(R.id.idp_secret_layout).setVisibility(View.GONE);
} else {
((TextView) findViewById(R.id.idp_secret)).setText(secret);
}
}
}

@MainThread
private void showSnackbar(@StringRes int errorMessageRes) {
Snackbar.make(mRootView, errorMessageRes, Snackbar.LENGTH_LONG)
.show();
}

public static Intent createIntent(Context context) {
public static Intent createIntent(Context context, IdpResponse idpResponse) {
Intent in = new Intent();
in.setClass(context, SignedInActivity.class);
in.putExtra(EXTRA_IDP_RESPONSE, idpResponse);
return in;
}
}
Loading