“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.2 Desain Database
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
<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;
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) {
table_user.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
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;
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)
{
}
}); } }); } }
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.
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.
16
Implementasi Source Code
17
File Category.java (Pelanggan dan Admin)
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)
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”.
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.
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)
22
File FoodViewHolder.java (Pelanggan)
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.
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.
24
Fungsi dari method loadSuggest() adalah untuk
menghubungkan list makanan berdasarkan
kategori yang dipilih.
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.
26
Pada <ImageView>untuk menampilkan
gambar 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
<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.
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.
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.
31
File add_new_menu_layout.xml (Admin)
32
File MenuViewHolder.java (Admin)
33
File Home.java (Admin)
34
Database ditujukan pada tabel “Category”
dalam Firebase.
Digunakan fasilitas storage pada firebase untuk
menyimpan gambar yang diupload
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”.
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).
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.
38
Pada <MaterialEditText> untuk
menambahkan kolom untuk mengisi
nama makanan.
39
Pada <MaterialEditText> untuk
menambahkan kolom untuk
mengisi diskon makanan.
40
Pada <info.hong8f.widget.FButton>
untuk menampilkan tombol Upload.
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.
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.
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.
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”.
45
Method chooseImage() berfungsi saat ingin
memilih gambar yang akan diupload.
46
Jika gambar kategori ditekan lama maka akan
muncul pilihan untuk meng-update makanan
atau men-delete makanan.
47
Ketika memilih tombol “YES”
maka nama, harga, discount, dan
deskripsi makanan terbaru akan
diubah dan set menjadi nilai baru
dalam database
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.
51
Sequence Diagram Awal
FirebaseDatabase database;
DatabaseReference foodList;
FirebaseRecyclerAdapter<Food,FoodViewHolder> adapter;
FirebaseRecyclerAdapter<Food,FoodViewHolder> searchAdapter;
52
List<String> suggestList = new ArrayList<>();
MaterialSearchBar materialSearchBar;
recyclerView = (RecyclerView)findViewById(R.id.recycler_food);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
//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
});
}
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);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
{
}
});
}
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.
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
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>
<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.
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);
} }
69
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
} }); }
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.
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.
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
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.
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.
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
<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.
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;
@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();
}
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();
}
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));
}
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.
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
<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"
>
<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>
public Order() {
}
86
public void setQuantity(String quantity) {
Quantity = quantity;
}
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.
FirebaseDatabase database;
DatabaseReference requests;
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);
Memanggil database sesuai dengan nomor meja yang telah diisikan oleh user
pada saat log in pertama kali.
private void loadOrders(String noMeja) {
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();
}
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;
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);
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