Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
63 changes: 41 additions & 22 deletions app/src/main/java/com/firebase/uidemo/auth/AuthUiActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,15 @@ public class AuthUiActivity extends AppCompatActivity {
@BindView(R.id.root) View mRootView;

@BindView(R.id.google_provider) CheckBox mUseGoogleProvider;
@BindView(R.id.play_games_provider) CheckBox mUsePlayGamesProvider;
@BindView(R.id.facebook_provider) CheckBox mUseFacebookProvider;
@BindView(R.id.twitter_provider) CheckBox mUseTwitterProvider;
@BindView(R.id.email_provider) CheckBox mUseEmailProvider;
@BindView(R.id.phone_provider) CheckBox mUsePhoneProvider;

@BindView(R.id.default_theme) RadioButton mUseDefaultTheme;
@BindView(R.id.green_theme) RadioButton mUseGreenTheme;
@BindView(R.id.purple_theme) RadioButton mUsePurpleTheme;
@BindView(R.id.dark_theme) RadioButton mUseDarkTheme;
@BindView(R.id.green_theme) RadioButton mGreenTheme;
@BindView(R.id.purple_theme) RadioButton mPurpleTheme;
@BindView(R.id.dark_theme) RadioButton mDarkTheme;

@BindView(R.id.firebase_logo) RadioButton mFirebaseLogo;
@BindView(R.id.google_logo) RadioButton mGoogleLogo;
Expand All @@ -85,13 +85,13 @@ public class AuthUiActivity extends AppCompatActivity {
@BindView(R.id.google_privacy) RadioButton mUseGooglePrivacyPolicy;
@BindView(R.id.firebase_privacy) RadioButton mUseFirebasePrivacyPolicy;

@BindView(R.id.google_scopes_header) TextView mGoogleScopesLabel;
@BindView(R.id.google_scopes_header) TextView mGoogleScopesHeader;
@BindView(R.id.google_scope_drive_file) CheckBox mGoogleScopeDriveFile;
@BindView(R.id.google_scope_youtube_data) CheckBox mGoogleScopeYoutubeData;

@BindView(R.id.facebook_permissions_header) TextView mFacebookScopesLabel;
@BindView(R.id.facebook_permission_friends) CheckBox mFacebookScopeFriends;
@BindView(R.id.facebook_permission_photos) CheckBox mFacebookScopePhotos;
@BindView(R.id.facebook_permissions_header) TextView mFacebookPermissionsHeader;
@BindView(R.id.facebook_permission_friends) CheckBox mFacebookPermissionFriends;
@BindView(R.id.facebook_permission_photos) CheckBox mFacebookPermissionPhotos;

@BindView(R.id.credential_selector_enabled) CheckBox mEnableCredentialSelector;
@BindView(R.id.hint_selector_enabled) CheckBox mEnableHintSelector;
Expand All @@ -113,12 +113,27 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
mUseGoogleProvider.setEnabled(false);
mUseGoogleProvider.setText(R.string.google_label_missing_config);
setGoogleScopesEnabled(false);

mUsePlayGamesProvider.setChecked(false);
mUsePlayGamesProvider.setEnabled(false);
mUsePlayGamesProvider.setText(R.string.google_label_missing_config);
} else {
setGoogleScopesEnabled(mUseGoogleProvider.isChecked());
mUseGoogleProvider.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
setGoogleScopesEnabled(checked);
if (checked) {
mUsePlayGamesProvider.setChecked(false);
}
}
});
mUsePlayGamesProvider.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
mUseGoogleProvider.setChecked(false);
}
}
});
}
Expand All @@ -127,13 +142,13 @@ public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
mUseFacebookProvider.setChecked(false);
mUseFacebookProvider.setEnabled(false);
mUseFacebookProvider.setText(R.string.facebook_label_missing_config);
setFacebookScopesEnabled(false);
setFacebookPermissionsEnabled(false);
} else {
setFacebookScopesEnabled(mUseFacebookProvider.isChecked());
setFacebookPermissionsEnabled(mUseFacebookProvider.isChecked());
mUseFacebookProvider.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
setFacebookScopesEnabled(checked);
setFacebookPermissionsEnabled(checked);
}
});
}
Expand All @@ -149,7 +164,7 @@ public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
}

if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
mUseDarkTheme.setChecked(true);
mDarkTheme.setChecked(true);
}
}

Expand Down Expand Up @@ -232,19 +247,19 @@ private void startSignedInActivity(IdpResponse response) {

@OnClick({R.id.default_theme, R.id.purple_theme, R.id.green_theme, R.id.dark_theme})
public void toggleDarkTheme() {
int mode = mUseDarkTheme.isChecked() ?
int mode = mDarkTheme.isChecked() ?
AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_AUTO;
AppCompatDelegate.setDefaultNightMode(mode);
getDelegate().setLocalNightMode(mode);
}

@StyleRes
private int getSelectedTheme() {
if (mUseGreenTheme.isChecked()) {
if (mGreenTheme.isChecked()) {
return R.style.GreenTheme;
}

if (mUsePurpleTheme.isChecked()) {
if (mPurpleTheme.isChecked()) {
return R.style.PurpleTheme;
}

Expand All @@ -269,6 +284,10 @@ private List<IdpConfig> getSelectedProviders() {
new IdpConfig.GoogleBuilder().setScopes(getGoogleScopes()).build());
}

if (mUsePlayGamesProvider.isChecked()) {
selectedProviders.add(new IdpConfig.PlayGamesBuilder().build());
}

if (mUseFacebookProvider.isChecked()) {
selectedProviders.add(new IdpConfig.FacebookBuilder()
.setPermissions(getFacebookPermissions())
Expand Down Expand Up @@ -327,15 +346,15 @@ private boolean isTwitterMisconfigured() {
}

private void setGoogleScopesEnabled(boolean enabled) {
mGoogleScopesLabel.setEnabled(enabled);
mGoogleScopesHeader.setEnabled(enabled);
mGoogleScopeDriveFile.setEnabled(enabled);
mGoogleScopeYoutubeData.setEnabled(enabled);
}

private void setFacebookScopesEnabled(boolean enabled) {
mFacebookScopesLabel.setEnabled(enabled);
mFacebookScopeFriends.setEnabled(enabled);
mFacebookScopePhotos.setEnabled(enabled);
private void setFacebookPermissionsEnabled(boolean enabled) {
mFacebookPermissionsHeader.setEnabled(enabled);
mFacebookPermissionFriends.setEnabled(enabled);
mFacebookPermissionPhotos.setEnabled(enabled);
}

private List<String> getGoogleScopes() {
Expand All @@ -351,10 +370,10 @@ private List<String> getGoogleScopes() {

private List<String> getFacebookPermissions() {
List<String> result = new ArrayList<>();
if (mFacebookScopeFriends.isChecked()) {
if (mFacebookPermissionFriends.isChecked()) {
result.add("user_friends");
}
if (mFacebookScopePhotos.isChecked()) {
if (mFacebookPermissionPhotos.isChecked()) {
result.add("user_photos");
}
return result;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.GoogleAuthProvider;
import com.google.firebase.auth.PhoneAuthProvider;
import com.google.firebase.auth.PlayGamesAuthProvider;
import com.google.firebase.auth.TwitterAuthProvider;
import com.google.firebase.auth.UserInfo;

Expand Down Expand Up @@ -162,6 +163,9 @@ private void populateProfile() {
case GoogleAuthProvider.PROVIDER_ID:
providers.add(getString(R.string.providers_google));
break;
case PlayGamesAuthProvider.PROVIDER_ID:
providers.add(getString(R.string.providers_play_games));
break;
case FacebookAuthProvider.PROVIDER_ID:
providers.add(getString(R.string.providers_facebook));
break;
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/res/layout/auth_ui_layout.xml
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,13 @@
android:checked="true"
android:text="@string/providers_google" />

<CheckBox
android:id="@+id/play_games_provider"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="false"
android:text="@string/providers_play_games" />

<CheckBox
android:id="@+id/facebook_provider"
android:layout_width="wrap_content"
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

<string name="providers_header">Auth providers</string>
<string name="providers_google">Google</string>
<string name="providers_play_games">Play Games</string>
<string name="providers_facebook">Facebook</string>
<string name="providers_twitter">Twitter</string>
<string name="providers_email">Email</string>
Expand Down
55 changes: 55 additions & 0 deletions auth/src/main/java/com/firebase/ui/auth/AuthUI.java
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.GoogleAuthProvider;
import com.google.firebase.auth.PhoneAuthProvider;
import com.google.firebase.auth.PlayGamesAuthProvider;
import com.google.firebase.auth.TwitterAuthProvider;
import com.google.firebase.auth.UserInfo;
import com.twitter.sdk.android.core.TwitterCore;
Expand Down Expand Up @@ -101,6 +102,7 @@ public final class AuthUI {
EmailAuthProvider.PROVIDER_ID,
PhoneAuthProvider.PROVIDER_ID,
GoogleAuthProvider.PROVIDER_ID,
PlayGamesAuthProvider.PROVIDER_ID,
FacebookAuthProvider.PROVIDER_ID,
TwitterAuthProvider.PROVIDER_ID
})
Expand All @@ -118,6 +120,7 @@ public final class AuthUI {
public static final Set<String> SUPPORTED_PROVIDERS =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
GoogleAuthProvider.PROVIDER_ID,
PlayGamesAuthProvider.PROVIDER_ID,
FacebookAuthProvider.PROVIDER_ID,
TwitterAuthProvider.PROVIDER_ID,
EmailAuthProvider.PROVIDER_ID,
Expand All @@ -131,6 +134,7 @@ public final class AuthUI {
public static final Set<String> SOCIAL_PROVIDERS =
Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
GoogleAuthProvider.PROVIDER_ID,
PlayGamesAuthProvider.PROVIDER_ID,
FacebookAuthProvider.PROVIDER_ID,
TwitterAuthProvider.PROVIDER_ID)));

Expand Down Expand Up @@ -710,6 +714,51 @@ public IdpConfig build() {
}
}

/**
* {@link IdpConfig} builder for the Google Play Games provider.
*/
public static final class PlayGamesBuilder extends Builder {
public PlayGamesBuilder() {
//noinspection deprecation taking a hit for the backcompat team
super(PlayGamesAuthProvider.PROVIDER_ID);
Preconditions.checkConfigured(getApplicationContext(),
"Check your google-services plugin configuration, the" +
" default_web_client_id string wasn't populated.",
R.string.default_web_client_id);
}

/**
* Set the {@link GoogleSignInOptions} to be used for Google sign-in. Standard options
* like requesting the user's email will automatically be added.
*
* @param options sign-in options
*/
@NonNull
public PlayGamesBuilder setSignInOptions(@NonNull GoogleSignInOptions options) {
Preconditions.checkUnset(getParams(),
"Cannot overwrite previously set sign-in options.",
ExtraConstants.GOOGLE_SIGN_IN_OPTIONS);

GoogleSignInOptions.Builder builder = new GoogleSignInOptions.Builder(options);
builder.requestEmail().requestServerAuthCode(getApplicationContext()
.getString(R.string.default_web_client_id));
getParams().putParcelable(ExtraConstants.GOOGLE_SIGN_IN_OPTIONS, builder.build());

return this;
}

@NonNull
@Override
public IdpConfig build() {
if (!getParams().containsKey(ExtraConstants.GOOGLE_SIGN_IN_OPTIONS)) {
setSignInOptions(new GoogleSignInOptions.Builder(
GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN).build());
}

return super.build();
}
}

/**
* {@link IdpConfig} builder for the Facebook provider.
*/
Expand Down Expand Up @@ -849,6 +898,12 @@ public T setAvailableProviders(@NonNull List<IdpConfig> idpConfigs) {
}
}

if (mProviders.contains(new IdpConfig.PlayGamesBuilder().build())
&& mProviders.contains(new IdpConfig.GoogleBuilder().build())) {
throw new IllegalArgumentException("The Google and Play Games providers cannot " +
"be used simultaneously. You must choose one.");
}

return (T) this;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import com.google.android.gms.common.api.ApiException;
import com.google.android.gms.common.api.CommonStatusCodes;
import com.google.firebase.auth.GoogleAuthProvider;
import com.google.firebase.auth.PlayGamesAuthProvider;

@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class GoogleSignInHandler extends ProviderSignInBase<GoogleSignInHandler.Params> {
Expand All @@ -38,13 +39,15 @@ public GoogleSignInHandler(Application application) {
super(application);
}

private static IdpResponse createIdpResponse(GoogleSignInAccount account) {
private static IdpResponse createIdpResponse(String provider,
GoogleSignInAccount account,
@NonNull String token) {
return new IdpResponse.Builder(
new User.Builder(GoogleAuthProvider.PROVIDER_ID, account.getEmail())
new User.Builder(provider, account.getEmail())
.setName(account.getDisplayName())
.setPhotoUri(account.getPhotoUrl())
.build())
.setToken(account.getIdToken())
.setToken(token)
.build();
}

Expand Down Expand Up @@ -85,7 +88,20 @@ public void onActivityResult(int requestCode, int resultCode, @Nullable Intent d
try {
GoogleSignInAccount account = GoogleSignIn.getSignedInAccountFromIntent(data)
.getResult(ApiException.class);
setResult(Resource.forSuccess(createIdpResponse(account)));

String provider;
String token;
if (mConfig.getProviderId().equals(GoogleAuthProvider.PROVIDER_ID)) {
provider = GoogleAuthProvider.PROVIDER_ID;
token = account.getIdToken();
} else if (mConfig.getProviderId().equals(PlayGamesAuthProvider.PROVIDER_ID)) {
provider = PlayGamesAuthProvider.PROVIDER_ID;
token = account.getServerAuthCode();
} else {
throw new IllegalStateException("Unsupported provider: " + mConfig.getProviderId());
}

setResult(Resource.forSuccess(createIdpResponse(provider, account, token)));
} catch (ApiException e) {
if (e.getStatusCode() == CommonStatusCodes.INVALID_ACCOUNT) {
// If we get INVALID_ACCOUNT, it means the pre-set account was not available on the
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import com.google.firebase.auth.FirebaseAuthInvalidUserException;
import com.google.firebase.auth.GoogleAuthProvider;
import com.google.firebase.auth.PhoneAuthProvider;
import com.google.firebase.auth.PlayGamesAuthProvider;
import com.google.firebase.auth.TwitterAuthProvider;

import java.util.ArrayList;
Expand Down Expand Up @@ -126,6 +127,7 @@ private void redirectSignIn(String provider, String email) {
RequestCodes.EMAIL_FLOW)));
break;
case GoogleAuthProvider.PROVIDER_ID:
case PlayGamesAuthProvider.PROVIDER_ID:
case FacebookAuthProvider.PROVIDER_ID:
case TwitterAuthProvider.PROVIDER_ID:
setResult(Resource.<IdpResponse>forFailure(new IntentRequiredException(
Expand All @@ -144,7 +146,8 @@ private List<String> getCredentialAccountTypes() {
List<String> accounts = new ArrayList<>();
for (AuthUI.IdpConfig idpConfig : getArguments().providerInfo) {
@AuthUI.SupportedProvider String providerId = idpConfig.getProviderId();
if (providerId.equals(GoogleAuthProvider.PROVIDER_ID)) {
if (providerId.equals(GoogleAuthProvider.PROVIDER_ID)
|| providerId.equals(PlayGamesAuthProvider.PROVIDER_ID)) {
accounts.add(ProviderUtils.providerIdToAccountType(providerId));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
import com.google.firebase.auth.FacebookAuthProvider;
import com.google.firebase.auth.GoogleAuthProvider;
import com.google.firebase.auth.PhoneAuthProvider;
import com.google.firebase.auth.PlayGamesAuthProvider;
import com.google.firebase.auth.TwitterAuthProvider;

import java.util.ArrayList;
Expand Down Expand Up @@ -135,11 +136,16 @@ private void populateIdpList(List<IdpConfig> providerConfigs,
final String providerId = idpConfig.getProviderId();
switch (providerId) {
case GoogleAuthProvider.PROVIDER_ID:
case PlayGamesAuthProvider.PROVIDER_ID:
GoogleSignInHandler google = supplier.get(GoogleSignInHandler.class);
google.init(new GoogleSignInHandler.Params(idpConfig));
provider = google;

buttonLayout = R.layout.fui_idp_button_google;
if (idpConfig.getProviderId().equals(GoogleAuthProvider.PROVIDER_ID)) {
buttonLayout = R.layout.fui_idp_button_google;
} else {
buttonLayout = R.layout.fui_idp_button_play_games;
}
break;
case FacebookAuthProvider.PROVIDER_ID:
FacebookSignInHandler facebook = supplier.get(FacebookSignInHandler.class);
Expand Down
Loading