Anda di halaman 1dari 92

LAPORAN PEMBUATAN PROJECT APLIKASI

“FOOD ORDER”

NAMA KELOMPOK :
1. Muhammad Luthfan O. (081711633002)
2. Ahmad Afan Affaidin (081711633013)
3. Rivendrea Giftama C. (081711633037)
4. Fachrizal Fikri (081711633042)
5. Yossy Adirta Soeryo L. (081711633044)
6. Sherina Avianita (081711633051)

S1 SISTEM INFORMASI
FAKULTAS SAINS DAN TEKNOLOGI
UNIVERSITAS AIRLANGGA
2018

i
BAB I
ISI

1.1 Deskripsi Aplikasi


Sektor industri makanan, terutama tempat makan, merupakan sektor industri yang
sedang berkembang di Indonesia. Namun, pada saat ini hanya beberapa restaurant saja
yang mengandalkan kecanggihan sistem informasi dalam penggunaan pemesanan
makanan. Masih banyak restaurant yang menggunakan sumber daya manusia untuk
pelayanan pemesanannya.
Aplikasi yang telah kami buat merupakan aplikasi yang dapat digunakan oleh
sebuah restaurant untuk membantu mereka dalam proses pemesanan makanan yang
dilakukan oleh user. Aplikasi yang bernama Food Order ini merupakan sebuah aplikasi
yang didesain untuk memudahkan user serta pegawai restaurant itu sendiri, karena dalam
aplikasi ini terdapat fitur yang dapat dilakukan oleh user, seperti user dapat melihat list
makanan apa saja yang dijual dalam aplikasi dan status makanan tersebut sedang dalam
stock atau out of stock, user juga dapat mencari menu makanan yang mereka cari secara
otomatis dalam aplikasi. Selain itu, user juga dapat memberikan rating terhadap makanan
yang dipilih. Pada bagian menu, menu makanan sendiri dikelompokkan berdasarkan
jenisnya. Apabila kita memilih salah satu menu, maka user dapat melihat gambar serta
deskripsi dari makanan tersebut.
Pada aplikasi ini, admin berguna untuk menambah maupun mengurangi menu
makanan, serta dapat mengubah stock makanan sesuai dengan keadaan. Admin juga
dapat mengubah status pesanan makanan yang telah dipesan oleh user, apakah makanan
yang dipesan sedang dalam proses pembuatan, makanan sedang diantar, atau makanan
telah sampai ke meja user.
Aplikasi Food Order ini berbasis android, dan diharapkan dapat digunakan dalam
handphone atau tablet yang disediakan pada restaurant tersebut. Jadi dalam aplikasi ini
terdapat 6 fitur, yaitu fitur Sign In, Menu, Search Food, Rating, Cart, Order
Status&Detail.

1
1.2 Desain Database

1.3 Laporan Individu

1.4.1. Fitur Log In (Fachrizal Fikri – 081711633042)


 Penjelasan Fitur dan Fitur yang Berhasil Dibuat
Penjelasan singkat mengenai fitur Log In, fitur ini merupakan fitur yang
digunakan oleh user atau admin untuk masuk dan dapat mengakses fitur lain
yang ada di dalam aplikasi. Fitur log in ini mengharuskan user untuk
mengisikan nomor meja serta password yang telah tertera untuk melakukan
pemesanan. Apabila nomor meja serta password yang dimasukan sudah sesuai,
maka user dapat segera melakukan pemesanan.

2
 Use Case Scenario
Normal Flow
 User membuka aplikasi
 Klik sign up untuk pengunjung baru
 Masukkan nomor meja dan set password
 Jika sudah terdaftar, kembali dan klik sign in
 Masukkan nomor meja dan password yang sudah diinput
 Klik sign in untuk melanjutkan ke menu makanan

3
 Sequence Diagram Desain Awal

 Implementasi Source Code


FRONT END
a. Source code UI Design main page
<LinearLayout
android:orientation="vertical"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<ImageView
android:src="@drawable/logo"
android:layout_width="200dp"
android:layout_height="200dp"/>

<TextView
android:gravity="center"
android:id="@+id/txtSlogan"
android:text="@string/slogan"
android:layout_width="200dp"

4
android:layout_height="wrap_content"
android:textColor="@android:color/white"/>
<LinearLayout
android:orientation="horizontal"
android:layout_alignParentBottom="true"
android:weightSum="2"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<info.hoang8f.widget.FButton
android:id="@+id/btnSignUp"
android:text="Sign Up"
android:textColor="@android:color/white"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:fButtonColor="@color/btnSignUp"
app:shadowColor="@android:color/black"
app:shadowEnabled="true"
app:shadowHeight="5dp"
app:cornerRadius="4dp"/>

<info.hoang8f.widget.FButton
android:id="@+id/btnSignIn"
android:text="Sign In"
android:textColor="@android:color/white"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:fButtonColor="@color/btnSignActive"
app:shadowColor="@android:color/black"
app:shadowEnabled="true"
app:shadowHeight="5dp"
app:cornerRadius="4dp"/>
</LinearLayout>
b. Source code UI design Sign In page
<LinearLayout
android:orientation="vertical"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_centerInParent="true"

5
android:layout_width="match_parent"
android:layout_height="wrap_content">

<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/edtNoMeja"
android:hint="No. Meja"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColorHint="@android:color/white"
android:text="01"
android:textColor="@android:color/white"
android:textSize="34sp"
android:inputType="number"
app:met_baseColor="@android:color/white"
app:met_floatingLabel="highlight"
app:met_maxCharacters="11"
app:met_primaryColor="@android:color/white"
app:met_singleLineEllipsis="true"/>
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/edtPassword"
android:hint="Password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColorHint="@android:color/white"
android:text="001"
android:textColor="@android:color/white"
android:textSize="34sp"
android:inputType="textPassword"
app:met_baseColor="@android:color/white"
app:met_floatingLabel="highlight"
app:met_maxCharacters="11"
app:met_primaryColor="@android:color/white"
app:met_singleLineEllipsis="true"/>

</LinearLayout>

<info.hoang8f.widget.FButton
android:id="@+id/btnSignIn"
android:text="Sign In"
android:textColor="@android:color/white"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"

6
android:layout_margin="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:background="@color/colorPrimaryDark"
app:fButtonColor="@color/btnSignActive"/>
c. Source code UI design Sign Up page
<LinearLayout
android:orientation="vertical"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_centerInParent="true"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/edtNoMeja"
android:hint="No. Meja"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColorHint="@android:color/white"
android:text="01"
android:textColor="@android:color/white"
android:textSize="34sp"
android:inputType="number"
app:met_baseColor="@android:color/white"
app:met_floatingLabel="highlight"
app:met_maxCharacters="11"
app:met_primaryColor="@android:color/white"
app:met_singleLineEllipsis="true"/>
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/edtPassword"
android:hint="Password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColorHint="@android:color/white"
android:text="1234"
android:textColor="@android:color/white"
android:textSize="34sp"
android:inputType="textPassword"
app:met_baseColor="@android:color/white"
app:met_floatingLabel="highlight"
app:met_maxCharacters="11"
app:met_primaryColor="@android:color/white"

7
app:met_singleLineEllipsis="true"/>

</LinearLayout>

<info.hoang8f.widget.FButton
android:id="@+id/btnSignUp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_margin="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:background="@color/colorPrimaryDark"
android:text="Sign Up"
android:textColor="@android:color/white" />
BACK END
a. Source code Back End main page

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.graphics.Typeface;

public class MainActivity extends AppCompatActivity {

Button btnSignIn, btnSignUp;


TextView txtSlogan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

btnSignIn = (Button)findViewById(R.id.btnSignIn);
btnSignUp = (Button)findViewById(R.id.btnSignUp);

txtSlogan = (TextView)findViewById(R.id.txtSlogan);
Typeface face = Typeface.createFromAsset(getAssets(), "fonts/Lato-
Black.ttf");
txtSlogan.setTypeface(face);

8
btnSignIn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

}
});

btnSignUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent signUp = new Intent(MainActivity.this, SignUp.class);
startActivity(signUp);
}
});

btnSignIn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent signIn = new Intent(MainActivity.this, SignIn.class);
startActivity(signIn);
}
});
}
}
b. Source code JAVA Sign In
import android.app.ProgressDialog;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.example.yossy.orderfood.Common.Common;
import com.example.yossy.orderfood.Model.User;
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.rengwuxian.materialedittext.MaterialEditText;

9
public class SignIn extends AppCompatActivity {
EditText edtNoMeja, edtPassword;
Button btnSignIn;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_in);

edtNoMeja = (MaterialEditText)findViewById(R.id.edtNoMeja);
edtPassword = (MaterialEditText)findViewById(R.id.edtPassword);
btnSignIn = (Button)findViewById(R.id.btnSignIn);

//init firebase
final FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference table_user = database.getReference("User");

btnSignIn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {

final ProgressDialog mDialog = new ProgressDialog(SignIn.this);


mDialog.setMessage("Please Wating...");
mDialog.show();

table_user.addValueEventListener(new ValueEventListener() {

@Override
public void onDataChange(DataSnapshot dataSnapshot) {

//check if user not exist in database

if(dataSnapshot.child(edtNoMeja.getText().toString()).exists()) {
//get user information
mDialog.dismiss();
User user =
dataSnapshot.child(edtNoMeja.getText().toString()).getValue(User.class);
user.setNoMeja(edtNoMeja.getText().toString());
if
(user.getPassword().equals(edtPassword.getText().toString())) {
{

10
Intent homeIntent = new Intent(SignIn.this,
Home.class);
Common.currentUser = user;
startActivity(homeIntent);
finish();
}

} else {
Toast.makeText(SignIn.this, "Wrong Password !",
Toast.LENGTH_SHORT).show();
}
}else{
mDialog.dismiss();
Toast.makeText(SignIn.this, "User not exist in Database !",
Toast.LENGTH_SHORT).show();
}
}

@Override
public void onCancelled(DatabaseError databaseError) {

}
});
}
});

}
}
c. Source code JAVA Sign UP
import android.app.ProgressDialog;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import com.example.yossy.orderfood.Model.User;
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;

11
import com.rengwuxian.materialedittext.MaterialEditText;

public class SignUp extends AppCompatActivity {

MaterialEditText edtNoMeja, edtPassword, edtStatus;


Button btnSignUp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_up);

edtNoMeja = findViewById(R.id.edtNoMeja);
edtPassword = findViewById(R.id.edtPassword);

btnSignUp = findViewById(R.id.btnSignUp);

//init firebase
final FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference table_user = database.getReference("User");

btnSignUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final ProgressDialog mDialog = new ProgressDialog(SignUp.this);
mDialog.setMessage("Please Waiting...");
mDialog.show();

table_user.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
{
//Check if already Register
if (dataSnapshot.child(edtNoMeja.getText().toString()).exists()) {
mDialog.dismiss();
Toast.makeText(SignUp.this, "Number already register",
Toast.LENGTH_SHORT).show();
} else {
mDialog.dismiss();
User user = new User(edtNoMeja.getText().toString(),
edtPassword.getText().toString());

table_user.child(edtNoMeja.getText().toString()).setValue(user);

12
Toast.makeText(SignUp.this, "Sign Up success",
Toast.LENGTH_SHORT).show();
finish();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
{

}
}); } }); } }

 Sequence Diagram Baru

 Lesson Learned
Pelajaran Rekayasa Perangkat Lunak sangat bermanfaat bagi seseorang yang
ingin menjadi developer menjadi bagian CEO maupun programmer. Untuk
menjadi developer harus membutuhkan koordinasi yang baik antara tiap
anggota tim. Di mata kuliah ini juga sangat membantu untuk mengerti dalam
berkas-berkas apa saja yang dibutuhkan oleh seorang developer. Di mata
kuliah ini saya mendapatkan ketiga itu dari bagaimana menjadi developer,
mengerti bagaimana mengoordinasikan tim, dan mengerti berkas-berkas yang

13
dibutuhkan untuk menjadi developer. Selain itu saya juga mengerti bahasa
pemrograman android.

1.4.2. Fitur Menu (Yossy Adirta S. L. – 081711633044)


 Penjelasan Fitur dan Fitur yang Berhasil Dibuat
Penjelasan singkat mengenai fitur menu, dalam fitur menu akan ditampilkan
menu makanan berdasarkan jenis-jenisnya, dan akan ditampilkan pula detail
makanan yang berisi foto makanan, deskripsi makanan, dan juga harga
makanan sehingga memudahkan user untuk memilih makanan. Selain itu
dalam fitur menu, user dapat menambahkan serta mengurangi pesanan
makanan dengan mudah.

14
 Use Case Scenario
Nama Fitur : Menu Makanan
Actor: Pelanggan
Preconditions: Login akun pelanggan
Action Steps:
a. Setelah login pelanggan, maka akan masuk ke tampilan kategori makanan.
b. Setelah memilih kategori makanan, maka akan muncul tampilan daftar
makanan yang ada di dalam kategori yang dipilih.
c. Kemudian setelah memilih makanan, maka akan masuk pada tampilan detail
makanan yang berisi gambar makanan, nama amaknana, deskripsi makanan,
harga makanan, dan kuantitas makanan.
d. Setelah menentukan kuantitas makanan, maka pencet tombol gambar
keranjang.
Post Conditions:
a. Makanan yang dipilih pelanggan akan masuk ke dalam keranjang makanan.
b. Pelanggan masih di halaman detail makanan yang sama dipesan tadi, dan dapat
melakukan pemesanan lagi pada menu makanan yang lainnya.

15
Actor: Admin
Preconditions: Login akun admin
Action Steps:
a. Setelah login admin, maka akan masuk ke tampilan kategori makanan.
b. Setelah memilih kategori makanan, maka akan muncul tampilan daftar
makanan yang ada di dalam kategori yang dipilih.
c. Admin dapat menambah kategori makanan baru pada halaman category dengan
menekan tombol tambah di pojok kanan bawah dan mengisi gambar kategori
dan nama kategori
d. Admin dapat menambah list makanan baru pada halaman list makanan dengan
menekan tombol tambah di pojok kanan bawah dan mengisi gambar makanan
nama makanan, deskripsi makanan, dan harga makanan.
Post Conditions:
a. Kategori makanan yang baru akan muncul pada paling bawah halaman kategori
makanan dengan menampilkan foto kategori dan nama kategori.
b. List makanan yang baru amakan muncul pada bagian bawah list makanan
dalam kategori yang sudah dipilih dengan menampilkan gambar makanan dan
nama makanan.

 Sequence Diagram Awal

16
 Implementasi Source Code

File content_home.xml (Pelanggan dan Admin)

 Pada <RecyclerView> berguna untuk


menampilkan list makanan dengan nama id
recycler_menu

File menu_item.xml (Pelanggan dan Admin)

 Pada <ImageView> digunakan untuk


menampilkan gambar kategori makanan
 Pada <TextView> digunakan untuk
menampilkan nama kategori makanan

17
File Category.java (Pelanggan dan Admin)

 Kelas ini merupakan entity dari


fitur menu makanan untuk kategori
makanan.
 Berisi variabel global untuk data-
data yang akan disimpan pada
Firebase.
 Disediakan juga function
constructor, setter, dan getter,
untuk mengambil dan mengisi
data.

File MenuViewHolder.java (Pelanggan)


 Memanggil perintah – perintah
berupa fungsi yang disediakan
java untuk digunakan pada kelas
MenuViewHolder
 Memanggil fungsi dari kelas
ItemClickListerner dari folder
Interface.

 Mendeklarasikan variabel
TextView untuk menampilkan
text.
 Mendeklarasikan variabel
ImageView untuk menampilkan
gambar.
 Dengan function
findViewById(), antar variabel
dan tampilan yang dibuat di
menu_item.xml dengan id yang
sudah ditentukan akan
terhubung.
 Dengan menggunakan interface
dari itemClickListener dapat
menekan gambar.

18
File Home.java (Pelanggan)

 Memanggil perintah – perintah berupa


fungsi yang disediakan java untuk
digunakan pada kelas Home.java

 Memanggil fungsi dari kelas Common


dari folder Common, Category dan
Order dari folder Model ,
FoodViewHolder dari folder
viewHolder.
 Memanggil fungsi firebase untuk
menggunakan fasilitas firebase dan
picasso untuk gambar.

 Fungsi FirebaseDatabase,
DatabaseReference, RecyclerView,
TextView, MenuViewHolder, dan
FirebaseAdapter di deklarasikan dengan
variabel-variabel yang akan digunakan.

19
 setContentView(R.layout.activity_food_list)
berguna untuk menampilkan tampilan sesuai
dengan desain yang ada pada kelas
activity_home.xml.
 Database ditujukan pada table bernama
“Category”.

 Set nama untuk client.


 Dan melakukan load menu untuk
memunculkan tampilan kategori.

 Kategori akan dicari berdasarkan


database pada Firebase.
 Lalu Kategori akan ditampilkan dengan
gambarnya.
 Jika salah satu gambar list makanan
dipilih maka halaman akan dilanjutkan
dengan cara meng-intent ke halaman
foodList, startActivity(foodList).

20
 MenuViewHolder digunakan untuk
mempercepat rendering ListView.
 Adapter pada bagian bawah adalah
jembatan antara komponen UI dan
sumber data yang membantu untuk
mengisi data di komponen UI.

File activity_food_list.xml (Pelanggan dan Admin)

 Pada
<android.support.v7.widget.RecyclerView
berguna untuk menampilkan list makanan
dengan nama id recycler_food.
 Pada halaman ini, tampilan dapat di scroll
secara vertikal tergantung dari banyaknya list
makanan.

21
File food_item.xml (Pelanggan dan Admin)

 Pada <ImageView> digunakan untuk


menampilkan gambar dari list setiap makanan
 Pada <TextView> digunakan untuk
menampilkan text dari list setiap makanan

File Food.java (Pelanggan dan Admin)

 Kelas ini merupakan entity dari fitur menu makanan


untuk list makanan.
 Berisi variabel global untuk data-data yang akan
disimpan pada Firebase.
 Disediakan juga function constructor, setter, dan
getter, untuk mengambil dan mengisi data.

22
File FoodViewHolder.java (Pelanggan)

 Memanggil perintah – perintah berupa


fungsi yang disediakan java untuk
digunakan pada kelas MenuViewHolder
 Memanggil fungsi dari kelas
ItemClickListerner dari folder Interface.

 Mendeklarasikan variabel TextView untuk


menampilkan text.
 Mendeklarasikan variabel ImageView untuk
menampilkan gambar.
 Dengan function findViewById(), antar variabel dan
tampilan yang dibuat di food_item.xml dengan id yang
sudah ditentukan akan terhubung.
 Dengan menggunakan interface dari itemClickListener
dapat menekan gambar.

File FoodList.java (Pelanggan)

 Memanggil perintah – perintah berupa fungsi yang


disediakan java untuk digunakan pada kelas
FoodList.java

23
 Memanggil fungsi dari kelas ItemClickListerner dari
folder Interface, Food dari folder Model,
FoodViewHolder dari folder viewHolder.
 Memanggil fungsi firebase untuk menggunakan fasilitas
firebase, picasso untuk gambar, dan ArrayList untuk
membuat makanan berbentuk list.

 Fungsi dari RecyclerView,


RecyclerView.LayoutManager, FirebaseDatabase,
DatabaseReference, String categoryId,
FirebaseAdapter, ArrayList, dan MaterialSearchBar di
deklarasikan dengan variabel-variabel yang akan
digunakan.

 setContentView(R.layout.activity_food_list) berguna
untuk menampilkan tampilan sesuai dengan desain
yang ada pada kelas activity_food_list.xml.
 Database ditujukan pada table bernama “Foods”.
 RecyclerView berguna untuk menampikan sebuat set
data berjumlah besar.

 Jika categoryId tidak kosong dan tidak bernilai


null maka akan menampilkan list dari kategori
makanan

24
 Fungsi dari method loadSuggest() adalah untuk
menghubungkan list makanan berdasarkan
kategori yang dipilih.

 List makanan akan dicari berdasarkan


database pada Firebase.
 Lalu list makanan akan ditampilkan
dengan gambarnya.

 Jika salah satu gambar list makanan dipilih


maka halaman akan dilanjutkan dengan cara
meng-intent ke halaman foodDetail,
startActivity(foodDetail).

25
 FoodViewHolder digunakan untuk
mempercepat rendering ListView.
 Adapter pada bagian bawah adalah jembatan
antara komponen UI dan sumber data yang
membantu untuk mengisi data di komponen
UI.

File activity_food_detail.java (Pelanggan)

26
 Pada <ImageView>untuk menampilkan
gambar makanan

 Pada < FloatingActionButton>untuk menampilkan gambar


keranjang pada detail makanan.

27
 Pada < CardView>untuk menampilkan gambar detail
makanan berbentuk landscape seperti kartu.
 Pada <TextView> untuk menampilkan nama detail
makanan.
 Pada <LinearLayour> Untuk menampilkan harga
makanan.

 Pada <ImageView> untuk menampilkan mata uang.


 Pada <TextView> untuk menampilkan harga detail
makanan.

 Pada
<com.cephuen.elegantnumberbutton.view.ElegantNu
mberButton> untuk menampilkan kuantitas makanan
yang akan dipesan yang dapat ditambah atau
dikurang.

28
 Pada <TextView> untuk menampilan teks berisi
deskripsi dari detail makanan.

File FoodDetail.java (Pelanggan)

 Memanggil perintah – perintah berupa fungsi yang


disediakan java untuk digunakan pada kelas
FoodDetail.java

 Memanggil fungsi dari kelas Common dari folder


Common, Database dari folder Database, Food dari
folder Model, FoodViewHolder dari folder
viewHolder.
 Memanggil fungsi firebase untuk menggunakan
fasilitas firebase, picasso untuk gambar, dan
ArrayList untuk membuat makanan berbentuk list.

29
 Fungsi dari TextView, ImageView,
CollapsingToolbarLayout, FloatingActionButton,
ElegantNumberButton, Ratingbar, String foodId,
FirebaseDatabase, dan DatabaseReference di
deklarasikan dengan variabel-variabel yang akan
digunakan.

 setContentView(R.layout.activity_food_detail)
berguna untuk menampilkan tampilan sesuai dengan
desain yang ada pada kelas activity_food_list.xml.
 Database ditujukan pada table bernama “Foods”.
 numberButton berfungsi agar kuantitas makanan
dapat bertambah atau berkurang.
 btnCartberfungsi untuk memilih makanan yang
ingin dipesan segera dimasukkan ke keranjanag
makanan.

 fungsi dari function btnCart.SetOnClickListener


adalah ketika tombol keranjang dipencet, maka
data detail makanan yang berisi nama, kuantias,
harga, dan diskon makanan dimasukkan ke dalam
data keranjang makanan pelanggan.

30
 Dengan function findViewById(), antar variabel
food_description, food_name, food_price,
food_image dan tampilan yang dibuat di
activiry_food_detail.xml dengan id yang sudah
ditentukan akan terhubung.
 Jika foodId tidak kosong dan tidak bernilai null
maka akan menampilkan detail makanan.

 Fungsi getDetailFood adalah untuk mendapatkan


dan menampilkan data dari detail makanan
berdasarkan variabel-variabel yang telah
dideklarasikan.

31
File add_new_menu_layout.xml (Admin)

 Pada < MaterialEditText> digunakan untuk


memberikan sebuah tampilan berbentuk kolom
untuk mengisi nama kategori makanan.

 Pada <info.hoang8f.widget.FButton> digunakan


untuk menampilkan tombol select.

 Pada <info.hoang8f.widget.FButton> digunakan


untuk menampilkan tombol upload.

32
File MenuViewHolder.java (Admin)

 Memanggil perintah – perintah berupa fungsi


yang disediakan java untuk digunakan pada kelas
MenuViewHolder.java

 Memanggil fungsi dari kelas Common dari folder


Common, ItemClickListener dan folder Interface.

 Fungsi dari TextView, ImageView, dan


ItemClickListener di dkelarasikan.
 Dengan function findViewById(), antar variabel
dan tampilan yang dibuat di menu_item.xml
dengan id yang sudah ditentukan akan terhubung.

 Dengan menggunakan interface dari


itemClickListener dapat memencet tombol pada
gambar.
 Pada function onCreateContextMenu, digunakan
untuk menjalankan perintah Update dan Delete.

33
File Home.java (Admin)

 Memanggil perintah – perintah berupa fungsi


yang disediakan java untuk digunakan pada kelas
Home.java

 Memanggil fungsi dari kelas Common dari folder


Common, Category dan Order dari folder Model,
FoodViewHolder dari folder viewHolder.
 Memanggil fungsi firebase untuk menggunakan
fasilitas firebase dan picasso untuk gambar.

 Fungsi dari TextView, FirebaseDatabase,


DatabaseReference, RecyclerView,
RecyclerView.LayoutManager, Fbutton, Category, uri,
DrawerLayout, MenuViewHolder di deklarasikan
dengan variabel-variabel yang akan digunakan.

34
 Database ditujukan pada tabel “Category”
dalam Firebase.
 Digunakan fasilitas storage pada firebase untuk
menyimpan gambar yang diupload

 Function showDialog() digunakan untuk


menampilkan tampilan berbentuk seperti
muncul sebuah halaman baru tetapi tidak
berpindah ke halaman yang baru.
 Isi dari sebuah tampilan dialog tersebut adalah
nama kategori, select (untuk memilih gambar),
upload (untuk mengupload gambar)
 Dengan function findViewById(), antar
variabel dan tampilan yang dibuat di
add_new_menu_layout.xml dengan id yang
sudah ditentukan akan terhubung.
 Jika menekan tombol select, maka akan muncul
pilihan untuk menajalankan fungsi dari method
chooseImage()
 Jika menekan tombol upload, maka akan
muncul pilihan untuk menajalankan fungsi dari
method uploadImage()

 Jika kategori yang ditambahkan tidak berisi


kosong, maka kategori baru akan ditambahkan
dan akan muncul tulisan “New Category was
added”.
 Jika kategori tidak jadi ditambahkan atau
menekan tombol “NO”, maka akan keluar dari
tampilan dialog.

35
 Method uploadImage() digunakan
untuk mengupload gambar
 Jika ketika upload foto tidak
bernilai null, maka proses upload
akan dilakukan dan akan muncul
tampilan dialog bertuliskan
“Uploading...”
 Dengan menggunakan fasilitas
storage, gambar yang diupload akan
disimpan di storage
 Jika gambar berhasil diupload maka
akan muncul tulisan “Uploaded”.

 Jika gambar gagal diupload maka akan


muncul Text yang menyatakan gagak
mengupload
 Selama proses berlangsung akan muncul
presentase saat mengupload gambar
 Jika gambar yang ingin diupload sudah
terpilih maka akan muncul text “Image
Selected”.

 Method chooseImage() berfungsi saat ingin


memilih gambar yang akan diupload.

36
 Kategori makanan akan dicari berdasarkan
database pada Firebase.
 Lalu kategori makanan akan ditampilkan
dengan gambarnya.
 Jika salah satu gambar list makanan dipilih
maka halaman akan dilanjutkan dengan cara
meng-intent ke halaman foodList,
startActivity(foodList).

 MenuViewHolder digunakan untuk menampilkan


list data kategori makanan yang banyak.

 Adapter pada bagian bawah adalah jembatan


antara komponen UI dan sumber data yang
membantu untuk mengisi data di komponen UI.

 Jika gambar kategori ditekan lama maka akan


muncul pilihan untuk meng-update makanan
atau men-delete makanan.

37
 Jika memilih delete, maka kategori makanan
akan langsung terhapus.
 Jika memilih update, maka akan muncul
tampilan dialog yang berisi kolom nama
kategori makanan, dan tombol select dan
upload. Fungsi ini hampir sama seperti
membuat kategori.baru.

 Ketika memilih tombol “YES” maka


nama kategori terbaru akan diubah dan
set menjadi nilai baru dalam database

 Ketika memilih tombol “NO” maka


kolom yang tadinya sudah diisi tidak
akan dimasukkan ke dalam database.

 Fungsi pada method changeImage() sama


seperti meng-upload gambar yang baru.
Fungsi ini dijalankan ketika ingin meng-
update foto kategori makanan yang lama
menjadi foto kategori makanan yang baru.

File add_new_menu_layout.xml (Admin)

38
 Pada <MaterialEditText> untuk
menambahkan kolom untuk mengisi
nama makanan.

 Pada <MaterialEditText> untuk


menambahkan kolom untuk mengisi
deskripsi makanan.

 Pada < MaterialEditText> untuk


menambahkan kolom untuk mengisi
harga makanan.

39
 Pada <MaterialEditText> untuk
menambahkan kolom untuk
mengisi diskon makanan.

 Pada <info.hong8f.widget.FButton> untuk


menampilkan tombol Select.

40
 Pada <info.hong8f.widget.FButton>
untuk menampilkan tombol Upload.

File FoodViewHolder.java (Admin)


 Memanggil perintah – perintah berupa
fungsi yang disediakan java untuk
digunakan pada kelas FoodViewHolder
 Memanggil fungsi dari kelas Common
dari folder Common, ItemClickListerner
dari folder Interface, dan Food dari
folder Model.

41
 Fungsi dari TextView, ImageView, dan
ItemClickListener di dkelarasikan.
 Dengan function findViewById(), antar
variabel dan tampilan yang dibuat di
food_item.xml dengan id yang sudah
ditentukan akan terhubung.
 Dengan menggunakan interface dari
itemClickListener dapat memencet
tombol pada gambar.

 Pada function onCreateContextMenu,


digunakan untuk menjalankan perintah
Update dan Delete.

File FoodList.java (Admin)

 Memanggil perintah – perintah berupa fungsi


yang disediakan java untuk digunakan pada kelas
FoodList.java

42
 Memanggil fungsi dari kelas Common dari folder
Common, Category dan Order dari folder Model,
FoodViewHolder dari folder viewHolder.
 Memanggil fungsi firebase untuk menggunakan
fasilitas firebase dan picasso untuk gambar.

 Fungsi dari RecyclerView,


RecyclerView.LayoutManager, FirebaseDatabase,
DatabaseReference, String categoryId,
FirebaseAdapter, ArrayList, dan MaterialSearchBar,
Uri, dan Food di deklarasikan dengan variabel-
variabel yang akan digunakan.

 Database ditujukan pada tabel “Foods” dalam


Firebase.
 Digunakan fasilitas storage pada firebase untuk
menyimpan gambar yang telah diupload.
 RecyclerView digunakan untuk menampilkan
sejumlah besar kumpulan data yang dengan
sangat efisien.
 Jika categoryId tidak kosong dan
tidak bernilai null maka akan
menampilkan list dari kategori
makanan
  Jika ketika meng-Intent tidak sama dengan
kosong maka categoryId akan mencari intent
berdasarkan String “CategoryId”
 Jika categoryId tidak null maka akan
menampilkan list dari kategori makanan

43
 Jika fungsi showFoodDialog() dijalankan
maka akan muncul sebuah tampilan dialog
yang berisi kolom – kolom seperti nama,
deskripsi, harga, discount untuk diisi untuk
menambah makanan baru.
 Terdapat tombol select untuk memilih
gambar yang akan dipilih. Yang didalamnya
terdapat pilih pilih gambar dan upload
gambar yang dipilih.
 Terdadapat juga tombol upload untuk
menyelesaikan proses pembuatan list
makanan baru.

 alertDialog ditujukan untuk memperlihatkan


tanda peringatan setelah menekan tombol
upload.
 Jika menekan “YES” maka akan segera
ditambahkan makanan baru.
 Jika menekan “NO” maka tampilan dialog
akan segera dihilangkan.

44
 Method uploadImage() digunakan untuk
mengupload gambar
 Jika ketika upload foto tidak bernilai null,
maka proses upload akan dilakukan dan
akan muncul tampilan dialog bertuliskan
“Uploading...”
 Dengan menggunakan fasilitas storage,
gambar yang diupload akan disimpan di
storage
 Jika gambar berhasil diupload maka akan
muncul tulisan “Uploaded”.

 Jika gambar gagal diupload maka akan


muncul Text yang menyatakan gagak
mengupload
 Selama proses berlangsung akan muncul
presentase saat mengupload gambar

45
 Method chooseImage() berfungsi saat ingin
memilih gambar yang akan diupload.

 menuId Primary Key akan disesuaikan dengan


menuId pada tabel Category.
 Lalu menu makanan akan muncul dengan
ditampilkan gambarnya.

 MenuViewHolder digunakan untuk menampilkan


list data kategori makanan yang banyak.

 Adapter pada bagian bawah adalah jembatan


antara komponen UI dan sumber data yang
membantu untuk mengisi data di komponen UI.

46
 Jika gambar kategori ditekan lama maka akan
muncul pilihan untuk meng-update makanan
atau men-delete makanan.

 Jika memilih delete, maka kategori


makanan akan langsung terhapus.

 Jika memilih update, maka akan


muncul tampilan dialog yang
berisi kolom nama kategori
makanan, dan tombol select dan
upload. Fungsi ini hampir sama
seperti membuat kategori.baru.

47
 Ketika memilih tombol “YES”
maka nama, harga, discount, dan
deskripsi makanan terbaru akan
diubah dan set menjadi nilai baru
dalam database

 Ketika memilih tombol “NO”


maka kolom-kolom yang tadinya
sudah diisi tidak akan dimasukkan
ke dalam database.

 Fungsi pada method changeImage() sama


seperti saat meng-upload gambar menu
makanan baru. Fungsi ini dijalankan ketika
ingin meng-update foto kategori makanan
yang lama menjadi foto kategori makanan
yang baru.

48
 Sequence Diagram Baru

49
 Lesson Learned
Dalam pembelajaran ini membuat saya menjadi memahami bagaimana cara
membuat suatu proyek di bidang tekhnologi dengan cara bekerja sama dengan
tim, pembagian tugas masing-masing, dan juga bagaimana cara membuat
aplikasi Android. Dalam membuat suatu aplikasi juga tidak bisa langsung
diimplementasikan membuat aplikasinya, tetapi harus dibuat secara bertahap
dari mulai memikirkan aplikasi apa yang ingin dibuat yang dapat bermanfaat,
fungsi sistem apa saja yang harus ada, desain aplikasi, hingga bagaimana
menyesuaikan aplikasi apa yang kita inginkan dengan implementasi
sesungguhnya pada pemrograman. Kesulitan saya dalam mengerjakan proyek
Rekaya Perangkat Lunak ini adalah membutuhkan waktu lama dalam
memahami bagaimana caranya membuat aplikasi Android dan bagaimana cara
menggabungkan fitur-fitur yang dikerjakan sendiri-sendiri menjadi satu
aplikasi yang dapat berjalan dengan baik. Dengan adanya tugas membuat
proyek Rekaya Perangkat Lunak dalam menmbuat aplikasi Android menjadi
membuat saya memahami bagaimana caranya membuat aplikasi Android. Ini
merupakan hal yang saya senangi karena dapat menambah pengetahuan saya
dalam bidang tekhnologi, karena saya juga ingin bisa membuat aplikasi
Android dan juga membuat proyek pembuatan aplikasi dengan tim pada suatu
hari nanti.

50
1.4.3. Fitur Search Food (M. Luthfan Oktaviano S. – 081711633002)
 Penjelasan Fitur dan Fitur yang Berhasil Dibuat
Penjelasan singkat mengenai fitur search food, pada fitur ini user dapat
mencari makanan yang diinginkan dengan mengetikkan keyword sesuai
dengan nama makanan. Fitur search food ini terdapat menu bagian atas,
sehingga memudahkan user untuk melakukan pencarian makanan.

 Use Case Scenario


Normal Flow
1. Setelah user login, user akan memilih kategori yang tersedia
2. Saat user sudah didalam dalah satu kategori, user dapat menekan search bar
yang tersedia di halaman tersebut
3. Saat user mengetik, akan muncul suggestion list yang sesuai dengan apa yang
diketik oleh user
4. Aplikasi akan menunjukkan hasil yang sesuai dengan apa yang dicari oleh
user

51
 Sequence Diagram Awal

 Implementasi Souce Code


Tampilan Search Bar(activity_food_list.xml)
<com.mancj.materialsearchbar.MaterialSearchBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/searchBar"
android:layout_alignParentTop="true"
app:mt_speechMode="false"
app:mt_hint="Enter your food"
/>
Backend Fitur Search(Foodlist.java)
 Source code untuk menggunakan fasilitas firebase
RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;

FirebaseDatabase database;
DatabaseReference foodList;

FirebaseRecyclerAdapter<Food,FoodViewHolder> adapter;
FirebaseRecyclerAdapter<Food,FoodViewHolder> searchAdapter;

 Source code untuk membuat variabel categoryId


String categoryId="";

 Source code untuk membuat variabel yang akan digunakan

52
List<String> suggestList = new ArrayList<>();
MaterialSearchBar materialSearchBar;

 Source Code untuk setContentView(R.layout.activity_food_list) berguna


untuk menampilkan tampilan sesuai dengan desain yang ada pada kelas
activity_food_list.xml.
Database ditujukan pada table bernama “foodList”.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_food_list);

// Untuk mengambil data dari database


database = FirebaseDatabase.getInstance();
foodList = database.getReference("Foods");

recyclerView = (RecyclerView)findViewById(R.id.recycler_food);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);

//Untuk menampilkan list makanan apabila sebuah kategori dipilih oleh


user
if (getIntent() !=null)
categoryId = getIntent().getStringExtra("CategoryId");
if (!categoryId.isEmpty() && categoryId !=null)
{
loadListFood(categoryId);
}

//Untuk memanggil search bar dari activity_food_list.xml


materialSearchBar = (MaterialSearchBar)findViewById(R.id.searchBar);
materialSearchBar.setHint("Enter your food");

//Untuk menampilkan suggestion list yang sesuai dengan apa yang dicari
loadSuggest();
materialSearchBar.setLastSuggestions(suggestList);
materialSearchBar.setCardViewElevation(10);
materialSearchBar.addTextChangeListener(new TextWatcher() {

@Override
public void beforeTextChanged(CharSequence s, int start, int count, int

53
after) {

@Override
public void onTextChanged(CharSequence s, int start, int before, int
count) {
List<String> suggest = new ArrayList<>();
for (String search:suggestList)
{
if
(search.toLowerCase().contains(materialSearchBar.getText().toLowerCase())
)
suggest.add(search);
}
materialSearchBar.setLastSuggestions(suggest);
}

@Override
public void afterTextChanged(Editable s) {

}
});
materialSearchBar.setOnSearchActionListener(new
MaterialSearchBar.OnSearchActionListener() {
@Override
public void onSearchStateChanged(boolean enabled) {
if (!enabled)
recyclerView.setAdapter(adapter);
}

@Override
public void onSearchConfirmed(CharSequence text) {
startSearch(text);
}

@Override
public void onButtonClicked(int buttonCode) {

54
});
}

 Source code untuk search makanan pada database


//Search
private void startSearch(CharSequence text) {
Query searchByName =
foodList.orderByChild("Name").equalTo(text.toString());
FirebaseRecyclerOptions<Food> foodOptions = new
FirebaseRecyclerOptions.Builder<Food>()
.setQuery(searchByName, Food.class)
.build();
searchAdapter = new FirebaseRecyclerAdapter<Food,
FoodViewHolder>(foodOptions) {
@Override
protected void onBindViewHolder(@NonNull FoodViewHolder
viewHolder, int position, @NonNull Food model) {
viewHolder.food_name.setText(model.getName());
Picasso.with(getBaseContext()).load(model.getImage())
.into(viewHolder.food_image);

final Food local = model;


viewHolder.setItemClickListener(new ItemClickListener() {
@Override
public void onClick(View view, int position, boolean isLongClick)
{
Intent foodDetail = new Intent(FoodList.this,FoodDetail.class);

foodDetail.putExtra("FoodId",searchAdapter.getRef(position).getKey());
startActivity(foodDetail);
}
});
}

@NonNull
@Override
public FoodViewHolder onCreateViewHolder(@NonNull ViewGroup
parent, int i) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.food_item,parent,false);
return new FoodViewHolder(itemView);
}
};

55
searchAdapter.startListening();
recyclerView.setAdapter(searchAdapter);
}

 Source code untuk load suggestion


private void loadSuggest() {
foodList.orderByChild("menuId").equalTo(categoryId)
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
{
for (DataSnapshot postSnapshot:dataSnapshot.getChildren())
{
Food item = postSnapshot.getValue(Food.class);
suggestList.add(item.getName());
}
materialSearchBar.setLastSuggestions(suggestList);
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError)
{

}
});
}

 Sequence Diagram Baru

56
 Lesson Learned
Saya mempelajari banyak hal baru dalam pengerjaan proyek software ini,
seperti bahasa pemrograman yang lebih advanced, tentang bagaimana step by
step untuk membuat sebuah aplikasi, apa saja yang harus dibuat sebelum
memulai menulis source code, dll. Ilmu yang saya dapatkan dari materi
perkuliahan pun ada yang bisa diterapkan, seperti urutan untuk membangun
sebuah aplikasi dsb. Menurut saya, ini adalah sebuah pengalaman yang
nantinya akan berguna untuk kedepannya dan mungkin bisa dikembangkan
untuk mendapat ilmu yang lebih banyak dari yang sebelumnya.

1.4.4. Fitur Rating (Rivendrea Giftama C. – 081711633042)


 Penjelasan Fitur dan Fitur yang Berhasil Dibuat
Penjelasan singkat mengenai fitur ini, pada fitur rating, user dapat melakukan
penilaian atau pemberian rating terhadap makanan yang dipilih, serta dapat
memberikan komentar terhadap pesanan. Fitur ini berada pada bagian detail
makanan, dengan menekan icon untuk memberi rating, user dapat memberi
rating dan komentar terhadap makanan.

57
 Use Case Scenario
Normal Flow
1. Pengguna menekan icon untuk memberi rating
2. Pengguna dapat memilih berapa bintang yang akan diberikan untuk menu yang
dipesan dengan skala bintang 1-5
3. Pengguna dapat memberi komentar juga tentang menu yang dipesan
4. Setelah pelanggan menekan tombol ‘submit’ masukan akan diteruskan untuk
admin sebagai masukan dan saran.

58
 Sequence Diagram Awal

 Implementasi Source Code

Rating (XML Code)


1. Source Code untuk medesain rating dengan gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.yossy.orderfood"
minSdkVersion 21
targetSdkVersion 28
versionCode 1
versionName "1.0" }
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
} }}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])

59
//noinspection GradleCompatible
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-
layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation
'com.android.support.test.espresso:espresso-core:3.0.2'
….
implementation 'com.stepstone.apprating:app-rating:2.0.0'
}
apply plugin: 'com.google.gms.google-services'

2. Source Code untuk membungkus suatu layout dan layout-layout serta widget
<?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"
tools:context=".FoodDetail">

<android.support.design.widget.AppBarLayout
android:id="@+id/app_bar_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
android:fitsSystemWindows="true"
>

60
<android.support.design.widget.CollapsingToolbarLayout
android:id="@+id/collapsing"
android:layout_width="match_parent"
android:layout_height="350dp"
android:fitsSystemWindows="true"
app:layout_scrollFlags="scroll|exitUntilCollapsed"
app:contentScrim="#0e0d0e"
app:expandedTitleTextAppearance="@android:color/transparent"
>

<ImageView
...
/>

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:title="Food Name"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:layout_collapseMode="parallax"
>

</android.support.v7.widget.Toolbar>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/btnCart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"

61
android:background="@android:color/white"
android:src="@drawable/ic_shopping_cart_black_24dp"
app:backgroundTint="@color/fui_bgGoogle"
app:elevation="6dp"
app:layout_anchor="@id/app_bar_layout"
app:layout_anchorGravity="bottom|right|end"
app:pressedTranslationZ="12dp"
app:useCompatPadding="true" />

<android.support.design.widget.FloatingActionButton
android:id="@+id/btn_rating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:src="@drawable/ic_star_black_24dp"
app:backgroundTint="@color/fui_bgGoogle"
app:elevation="6dp"
app:layout_anchor="@id/app_bar_layout"
app:layout_anchorGravity="bottom|right|start"
app:pressedTranslationZ="12dp"
app:useCompatPadding="true" />

<android.support.v4.widget.NestedScrollView
…./>
<LinearLayout
….>

<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardElevation="5dp"

62
app:cardUseCompatPadding="true"
>

<LinearLayout
…..>
<TextView
... />
<LinearLayout
.../>
<ImageView
.... />
<TextView
.... />
</LinearLayout>

<com.cepheuen.elegantnumberbutton.view.ElegantNumberButton
android:layout_width="100dp"
android:layout_height="30dp"
android:id="@+id/number_button"
android:layout_marginTop="8dp"
android:layout_marginLeft="8dp"
android:layout_marginBottom="18dp"
app:textSize="8sp"
app:backGroundColor="@color/colorAccent"
app:initialNumber="1"
app:finalNumber="20"
/>

</LinearLayout>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView

63
app:cardElevation="5dp"
app:cardUseCompatPadding="true"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<RatingBar
android:id="@+id/ratingBar"
android:rating="0"
android:max="5"
android:isIndicator="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<TextView
android:id="@+id/food_description"
android:layout_marginTop="12dp"
android:lineSpacingMultiplier="1.5"
android:padding="12dp"
android:text="Description"
android:textColor="@android:color/black"
android:textSize="14sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>

64
</android.support.v7.widget.CardView>
</LinearLayout>

</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>

3. Source Code untuk desain dari fitur rating serta warna


<resources>
<!-- Base application theme. -->
<style name="AppTheme"
parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>

<style name="AppTheme.AppBarOverlay"
parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay"
parent="ThemeOverlay.AppCompat.Light" />

<style name="CollapsedAppbar"
parent="@android:style/TextAppearance.Medium">
<item name="android:textSize">24sp</item>
<item name="android:textColor">@android:color/white</item>
<item name="android:textStyle">normal</item>
</style>

65
<style name="ExpandedAppbar"
parent="@android:style/TextAppearance.Material.Title">
<item name="android:textColor">@color/colorPrimary</item>
<item name="android:textStyle">normal</item>
</style>

<style name="RatingDialogStyle"
parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="android:background">@android:color/white</item>
<item
name="buttonBarPositiveButtonStyle">@style/RatingDialogButtonStyle</ite
m>
<item
name="buttonBarNegativeButtonStyle">@style/RatingDialogButtonStyle</it
em>
</style>

<style name="RatingDialogButtonStyle"
parent="@style/Widget.AppCompat.Button.ButtonBar.AlertDialog">
<item name="android:textColor">@color/colorAccent</item>
</style>

<style name="RatingDialogFadeAnim">
<item
name="android:windowEnterAnimation">@android:anim/fade_in</item>
<item
name="android:windowExitAnimation">@android:anim/fade_out</item>
</style>
</resources>

Backend (FoodDetail.java)

66
1. Source Code untuk menampilkan semua dalam java, rating disini adalah
rating dari setiap menu yang ada, sehingga dilakaukan import dari menu
makanan dan juga ada tambahan komentar juga.

public class FoodDetail extends AppCompatActivity implements


RatingDialogListener {

TextView food_name, food_price, food_description;


ImageView food_image;
CollapsingToolbarLayout collapsingToolbarLayout;
FloatingActionButton btnCart,btnRating;
ElegantNumberButton numberButton;
RatingBar ratingBar;
String foodId="";
FirebaseDatabase database;
DatabaseReference foods;
DatabaseReference ratingTbl;

Food currentFood;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_food_detail);

database = FirebaseDatabase.getInstance();
foods = database.getReference("Foods");
ratingTbl = database.getReference("Rating");

numberButton =
(ElegantNumberButton)findViewById(R.id.number_button);
btnCart = (FloatingActionButton)findViewById(R.id.btnCart);

67
btnRating = (FloatingActionButton)findViewById(R.id.btn_rating);
ratingBar = (RatingBar)findViewById(R.id.ratingBar);

btnRating.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showRatingDialog();
} });

btnCart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Database(getBaseContext()).addToCart(new Order(
foodId,
currentFood.getName(),
numberButton.getNumber(),
currentFood.getPrice(),
currentFood.getDiscount()
));
Toast.makeText(FoodDetail.this, "Added to
Cart",Toast.LENGTH_SHORT).show();
}
});
food_description = (TextView)findViewById(R.id.food_description);
food_name = (TextView)findViewById(R.id.food_name);
food_price = (TextView)findViewById(R.id.food_price);
food_image = (ImageView)findViewById(R.id.img_food);
collapsingToolbarLayout =
(CollapsingToolbarLayout)findViewById(R.id.collapsing);

68
collapsingToolbarLayout.setExpandedTitleTextAppearance(R.style.Expande
dAppbar);

collapsingToolbarLayout.setCollapsedTitleTextAppearance(R.style.Collapse
dAppbar);

if (getIntent() !=null)
foodId = getIntent().getStringExtra("FoodId");
if (!foodId.isEmpty())
{
getDetailFood(foodId);
getRatingFood(foodId);
} }

private void getRatingFood(String foodId) {


Query foodRating = ratingTbl.orderByChild("foodId").equalTo(foodId);
foodRating.addValueEventListener(new ValueEventListener() {
int count = 0,sum=0;
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot postSnapshot:dataSnapshot.getChildren())
{
Rating item = postSnapshot.getValue(Rating.class);
sum+=Integer.parseInt(item.getRateValue());
count++;
}
if(count!=0)
{
float average = sum/count;
ratingBar.setRating(average); } }

69
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
} }); }

private void showRatingDialog() {


new AppRatingDialog.Builder()
.setPositiveButtonText("Submit")
.setNegativeButtonText("Cancel")
.setNoteDescriptions(Arrays.asList("Very Bad","Not Good","Quite
Okay","Very Good","Excellent"))
.setDefaultRating(1)
.setTitle("Rate this food")
.setDescription("Please select some stars and give your feedback")
.setTitleTextColor(R.color.colorPrimary)
.setDescriptionTextColor(R.color.colorPrimary)
.setHint("Please Write you comment here")
.setHintTextColor(R.color.colorAccent)
.setCommentTextColor(android.R.color.white)
.setCommentBackgroundColor(R.color.colorPrimaryDark)
.setWindowAnimation(R.style.RatingDialogFadeAnim)
.create(FoodDetail.this)
.show();
}

private void getDetailFood(String foodId) {


foods.child(foodId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
currentFood = dataSnapshot.getValue(Food.class);
Picasso.with(getBaseContext()).load(currentFood.getImage())

70
.into(food_image);

collapsingToolbarLayout.setTitle(currentFood.getName());
food_price.setText(currentFood.getPrice());
food_name.setText(currentFood.getName());
food_description.setText(currentFood.getDescription());
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
} }); }
@Override
public void onNegativeButtonClicked() { }
@Override
public void onPositiveButtonClicked(int value, @NotNull String
comments) {
final Rating rating = new Rating(Common.currentUser.getNoMeja(),
foodId,
String.valueOf(value),
comments);
ratingTbl.child(Common.currentUser.getNoMeja()).addValueEventListener(n
ew ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.child(Common.currentUser.getNoMeja()).exists())
{

ratingTbl.child(Common.currentUser.getNoMeja()).removeValue();

ratingTbl.child(Common.currentUser.getNoMeja()).setValue(rating);
} else {

71
ratingTbl.child(Common.currentUser.getNoMeja()).setValue(rating);
}
Toast.makeText(FoodDetail.this, "Thank you for submit rating",
Toast.LENGTH_SHORT).show();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
} }); }}
 Sequence Diagram Baru

 L
e
s
s
o
n

L
e
a
r
n
e
d
S
a
y
a mempelajari yang pertama adalah bagaimana seorang atau sekelompok
developer membuat sebuah aplikasi atau sistem. Membutuhkan koordinasi,
kerja sama, dan juga kekompakan dalam pengerjaannya. Tapi yang tidak kalah
penting dari itu semua adalah kemampuan dalam hal koding itu sendiri. Dari
mata kuliah ini saya juga belajar bagaimana menggunakan android studio
yakni sebuah aplikasi berbasis pc untuk mendevelop program android. Dari
awal yang hanya bermodal meraba-raba jadi mengerti bagaimana cara
mengkoding dengan android studio. Saya berharap bisa lebih mendalami
android studio ini karena saya rasa android merupakan platform yang cocok
dan wadah yang bisa membuat saya lebih berkembang.

1.4.5. Fitur Cart (Ahmad Afan Affaidin – 081711633013)


 Penjelasan Fitur dan Fitur yang Berhasil Dibuat

72
Penjelasan singkat mengenai fitur ini, pada fitur Cart, Cart merupakan sebuah
fitur dimana user dapat memilih berbagai macam makanan terlebih dahulu, dan
user memiliki kemungkinan untuk menelusuri daftar menu kembali dan
menyimpannya di Cart jika tertarik. User dapat menghapus makanan yang ada
pada Cart apabila merasa tidak ingin membeli makanan tersebut. Apabila
makanan yang ada pada Cart sesuai dengan yang diinginkan user, maka user
dapat melakukan proses pesanan tersebut. Juga terdapat total harga pada Cart
sesuai dengan item yang ada di dalam cart.

 Use Case Scenario


Normal Flow
1. Pengguna menekan icon Keranjang atau menu Cart
2. Pengguna dapat melihat list makanan apa saja yang telah di pilih

73
3. Setelah merasa makanan yang dipesan sesuai, pelanggan menekan tombol
‘PLACE ORDER’
4. Setelah pelanggan menekan tombol tersebut, maka aka nada notifikasi untuk
meneruskan pesanan
5. Setelah pelanggan menekan tombol ‘yes’ pada piihan notifikasi, maka pesanan
akan diproses

 Sequence Diagram Awal

 Implementasi Source Code

Tampilan (Cart.xml)
1. Source Code untuk mendesain UI awal
<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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_login" // mengambil gambar yang telah
disimpan pada drawable untuk di terapkan pada halaman UI
android:padding="16dp"
tools:context=".Cart">
2. Sourco Code menampilkan rangkaian data yang telah dipilih oleh pelanggan

74
<android.support.v7.widget.RecyclerView
android:id="@+id/listCart"
android:background="@android:color/transparent"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

Kelas RecyclerView adalah versi ListView yang lebih canggih dan fleksibel.
Widget ini adalah kontainer untuk menampilkan rangkaian data besar yang bisa
digulir secara sangat efisien dengan mempertahankan tampilan dalam jumlah
terbatas.
3. Source Code untuk membungkus suatu layout
<android.support.v7.widget.CardView
android:layout_alignParentBottom="true"
app:cardBackgroundColor="@color/colorPrimary"
android:layout_width="match_parent"
android:layout_height="100dp">

biasanya dipakai sebagai container untuk setiap item di dalam ListView atau
RecyclerView.

4. Source Code Untuk penataan widget-widget yang didalamnya seperti layer


<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

sebuah widget dapat berada di atas/di bawah widget lainnya atau dengan kata lain
Relative merupakan layout yang penataannya lebih bebas (Relative) sehingga
bisa di tata di mana saja.

5. Source Code untuk menempatkan 1 objek (widget) per baris/kolom.


<LinearLayout

75
android:layout_margin="8dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

Jadi di dalam setiap baris/kolom hanya ada 1 objek (widget) yang kita tempatkan

6. Source Code untuk menampilkan teks dalam suatu halaman


<TextView
android:text="Total: " // menampilkan teks
android:textSize="20sp" //menentukan ukuran teks
android:textColor="@android:color/white" //menentukan warna teks
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<TextView
android:id="@+id/total"
android:text="Total: Rp10.000"
android:textSize="24sp"
android:textColor="@android:color/white"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
Setiap Perangkat Android datang dengan sekumpulan font bawaan: Droid Sans,
Droid Sans Mono dan Droid Serif. Mereka didesain agar optimal saat
ditampilkan di layar handphone. Meski menjadi font bawaan, suatu saat kita
tentu ingin menggunakan font tertentu dengan beberapa properti lain.

7. Source Code untuk membuat button/tombol


<info.hoang8f.widget.FButton
android:id="@+id/btnPlaceOrder"

76
android:text="Place Order" //menampilkan teks pada tombol
android:textColor="@android:color/white" //menentukan warna teks
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_margin="8dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:background="@color/colorPrimaryDark"
app:fButtonColor="@color/btnSignActive" />

Backend (Cart.java)

Nama Class yang dipakai adalah public class Cart extends AppCompatActivity
2. Source Code untuk Memanggil perintah – perintah berupa fungsi yang
disediakan java untuk digunakan pada kelas Cart.java

import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.example.yossy.orderfood.Common.Common;
import com.example.yossy.orderfood.Model.Order;
import com.example.yossy.orderfood.Model.Request;
import com.example.yossy.orderfood.ViewHolder.CartAdapter;

77
import com.example.yossy.orderfood.Database.Database;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;

import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import info.hoang8f.widget.FButton;

3. Source Code untuk menggunakan fasilitas firebase


RecyclerView recyclerView;
RecyclerView.LayoutManager layoutManager;
FirebaseDatabase database;
DatabaseReference requests;

4. Source Code untuk menampilkan teks dan button


TextView txtTotalPrice;
FButton btnPlace;

5. Source Code untuk mendeklarasikan variabel-variabel yang akan digunakan.


List<Order> cart = new ArrayList<>();
CartAdapter adapter;

6. Source Code untuk setContentView(R.layout.activity_food_cart) berguna untuk


menampilkan tampilan sesuai dengan desain yang ada pada kelas
activity_cart.xml.

Database ditujukan pada table bernama “Requests”.

@Override

78
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cart);

database = FirebaseDatabase.getInstance();
requests = database.getReference("Requests");

recyclerView = (RecyclerView)findViewById(R.id.listCart);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);

txtTotalPrice = (TextView)findViewById(R.id.total);
btnPlace = (FButton)findViewById(R.id.btnPlaceOrder);

btnPlace.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showAlertDialog();
}
});
loadListFood();
}

7. Source Code untuk menampilakan notifikasi setelah pelanggan menekan tombol


‘PLACE ORDER’.
private void showAlertDialog() {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(Cart.this);
alertDialog.setMessage("Meneruskan ke Pembayaran");

alertDialog.setPositiveButton("YES", new DialogInterface.OnClickListener()


{

79
@Override
public void onClick(DialogInterface dialogInterface, int which) {
Request request = new Request(
Common.currentUser.getNoMeja(),
txtTotalPrice.getText().toString(),
cart
);
requests.child(String.valueOf(System.currentTimeMillis()))
.setValue(request);
new Database(getBaseContext()).cleanCart();
Toast.makeText(Cart.this,"Thank
You",Toast.LENGTH_SHORT).show();
finish();
}
});
alertDialog.setNegativeButton("NO", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialogInterface, int which) {
dialogInterface.dismiss();
}
});
alertDialog.show();
}

8. Source Code untuk menghubungkan list makanan pada database dan


menampilkannya

private void loadListFood() {


cart = new Database(this).getCarts();
adapter = new CartAdapter(cart, this);
recyclerView.setAdapter(adapter);

80
int total = 0;
for (Order order:cart)

total+=(Integer.parseInt(order.getPrice()))*(Integer.parseInt(order.getQuantity())
);
Locale locale = new Locale("en","US");
NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
txtTotalPrice.setText(fmt.format(total));
}

 Sequence Diagram Baru

 Lesson Learned
Menurut saya ada beberapa leson learn yang dapat saya ambil pada mata kuliah
Rekayasa Perangkat Lunak ini. Pertama, saya dapat menerapkan ilmu yang
telah diajarkan dikelas tentang bagaimana membangun sutu perangkat lunak.
Awalnya memang saya yang tidak tau apa-apa, belum tau seperti apa gambaran
aplikasi yang akan saya buat, dan belum tau bagaimana caranya membuat
suatu perangkat lunak (Software). Dan setelah mengikuti mata kuliah, saya jadi
tau bagaimana tahapan-tahapan untuk mengembangkan suatu perangkat lunak.
Kedua, saya mendapatkan pengalaman untuk mengembangkan aplikasi yang
suatu saat pasti akan berguna terutama dalam dunia kerja. Ketiga, saya dapat
merasakan bagaimana susahnya seorang developer dalam membuat suatu
perangkat lunak. Keempat, saya mendapatkan Bahasa pemrograman baru

81
karena aplikasi yang saya buat ini berbasis Android yang dimana pada kuliah
sebelumnya belum pernah diajarkan. Memang Bahasa yang digunakan untuk
membuat aplikasi Android tidak berbeda jauh dengan Bahasa java yang telah
saya pelajari sebelumnya, jadi untuk memahaminya menjadi lebih mudah.
Mungkin kedepanya saya akan belajar lebih dalam lagi tentang Bahasa
pemrograman ini. Aplikasi Android merupakan aplikasi yang sedang banyak
dikembangkan oleh banyak developer.

1.4.6. Fitur Order Status dan Detail (Sherina Avianita – 081711633051)


 Penjelasan Fitur dan Fitur yang Berhasil Dibuat
Penjelasan singkat mengenai fitur order status dan transaksi pada aplikasi Food
Order adalah, fitur order status dan detail merupakan fitur yang berfungsi
untuk menampilkan list order pesanan dan juga detail dari pesanan tersebut.
Dalam proses melihat list pesanan, user harus memasukan nomor meja sesuai
tempat duduk pemesan dan setelah makanan diproses dari cart, maka akan
masuk ke bagian order status detail. Pada bagian order status ini juga akan
muncul total harga pembelian makanan yang telah diproses dari cart. Status
pada bagian order detail hanya dapat diganti oleh admin sesuai dengan keadaan
makanan yang dipesan pada saat itu.
Fitur yang berhasil dibuat adalah fitur order status, fitur order detail masih
belum selesai dibuat.

82
 Use Case Scenario
Normal Flow:
1) Setelah melakukan log in sesuai dengan nomor meja, user akan masuk ke
dalam halaman menu pada aplikasi.
2) User terlebih dahulu memilih menu yang akan dipesan.
3) Setelah memesan menu, user akan dibawa ke halaman cart.
4) Pada halaman cart, user dapat melakukan place order agar pesanan diproses.
5) Apabila user masuk ke halaman orders, maka pesanan dan status pesanan
dapat dilihat.

83
 Sequence Diagram Awal

 Implementasi Source Code


 Pada activity_order_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg_login"
tools:context=".OrderStatus">

<android.support.v7.widget.RecyclerView
android:id="@+id/listOrders"
android:background="@android:color/transparent"
android:layout_width="match_parent"

android:layout_height="match_parent"></android.support.v7.widget.Recyc
lerView>

</RelativeLayout>

84
 Pada order_layout.xml (mengatur desain tampilan)
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
app:cardElevation="4dp"
>

CardView digunakan untuk membuat frame layout menjadi seperti bentuk


kartu. CardView dapat dijumpai pada list aplikasi yang terdapat di Google
Playstore. cardElevation digunakan untuk membuat ukuran elevasi pada frame
tersebut sebesar 4dp.
Width layout pada order list dibuat menyesuaikan dengan layar ponsel,
sedangkan height layout dibuat wrap content agar menyesuaikan dengan objek.

<LinearLayout
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical">

LinearLayout digunakan untuk membuat objek sesuai baris atau kolom. Pada
source code diatas, orientation yang digunakan adalah horizontal. Nantinya
akan menempatkan objek dalam satu baris yang sama.

<LinearLayout
android:orientation="vertical"
android:layout_weight="9"
android:layout_width="0dp"
android:layout_height="wrap_content">

Sedangkan pada source code ini, orientation yang digunakan adalah vertical,
nantinya akan menempatkan objek (ID Order, Status Order, No Meja) urut ke
bawah.

<TextView
android:id="@+id/order_id"
android:layout_marginLeft="10dp"
android:gravity="center_vertical|start"
android:textAllCaps="true"
android:textStyle="bold"
android:text="#111111"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<TextView
android:id="@+id/order_status"
android:layout_marginLeft="10dp"
android:gravity="center_vertical|start"
android:textAllCaps="true"

85
android:textStyle="italic"
android:text="Status"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<TextView
android:id="@+id/order_no_meja"
android:layout_marginLeft="10dp"
android:gravity="center_vertical|start"
android:textAllCaps="true"
android:textStyle="italic"
android:text="No.Meja"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

</LinearLayout>

</LinearLayout>

</android.support.v7.widget.CardView>

 Pada order.java (inti main application dan controller)


public class Order {

private String ProductId;


private String ProductName;
private String Quantity;
private String Price;
private String Discount;

public Order() {
}

public Order(String productId, String productName, String


quantity, String price, String discount) {
ProductId = productId;
ProductName = productName;
Quantity = quantity;
Price = price;
Discount = discount;
}

public String getProductId() {


return ProductId;
}

public void setProductId(String productId) {


ProductId = productId;
}

public String getProductName() {


return ProductName;
}

public void setProductName(String productName) {


ProductName = productName;
}

public String getQuantity() {


return Quantity;
}

86
public void setQuantity(String quantity) {
Quantity = quantity;
}

public String getPrice() {


return Price;
}

public void setPrice(String price) {


Price = price;
}

public String getDiscount() {


return Discount;
}

public void setDiscount(String discount) {


Discount = discount;
}
}

Digunakan untuk mengambil data pada database yang akan ditampilkan pada
bagian order layout, yaitu id product, nama pesanan, jumlah pesanan, dan total
harga.
Get digunakan untuk return nilai, sehingga apabila memanggil getPrice, maka
akan mengembalikan nilai harganya. Sedangkan set tidak memiliki nilai
kembali (void), karena berfungsi untuk mengisi data ke dalam atribut.

 Pada OrderStatus.java (ViewHolder)


public class OrderStatus extends AppCompatActivity {

public RecyclerView recyclerView;


public RecyclerView.LayoutManager layoutManager;

FirebaseDatabase database;
DatabaseReference requests;

FirebaseDatabase database; DatabaseReference requests; digunakan untuk


menyambungkan seluruh view ke database serta mengambil data dari database
yang ada di firebase setelah user melakukan Place Order saat di Cart.

FirebaseRecyclerAdapter<Request,OrderViewHolder> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_order_status);

Menunjukan bahwa order status yang akan diambil dari database, dihubungkan
dengan activity_order_status layout.
database = FirebaseDatabase.getInstance();
requests = database.getReference("Requests");

recyclerView = (RecyclerView)findViewById(R.id.listOrders);

87
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);

R.id berfungsi untuk mengarahkannya ke class Orders.


if(getIntent() == null)
loadOrders(Common.currentUser.getNoMeja());
else
loadOrders(getIntent().getStringExtra("noMeja"));
}

Memanggil database sesuai dengan nomor meja yang telah diisikan oleh user
pada saat log in pertama kali.
private void loadOrders(String noMeja) {

FirebaseRecyclerOptions<Request> options = new


FirebaseRecyclerOptions.Builder<Request>()
.setQuery(requests,Request.class)
.build();

adapter = new FirebaseRecyclerAdapter<Request,


OrderViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull OrderViewHolder
viewHolder, int position, @NonNull Request model) {

viewHolder.txtOrderId.setText(adapter.getRef(position).getKey());

viewHolder.txtOrderStatus.setText(convertCodeToStatus(model.getStatus(
)));
viewHolder.txtNoMeja.setText(model.getNoMeja());
}
digunakan untuk mengambil id txtOrderStatus yang ada pada viewHolder dan
mengubah status pesanan sesuai dengan yang dimasukkan admin pada
database.
@NonNull
@Override
public OrderViewHolder onCreateViewHolder(@NonNull
ViewGroup parent, int i) {
View itemView =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.order_layout,parent,false);
return new OrderViewHolder(itemView);
}
};

recyclerView.setAdapter(adapter);

@Override
protected void onStart() {
super.onStart();
adapter.startListening();
}

@Override
protected void onStop() {
super.onStop();

88
adapter.stopListening();
}

public String convertCodeToStatus(String status) {


if (status.equals("0"))
return "Pesanan di Proses";
else if (status.equals("1"))
return "Pesanan di segera dikirimkan";
else
return "Pesanan di telah datang";
}
}

ConverCodeToStatus digunakan untuk mengubah status pesanan yang ada


pada order layout, dimana apabila admin mengubah nilai status menjadi 0
maka status pesanan akan berubah menjadi diproses, apabila 1 maka status
pesanan berubah menjadi dikirimkan ke meja, dan apabila tidak keduanya
berarti pesanan telah diantar ke meja user.

 Pada Home.java (ViewHolder)


@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();

if (id == R.id.nav_menu) {
} else if (id == R.id.nav_cart) {
Intent cartIntent = new Intent(Home.this,Cart.class);
startActivity(cartIntent);
} else if (id == R.id.nav_orders) {
Intent orderIntent = new
Intent(Home.this,OrderStatus.class);
startActivity(orderIntent);
} else if (id == R.id.nav_log_out) {
Intent signIn = new Intent(Home.this,SignIn.class);
signIn.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(signIn);
}
DrawerLayout drawer = (DrawerLayout)
findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
}

 Pada Database.java
public class Database extends SQLiteAssetHelper {
private static final String DB_NAME="EatItDB.db";
private static final int DB_VER=1;

public Database(Context context) {


super(context, DB_NAME, null, DB_VER);
}

public List<Order> getCarts()


{

89
SQLiteDatabase db = getReadableDatabase();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

String[] sqlSelect =
{"ProductName","ProductId","Quantity","Price","Discount"};
String sqlTable="OrderDetail";

qb.setTables(sqlTable);
Cursor c = qb.query(db,sqlSelect,null,null,null,null,null);

final List<Order> result = new ArrayList<>();


if (c.moveToFirst())
{
do{
result.add(new
Order(c.getString(c.getColumnIndex("ProductId")),
c.getString(c.getColumnIndex("ProductName")),
c.getString(c.getColumnIndex("Quantity")),
c.getString(c.getColumnIndex("Price")),
c.getString(c.getColumnIndex("Discount"))
));
}while (c.moveToNext());
}
return result;
}

 Sequence Diagram Baru

90
 Lesson Learned
Lesson Learned atau hal yang dapat saya pelajari selama pembuatan proyek
aplikasi ini sangatlah banyak. Salah satunya adalah saya belajar tentang
bagaimana cara membuat aplikasi sesuai dengan apa yang telah kelompok
kami inginkan. Dimulai dari membuat kebutuhan aplikasi, membuat use case
dan sequence diagram, membuat design aplikasi kemudian
mengimplementasikannya kedalam sebuah source code. Dengan adanya
proyek aplikasi ini, juga mengajarkan saya tentang bagaimana bekerjasama
dalam sebuah tim untuk bidang pembuatan aplikasi, bagaimana membagi tugas
dan saling berkoordinasi satu sama lain dan saling membantu satu sama lain.
Dan dari proyek ini, saya mendapat pengalaman tentang bagaimana pembuatan
sebuah aplikasi android, yang mana bukanlah sebuah hal yang mudah, dan
memerlukan kerja keras. Meskipun fitur yang saya buat belum berjalan dan
selesai sepenuhnya, namun ilmu yang saya dapatkan selama proses
pembuatannya sangatlah berguna untuk kedepannya dan merupakan
pengalaman yang berharga bagi saya. Terimakasih RPL.

91

Anda mungkin juga menyukai