Skip to content

Commit 45c12b1

Browse files
SUPERCILEXsamtstern
authored andcommitted
Add support for GitHub IDP (#1199)
1 parent dcdb3b5 commit 45c12b1

35 files changed

+930
-94
lines changed

app/src/main/java/com/firebase/uidemo/auth/AuthUiActivity.java

Lines changed: 77 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,14 @@ public class AuthUiActivity extends AppCompatActivity {
6767
@BindView(R.id.google_provider) CheckBox mUseGoogleProvider;
6868
@BindView(R.id.facebook_provider) CheckBox mUseFacebookProvider;
6969
@BindView(R.id.twitter_provider) CheckBox mUseTwitterProvider;
70+
@BindView(R.id.github_provider) CheckBox mUseGitHubProvider;
7071
@BindView(R.id.email_provider) CheckBox mUseEmailProvider;
7172
@BindView(R.id.phone_provider) CheckBox mUsePhoneProvider;
7273

73-
@BindView(R.id.default_theme) RadioButton mUseDefaultTheme;
74-
@BindView(R.id.green_theme) RadioButton mUseGreenTheme;
75-
@BindView(R.id.purple_theme) RadioButton mUsePurpleTheme;
76-
@BindView(R.id.dark_theme) RadioButton mUseDarkTheme;
74+
@BindView(R.id.default_theme) RadioButton mDefaultTheme;
75+
@BindView(R.id.green_theme) RadioButton mGreenTheme;
76+
@BindView(R.id.purple_theme) RadioButton mPurpleTheme;
77+
@BindView(R.id.dark_theme) RadioButton mDarkTheme;
7778

7879
@BindView(R.id.firebase_logo) RadioButton mFirebaseLogo;
7980
@BindView(R.id.google_logo) RadioButton mGoogleLogo;
@@ -85,13 +86,17 @@ public class AuthUiActivity extends AppCompatActivity {
8586
@BindView(R.id.google_privacy) RadioButton mUseGooglePrivacyPolicy;
8687
@BindView(R.id.firebase_privacy) RadioButton mUseFirebasePrivacyPolicy;
8788

88-
@BindView(R.id.google_scopes_header) TextView mGoogleScopesLabel;
89+
@BindView(R.id.google_scopes_header) TextView mGoogleScopesHeader;
8990
@BindView(R.id.google_scope_drive_file) CheckBox mGoogleScopeDriveFile;
9091
@BindView(R.id.google_scope_youtube_data) CheckBox mGoogleScopeYoutubeData;
9192

92-
@BindView(R.id.facebook_permissions_header) TextView mFacebookScopesLabel;
93-
@BindView(R.id.facebook_permission_friends) CheckBox mFacebookScopeFriends;
94-
@BindView(R.id.facebook_permission_photos) CheckBox mFacebookScopePhotos;
93+
@BindView(R.id.facebook_permissions_header) TextView mFacebookPermissionsHeader;
94+
@BindView(R.id.facebook_permission_friends) CheckBox mFacebookPermissionFriends;
95+
@BindView(R.id.facebook_permission_photos) CheckBox mFacebookPermissionPhotos;
96+
97+
@BindView(R.id.github_permissions_header) TextView mGitHubPermissionsHeader;
98+
@BindView(R.id.github_permission_repo) CheckBox mGitHubPermissionRepo;
99+
@BindView(R.id.github_permission_gist) CheckBox mGitHubPermissionGist;
95100

96101
@BindView(R.id.credential_selector_enabled) CheckBox mEnableCredentialSelector;
97102
@BindView(R.id.hint_selector_enabled) CheckBox mEnableHintSelector;
@@ -127,13 +132,13 @@ public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
127132
mUseFacebookProvider.setChecked(false);
128133
mUseFacebookProvider.setEnabled(false);
129134
mUseFacebookProvider.setText(R.string.facebook_label_missing_config);
130-
setFacebookScopesEnabled(false);
135+
setFacebookPermissionsEnabled(false);
131136
} else {
132-
setFacebookScopesEnabled(mUseFacebookProvider.isChecked());
137+
setFacebookPermissionsEnabled(mUseFacebookProvider.isChecked());
133138
mUseFacebookProvider.setOnCheckedChangeListener(new OnCheckedChangeListener() {
134139
@Override
135140
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
136-
setFacebookScopesEnabled(checked);
141+
setFacebookPermissionsEnabled(checked);
137142
}
138143
});
139144
}
@@ -144,12 +149,28 @@ public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
144149
mUseTwitterProvider.setText(R.string.twitter_label_missing_config);
145150
}
146151

147-
if (isGoogleMisconfigured() || isFacebookMisconfigured() || isTwitterMisconfigured()) {
152+
if (isGitHubMisconfigured()) {
153+
mUseGitHubProvider.setChecked(false);
154+
mUseGitHubProvider.setEnabled(false);
155+
mUseGitHubProvider.setText(R.string.github_label_missing_config);
156+
setGitHubPermissionsEnabled(false);
157+
} else {
158+
setGitHubPermissionsEnabled(mUseGitHubProvider.isChecked());
159+
mUseGitHubProvider.setOnCheckedChangeListener(new OnCheckedChangeListener() {
160+
@Override
161+
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
162+
setGitHubPermissionsEnabled(checked);
163+
}
164+
});
165+
}
166+
167+
if (isGoogleMisconfigured() || isFacebookMisconfigured()
168+
|| isTwitterMisconfigured() || isGitHubMisconfigured()) {
148169
showSnackbar(R.string.configuration_required);
149170
}
150171

151172
if (AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
152-
mUseDarkTheme.setChecked(true);
173+
mDarkTheme.setChecked(true);
153174
}
154175
}
155176

@@ -232,19 +253,19 @@ private void startSignedInActivity(IdpResponse response) {
232253

233254
@OnClick({R.id.default_theme, R.id.purple_theme, R.id.green_theme, R.id.dark_theme})
234255
public void toggleDarkTheme() {
235-
int mode = mUseDarkTheme.isChecked() ?
256+
int mode = mDarkTheme.isChecked() ?
236257
AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_AUTO;
237258
AppCompatDelegate.setDefaultNightMode(mode);
238259
getDelegate().setLocalNightMode(mode);
239260
}
240261

241262
@StyleRes
242263
private int getSelectedTheme() {
243-
if (mUseGreenTheme.isChecked()) {
264+
if (mGreenTheme.isChecked()) {
244265
return R.style.GreenTheme;
245266
}
246267

247-
if (mUsePurpleTheme.isChecked()) {
268+
if (mPurpleTheme.isChecked()) {
248269
return R.style.PurpleTheme;
249270
}
250271

@@ -279,6 +300,12 @@ private List<IdpConfig> getSelectedProviders() {
279300
selectedProviders.add(new IdpConfig.TwitterBuilder().build());
280301
}
281302

303+
if (mUseGitHubProvider.isChecked()) {
304+
selectedProviders.add(new IdpConfig.GitHubBuilder()
305+
.setPermissions(getGitHubPermissions())
306+
.build());
307+
}
308+
282309
if (mUseEmailProvider.isChecked()) {
283310
selectedProviders.add(new IdpConfig.EmailBuilder()
284311
.setRequireName(mRequireName.isChecked())
@@ -326,16 +353,32 @@ private boolean isTwitterMisconfigured() {
326353
return twitterConfigs.contains(AuthUI.UNCONFIGURED_CONFIG_VALUE);
327354
}
328355

356+
private boolean isGitHubMisconfigured() {
357+
List<String> gitHubConfigs = Arrays.asList(
358+
getString(R.string.firebase_web_host),
359+
getString(R.string.github_client_id),
360+
getString(R.string.github_client_secret)
361+
);
362+
363+
return gitHubConfigs.contains(AuthUI.UNCONFIGURED_CONFIG_VALUE);
364+
}
365+
329366
private void setGoogleScopesEnabled(boolean enabled) {
330-
mGoogleScopesLabel.setEnabled(enabled);
367+
mGoogleScopesHeader.setEnabled(enabled);
331368
mGoogleScopeDriveFile.setEnabled(enabled);
332369
mGoogleScopeYoutubeData.setEnabled(enabled);
333370
}
334371

335-
private void setFacebookScopesEnabled(boolean enabled) {
336-
mFacebookScopesLabel.setEnabled(enabled);
337-
mFacebookScopeFriends.setEnabled(enabled);
338-
mFacebookScopePhotos.setEnabled(enabled);
372+
private void setFacebookPermissionsEnabled(boolean enabled) {
373+
mFacebookPermissionsHeader.setEnabled(enabled);
374+
mFacebookPermissionFriends.setEnabled(enabled);
375+
mFacebookPermissionPhotos.setEnabled(enabled);
376+
}
377+
378+
private void setGitHubPermissionsEnabled(boolean enabled) {
379+
mGitHubPermissionsHeader.setEnabled(enabled);
380+
mGitHubPermissionRepo.setEnabled(enabled);
381+
mGitHubPermissionGist.setEnabled(enabled);
339382
}
340383

341384
private List<String> getGoogleScopes() {
@@ -351,15 +394,26 @@ private List<String> getGoogleScopes() {
351394

352395
private List<String> getFacebookPermissions() {
353396
List<String> result = new ArrayList<>();
354-
if (mFacebookScopeFriends.isChecked()) {
397+
if (mFacebookPermissionFriends.isChecked()) {
355398
result.add("user_friends");
356399
}
357-
if (mFacebookScopePhotos.isChecked()) {
400+
if (mFacebookPermissionPhotos.isChecked()) {
358401
result.add("user_photos");
359402
}
360403
return result;
361404
}
362405

406+
private List<String> getGitHubPermissions() {
407+
List<String> result = new ArrayList<>();
408+
if (mGitHubPermissionRepo.isChecked()) {
409+
result.add("repo");
410+
}
411+
if (mGitHubPermissionGist.isChecked()) {
412+
result.add("gist");
413+
}
414+
return result;
415+
}
416+
363417
private void showSnackbar(@StringRes int errorMessageRes) {
364418
Snackbar.make(mRootView, errorMessageRes, Snackbar.LENGTH_LONG).show();
365419
}

app/src/main/java/com/firebase/uidemo/auth/SignedInActivity.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import com.google.firebase.auth.FirebaseAuth;
4343
import com.google.firebase.auth.FirebaseAuthProvider;
4444
import com.google.firebase.auth.FirebaseUser;
45+
import com.google.firebase.auth.GithubAuthProvider;
4546
import com.google.firebase.auth.GoogleAuthProvider;
4647
import com.google.firebase.auth.PhoneAuthProvider;
4748
import com.google.firebase.auth.TwitterAuthProvider;
@@ -176,6 +177,9 @@ private void populateProfile(@Nullable IdpResponse response) {
176177
case TwitterAuthProvider.PROVIDER_ID:
177178
providers.add(getString(R.string.providers_twitter));
178179
break;
180+
case GithubAuthProvider.PROVIDER_ID:
181+
providers.add(getString(R.string.providers_github));
182+
break;
179183
case EmailAuthProvider.PROVIDER_ID:
180184
providers.add(getString(R.string.providers_email));
181185
break;

app/src/main/res/layout/auth_ui_layout.xml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,13 @@
7575
android:checked="true"
7676
android:text="@string/providers_twitter" />
7777

78+
<CheckBox
79+
android:id="@+id/github_provider"
80+
android:layout_width="wrap_content"
81+
android:layout_height="wrap_content"
82+
android:checked="true"
83+
android:text="@string/providers_github"/>
84+
7885
<CheckBox
7986
android:id="@+id/email_provider"
8087
android:layout_width="wrap_content"
@@ -264,6 +271,29 @@
264271
android:checked="false"
265272
android:text="@string/facebook_permission_photos" />
266273

274+
<TextView
275+
android:id="@+id/github_permissions_header"
276+
style="@style/Base.TextAppearance.AppCompat.Subhead"
277+
android:layout_width="wrap_content"
278+
android:layout_height="wrap_content"
279+
android:layout_marginTop="16dp"
280+
android:layout_marginBottom="8dp"
281+
android:text="@string/github_permissions_header" />
282+
283+
<CheckBox
284+
android:id="@+id/github_permission_repo"
285+
android:layout_width="wrap_content"
286+
android:layout_height="wrap_content"
287+
android:checked="false"
288+
android:text="@string/github_permission_repo" />
289+
290+
<CheckBox
291+
android:id="@+id/github_permission_gist"
292+
android:layout_width="wrap_content"
293+
android:layout_height="wrap_content"
294+
android:checked="false"
295+
android:text="@string/github_permission_gist" />
296+
267297
<TextView
268298
style="@style/Base.TextAppearance.AppCompat.Subhead"
269299
android:layout_width="wrap_content"

app/src/main/res/values/config.xml

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
<resources xmlns:tools="http://schemas.android.com/tools">
2+
<!-- Example: project-id.firebaseapp.com. Used for OAuth redirects -->
3+
<string name="firebase_web_host" translatable="false">CHANGE-ME</string>
4+
25
<!--
36
The Facebook Application ID associated with this Android application. To
47
use Facebook accounts with the demo application, register an application
58
and provide your value here.
69
-->
710
<string name="facebook_application_id" translatable="false">CHANGE-ME</string>
811

9-
<!--
10-
Facebook Application ID, prefixed by 'fb'. Enables Chrome Custom tabs.
11-
-->
12+
<!-- Facebook Application ID, prefixed by 'fb'. Enables Chrome Custom tabs. -->
1213
<string name="facebook_login_protocol_scheme" translatable="false" tools:ignore="UnusedResources">fbYOUR_APP_ID</string>
1314

1415

@@ -19,11 +20,27 @@
1920
<string name="twitter_consumer_key" translatable="false">CHANGE-ME</string>
2021

2122
<!--
22-
Your Twitter Consumer Secret
23+
Your Twitter Consumer Secret.
2324
2425
WARNING: By obtaining your Consumer Key and Consumer Secret other programs can perform API
2526
operations as your app. Embedding the Consumer Key and Consumer Secret in your app, no matter
2627
how obfuscated, makes it vulnerable to being stolen.
2728
-->
2829
<string name="twitter_consumer_secret" translatable="false">CHANGE-ME</string>
30+
31+
32+
<!--
33+
Your GitHub Client ID. To use GitHub accounts with the demo application, register an
34+
application with GitHub and provide the following two values.
35+
-->
36+
<string name="github_client_id" translatable="false">CHANGE-ME</string>
37+
38+
<!--
39+
Your GitHub Client Secret.
40+
41+
WARNING: By obtaining your Client ID and Client Secret other programs can perform API
42+
operations as your app. Embedding the Client ID and Client Secret in your app, no matter
43+
how obfuscated, makes it vulnerable to being stolen.
44+
-->
45+
<string name="github_client_secret" translatable="false">CHANGE-ME</string>
2946
</resources>

app/src/main/res/values/strings.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<string name="providers_header">Auth providers</string>
2323
<string name="providers_google">Google</string>
2424
<string name="providers_facebook">Facebook</string>
25+
<string name="providers_github">GitHub</string>
2526
<string name="providers_twitter">Twitter</string>
2627
<string name="providers_email">Email</string>
2728
<string name="providers_phone">Phone</string>
@@ -53,6 +54,10 @@
5354
<string name="facebook_permission_friends">Friends</string>
5455
<string name="facebook_permission_photos">Photos</string>
5556

57+
<string name="github_permissions_header">Example extra GitHub permissions</string>
58+
<string name="github_permission_repo">Repo</string>
59+
<string name="github_permission_gist">Gist</string>
60+
5661
<string name="options_header">Other Options</string>
5762
<string name="options_enable_credential_selector">Enable Smart Lock\'s credential selector</string>
5863
<string name="options_enable_hint_selector">Enable Smart Lock\'s hint selector</string>
@@ -63,6 +68,7 @@
6368
<string name="google_label_missing_config">Google configuration missing</string>
6469
<string name="facebook_label_missing_config">Facebook configuration missing</string>
6570
<string name="twitter_label_missing_config">Twitter configuration missing</string>
71+
<string name="github_label_missing_config">GitHub configuration missing</string>
6672

6773
<string name="sign_in_cancelled">Sign in cancelled</string>
6874
<string name="no_internet_connection">No internet connection</string>

0 commit comments

Comments
 (0)