Ayo-Jek yo-Jek Android Tutorial Android Tutorial Hallo semua di sini kita akan belajar membuat aplikasi Ayo-Jek. Aplikasi Ayo-Jek ini pada dasarnya sama seperti aplikasi ojek online pada umumnya, namun disini kita akan membuat nya lebih sederhana. Disini ada dua aplikasi yang akan kita buat yaitu aplikasi untuk user dan user. user. Tutorial ini bisa anda bagikan kepada teman anda atau siapapun yang ingin belajar membuat aplikasi android. Didalam tutorial ini juga akan saya berikan source codenya secara gratis.
Untuk yang temen - temen yang masih baru sekali dalam androi development saya sarankan untuk membaca beberapa buku dan artikel berikut ini. Pertama anda harus mengerti dengan java dan bisa pelajari dari link berikut ini. 1. Head First Java 2. Introduction to java on Udacity Selanjutnya untuk belajar android anda bisa masuk official training web dari android disini disini.. Bisa juga untuk mengikuti training gratis di udacity
2
Introduction 1. Android Development for beginners 2. Developing Android apps Untuk anda yang ingin membaca buku bisa baca buku ini 1. The Busy Coder's Guide to Android Development 2. Professional Android 4 Application Development Untuk situs yang berbahasa Indonesia bisa buka disini 1. Dicoding Academy 2. Teknorial 3. Gookis Studio
3
1. Persiapan
Persiapan Dalam pembuatan aplikasi Ayo-Jek ini kita menggunakan bahasa pemogramman Java dan untuk IDE nya kita akan menggunakan Android studio. Disini saya tidak akan membuat tutorial untuk installasi android studio dan java. Disini saya menggunakan AndroidStudio AndroidStudio 2.1.1 dan java 8.
Buat project Baru
Buat project baru beri nama projectnya menjadi ayojek. Silahkan buat dengan nama lain supaya terasa bikinan kamu sendiri. Saya asumsikan anda semua sudah paham untuk membuat project baru dan disini saya tidak akan membahas lebih jauh lagi. Untuk sebagai infrmasi juga dalam project ini kita akan menggunakan firebase yang akan kita gunakan sebagai backend service, push notification dan yang lainya. Dalam project ini juga nanti kita akan membuat 2 aplikasi, yaitu untuk aplikasi user dan driver ojeknya. 4
1. Persiapan
5
2. Konfigurasi Firebase
Konfigurasi Firebase Sebelum kita lanjut, kita akan lakukan konfigurasi firebasenya terlebih dahulu. Pertama silahkan temen - temen untuk mendaftar di firebase silahkan daftar disini.
Untuk daftar ke firebase kita bisa gunakan akun google yang kita punya. Selanjutnya kita buat proyek baru di firebase.
6
2. Konfigurasi Firebase
Selanjutnya kita menambahkan aplikasi kita kedalam project firebase yang telah kita buat tadi. Untuk menambahkan aplikasi kedalam project firebasenya kita perlu memasukan dua parameter yaitu parameter package aplikasinya dan Sertifikat penandatanganan debug SHA-1. Untuk mendapatkan sertifikat sha-1 kita bisa cek lewat terminal. Untuk yang menggunakan linux : keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android Dan untuk mac keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android Dan untuk windows keytool -list -v -keystore c:\users\your_user_name.android\debug.keystore -alias androiddebugkey storepass android -keypass android Untuk infornasi lebih banyak lagi temen - temen bisa buka disini. Jika sudah bisa mendapatkan sha-1 silahkan tambahkan ke project firebase
7
2. Konfigurasi Firebase
Setelah itu nanti teman - teman akan dapet file dari firebase googleservices.json. File ini silahkan masukan kedalam folrder app/ dalam project androis kita. Selanjut di dalam project kita AyoJek/ edit file build.gradle masukan code berikut
8
2. Konfigurasi Firebase
buildscript { dependencies { // Add this line classpath 'com.google.gms:google-services:3.0.0' } }
dan untuk di build.gradle yang ada di folder app/ tambahkan code berikut ini apply plugin: 'com.google.gms.google-services' `
9
3. SplashScreen
SplashScreen Sebelum kita lanjut membuat splashscreen kita akan mengubah terlebih dauhulu tema dari aplikasi yang akan kita gunakan di aplikasi kita kali ini. Pada dasarnya untuk mengganti tema aplikasi android yang akan kita perlu mengganti 3 warna di stylesnya yaitu colorPrimay, coloPrimaryDark, dan colorAccent. Untuk memilih wrna tersebut kita bisa coba generate dari web berikut ini. Berikut ini adalah contoh warna dari tema yang saya gunakan. #03A9F4#0288D1#448AFF
Selanjutnya kita akan membuat layout splash screen. Splashscreen sendiri adalah layout yang biasanya pertamakali ditampilkan. Nah langsung saja kita buat Activity baru dalam project kita.
10
3. SplashScreen Kita buat empty activity beri nama SplashScreen atau terserah temen - temen mau di beri nama apa. Kemudian untuk activity_splash_screen.xml seperti berikut ini.
3. SplashScreen Dan untuk tampilanya kira - kira nanti seperti ini.
13
3. SplashScreen
14
3. SplashScreen Kemudian kita tambahkan code berikut ini dalam Class SplashScreen untuk membuat splashscreen ini akan dibuka hanya 3 detik saja. new Handler().postDelayed(new Runnable() {
@Override public void run() { startActivity(new Intent(getApplicationContext(), MainActiv
ity.class)); } }, 3000);
Disini setelah activity splashscreen ini di buka kita membuatnya berpindah ke MainActivity setelah 3 detik.
15
4. Sign dan Signup
Sign dan Signup Selanjutnya kita akan membuat activity Sign atau halaman login.
Untuk acitivity_sign.xml silahkan buat seperti berikut ini.
xmlns:tools="http://schemas.android.com/tools"
Selanjutnya kita akan masuk di codingan dalam SigninActivity . Disini kita akan membuat sistem login dengan services OAuth dari firebase. Untuk service OAuth di firebase sendiri ada bayak disini kita akan menggunakan service oauth yang email dan passwod. Nah untuk itu kita akan mengaktifkan firebase oauth email dan passwordnya.
Selanjutnya setelah kita mengaktifkan oauth email/password kita masuk di coding di android studio lagi dan tambahkan ini dalam file build.gradle. compile 'com.google.firebase:firebase-auth:9.0.0'
Selanjutnya kita tambahkan code berikut ini untuk di SignActivity untuk kita gunakan sebagai action signin dan auth dari firebase oauth
showProgressDialog(); mAuth.signInWithEmailAndPassword(email, password) .addOnCompleteListener(this, new OnCompleteListe
ner() {
@Override public void onComplete(@NonNull Task
ult> task) { Log.d(TAG, "signInWithEmail:onComplete:" + task.isSuccessful()); if (!task.isSuccessful()) { Log.w(TAG, "signInWithEmail", task.g etException());
Toast.makeText(getApplicationContext
(), "Authentication failed.",
Toast.LENGTH_SHORT).show();
}else{ startActivity(new Intent(getApplicat
ionContext(),HomeActivity.class)); }
hideProgressDialog(); } }); } private void validateForm() { if (TextUtils.isEmpty(email.getText())){
email.setError("REQUIRED"); }else if (TextUtils.isEmpty(password.getText())){
password.setError("REQUIRED"); }else {
return; } }
Kemudian untuk signin kita gunakan event onclick
22
4. Sign dan Signup
btn_sign_in.setOnClickListener(this);
@Override public void onClick(View v) { switch (v.getId()){ case R.id.btn_sign_in: signIn(email.getText().toString(), password.getT
ext().toString());
finish();
break; }
Disini kita akan buat jika user sudah pernah login dan belum logout tidak perlu input email dan password dan emal lagi dan langsung kita arahkan ke HomeActivity menggunakan Firebase Oauth. Berikut ini untuk codenya
@Override protected void onStart() {
super.onStart();
auth();
mAuth.addAuthStateListener(authListener); }
Kemudian untuk user yang ingin mendaftar kita arahkan ke activity baru supaya tidak menumpuk di class SignActivity codinganya. Untuk viewnya kita gunakan TextView yang telah kita buat di activity_sign.xml .
23
4. Sign dan Signup Selanjutnya untuk event onclicknya case R.id.txt_sign_up: startActivity(new Intent(getApplicationContext(), SignupActivi ty.class)); break;
SignupActivity Sekarang kita buat activity baru untuk user yang ingin mendaftar. Ok pertama kita buar layoutnya dulu, disini kita buat nama filenya activity_signup.xml .
xmlns:tools="http://schemas.android.com/tools"
Selanjutnya sebelum kita masuk coding untuk signupnya disini kita akan buat Model untuk data - data user yang kita perlukan. Dalam layout diatas kita meminta user untuk mengisi 4 field form Full Name, No.HP, Email dan Password. Kemudian untuk di modelnya kita akan menambahkan 2 data yaitu uid dan fcmId, dimana uid ini adalah unik ID setiap user yang akan kita gunakan sebagai kei untuk melakukan query untuk mendapatkan data user. Dan fcmId akan kita gunakan sebagai push notification yang akan digunakan dalam proses order nantinya. Ok berikut ini untuk class modelnya
30
4. Sign dan Signup
/** * Created by ocittwo on 6/11/16. */ @IgnoreExtraProperties public class User { public String full_name; public String no_hp; public String email; public String uid; public String fcm_id; public User() { } public User(String full_name, String no_hp, String email, St ring uid, String fcm_id) { this.full_name = full_name; this.no_hp = no_hp; this.email = email; this.uid = uid; this.fcm_id = fcm_id; }
@Exclude public Map toMap(){ Map data = new HashMap<>(); data.put("full_name", full_name); data.put("no_hp", no_hp); data.put("email", email); data.put("uid", uid); data.put("fcm_id", fcm_id); return data; }
}
31
4. Sign dan Signup Sekarang kita telah membuat model untuk data yang akan di gunakan untuk menyimpan kedalam firebase database, nah sekarang kita buat class yang akan kita gunakan untuk menyimpan data secara offline disini kita menggunakan SharedPreferences untut menyimpan data profilenya. Berikut ini untuk classnya kita akan berikan nama class nya PreferenceHelper.java. /** * Created by ocittwo on 6/18/16. */ public class PreferenceHelper { private static final String TAG = "PreferenceHelper"; private final Context context; private SharedPreferences sharedpreferences; /** * Instance Helper SharedPreferences * @param context */ public PreferenceHelper(Context context) { this.context = context; sharedpreferences = context.getSharedPreferences(Constan s.DATA_USER, 0); } /** * Save data profile to sharedpreferences * @param full_name * @param no_hp * @param email * @param uid * @param fcm_id */ public void saveDataProfile(String full_name, String no_hp, String email, String uid, String fcm_id){ SharedPreferences.Editor editor = sharedpreferences.edit (); editor.putString(Constans.FULL_NAME, full_name);
editor.apply(); log("Data profile have been saved!"); } /** * Get data profile */ public Map getDataProfile(){ SharedPreferences data = context.getSharedPreferences(Co
4. Sign dan Signup Ok baik sekarang kita akan masuk di class SignupActivity.java kita mulai untuk membuat variable dari beberapa object yang akan kita gunakan untk proses pendaftaran user ini. Berikut ini variable - variable yang kita akan kita gunakan. private static final String TAG = "SignupActivity"; private EditText full_name; private EditText no_hp; private EditText email; private EditText password; private TextView btn_sign_in; private Button btn_sign_up; private String REQUIRED = "REQUIRED"; private FirebaseAuth mAuth; private DatabaseReference mDatabase;
Setelah medefinisikan variable sekarang kita akan meng instance variable variable yang telah kita buat ini.
4. Sign dan Signup Kemudian ketika telah selesai memvalidasi kita akan daftarkan user kedalam firebase auth dan menyimpnyan ke database dan sharedpreference.
/*** * Create account and save to database and preference * @param email * @param password */ private void createAccount(final String email, String passwo
rd) { log(TAG + "createAccount:" + email);
showProgressDialog(); // [START create_user_with_email] mAuth.createUserWithEmailAndPassword(email, password) .addOnCompleteListener(this, new OnCompleteListe
ner() {
@Override public void onComplete(@NonNull Task
ult> task) { Log.d(TAG, "createUserWithEmail:onComple te:" + task.isSuccessful()); if (!task.isSuccessful()) {
/*** * Write new user and save to database and shared preference * @param userId * @param fcmId */ private void writeNewUser(String user_name, String user_emai
l, String user_no_hp, String userId, String fcmId) { // Write on model User user = new User(user_name, user_email, user_no_hp, userId, fcmId); // Save to database
ap()); PreferenceHelper preferenceHelper = new PreferenceHelper (getApplicationContext()); preferenceHelper.saveDataProfile(user_name, user_no_hp, user_email, userId, fcmId); log("Write new user executed!"); }
Selanjutnya kita kembali ke class SignActivity untuk menambahkan fungsi menyimpan data profile ke shared preference apabila si user telah memiliki akun.
4. Sign dan Signup public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser users = firebaseAuth.getCurrentUser (); if (users != null) { // User is signed in Log.d(TAG, "onAuthStateChanged:signed_in:" + users.getUid()); String userId = users.getUid();
mDatabase.child("users").child(userId).addLi
stenerForSingleValueEvent( new ValueEventListener() {
@Override public void onDataChange(DataSna
pshot dataSnapshot) { // Get user value User user = dataSnapshot.get Value(User.class); PreferenceHelper preferenceH elper = new PreferenceHelper(getApplicationContext());
preferenceHelper.saveDataPro
file(user.full_name, user.no_hp, user.email, user.uid, user.fcm_ id); // End get data user }
@Override public void onCancelled(Database
Error databaseError) { Log.w(TAG, "getUser:onCancel led", databaseError.toException()); } }); startActivity(new Intent(SignActivity.this, HomeActivity.class)); } else { // User is signed out Log.d(TAG, "onAuthStateChanged:signed_out"); }
38
4. Sign dan Signup } }; }
Disini kita membuat action untuk query ke database dan menyimnya di shared preference yang berada di method auth. Nah untuk Sign dan Signup kita selesai sekarang lanjut untuk di halaman Home.
39
5. Halaman Home user
Home Activity Setelah user selesai melakukan registrasi dan login ke aplikasi Ayo-Jek kita arahkan ke halaman HomeActivity, di dalam halaman home activity ini kita akan menampilkan maps dan tombol untuk booking ojek. Maps yang akan k ita tampilkan di home ini nanti berfungsi untuk mendapatkan lokasi user yang akan kita gunakan sebagai parameter untuk melakukan booking ajek nantinya. Ok langunsg kita mulai saja dengan membuat tampilan untuk halaman home ini. Untuk root layout home ini kita menggunakan drawer layout yang nantinya ini akan digunakan untuk menampilkan navigation drawer kemudian agar tidak menumpuk untuk codingan activity_home ini maka kita memisahkan menjadi 3 bagian untuk layoutnya yaitu activity_home.xml, activity_main.xml, nav_header_home.xml . 1. activity_home.xml
Selanjutnya kita masuk ke HomeActivity.java disini kita akan membuat fungsi untuk menampilkan maps, namun sebelum itu kita perlu untuk mengaktifkan google map api melalui google developer console.
Kemudian pilih google maps android API dan kemudian enable
Kemudian masuk ke menu Credentials
Kemudian isikan packagename dari aplikas dan SHA-1 certificate fingerprint
45
5. Halaman Home user
Kemudian buat file google_maps_api.xml di dalam folder res/values. Copy api key dari google developer console tadi
AIzaSyCXgDbzipqaBnyzGMG2cfeqWCM0ZMFfHDE
Kemudian masuk ke manifest dan tambahkan code berikut ini <meta-data
5. Halaman Home user Dan jangan lupa juga tambahkan acces permission berikut ini
Dan disini kita akan menggunakan library location tracker untuk mendapatkan lokasi terbaru dan terupdate dari user compile 'com.github.quentin7b:android-location-tracker:3.2'
Sekarang kita masuk ke HomeActivity.java seperti biasa kita buat variable di awal codingan kita private static final String TAG = "HomeActivity : "; private GoogleMap mMap; private BitmapDescriptor iconMe; private Context context; private LocationTracker tracker; private double myLatitude; private double myLongitude; private Marker myMarker; private TextView full_name; private TextView email;
Di oncreate kita inisiasi variable - variable diatas