Sunday, March 31, 2019

Thursday, March 28, 2019

Tutorial Membuat Staggered Grid dengan RecyclerView | Android Studio

Tutorial Membuat Staggered Grid dengan RecyclerView | Android Studio

Staggered Grid
Staggered Grid
Halo sobat 48😁 kali ini saya akan membagikan sebuah artikel tentang Tutorial Membuat Staggered Grid dengan RecyclerView menggunakan Android Studio. Pasti banyak yang belum tahu apa itu Staggered. Saya pun juga baru belajar mengenai Staggered ini dikarenakan bentuk tampilannya yang tidak biasa, seperti Grid namun memiliki ukuran yang berbeda-beda disetiap elemennya. Seperti ini contohnya :
Staggered Grid
Staggered Grid
Terlihat perbedaannya kan? StaggeredGridLayoutManager mirip dengan GridLayoutManager tetapi dalam hal ini setiap kotak memiliki ukurannya sendiri (lebar dan tinggi). Secara otomatis mengatur item sesuai dengan tinggi dan lebarnya. Perbedaan utama antara GridView dan Staggered Grid adalah ukuran yang bervariasi dalam staggered. Tampilan Grid Staggered menunjukkan item asimetris dalam tampilan. Jika kalian ingin SOURCE CODE Staggered Grid RecyclerView ini, silahkan download di Github saya DISINI. Tetapi jika kalian ingin tahu cara mengaplikasikannya, silahkan lanjut baca artikel ini sampai selesai😄.

Jika kalian ingin mencoba membuat Staggered Grid ini, berikut saya berikan Video Tutorialnya :

Jangan lupa klik SUBSCRIBE ya. Oke langsung saja tanpa basa-basi lagi kita langsung ke langkah pertama :
1. Buat project baru di Android Studio dengan cara klik File ⇒ Project Baru. Ketika diminta untuk memilih Default Activity, pilih Empty Activity dan klik next. Untuk minSDK, disini saya set API 21 ya.

2. Buka AndroidManifest.xml dan ubah menjadi seperti ini :


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

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

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

</manifest>

3. Ubah isi MainActivity.java dan activity_main.xml menjadi seperti ini :


package com.azhar.staggeredrecyclerview;

import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by Azhar Rivaldi on 27/03/2018.
 */

public class MainActivity extends AppCompatActivity {

    RecyclerView recyclerView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        Bitmap[] bitmaps = getBitmaps();
        MyRecyclerAdapter myRecyclerAdapter = new MyRecyclerAdapter(bitmaps);
        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
        recyclerView.setAdapter(myRecyclerAdapter);

    }

    private Bitmap[] getBitmaps() {
        Bitmap[] tempBitmaps = new Bitmap[10];
        tempBitmaps[0] = BitmapFactory.decodeResource(getResources(), R.drawable.satu);
        tempBitmaps[1] = BitmapFactory.decodeResource(getResources(), R.drawable.lima);
        tempBitmaps[2] = BitmapFactory.decodeResource(getResources(), R.drawable.tiga);
        tempBitmaps[3] = BitmapFactory.decodeResource(getResources(), R.drawable.empat);
        tempBitmaps[4] = BitmapFactory.decodeResource(getResources(), R.drawable.dua);
        tempBitmaps[5] = BitmapFactory.decodeResource(getResources(), R.drawable.enam);
        tempBitmaps[6] = BitmapFactory.decodeResource(getResources(), R.drawable.tujuh);
        tempBitmaps[7] = BitmapFactory.decodeResource(getResources(), R.drawable.delapan);
        tempBitmaps[8] = BitmapFactory.decodeResource(getResources(), R.drawable.sembilan);
        tempBitmaps[9] = BitmapFactory.decodeResource(getResources(), R.drawable.sepuluh);
        return tempBitmaps;
    }

    private class MyRecyclerAdapter extends RecyclerView.Adapter {

        Bitmap[] bitmaps;

        public MyRecyclerAdapter(Bitmap[] bitmaps) {
            this.bitmaps = bitmaps;
        }

        @NonNull
        @Override
        public GridHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.staggered_grid, parent, false);
            return new GridHolder(view);
        }

        @SuppressLint("SetTextI18n")
        @Override
        public void onBindViewHolder(@NonNull GridHolder holder, int position) {
            holder.imageView.setImageBitmap(bitmaps[position]);
            holder.textView.setText("Deskripsi " + position);
        }

        @Override
        public int getItemCount() {
            return bitmaps.length;
        }
    }

    private class GridHolder extends RecyclerView.ViewHolder {

        ImageView imageView;
        TextView textView;

        public GridHolder(View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.imageView);
            textView = itemView.findViewById(R.id.desc);
        }
    }

}
;



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recyclerView"/>

</LinearLayout>

4. Langkah yang terakhir buat layout staggered_grid.xml dan isinya seperti ini :


<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_margin="16dp"
    app:cardCornerRadius="16dp">

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

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@mipmap/ic_launcher"
            android:scaleType="fitXY"
            android:id="@+id/imageView"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="8dp"
            android:text="Deskripsi"
            android:id="@+id/desc"/>

    </LinearLayout>

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

Jika semuanya sudah selesai bisa kalian RUN. Untuk file yang kurang seperti gambar yang ada di folder drawable, silahkan download di Github saya DISINI.

Kalau kalian mengikuti langkah-langkah diatas dengan baik, pasti aplikasi yang kalian buat akan berjalan sebagaimana mestinya. Namun jika mengalami Error, silahkan berikan komentar dan kita diskusikan bersama.

Demikian informasi yang saya bagikan untuk kalian. Jangan lupa bagikan artikel ini ke teman-teman kalian agar ikut membaca Tutorial Membuat Staggered Grid dengan RecyclerView | Android Studio ini. Subscribe juga di blog Rivaldi 48 ini agar kalian mendapatkan notifikasi saat Admin update artikel terbaru. Follow Instagram Admin @azhardvls_. Semoga kalian lebih nyaman dan mudah dalam mengakses Blog Rivaldi 48 dimanapun kalian berada. Terima Kasih...

Wednesday, March 27, 2019

Cara Mengantisipasi Akun WhatsApp Mod Agar Tidak di Blokir

Cara Mengantisipasi Akun WhatsApp Mod Agar Tidak di Blokir

WhatsApp Mod
WhatsApp Mod
Halo sobat 48😁 menjelang akhir bulan Maret ini saya akan membahas seputar WhatsApp Mod yang sangat ramai diperbincangkan dikarenakan isu akun diblokir. Ya, memang sudah ada peringatan dari pihak WhatsApp sendiri jika ada yang menggunakan WhatsApp Mod penggunanya akan diblokir sementara atau bahkan sampai diblokir permanen. Wow! Ngeri juga ya😂. Dan peringatan itupun sudah ada jauh-jauh hari, namun sepertinya baru sekarang dilakukan pemblokiran kepada pengguna WhatsApp Mod.

Menurut saya, peringatan yang diberikan oleh pihak WhatsApp memang ada baiknya. Selain untuk menjaga data penggunanya, kita juga tidak tahu apakah WhatsApp Mod itu memang benar-benar aman seperti WhatsApp Official atau tidak. Sedikit pengalaman dari saya; Pernahkah kalian perhatikan jika kalian menggunakan GB WhatsApp dan WhatsApp Plus, saat login dan menerima sms verifikasi, isi dari smsnya itu berbeda dan tidak seperti sms verifikasi yang diberikan seperti WhatsApp Official?

Semenjak saat itu, saya sampai sekarang Tidak Pernah lagi untuk mencoba GB WhatsApp. Karena saya sudah curiga dan takut jika terjadi apa-apa kedepannya. Ini saya ceritakan menurut pengalaman saya. Terlebih lagi dibeberapa menu GB WhatsApp itu ada iklan yang sangat mengganggu. Walaupun disisi lain fiturnya memang sangat banyak dan tentunya membuat kita tertarik untuk mencobanya. Dibawah ini akan saya berikan screenshoot beberapa pengguna yang sudah diblokir sementara dan permanen :
Blokir Permanen
Blokir Permanen
Blokir Sementara
Blokir Sementara
Blokir Sementara
Blokir Sementara
Blokir Permanen
Blokir Permanen
Oleh karena itu, pihak WhatsApp langsung memberi peringatan kepada Developer GB WhatsApp untuk tidak melakukan update ke versi yang lebih tinggi. Selain itu, para penggunanya pun dirugikan karena dikabarkan sudah ada yang terblokir sementara dan bahkan terblokir permanen. Selain menggunakan GB WhatsApp dan WhatsApp plus, ternyata ada hal-hal yang tidak kita sadari kalau apa yang kita lakukan itu membuat akun WhatsApp kita terblokir dengan sendirinya. Hal-hal apa itu? Lalu bagaimana Cara Mengantisipasi Akun WhatsApp Mod Agar Tidak di Blokir? Berikut ini akan saya jelaskan sesuai pengalaman saya dan Developers Apps Begal Team Rikri Rikardo :

1. Terlalu sering login menggunakan nomor yang sama berkali-kali dalam kurun waktu yang singkat. Nah, buat kalian yang suka ganti-ganti WhatsApp Mod, mulai sekarang harus berhati-hati ya, karena jika kalian sering login menggunakan nomor yang sama dalam waktu singkat akan memblokir nomor kalian secara permanen. Sebelum diblokir, biasanya akan ada peringatan bahwa sms verifikasi yang akan dikirimkan itu rentang waktunya semakin lama. Dimulai 1 jam, 4 jam, 8 jam, 12 jam, bahkan sampai 48 jam. Apa kalian mau menunggu sms verifikasi selama itu?

2. Kesalahan memasukkan kode verifikasi lebih dari 3 kali. Biasakan buka sms verifikasi saat ingin login WhatsApp. Karena jika kalian salah memasukkannya lebih dari 3 kali maka akun kalian akan di banned sementara. Memang hal ini sepele, namun bisa berakibat fatal. Apabila sudah terjadi, usahakan terlebih dahulu masuk ke File Manager lalu hapus data yang tersimpan pada folder WhatsApp dan folder android/data/com.whatsapp.

3. Kesalahan memasukkan nomor telepon dan mengklik ganti nomor secara berturut-urut. Ini adalah hal yang sangat sepele, lebih sepele dari nomor 2😄. Sebelum kalian mengklik "LANJUTKAN" pada saat verifikasi nomor telepon, ada baiknya kalian cek  kembali apakah nomor tersebut sudah benar atau belum. Jika kalian mengklik ganti nomor berkali-kali, akun kalian akan di banned sementara. Sama seperti nomor 2, apabila sudah terjadi, usahakan terlebih dahulu masuk ke File Manager lalu hapus data yang tersimpan pada folder WhatsApp dan folder android/data/com.whatsapp.

4. Jika akun kalian terblokir sementara saat menggunakan WhatsApp Mod, segera ganti dengan WhatsApp Official agar akun kalian tidak di blokir secara permanen.

Sedikit tips buat kalian yang sering login karena ganti-ganti WhatsApp, lakukan hal dibawah ini :

  • Sebelum login dimulai, sebaiknya kalian menghapus semua data yang ada pada aplikasi WhatsApp (seperti penjelasan sebelumnya) dan hapus data juga di Setelan-Aplikasi-WhatsApp.
  • Kemudian barulah kalian buka WhatsApp dan login. Jangan sampai ada kesalahan dalam penulisan nomor telepon. Apabila ada kesalahan dalam penulisan, lakukan langkah sebelumnya yaitu hapus data. Memang kedua tips ini agak ribet, namun akun kalian akan aman dari banned sementara.
  • Ini cuma peringatan saja ya, jika ada WhatsApp Mod yang menyediakan fitur include copy WhatsApp data, jangan pernah kalian lakukan. Kalian lakukan aja secara manual saat backup / restore data. Ekspor Chat Person atau Chat Group via Share Contact (bisa share ke kontak sendiri, atau ke akun lain) dan simpan baik-baik jika sewaktu-waktu ingin ganti WhatsApp bisa kalian restore ke folder WhatsApp.
Sekedar informasi khususnya kalian pengguna setia WhatsApp Mod harap dibaca:

  1. JANGAN PERNAH cadangkan Chat (obrolan) kalian via Google Grive jika menggunakan WhatsApp Mod. Pilih Never (jangan pernah) bila kalian ingin aman dan nyaman dalam menggunakan WhatsApp Mod. Resiko Chat hilang itu sudah resiko jika kalian sering ganti-ganti WhatsApp Mod.
  2. JANGAN PERNAH kirim Report apapun melalui Halaman Help (Bantuan) pada WhatsApp Mod.
  3. JANGAN terlalu sering keluar masuk dan ganti-ganti WhatsApp Mod dengan nomor yang sama. Harap jeda 1-2 hari jika ingin ganti WhatsApp Mod.
  4. Untuk nomor utama sebaiknya gunakan WhatsApp Resmi (Official & Business) dari Play Store. Untuk WhatsApp Mod gunakan nomor cadangan atau SIM 2. Jadi, gunakan WhatsApp Mod versi CLONE (hanya saran).
  5. Segala resiko dari penggunaan WhatsApp Mod adalah tanggung jawab pengguna itu sendiri, bukan tanggung jawab Modder.

Demikian informasi yang saya bagikan untuk kalian. Jangan lupa bagikan artikel ini ke teman-teman kalian agar ikut membaca Cara Mengantisipasi Akun WhatsApp Mod Agar Tidak di Blokir ini. Semoga akun kalian aman ya😁. Subscribe juga blog Rivaldi 48 ini agar kalian mendapatkan notifikasi saat Admin update artikel terbaru. Semoga kalian lebih nyaman dan mudah dalam mengakses Blog Rivaldi 48 dimanapun kalian berada. Terima Kasih. Follow Instagram Admin @azhardvls_

Tuesday, March 26, 2019

Tutorial Login, Register dan Forgot Password dengan Firebase - Android Studio

Tutorial Login, Register dan Forgot Password dengan Firebase - Android Studio

Login Register Firebase
Login Register Firebase
Halo sobat 48😁 kali ini saya akan membagikan sebuah artikel tentang Tutorial Login, Register dan Forgot Password dengan Firebase menggunakan Android Studio. Walaupun saya baru-baru ini mencoba Firebase, tapi saya ingin berbagi apa yang sudah saya buat dengan Firebase ini. Disini saya sudah membuat demo Login / Register (Firebase Authentication) sederhana menggunakan Firebase Email & Password Authentication. Jika kalian ingin SOURCE CODE aplikasi yang sudah saya buat ini, silahkan kalian kunjungin Github saya DISINI. Kalau ingin tahu cara membuat aplikasinya, lanjutkan membaca artikel sampai habis😄 agar kalian juga paham.

Perlu kalian tahu bahwa Firebase secara otomatis menyimpan data penggunanya secara aman (menggunakan bcrypt). Ini memisahkan data pengguna yang sensitif dari data aplikasi yang kalian kelola. Firebase hadir dengan banyak fitur penting untuk setiap aplikasi Android mulai dari otentikasi hingga membuat hosting aplikasi.
Fitur Firebase
Di bawah ini adalah keuntungan jika kalian menggunakan Firebase secara umum:
  • Sangat mudah dan cepat untuk diimplementasikan.
  • Tidak diperlukan konfigurasi server. Tidak ada Script PHP dan Tidak ada Desain Basis Data.
  • Pembaruan waktu nyata tanpa menggunakan GCM.
  • Dapat mulai secara gratis.
  • Robust APIs untuk Javascript (termasuk beberapa kerangka kerja seperti Angular), iOS, dan Android.
  • Dukungan bawaan untuk layanan otentikasi seperti Facebook, Google, dan Twitter.
  • Model aturan keamanan deklaratif yang memungkinkan kita untuk menerapkan hak baca / tulis dan validasi data di seluruh struktur pohon.
Beberapa kelemahan Firebase dapat disimpulkan sebagai berikut:
  • Perlu membuat indeks secara manual.
  • Implementasi REST API mungkin sulit.
  • Aturan validasi data tidak mendukung objek kompleks secara langsung (kalian harus memvalidasi masing-masing data secara terpisah).
Berikut ini adalah tampilan aplikasi yang sudah saya buat :
Login Register Firebase
Login Register Firebase
Login Register Firebase
Login Register Firebase
Oke langsung saja saya jelaskan langkah-langkah membuat Login, Register dan Forgot Password dengan Firebase :

#1. Mengaktifkan Firebase Auth
1. Hal pertama yang perlu kalian lakukan adalah membuka https://firebase.google.com/ dan membuat akun untuk mendapatkan akses ke console Firebase. Setelah kalian mendapatkan akses ke console, kalian bisa mulai dengan membuat project pertama.
Login Register Firebase
Login Register Firebase
2. Berikan nama package project aplikasi kalian (kalau saya com.azhar.loginfirebase) dimana kalian akan mengintegrasikan Firebase. Disini file google-services.json harus kalian unduh ketika kalian menekan tombol tambah project.
Login Register Firebase
Login Register Firebase
Login Register Firebase
Login Register Firebase
Login Register Firebase
Login Register Firebase
Login Register Firebase
Login Register Firebase
3. Selanjutnya buka dasbor project kalian. Pilih Auth dan klik mulai. Kalian atur metode login dan pilih Email & Kata Sandi lalu aktifkan.
Login Register Firebase
Login Register Firebase
Sekarang kalian sudah siap untuk memulai dengan project Android. Nah disini saya akan membuat aplikasi sederhana yang berisi otentikasi Firebase. Secara keseluruhan saya akan membuat bagaimana cara menambahkan Login, Registrasi, Forgot Password, Ubah Email, Ubah Kata Sandi & opsi Keluar (Sign Out).

#2. Membuat Aplikasi Android
1. Buat project baru di Android Studio dengan cara klik File ⇒ Project Baru. Ketika diminta untuk memilih Default Activity, pilih Empty Activity dan klik next. Untuk minSDK, minimal API 21 ya. Saat kalian mengisi detail project, gunakan nama paket yang sama yang kalian berikan di console Firebase. Disini saya menggunakan package com.azhar.loginfirebase seperti pada langkah nomor 1 bagian 2.

2. Buka AndroidManifest.xml dan ubah menjadi seperti ini :


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

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

    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.READ_PROFILE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />

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

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_profile"
            android:theme="@style/AppTheme.NoActionBar" />
        <activity
            android:name=".SignupActivity"
            android:label="@string/title_activity_login"
            android:theme="@style/AppTheme.NoActionBar" />
        <activity
            android:name=".ResetPasswordActivity"
            android:label="@string/title_activity_reset_password"
            android:theme="@style/AppTheme.NoActionBar" />

    </application>

</manifest>

3. Copy & Paste file google-services.json yang sudah kalian download tadi ke folder app. Langkah ini sangat penting karena project kalian tidak akan jalan tanpa file ini.

4. Sekarang buka build.gradle yang terletak di direktori home project dan tambahkan firebase dependency :


dependencies {
        classpath 'com.android.tools.build:gradle:3.3.2'
        classpath 'com.google.gms:google-services:4.0.1'
        
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

5. Buka app / build.gradle dan tambahkan firebase auth dependency. Di bagian paling bawah file, tambahkan plugin terapkan: ‘com.google.gms.google-services’ :


dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    implementation 'com.google.firebase:firebase-core:16.0.1'
    implementation 'com.google.firebase:firebase-auth:16.0.1'
}

apply plugin: 'com.google.gms.google-services'

6. Tambahkan dimens.xml, colors.xml, styles.xml dan strings.xml :


<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>
    <dimen name="fab_margin">16dp</dimen>
    <dimen name="logo_w_h">100dp</dimen>
</resources>



<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#2196F3</color>
    <color name="colorPrimaryDark">#2196F3</color>
    <color name="colorAccent">#D81B60</color>

    <color name="bg_login">#26ae90</color>
    <color name="bg_register">#2e3237</color>
    <color name="bg_main">#428bca</color>
    <color name="white">#ffffff</color>
    <color name="input_login">#222222</color>
    <color name="input_login_hint">#999999</color>
    <color name="input_register">#888888</color>
    <color name="input_register_bg">#3b4148</color>
    <color name="input_register_hint">#5e6266</color>
    <color name="btn_login">#26ae90</color>
    <color name="btn_login_bg">#eceef1</color>
    <color name="lbl_name">#333333</color>
    <color name="btn_logut_bg">#ff6861</color>
</resources>



<resources>

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

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
        <item name="android:windowFullscreen">true</item>
    </style>

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

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

</resources>




<resources xmlns:tools="http://schemas.android.com/tools">
    <string name="app_name">Login Firebase</string>
    <string name="action_sign_in_short">Register</string>
    <string name="email">Email</string>
    <string name="minimum_password">Password too short, enter minimum 6 characters!</string>
    <string name="auth_failed">Authentication failed, check your email and password or sign up</string>
    <string name="change_email">Change Email</string>
    <string name="change_password">Change Password</string>
    <string name="send_password_reset_email">Reset Email</string>
    <string name="remove_user">Remove user</string>
    <string name="new_pass">New Password</string>
    <string name="title_activity_profile">Firebase</string>
    <string name="title_activity_login">Sign in</string>
    <string name="hint_email">Email</string>
    <string name="hint_password">Password</string>
    <string name="hint_name">Fullname</string>
    <string name="btn_login">LOGIN</string>
    <string name="btn_link_to_login">Already registered. Login Me!</string>
    <string name="title_activity_reset_password">ResetPasswordActivity</string>
    <string name="btn_forgot_password">Forgot your password?</string>
    <string name="btn_reset_password">Reset Password</string>
    <string name="btn_back"><![CDATA[<< Back]]></string>
    <string name="hint_new_email">New Email</string>
    <string name="btn_change">Change</string>
    <string name="btn_send">Send</string>
    <string name="btn_remove">Remove</string>
    <string name="btn_sign_out">Sign Out</string>
    <string name="lbl_forgot_password">Forgot password?</string>
    <string name="forgot_password_msg">We just need your registered Email Id to sent you password reset instructions.</string>

</resources>


7. Buat activity bernama SignUpActivity.java dan tambahkan kode berikut ke layout activity_signup.xml :


package com.azhar.loginfirebase;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;

/**
 * Created by Azhar Rivaldi on 26/03/2018.
 */

public class SignUpActivity extends AppCompatActivity {

    private EditText inputEmail, inputPassword;
    private Button btnSignIn;
    private ProgressBar progressBar;
    private FirebaseAuth auth;
    private ImageButton btnSignUp;

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

        auth = FirebaseAuth.getInstance();

        btnSignIn = (Button) findViewById(R.id.sign_in_button);
        btnSignUp = (ImageButton) findViewById(R.id.sign_up_button);
        inputEmail = (EditText) findViewById(R.id.email);
        inputPassword = (EditText) findViewById(R.id.password);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);

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

        btnSignUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String email = inputEmail.getText().toString().trim();
                String password = inputPassword.getText().toString().trim();

                if (TextUtils.isEmpty(email)) {
                    Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show();
                    return;
                }

                if (TextUtils.isEmpty(password)) {
                    Toast.makeText(getApplicationContext(), "Enter password!", Toast.LENGTH_SHORT).show();
                    return;
                }

                if (password.length() < 6) {
                    Toast.makeText(getApplicationContext(), "Password too short, enter minimum 6 characters!", Toast.LENGTH_SHORT).show();
                    return;
                }

                progressBar.setVisibility(View.VISIBLE);
                //create user
                auth.createUserWithEmailAndPassword(email, password)
                        .addOnCompleteListener(SignUpActivity.this, new OnCompleteListener() {
                            @Override
                            public void onComplete(@NonNull Task task) {
                                Toast.makeText(SignUpActivity.this, "createUserWithEmail:onComplete:" + task.isSuccessful(), Toast.LENGTH_SHORT).show();

                                progressBar.setVisibility(View.GONE);

                                if (!task.isSuccessful()) {
                                    Toast.makeText(SignUpActivity.this, "Authentication failed." + task.getException(),
                                            Toast.LENGTH_SHORT).show();
                                } else {
                                    startActivity(new Intent(SignUpActivity.this, MainActivity.class));
                                    finish();
                                }
                            }
                        });

            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        progressBar.setVisibility(View.GONE);
    }
}




<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background_login"
    tools:context=".SignUpActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:minHeight="?attr/actionBarSize"
        android:theme="?attr/actionBarTheme">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="REGISTER"
            android:textAlignment="center"
            android:textColor="#ffff"
            android:textSize="20sp"
            android:textStyle="bold" />
    </android.support.v7.widget.Toolbar>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/toolbar"
        android:layout_centerHorizontal="true"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="20dp"
            android:layout_marginTop="20dp"
            android:layout_marginEnd="20dp"
            android:layout_marginBottom="20dp"
            android:background="@drawable/layout_background"
            android:gravity="center"
            android:orientation="vertical">

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

                <EditText
                    android:id="@+id/email"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="20dp"
                    android:layout_marginEnd="20dp"
                    android:drawableLeft="@drawable/ic_mail_outline_black_24dp"
                    android:drawablePadding="10dp"
                    android:hint="EMAIL"
                    android:inputType="textEmailAddress"
                    android:padding="20dp"
                    android:textColorHint="#606060"
                    android:textSize="14sp" />

                <EditText
                    android:id="@+id/password"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="20dp"
                    android:layout_marginTop="10dp"
                    android:layout_marginEnd="20dp"
                    android:drawableLeft="@drawable/ic_lock_outline_black_24dp"
                    android:drawablePadding="10dp"
                    android:hint="PASSWORD"
                    android:inputType="textPassword"
                    android:padding="20dp"
                    android:textColorHint="#606060"
                    android:textSize="14sp" />

                <ImageButton
                    android:id="@+id/sign_up_button"
                    android:layout_width="50dp"
                    android:layout_height="50dp"
                    android:layout_gravity="end"
                    android:layout_marginTop="90dp"
                    android:layout_marginRight="30dp"
                    android:background="@drawable/button_background"
                    android:src="@drawable/ic_arrow_forward_black_24dp" />


            </LinearLayout>

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

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_marginTop="25dp"
                    android:text="Already have an Account? "
                    android:textAlignment="center"
                    android:textColor="@android:color/black"
                    android:textStyle="bold" />

                <Button
                    android:id="@+id/sign_in_button"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_marginLeft="40dp"
                    android:layout_marginTop="10dp"
                    android:layout_marginRight="40dp"
                    android:background="@drawable/button_background"
                    android:text="Login Here!"
                    android:textColor="@android:color/white" />

                <ProgressBar
                    android:id="@+id/progressBar"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:layout_gravity="center|bottom"
                    android:layout_marginBottom="20dp"
                    android:visibility="gone" />

            </LinearLayout>

        </LinearLayout>

    </LinearLayout>

</RelativeLayout>


8. Buat activity lain bernama LoginActivity.java dan tambahkan kode berikut ke layout activity_login.xml :


package com.azhar.loginfirebase;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;

/**
 * Created by Azhar Rivaldi on 26/03/2018.
 */

public class LoginActivity extends AppCompatActivity {

    private EditText inputEmail, inputPassword;
    private FirebaseAuth auth;
    private ProgressBar progressBar;
    private Button btnSignup, btnReset;
    private ImageButton btnLogin;

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

        auth = FirebaseAuth.getInstance();

        if (auth.getCurrentUser() != null) {
            startActivity(new Intent(LoginActivity.this, MainActivity.class));
            finish();
        }

        setContentView(R.layout.activity_login);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        inputEmail = (EditText) findViewById(R.id.email);
        inputPassword = (EditText) findViewById(R.id.password);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        btnSignup = (Button) findViewById(R.id.btn_signup);
        btnLogin = (ImageButton) findViewById(R.id.btn_login);
        btnReset = (Button) findViewById(R.id.btn_reset_password);

        auth = FirebaseAuth.getInstance();

        btnSignup.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(LoginActivity.this, SignUpActivity.class));
            }
        });

        btnReset.setOnClickListener(
                new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(LoginActivity.this, ResetPasswordActivity.class));
            }
        });

        btnLogin.setOnClickListener(
                new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String email = inputEmail.getText().toString();
                final String password = inputPassword.getText().toString();

                if (TextUtils.isEmpty(email)) {
                    Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show();
                    return;
                }

                if (TextUtils.isEmpty(password)) {
                    Toast.makeText(getApplicationContext(), "Enter password!", Toast.LENGTH_SHORT).show();
                    return;
                }

                progressBar.setVisibility(View.VISIBLE);

                auth.signInWithEmailAndPassword(email, password)
                        .addOnCompleteListener(LoginActivity.this, new OnCompleteListener() {
                            @Override
                            public void onComplete(@NonNull Task task) {

                                progressBar.setVisibility(View.GONE);
                                if (!task.isSuccessful()) {

                                    if (password.length() < 6) {
                                        inputPassword.setError(getString(R.string.minimum_password));
                                    } else {
                                        Toast.makeText(LoginActivity.this, getString(R.string.auth_failed), Toast.LENGTH_LONG).show();
                                    }
                                } else {
                                    Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                                    startActivity(intent);
                                    finish();
                                }
                            }
                        });
            }
        });
    }
}





<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background_login"
    tools:context=".LoginActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:minHeight="?attr/actionBarSize"
        android:theme="?attr/actionBarTheme">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="LOGIN"
            android:textAlignment="center"
            android:textColor="#ffff"
            android:textSize="20sp"
            android:textStyle="bold" />
    </android.support.v7.widget.Toolbar>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/toolbar"
        android:layout_centerHorizontal="true"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="20dp"
            android:layout_marginTop="20dp"
            android:layout_marginEnd="20dp"
            android:layout_marginBottom="20dp"
            android:background="@drawable/layout_background"
            android:gravity="center"
            android:orientation="vertical">

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

                <EditText
                    android:id="@+id/email"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="20dp"
                    android:layout_marginEnd="20dp"
                    android:drawableLeft="@drawable/ic_mail_outline_black_24dp"
                    android:drawablePadding="10dp"
                    android:hint="EMAIL"
                    android:inputType="textEmailAddress"
                    android:padding="20dp"
                    android:textColorHint="#606060"
                    android:textSize="14sp" />

                <EditText
                    android:id="@+id/password"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="20dp"
                    android:layout_marginTop="10dp"
                    android:layout_marginEnd="20dp"
                    android:drawableLeft="@drawable/ic_lock_outline_black_24dp"
                    android:drawablePadding="10dp"
                    android:hint="PASSWORD"
                    android:inputType="textPassword"
                    android:padding="20dp"
                    android:textColorHint="#606060"
                    android:textSize="14sp" />

                <Button
                    android:id="@+id/btn_reset_password"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:background="@null"
                    android:text="@string/btn_forgot_password"
                    android:textColor="@color/colorPrimary" />

                <ImageButton
                    android:id="@+id/btn_login"
                    android:layout_width="50dp"
                    android:layout_height="50dp"
                    android:layout_gravity="end"
                    android:layout_marginTop="70dp"
                    android:layout_marginRight="30dp"
                    android:background="@drawable/button_background"
                    android:src="@drawable/ic_arrow_forward_black_24dp" />


            </LinearLayout>

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

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_marginTop="25dp"
                    android:text="Don't have an Account?"
                    android:textAlignment="center"
                    android:textColor="@android:color/black"
                    android:textStyle="bold" />

                <Button
                    android:id="@+id/btn_signup"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_marginLeft="40dp"
                    android:layout_marginTop="10dp"
                    android:layout_marginRight="40dp"
                    android:background="@drawable/button_background"
                    android:text="SIGN UP"
                    android:textColor="@android:color/white" />

                <ProgressBar
                    android:id="@+id/progressBar"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:layout_gravity="center|bottom"
                    android:layout_marginBottom="20dp"
                    android:visibility="gone" />

            </LinearLayout>

        </LinearLayout>

    </LinearLayout>

</RelativeLayout>

9. Buat activity lagi bernama MainActivity.java dan tambahkan kode berikut ke layout activity_main.xml :


package com.azhar.loginfirebase;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

/**
 * Created by Azhar Rivaldi on 26/03/2018.
 */

public class MainActivity extends AppCompatActivity {

    private Button btnChangeEmail, btnChangePassword, btnSendResetEmail, btnRemoveUser,
            changeEmail, changePassword, sendEmail, remove, signOut;

    private EditText oldEmail, newEmail, password, newPassword;
    private ProgressBar progressBar;
    private FirebaseAuth.AuthStateListener authListener;
    private FirebaseAuth auth;

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

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setTitle(getString(R.string.app_name));
        setSupportActionBar(toolbar);

        auth = FirebaseAuth.getInstance();

        final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

        authListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user == null) {
                    startActivity(new Intent(MainActivity.this, LoginActivity.class));
                    finish();
                }
            }
        };

        btnChangeEmail = (Button) findViewById(R.id.change_email_button);
        btnChangePassword = (Button) findViewById(R.id.change_password_button);
        btnSendResetEmail = (Button) findViewById(R.id.sending_pass_reset_button);
        btnRemoveUser = (Button) findViewById(R.id.remove_user_button);
        changeEmail = (Button) findViewById(R.id.changeEmail);
        changePassword = (Button) findViewById(R.id.changePass);
        sendEmail = (Button) findViewById(R.id.send);
        remove = (Button) findViewById(R.id.remove);
        signOut = (Button) findViewById(R.id.sign_out);

        oldEmail = (EditText) findViewById(R.id.old_email);
        newEmail = (EditText) findViewById(R.id.new_email);
        password = (EditText) findViewById(R.id.password);
        newPassword = (EditText) findViewById(R.id.newPassword);

        oldEmail.setVisibility(View.GONE);
        newEmail.setVisibility(View.GONE);
        password.setVisibility(View.GONE);
        newPassword.setVisibility(View.GONE);
        changeEmail.setVisibility(View.GONE);
        changePassword.setVisibility(View.GONE);
        sendEmail.setVisibility(View.GONE);
        remove.setVisibility(View.GONE);

        progressBar = (ProgressBar) findViewById(R.id.progressBar);

        if (progressBar != null) {
            progressBar.setVisibility(View.GONE);
        }

        btnChangeEmail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                oldEmail.setVisibility(View.GONE);
                newEmail.setVisibility(View.VISIBLE);
                password.setVisibility(View.GONE);
                newPassword.setVisibility(View.GONE);
                changeEmail.setVisibility(View.VISIBLE);
                changePassword.setVisibility(View.GONE);
                sendEmail.setVisibility(View.GONE);
                remove.setVisibility(View.GONE);
            }
        });

        changeEmail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressBar.setVisibility(View.VISIBLE);
                if (user != null && !newEmail.getText().toString().trim().equals("")) {
                    user.updateEmail(newEmail.getText().toString().trim())
                            .addOnCompleteListener(new OnCompleteListener() {
                                @Override
                                public void onComplete(@NonNull Task task) {
                                    if (task.isSuccessful()) {
                                        Toast.makeText(MainActivity.this, "Email address is updated. Please sign in with new email id!", Toast.LENGTH_LONG).show();
                                        signOut();
                                        progressBar.setVisibility(View.GONE);
                                    } else {
                                        Toast.makeText(MainActivity.this, "Failed to update email!", Toast.LENGTH_LONG).show();
                                        progressBar.setVisibility(View.GONE);
                                    }
                                }
                            });
                } else if (newEmail.getText().toString().trim().equals("")) {
                    newEmail.setError("Enter email");
                    progressBar.setVisibility(View.GONE);
                }
            }
        });

        btnChangePassword.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                oldEmail.setVisibility(View.GONE);
                newEmail.setVisibility(View.GONE);
                password.setVisibility(View.GONE);
                newPassword.setVisibility(View.VISIBLE);
                changeEmail.setVisibility(View.GONE);
                changePassword.setVisibility(View.VISIBLE);
                sendEmail.setVisibility(View.GONE);
                remove.setVisibility(View.GONE);
            }
        });

        changePassword.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressBar.setVisibility(View.VISIBLE);
                if (user != null && !newPassword.getText().toString().trim().equals("")) {
                    if (newPassword.getText().toString().trim().length() < 6) {
                        newPassword.setError("Password too short, enter minimum 6 characters");
                        progressBar.setVisibility(View.GONE);
                    } else {
                        user.updatePassword(newPassword.getText().toString().trim())
                                .addOnCompleteListener(new OnCompleteListener() {
                                    @Override
                                    public void onComplete(@NonNull Task task) {
                                        if (task.isSuccessful()) {
                                            Toast.makeText(MainActivity.this, "Password is updated, sign in with new password!", Toast.LENGTH_SHORT).show();
                                            signOut();
                                            progressBar.setVisibility(View.GONE);
                                        } else {
                                            Toast.makeText(MainActivity.this, "Failed to update password!", Toast.LENGTH_SHORT).show();
                                            progressBar.setVisibility(View.GONE);
                                        }
                                    }
                                });
                    }
                } else if (newPassword.getText().toString().trim().equals("")) {
                    newPassword.setError("Enter password");
                    progressBar.setVisibility(View.GONE);
                }
            }
        });

        btnSendResetEmail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                oldEmail.setVisibility(View.VISIBLE);
                newEmail.setVisibility(View.GONE);
                password.setVisibility(View.GONE);
                newPassword.setVisibility(View.GONE);
                changeEmail.setVisibility(View.GONE);
                changePassword.setVisibility(View.GONE);
                sendEmail.setVisibility(View.VISIBLE);
                remove.setVisibility(View.GONE);
            }
        });

        sendEmail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressBar.setVisibility(View.VISIBLE);
                if (!oldEmail.getText().toString().trim().equals("")) {
                    auth.sendPasswordResetEmail(oldEmail.getText().toString().trim())
                            .addOnCompleteListener(new OnCompleteListener() {
                                @Override
                                public void onComplete(@NonNull Task task) {
                                    if (task.isSuccessful()) {
                                        Toast.makeText(MainActivity.this, "Reset password email is sent!", Toast.LENGTH_SHORT).show();
                                        progressBar.setVisibility(View.GONE);
                                    } else {
                                        Toast.makeText(MainActivity.this, "Failed to send reset email!", Toast.LENGTH_SHORT).show();
                                        progressBar.setVisibility(View.GONE);
                                    }
                                }
                            });
                } else {
                    oldEmail.setError("Enter email");
                    progressBar.setVisibility(View.GONE);
                }
            }
        });

        btnRemoveUser.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressBar.setVisibility(View.VISIBLE);
                if (user != null) {
                    user.delete()
                            .addOnCompleteListener(new OnCompleteListener() {
                                @Override
                                public void onComplete(@NonNull Task task) {
                                    if (task.isSuccessful()) {
                                        Toast.makeText(MainActivity.this, "Your profile is deleted:( Create a account now!", Toast.LENGTH_SHORT).show();
                                        startActivity(new Intent(MainActivity.this, SignUpActivity.class));
                                        finish();
                                        progressBar.setVisibility(View.GONE);
                                    } else {
                                        Toast.makeText(MainActivity.this, "Failed to delete your account!", Toast.LENGTH_SHORT).show();
                                        progressBar.setVisibility(View.GONE);
                                    }
                                }
                            });
                }
            }
        });

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

    }

    //sign out method
    public void signOut() {
        auth.signOut();
    }

    @Override
    protected void onResume() {
        super.onResume();
        progressBar.setVisibility(View.GONE);
    }

    @Override
    public void onStart() {
        super.onStart();
        auth.addAuthStateListener(authListener);
    }

    @Override
    public void onStop() {
        super.onStop();
        if (authListener != null) {
            auth.removeAuthStateListener(authListener);
        }
    }
}




<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity">

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

        <android.support.design.widget.AppBarLayout
            android:id="@+id/appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay"
            app:elevation="0dp">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimaryDark"
                app:layout_scrollFlags="scroll|enterAlways"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

        </android.support.design.widget.AppBarLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingTop="@dimen/activity_vertical_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:paddingBottom="@dimen/activity_vertical_margin"
            app:layout_behavior="@string/appbar_scrolling_view_behavior">

            <EditText
                android:id="@+id/old_email"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/hint_email"
                android:inputType="textEmailAddress"
                android:maxLines="1"
                android:singleLine="true" />

            <EditText
                android:id="@+id/new_email"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/hint_new_email"
                android:inputType="textEmailAddress"
                android:maxLines="1"
                android:singleLine="true" />

            <EditText
                android:id="@+id/password"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:focusableInTouchMode="true"
                android:hint="@string/hint_password"
                android:imeActionId="@+id/login"
                android:imeOptions="actionUnspecified"
                android:inputType="textPassword"
                android:maxLines="1"
                android:singleLine="true"
                tools:ignore="InvalidImeActionId" />

            <EditText
                android:id="@+id/newPassword"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:focusableInTouchMode="true"
                android:hint="@string/new_pass"
                android:imeActionId="@+id/login"
                android:imeOptions="actionUnspecified"
                android:inputType="textPassword"
                android:maxLines="1"
                android:singleLine="true"
                tools:ignore="InvalidImeActionId" />


            <Button
                android:id="@+id/changeEmail"
                style="?android:textAppearanceSmall"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:background="@drawable/button_background"
                android:text="@string/btn_change"
                android:textColor="@android:color/white"
                android:textStyle="bold" />

            <Button
                android:id="@+id/changePass"
                style="?android:textAppearanceSmall"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:background="@drawable/button_background"
                android:text="@string/btn_change"
                android:textColor="@android:color/white"
                android:textStyle="bold" />

            <Button
                android:id="@+id/send"
                style="?android:textAppearanceSmall"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:background="@drawable/button_background"
                android:text="@string/btn_send"
                android:textColor="@android:color/white"
                android:textStyle="bold" />

            <ProgressBar
                android:id="@+id/progressBar"
                android:layout_width="30dp"
                android:layout_height="30dp"
                android:visibility="gone" />

            <Button
                android:id="@+id/remove"
                style="?android:textAppearanceSmall"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:background="@drawable/button_background"
                android:text="@string/btn_remove"
                android:textColor="@android:color/white"
                android:textStyle="bold" />

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:clipToPadding="false"
                android:gravity="center"
                android:orientation="horizontal">

                <FrameLayout
                    android:layout_width="160dp"
                    android:layout_height="wrap_content"
                    android:layout_margin="10.0dip"
                    android:clickable="true">

                    <LinearLayout
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:gravity="center"
                        android:orientation="vertical">

                        <Button
                            android:id="@+id/change_email_button"
                            style="?android:textAppearanceSmall"
                            android:layout_width="140dp"
                            android:layout_height="wrap_content"
                            android:background="@drawable/button_background"
                            android:text="@string/change_email"
                            android:textColor="@android:color/white"
                            android:textStyle="bold" />

                    </LinearLayout>

                </FrameLayout>

                <FrameLayout
                    android:layout_width="160dp"
                    android:layout_height="wrap_content"
                    android:layout_margin="10.0dip"
                    android:clickable="true">

                    <LinearLayout
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:gravity="center"
                        android:orientation="vertical">

                        <Button
                            android:id="@+id/change_password_button"
                            style="?android:textAppearanceSmall"
                            android:layout_width="140dp"
                            android:layout_height="wrap_content"
                            android:background="@drawable/button_background"
                            android:text="@string/change_password"
                            android:textColor="@android:color/white"
                            android:textStyle="bold" />

                    </LinearLayout>

                </FrameLayout>

            </LinearLayout>

            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:clipToPadding="false"
                android:gravity="center"
                android:orientation="horizontal">

                <FrameLayout
                    android:layout_width="160dp"
                    android:layout_height="wrap_content"
                    android:layout_margin="10.0dip"
                    android:clickable="true">

                    <LinearLayout
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:gravity="center"
                        android:orientation="vertical">

                        <Button
                            android:id="@+id/sending_pass_reset_button"
                            style="?android:textAppearanceSmall"
                            android:layout_width="140dp"
                            android:layout_height="wrap_content"
                            android:background="@drawable/button_background"
                            android:text="@string/send_password_reset_email"
                            android:textColor="@android:color/white"
                            android:textStyle="bold" />

                    </LinearLayout>

                </FrameLayout>

                <FrameLayout
                    android:layout_width="160dp"
                    android:layout_height="wrap_content"
                    android:layout_margin="10.0dip"
                    android:clickable="true">

                    <LinearLayout
                        android:layout_width="fill_parent"
                        android:layout_height="fill_parent"
                        android:gravity="center"
                        android:orientation="vertical">

                        <Button
                            android:id="@+id/remove_user_button"
                            style="?android:textAppearanceSmall"
                            android:layout_width="140dp"
                            android:layout_height="wrap_content"
                            android:background="@drawable/button_background"
                            android:text="@string/remove_user"
                            android:textColor="@android:color/white"
                            android:textStyle="bold" />

                    </LinearLayout>

                </FrameLayout>

            </LinearLayout>

            <Button
                android:id="@+id/sign_out"
                style="?android:textAppearanceSmall"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:background="@drawable/button_background"
                android:text="@string/btn_sign_out"
                android:textColor="@android:color/white"
                android:textStyle="bold" />

        </LinearLayout>

    </LinearLayout>

</ScrollView>



11. Yang terakhir buat activity bernama ResetPasswordActivity.java dan tambahkan kode berikut ke layout activity_reset_password.xml :


package com.azhar.loginfirebase;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;

/**
 * Created by Azhar Rivaldi on 26/03/2018.
 */

public class ResetPasswordActivity extends AppCompatActivity {

    private EditText inputEmail;
    private Button btnBack;
    private FirebaseAuth auth;
    private ProgressBar progressBar;
    private ImageButton btnReset;

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

        inputEmail = (EditText) findViewById(R.id.email);
        btnReset = (ImageButton) findViewById(R.id.btn_reset_password);
        btnBack = (Button) findViewById(R.id.btn_back);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);

        auth = FirebaseAuth.getInstance();

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

        btnReset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String email = inputEmail.getText().toString().trim();

                if (TextUtils.isEmpty(email)) {
                    Toast.makeText(getApplication(), "Enter your registered email", Toast.LENGTH_SHORT).show();
                    return;
                }

                progressBar.setVisibility(View.VISIBLE);
                auth.sendPasswordResetEmail(email)
                        .addOnCompleteListener(new OnCompleteListener() {
                            @Override
                            public void onComplete(@NonNull Task task) {
                                if (task.isSuccessful()) {
                                    Toast.makeText(ResetPasswordActivity.this, "We have sent you instructions to reset your password!", Toast.LENGTH_SHORT).show();
                                } else {
                                    Toast.makeText(ResetPasswordActivity.this, "Failed to send reset email!", Toast.LENGTH_SHORT).show();
                                }

                                progressBar.setVisibility(View.GONE);
                            }
                        });
            }
        });
    }

}




<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background_login"
    tools:context=".ResetPasswordActivity">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:minHeight="?attr/actionBarSize"
        android:theme="?attr/actionBarTheme"
        android:layout_alignParentLeft="true">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="RESET PASSWORD"
            android:textStyle="bold"
            android:textColor="#ffff"
            android:textSize="20sp"
            android:textAlignment="center"
            />
    </android.support.v7.widget.Toolbar>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/toolbar"
        android:orientation="vertical"
        android:layout_centerHorizontal="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_marginStart="20dp"
            android:layout_marginEnd="20dp"
            android:orientation="vertical"
            android:layout_height="wrap_content"
            android:layout_marginBottom="20dp"
            android:gravity="center"
            android:background="@drawable/layout_background">

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="360dp"
                android:layout_marginBottom="100dp"
                android:orientation="vertical">

                <ImageView
                    android:layout_width="@dimen/logo_w_h"
                    android:layout_height="@dimen/logo_w_h"
                    android:layout_gravity="center_horizontal"
                    android:src="@mipmap/ic_launcher" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
                    android:text="@string/lbl_forgot_password"
                    android:textColor="@color/colorPrimary"
                    android:textSize="20dp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:gravity="center_horizontal"
                    android:padding="@dimen/activity_horizontal_margin"
                    android:text="@string/forgot_password_msg"
                    android:textColor="@color/colorPrimary"
                    android:textSize="14dp" />

                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:drawableLeft="@drawable/ic_mail_outline_black_24dp"
                    android:layout_marginEnd="20dp"
                    android:id="@+id/email"
                    android:layout_marginStart="20dp"
                    android:textSize="14sp"
                    android:drawablePadding="10dp"
                    android:hint="EMAIL"
                    android:padding="20dp"
                    android:textColorHint="#606060"
                    android:inputType="textEmailAddress"/>

                <ImageButton
                    android:layout_width="50dp"
                    android:layout_height="50dp"
                    android:layout_gravity="end"
                    android:id="@+id/btn_reset_password"
                    android:layout_marginTop="30dp"
                    android:src="@drawable/ic_arrow_forward_black_24dp"
                    android:background="@drawable/button_background"
                    android:layout_marginRight="30dp" />


            </LinearLayout>

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

                <Button
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center"
                    android:layout_marginLeft="40dp"
                    android:layout_marginRight="40dp"
                    android:layout_marginBottom="20dp"
                    android:id="@+id/btn_back"
                    android:background="@drawable/button_background"
                    android:text="@string/btn_back"
                    android:textColor="@android:color/white" />

                <ProgressBar
                    android:id="@+id/progressBar"
                    android:layout_width="30dp"
                    android:layout_height="30dp"
                    android:layout_gravity="center|bottom"
                    android:layout_marginBottom="20dp"
                    android:visibility="gone" />

            </LinearLayout>

        </LinearLayout>

    </LinearLayout>

</RelativeLayout>
Untuk file yang kurang, kalian bisa mengunduhnya melalui Github saya DISINI. Jangan lupa subscribe channel youtube saya Azhar Rivaldi, karena disana juga banyak sekali tutorial-tutorial yang tidak saya bagikan di blog ini.
Silahkan kalian RUN. Ini adalah hasil permintaan ganti kata sandi yang akan diterima pengguna jika menekan tombol Reset Password di menu main :
Reset Password
Reset Password
Jika kalian mengikuti langkah-langkah diatas dengan baik, pasti aplikasi yang kalian buat akan berjalan sebagaimana mestinya. Namun jika mengalami Error, silahkan berikan kometar dan kita diskusikan bersama. Nah sekarang kalian memiliki dasar-dasar untuk membuat aplikasi login / register sederhana dengan Firebase. Silahkan kalian kembangkan lagi dan terus bereksperimen ya😎.

Demikian informasi yang saya bagikan untuk kalian. Jangan lupa bagikan artikel ini ke teman-teman kalian agar ikut membaca Tutorial Login, Register dan Forgot Password dengan Firebase menggunakan Android Studio ini. Subscribe juga di blog Rivaldi 48 ini agar kalian mendapatkan notifikasi saat Admin update artikel terbaru. Follow Instagram Admin @azhardvls_. Semoga kalian lebih nyaman dan mudah dalam mengakses Blog Rivaldi 48 dimanapun kalian berada. Terima Kasih...