-
-
Save anonymous/8358b836edaa089b4f0df262e570636d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Copyright Google Inc. All Rights Reserved. | |
* <p/> | |
* Licensed under the Apache License, Version 2.0 (the "License"); | |
* you may not use this file except in compliance with the License. | |
* You may obtain a copy of the License at | |
* <p/> | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* <p/> | |
* Unless required by applicable law or agreed to in writing, software | |
* distributed under the License is distributed on an "AS IS" BASIS, | |
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
* See the License for the specific language governing permissions and | |
* limitations under the License. | |
*/ | |
package com.google.firebase.udacity.friendlychat; | |
import android.content.Intent; | |
import android.os.Bundle; | |
import android.support.annotation.NonNull; | |
import android.support.v7.app.AppCompatActivity; | |
import android.text.Editable; | |
import android.text.InputFilter; | |
import android.text.TextWatcher; | |
import android.util.Log; | |
import android.view.Menu; | |
import android.view.MenuInflater; | |
import android.view.MenuItem; | |
import android.view.View; | |
import android.widget.Button; | |
import android.widget.EditText; | |
import android.widget.ImageButton; | |
import android.widget.ListView; | |
import android.widget.ProgressBar; | |
import android.widget.Toast; | |
import com.firebase.ui.auth.AuthUI; | |
import com.google.firebase.auth.FirebaseAuth; | |
import com.google.firebase.auth.FirebaseUser; | |
import com.google.firebase.database.ChildEventListener; | |
import com.google.firebase.database.DataSnapshot; | |
import com.google.firebase.database.DatabaseError; | |
import com.google.firebase.database.DatabaseReference; | |
import com.google.firebase.database.FirebaseDatabase; | |
import java.util.ArrayList; | |
import java.util.List; | |
public class MainActivity extends AppCompatActivity { | |
private static final String TAG = "MainActivity"; | |
public static final String ANONYMOUS = "anonymous"; | |
public static final int DEFAULT_MSG_LENGTH_LIMIT = 1000; | |
public static final int RC_SIGN_IN = 1; | |
private ListView mMessageListView; | |
private MessageAdapter mMessageAdapter; | |
private ProgressBar mProgressBar; | |
private ImageButton mPhotoPickerButton; | |
private EditText mMessageEditText; | |
private Button mSendButton; | |
private String mUsername; | |
// Firebase instance variables | |
private FirebaseDatabase mFirebaseDatabase; | |
private DatabaseReference mMessagesDatabaseReference; | |
private ChildEventListener mChildEventListener; | |
private FirebaseAuth mFirebaseAuth; | |
private FirebaseAuth.AuthStateListener mAuthStateListener; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_main); | |
mUsername = ANONYMOUS; | |
// Initialize Firebase components | |
mFirebaseDatabase = FirebaseDatabase.getInstance(); | |
mFirebaseAuth = FirebaseAuth.getInstance(); | |
mMessagesDatabaseReference = mFirebaseDatabase.getReference().child("messages"); | |
// Initialize references to views | |
mProgressBar = (ProgressBar) findViewById(R.id.progressBar); | |
mMessageListView = (ListView) findViewById(R.id.messageListView); | |
mPhotoPickerButton = (ImageButton) findViewById(R.id.photoPickerButton); | |
mMessageEditText = (EditText) findViewById(R.id.messageEditText); | |
mSendButton = (Button) findViewById(R.id.sendButton); | |
// Initialize message ListView and its adapter | |
List<FriendlyMessage> friendlyMessages = new ArrayList<>(); | |
mMessageAdapter = new MessageAdapter(this, R.layout.item_message, friendlyMessages); | |
mMessageListView.setAdapter(mMessageAdapter); | |
// Initialize progress bar | |
mProgressBar.setVisibility(ProgressBar.INVISIBLE); | |
// ImagePickerButton shows an image picker to upload a image for a message | |
mPhotoPickerButton.setOnClickListener(new View.OnClickListener() { | |
@Override | |
public void onClick(View view) { | |
// TODO: Fire an intent to show an image picker | |
} | |
}); | |
// Enable Send button when there's text to send | |
mMessageEditText.addTextChangedListener(new TextWatcher() { | |
@Override | |
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { | |
} | |
@Override | |
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { | |
if (charSequence.toString().trim().length() > 0) { | |
mSendButton.setEnabled(true); | |
} else { | |
mSendButton.setEnabled(false); | |
} | |
} | |
@Override | |
public void afterTextChanged(Editable editable) { | |
} | |
}); | |
mMessageEditText.setFilters(new InputFilter[]{new InputFilter.LengthFilter(DEFAULT_MSG_LENGTH_LIMIT)}); | |
// Send button sends a message and clears the EditText | |
mSendButton.setOnClickListener(new View.OnClickListener() { | |
@Override | |
public void onClick(View view) { | |
FriendlyMessage friendlyMessage = new FriendlyMessage(mMessageEditText.getText().toString(), mUsername, null); | |
mMessagesDatabaseReference.push().setValue(friendlyMessage); | |
// Clear input box | |
mMessageEditText.setText(""); | |
} | |
}); | |
mAuthStateListener = new FirebaseAuth.AuthStateListener() { | |
@Override | |
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { | |
FirebaseUser user = firebaseAuth.getCurrentUser(); | |
if (user != null) { | |
// User is signed in | |
onSignedInInitialize(user.getDisplayName()); | |
} else { | |
// User is signed out | |
onSignedOutCleanup(); | |
AuthUI.IdpConfig facebookIdp = new AuthUI.IdpConfig.Builder(AuthUI.FACEBOOK_PROVIDER).build(); | |
Log.i(TAG,facebookIdp.getProviderId()); | |
startActivityForResult( | |
AuthUI.getInstance() | |
.createSignInIntentBuilder() | |
.setIsSmartLockEnabled(false) | |
.setProviders( | |
AuthUI.FACEBOOK_PROVIDER, | |
AuthUI.EMAIL_PROVIDER, | |
AuthUI.GOOGLE_PROVIDER) | |
.build(), | |
RC_SIGN_IN); | |
} | |
} | |
}; | |
} | |
@Override | |
public void onActivityResult(int requestCode, int resultCode, Intent data) { | |
super.onActivityResult(requestCode, resultCode, data); | |
if (requestCode == RC_SIGN_IN) { | |
if (resultCode == RESULT_OK) { | |
// Sign-in succeeded, set up the UI | |
Toast.makeText(this, "Signed in!", Toast.LENGTH_SHORT).show(); | |
} else if (resultCode == RESULT_CANCELED) { | |
// Sign in was canceled by the user, finish the activity | |
Toast.makeText(this, "Sign in canceled", Toast.LENGTH_SHORT).show(); | |
finish(); | |
} | |
} | |
} | |
@Override | |
protected void onResume() { | |
super.onResume(); | |
mFirebaseAuth.addAuthStateListener(mAuthStateListener); | |
} | |
@Override | |
protected void onPause() { | |
super.onPause(); | |
if (mAuthStateListener != null) { | |
mFirebaseAuth.removeAuthStateListener(mAuthStateListener); | |
} | |
mMessageAdapter.clear(); | |
detachDatabaseReadListener(); | |
} | |
@Override | |
public boolean onCreateOptionsMenu(Menu menu) { | |
MenuInflater inflater = getMenuInflater(); | |
inflater.inflate(R.menu.main_menu, menu); | |
return true; | |
} | |
@Override | |
public boolean onOptionsItemSelected(MenuItem item) { | |
switch (item.getItemId()) { | |
case R.id.sign_out_menu: | |
AuthUI.getInstance().signOut(this); | |
return true; | |
default: | |
return super.onOptionsItemSelected(item); | |
} | |
} | |
private void onSignedInInitialize(String username) { | |
mUsername = username; | |
attachDatabaseReadListener(); | |
} | |
private void onSignedOutCleanup() { | |
mUsername = ANONYMOUS; | |
mMessageAdapter.clear(); | |
detachDatabaseReadListener(); | |
} | |
private void attachDatabaseReadListener() { | |
if (mChildEventListener == null) { | |
mChildEventListener = new ChildEventListener() { | |
@Override | |
public void onChildAdded(DataSnapshot dataSnapshot, String s) { | |
FriendlyMessage friendlyMessage = dataSnapshot.getValue(FriendlyMessage.class); | |
mMessageAdapter.add(friendlyMessage); | |
} | |
public void onChildChanged(DataSnapshot dataSnapshot, String s) {} | |
public void onChildRemoved(DataSnapshot dataSnapshot) {} | |
public void onChildMoved(DataSnapshot dataSnapshot, String s) {} | |
public void onCancelled(DatabaseError databaseError) {} | |
}; | |
mMessagesDatabaseReference.addChildEventListener(mChildEventListener); | |
} | |
} | |
private void detachDatabaseReadListener() { | |
if (mChildEventListener != null) { | |
mMessagesDatabaseReference.removeEventListener(mChildEventListener); | |
mChildEventListener = null; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment