46
DAFTAR PUSTAKA
Andreyanto. 2012. Pengertian Dasar dan Simbol Flowchart.
http://andreyanto-gunadarma.blogspot.co.id. Diakses pada tanggal 17 Mei 2017.
Aribowo, Titis Dwi. 2013. Pembuatan Aplikasi Mobile Untuk Mengetahui
Rumus-Rumus Akuntansi Dasar Berbasis Android. Skripsi.
Arifianto Rahmat. 2014. Pengertian Flowchart dan Jenis-Jenisnya.
https://rahmatarifianto.wordpress.com. Diakses pada tanggal 23 Juli 2017.
Bony,
Octavianus.
2016.
Android
Apa
Itu
Firebase.
https://coolnetkid.wordpress.com. Diakses pada tanggal 21 Juni 2017.
Juansyah Andy. 2015. Pembangunan Aplikasi Child Tracker Berbasis
Assisted-Global Positioning System (A-Gps) Dengan Platform Android. Jurnal Ilmiah
Komputer dan Informatika (KOMPUTA).Vol 1, 2-3.
Khasanah Amalia. 2013. Perancangan Aplikasi Al Qur’an Menggunakan Voice
Recognition Sebagai Media Pencarian Terjemahan Al Qur’an Berbasis
Android. Skripsi
N. Safaat. 2015. Pemograman Aplikasi Mobile Smartphone Dan Tablet PC
Berbasis Android. Bandung: Informatika.
Pressman. 2012. Pengertian dan Fungsi Pengujian Kotak Hitam (Blackbox
Testing). http://www.iansyahbelajar.com. Diakses pada tanggal 17 Mei 2017.
Radhiah Ainatul. 2014. Rancang Bangun Secure Chatting Pada Platform Android
Dengan Algoritma Twofish. Thesis.
Suryasari, Callista Astrid, dkk. 2012. Rancangan Aplikasi Customer Service pada
47
1. MainActivity.java
public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); Intent intent = new Intent(this,
ChatListActivity.class); startActivity(intent); } }
2.Chat.java
import java.util.ArrayList; import java.util.List; public class Chat {private String uid; //user id
private String chatName; //namachat
private List<Message> messages; //isi pesan private List<Friend> friends;
public Chat(){ }
public Chat(String uid, String chatName){ this.uid = uid;
this.chatName = chatName;
this.messages = new ArrayList<Message>(); this.friends = new ArrayList<Friend>(); }
public void setChatName(String chatName) { this.chatName = chatName;
}
public void setUid(String uid) { this.uid = uid;
}
public String getUid() { return uid;
}
public String getChatName() { return chatName;
}
return messages; }
public List<Friend> getFriends() { return friends;
}
public boolean appendFriend(Friend friend){
Boolean contFriend = friends.contains(friend); if(!contFriend){ friends.add(friend); return true; } return false; }
public boolean removeFriend(Friend friend){ friends.remove(friend);
return true; }
}
3.Friend.java
public class Friend { private String email; public Friend(){ }
public Friend(String email){ this.email = email; }
public String getEmail() { return email;
}
public boolean equals(Object o){ if(o == null){
return false; }
if(!(o instanceof Friend)){ return false;
}
Friend friend = (Friend) o;
return this.email == friend.email; }
//TODO: Override hashcode object
public int hashCode(){
return email.hashCode(); }
4. Message
public class Message { private String sender; private String message;
private Boolean multimedia = false; private String contentType = ""; private String contentLocation = ""; private String timestamp = "";
public Message(){ }
public Message(String sender, String message, String time){ this.sender = sender;
this.message = message; this.timestamp = time; this.multimedia = false; }
public Message(String sender, String message, String contentType, String contentLocation, String time){
this.sender = sender; this.message = message; this.multimedia = true; this.contentType = contentType; this.timestamp = time; this.contentLocation = contentLocation; }
public String getSender() { return sender;
}
public String getTimestamp(){return timestamp;} public String getMessage() {
return message; }
public String getContentLocation() { return contentLocation;
}
public Boolean getMultimedia() { return multimedia;
}
public String getContentType() { return contentType;
} }
5. User
public class User {
private String username; private String email;
private String profilePicLocation; public User(){
}
public User(String name, String email){ this.username = name;
this.email = email; }
public String getUsername() { return username;
}
public String getEmail() { return email;
}
public String getProfilePicLocation() { return profilePicLocation; } }
6. AddConversationDailogFragment.java
import android.app.Dialog; import android.app.DialogFragment; import android.content.DialogInterface; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.view.LayoutInflater; import android.view.View; import cs656.com.firebasemessengerapp.R;public class AddConversationDialogFragment extends DialogFragment {
public static DialogFragment newInstance() { AddConversationDialogFragment
addConversationDialogFragment = new AddConversationDialogFragment(); Bundle bundle = new Bundle();
addConversationDialogFragment.setArguments(bundle); return addConversationDialogFragment;
}
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) { // menngunakan builder alert dialog
AlertDialog.Builder builder = new
AlertDialog.Builder(getActivity()); // mengambil layout inflater
LayoutInflater inflater =
getActivity().getLayoutInflater();
View rootView = inflater.inflate(R.layout.add_chat, null);
builder.setView(rootView)
/* menambahkan create button */
.setPositiveButton("Create", new
DialogInterface.OnClickListener() { @Override
public void onClick(DialogInterface dialog, int id) { } }); return builder.create(); } }
7. ChatActivity.java
import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.fasterxml.jackson.databind.ObjectMapper; import com.firebase.ui.database.FirebaseListAdapter; import com.firebase.ui.storage.images.FirebaseImageLoader; import com.google.firebase.auth.FirebaseAuth; 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 com.google.firebase.database.ValueEventListener; import com.google.firebase.storage.FirebaseStorage; import com.google.firebase.storage.StorageReference; import java.util.HashMap; import java.util.Map;import cs656.com.firebasemessengerapp.R; import cs656.com.firebasemessengerapp.model.Chat; import cs656.com.firebasemessengerapp.model.Friend; import cs656.com.firebasemessengerapp.model.Message; import cs656.com.firebasemessengerapp.model.User; import cs656.com.firebasemessengerapp.utils.Constants; import jp.wasabeef.glide.transformations.CropCircleTransformation;
//tampilan ini berfungsi untuk membuat percakapan baru pada aplikasi
public class ChatActivity extends AppCompatActivity { private String TAG = "New Conversation";
private ListView mListView; private Toolbar mToolBar;
private FirebaseListAdapter mFriendListAdapter; private ValueEventListener mValueEventListener; private FirebaseDatabase mFirebaseDatabase; private FirebaseAuth mFirebaseAuth;
private DatabaseReference mFriendsLocationDatabaseReference; private DatabaseReference mCurrentUserDatabaseReference; private DatabaseReference mFriendDatabaseReference; private TextView mFriendsInChat;
private EditText mChatName; //objek untuk Chat
private Chat mChat;
private DatabaseReference mUserDatabaseRef; private ImageButton mCreateButton;
@Override
protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.add_chat); initializeScreen(); showFriendsList(); addListeners(); }
private void addListeners(){
mChatName.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) {
mCreateButton.setEnabled(true); } else {
} }
@Override
public void afterTextChanged(Editable editable) { }
}); }
//menapilkan teman yang sudah di tambahkan
private void showFriendsList() {
//TODO: This list should not show your own userid..
mFriendListAdapter = new
FirebaseListAdapter<String>(this, String.class,
R.layout.friend_item, mFriendsLocationDatabaseReference) { @Override
protected void populateView(final View view, final String friend, final int position) {
Log.e("TAG", friend);
final Friend addFriend = new Friend(friend); ((TextView) view.findViewById(R.id.nameTextView)).setText(friend); mUserDatabaseRef.child(friend).addValueEventListener(new ValueEventListener() { @Override
public void onDataChange(DataSnapshot dataSnapshot) { User fUser = dataSnapshot.getValue(User.class); if(fUser != null){
((TextView) view.findViewById(R.id.messageTextView)) .setText(fUser.getUsername());
if(fUser.getProfilePicLocation() != null && fUser.getProfilePicLocation().length() > 0){ try{
StorageReference storageRef = FirebaseStorage.getInstance() .getReference().child(fUser.getProfilePicLocation()); Glide.with(view.getContext()) .using(new FirebaseImageLoader()) .load(storageRef) .bitmapTransform(new CropCircleTransformation(view.getContext())) .into((ImageView)view.findViewById(R.id.photoImageView)); }catch(Exception e){ Log.e("Err", e.toString()); } } }else{ ((TextView) view.findViewById(R.id.messageTextView))
.setText("A girl has no name");
} }
@Override
public void onCancelled(DatabaseError databaseError) {
} });
//untuk menyembunyikan tombol remove friends
if(mChat.getFriends().isEmpty()){ view.findViewById(R.id.removeFriend).setVisibility(View.GONE); } (view.findViewById(R.id.addFriend)).setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
Log.e(TAG, "Clicking row: " + position); Log.e(TAG, "Clicking user: " + friend); //TODO: selesai menambhakn objek dan
kemudian di tambahkan ke firebase
//menambahkan teman ke percakapan
if(mChat.appendFriend(addFriend)){ String friendsString = ""; for(Friend f: mChat.getFriends()){ friendsString += f.getEmail() + ", "; } friendsString = friendsString.substring(0, friendsString.length() - 2); mFriendsInChat.setText("Users added to chat: " + friendsString); } view.findViewById(R.id.removeFriend).setVisibility(View.VISIBLE) ; view.findViewById(R.id.addFriend).setVisibility(View.GONE); Log.e(TAG, "Adding to chat: " + friend); } }); (view.findViewById(R.id.removeFriend)).setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
Log.e(TAG, "Clicking row: " + position); Log.e(TAG, "Clicking user: " + friend); //TODO: Add remove methods
mChat.removeFriend(addFriend); String friendsString = ""; for(Friend f: mChat.getFriends()){ friendsString += f.getEmail() + ", "; }
if(friendsString.length()>1) { friendsString = friendsString.substring(0, friendsString.length() - 2); mFriendsInChat.setText("Users added to chat: " + friendsString); }else{ mFriendsInChat.setText("Users added to chat: "); } view.findViewById(R.id.addFriend).setVisibility(View.VISIBLE); view.findViewById(R.id.removeFriend).setVisibility(View.GONE); Log.e(TAG, "Removing from chat: " + friend); } }); } }; mListView.setAdapter(mFriendListAdapter); mValueEventListener = mFriendsLocationDatabaseReference.addValueEventListener(new ValueEventListener() { @Override
public void onDataChange(DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class); if (user == null) { finish(); return; } mFriendListAdapter.notifyDataSetChanged(); } @Override
public void onCancelled(DatabaseError databaseError) {
} }); }
//TODO: Add create new Chat function
public void createChat(View view){
//final String userLoggedIn =
mFirebaseAuth.getCurrentUser().getEmail();
//Log.e(TAG, "User logged in is: " + userLoggedIn); //final String newFriendEncodedEmail =
encodeEmail(newFriendEmail);
final DatabaseReference chatRef =
mFirebaseDatabase.getReference(Constants.CHAT_LOCATION); final DatabaseReference messageRef =
mFirebaseDatabase.getReference(Constants.MESSAGE_LOCATION); final DatabaseReference pushRef = chatRef.push(); final String pushKey = pushRef.getKey();
mChat.setChatName(mChatName.getText().toString()); Log.e(TAG, "Push key is: " + pushKey);
//Create HashMap for Pushing Conv
HashMap<String, Object> chatItemMap = new
HashMap<String, Object>();
HashMap<String,Object> chatObj = (HashMap<String, Object>) new ObjectMapper()
.convertValue(mChat, Map.class); chatItemMap.put("/" + pushKey, chatObj); chatRef.updateChildren(chatItemMap);
//Create corresponding message location for this chat
String initialMessage =
mFriendsInChat.getText().toString(); Message initialMessages =
new Message("System", initialMessage, ""); final DatabaseReference initMsgRef =
mFirebaseDatabase.getReference(Constants.MESSAGE_LOCATION + "/" + pushKey);
final DatabaseReference msgPush = initMsgRef.push(); final String msgPushKey = msgPush.getKey();
initMsgRef.child(msgPushKey).setValue(initialMessages);
Chat/User/Chats[chat1, chat2 ..]
replication issue, we could just send chat id other pages
chatItemMap = new HashMap<String, Object>();
chatItemMap.put("/chats/" + pushKey, chatObj);
mCurrentUserDatabaseReference.updateChildren(chatItemMap);
//Push chat to all friends
for(Friend f: mChat.getFriends()){
mFriendDatabaseReference =
mFirebaseDatabase.getReference().child(Constants.USERS_LOCATION
+ "/" + encodeEmail(f.getEmail()));
chatItemMap = new HashMap<String, Object>(); chatItemMap.put("/chats/" + pushKey, chatObj);
mFriendDatabaseReference.updateChildren(chatItemMap); mFriendDatabaseReference = null;
}
Intent intent = new Intent(view.getContext(), ChatMessagesActivity.class);
String messageKey = pushKey;
intent.putExtra(Constants.MESSAGE_ID, messageKey); intent.putExtra(Constants.CHAT_NAME,
mChat.getChatName());
startActivity(intent); }
//TODO: Used in multiple places, should probably move to its
own class
public static String encodeEmail(String userEmail) {
}
private void initializeScreen() {
mFirebaseDatabase = FirebaseDatabase.getInstance(); mFirebaseAuth = FirebaseAuth.getInstance(); mUserDatabaseRef = mFirebaseDatabase.getReference().child(Constants.USERS_LOCATION) ; mCurrentUserDatabaseReference = mFirebaseDatabase.getReference().child(Constants.USERS_LOCATION + "/" + encodeEmail(mFirebaseAuth.getCurrentUser().getEmail()));
//Eventually this list will filter out users that are
already your friend
mFriendsLocationDatabaseReference = mFirebaseDatabase.getReference().child(Constants.FRIENDS_LOCATIO N + "/" + encodeEmail(mFirebaseAuth.getCurrentUser().getEmail())); mListView = (ListView) findViewById(R.id.conversationListView);
//mToolBar = (Toolbar) findViewById(R.id.toolbar);
mListView = (ListView)
findViewById(R.id.conversationListView);
mToolBar = (Toolbar) findViewById(R.id.toolbar); mToolBar.setTitle("Create new chat");
setSupportActionBar(mToolBar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); mToolBar.setNavigationOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) { finish(); } }); mCreateButton = (ImageButton) findViewById(R.id.createButton); mFriendsInChat = (TextView) findViewById(R.id.friendsInChat);
mChatName = (EditText) findViewById(R.id.chat_name); mChat = new Chat("","");
} }
8. ChatListActivity.java
import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar;import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; import com.firebase.ui.auth.AuthUI; import com.firebase.ui.database.FirebaseListAdapter; import com.firebase.ui.storage.images.FirebaseImageLoader; 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 com.google.firebase.database.ValueEventListener; import com.google.firebase.storage.FirebaseStorage; import com.google.firebase.storage.StorageReference; import cs656.com.firebasemessengerapp.R; import cs656.com.firebasemessengerapp.model.Chat; import cs656.com.firebasemessengerapp.model.Message; import cs656.com.firebasemessengerapp.model.User; import cs656.com.firebasemessengerapp.utils.Constants; import jp.wasabeef.glide.transformations.CropCircleTransformation; public class ChatListActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; public static final String ANONYMOUS = "anonymous"; public static final int RC_SIGN_IN = 1;
private FirebaseAuth.AuthStateListener mAuthStateListener; private FirebaseAuth mFirebaseAuth;
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference mChatDatabaseReference; private ChildEventListener mChildEventListener; private ListView mChatListView;
private FirebaseListAdapter mChatAdapter; private String mUsername;
private ValueEventListener mValueEventListener; private DatabaseReference mUserDatabaseReference; @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar);
//inisiasi firebase komponen mFirebaseDatabase = FirebaseDatabase.getInstance(); mFirebaseAuth = FirebaseAuth.getInstance(); mAuthStateListener = new FirebaseAuth.AuthStateListener() { @Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser(); if (user != null) {
// jika user sudah masuk
//maka masuk ke fungsi create user createUser(user);
onSignedInInitialize(user); } else {
// jika user keluar
// akan menjalankan fungsi onSignedOutCleanup(); // menghapus session startActivityForResult( AuthUI.getInstance() .createSignInIntentBuilder() .setIsSmartLockEnabled(false) .setProviders(
AuthUI.EMAIL_PROVIDER, //ini adalah tombol email template bawaan
AuthUI.GOOGLE_PROVIDER) //tombol login google
.build(), RC_SIGN_IN); } } }; }
//TODO: tombol plus tidak bisa di pencet jika belum
menambahkan teman pada menu friends
public void createNewChat(View view){
Intent intent = new Intent(this, ChatActivity.class); startActivity(intent);
}
private void onSignedInInitialize(FirebaseUser user) { mUsername = user.getDisplayName(); mChatDatabaseReference = mFirebaseDatabase.getReference() .child(Constants.USERS_LOCATION + "/" + encodeEmail(user.getEmail()) + "/" + Constants.CHAT_LOCATION ); mUserDatabaseReference = mFirebaseDatabase.getReference() .child(Constants.USERS_LOCATION); //Inisasi variabel activiti
mChatListView = (ListView)
findViewById(R.id.chatListView);
mChatAdapter = new FirebaseListAdapter<Chat>(this, Chat.class, R.layout.chat_item, mChatDatabaseReference) { @Override
protected void populateView(final View view, Chat chat, final int position) {
((TextView)
view.findViewById(R.id.messageTextView)).setText(chat.getChatNam e());
//mengambil pesan terakhir dari database chat
final DatabaseReference messageRef =
mFirebaseDatabase.getReference(Constants.MESSAGE_LOCATION
+ "/" + chat.getUid());
final TextView latestMessage = (TextView)view.findViewById(R.id.nameTextView); final ImageView senderPic =
(ImageView)view.findViewById(R.id.photoImageView); messageRef.addChildEventListener(new ChildEventListener() {
@Override //untuk menambahkan pesan ke
database
public void onChildAdded(DataSnapshot
dataSnapshot, String prevChildKey) { Message newMsg = dataSnapshot.getValue(Message.class); latestMessage.setText(newMsg.getSender() + ": " + newMsg.getMessage()); mUserDatabaseReference.child(newMsg.getSender()) .addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { User msgSender = dataSnapshot.getValue(User.class);
if(msgSender != null && msgSender.getProfilePicLocation() != null){ StorageReference storageRef = FirebaseStorage.getInstance() .getReference().child(msgSender.getProfilePicLocation()); Glide.with(view.getContext()) .using(new FirebaseImageLoader()) .load(storageRef) .bitmapTransform(new
CropCircleTransformation(view.getContext())) .into(senderPic); } } @Override public void onCancelled(DatabaseError databaseError) { } }); } @Override
public void onChildChanged(DataSnapshot dataSnapshot, String prevChildKey) {}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String prevChildKey) {}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
//Replace this with the most recent message from
the chat }
};
//inisiasi adapter list vier pada aktiviti chatlist
mChatListView.setAdapter(mChatAdapter);
//untuk mengklik list adapter yang telah di buat
mChatListView.setOnItemClickListener(new
AdapterView.OnItemClickListener(){ @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String messageLocation = mChatAdapter.getRef(position).toString(); if(messageLocation != null){ Intent intent = new
Intent(view.getContext(), ChatMessagesActivity.class); String messageKey = mChatAdapter.getRef(position).getKey(); intent.putExtra(Constants.MESSAGE_ID, messageKey); Chat chatItem = (Chat)mChatAdapter.getItem(position);
intent.putExtra(Constants.CHAT_NAME, chatItem.getChatName()); startActivity(intent); } } }); mValueEventListener = mChatDatabaseReference.addValueEventListener(new ValueEventListener() { @Override
public void onDataChange(DataSnapshot dataSnapshot) {
Chat chat = dataSnapshot.getValue(Chat.class); //mengecek data pada database
if (chat == null) { //finish(); return; } mChatAdapter.notifyDataSetChanged(); } @Override
public void onCancelled(DatabaseError databaseError) {
} }); }
@Override
protected void onResume() { super.onResume();
mFirebaseAuth.addAuthStateListener(mAuthStateListener); //fungsi session firebase
//sehingga session tetap ada kecuali di signout }
@Override
protected void onPause() { super.onPause();
if (mAuthStateListener != null) {
mFirebaseAuth.removeAuthStateListener(mAuthStateListener); //fungsi session firebase
//sehingga session tetap ada kecuali di signout }
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar
if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true; }
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) {
if (resultCode == RESULT_OK) {
Toast.makeText(this, "Signed in!",
Toast.LENGTH_SHORT).show(); //menampilakn pesan jika berhasil
login
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(this, "Sign in canceled", Toast.LENGTH_SHORT).show(); //menampilakn pesan jika berhasil
gagal login
finish();
}
} else if (resultCode == RESULT_OK) { }
}
@Override
public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.sign_out) { AuthUI.getInstance() .signOut(this); } if (id == R.id.listFriends) {
Intent intent = new Intent(this,
FriendsListActivity.class);
startActivity(intent); }
if (id == R.id.profilePage) {
//Open up activity where a user can add and view
friends
Intent intent = new Intent(this,
ProfileActivity.class);
startActivity(intent); }
return true; }
//membuat user baru pada firebase
private void createUser(FirebaseUser user) {
final DatabaseReference usersRef =
mFirebaseDatabase.getReference(Constants.USERS_LOCATION); final String encodedEmail =
encodeEmail(user.getEmail());
final DatabaseReference userRef = usersRef.child(encodedEmail);
final String username = user.getDisplayName(); userRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
{
if (dataSnapshot.getValue() == null) { User newUser = new User(username,
encodeEmail(encodedEmail));
userRef.setValue(newUser); }
}
@Override
public void onCancelled(DatabaseError databaseError) {
} }); }
//TODO: Used in multiple places, should probably move to its
own class
public static String encodeEmail(String userEmail) {
return userEmail.replace(".", ","); } }
9. FriendsListActivity.java
import android.app.ProgressDialog; import android.content.Intent; import android.content.pm.PackageManager; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaRecorder; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.text.Editable; import android.text.TextWatcher; import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.fasterxml.jackson.databind.ObjectMapper; import com.firebase.ui.database.FirebaseListAdapter; import com.firebase.ui.storage.images.FirebaseImageLoader; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnFailureListener; import com.google.android.gms.tasks.OnSuccessListener;import com.google.android.gms.tasks.Task; import com.google.firebase.auth.FirebaseAuth; 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 com.google.firebase.database.ValueEventListener; import com.google.firebase.storage.FirebaseStorage; import com.google.firebase.storage.StorageReference; import com.google.firebase.storage.UploadTask; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.UUID; import cs656.com.firebasemessengerapp.R; import cs656.com.firebasemessengerapp.model.Message; import cs656.com.firebasemessengerapp.model.User; import cs656.com.firebasemessengerapp.utils.Constants; import jp.wasabeef.glide.transformations.CropCircleTransformation; public class ChatMessagesActivity extends
AppCompatActivity {
private String messageId;
private TextView mMessageField; private ImageButton mSendButton; private String chatName;
private ListView mMessageList; private Toolbar mToolBar;
private String currentUserEmail;
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference mMessageDatabaseReference; private DatabaseReference mUsersDatabaseReference; private FirebaseListAdapter<Message>
mMessageListAdapter;
private FirebaseAuth mFirebaseAuth; private ImageButton mphotoPickerButton; private static final int GALLERY_INTENT=2; private StorageReference mStorage;
private ProgressDialog mProgress;
private ImageButton mrecordVoiceButton; private TextView mRecordLable;
private MediaRecorder mRecorder; private String mFileName = null;
private static final String LOG_TAG = "Record_log"; private ValueEventListener mValueEventListener;
//Audio Runtime Permissions
private boolean permissionToRecordAccepted = false;
private boolean permissionToWriteAccepted = false; private String [] permissions =
{"android.permission.RECORD_AUDIO",
"android.permission.WRITE_EXTERNAL_STORAGE"};
//untuk menampilkan popup permission record audio
dan write external storage @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode){ case 200: permissionToRecordAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED; permissionToWriteAccepted = grantResults[1] == PackageManager.PERMISSION_GRANTED; break; } if (!permissionToRecordAccepted ) ChatMessagesActivity.super.finish(); if (!permissionToWriteAccepted ) ChatMessagesActivity.super.finish(); } @Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.messages_activity);
Intent intent = this.getIntent();
messageId = intent.getStringExtra(Constants.MESSAGE_ID); chatName = intent.getStringExtra(Constants.CHAT_NAME); if(messageId == null){
finish(); // replace this.. nav user back to home
return;
}
//Check Permissions at runtime
int requestCode = 200; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(permissions, requestCode); } initializeScreen(); mToolBar.setTitle(chatName); showMessages(); addListeners(); openImageSelector();
openVoiceRecorder(); }
//mengambil gambar dari galery
public void openImageSelector(){
mphotoPickerButton = (ImageButton) findViewById(R.id.photoPickerButton);
mProgress = new ProgressDialog(this); mphotoPickerButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); startActivityForResult(intent, GALLERY_INTENT); } }); } @Override
protected void onActivityResult(int requestCode, int resultCode, final Intent data){
mStorage = FirebaseStorage.getInstance().getReference();
//make global
super.onActivityResult(requestCode, requestCode, data);
if(requestCode ==GALLERY_INTENT && resultCode ==
RESULT_OK){
mProgress.setMessage("Sending the image..."); mProgress.show();
Uri uri = data.getData();
//Keep all images for a specific chat grouped
together
final String imageLocation = "Photos" + "/" +
messageId;
final String imageLocationId = imageLocation + "/" + uri.getLastPathSegment();
final String uniqueId = UUID.randomUUID().toString();
final StorageReference filepath = mStorage.child(imageLocation).child(uniqueId + "/image_message");
final String downloadURl = filepath.getPath(); filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { addImageToMessages(downloadURl); mProgress.dismiss(); } }); } }
public void openVoiceRecorder(){ mrecordVoiceButton =(ImageButton) findViewById(R.id.recordVoiceButton); mRecordLable = (TextView) findViewById(R.id.recordLable); mFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); mFileName += "/recorded_audio.3gp"; mrecordVoiceButton.setOnTouchListener(new View.OnTouchListener(){ @Override
public boolean onTouch(View view, MotionEvent motionEvent){ if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){ startRecording(); mRecordLable.setText(" Recording started..."); } else if (motionEvent.getAction() == MotionEvent.ACTION_UP){ stopRecording(); mRecordLable.setText(" Recording stopped..."); } return false; } });
//jika selesai: sendVoice()
}
private void startRecording() { mRecorder = new MediaRecorder();
mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); mRecorder.setOutputFile(mFileName); try { mRecorder.prepare(); } catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed"); }
}
private void stopRecording() { mRecorder.stop();
mRecorder.release(); mRecorder = null; uploadAudio(); }
private void uploadAudio() {
mStorage = FirebaseStorage.getInstance().getReference(); mProgress.setMessage("Sending the Audio...");
mProgress.show();
Uri uri = Uri.fromFile(new File(mFileName));
final String voiceLocation = "Voice" + "/" + messageId; final String voiceLocationId = voiceLocation + "/" + uri.getLastPathSegment();
final String uniqueId = UUID.randomUUID().toString(); final StorageReference filepath =
mStorage.child(voiceLocation).child(uniqueId + "/audio_message.3gp");
final String downloadURl = filepath.getPath(); filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
addVoiceToMessages(downloadURl); mProgress.dismiss();
mRecordLable.setText(" Tap and Hold the Voice Button to Record");
} }); }
public void addListeners(){
mMessageField.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) { }
}); }
public void addVoiceToMessages(String voiceLocation){
final DatabaseReference pushRef = mMessageDatabaseReference.push();
final String pushKey = pushRef.getKey(); SimpleDateFormat dateFormat = new
SimpleDateFormat("HH:mm"); Date date = new Date();
String timestamp = dateFormat.format(date); //Create message object with text/voice etc
Message message =
new
Message(encodeEmail(mFirebaseAuth.getCurrentUser().getEmail()), "Message: Voice Sent", "VOICE",
voiceLocation, timestamp);
HashMap<String, Object> messageItemMap = new
HashMap<String, Object>();
HashMap<String,Object> messageObj = (HashMap<String, Object>) new ObjectMapper()
.convertValue(message, Map.class); messageItemMap.put("/" + pushKey, messageObj);
mMessageDatabaseReference.updateChildren(messageItemMap) .addOnCompleteListener(this, new
OnCompleteListener<Void>() { @Override
public void onComplete(@NonNull Task<Void> task) {
mMessageField.setText(""); }
}); }
public void addImageToMessages(String imageLocation){
final DatabaseReference pushRef = mMessageDatabaseReference.push();
final String pushKey = pushRef.getKey(); SimpleDateFormat dateFormat = new
SimpleDateFormat("HH:mm"); Date date = new Date();
String timestamp = dateFormat.format(date); //Create message object with text/voice etc
Message message =
new
Message(encodeEmail(mFirebaseAuth.getCurrentUser().getEmail()), "Message: Image Sent", "IMAGE",
imageLocation, timestamp);
HashMap<String, Object> messageItemMap = new
HashMap<String, Object>();
HashMap<String,Object> messageObj = (HashMap<String, Object>) new ObjectMapper()
.convertValue(message, Map.class); messageItemMap.put("/" + pushKey, messageObj);
.addOnCompleteListener(this, new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
mMessageField.setText(""); }
}); }
public void sendMessage(View view){
mFirebaseDatabase.getReference(Constants.MESSAGE_LOCATION); final DatabaseReference pushRef =
mMessageDatabaseReference.push();
final String pushKey = pushRef.getKey(); String messageString =
mMessageField.getText().toString();
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
Date date = new Date();
String timestamp = dateFormat.format(date);
Message message = new
Message(encodeEmail(mFirebaseAuth.getCurrentUser().getEmail()), messageString, timestamp);
HashMap<String, Object> messageItemMap = new
HashMap<String, Object>();
HashMap<String,Object> messageObj = (HashMap<String, Object>) new ObjectMapper()
.convertValue(message, Map.class); messageItemMap.put("/" + pushKey, messageObj);
mMessageDatabaseReference.updateChildren(messageItemMap) .addOnCompleteListener(this, new
OnCompleteListener<Void>() { @Override
public void onComplete(@NonNull Task<Void> task) {
mMessageField.setText(""); }
}); }
private void showMessages() { mMessageListAdapter = new
FirebaseListAdapter<Message>(this, Message.class, R.layout.message_item, mMessageDatabaseReference) { @Override
protected void populateView(final View view, final Message message, final int position) {
LinearLayout messageLine = (LinearLayout) view.findViewById(R.id.messageLine);
TextView messgaeText = (TextView) view.findViewById(R.id.messageTextView);
TextView senderText = (TextView) view.findViewById(R.id.senderTextView);
//TextView timeTextView = (TextView)
final ImageView leftImage = (ImageView)
view.findViewById(R.id.leftMessagePic);
final ImageView rightImage = (ImageView) view.findViewById(R.id.rightMessagePic);
LinearLayout individMessageLayout =
(LinearLayout)view.findViewById(R.id.individMessageLayout);
messgaeText.setText(message.getMessage());
senderText.setText(message.getSender());
String mSender = message.getSender();
if(mSender.equals(currentUserEmail)){ messageLine.setGravity(Gravity.RIGHT); leftImage.setVisibility(View.GONE); rightImage.setVisibility(View.VISIBLE); mUsersDatabaseReference.child(mSender).addValueEventListener(new ValueEventListener() { @Override
public void onDataChange(DataSnapshot dataSnapshot) {
User userInfo = dataSnapshot.getValue(User.class);
try{
if(userInfo != null && userInfo.getProfilePicLocation() != null){ StorageReference storageRef = FirebaseStorage.getInstance() .getReference().child(userInfo.getProfilePicLocation()); Glide.with(view.getContext()) .using(new FirebaseImageLoader()) .load(storageRef) .bitmapTransform(new CropCircleTransformation(view.getContext())) .into(rightImage); }
}catch (Exception e){
Log.e("ERR", e.toString()); ; }
}
@Override
public void onCancelled(DatabaseError databaseError) { } }); individMessageLayout.setBackgroundResource(R.drawable.roundedmes sagescolored);
}else if(mSender.equals("System")){ messageLine.setGravity(Gravity.CENTER_HORIZONTAL); leftImage.setVisibility(View.GONE); rightImage.setVisibility(View.GONE); }else{ //messgaeText.setGravity(Gravity.LEFT); //senderText.setGravity(Gravity.LEFT); messageLine.setGravity(Gravity.LEFT); leftImage.setVisibility(View.VISIBLE); rightImage.setVisibility(View.GONE); individMessageLayout.setBackgroundResource(R.drawable.roundedmes sages); //messgaeText.setBackgroundColor(ResourcesCompat.getColor(getRes ources(), mUsersDatabaseReference.child(mSender).addValueEventListener(new ValueEventListener() { @Override
public void onDataChange(DataSnapshot dataSnapshot) {
User userInfo = dataSnapshot.getValue(User.class);
if(userInfo != null && userInfo.getProfilePicLocation() != null){ try{ StorageReference storageRef = FirebaseStorage.getInstance() .getReference().child(userInfo.getProfilePicLocation()); Glide.with(view.getContext()) .using(new FirebaseImageLoader()) .load(storageRef) .bitmapTransform(new CropCircleTransformation(view.getContext())) .into(leftImage); }catch(Exception e){ Log.e("Err", e.toString()); } } } @Override
public void onCancelled(DatabaseError databaseError) {
} }); }
//If this is multimedia display it
final ImageView imageView = (ImageView)
view.findViewById(R.id.imageMessage);
(ImageButton) view.findViewById(R.id.voiceMessageButton); if(message.getMultimedia()){ if(message.getContentType().equals("IMAGE")) { StorageReference storageRef = FirebaseStorage.getInstance() .getReference().child(message.getContentLocation()); imageView.setVisibility(View.VISIBLE); activateVoiceMsg.setVisibility(View.GONE); activateVoiceMsg.setImageDrawable(null); Glide.with(view.getContext()) .using(new FirebaseImageLoader()) .load(storageRef) .into(imageView); } if(message.getContentType().equals("VOICE")) { activateVoiceMsg.setVisibility(View.VISIBLE); //hide imageview imageView.setVisibility(View.GONE); imageView.setImageDrawable(null); on play audio image if necessary
//individMessageLayout.setPadding(10,0,0,10);
activateVoiceMsg.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) { StorageReference storageRef = FirebaseStorage.getInstance().getReference().child(message.getCo ntentLocation()); storageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() { @Override
public void onSuccess(Uri uri) { playSound(uri); }
}).addOnFailureListener(new OnFailureListener() { @Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
} }); } }); } }else{ activateVoiceMsg.setVisibility(View.GONE); activateVoiceMsg.setImageDrawable(null);
imageView.setVisibility(View.GONE); imageView.setImageDrawable(null); } } }; mMessageList.setAdapter(mMessageListAdapter); }
private void playSound(Uri uri){
MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); try { mediaPlayer.setDataSource(uri.toString()); }catch(Exception e){ } mediaPlayer.prepareAsync(); to play mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override
public void onPrepared(MediaPlayer mp) {
//Now dismis progress dialog, Media palyer will
start playing mp.start(); } }); mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override
public boolean onError(MediaPlayer mp, int what, int extra) { when MediaPlayer return false; } }); }
private void initializeScreen() { mMessageList = (ListView) findViewById(R.id.messageListView);
mToolBar = (Toolbar) findViewById(R.id.toolbar); mMessageField = (TextView)findViewById(R.id.messageToSend); mSendButton = (ImageButton)findViewById(R.id.sendButton); mFirebaseDatabase = FirebaseDatabase.getInstance(); mFirebaseAuth = FirebaseAuth.getInstance(); currentUserEmail = encodeEmail(mFirebaseAuth.getCurrentUser().getEmail()); mUsersDatabaseReference = mFirebaseDatabase.getReference().child(Constants.USERS_LOCATION) ; mMessageDatabaseReference = mFirebaseDatabase.getReference().child(Constants.MESSAGE_LOCATIO N
+ "/" + messageId); mToolBar.setTitle(chatName); setSupportActionBar(mToolBar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); mToolBar.setNavigationOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) { finish();
} }); }
//TODO: Used in multiple places, should probably move to its
own class
public String encodeEmail(String userEmail) {
return userEmail.replace(".", ","); } }
10. ProfileActivty.java
import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.bumptech.glide.Glide; import com.fasterxml.jackson.databind.ObjectMapper; import com.firebase.ui.storage.images.FirebaseImageLoader; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.OnSuccessListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.FirebaseAuth; 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 com.google.firebase.database.ValueEventListener; import com.google.firebase.storage.FirebaseStorage; import com.google.firebase.storage.StorageReference; import com.google.firebase.storage.UploadTask;import java.util.HashMap; import java.util.Map; import java.util.UUID; import cs656.com.firebasemessengerapp.R; import cs656.com.firebasemessengerapp.model.Message; import cs656.com.firebasemessengerapp.model.User; import cs656.com.firebasemessengerapp.utils.Constants; import jp.wasabeef.glide.transformations.BlurTransformation; import jp.wasabeef.glide.transformations.CropCircleTransformation; public class ProfileActivity extends AppCompatActivity { private Toolbar mToolBar;
private ImageButton mphotoPickerButton; private static final int GALLERY_INTENT=2; private ProgressDialog mProgress;
private StorageReference mStorage; private FirebaseAuth mFirebaseAuth; private String currentUserEmail; private ImageView profileImage;
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference mCurrentUserDatabaseReference; private Context mView;
@Override
protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.profile_activity); mView = ProfileActivity.this; initializeScreen(); openImageSelector(); initializeUserInfo(); } @Override
protected void onActivityResult(int requestCode, int resultCode, final Intent data){
mStorage = FirebaseStorage.getInstance().getReference();
//make global
super.onActivityResult(requestCode, requestCode, data);
if(requestCode ==GALLERY_INTENT && resultCode ==
RESULT_OK){
mProgress.setMessage("Uploading..."); mProgress.show();
Uri uri = data.getData();
//Keep all images for a specific chat grouped
together
final String imageLocation =
"Photos/profile_picture/" + currentUserEmail;
final String imageLocationId = imageLocation + "/" + uri.getLastPathSegment();
UUID.randomUUID().toString();
final StorageReference filepath =
mStorage.child(imageLocation).child(uniqueId + "/profile_pic"); final String downloadURl = filepath.getPath(); filepath.putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
//create a new message containing this image
addImageToProfile(downloadURl); mProgress.dismiss(); } }); } }
public void addImageToProfile(final String imageLocation){ final ImageView imageView = (ImageView)
findViewById(R.id.profilePicture); mCurrentUserDatabaseReference .child("profilePicLocation").setValue(imageLocation).addOnComple teListener( new OnCompleteListener<Void>() { @Override
public void onComplete(@NonNull Task<Void> task) { StorageReference storageRef = FirebaseStorage.getInstance() .getReference().child(imageLocation); Glide.with(mView) .using(new FirebaseImageLoader()) .load(storageRef) .bitmapTransform(new CropCircleTransformation(mView)) .into(imageView); } } ); }
public void openImageSelector(){
mphotoPickerButton = (ImageButton) findViewById(R.id.imageButton);
mProgress = new ProgressDialog(this); mphotoPickerButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view){
Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*");
//mView = view;
}
}); }
private void initializeUserInfo(){
final ImageView imageView = (ImageView) findViewById(R.id.profilePicture);
mCurrentUserDatabaseReference
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) { User user = dataSnapshot.getValue(User.class); try{ if(user.getProfilePicLocation() != null){ StorageReference storageRef = FirebaseStorage.getInstance() .getReference().child(user.getProfilePicLocation()); Glide.with(mView) .using(new FirebaseImageLoader()) .load(storageRef) .bitmapTransform(new CropCircleTransformation(mView)) .into(imageView); }
}catch (Exception e){ Log.e("Err", "glide"); }
}
@Override
public void onCancelled(DatabaseError databaseError) {
} }); }
private void initializeScreen(){
mFirebaseAuth = FirebaseAuth.getInstance(); mFirebaseDatabase = FirebaseDatabase.getInstance(); mCurrentUserDatabaseReference = mFirebaseDatabase .getReference().child(Constants.USERS_LOCATION + "/" +encodeEmail(mFirebaseAuth.getCurrentUser().getEmail())); currentUserEmail = encodeEmail(mFirebaseAuth.getCurrentUser().getEmail()); mToolBar = (Toolbar) findViewById(R.id.toolbar); mToolBar.setTitle("Profile");
getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayShowHomeEnabled(true); mToolBar.setNavigationOnClickListener(new
View.OnClickListener() { @Override
public void onClick(View v) { finish();
} }); }
//TODO: Used in multiple places, should probably move to its
own class
public String encodeEmail(String userEmail) {
return userEmail.replace(".", ","); }
}
11. Constans.java
public final class Constants {
//Location of Firebase resources
public static final String FIREBASE_URL =
"https://fir-messenger-f2290.firebaseio.com";
public static final String USERS_LOCATION = "users"; public static final String FRIENDS_LOCATION = "friends"; public static final String CHAT_LOCATION = "chats";
public static final String MESSAGE_LOCATION = "messages"; public static final String MESSAGE_ID = "MID";
public static final String CHAT_NAME = "CNAME"; }
12. activitymain.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="cs656.com.firebasemessengerapp.MainActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbarandroid:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.AppBarLayout> <include layout="@layout/content_main" /> <android.support.design.widget.FloatingActionButton xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/add_conversation" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" android:src="@drawable/icon_add" android:onClick="createNewChat" app:borderWidth="0dp" app:elevation="6dp" app:pressedTranslationZ="12dp" /> </android.support.design.widget.CoordinatorLayout>
13. addChat.xml
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="cs656.com.firebasemessengerapp.ui.ChatActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay"> </android.support.v7.widget.Toolbar> </android.support.design.widget.AppBarLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"android:layout_marginTop="?attr/actionBarSize"> <LinearLayout android:layout_marginTop="20dp" android:orientation="horizontal" android:layout_width="match_parent" android:focusable="true" android:focusableInTouchMode="true" android:layout_height="55dp"> <EditText android:layout_width="wrap_content" android:layout_height="wrap_content" android:inputType="textPersonName" android:paddingLeft="15dp" android:paddingTop="9dp" android:hint="Chat Name" android:ems="10" android:id="@+id/chat_name" android:layout_weight="1" /> <ImageButton android:layout_width="30dp" android:layout_height="30dp" android:layout_marginRight="15dp" android:id="@+id/createButton" android:background="@android:drawable/ic_menu_send" android:onClick="createChat" /> </LinearLayout> <RelativeLayout android:id="@+id/content_main" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="cs656.com.firebasemessengerapp.MainActivity" tools:showIn="@layout/activity_main"> <TextView android:paddingTop="10dp" android:paddingLeft="15dp"
android:text="User added to chat: " android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:id="@+id/friendsInChat" android:layout_alignParentEnd="true" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Friends:" android:layout_marginTop="15dp"
android:textAppearance="?android:attr/textAppearanceMedium" android:layout_below="@+id/friendsInChat" android:id="@+id/FriendsView" android:textSize="24dp" android:gravity="center"/> <ListView android:id="@+id/conversationListView" android:layout_width="match_parent" android:layout_height="match_parent" android:stackFromBottom="false" android:layout_below="@+id/FriendsView" android:transcriptMode="alwaysScroll" tools:listitem="@layout/friend_item" android:layout_alignParentStart="true" android:layout_marginTop="5dp" /> </RelativeLayout> </LinearLayout> </android.support.design.widget.CoordinatorLayout>