Anda di halaman 1dari 85

Modul Praktikum

PEMROGRAMAN PERANGKAT
BERGERAK I
Java under Android Studio

SEKOLAH TINGGI INFORMATIKA & KOMPUTER INDONESIA


2020
2

Kegiatan Praktikum
Mata Kuliah
Praktikum Pemrograman Perangkat Bergerak I

Prasyarat dan Kosyarat


Prasyarat :-

KoSyarat : Pemrograman Perangkat Bergerak II

Standar Kompetensi
Mahasiswa mampu membangun sebuah aplikasi sistem informasi berbasis mobile yang terhubung
dengan database

Bobot SKS, Semester


1 SKS, Semester

Program Studi
Teknik Informatika

Jumlah Pertemuan
8 kali reguler, 2 kali responsi

Rencana Pertemuan
Pertemuan 1 – Modul 1

Pertemuan 2 – Modul 2

Pertemuan 3 – Modul 3

Pertemuan 4 – Modul 4

Pertemuan 5 – Responsi 1 (UTS)

Pertemuan 6 – Modul 5

Pertemuan 7 – Modul 6

Pertemuan 8 – Modul 7

Pertemuan 9 – Modul 8

Pertemuan 10 – Responsi 2 (UAS)


3

Alokasi Waktu per Pertemuan


150 menit

Kata Pengantar

Android adalah sebuah sistem operasi yang berbasis Linux untuk telepon seluler seperti
telepon pintar dan komputer tablet. Android menyediakan platform terbuka bagi para pengembang
untuk menciptakan aplikasi mereka sendiri untuk digunakan oleh bermacam peranti bergerak.

Pada modul ini penyusun mengajak praktikan memasuki dunia pemrograman perangkat
bergerak berbasis android dengan menggunakan Java dan XML sebagai bahasa pemrogramannya,
dan menggunakan Android Studio sebagai lingkungan pemrograman yang kaya akan fitur
pertolongan instan. Diharapkan setelah mendapatkan materi ini, mahasiswa mampu membuat
aplikasi yang dapat digunakan untuk menyelesaikan suatu kasus sederhana berbasis perangkat
bergerak.

Namun, kami menyadari bahwa modul ini belumlah sempurna. Tinjauan dan saran yang
bersifat membangun tetaplah sangat diharapkan demi peningkatan kesempurnaan modul praktikum
ini.

Malang, Maret 2020

Penyusun
4

Daftar Isi

Kegiatan Praktikum ii

Mata Kuliah ii

Prasyarat dan Kosyarat ii

Standar Kompetensi ii

Bobot SKS, Semester ii

Program Studi ii

Jumlah Pertemuan ii

Rencana Pertemuan ii

Alokasi Waktu per Pertemuan ii

Kata Pengantar iii

Daftar Isi iv

XML BASED LAYOUT 1

Tujuan 1

Persiapan 1

Materi Pokok 1

Proses 2

Aktivitas 2

Latihan 7

Penutup 7

Tugas 7

WIDGET 8

Tujuan 8

Persiapan 8

Materi Pokok 8

Proses 9

Aktivitas 9
5

Latihan 21

Penutup 22

Tugas 22

Layout Manager 23

Tujuan 23

Persiapan 23

Materi Pokok 23

Proses 24

Aktivitas 24

Latihan 29

Penutup 29

Tugas 29

Alert Dialog & Notification 30

Tujuan 30

Persiapan 30

Materi Pokok 30

Proses 31

Aktivitas 31

Latihan 38

Penutup 38

Tugas 38

Menu 39

Tujuan 39

Persiapan 39

Materi Pokok 39

Proses 40

Aktivitas 40

Latihan 44

Penutup 44
6

Tugas 44

Location Based Service 45

Tujuan 45

Persiapan 45

Materi Pokok 45

Proses 46

Aktivitas 46

Latihan 54

Penutup 54

Tugas 54

Database Internal 55

Tujuan 55

Persiapan 55

Materi Pokok 55

Proses 56

Aktivitas 56

Latihan 67

Penutup 67

Tugas 67

Database External 68

Tujuan 68

Persiapan 68

Materi Pokok 68

Proses 69

Aktivitas 69

Latihan 79

Penutup 79

Tugas 79
1

Modul

1
XML BASED LAYOUT
Tujuan

Praktikan diharapkan dapat menggunakan Android Studio untuk membuat program sederhana pada
smartphone/ emulator. Di akhir praktikum ini, praktikan diharapkan:

• Mahasiswa mampu memahami penggunaan Android Studio

• Mahasiswa mampu memahami penggunaan XML layout

• Mahasiswa mampu menerapkan komponen widget pada XML Layout

Persiapan
1. Buku ajar (jika ada)/diktat kuliah/materi dari sumber lain
2. Alat tulis
3. Kertas Buram
4. Lembar jawaban
5. Lembar penilaian (disiapkan oleh asisten)
6. Komputer yang sudah di-install Android Studio & Emulator didalamnya
7. Android Smartphone (Jika tidak menginstall emulator)

Materi Pokok
Praktikum ini mengasumsikan bahwa praktikan telah menginstall Android Studio dalam
laptop/komputernya masing-masing . Praktikan juga diharapkan sudah membaca materi tentang
Android Studio dan pemrograman Java secara mandiri. Agar praktikan dapat mencapai tujuan yang
sudah ditetapkan dalam pertemuan praktikum pertama ini, praktikan harus aktif membaca, bertanya,
dan mencoba mempraktekkan tugas-tugas yang ada dalam modul praktikum ini.
2

Proses
Praktikan wajib mencari referensi tentang pemrograman Java dalam android, kegiatan ini dilakukan
selama 30 menit. Setelah mencari referensi praktikan harus membuat deskripsi singkat tentang
pemrograman Java melalui Android Studio. Langkah selanjutnya adalah mempelajari
struktur/kerangka pemrograman Java dalam android melalui contoh-contoh source code program
Java. Berdasarkan contoh yang dipelajari tersebut praktikan berdiskusi sesuai dengan panduan
aktifitas yang dilakukan selama 20 menit. Setelah diskusi selesai, praktikan melakukan aktifitas
berikutnya secara mandiri. Untuk mengerjakan project (membuat program/coding) secara mandiri,
praktikan dapat menyelesaikannya di dalam laboratorium dengan waktu 30 menit. Berikutnya untuk
sesi latihan, ada soal tentang pengembangan program yang juga harus diselesaikan di laboratorium
juga dalam waktu 50 menit. Terakhir adalah bagian tugas, yaitu project yang dikerjakan dirumah dan
wajib dikumpulkan pada pertemuan berikutnya.

Aktivitas

1. Mahasiswa membaca buku ajar (jika ada)/ diktat kuliah/materi dari sumber lain tentang XML
Based Layout sebagai materi bab pertama. Temukan bagian penting dalam topik XML Based
Layout, kemudian tulis sebagai ringkasan hasil belajar

2. Berikut adalah beberapa penjelasan mengenai XML Layout

XML Layout merupakan suatu tampilan tata letak di Android untuk mengatur
penempatan teks, gambar, ataupun komponen lainnya sehingga tampilan pada aplikasi yang
dibuat terlihat rapih dan nyaman untuk dilihat oleh pengguna.

3. Berikut merupakan Langkah-langkah menjalankan dan mempuat projek Andrioid Studio


berupa XML Layout,

● Langkah yang pertama kita jalankan Android Studio yang sudah terinstal Android SDK.
Setelah AS dijalankan di contoh kita menggunakan versi 4.1.2. Pilih create new project.
3

● Setelah itu, kita akan diarahkan ke halaman untuk memilih template projek yang akan
dibuat, sekarang kita pilih dulu Empty Activity lalu klik Next.

● Selanjutnya, kita akan masuk ke halaman konfigurasi projek kita, disini kita akan
menentukan beberapa hal yaitu,
1. Nama projek
2. Nama paket (package)
3. Lokasi Penyimpanan Projek (Secara default akan disimpan di
(C:\Users\Nama_User\AndroidStudioProjects\)
4. Bahasa Pemrograman Projek (Bisa memilih Java atau Kotlin)
5. Minimum SDK dimana projek ini bisa dijalankan.

Setelah semua konfigurasi sudah selesai ditentukan, klik Finish.


4

● Lalu kita akan berpindah ke halaman awal projek kita, tunggu semua proses yang berjalan
sampai selesai sehingga tampilan projek kita menjadi seperti ini.

Selesai, sekarang kita dapat melanjutkan projek kita untuk membuat aktivitas dari Modul 1.

● Langkah pertama, buka file strings.xml yang terdapat dalam folder res/values/, file ini
berisi nilai-nilai string yang digunakan pada aplikasi yang kita buat. Sesuaikan kodenya
menjadi seperti berikut.

Strings.xml

<resources>
<string name="app_name">Teks Input</string>
<string name="hello_world">Hello World!</string>
<string name="menu_settings">Settings</string>
<string name="nm">Nama:</string>
<string name="btn">OK</string>
</resources>

● Langkah kedua, buka Layout aplikasi android yang terletak pada


res/layout/activity_main.xml. Dan sesuaikan kodenya menjadi seperti berikut,

activity_main.xml
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/nm" />
<EditText
5

android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView2"
android:layout_below="@+id/textView2"
android:layout_marginTop="18dp"
android:ems="10" >
<requestFocus />
</EditText>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/editText1"
android:layout_below="@+id/editText1"
android:layout_marginTop="20dp"
android:text="Button" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/button1"
android:layout_below="@+id/button1"
android:layout_marginTop="48dp"
android:text=""/>
</RelativeLayout>

● Lalu kita akan membuat logika program menggunakan Bahasa Java yang secara otomatis
tersimpan pada src/nama_package/MainActivity.java. Buka file tersebut dan ganti kodenya
menjadi sebagai berikut,

MainActivity.java
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText EditText1=(EditText)findViewById(R.id.editText1);
Button Button1 = (Button)findViewById(R.id.button1);
final TextView tampil = (TextView)findViewById(R.id.textView1);
Button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
tampil.setText("Nama anda : "+EditText1.getText().toString());
}
});
}
6

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}

● Setelah semua sudah selesai disesuaikan, sekarang kita bisa coba jalankan projek kita dan
perhatikan hasilnya.
7

Latihan
PERHATIAN! Program-program yang dihasilkan dari latihan maupun tugas pada setiap
pertemuan mungkin akan digunakan kembali pada pertemuan selanjutnya. Jadi, simpan baik-
baik hasil program yang telah dibuat tersebut.

Kembangkanlah aplikasi dari aktivitas yang telah dibuat dengan menambahkan beberapa hal seperti,

1. Nama Lengkap
2. NRP
3. Jurusan
4. Email
5. Alamat
6. Jenis Kelamin

Penutup
Tugas
Buat form aplikasi untuk menginformasikan CV (curicullum vitae) anda secara lengkap!

Terdapat 4 hal yang harus ada di aplikasi yang akan dibuat, yaitu :

1. Textview untuk Nama Lengkap, Email, Tanggal & Tempat Lahir, Deskripsi
2. EditText untuk semua TextView yang ada
3. Sebuah Button "Tampil" untuk menampilkan data yang sudah di-inputkan.
4. Output berisikan semua data yang user inputkan kedalam EditText.
8

Modul

2
WIDGET
Tujuan

Praktikan diharapkan dapat menggunakan Android Studio untuk membuat program sederhana pada
smartphone/ emulator. Di akhir praktikum ini, praktikan diharapkan:

• Mahasiswa mampu memahami komponen Widget

• Mahasiswa mampu menerapkan komponen Widget

• Mahasiswa mampu menerapkan penggunaan Widget pada tampilan antarmuka

Persiapan
1. Buku ajar (jika ada)/diktat kuliah/materi dari sumber lain
2. Alat tulis
3. Kertas Buram
4. Lembar jawaban
5. Lembar penilaian (disiapkan oleh asisten)
6. Komputer yang sudah di-install Android Studio & Emulator didalamnya
7. Android Smartphone (Jika tidak menginstall emulator)

Materi Pokok
Praktikum ini mengasumsikan bahwa praktikan telah mempelajari macam-macam widget pada
Android. Praktikum ini mengasumsikan bahwa mahasiswa telah mempelajari berbagai jenis dan
komponen widget dengan benar beserta dengan cara-cara penginputan datan dan pemasangannya.
Praktikan diharapkan mampu menggunakan setiap widget yang dipilih/digunakan dalam program.
Selain itu praktikan diharapkan mampu mengombinasikan berbagai komponen widget yang dapat
digunakan untuk setiap widget tersebut. Agar mahasiswa dapat mencapai tujuan dalam pertemuan
praktikum ketiga ini, mahasiswa harus aktif dalam membuat program dan menyelesaikan setiap
kasus serta mencoba mempraktekkan tugas-tugas dalam praktikum ini.
9

Proses
Praktikan membuat sebuah project atau menyelesaikan sebuah studi kasus yang berhubungan
dengan widget dan bisa melakukan pemasangannya, kemudian mahasiswa dapat menggunakan
komponen-komponen widget untuk melakukan proses penginputan maupun pengeluaran data dan
mempelajari struktur komponen widget dalam program Java Android dengan melihat source code
program Java, kemudian berdiskusi sesuai dengan panduan aktifitas yang ada. Sedangkan waktu
untuk mengerjakan project (membuat program/coding) secara individual harus diselesaikan di
dalam laboratorium dalam waktu 40 menit. Berikutnya untuk sesi latihan, ada soal tentang
pengembangan program yang juga harus diselesaikan di laboratorium dalam waktu 60 menit.
Terakhir adalah bagian tugas, yaitu project yang dikerjakan dirumah dan wajib dikumpulkan pada
pertemuan berikutnya.

Aktivitas
1. Mahasiswa membaca buku ajar (jika ada)/ diktat kuliah/materi dari sumber lain tentang Widget
/ widget view sebagai materi bab kedua. Temukan bagian penting dalam topik Komponen Dasar
Swing ini, kemudian tulis sebagai ringkasan hasil belajar.
2. Widget merupakan tampilan aplikasi mini yang dapat disematkan dalam aplikasi lain (seperti
Layar utama) dan menerima update berkala. Tampilan ini disebut sebagai Widget dalam
antarmuka pengguna, dan Anda dapat memublikasikannya dengan penyedia Widget Aplikasi.
3. Berikut adalah beberapa komponen dari widget pada pemrograman perangkat bergerak:

Komponen widget antara lain :

● TextView
● EditText
● Button

4. Berikut adalah Langkah-langkah membuat projek menggunakan widget pada android:

Basic Widget Android

● Buatlah projek baru dengan mengikuti Langkah-langkah yang sudah dipelajari


dalam modul 1.
● Sesuaikan kode berikut kedalam activity_main.xml

activity_main.xml

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<Button
android:id="@+id/btnSave"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Save" />
<Button
android:id="@+id/btnOpen"
android:layout_width="wrap_content"
10

android:layout_height="wrap_content"
android:text="Open" />
<ImageButton
android:id="@+id/img1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher_background" />
<EditText
android:id="@+id/txtName"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<CheckBox
android:id="@+id/chkAutoSave"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="AutoSave" />
<CheckBox
android:id="@+id/star"
style="?android:attr/starStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<RadioGroup
android:id="@+id/rdGp1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<RadioButton
android:id="@+id/rdb1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Option1" />
<RadioButton
android:id="@+id/rdb2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Option2" />
</RadioGroup>
<ToggleButton
android:id="@+id/toggle1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>

● Langkah ketiga, sesuaikan kode berikut dengan MainActivity.java yang secara


otomatis dibuat ketika projek dibuat.

MainActivity.java
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
import android.widget.ToggleButton;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
11

setContentView(R.layout.activity_main);
//button view
Button btnOpen = (Button) findViewById(R.id.btnOpen);
btnOpen.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
DisplayToast("You have click the Open button");
}
});
Button btnSave = (Button) findViewById(R.id.btnSave);
btnSave.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
DisplayToast("You have click the Save Button");
}
});
CheckBox checkBox = (CheckBox)findViewById(R.id.chkAutoSave);
checkBox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (((CheckBox)v).isChecked())
DisplayToast("Chekbox is checked");
else
DisplayToast("Checkbox is unchecked");
}
});
RadioGroup radioGroup =(RadioGroup)findViewById(R.id.rdGp1);
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group,int checkedId) {
RadioButton rb1 = (RadioButton)findViewById(R.id.rdb1);
if (rb1.isChecked()) {
DisplayToast("Option 1 is checked");
}
else{
DisplayToast("Option 2 is checked");
}
}
});
ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggle1);
toggleButton.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v) {
if (((ToggleButton)v).isChecked())
DisplayToast("Toggle button is On");
else
DisplayToast("Toggle button is Off");
}
});
}
private void DisplayToast(String msg) {
Toast.makeText(getBaseContext(), msg, Toast.LENGTH_SHORT).show();
}
}
12

● Bila sudah selesai menyesuaikan semua kode, coba jalankan projek dan hasil dari
tampilan utamanya akan menjadi seperti berikut,

GridView Menggunakan Image

● Buat projek android baru seperti biasa


● Siapkan 6 file image berukuran 100x100 pixel (Gambar Bebas), yang nantinya akan
digunakkan untuk demo galeri foto pada gridview.
● Copy/Cut file image kedalam folder /res/drawable.
● Sesuaikan nama dan format file image dengan contoh berikut,

● Langkah berikutnya, buatlah sebuah file .xml bernama cell.xml kedalam folder
/res/drawable dengan mengikuti Langkah-langkahnya seperti berikut,
⮚ Klik kanan folder drawable dan pilih New -> Drawable Resources File.

⮚ Setelah itu kita akan diarahkan ke halaman pop-up untuk konfigurasi file
.xml yang akan dibuat. Beri nama cell.xml untuk projek kita dan klik OK.
13

● Jika sudah selesai dibuat, sesuaikan kode didalam cell.xml seperti berikut,

cell.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="88dp"
android:layout_height="122dp"
android:layout_gravity="center_horizontal" />
<TextView
android:id="@+id/keterangan"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="keterangan" />
</LinearLayout>

● Sesuaikan juga kode pada activity_main.xml seperti berikut,

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<GridView
android:id="@+id/grid"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:columnWidth="100dip"
android:gravity="center"
android:horizontalSpacing="5dip"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:verticalSpacing="40dip" />
</LinearLayout>
14

● Yang terakhir, sesuaikan kode pada MainActivity.java untuk menghandle layout


dan gridview didalamnya.

MainActivity.java
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements


AdapterView.OnItemClickListener {
// data buku
private static final String[] items = { "buku 1", "buku 2", "buku 3",
"buku 4", "buku 5", "buku 6" };
// gambar buku
private int[] imageID = { R.drawable.c1, R.drawable.c2, R.drawable.c3,
R.drawable.c4, R.drawable.c5, R.drawable.c6 };

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GridView g = (GridView) findViewById(R.id.grid);
// set adapter gridview
g.setAdapter(new IconAdapter());
// beri action saat click
g.setOnItemClickListener((AdapterView.OnItemClickListener) this);
}

private class IconAdapter extends ArrayAdapter<String> {


// konstruktor memanggil method super() dari class parent nya
public IconAdapter() {
super(MainActivity.this, R.layout.cell, items);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// instansiasi row dari convertView
View row = convertView;
if (row == null) {
// inflate layout
LayoutInflater inflater = getLayoutInflater();
row = inflater.inflate(R.layout.cell, parent, false);
}
ImageView imageView = (ImageView) row.findViewById(R.id.imageView1);
TextView keterangan = (TextView) row.findViewById(R.id.keterangan);
// set skala gambar
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
// set keterangan dan gambar berdasarkan position
keterangan.setText(items[position]);
imageView.setImageResource(imageID[position]);
// kembalikan objek view
return row;
}
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int p, long arg3) {
//tampilkan pesan pop up saat click.
Toast.makeText(MainActivity.this,
items[p] + " clicked!", Toast.LENGTH_SHORT).show();
}
}
15

● Jalankan proyek dan hasilnya adalah sebagai berikut,

DateTimePicker dan Splash Screen

● Buat projek baru seperti biasa


● Siapkan juga sebuah file image untuk dijadikan SplasScreen nantinya didalam file
drawable. (Didalam contoh ini, file image bernama kk.jpg)
● Buatlah sebuah empty activity baru dengan mengikuti Langkah-langkah sebagai
berikut,
⮚ Klik kanan pada folder package kita dan pilih
New->Activity->Empty Activity
16

⮚ Selanjutnya kita akan diarahkan ke halaman pop-up untuk konfigurasi


empty activity yang akan dibuat, sesuaikan konfigurasinya seperti contoh
ini

● Setelah selesai membuat activity baru, AS akan membuat 2 file baru yaitu
activity_splash.xml dan Splash.java secara otomatis.
● Buka activity_splash.xml dan sesuaikan kodenya menjadi seperti berikut

activity_splash.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/kk" >
<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="164dp" />
</RelativeLayout>

● Sesuaikan juga activity_main.xml menjadi seperti berikut

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<EditText
android:id="@+id/editTextTanggal"
17

android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginTop="16dp"
android:ems="10"
android:hint="Tanggal" >
<requestFocus />
</EditText>

<EditText
android:id="@+id/editTextJam"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/editTextTanggal"
android:layout_marginTop="17dp"
android:ems="10"
android:hint="Jam" />
</RelativeLayout>

● Sesuaikan juga kode pada Splash.java menjadi seperti ini

Splash.java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Window;

public class Splash extends Activity {


protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.splash);
Thread timer = new Thread()
{
public void run()
{
try {
sleep(4000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
finally {
finish();
Intent m = new Intent(Splash.this, MainActivity.class);
startActivityForResult(m,0);
}
}
};
timer.start();
}
}

● Buka kelas MainActivity.java dan sesuaikan kodenya

MainActivity.java
import androidx.appcompat.app.AppCompatActivity;

import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
18

import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.TimePicker;

import java.util.Calendar;

public class MainActivity extends AppCompatActivity {

private EditText edtTanggal, edtJam;


int hari, bulan, tahun, jam, menit;
private String[] arrBulan = { "Januari", "Februari", "Maret", "April",
"Mei", "Juni", "Juli", "Agustus", "September", "Oktober",
"November", "Desember" };

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Calendar c = Calendar.getInstance();
hari = c.get(Calendar.DAY_OF_MONTH);
bulan = c.get(Calendar.MONTH);
tahun = c.get(Calendar.YEAR);
edtTanggal = (EditText) findViewById(R.id.editTextTanggal);
edtJam = (EditText) findViewById(R.id.editTextJam);
edtTanggal.setOnTouchListener(new View.OnTouchListener() {
@SuppressWarnings("deprecation")
@Override
public boolean onTouch(View v, MotionEvent event) {
showDialog(0);
return true;
}
});
edtJam.setOnTouchListener(new View.OnTouchListener() {
@SuppressWarnings("deprecation")
@Override
public boolean onTouch(View v, MotionEvent event) {
showDialog(1);
return true;
}
});
}

public Dialog onCreateDialog(int id) {


switch (id) {
case 0:
return new DatePickerDialog(this,
mDateSetListener, tahun, bulan, hari);
case 1:
return new TimePickerDialog(this,
mTimeSetListener, jam, menit, true);
}
return null;
}
public DatePickerDialog.OnDateSetListener mDateSetListener = new
DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
tahun = year;
bulan = monthOfYear;
hari = dayOfMonth;
String sdate = LPad(hari + "", "0", 2)
+ " " + arrBulan[bulan] + " " + tahun;
edtTanggal.setText(sdate);
}
};
public TimePickerDialog.OnTimeSetListener mTimeSetListener =
new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int hourOfDay, int
minuteOfHour) {
jam = hourOfDay;
menit = minuteOfHour;
String stime = LPad("" + jam, "0", 2) + ":"
19

+ LPad("" + menit, "0", 2);


edtJam.setText(stime);
}
};
public static String LPad(String schar, String spad, int len) {
String sret = schar;
for (int i = sret.length(); i < len; i++) {
sret = spad + sret;
}
return new String(sret);
}
}

● Lalu yang terdapat file penting yang harus disesuaikan juga yaitu
AndroidManifest.xml dimana kita perlu membuat activity Splash untuk berjalan
pertama kali ketika aplikasi dibuka.

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.elreginaldcaesarosan.uas.latihampertemuan2_3">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".Splash">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />


</intent-filter>
</activity>
<activity android:name=".MainActivity"></activity>
</application>

</manifest>

● Coba jalankan projek dan hasilnya akan menjadi seperti ini


20

Membuat ListActivity

● Buat projek baru seperti biasanya


● Ubah file layout activity_main.xml dengan kode berikut,

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!--List View -->
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="17dp"
android:id="@+id/list_view"
/>
<TextView
android:text="Pilih Mata Kuliah :"
android:textStyle="bold"
android:layout_marginBottom="16dp"
android:layout_alignParentTop="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true"
android:id="@+id/textView"/>
</RelativeLayout>

● Lalu sesuaikan kode MainActivity.java menjadi seperti ini


import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {


private ListView lvItem;
private String[] MataKuliah = new String[]{
"Kalkulus","Jaringan Komputer","Pemrograman Mobile" ,
"Sistem Operasi", "Basis Data", "Etika Komputer",
"Information Retrieval","Pengolahan Citra Digital",
"Artificial Inteligence","Pemrograman Web lanjut"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportActionBar().setTitle("ListView Sederhana");
getSupportActionBar().setSubtitle("Jadwal Mata Kuliah");
lvItem = (ListView) findViewById(R.id.list_view);
ArrayAdapter<String> adapter = new
ArrayAdapter<String>(MainActivity.this,
android.R.layout.simple_list_item_1, android.R.id.text1,
MataKuliah);
lvItem.setAdapter(adapter);
lvItem.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
21

@Override
public void onItemClick(AdapterView<?> parent, View view, int
position, long id) {
Toast.makeText(MainActivity.this, "Memilih : "
+ MataKuliah[position], Toast.LENGTH_LONG).show();
}
});
}
}

● Jalankan projeknya dan hasilnya akan menjadi seperti berikut

Latihan
Buatlah sebuah list bertingkat dengan tingkatan sebagai berikut,
List Genre Buku -> GridView Buku sesuai genre yang dipilih -> Detail Buku
22

Penutup
Tugas
Buatlah sebuah aplikasi untuk menghitung BP (Battle Power) dari Hero yang kalian inputkan dengan
tampilan sebagai berikut!

Petunjuk :

1. Buat Layar menggulung atau scroll


2. Tampilkan gambar sesuai dengan kelasnya (6 Gambar)
3. Tabel Rating

4. Nilai rating item :


● Attack Box : +10000
● Defense Box : +8000
● ASPD Box : +5000
● HP Box : +12000
5. Total Rate BP (Battle Power) = R. Hero + R. Kelas + R. Item
6. Isi kelas Hero harus sesuai dengan Hero yang dipilih!:
23

Modul

3
Layout Manager
Tujuan
Praktikan diharapkan dapat menggunakan Android Studio untuk membuat program sederhana pada
smartphone/ emulator. Di akhir praktikum ini, praktikan diharapkan:

• Memahami komponen Layout Manager pada Android Studio

• Menerapkan komponen Layout untuk membuat antarmuka sederhana

Persiapan
1. Buku ajar (jika ada)/diktat kuliah/materi dari sumber lain
2. Alat tulis
3. Kertas Buram
4. Lembar jawaban
5. Lembar penilaian (disiapkan oleh asisten)
6. Komputer yang sudah di-install Android Studio & Emulator didalamnya
7. Android Smartphone (Jika tidak menginstall emulator)

Materi Pokok
Praktikum ini mengasumsikan bahwa mahasiswa telah mempelajari tentang Layout
Manager pada android dengan benar beserta penggunaannya. Agar praktikan dapat mencapai tujuan
dalam pertemuan ini, praktikan harus aktif dalam membuat program dan menyelesaikan setiap kasus
serta mencoba mempraktekkan tugas-tugas dalam praktikum ini.
24

Proses
Praktikan membuat sebuah project atau menyelesaikan sebuah studi kasus dengan memanfaatkan
Layout Manager dan bisa menggunakannya dalam Android Studio, kemudian berdiskusi sesuai
dengan panduan aktivitas yang ada. Sedangkan waktu untuk mengerjakan project (membuat
program/coding) secara individual harus diselesaikan di dalam laboratorium dalam waktu 40 menit.
Berikutnya untuk sesi latihan, ada soal tentang pengembangan program yang juga harus diselesaikan
di laboratorium dalam waktu 60 menit. Terakhir adalah bagian tugas, yaitu project yang dikerjakan
dirumah dan wajib dikumpulkan pada pertemuan berikutnya.

Aktivitas
1. Praktikan membaca buku ajar (jika ada)/diktat kuliah/materi dari sumber lain tentang Layout
Manager pada Android Studio sebagai materi modul ketiga. Temukan bagian penting dalam
topik ini, kemudian tulislah sebagai ringkasan hasil belajar.
2. Praktikan berdiskusi tentang Layout Manager, macam-macamnya dan penggunaannya dalam
Android Studio

3. Praktikan mempraktekkan aktivitas di bawah ini kemudian mendiskusikan hasilnya dengan


praktikan lain.

4. Berikut merupakan Langkah-langkah membuat sebuah projek android studio dengan layout
manager,

● Buat projek bari di Android Studio seperti biasanya


● Buatlah 2 class .java baru yaitu Users.java dan UserAdapter.java
● Buat juga list_users.xml didalam folder res/layout/
● Pertama, ubah dan sesuaikan kode di activity_main.xml menjadi seperti ini

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>

● Kedua, ubah dan sesuaikan kode di list_users.xml menjadi seperti ini

list_users.xml
<?xml version="1.0" encoding="utf-8"?>

<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
25

android:layout_height="wrap_content"
card_view:cardCornerRadius="6dp"
card_view:cardElevation="3dp"
card_view:cardUseCompatPadding="true">

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical"
android:padding="5dp">

<!-- TextView Nama User -->


<TextView
android:id="@+id/txt_nama_user"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<!-- TextView Alamat User -->


<TextView
android:id="@+id/txt_alamat_user"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

<!-- TextView Jenis Kelamin User -->


<TextView
android:id="@+id/txt_jk_user"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

</LinearLayout>

</androidx.cardview.widget.CardView>

● Ketiga, sesuaikan kode pada Users.java menjadi seperti ini

Users.java

public class Users {


private String nama;
private String alamat;
private String jk;

public Users(String nama, String alamat, String jk) {


this.nama = nama;
this.alamat = alamat;
this.jk = jk;

public String getNama() {


return nama;
}

public void setNama(String nama) {


this.nama = nama;
}

public String getAlamat() {


return alamat;
}

public void setAlamat(String alamat) {


26

this.alamat = alamat;
}

public String getJk() {


return jk;
}

public void setJk(String jk) {


this.jk = jk;
}
}

● Keempat, ubah dan sesuaikan kode pada UserAdapter.java menjadi seperti berikut

UserAdapter.java
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class UserAdapter extends RecyclerView.Adapter<UserAdapter.UserViewHolder> {


private ArrayList<Users> dataList;

public UserAdapter(ArrayList<Users> dataList) {


this.dataList = dataList;
}

@Override
public UserViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
View view = layoutInflater.inflate(R.layout.list_users, parent, false);
return new UserViewHolder(view);
}

@Override
public void onBindViewHolder(UserViewHolder holder, int position) {
holder.txtNama.setText(dataList.get(position).getNama());
holder.txtNpm.setText(dataList.get(position).getAlamat());
holder.txtNoHp.setText(dataList.get(position).getJk());
}

@Override
public int getItemCount() {
return (dataList != null) ? dataList.size() : 0;
}

public class UserViewHolder extends RecyclerView.ViewHolder{


private TextView txtNama, txtNpm, txtNoHp;

public UserViewHolder(View itemView) {


super(itemView);
txtNama = (TextView) itemView.findViewById(R.id.txt_nama_user);
txtNpm = (TextView) itemView.findViewById(R.id.txt_alamat_user);
txtNoHp = (TextView) itemView.findViewById(R.id.txt_jk_user);
}
}
}

● Kelima, ubah dan sesuaikan juga kode pada MainActivity.java menjadi seperti berikut
27

MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

private RecyclerView recyclerView;


private UserAdapter adapter;
private ArrayList<Users> userArrayList;

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

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

adapter = new UserAdapter(userArrayList);

RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);

recyclerView.setLayoutManager(layoutManager);

recyclerView.setAdapter(adapter);
}

void addData(){
userArrayList = new ArrayList<>();
userArrayList.add(new Users("Dimas Maulana", "Malang", "Pria"));
userArrayList.add(new Users("Elizabeth Yohana", "Jakarta", "Wanita"));
userArrayList.add(new Users("Budi Nugraha", "Batu", "Pria"));
userArrayList.add(new Users("Siti Siswana", "Surabaya", "Wanita"));
}
}

● Setelah semuanya telah selesai disesuaikan, buka file build.gradle level Module yang ada di
dalam folder Gradle Scripts.

● Lalu tambahkan 2 dependency berikut kedalam dependencies didalam file build.gradle


seperti berikut

Dependency baru :

implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.cardview:cardview:1.0.0'

Implementasi dependency baru :


28

dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.cardview:cardview:1.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

● Jalankan projek dan hasilnya akan menjadi seperti ini


29

Latihan
Modifikasilah aplikasi dari aktivitas yang sudah dibuat dengan menambahkan Toast jika salah satu
list dipilih.

Toast akan menampilkan,

1. Nama
2. Umur
3. Alamat
4. Jenis Kelamin

Penutup
Tugas
Buatlah aplikasi baru dengan menerapkan RecycleView dengan menambahkan beberapa hal sebagai
berikut,
1. Tambahkan sebuah gambar didalam list RecycleView untuk masing" datanya
2. Bila sebuah list dipilih, user akan diarahkan ke halaman/layout detail dari list yang dipilih
30

Modul

4
Alert Dialog & Notification
Tujuan
Praktikan diharapkan dapat menggunakan Android Studio untuk membuat program sederhana pada
smartphone/ emulator. Di akhir praktikum ini, praktikan diharapkan:

• Memahami penggunaan Alert Dialog & Notification pada Android Studio

• Menerapkan Alert Dialog & Notification pada kasus sederhana.


Persiapan
1. Buku ajar (jika ada)/diktat kuliah/materi dari sumber lain
2. Alat tulis
3. Kertas Buram
4. Lembar jawaban
5. Lembar penilaian (disiapkan oleh asisten)
6. Komputer yang sudah di-install Android Studio & Emulator didalamnya
7. Android Smartphone (Jika tidak menginstall emulator)

Materi Pokok
Praktikum ini mengasumsikan bahwa mahasiswa telah mempelajari kelas Alert Dialog dan
Notification Android dengan benar beserta dengan cara penerapannya. Agar praktikan dapat
mencapai tujuan dalam pertemuan ini, praktikan harus aktif dalam membuat program dan
menyelesaikan setiap kasus serta mencoba mempraktekkan tugas-tugas dalam praktikum ini.
31

Proses
Praktikan membuat sebuah project atau menyelesaikan sebuah studi kasus tentang Alert Dialog dan
Notification kemudian berdiskusi sesuai dengan panduan aktivitas yang ada. Sedangkan waktu
untuk mengerjakan project (membuat program/coding) secara individual harus diselesaikan di
dalam laboratorium dalam waktu 40 menit. Berikutnya untuk sesi latihan, ada soal tentang
pengembangan program yang juga harus diselesaikan di laboratorium dalam waktu 60 menit.
Terakhir adalah bagian tugas, yaitu project yang dikerjakan dirumah dan wajib dikumpulkan pada
pertemuan berikutnya.

Aktivitas
1. Praktikan membaca buku ajar (jika ada)/ diktat kuliah/materi dari sumber lain tentang Alert
Dialog Notification sebagai materi bab keempat. Temukan bagian penting dalam topik ini,
kemudian tulis sebagai ringkasan hasil belajar.

2. Praktikan berdiskusi tentang Alert Dialog Notification serta menerapkannya dalam sebuah
program Java melalui Android Studio.

3. Praktikan mengerjakan aktivitas di bawah ini kemudian berdiskusi tentang hasilnya.

4. Berikut merupakan Langkah-langkah membuat projek android studio

Alert Dialog

● Buat projek baru pada android studio


● Siapkan 3 file gambar dengan ukuran 70x70 dengan nama :
⮚ Save
⮚ Tick
⮚ Delete
Gambar bisa berupa .xml atau format gambar lainnya dan letakkan di folder
drawable.
● Buka dan sesuaikan kode activity_main.xml menjadi seperti berikut

activity_main.xml

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFFFF"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="match_parent"
android:layout_height="80dp"
android:src="@drawable/android"/>
<Button
android:id="@+id/btnAlert"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dip"
android:padding="10dip"
android:text="Tampilkan Dialog" >
</Button>
<Button
32

android:id="@+id/btnAlertWithTwoBtns"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:padding="10dip"
android:text="Dialog dengan 2 Tombol" >
</Button>
<Button
android:id="@+id/btnAlertWithThreeBtns"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:padding="10dip"
android:text="Dialog dengan 3 Tombol" >
</Button>
<Button
android:id="@+id/btnCustomAlert"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Custom Dialog" />
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="30dip"
android:gravity="center"
android:text="Pemrograman Perangkat Bergerak"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="#58bc07"
android:textSize="17dp"
android:textStyle="bold" />
</LinearLayout>

● Buat sebuah file layout baru bernama detail_info.xml yang nantinya akan
digunakkan untuk menampilkan detail dialog.

detail_info.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:paddingBottom="20dp"
android:paddingTop="20dp"
android:text="Tentang Aplikasi "
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="#006699"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="3dp"
android:background="#006699"
android:orientation="vertical" >
</LinearLayout>
<LinearLayout
33

android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:paddingLeft="20dp"
android:text="Mobile Programming"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="20dp"
android:text="Android"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textSize="18dp"
android:textStyle="bold" />
</LinearLayout>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:paddingLeft="20dp"
android:text="STIKI"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="20dp"
android:text="Mencoba Alert Dialog"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textSize="18dp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="2dp"
android:layout_marginTop="30dp"
android:background="#CCFFCC"
android:orientation="vertical" >
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="20dp"
android:gravity="center"
android:orientation="horizontal" >
<Button
android:id="@+id/btn_custom_alert_ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OK"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
</LinearLayout>

● Buka MainActivity.java dan sesuaikan kodenya menjadi sebagai berikut

MainActivity.java
import androidx.appcompat.app.AppCompatActivity;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Menu;
import android.view.Window;
import android.widget.Button;
34

import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

Button btnAlertTwoBtns, btnCustomAlert, btnAlertWithThreeBtns, btnAlert;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnAlertTwoBtns = (Button) findViewById(R.id.btnAlertWithTwoBtns);
btnCustomAlert = (Button) findViewById(R.id.btnCustomAlert);
btnAlertWithThreeBtns = (Button) findViewById (R.id.btnAlertWithThreeBtns);
btnAlert = (Button) findViewById (R.id.btnAlert);
btnAlertTwoBtns.setOnClickListener(this);
btnCustomAlert.setOnClickListener(this);
btnAlertWithThreeBtns.setOnClickListener(this);
btnAlert.setOnClickListener(this);
}

public void onClick(View v) {


switch (v.getId()) {
case R.id.btnAlertWithTwoBtns:
// Creating
AlertDialog.Builder alertDialog2 = new AlertDialog.Builder(this);
// Setting dialog
alertDialog2.setTitle("Konfirmasi Hapus ... ?");
alertDialog2.setMessage("Yakin Data Dihapus ?");
alertDialog2.setIcon(R.drawable.delete);
alertDialog2.setPositiveButton("YES",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(),
"Tombol YES ditekan",
Toast.LENGTH_SHORT).show();
}
});
alertDialog2.setNegativeButton("NO",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(),
"Tombol NO ditekan",
Toast.LENGTH_SHORT).show();
dialog.cancel();
}
});
alertDialog2.show();
break;
case R.id.btnAlert:
// Creating
AlertDialog.Builder alertDialog1 = new AlertDialog.Builder(this);
// Setting Dialog
alertDialog1.setTitle("Alert Dialog");
alertDialog1.setMessage("Materi Dialog Mobile Programming");
alertDialog1.setIcon(R.drawable.tick);
alertDialog1.setNeutralButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(),
"Tombol OK ditekan",
Toast.LENGTH_SHORT).show();
}
});
alertDialog1.show();
break;
case R.id.btnAlertWithThreeBtns:
// Creating
AlertDialog.Builder alertDialog3 = new AlertDialog.Builder(this);
// Setting Dialog
alertDialog3.setTitle("Simpan File");
alertDialog3.setMessage("Simpan File Pekerjaan Anda");
alertDialog3.setIcon(R.drawable.save);
35

alertDialog3.setPositiveButton("YES",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(),
"Tombol YES ditekan", Toast.LENGTH_SHORT).show();
}
});
alertDialog3.setNeutralButton("NO",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(),
"Tombol NO ditekan", Toast.LENGTH_SHORT).show();
dialog.cancel();
}
});
alertDialog3.setNegativeButton("Cancel",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(getApplicationContext(),
"Tombol Cancel ditekan", Toast.LENGTH_SHORT).show();
dialog.cancel();
}
});
alertDialog3.show();
break;
case R.id.btnCustomAlert:
final Dialog dialog = new Dialog(this);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.detail_info);
Button dialobButton = (Button) dialog.findViewById(R.id.btn_custom_alert_ok);
dialobButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
break;
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
return true;
}
}

● Jalankan projek dan cobalah untuk menekan tombol di setiap menu untuk melihat
dialog apa yang akan dikeluarkan.
36

Notification

● Buat projek baru pada android studio


● Buka activity_main.xml dan sesuaikan kodenya menjadi seperti berikut

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
android:id="@+id/txtJudul"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Judul"
android:inputType="textPersonName" />
<EditText
android:id="@+id/txtpesan"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="Pesan"
android:inputType="textPersonName" />
<Button
android:id="@+id/btnkirim"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Kirim" />
</LinearLayout>

● Selanjutnya buka MainActivity.java dan sesuaikan juga kodenya menjadi


seperti berikut

MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

// deklarasi tombol
Button btnkirim;
// deklarasi edittext
EditText txtjudul, txtpesan;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// inisialisasi komponen
37

btnkirim = (Button) findViewById(R.id.btnkirim);


txtjudul = (EditText) findViewById(R.id.txtJudul);
txtpesan = (EditText) findViewById(R.id.txtpesan);
// aksi letika tombol diklik
btnkirim.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// membuat komponen Inten
Intent intent = new Intent(getApplicationContext(),
MainActivity.class);
// memanggil method untuk menampilkan notifikasi
// dengan mengirimkan data yang dikirim dari komponen EditText
showNotification(txtjudul.getText().toString(),
txtpesan.getText().toString());
}
});
}

void showNotification(String s, String s1) {


NotificationManager mNotificationManager =
(NotificationManager)
getSystemService(Context.NOTIFICATION_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O)
{
NotificationChannel channel = new
NotificationChannel("YOUR_CHANNEL_ID",
"YOUR_CHANNEL_NAME",
NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription("YOUR_NOTIFICATION_CHANNEL_DESCRIPTION");
mNotificationManager.createNotificationChannel(channel);
}
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(getApplicationContext(),
"YOUR_CHANNEL_ID")
.setSmallIcon(R.mipmap.ic_launcher) // notification icon
.setContentTitle(s) // title for notification
.setContentText(s1)// message for notification
.setAutoCancel(true); // clear notification after click
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,
0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(pi);
mNotificationManager.notify(0, mBuilder.build());
}
}

● Jalankan projek dan cobalah untuk mengisikan sesuatu lalu tekan tombol kirim
untuk mengirimkan sebuah notifikasi.
38

Latihan
Ubahlah layout menu 2 menjadi tampilan halaman yang berisi,

1. Foto anda
2. Nama dan NRP anda
3. Serta beri tombol back untuk kembali ke menu utama

Penutup
Tugas
Buatlah sebuah aplikasi yang menampilkan sebuah alert dialog yang berisikan "About" dari aplikasi
tersebut!

Dialog berisikan :

1. Nama dari aplikasi yang dibuat


2. Versi aplikasi
3. Logo aplikasi
39

Modul

5
Menu
Tujuan
Praktikan diharapkan dapat menggunakan Android Studio untuk membuat program sederhana pada
smartphone/ emulator. Di akhir praktikum ini, praktikan diharapkan dapat:

● Mahasiswa mampu memahami penggunaan Menu

● Mahasiswa mampu menerapkan Navigation Drawer pada Menu

Persiapan

1. Buku ajar (jika ada)/diktat kuliah/materi dari sumber lain


2. Alat tulis
3. Kertas Buram
4. Lembar jawaban
5. Lembar penilaian (disiapkan oleh asisten)
6. Komputer yang sudah di-install Android Studio & Emulator didalamnya
7. Android Smartphone (Jika tidak menginstall emulator)

Materi Pokok
Praktikum ini mengasumsikan bahwa praktikan telah mempelajari materi tentang Menu
pada android. Agar praktikan dapat mencapai tujuan dalam pertemuan praktikum kelima ini, maka
praktikan harus aktif bertanya dan mencoba mempraktekkan tugas-tugas yang ada dalam praktikum
kelima ini.
40

Proses
Pada bab ini praktikan harus mempelajari bagaimana sebuah Menu digunakan dan bagaimana cara
implementasinya dengan mengerjakan contoh kasus yang mana sangat berhubungan dengan
penggunaan Menu pada aplikasi Android dalam satu project, untuk kasus ini kerjakan dalam waktu
20 menit. Berikan keterangan Anda berupa deskripsi singkat tentang contoh kasus tersebut diatas.
Berikutnya diskusikan kasus Anda dengan teman Anda, kemudian mintalah logika dan saran untuk
menyelesaikan kasus Anda tersebut dengan bahasa program Java. Berdiskusi dan melakukan coding
dilakukan dalam waktu 20 menit. Setelah itu selesaikan contoh kasus pada bagian aktifitas dalam
waktu 20 menit secara mandiri. Lanjutkan praktikum Anda dengan menyelesaikan soal pada bagian
latihan dengan batasan waktu selama 20 menit. Bagian terakhir adalah tugas, yaitu project yang harus
dikerjakan dirumah dan wajib dikumpulkan pada pertemuan berikutnya.

Aktivitas
1. Mahasiswa membaca buku ajar (jika ada)/ diktat kuliah/materi dari sumber lain tentang Menu
(Navigation Drawer) sebagai materi bab kelima. Temukan bagian penting dalam topik Menu
(Navigation Drawer) ini, kemudian tulis sebagai ringkasan hasil belajar.
2. Mahasiswa berdiskusi tentang bagaimana cara membuat dan menggunakan Menu (Navigation
Drawer) didalam sebuah projek android studio. Sebagai bahan diskusi, ikutilah langkah-langkah
di bawah ini:
● Buat projek baru pada Android Studio
● Saat memilih template, jangan pilih empty activity, tetapi pilihlah Navigation Drawer
● Klik finish, dan semua layout dan class .java akan dibentuk secara otomatis.
● Siapkan juga 1 empty activity dan beri nama “Satu”.
● Setelah selesai menyiapkan semuanya, buka class MainActivity.java dan sesuaikan kodenya
menjadi seperti berikut

MainActivity.java

import android.content.Intent;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.view.Menu;

import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.google.android.material.navigation.NavigationView;

import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.core.view.GravityCompat;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

public class MainActivity extends AppCompatActivity


implements NavigationView.OnNavigationItemSelectedListener {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
41

setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action",
Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
});
DrawerLayout drawer = findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView =
(NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
}

@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_camera) {
Intent intentku = new Intent(MainActivity
.this,Satu.class);
startActivity(intentku);
} else if (id == R.id.nav_gallery) {
} else if (id == R.id.nav_slideshow) {
42

} else if (id == R.id.nav_manage) {


} else if (id == R.id.nav_share) {
} else if (id == R.id.nav_send) {
}
DrawerLayout drawer = (DrawerLayout)
findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
}

● Selanjutnya, buka layout activity_satu.xml dan seusaikan kodenya

activity_satu.xml

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="15dip"
android:text="INI LAYOUT FOTO"
android:textSize="18dip" />
</LinearLayout>

● Lalu buka class Satu.java dan sesuaikan kodenya juga

Satu.java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;

public class Satu extends AppCompatActivity {

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

● Untuk mengganti nama dan icon menu navigation drawer, edit pada activity_main_drawer
yang terdapat pada folder res/menu/ sebagai berikut

activity_main_drawer.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
tools:showIn="navigation_view">
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_camera"
android:icon="@drawable/ic_menu_camera"
android:title="Import" />
<item
43

android:id="@+id/nav_gallery"
android:icon="@drawable/ic_menu_gallery"
android:title="Gallery" />
<item
android:id="@+id/nav_slideshow"
android:icon="@drawable/ic_menu_slideshow"
android:title="Slideshow" />
<item
android:id="@+id/nav_manage"
android:icon="@drawable/ic_menu_manage"
android:title="Tools" />
</group>
<item android:title="Communicate">
<menu>
<item
android:id="@+id/nav_share"
android:icon="@drawable/ic_menu_share"
android:title="Share" />
<item
android:id="@+id/nav_send"
android:icon="@drawable/ic_menu_send"
android:title="Send" />
</menu>
</item>
</menu>

● Jalankan projek dan hasilnya akan seperti berikut


44

Latihan
Lengkapi dan kembangkan aplikasi yang sudah dibuat pada aktivitas dengan menambahkan intent
di setiap menu yang nanti akan mengarahkan user ke layout baru sesuai dengan menu yang dipilih!

Penutup
Tugas
Buatlah sebuah tampilan menu yang menerapkannavigation drawer. Pada tiap menu yang di klik
harus mengarah ke intent baru (seperti pada contoh modul)

Contoh Pilihan menu (pilih salah satu)

1. Menu Aplikasi data mahasiswa


2. Menu Info Kuliner
3. Menu Info Wisata
4. Menu Info Game
5. Menu Info Katalog produk
6. Menu Info Olahraga
7. Menu Info Transportasi
8. Menu Info Entertainment.
45

Modul

6
Location Based Service
Tujuan

Praktikan diharapkan dapat menggunakan Android Studio untuk membuat program sederhana pada
smartphone/ emulator. Di akhir praktikum ini, praktikan diharapkan dapat:

● Mahasiswa mampu memahami Location Based Service

● Mahasiswa mampu menerapkan Location Based Service pada Android Studio

Persiapan
1. Buku ajar (jika ada)/diktat kuliah/materi dari sumber lain
2. Alat tulis
3. Kertas Buram
4. Lembar jawaban
5. Lembar penilaian (disiapkan oleh asisten)
6. Komputer yang sudah di-install Android Studio & Emulator didalamnya
7. Android Smartphone (Jika tidak menginstall emulator)

Materi Pokok
Praktikum ini mengasumsikan bahwa praktikan telah mempelajari materi tentang Location Based
Service. Agar praktikan dapat mencapai tujuan dalam pertemuan praktikum keenam ini, mahasiswa
harus aktif bertanya dan mencoba mempraktekkan tugas dan latihan dalam praktikum array satu
dimensi ini.
46

Proses
Pada bab ini praktikan harus menerapkan Location Based Service seperti MapBox ke dalam project-
project yang akan dibuat. Pertama bacalah dulu materi tentang MapBox selama kira-kira 10 menit.
Berikan contoh implementasi dari sebuah aplikasi LBS lalu berikutnya berdiskusilah dengan teman
Anda tentang materi yang sudah Anda pelajari tadi, diskusi dilakukan selama 15 menit. Kasus
pertama sebagai latihan dikerjakan dalam waktu 20 menit. Lanjutkan praktikum Anda dengan
menyelesaikan soal pada bagian latihan dengan batasan waktu selama 20 menit. Bagian terakhir
adalah tugas, yaitu project yang harus dikerjakan di rumah dan wajib dikumpulkan pada pertemuan
berikutnya.

Aktivitas
1. Mahasiswa membaca buku ajar (jika ada)/ diktat kuliah/materi dari sumber lain tentang
Location Based Service sebagai materi bab keenam. Temukan bagian penting dalam topik
Location Based Service ini, kemudian tulis sebagai ringkasan hasil belajar.

2. Mahasiswa berdiskusi tentang bagaimana cara membuat program Location Based Service
menggunakan Android Studio. Sebagai bahan diskusi, ikutilah langkah-langkah di bawah ini:

LBS Latitude dan Longitude

● Buat projek baru pada Android Studio


● Lalu pertama, tambahkan dependency baru pada app/build.gradle setelah itu Sync Gradle.

Dependency baru

implementation 'com.google.android.gms:play-services-location:18.0.0'
implementation 'com.google.android.gms:play-services-maps:17.0.0'

● Kedua, tambahkan beberapa permission di AndroidManifest.xml seperti berikut dan


lakukan Sync Gradle.

Permissions :

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />


<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

● Sekarang buka layout activity_main.xml dan sesuaikan kodenya menjadi seperti ini

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>


<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/latitude"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
47

android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="Latitude:"
android:textSize="18sp" />
<TextView
android:id="@+id/latitude_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/latitude"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/latitude"
android:textSize="16sp" />
<TextView
android:id="@+id/longitude"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="Longitude:"
android:layout_marginTop="24dp"
android:textSize="18sp" />
<TextView
android:id="@+id/longitude_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/longitude"
android:layout_marginLeft="10dp"
android:layout_toRightOf="@+id/longitude"
android:textSize="16sp"/>
</RelativeLayout>

● Buka class MainActivity.java dan sesuaikan juga kodenya menjadi seperti ini

MainActivity.java
package com.elreginaldcaesarosan.latihanpertemuan6;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.model.LatLng;

public class MainActivity extends AppCompatActivity implements


GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
com.google.android.gms.location.LocationListener {

private static final String TAG = "MainActivity";


48

private TextView mLatitudeTextView;


private TextView mLongitudeTextView;
private GoogleApiClient mGoogleApiClient;
private Location mLocation;
private LocationManager mLocationManager;
private LocationRequest mLocationRequest;
private com.google.android.gms.location.LocationListener listener;
private long UPDATE_INTERVAL = 2 * 1000; /* 10 secs */
private long FASTEST_INTERVAL = 2000; /* 2 sec */
private LocationManager locationManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLatitudeTextView = findViewById((R.id.latitude_textview));
mLongitudeTextView = findViewById((R.id.longitude_textview));
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mLocationManager = (LocationManager)this
.getSystemService(Context.LOCATION_SERVICE);
checkLocation(); //check whether location service is enable or not in your phone
}

@Override
public void onConnected(Bundle bundle) {
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
startLocationUpdates();
mLocation = LocationServices.FusedLocationApi
.getLastLocation(mGoogleApiClient);
if(mLocation == null){
startLocationUpdates();
}
if (mLocation != null) {
// mLatitudeTextView.setText(String.valueOf(mLocation.getLatitude()));
//mLongitudeTextView.setText(String.valueOf(mLocation.getLongitude()));
} else {
Toast.makeText(this, "Location not Detected",
Toast.LENGTH_SHORT).show();
}
}

@Override
public void onConnectionSuspended(int i) {
Log.i(TAG, "Connection Suspended");
mGoogleApiClient.connect();
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.i(TAG, "Connection failed. Error: "
+ connectionResult.getErrorCode());
}
@Override
protected void onStart() {
super.onStart();
if (mGoogleApiClient != null) {
49

mGoogleApiClient.connect();
}
}
@Override
protected void onStop() {
super.onStop();
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}

protected void startLocationUpdates() {


// Create the location request
mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(UPDATE_INTERVAL)
.setFastestInterval(FASTEST_INTERVAL);
// Request location updates
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,
mLocationRequest, this);
Log.d("reque", "--->>>>");
}

@Override
public void onLocationChanged(Location location) {
String msg = "Updated Location: " +
Double.toString(location.getLatitude()) + "," +
Double.toString(location.getLongitude());
mLatitudeTextView.setText(String.valueOf(location.getLatitude()));
mLongitudeTextView.setText(String.valueOf(location.getLongitude() ));
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
// You can now create a LatLng Object for use with maps
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
}
private boolean checkLocation() {
if(!isLocationEnabled())
showAlert();
return isLocationEnabled();
}
private void showAlert() {
final AlertDialog.Builder dialog = new AlertDialog.Builder(this);
dialog.setTitle("Enable Location")
.setMessage("Your Locations Settings is set to 'Off'.\nPlease Enable Location to " +
"use this app")
.setPositiveButton("Location Settings", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface paramDialogInterface, int paramInt) {
Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(myIntent);
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface paramDialogInterface, int paramInt) {
}
});
dialog.show();
}
50

private boolean isLocationEnabled() {


locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) ||
locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
}
}

● Jalankan projek aplikasi dan hasilnya akan menjadi seperti ini


51

LBS Menggunakan MapBox

● Buat projek baru di Android Studio


● Lalu pertama buatlah sebuah akun di MapBox (mapbox.com) untuk dapat mengakses
Default Public Token.

● Copy dan simpan token tersebut pada notepad atau aplikasi lainnya.
● Tambahkan dependency baru pada app/gradle yaitu

Dependency baru:

//Mapbox dependencies
implementation 'com.mapbox.mapboxsdk:mapbox-android-sdk:8.5.1'
implementation 'com.mapbox.mapboxsdk:mapbox-android-plugin-locationlayer:0.5.0'

● Tambahkan juga permissions baru didalam AndroidManifest.xml

Permissions baru:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>

● Buka layout activity_main.xml dan sesuaikan kodenya menjadi seperti berikut

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:mapbox="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=".MainActivity">

<com.mapbox.mapboxsdk.maps.MapView
52

android:id="@+id/mapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>

</androidx.constraintlayout.widget.ConstraintLayout>

● Buka file strings.xml pada folder res/values/ dimana kita akan memasukkan Default Public
Token MapBox yang sudah kita copy sebelumnya.
Sesuaikan kodenya menjadi seperti contoh berikut,

strings.xml

<resources>
<string name="app_name">Latihan Pertemuan 6_2</string>
<string
name="mapbox_access_token">pk.eyJ1IjoidmVsbGlzeW8iLCJhIjoiY2ttNGhqdmt5MDRsNjJ2cnRtd3
MycjB5cyJ9.a0e5Or1vkizrT5XRDmPJQQ</string>
</resources>

● Lalu buka class MainActivity dan sesuaikan juga kodenya menjadi seperti berikut

MainActivity.java

package com.elreginaldcaesarosan.latihanpertemuan6_2;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.PersistableBundle;

import com.mapbox.mapboxsdk.Mapbox;
import com.mapbox.mapboxsdk.maps.MapView;
import com.mapbox.mapboxsdk.maps.MapboxMap;
import com.mapbox.mapboxsdk.maps.OnMapReadyCallback;
import com.mapbox.mapboxsdk.maps.Style;

public class MainActivity extends AppCompatActivity {

private MapView mapView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Mapbox.getInstance(this, getString(R.string.mapbox_access_token));
setContentView(R.layout.activity_main);
mapView = (MapView) findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);
mapView.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(@NonNull MapboxMap mapboxMap) {

mapboxMap.setStyle(Style.MAPBOX_STREETS, new Style.OnStyleLoaded() {


@Override
public void onStyleLoaded(@NonNull Style style) {
// Map is set up and the style has loaded.
// Now you can add data or make other map adjustments

}
53

});
}
});
}

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

@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}

@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}

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

@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}

@Override
public void onLowMemory() {
super.onLowMemory();
mapView.onLowMemory();
}

@Override
protected void onDestroy() {
super.onDestroy();
mapView.onDestroy();
}
}
54

● Setelah semuanya sudah disesuaikan, jalankan projek aplikasi dan hasilnya akan menjadi
seperti ini

Latihan
Kembangkan aplikasi LBS Mapbox yang sudah dibuat di aktivitas dengan menambahkan "Markers"
didalam aplikasi.

Penutup
Tugas
Buatlah sebuah aplikasi yang menerapkan MapBox didalamnya dan modifikasi aplikasi tersebut
dengan mengimplementasikan berbagai macam style yang telah disediakan oleh MapBox, contoh :

1. Font-Style
2. Street-Style
3. Markers, dll
55

Modul

7
Database Internal
Tujuan
Praktikan diharapkan dapat menggunakan Android Studio untuk membuat program sederhana pada
smartphone/ emulator. Di akhir praktikum ini, praktikan diharapkan:

• Membuat koneksi database pada Android Studio


• Menerapkan koneksi database external pada Android Studio

Persiapan
1. Buku ajar (jika ada)/diktat kuliah/materi dari sumber lain
2. Alat tulis
3. Kertas Buram
4. Lembar jawaban
5. Lembar penilaian (disiapkan oleh asisten)
6. Komputer yang sudah di-install Android Studio & Emulator didalamnya
7. Android Smartphone (Jika tidak menginstall emulator)

Materi Pokok
Praktikum ini mengasumsikan bahwa praktikan telah mempelajari materi tentang Implementasi
Database Internal pada android. Praktikan juga diharapkan sudah dapat menerapkan penggunaan
menu bar, menu item, dan toolbar untuk mendukung implementasi tersebut. Agar praktikan dapat
mencapai tujuan dalam pertemuan praktikum ketujuh ini, maka praktikan harus aktif bertanya dan
mencoba mempraktekkan tugas-tugas yang ada dalam praktikum ketujuh ini.
56

Proses
Pertama bacalah dulu materi tentang Database Internal pada android selama kira-kira 10 menit.
Berikutnya berdiskusilah dengan teman Anda tentang Database Internal seperti SQLite, diskusi
dilakukan selama 20 menit. Kasus pertama sebagai latihan dikerjakan dalam waktu 30 menit.
Lanjutkan praktikum Anda dengan menyelesaikan soal pada bagian latihan dengan batasan waktu
selama 30 menit. Bagian terakhir adalah tugas, yaitu project yang harus dikerjakan di rumah dan wajib
dikumpulkan pada pertemuan berikutnya.

Aktivitas
1. Praktikan membaca buku ajar (jika ada)/ diktat kuliah/materi dari sumber lain tentang Database
Internal Android sebagai materi bab ketujuh. Temukan bagian penting dalam topik ini,
kemudian tulis sebagai ringkasan hasil belajar.

2. Praktikan berdiskusi tentang Database Internal Android serta menerapkannya dalam sebuah
aplikasi berbasis android.

Login Shared Preferences

● Buat projek baru pada Android Studio


● Buka file strings.xml dan sesuaikan kodenya seperti berikut

Strings.xml

<resources>
<string name="app_name">Latihan Pertemuan 7</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello world!</string>
<string name="Username">Username</string>
<string name="Password">Password</string>
<string name="Signin">Sign In</string>
<string name="Login">Login</string>
<string name="logout">Logout</string>
<string name="title_activity_welcome">Welcome</string>
<string name="exit">Exit without logout</string>
</resources>

● Buat Empty Activity baru bernama Welcome.


● Buka layout activity_main.xml dan sesuaikan kodenya menjadi seperti berikut

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>


<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<EditText
android:id="@+id/editText2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
57

android:layout_below="@+id/textView2"
android:layout_alignRight="@+id/editText1"
android:ems="10"
android:inputType="textPassword"/>

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="52dp"
android:text="@string/Username"
android:textAppearance="?android:attr/textAppearanceMedium" />

<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/textView1"
android:layout_alignParentRight="true"
android:layout_marginTop="27dp"
android:layout_marginRight="16dp"
android:ems="10">
<requestFocus />
</EditText>

<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editText1"
android:layout_alignRight="@+id/textView1"
android:text="@string/Password"
android:textAppearance="?android:attr/textAppearanceMedium" />

<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/editText1"
android:layout_centerHorizontal="true"
android:layout_marginBottom="22dp"
android:text="@string/Signin"
android:textAppearance="?android:attr/textAppearanceMedium" />

<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editText2"
android:layout_centerHorizontal="true"
android:layout_marginTop="45dp"
android:onClick="login"
android:text="@string/Login" />
</RelativeLayout>

● Buka layout activity_welcome.xml dan sesuaikan juga kodenya


58

activity_welcome.xml

<?xml version="1.0" encoding="utf-8"?>


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Welcome">

<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="146dp"
android:onClick="logout"
android:text="@string/logout" />

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignStart="@+id/button1"
android:layout_alignParentTop="true"
android:layout_marginTop="64dp"
android:text="@string/title_activity_welcome"
android:textAppearance="?android:attr/textAppearanceLarge" />

<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/button1"
android:layout_centerHorizontal="true"
android:layout_marginTop="43dp"
android:onClick="exit"
android:text="@string/exit" />

</RelativeLayout>

● Selanjutnya, buka class Welcome.java dan ubah kodenya menjadi seperti berikut

Welcome.java

import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;

public class Welcome extends AppCompatActivity {

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

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action
59

// bar if it is present.
getMenuInflater().inflate(R.menu.welcome, menu);
return true;
}
public void logout(View view){
SharedPreferences sharedpreferences = getSharedPreferences
(MainActivity.MyPREFERENCES, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.clear();
editor.commit();
moveTaskToBack(true);
Welcome.this.finish();
}
public void exit(View view){
moveTaskToBack(true);
Welcome.this.finish();
}
}

● Setelah itu buka class MainActivity.java dan sesuaikan juga kodenya

MainActivity.java

import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

private EditText username,password;


public static final String MyPREFERENCES = "MyPrefs" ;
public static final String name = "nameKey";
public static final String pass = "passwordKey";
SharedPreferences sharedpreferences;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
username = (EditText)findViewById(R.id.editText1);
password = (EditText)findViewById(R.id.editText2);
}
@Override
protected void onResume() {
sharedpreferences=getSharedPreferences(MyPREFERENCES,
Context.MODE_PRIVATE);
if (sharedpreferences.contains(name))
{
if(sharedpreferences.contains(pass)){
Intent i = new Intent(this, Welcome.class);
startActivity(i);
}
}
super.onResume();
}
public void login(View view){
SharedPreferences.Editor editor = sharedpreferences.edit();
String u = username.getText().toString();
60

String p = password.getText().toString();
editor.putString(name, u);
editor.putString(pass, p);
editor.commit();
Intent i = new Intent(this, Welcome.class);
startActivity(i);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.welcome, menu);
return true;
}
}

● Sekarang jalankan projek jika sudah disesuaikan semua kodenya dan hasilnya akan menjadi
seperti berikut

Login SQLite

● Buat projek baru pada android studio


● Tambahkan Empty Activity baru bernama Admin
● Isi kode pada activity_main.xml seperti berikut ini

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginTop="21dp"
android:text="Username" />

<EditText
android:id="@+id/editText1"
61

android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/textView1"
android:layout_alignLeft="@+id/textView1"
android:layout_marginTop="10dp">
<requestFocus />
</EditText>

<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editText1"
android:layout_alignLeft="@+id/editText1"
android:layout_marginTop="21dp"
android:text="Password" />

<EditText
android:id="@+id/editText2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/textView2"
android:layout_alignLeft="@+id/textView2"
android:layout_marginTop="10dp"
android:inputType="textPassword" />

<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editText2"
android:layout_alignLeft="@+id/editText2"
android:layout_marginTop="31dp"
android:text="Login" />

<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/button1"
android:layout_alignBottom="@+id/button1"
android:layout_toRightOf="@+id/button1"
android:text="Register" />

<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/button2"
android:layout_alignBottom="@+id/button2"
android:layout_toRightOf="@+id/button2"
android:text="Keluar" />

</RelativeLayout>

● Buka layout activity_admin.xml dan sesuaikan kodenya


62

activity_admin.xml

<?xml version="1.0" encoding="utf-8"?>


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Admin">

<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="Logout" />

<RatingBar
android:id="@+id/ratingBar1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/ratingBar1"
android:layout_centerHorizontal="true"
android:layout_marginBottom="16dp"
android:text="Selamat Data Pada Halaman Administrasi" />

</RelativeLayout>

● Buatlah folder resources baru didalam /res bernama menu, dan tambahkan 2 file .xml
didalamnya yaitu,

main.xml

<?xml version="1.0" encoding="utf-8"?>


<menu xmlns:android="http://schemas.android.com/apk/res/android">

</menu>

admin.xml

<?xml version="1.0" encoding="utf-8"?>


<menu xmlns:android="http://schemas.android.com/apk/res/android">

</menu>

● Lalu buat class baru bernama DBUserAdapter, dan isikan kodenya seperti berikut
63

DBUserAdapter.java

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBUserAdapter {


public static final String KEY_ROWID = "_id";
public static final String KEY_USERNAME= "username";
public static final String KEY_PASSWORD = "password";
private static final String TAG = "DBAdapter";
private static final String DATABASE_NAME = "users.db";
private static final String DATABASE_TABLE = "users";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE =
"create table users (_id integer primary key autoincrement, "
+ "username text not null, "
+ "password text not null);";
private Context context = null;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;

public DBUserAdapter(Context ctx)


{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper {


DatabaseHelper(Context context) {
super(context, DATABASE_NAME,
null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(DATABASE_CREATE);
db.execSQL("insert into users values ('1','saya','saya');");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.w(TAG, "Upgrading database from version " + oldVersion
+ " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS users");
onCreate(db);
}
}

public void open() throws SQLException {


db = DBHelper.getWritableDatabase();
}

public void close() {


DBHelper.close();
}

public long AddUser(String username, String password)


{
ContentValues initialValues = new ContentValues();
64

initialValues.put(KEY_USERNAME, username);
initialValues.put(KEY_PASSWORD, password);
return db.insert(DATABASE_TABLE, null, initialValues);
}

public boolean Register(String username, String password) throws SQLException {


Cursor mCursor = db.rawQuery("insert into " + DATABASE_TABLE +
"(username, password) values (?,?)",
new String[]{username,password});
if (mCursor != null) {
if(mCursor.getCount() > 0)
{
return true;
}
}
return false;
}

public boolean Login(String username, String password) throws SQLException {


Cursor mCursor = db.rawQuery("SELECT * FROM "
+ DATABASE_TABLE + " WHERE username=? AND password=?"
, new String[]{username,password});
if (mCursor != null) {
if(mCursor.getCount() > 0)
{
return true;
}
}
return false;
}
}

● Buka class Admin.java dan sesuaikan kodenya

Admin.java

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;

public class Admin extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_admin);
Button btnLogout=(Button)findViewById(R.id.button1);
btnLogout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent keli = new Intent(Admin.this,
MainActivity.class);
startActivity(keli);
finish();
}
});
}

@Override
65

public boolean onCreateOptionsMenu(Menu menu) {


// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.admin, menu);
return true;
}
}

● Sekarang buka class MainActivity.java dan sesuaikan juga kodenya

MainActivity.java

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

final EditText txtUserName = (EditText) findViewById(R.id.editText1);


final EditText txtPassword = (EditText) findViewById(R.id.editText2);
Button btnLogin = (Button) findViewById(R.id.button1);
Button btnRegister = (Button) findViewById(R.id.button2);
Button btnKeluar = (Button) findViewById(R.id.button3);
btnKeluar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
finish();
}
});
btnRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
String username = txtUserName.getText().toString();
String password = txtPassword.getText().toString();
try {
DBUserAdapter dbaUser = new DBUserAdapter(MainActivity.this);
dbaUser.open();
if (dbaUser.Register(username, password)) {
Toast.makeText(MainActivity.this
, "Create Data", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MainActivity.this
, "Tambah Username/Password"
, Toast.LENGTH_LONG).show();
}
dbaUser.close();
} catch (Exception e) {
// TODO: handle exception
Toast.makeText(MainActivity.this, e.getMessage()
, Toast.LENGTH_LONG).show();
}
}
66

});

btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String username = txtUserName.getText().toString();
String password = txtPassword.getText().toString();
try {
if (username.length() > 0 && password.length() > 0) {
DBUserAdapter dbUser = new DBUserAdapter(MainActivity.this);
dbUser.open();
if (dbUser.Login(username, password)) {
Toast.makeText(MainActivity.this
, "Successfully Logged In"
, Toast.LENGTH_LONG).show();
Intent kela = new Intent(MainActivity.this
, Admin.class);
startActivity(kela);
} else {
Toast.makeText(MainActivity.this
, "Invalid Username/Password"
, Toast.LENGTH_LONG).show();
}
dbUser.close();
}
} catch (Exception e) {
Toast.makeText(MainActivity.this, e.getMessage()
, Toast.LENGTH_LONG).show();
}
}
});
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}

● Sekarang jalankan projeknya dan hasilnya akan menjadi seperti ini


67

Latihan
Kembangkan aplikasi yang sudah dibuat pada aktifitas, dengan menggabungkan fungsi dari
SharedPreferences dengan database SQLite!

Penutup
Tugas
Buatlah sebuah aplikasi CRUD (Tema bebas) dengan mengimplementasikan CRUD didalamnya
dengan syarat harus ada fitur login dan register!
68

Modul

8
Database External
Tujuan
Praktikan diharapkan dapat menggunakan Android Studio untuk membuat program sederhana pada
smartphone/ emulator. Di akhir praktikum ini, praktikan diharapkan dapat:

• Membuat koneksi database pada Android Studio


• Menerapkan koneksi database external pada Android Studio

Persiapan
1. Buku ajar (jika ada)/diktat kuliah/materi dari sumber lain
2. Alat tulis
3. Kertas Buram
4. Lembar jawaban
5. Lembar penilaian (disiapkan oleh asisten)
6. Komputer yang sudah di-install Android Studio & Emulator didalamnya
7. Android Smartphone (Jika tidak menginstall emulator)

Materi Pokok
Praktikum ini mengasumsikan bahwa praktikan telah mempelajari materi tentang Database
External pada Android. Praktikan juga diharapkan sudah memahami materi tentang CRUD database
dengan Java. Agar praktikan dapat mencapai tujuan dalam pertemuan praktikum kedelapan ini,
praktikan harus aktif melihat-lihat contoh program, bertanya, dan mencoba mempraktekkan tugas
dan latihan dalam praktikum delapan yang berisi materi tentang Database External ini.
69

Proses
Langkah pertama bacalah dulu materi tentang implementasi database MySQL selama 10
menit. Kemudian catatlah kegunaan XAMPP dalam mendukung implementasi tersebut dalam waktu
5 menit. Sebagai percobaan buatlah database sederhana untuk menampilkan nama, NRP, dan kelas
dengan menggunakan waktu tidak lebih dari 10 menit. Setelah itu lanjutkan dengan membuat project
baru untuk mencoba menghubungkan koneksi database ke perangkat android anda. Diskusikan
selama 15 menit tentang cara kerja project yang sudah Anda buat, terutama tentang program dan cara
kerjanya. Berikutnya kerjakan projek aplikasi pada aktifitas (kerjakan dan diskusikan dengan teman
Anda dalam 25 menit). Kerjakan latihan dalam waktu 25 menit.

Aktivitas
1. Praktikan membaca buku ajar (jika ada)/ diktat kuliah/materi dari sumber lain tentang Database
External Android sebagai materi bab kedelapan. Temukan bagian penting dalam topik ini,
kemudian tulis sebagai ringkasan hasil belajar.

2. Praktikan berdiskusi tentang Database External Android serta menerapkannya dalam sebuah
program aplikasi android.

● Install aplikasi XAMPP dan jalankan service Apache dan MySQL

● Buka http://localhost/phpmyadmin/ dimana kita akan menyiapkan database kita terlebih


dahulu.
● Buat database bernama “users_database” dan buat tabel bernama “users_table” dan
sesuaikan field nya menjadi seperti berikut.
70

● Buat sebuah user dengan data sebagai berikut.

Karena kita menggunakan auto increment pada field “ID”, maka saat pengisian data, field
“ID” tidak perlu di-isi.

● Setelah database siap, sekarang kita siapkan 2 file .php yaitu,


1. conn.php
2. login.php

conn.php

<?php

$db_name = "users_database";

$username = "root";

$password = "";

$servername = "localhost";

$conn = mysqli_connect($servername ,$username ,$password ,$db_name );

mysqli_set_charset($conn ,"utf-8");

?>

login.php

<?php

require "conn.php";

$email = $_POST["email"];

$password = $_POST["psw"];

$isValidEmail = filter_var($email, FILTER_VALIDATE_EMAIL);

if($conn){

if( $isValidEmail === false){

echo "This Email is not valid";

}else{
71

$sqlCheckEmail = "SELECT * FROM users_table WHERE email LIKE


'$email'";

$usernameQuery = mysqli_query($conn,$sqlCheckEmail);

if(mysqli_num_rows($usernameQuery) > 0){

$sqlLogin = "SELECT * FROM users_table WHERE email LIKE


'$email' AND password LIKE '$password'";

$loginQuery = mysqli_query($conn,$sqlLogin);

if(mysqli_num_rows($loginQuery) > 0){

echo "Login Success";

}else{

echo "Wrong Password";

}else{

echo "This Email is not registered";

}else{

echo "Connection Error";

} ?>

Setelah itu simpan 2 file .php tersebut di dalam didalam folder C:\xampp\htdocs\

● Buka file app/gradle dan tambahkan dependency berikut


Dependency baru:

implementation 'com.android.volley:volley:1.2.0'
implementation 'com.rengwuxian.materialedittext:library:2.1.4'

● Kemudian buka AndroidManifest.xml dan tambahkan beberapa permissions berikut


Permissions baru:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

● Sekarang buka colors.xml yang ada didalam folder res/values/ dan sesuaikan kodenya
seperti berikut ini
colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
72

<color name="white">#FFFFFFFF</color>
<color name="colorPrimary">#000000</color>
<color name="colorPrimaryDark">#000000</color>
<color name="colorAccent">#000000</color>
</resources>

● Lalu buka themes.xml yang ada pada folder res/values/themes/ dan sesuaikan kodenya
seperti berikut
themes.xml
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.LatihanDbExternal"
parent="Theme.MaterialComponents.DayNight.DarkActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor"
tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>

<style name="menustyle"
parent="Theme.AppCompat.Light">

<item name="android:background">@android:color/white</item>
</style>
</resources>

● Setelah itu buka file strings.xml pada folder res/values/ dan tambahkan kode berikut
didalamnya.
strings.xml
<string name="prefStatus">loggedin</string>

● Sekarang buat empty activity dan beri nama AppStartActivity


● Lalu buka layout activity_app_start.xml yang telah degenerate secara otomatis dan
sesuaikan kodenya seperti berikut
activity_app_start.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".AppStartActivity"
android:orientation="vertical"
>
<include
android:id="@+id/toolbar"
layout="@layout/bar_layout"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Welcome to App Start Activity"
android:textColor="@color/colorPrimaryDark"
73

android:layout_gravity="center_vertical"
android:gravity="center"
android:layout_marginTop="200dp"
android:textSize="40sp"
android:textStyle="bold"/>

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Log out"
android:textAllCaps="false"
android:id="@+id/logout"
android:textColor="@android:color/white"
android:background="@color/colorPrimaryDark"
android:layout_marginTop="50dp"/>

</LinearLayout>

● Buka AppStartActivity.java dan sesuaikan kodenya seperti ini


AppStartActivity.java
import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class AppStartActivity extends AppCompatActivity {


Button logout;
SharedPreferences sharedPreferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_app_start);
logout = findViewById(R.id.logout);
sharedPreferences = getSharedPreferences("UserInfo",
Context.MODE_PRIVATE);
logout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

SharedPreferences.Editor editor = sharedPreferences.edit();


editor.putString(getResources()
.getString(R.string.prefStatus),"logout");
editor.apply();
startActivity(new Intent(AppStartActivity
.this,MainActivity.class));
finish();
}
});
}
}

● Setelah itu, buat class baru bernama MySingleton.java dan isikan kodenya seperti berikut
MySingleton.java
import android.content.Context;
import com.android.volley.Cache;
import com.android.volley.Network;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
74

import com.android.volley.toolbox.BasicNetwork;
import com.android.volley.toolbox.DiskBasedCache;
import com.android.volley.toolbox.HurlStack;
import com.android.volley.toolbox.Volley;

public class MySingleton {


private static MySingleton mInstance;
private RequestQueue mRequestQueue;
private Context mCtx;

public MySingleton(Context mCtx) {


this.mCtx = mCtx;
mRequestQueue = getmRequestQueue();
}

public RequestQueue getmRequestQueue(){


if(mRequestQueue == null){
Cache cache = new DiskBasedCache(mCtx.getCacheDir(),
1024*1024);
Network network = new BasicNetwork(new HurlStack());
mRequestQueue = new RequestQueue(cache,network);
mRequestQueue = Volley
.newRequestQueue(mCtx.getApplicationContext());
}
return mRequestQueue;
}

public static synchronized MySingleton getmInstance(Context context){

if (mInstance == null){
mInstance = new MySingleton(context);
}
return mInstance;
}

public<T> void addToRequestQueue(Request<T> request){


mRequestQueue.add(request);

}
}

● Sekarang buka layout activity_main.xml dan ubah kodenya menjadi seperti ini
activity_main.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"
tools:context=".MainActivity">

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

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="Login"
75

android:textSize="30sp"
android:textStyle="bold"
android:layout_marginTop="10dp"
android:textColor="@color/colorPrimary" />

<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="50dp"
app:met_floatingLabel="normal"
android:background="@android:color/white"
android:hint="Email Address"
android:inputType="textEmailAddress"/>
<com.rengwuxian.materialedittext.MaterialEditText
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
app:met_floatingLabel="normal"
android:layout_marginTop="10dp"
android:background="@android:color/white"
android:hint="Password"
android:inputType="textPassword"/>

<androidx.appcompat.widget.AppCompatCheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Keep Me Logged In"
android:buttonTint="@color/colorPrimaryDark"
android:textColor="@color/colorPrimaryDark"
android:layout_gravity="center"
android:id="@+id/checkbox"
android:layout_marginTop="10dp"/>

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="20dp"
android:text="Login"
android:textColor="@android:color/white"
android:textAllCaps="false"
android:id="@+id/login"
android:background="@color/colorPrimaryDark"/>

</LinearLayout>

</RelativeLayout>

● Lalu buka class MainActivity.java dan sesuaikan kodenya menjadi seperti berikut
76

MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.rengwuxian.materialedittext.MaterialEditText;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class MainActivity extends AppCompatActivity {


MaterialEditText email,password;
Button login;
CheckBox checkedStatus;

SharedPreferences sharedPreferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
email = findViewById(R.id.email);
password = findViewById(R.id.password);
checkedStatus = findViewById(R.id.checkbox);
sharedPreferences = getSharedPreferences("UserInfo",
Context.MODE_PRIVATE);
String loginStatus = sharedPreferences
.getString(getResources().getString(R.string.prefStatus),"");
if (loginStatus.equals("loggedin")){
startActivity(new Intent(MainActivity.
this,AppStartActivity.class));
finish();
}

login = findViewById(R.id.login);
login.setOnClickListener(v -> {
String tex_email = Objects
.requireNonNull(email.getText()).toString();
String tex_password = Objects
.requireNonNull(password.getText()).toString();
if (TextUtils.isEmpty(tex_email) || TextUtils.isEmpty(tex_password)){
Toast.makeText(MainActivity.this,
"All Fields Required", Toast.LENGTH_SHORT).show();
}
else{
login(tex_email,tex_password);
}
});
}

private void login(final String email, final String password){


final ProgressDialog progressDialog = new ProgressDialog(
MainActivity.this);
progressDialog.setTitle("Registering your account");
progressDialog.setCancelable(false);
progressDialog.setCanceledOnTouchOutside(false);
77

progressDialog.setIndeterminate(false);
progressDialog.show();
String uRl = "http://192.168.0.7/login.php";
StringRequest request = new StringRequest(Request.Method.POST,
uRl,
(String response) -> {

if (response.equals("Login Success")){
Toast.makeText(MainActivity.this,
response, Toast.LENGTH_SHORT).show();
SharedPreferences.Editor editor = sharedPreferences.edit();
if (checkedStatus.isChecked()){
editor.putString(getResources()
.getString(R.string.prefStatus),"loggedin");
}
else{
editor.putString(getResources()
.getString(R.string.prefStatus),"loggedout");
}
editor.apply();
startActivity(new Intent(MainActivity
.this,AppStartActivity.class));
progressDialog.dismiss();
finish();
}
else {
Toast.makeText(MainActivity.this,
response, Toast.LENGTH_SHORT).show();
progressDialog.dismiss();
}
}, error -> {
Toast.makeText(MainActivity.this,
error.toString(), Toast.LENGTH_SHORT).show();
progressDialog.dismiss();
}){
@Override
protected Map<String, String> getParams() {
HashMap<String,String> param = new HashMap<>();
param.put("email",email);
param.put("psw",password);
return param;

}
};

request.setRetryPolicy(
new DefaultRetryPolicy(30000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
MySingleton.getmInstance(MainActivity.this).
addToRequestQueue(request);
}
}

Pada bagian variabel String uRl, pastikan untuk mengubah alamat IP menjadi IP dari
komputer kita, jangan memakai http://localhost/.
Lalu jika kita menggunakan android, maka komputer dan perangkat android yang akan
digunakkan harus didalam 1 network yang sama, contoh :
IP Address Komputer:
1. Cek IP Address pada komputer melalui CMD, dan ketikkan “ipconfig”
2. Lalu lihat pada bagian Wireless LAN Adapter Wireless Network Connection, bagian
IPv4 Address.
78

maka String uRl = "http://192.168.0.7/login.php"

3. Hubungkan juga perangkat android ke network yang sama agar bisa terhubung
databasenya.
Contoh IP Address android : " 192.168.0.XX "

● Terakhir, buat sebuah layour bernama bar_layout.xml dan isikan kodenya seperti ini
bar_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimaryDark"
style="@style/Base.ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/menustyle"
android:id="@+id/toolbar">

</androidx.appcompat.widget.Toolbar>
79

● Setelah semua kode telah disesuaikan, jalankan projek aplikasi dan hasilnya
adalah sebagai berikut.

Latihan
Kembangkan aplikasi yang telah dibuat didalam aktivitas dengan menambahkan fitur register user
baru!

Penutup
Tugas
Kembangkan lagi aplikasi yang telah dibuat pada Aktivitas dan Latihan dengan menampilkan
sebuah dashboard setelah melakukan login pada aplikasi tersebut!

Anda mungkin juga menyukai