• Tidak ada hasil yang ditemukan

DAFTAR PUSTAKA. Andreyanto Pengertian Dasar dan Simbol Flowchart.

N/A
N/A
Protected

Academic year: 2021

Membagikan "DAFTAR PUSTAKA. Andreyanto Pengertian Dasar dan Simbol Flowchart."

Copied!
60
0
0

Teks penuh

(1)

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

(2)

47

(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
(11)
(12)
(13)

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;

}

(14)

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(); }

(15)

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;

} }

(16)

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);

(17)

}

@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;

(18)

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 {

(19)

} }

@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");

} }

(20)

@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() + ", "; }

(21)

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();

(22)

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) {

(23)

}

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;

(24)

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);

(25)

//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

(26)

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

(27)

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);

(28)

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; }

(29)

@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

(30)

{

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;

(31)

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;

(32)

//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();

(33)

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(); } }); } }

(34)

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"); }

(35)

}

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); } }

(36)

@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);

(37)

.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)

(38)

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);

(39)

}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);

(40)

(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);

(41)

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

(42)

+ "/" + 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;

(43)

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();

(44)

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/*");

(45)

//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");

(46)

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.Toolbar

(47)

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.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"

(48)

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"

(49)

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>

14.addfriendsactivity.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.FriendsListActi vity"> <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.design.widget.AppBarLayout> <RelativeLayout 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:id="@+id/content_main" android:layout_width="match_parent" android:layout_height="match_parent"

Referensi

Dokumen terkait

Daya serap air yang ditunjukkan pada Gambar 1, memberikan kecenderungan yang linier, dengan nilai R 2 = 0.869, artinya bahwa sebanyak 86,9% dari total daya

Tujuan penelitian ini dilakukan adalah untuk menentukan kadar air dan besar bilangan penyabunan dalam minyak kelapa serta menentukan apakah kadar air dan bilangan penyabunan

The main objectives of this study are the (1) measurement and mapping of the spatial distribution of the deformation rates in the study area; (2) analysis of

Sistem penilaian dengan system KPI, selain dapat mengukur kinerja orang per orang, juga bisa dilakukan untuk melakukan pengukuran kinerja secara kelompok, baik itu

Dengan menggunakan Akibat 2.3 ini, dapat dikonstruksi sebuah aljabar graf pada graf- berhingga baris tanpa sources seperti halnya pada graf berarah, dinotasikan dengan

Level 3 ini aktor harus memakan lebih banyak keju dan dihadapkan dengan musuh yang lebih banyak maka dari itu pada level 3 ini pemain harus lebih berhati-hati

informasi manajemen rumah sakit adalah suatu sistem berbasis komputer yang.. menghasilkan sekumpulan informasi yang telah diolah dan saling

Pada tahap pelaksanaan, kegiatan pembelajaran dibagi menjadi tiga bagian yaitu kegiatan awal, kegiatan inti dan kegiatan penutup. Pada kegiatan awal dimulai dengan