2626import android .view .View ;
2727import android .widget .Button ;
2828import android .widget .CheckBox ;
29+ import android .widget .CompoundButton ;
30+ import android .widget .CompoundButton .OnCheckedChangeListener ;
2931import android .widget .RadioButton ;
3032
33+ import android .widget .TextView ;
3134import com .firebase .ui .auth .AuthUI ;
35+ import com .firebase .ui .auth .AuthUI .IdpConfig ;
36+ import com .firebase .ui .auth .IdpResponse ;
37+ import com .firebase .ui .auth .ui .ResultCodes ;
3238import com .firebase .uidemo .R ;
39+ import com .google .android .gms .common .Scopes ;
3340import com .google .firebase .auth .FirebaseAuth ;
3441
3542import java .util .ArrayList ;
43+ import java .util .Arrays ;
44+ import java .util .List ;
3645
3746import butterknife .BindView ;
3847import butterknife .ButterKnife ;
@@ -60,6 +69,9 @@ public class AuthUiActivity extends AppCompatActivity {
6069 @ BindView (R .id .purple_theme )
6170 RadioButton mUsePurpleTheme ;
6271
72+ @ BindView (R .id .dark_theme )
73+ RadioButton mUseDarkTheme ;
74+
6375 @ BindView (R .id .email_provider )
6476 CheckBox mUseEmailProvider ;
6577
@@ -69,6 +81,9 @@ public class AuthUiActivity extends AppCompatActivity {
6981 @ BindView (R .id .facebook_provider )
7082 CheckBox mUseFacebookProvider ;
7183
84+ @ BindView (R .id .twitter_provider )
85+ CheckBox mUseTwitterProvider ;
86+
7287 @ BindView (R .id .google_tos )
7388 RadioButton mUseGoogleTos ;
7489
@@ -93,13 +108,31 @@ public class AuthUiActivity extends AppCompatActivity {
93108 @ BindView (R .id .smartlock_enabled )
94109 CheckBox mEnableSmartLock ;
95110
111+ @ BindView (R .id .facebook_scopes_label )
112+ TextView mFacebookScopesLabel ;
113+
114+ @ BindView (R .id .facebook_scope_friends )
115+ CheckBox mFacebookScopeFriends ;
116+
117+ @ BindView (R .id .facebook_scope_photos )
118+ CheckBox mFacebookScopePhotos ;
119+
120+ @ BindView (R .id .google_scopes_label )
121+ TextView mGoogleScopesLabel ;
122+
123+ @ BindView (R .id .google_scope_drive_file )
124+ CheckBox mGoogleScopeDriveFile ;
125+
126+ @ BindView (R .id .google_scope_games )
127+ CheckBox mGoogleScopeGames ;
128+
96129 @ Override
97130 public void onCreate (Bundle savedInstanceState ) {
98131 super .onCreate (savedInstanceState );
99132
100133 FirebaseAuth auth = FirebaseAuth .getInstance ();
101134 if (auth .getCurrentUser () != null ) {
102- startActivity (SignedInActivity .createIntent (this ));
135+ startActivity (SignedInActivity .createIntent (this , null ));
103136 finish ();
104137 }
105138
@@ -110,17 +143,42 @@ public void onCreate(Bundle savedInstanceState) {
110143 mUseGoogleProvider .setChecked (false );
111144 mUseGoogleProvider .setEnabled (false );
112145 mUseGoogleProvider .setText (R .string .google_label_missing_config );
146+ setGoogleScopesEnabled (false );
147+ } else {
148+ setGoogleScopesEnabled (mUseGoogleProvider .isChecked ());
149+ mUseGoogleProvider .setOnCheckedChangeListener (new OnCheckedChangeListener () {
150+ @ Override
151+ public void onCheckedChanged (CompoundButton compoundButton , boolean checked ) {
152+ setGoogleScopesEnabled (checked );
153+ }
154+ });
113155 }
114156
115157 if (!isFacebookConfigured ()) {
116158 mUseFacebookProvider .setChecked (false );
117159 mUseFacebookProvider .setEnabled (false );
118160 mUseFacebookProvider .setText (R .string .facebook_label_missing_config );
161+ setFacebookScopesEnabled (false );
162+ } else {
163+ setFacebookScopesEnabled (mUseFacebookProvider .isChecked ());
164+ mUseFacebookProvider .setOnCheckedChangeListener (new OnCheckedChangeListener () {
165+ @ Override
166+ public void onCheckedChanged (CompoundButton compoundButton , boolean checked ) {
167+ setFacebookScopesEnabled (checked );
168+ }
169+ });
170+ }
171+
172+ if (!isTwitterConfigured ()) {
173+ mUseTwitterProvider .setChecked (false );
174+ mUseTwitterProvider .setEnabled (false );
175+ mUseTwitterProvider .setText (R .string .twitter_label_missing_config );
119176 }
120177
121- if (!isGoogleConfigured () || !isFacebookConfigured ()) {
178+ if (!isGoogleConfigured () || !isFacebookConfigured () || ! isTwitterConfigured () ) {
122179 showSnackbar (R .string .configuration_required );
123180 }
181+
124182 }
125183
126184 @ OnClick (R .id .sign_in )
@@ -147,10 +205,25 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
147205 showSnackbar (R .string .unknown_response );
148206 }
149207
208+
209+ @ MainThread
210+ private void setGoogleScopesEnabled (boolean enabled ) {
211+ mGoogleScopesLabel .setEnabled (enabled );
212+ mGoogleScopeDriveFile .setEnabled (enabled );
213+ mGoogleScopeGames .setEnabled (enabled );
214+ }
215+
216+ @ MainThread
217+ private void setFacebookScopesEnabled (boolean enabled ) {
218+ mFacebookScopesLabel .setEnabled (enabled );
219+ mFacebookScopeFriends .setEnabled (enabled );
220+ mFacebookScopePhotos .setEnabled (enabled );
221+ }
222+
150223 @ MainThread
151224 private void handleSignInResponse (int resultCode , Intent data ) {
152225 if (resultCode == RESULT_OK ) {
153- startActivity (SignedInActivity .createIntent (this ));
226+ startActivity (SignedInActivity .createIntent (this , IdpResponse . fromResultIntent ( data ) ));
154227 finish ();
155228 return ;
156229 }
@@ -160,6 +233,11 @@ private void handleSignInResponse(int resultCode, Intent data) {
160233 return ;
161234 }
162235
236+ if (resultCode == ResultCodes .RESULT_NO_NETWORK ) {
237+ showSnackbar (R .string .no_internet_connection );
238+ return ;
239+ }
240+
163241 showSnackbar (R .string .unknown_sign_in_response );
164242 }
165243
@@ -174,6 +252,10 @@ private int getSelectedTheme() {
174252 return R .style .PurpleTheme ;
175253 }
176254
255+ if (mUseDarkTheme .isChecked ()) {
256+ return R .style .DarkTheme ;
257+ }
258+
177259 return R .style .GreenTheme ;
178260 }
179261
@@ -189,22 +271,32 @@ private int getSelectedLogo() {
189271 }
190272
191273 @ MainThread
192- private String [] getSelectedProviders () {
193- ArrayList < String > selectedProviders = new ArrayList <>();
274+ private List < IdpConfig > getSelectedProviders () {
275+ List < IdpConfig > selectedProviders = new ArrayList <>();
194276
195277 if (mUseEmailProvider .isChecked ()) {
196- selectedProviders .add (AuthUI .EMAIL_PROVIDER );
278+ selectedProviders .add (new IdpConfig . Builder ( AuthUI .EMAIL_PROVIDER ). build () );
197279 }
198280
199281 if (mUseFacebookProvider .isChecked ()) {
200- selectedProviders .add (AuthUI .FACEBOOK_PROVIDER );
282+ selectedProviders .add (
283+ new IdpConfig .Builder (AuthUI .FACEBOOK_PROVIDER )
284+ .setPermissions (getFacebookPermissions ())
285+ .build ());
201286 }
202287
203288 if (mUseGoogleProvider .isChecked ()) {
204- selectedProviders .add (AuthUI .GOOGLE_PROVIDER );
289+ selectedProviders .add (
290+ new IdpConfig .Builder (AuthUI .GOOGLE_PROVIDER )
291+ .setPermissions (getGooglePermissions ())
292+ .build ());
293+ }
294+
295+ if (mUseTwitterProvider .isChecked ()) {
296+ selectedProviders .add (new IdpConfig .Builder (AuthUI .TWITTER_PROVIDER ).build ());
205297 }
206298
207- return selectedProviders . toArray ( new String [ selectedProviders . size ()]) ;
299+ return selectedProviders ;
208300 }
209301
210302 @ MainThread
@@ -228,11 +320,45 @@ private boolean isFacebookConfigured() {
228320 getResources ().getString (R .string .facebook_application_id ));
229321 }
230322
323+ @ MainThread
324+ private boolean isTwitterConfigured () {
325+ List <String > twitterConfigs = Arrays .asList (
326+ getResources ().getString (R .string .twitter_consumer_key ),
327+ getResources ().getString (R .string .twitter_consumer_secret )
328+ );
329+
330+ return !twitterConfigs .contains (UNCHANGED_CONFIG_VALUE );
331+ }
332+
231333 @ MainThread
232334 private void showSnackbar (@ StringRes int errorMessageRes ) {
233335 Snackbar .make (mRootView , errorMessageRes , Snackbar .LENGTH_LONG ).show ();
234336 }
235337
338+ @ MainThread
339+ private List <String > getFacebookPermissions () {
340+ List <String > result = new ArrayList <>();
341+ if (mFacebookScopeFriends .isChecked ()) {
342+ result .add ("user_friends" );
343+ }
344+ if (mFacebookScopePhotos .isChecked ()) {
345+ result .add ("user_photos" );
346+ }
347+ return result ;
348+ }
349+
350+ @ MainThread
351+ private List <String > getGooglePermissions () {
352+ List <String > result = new ArrayList <>();
353+ if (mGoogleScopeGames .isChecked ()) {
354+ result .add (Scopes .GAMES );
355+ }
356+ if (mGoogleScopeDriveFile .isChecked ()) {
357+ result .add (Scopes .DRIVE_FILE );
358+ }
359+ return result ;
360+ }
361+
236362 public static Intent createIntent (Context context ) {
237363 Intent in = new Intent ();
238364 in .setClass (context , AuthUiActivity .class );
0 commit comments