SignupActivity xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/parent"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/grey_100"
android:orientation="vertical"
android:weightSum="4"
tools:context="com.upt.cti.smartwallet.SignupActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="3"
android:gravity="center_horizontal"
android:orientation="vertical">
<ImageView
android:id="@+id/icon"
style="@style/ThemeOverlay.FirebaseIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"/>
<TextView
android:id="@+id/tStatus"
style="@style/ThemeOverlay.MyTextDetail"
android:hint="Signed out"/>
<TextView
android:id="@+id/tDetail"
style="@style/ThemeOverlay.MyTextDetail"
tools:hint="Firebase User ID: 123456789abc"/>
<ProgressBar
android:id="@+id/pLoading"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:progressDrawable="@drawable/progress_bar"/>
</LinearLayout>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="@color/grey_300"
android:gravity="center_vertical">
<LinearLayout
android:id="@+id/email_password_fields"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp">
<EditText
android:id="@+id/eEmail"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="Email address"
android:inputType="textEmailAddress"/>
<EditText
android:id="@+id/ePass"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="******"
android:inputType="textPassword"/>
</LinearLayout>
<LinearLayout
android:id="@+id/lSignIn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/email_password_fields"
android:orientation="horizontal"
android:paddingLeft="16dp"
android:paddingRight="16dp">
<Button
android:id="@+id/bSignIn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="clicked"
android:text="Sign in"/>
<Button
android:id="@+id/bRegister"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="clicked"
android:text="Register"/>
</LinearLayout>
<Button
android:id="@+id/bSignOut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:onClick="clicked"
android:text="Sign out"
android:visibility="gone"/>
</RelativeLayout>
</LinearLayout>
SignupActivity code skeleton:
public class SignupActivity extends Activity {
private static final String TAG = "smartwallet-login";
// views
private TextView tStatus;
private TextView tDetail;
private EditText eEmail;
private EditText ePass;
private ProgressBar pLoading;
// Firebase
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signup);
// views
tStatus = (TextView) findViewById(R.id.tStatus);
tDetail = (TextView) findViewById(R.id.tDetail);
eEmail = (EditText) findViewById(R.id.eEmail);
ePass = (EditText) findViewById(R.id.ePass);
pLoading = (ProgressBar) findViewById(R.id.pLoading);
mAuth = FirebaseAuth.getInstance();
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// User is signed in
Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
setResult(RESULT_OK);
finish();
} else {
// User is signed out
Log.d(TAG, "onAuthStateChanged:signed_out");
}
updateUI(user);
}
};
}
@Override
public void onStart() {
super.onStart();
mAuth.addAuthStateListener(mAuthListener);
}
@Override
public void onStop() {
super.onStop();
if (mAuthListener != null) {
mAuth.removeAuthStateListener(mAuthListener);
}
}
private void createAccount(String email, String password) {
Log.d(TAG, "createAccount:" + email);
if (!validateForm()) {
return;
}
showProgressDialog();
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(Task<AuthResult> task) {
if (!task.isSuccessful())
Toast.makeText(getApplicationContext(), "Authentication failed", Toast.LENGTH_SHORT).show();
hideProgressDialog();
}
});
}
private void signIn(String email, String password) {
Log.d(TAG, "signIn:" + email);
if (!validateForm()) {
return;
}
showProgressDialog();
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d(TAG, "signInWithEmail:onComplete:" + task.isSuccessful());
if (!task.isSuccessful()) {
Log.w(TAG, "signInWithEmail:failed", task.getException());
Toast.makeText(getApplicationContext(), "Authentication failed", Toast.LENGTH_SHORT).show();
}
if (!task.isSuccessful()) {
tStatus.setText("Authentication failed");
}
hideProgressDialog();
}
});
}
private void signOut() {
mAuth.signOut();
updateUI(null);
}
private boolean validateForm() {
boolean valid = true;
String email = eEmail.getText().toString();
if (TextUtils.isEmpty(email)) {
eEmail.setError("Required.");
valid = false;
} else {
eEmail.setError(null);
}
String password = ePass.getText().toString();
if (TextUtils.isEmpty(password)) {
ePass.setError("Required.");
valid = false;
} else {
ePass.setError(null);
}
return valid;
}
private void updateUI(FirebaseUser user) {
hideProgressDialog();
if (user != null) {
tStatus.setText("Email user: " + user.getEmail());
tDetail.setText("Firebase user: " + user.getUid());
findViewById(R.id.lSignIn).setVisibility(View.GONE);
findViewById(R.id.email_password_fields).setVisibility(View.GONE);
findViewById(R.id.bSignOut).setVisibility(View.VISIBLE);
} else {
tStatus.setText("Signed out");
tDetail.setText(null);
findViewById(R.id.lSignIn).setVisibility(View.VISIBLE);
findViewById(R.id.email_password_fields).setVisibility(View.VISIBLE);
findViewById(R.id.bSignOut).setVisibility(View.GONE);
}
}
public void clicked(View v) {
switch (v.getId()) {
case R.id.bRegister:
createAccount(eEmail.getText().toString(), ePass.getText().toString());
break;
case R.id.bSignIn:
signIn(eEmail.getText().toString(), ePass.getText().toString());
break;
case R.id.bSignOut:
signOut();
break;
}
}
private void showProgressDialog() {
pLoading.setVisibility(View.VISIBLE);
}
private void hideProgressDialog() {
pLoading.setVisibility(View.GONE);
}
}