Skip to content

Commit ff00df8

Browse files
committed
Merge pull request #23 from firebase/0.3.0-puf
0.3.0 puf
2 parents 88e010c + 48c7ee7 commit ff00df8

File tree

6 files changed

+132
-47
lines changed

6 files changed

+132
-47
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
package="com.firebase.uidemo">
33

44
<uses-permission android:name="android.permission.INTERNET" />
5+
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
56

67
<application
78
android:allowBackup="true"

app/src/main/java/com/firebase/uidemo/RecyclerViewDemoActivity.java

Lines changed: 93 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,53 +2,66 @@
22

33
import android.graphics.Color;
44
import android.os.Bundle;
5-
import android.support.v7.app.AppCompatActivity;
65
import android.support.v7.widget.LinearLayoutManager;
76
import android.support.v7.widget.RecyclerView;
87
import android.util.Log;
98
import android.view.Gravity;
9+
import android.view.Menu;
10+
import android.view.MenuItem;
1011
import android.view.View;
1112
import android.widget.Button;
1213
import android.widget.EditText;
1314
import android.widget.TextView;
1415

16+
import com.firebase.client.AuthData;
1517
import com.firebase.client.Firebase;
1618
import com.firebase.client.FirebaseError;
19+
import com.firebase.client.Query;
20+
import com.firebase.ui.FirebaseLoginBaseActivity;
1721
import com.firebase.ui.FirebaseRecyclerViewAdapter;
22+
import com.firebase.ui.com.firebasei.ui.authimpl.SocialProvider;
1823

1924

20-
public class RecyclerViewDemoActivity extends AppCompatActivity {
25+
public class RecyclerViewDemoActivity extends FirebaseLoginBaseActivity {
26+
27+
public static String TAG = "FirebaseUI.chat";
28+
private Firebase mRef;
29+
private AuthData mAuthData;
30+
private Button mSendButton;
31+
private EditText mMessageEdit;
32+
2133
@Override
2234
protected void onCreate(Bundle savedInstanceState) {
2335
super.onCreate(savedInstanceState);
2436
setContentView(R.layout.recycler_view_demo);
2537

26-
final Firebase ref = new Firebase("https://firebaseui.firebaseio.com/chat");
27-
2838
final String name = "Android User";
29-
final Button sendButton = (Button) findViewById(R.id.sendButton);
30-
final EditText messageEdit = (EditText) findViewById(R.id.messageEdit);
39+
mSendButton = (Button) findViewById(R.id.sendButton);
40+
mMessageEdit = (EditText) findViewById(R.id.messageEdit);
3141
final RecyclerView messages = (RecyclerView) findViewById(R.id.messagesList);
3242
messages.setHasFixedSize(true);
3343
messages.setLayoutManager(new LinearLayoutManager(this));
3444

35-
sendButton.setOnClickListener(new View.OnClickListener() {
45+
mRef = new Firebase("https://firebaseui.firebaseio.com/chat");
46+
47+
mSendButton.setOnClickListener(new View.OnClickListener() {
3648
@Override
3749
public void onClick(View v) {
38-
Chat chat = new Chat(name, messageEdit.getText().toString());
39-
ref.push().setValue(chat, new Firebase.CompletionListener() {
50+
Chat chat = new Chat(name, mMessageEdit.getText().toString());
51+
mRef.push().setValue(chat, new Firebase.CompletionListener() {
4052
@Override
4153
public void onComplete(FirebaseError firebaseError, Firebase firebase) {
4254
if (firebaseError != null) {
43-
Log.e("FirebaseUI.chat", firebaseError.toString());
55+
Log.e(TAG, firebaseError.toString());
4456
}
4557
}
4658
});
47-
messageEdit.setText("");
59+
mMessageEdit.setText("");
4860
}
4961
});
5062

51-
FirebaseRecyclerViewAdapter<Chat, ChatHolder> adapter = new FirebaseRecyclerViewAdapter<Chat, ChatHolder>(Chat.class, android.R.layout.two_line_list_item, ChatHolder.class, ref) {
63+
Query recentMessages = mRef.limitToLast(50);
64+
FirebaseRecyclerViewAdapter<Chat, ChatHolder> adapter = new FirebaseRecyclerViewAdapter<Chat, ChatHolder>(Chat.class, android.R.layout.two_line_list_item, ChatHolder.class, recentMessages) {
5265
@Override
5366
public void populateViewHolder(ChatHolder chatView, Chat chat) {
5467
chatView.textView.setText(chat.getText());
@@ -68,6 +81,74 @@ public void populateViewHolder(ChatHolder chatView, Chat chat) {
6881
messages.setAdapter(adapter);
6982
}
7083

84+
public static final int LOGIN = Menu.FIRST;
85+
public static final int LOGOUT = LOGIN+1;
86+
87+
@Override
88+
public boolean onCreateOptionsMenu(Menu menu) {
89+
menu.add(LOGIN, LOGIN, LOGIN, "Log in");
90+
menu.add(LOGOUT, LOGOUT, LOGOUT, "Log out");
91+
92+
return super.onCreateOptionsMenu(menu);
93+
}
94+
95+
@Override
96+
public boolean onPrepareOptionsMenu(Menu menu) {
97+
menu.getItem(LOGIN-Menu.FIRST).setVisible(mAuthData == null);
98+
menu.getItem(LOGOUT-Menu.FIRST).setVisible(mAuthData != null);
99+
mSendButton.setEnabled(mAuthData != null);
100+
mMessageEdit.setEnabled(mAuthData != null);
101+
return super.onPrepareOptionsMenu(menu);
102+
}
103+
104+
@Override
105+
public boolean onOptionsItemSelected(MenuItem item) {
106+
switch (item.getItemId()) {
107+
case LOGIN:
108+
this.loginWithProvider(SocialProvider.google);
109+
return true;
110+
case LOGOUT:
111+
this.logout();
112+
return true;
113+
}
114+
115+
return super.onOptionsItemSelected(item);
116+
}
117+
118+
119+
120+
// Start of FirebaseLoginBaseActivity
121+
122+
@Override
123+
public void onFirebaseLogin(AuthData authData) {
124+
Log.i(TAG, "Logged in");
125+
mAuthData = authData;
126+
invalidateOptionsMenu();
127+
}
128+
129+
@Override
130+
public void onFirebaseLogout() {
131+
Log.i(TAG, "Logged out");
132+
mAuthData = null;
133+
invalidateOptionsMenu();
134+
}
135+
136+
@Override
137+
public void onFirebaseLoginError(FirebaseError firebaseError) {
138+
Log.e(TAG, firebaseError.toString());
139+
}
140+
141+
@Override
142+
public void onFirebaseLoginCancel() {
143+
Log.i(TAG, "Login cancelled");
144+
}
145+
146+
@Override
147+
public Firebase getFirebaseRef() {
148+
return mRef;
149+
}
150+
151+
// End of FirebaseLoginBaseActivity
71152

72153
public static class Chat {
73154
String name;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
android:layout_alignParentLeft="true"
1414
android:layout_alignParentStart="true"
1515
android:layout_alignParentTop="true"
16-
android:layout_above="@+id/linearLayout" />
16+
android:layout_above="@+id/footer" />
1717

1818
<LinearLayout
1919
android:orientation="horizontal"
@@ -22,7 +22,7 @@
2222
android:layout_alignParentLeft="true"
2323
android:layout_alignParentStart="true"
2424
android:layout_alignParentBottom="true"
25-
android:id="@+id/linearLayout">
25+
android:id="@+id/footer">
2626

2727
<EditText
2828
android:layout_width="wrap_content"

library/src/main/java/com/firebase/ui/FirebaseLoginBaseActivity.java

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package com.firebase.ui;
22

33
import android.os.Bundle;
4-
import android.os.PersistableBundle;
54
import android.support.v7.app.AppCompatActivity;
6-
import android.util.Log;
75

86
import com.firebase.client.AuthData;
97
import com.firebase.client.Firebase;
@@ -22,59 +20,59 @@ public abstract class FirebaseLoginBaseActivity extends AppCompatActivity {
2220

2321
private final String LOG_TAG = "FirebaseLoginBaseAct";
2422

25-
public Firebase ref;
26-
2723
private GoogleAuthHelper mGoogleAuthHelper;
2824

29-
public SocialProvider chosenProvider;
25+
public SocialProvider mChosenProvider;
3026

3127
/* Abstract methods for Login Events */
32-
public abstract void onFirebaseLogin(AuthData authData);
28+
protected abstract void onFirebaseLogin(AuthData authData);
3329

34-
public abstract void onFirebaseLogout();
30+
protected abstract void onFirebaseLogout();
3531

36-
public abstract void onFirebaseLoginError(FirebaseError firebaseError);
32+
protected abstract void onFirebaseLoginError(FirebaseError firebaseError);
3733

38-
public abstract void onFirebaseLoginCancel();
34+
protected abstract void onFirebaseLoginCancel();
3935

40-
public abstract Firebase setupFirebase();
36+
/**
37+
* Subclasses of this activity must implement this method and return a valid Firebase reference that
38+
* can be used to call authentication related methods on.
39+
*
40+
* @return a Firebase reference that can be used to call authentication related methods on
41+
*/
42+
protected abstract Firebase getFirebaseRef();
4143

4244
/* Login/Logout */
4345

4446
public void loginWithProvider(SocialProvider provider) {
47+
// TODO: what should happen if you're already authenticated?
4548
switch (provider) {
46-
case Google:
49+
case google:
4750
mGoogleAuthHelper.login();
4851
break;
49-
case Facebook:
50-
break;
51-
case Twitter:
52-
break;
52+
case facebook:
53+
case twitter:
54+
throw new UnsupportedOperationException();
5355
}
5456

55-
chosenProvider = provider;
57+
mChosenProvider = provider;
5658
}
5759

5860
public void logout() {
59-
switch (chosenProvider) {
60-
case Google:
61+
switch (mChosenProvider) {
62+
case google:
6163
mGoogleAuthHelper.logout();
6264
break;
63-
case Facebook:
64-
break;
65-
case Twitter:
66-
break;
65+
case facebook:
66+
case twitter:
67+
throw new UnsupportedOperationException();
6768
}
68-
ref.unauth();
69+
getFirebaseRef().unauth();
6970
}
7071

7172

7273
@Override
73-
public void onCreate(Bundle savedInstanceState) {
74+
protected void onCreate(Bundle savedInstanceState) {
7475
super.onCreate(savedInstanceState);
75-
Firebase.setAndroidContext(this);
76-
77-
ref = setupFirebase();
7876

7977
mGoogleAuthHelper = new GoogleAuthHelper(this, new TokenAuthHandler() {
8078
@Override
@@ -97,10 +95,13 @@ public void onError(Exception ex) {
9795
@Override
9896
protected void onStart() {
9997
super.onStart();
100-
ref.addAuthStateListener(new Firebase.AuthStateListener() {
98+
// TODO: is there a way to delay this? Or make it on-demand (i.e. make them call `startMonitoringState`)?
99+
// TODO: should we remove the authStateListener on `onStop()`?
100+
getFirebaseRef().addAuthStateListener(new Firebase.AuthStateListener() {
101101
@Override
102102
public void onAuthStateChanged(AuthData authData) {
103103
if (authData != null) {
104+
mChosenProvider = SocialProvider.valueOf(authData.getProvider());
104105
onFirebaseLogin(authData);
105106
} else {
106107
onFirebaseLogout();
@@ -110,10 +111,10 @@ public void onAuthStateChanged(AuthData authData) {
110111
}
111112

112113
private void authenticateRefWithProvider(String provider, String token) {
113-
ref.authWithOAuthToken(provider, token, new Firebase.AuthResultHandler() {
114+
getFirebaseRef().authWithOAuthToken(provider, token, new Firebase.AuthResultHandler() {
114115
@Override
115116
public void onAuthenticated(AuthData authData) {
116-
// Do nothing. Auth updates are handled in the AuthStateListener
117+
// Do nothing. Auth updates are handled in the AuthStateListener
117118
}
118119

119120
@Override

library/src/main/java/com/firebase/ui/com/firebasei/ui/authimpl/GoogleAuthHelper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ private void resolveSignInError() {
149149
}
150150
} else {
151151
// Create error code?
152+
Log.e(LOG_TAG, mGoogleConnectionResult.toString());
152153
}
153154
}
154155
}
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package com.firebase.ui.com.firebasei.ui.authimpl;
22

3+
// Note: these enum values must be lowercase, to ensure they match the casing used by the Firebase Authentication providers
34
public enum SocialProvider {
4-
Google,
5-
Facebook,
6-
Twitter
5+
google,
6+
facebook,
7+
twitter
78
}

0 commit comments

Comments
 (0)