Tuesday, October 31, 2017

[Tutorial] Android Flipboard BottomSheet

October 31, 2017 0 Comments
Assalamualaikum Warahmatullah... Halo temen-temen semuanya... balik lagi nih bersama saya Ramadhany si programmer ganteng... Oke temen-temen, kali ini saya akan membagi tutorial tentang "Android Flipboard ButtomSheet".... Temen-temen semua penasaran kan sama tutorial ini.... Oke langsung saja kita masuk ke tutorial 
nya....



Pertama

Buatlah project baru dengan nama Flipboard BottomSheet.... Lalu pilih saja yang Empety Activity.... Lalu setelah itu tekan Finish...

Kedua

Sebelum masuk ke codingan.... Langkah pertama kita masukan dulu gradle dependencies nya... Tambahkan 2 repository ini....

Ketiga

Setelah kalian sudah menambahkan 2 repository yang tadi... Langkah selanjutnya adalah kita buat layouting nya terlebih dahulu.... Buka layout activity_main.xml lalu tambahkan 2 buah button di dalam layout tersebut

Keempat

Buatlah layout baru lagi... Yaitu layout costum_view.xml.... Di sini kita akan membuka layout custom dengan BottomSheet....

Kelima

Setelah kita tadi sudah selesai layouting nya... Langkah selanjutnya adalah kita masuk ke codingan java nya... Buka MainActivity.java.... Dibawah ini adalah kode lengkap di Activity MainActivity.java....


Bila Sudah selesai semua di lengkapi code nya... Langkah terakhir adalah Running aplikiasi kita... Berikut adalah hasil Running yang sudah di jalankan


Ketika Button Custom View di clik... Akan muncul seperti ini...
Halaman ini muncul ketika button Expand This View di klik


Ketika Button Open Intent di klik... Nanti akan muncul Share konten seperti ini...



Bila ada yang ingin di tanyakan.. Silahkan hubungi saya melalui kontak di bawah ini

Wa : 081322579702 - 085776744756
Fb : Ramadhany As-Salafy
Ig : ramadhany_12
Line : rikat_homreh2 Mungkin cukup sekian yang bisa saya sampaikan pada hari ini.... Semoga bisa bermanfaat bagi saya dan kita semua Amin... Apabila ada kesalahan kata mohon di maafkan... Karena kesalahan itu datang nya dari Syaitan dan Kebaikan itu datang nya dari Allah Ta'ala... Sekaian Dari saya Wasslamualaikum Warahmarullah

[Tutorial] Android Image ListView Menggunakan CardView

October 31, 2017 5 Comments
Assalamualaikum Warahmatullah... Halo temen-temen... balik lagi bersama saya Ramadhany si programmer ganteng... Oke temen-temen, kali ini saya akan membagi tutorial tentang "Android ListView Tutorial Menggunakan CardView"....  Sebelum masuk tutorial... apa kalian tau apa itu ListView??? List view adalah widget untuk menampilkan data dalam bentuk list yang dapat di-scroll. Karena ukuran layar smartphone terbatas dan cenderung portrait, listview merupakan salah satu widget terpenting dan paling sering digunakan untuk menampilkan kelompok informasi.


Kita akan membuat ListView Image, yang berisi text dan juga gambar

Sebelum masuk ke project.... Download terlebih dahulu file gambar buah nya... klik link ini untuk mendownload file gambar buah Download Gambar Buah Png

Pertama 

Buka android studio kalian dan buatlah projet baru... Beri nama project sesuai dengan keinginan kalian... Sebagai contoh saya beri nama project nya dengan ListViewBuah... Pilih yang Empty Activity saja, lalu finish 

Kedua

Tambahkan dependencies baru... yaitu tambahkan repository CardView nya


Ketiga

Buka terlebih dahulu layout activity_main.xml... Lalu tambahkan widget ListView nya terlebih dahulu.... 



Keempat

Setelah di tambahkan widget nya... Langkah selanjut nya adalah buat layout baru.... layout ini berfungsi untuk menampilkan listnya nanti.... beri nama layout dengan list_buah.xml


Kelima

Buat array list nya di MainActivity.java... Untuk menampung data-data sementara... Dan juga deklarasikan widget ListView yang ada di layout activity_main.xml



Keenam

Kenalkan widget ListView dan buat sebuah adapter.... Adapter ini berfungsi untuk menampung data sementara sebelum di tampilkan ke dalam list view... Berikut adalah code nya di MainActivity.java


Ketujuh

Selanjutnya adalah, membuat class Adapter... Kita buat class adapter nya di dalam class MainActivity.java... Berikut kode nya



Kedelapan

Lalu buat lah method untuk memaggil layout list_buah.xml dan juga mengenalkan widget yang ada di layout tersebut... Berikut Code nya....



Kesembilan

Setelah kita tadi sudah membuat list nya... Sekarang kita buat detail list nya... Jadi nanti list nya itu bisa di klik... Buat Activity baru.... Beri nama dengan DetailActivity.java... 



Final Code

Inillah code lengkap dari Activity MainActivity.java



Setelah sudah semuanya di lengkapi kode-kode nya... Maka langkah terakhir yang harus di lakukan adalah menjalankan aplikasi yang sudah di buat tadi... Berikut adalah hasil  gambar dari aplikasi ini

 List Buah

Detail Buah


Mungkin cukup sekian yang bisa saya sampaikan pada hari ini.... Semoga bisa bermanfaat bagi saya dan kita semua Amin... Apabila ada kesalahan kata mohon di maafkan... Karena kesalahan itu datang nya dari Syaitan dan Kebaikan itu datang nya dari Allah Ta'ala... Sekaian Dari saya Wasslamualaikum Warahmarullah

Wednesday, October 25, 2017

[Tutorial] Android Kamera

October 25, 2017 0 Comments
Assalamualaikum Warahmatullah... Halo temen-temen... balik lagi bersama saya Ramadhany si programmer ganteng... Nah guys kali ini saya akan membagi tutorial tentang "Tutorial Androd Kamre"... Oke langsung saja kita masuk ke tutorialnya.... Jangan lupa android studio nya harus sudah dibuka terlebih dahulu... kalo gak di buka.. nanti ngoding nya di mana?? 😂😂



Pertama

Buatlah project baru di android studio kalian... Beri nama project sesuai keinginan kalian... Sebagai contoh saya memberi nama project saya dengan nama "Android Kamera".....

Kedua

Setelah dibuat, tunggu dulu sampa proses gradle project selesai, setelah gradle selesai... Setelah itu, buka AndroidManifests.xml nya, tambahkan fitur untuk kamera nya dan juga tambahkan permission nya

<!-- Accessing camera hardware -->
    <uses-feature android:name="android.hardware.camera" />

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

Ketiga

Lalu kita lanjut layouting nya di layout activity_main.xml... Jangan lupa, layout nya kita ganti dengan LinearLayout dan orientation vertical.... Dant tambahkan komponen-komponen berkut ini... Kita menambhkan 2 fitur... yaitu untuk camera untuk hasil foto dan juga untuk vidio view....

<LinearLayout
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:gravity="center"
        android:orientation="vertical" >

        <!-- Capture picture button -->
        <Button
            android:id="@+id/btnCapturePicture"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Ambil Foto"
            android:layout_marginBottom="10dp"/>

        <!-- Record video button -->
        <Button
            android:id="@+id/btnRecordVideo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Rekam Vidio" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:orientation="vertical"
        android:padding="10dp">

        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Preview"
            android:padding="10dp"
            android:textSize="15dp"/>

        <!-- To display picture taken -->
        <ImageView
            android:id="@+id/imgPreview"
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:visibility="gone" />

        <!-- To preview video recorded -->
        <VideoView
            android:id="@+id/videoPreview"
            android:layout_width="wrap_content"
            android:layout_height="400dp"
            android:visibility="gone" />
    </LinearLayout>

Inilah hasil penambahan widget pada activity_main.xml





Keempat

 A. Setelah itu kita buka MainActivity.java.... Lalu copy code ini di atas methode onCreate...

 // Activity request codes
        private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
        private static final int CAMERA_CAPTURE_VIDEO_REQUEST_CODE = 200;
        public static final int MEDIA_TYPE_IMAGE = 1;
        public static final int MEDIA_TYPE_VIDEO = 2;

        // directory name to store captured images and videos
        private static final String IMAGE_DIRECTORY_NAME = "Hello Camera";

        private Uri fileUri; // file url to store image/video

        // widget-widget layout activity_main.xml
        private ImageView imgPreview;
        private VideoView videoPreview;
        private Button btnCapturePicture, btnRecordVideo;

 B. Selanjutnya adalah kenalkan widget-widget yang ada di layout activty_main.xml..... 

     imgPreview = (ImageView) findViewById(R.id.imgPreview);
                           videoPreview = (VideoView) findViewById(R.id.videoPreview);
                           btnCapturePicture = (Button) findViewById(R.id.btnCapturePicture);

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


 C. Setelah di kenalkan widget nya, langkah selanjutnya adalah berikan button nya action untuk membuka           kamera nya

 /**
             * Capture image button click event
             */
            btnCapturePicture.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // capture picture
                    captureImage();
                }
            });

            /**
             * Record video button click event
             */
            btnRecordVideo.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // record video
                    recordVideo();
                }
            });


 D. Langkah selanjutnya adalah, kita cek dulu apakah kamera tersedia di android nya atau tidak, dan kita periksa apakan si android ini memiliki kamera atau tidak

// Checking camera availability
            if (!isDeviceSupportCamera()) {
                Toast.makeText(getApplicationContext(),
                        "Sorry! Your device doesn't support camera",
                        Toast.LENGTH_LONG).show();
                // will close the app if the device does't have camera
                finish();
            }
        }

        /**
         * Checking device has camera hardware or not
         */
        private boolean isDeviceSupportCamera() {
            if (getApplicationContext().getPackageManager().hasSystemFeature(
                    PackageManager.FEATURE_CAMERA)) {
                // this device has a camera
                return true;
            } else {
                // no camera on this device
                return false;
            }
        }


 E. Selanjutnya adalah kode untuk menangkap gambar kamera akan memanfaatkan pengambilan gambar kamera terbaik dan Di sini kita menyimpan file url karena akan null setelah kembali dari aplikasi kamera

/** * Capturing Camera Image will lauch camera app requrest image capture */ private void captureImage() { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // start the image capture Intent startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE); } /** * Here we store the file url as it will be null after returning from camera * app */ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // save file url in bundle as it will be null on scren orientation // changes outState.putParcelable("file_uri", fileUri); }

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

            // get the file url
            fileUri = savedInstanceState.getParcelable("file_uri");
        }

 F. Selanjutnya adalah Bikin method untuk recording vidio... 

 private void recordVideo() {
            Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

            fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO);

            // set video quality
            intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);

            intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file
            // name

            // start the video capture Intent
            startActivityForResult(intent, CAMERA_CAPTURE_VIDEO_REQUEST_CODE);
        }


 G. Stelah membuat method recordVidio(), langkah selanjut nya adalah menerima method hasil aktivitas akan dipanggil setelah menutup kamera... Berikut adalah code nya

/**
         * Receiving activity result method will be called after closing the camera
         */
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            // if the result is capturing Image
            if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
                if (resultCode == RESULT_OK) {
                    // successfully captured the image
                    // display it in image view
                    previewCapturedImage();
                } else if (resultCode == RESULT_CANCELED) {
                    // user cancelled Image capture
                    Toast.makeText(getApplicationContext(),
                            "User cancelled image capture", Toast.LENGTH_SHORT)
                            .show();
                } else {
                    // failed to capture image
                    Toast.makeText(getApplicationContext(),
                            "Sorry! Failed to capture image", Toast.LENGTH_SHORT)
                            .show();
                }
            } else if (requestCode == CAMERA_CAPTURE_VIDEO_REQUEST_CODE) {
                if (resultCode == RESULT_OK) {
                    // video successfully recorded
                    // preview the recorded video
                    previewVideo();
                } else if (resultCode == RESULT_CANCELED) {
                    // user cancelled recording
                    Toast.makeText(getApplicationContext(),
                            "User cancelled video recording", Toast.LENGTH_SHORT)
                            .show();
                } else {
                    // failed to record video
                    Toast.makeText(getApplicationContext(),
                            "Sorry! Failed to record video", Toast.LENGTH_SHORT)
                            .show();
                }
            }
        }


 H. Selanjutnya adalah, Kita tampilkan gambar ke dalam image view... Berikut adalah kodingan nya

/**
         * Display image from a path to ImageView
         */
        private void previewCapturedImage() {
            try {
                // hide video preview
                videoPreview.setVisibility(View.GONE);

                imgPreview.setVisibility(View.VISIBLE);

                // bimatp factory
                BitmapFactory.Options options = new BitmapFactory.Options();

                // downsizing image as it throws OutOfMemory Exception for larger
                // images
                options.inSampleSize = 8;

                final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(),
                        options);

                imgPreview.setImageBitmap(bitmap);
            } catch (NullPointerException e) {
                e.printStackTrace();
            }
        }


 I. Setalah kita menampilkan foto ke image view, selanjutnya adalah kita tinjau rekaman vidio yang di rekam

/**
         * Previewing recorded video
         */
        private void previewVideo() {
            try {
                // hide image preview
                imgPreview.setVisibility(View.GONE);

                videoPreview.setVisibility(View.VISIBLE);
                videoPreview.setVideoPath(fileUri.getPath());
                // start playing
                videoPreview.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }


 J. Selanjutnya adalah, helper method, metode berikut di kelas aktivitas utama Anda. Metode ini membantu dalam membuat dan mendapatkan file dari kartu SD.

/**
         * Creating file uri to store image/video
         */
        public Uri getOutputMediaFileUri(int type) {
            return Uri.fromFile(getOutputMediaFile(type));
        }

        /**
         * returning image / video
         */
        private static File getOutputMediaFile(int type) {

            // External sdcard location
            File mediaStorageDir = new File(
                    Environment
                            .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                    IMAGE_DIRECTORY_NAME);

            // Create the storage directory if it does not exist
            if (!mediaStorageDir.exists()) {
                if (!mediaStorageDir.mkdirs()) {
                    Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create "
                            + IMAGE_DIRECTORY_NAME + " directory");
                    return null;
                }
            }

            // Create a media file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
                    Locale.getDefault()).format(new Date());
            File mediaFile;
            if (type == MEDIA_TYPE_IMAGE) {
                mediaFile = new File(mediaStorageDir.getPath() + File.separator
                        + "IMG_" + timeStamp + ".png");
            } else if (type == MEDIA_TYPE_VIDEO) {
                mediaFile = new File(mediaStorageDir.getPath() + File.separator
                        + "VID_" + timeStamp + ".mp4");
            } else {
                return null;
            }

            return mediaFile;
        }


Berikut ini adalah kode lengkap pada MainActivity.java.....

import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.VideoView;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {

        // Activity request codes
        private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
        private static final int CAMERA_CAPTURE_VIDEO_REQUEST_CODE = 200;
        public static final int MEDIA_TYPE_IMAGE = 1;
        public static final int MEDIA_TYPE_VIDEO = 2;

        // directory name to store captured images and videos
        private static final String IMAGE_DIRECTORY_NAME = "Hello Camera";

        private Uri fileUri; // file url to store image/video

        private ImageView imgPreview;
        private VideoView videoPreview;
        private Button btnCapturePicture, btnRecordVideo;

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

            imgPreview = (ImageView) findViewById(R.id.imgPreview);
            videoPreview = (VideoView) findViewById(R.id.videoPreview);
            btnCapturePicture = (Button) findViewById(R.id.btnCapturePicture);
            btnRecordVideo = (Button) findViewById(R.id.btnRecordVideo);

            /**
             * Capture image button click event
             */
            btnCapturePicture.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // capture picture
                    captureImage();
                }
            });

            /**
             * Record video button click event
             */
            btnRecordVideo.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    // record video
                    recordVideo();
                }
            });

            // Checking camera availability
            if (!isDeviceSupportCamera()) {
                Toast.makeText(getApplicationContext(),
                        "Sorry! Your device doesn't support camera",
                        Toast.LENGTH_LONG).show();
                // will close the app if the device does't have camera
                finish();
            }
        }

        /**
         * Checking device has camera hardware or not
         */
        private boolean isDeviceSupportCamera() {
            if (getApplicationContext().getPackageManager().hasSystemFeature(
                    PackageManager.FEATURE_CAMERA)) {
                // this device has a camera
                return true;
            } else {
                // no camera on this device
                return false;
            }
        }

        /**
         * Capturing Camera Image will lauch camera app requrest image capture
         */
        private void captureImage() {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

            fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);

            intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);

            // start the image capture Intent
            startActivityForResult(intent, CAMERA_CAPTURE_IMAGE_REQUEST_CODE);
        }

        /**
         * Here we store the file url as it will be null after returning from camera
         * app
         */
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);

            // save file url in bundle as it will be null on scren orientation
            // changes
            outState.putParcelable("file_uri", fileUri);
        }

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

            // get the file url
            fileUri = savedInstanceState.getParcelable("file_uri");
        }

        /**
         * Recording video
         */
        private void recordVideo() {
            Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

            fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO);

            // set video quality
            intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);

            intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file
            // name

            // start the video capture Intent
            startActivityForResult(intent, CAMERA_CAPTURE_VIDEO_REQUEST_CODE);
        }

        /**
         * Receiving activity result method will be called after closing the camera
         */
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            // if the result is capturing Image
            if (requestCode == CAMERA_CAPTURE_IMAGE_REQUEST_CODE) {
                if (resultCode == RESULT_OK) {
                    // successfully captured the image
                    // display it in image view
                    previewCapturedImage();
                } else if (resultCode == RESULT_CANCELED) {
                    // user cancelled Image capture
                    Toast.makeText(getApplicationContext(),
                            "User cancelled image capture", Toast.LENGTH_SHORT)
                            .show();
                } else {
                    // failed to capture image
                    Toast.makeText(getApplicationContext(),
                            "Sorry! Failed to capture image", Toast.LENGTH_SHORT)
                            .show();
                }
            } else if (requestCode == CAMERA_CAPTURE_VIDEO_REQUEST_CODE) {
                if (resultCode == RESULT_OK) {
                    // video successfully recorded
                    // preview the recorded video
                    previewVideo();
                } else if (resultCode == RESULT_CANCELED) {
                    // user cancelled recording
                    Toast.makeText(getApplicationContext(),
                            "User cancelled video recording", Toast.LENGTH_SHORT)
                            .show();
                } else {
                    // failed to record video
                    Toast.makeText(getApplicationContext(),
                            "Sorry! Failed to record video", Toast.LENGTH_SHORT)
                            .show();
                }
            }
        }

        /**
         * Display image from a path to ImageView
         */
        private void previewCapturedImage() {
            try {
                // hide video preview
                videoPreview.setVisibility(View.GONE);

                imgPreview.setVisibility(View.VISIBLE);

                // bimatp factory
                BitmapFactory.Options options = new BitmapFactory.Options();

                // downsizing image as it throws OutOfMemory Exception for larger
                // images
                options.inSampleSize = 8;

                final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(),
                        options);

                imgPreview.setImageBitmap(bitmap);
            } catch (NullPointerException e) {
                e.printStackTrace();
            }
        }

        /**
         * Previewing recorded video
         */
        private void previewVideo() {
            try {
                // hide image preview
                imgPreview.setVisibility(View.GONE);

                videoPreview.setVisibility(View.VISIBLE);
                videoPreview.setVideoPath(fileUri.getPath());
                // start playing
                videoPreview.start();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        /**
         * ------------ Helper Methods ----------------------
         * */

        /**
         * Creating file uri to store image/video
         */
        public Uri getOutputMediaFileUri(int type) {
            return Uri.fromFile(getOutputMediaFile(type));
        }

        /**
         * returning image / video
         */
        private static File getOutputMediaFile(int type) {

            // External sdcard location
            File mediaStorageDir = new File(
                    Environment
                            .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                    IMAGE_DIRECTORY_NAME);

            // Create the storage directory if it does not exist
            if (!mediaStorageDir.exists()) {
                if (!mediaStorageDir.mkdirs()) {
                    Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create "
                            + IMAGE_DIRECTORY_NAME + " directory");
                    return null;
                }
            }

            // Create a media file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
                    Locale.getDefault()).format(new Date());
            File mediaFile;
            if (type == MEDIA_TYPE_IMAGE) {
                mediaFile = new File(mediaStorageDir.getPath() + File.separator
                        + "IMG_" + timeStamp + ".png");
            } else if (type == MEDIA_TYPE_VIDEO) {
                mediaFile = new File(mediaStorageDir.getPath() + File.separator
                        + "VID_" + timeStamp + ".mp4");
            } else {
                return null;
            }

            return mediaFile;
        }

    }

Ketika semua kode sudah komplit... Maka yang terakhir adalah tinggal run aplikasinya...

Berikut adalah hasil running aplikasinya

 a. hasil menambahkan foto


 b. Hasil menambahkan vidio....



Mungkin cukup sekian yang bisa saya sampaikan pada hari ini.... Semoga bisa bermanfaat bagi saya dan kita semua Amin... Apabila ada kesalahan kata mohon di maafkan... Karena kesalahan itu datang nya dari Syaitan dan Kebaikan itu datang nya dari Allah Ta'ala... Sekaian Dari saya Wasslamualaikum Warahmarullah







Tuesday, October 24, 2017

[Tutorial] Cara Push Project Android Studio Ke GitLab

October 24, 2017 0 Comments
Assalamualaikum Warahmatullah... Halo temen-temen... balik lagi bersama saya Ramadhany si programmer ganteng... Nah guys kali ini saya akan membagi tutorial tentang "Cara Push Project Android Studio Ke GitLab" Sebelum kalian masuk ke tutorial ini.. Kalian harus tau apa pengertian dari GitLab... Kalo kalian belum tau kalian bisa mengunjungi artikel berikut Pengertian GitLab Dan Tutorial Cara Membuat Project GitLab Dengan Mudah..... Kalo sudah paham, kalian bisa mengikuti tutorial ini.....






Oke kita langsung masuk ke tutorial nya.... 


Pertama

Buka GitLab Bash kalian.... nanti setelah di buka, akan muncul seperti ini


Kedua

Kalian Clone terlebih dahulu project anda di git bash anda

Ketiga

Buatlah folder dengan nama project gitlab anda.... Di sini saya memberi nama folder dengan LatihanPertamaKu

Keempat

setelah di clone dan buat project, langkah selanjunya adalah kalian masuk ke folder project gitlab dengan git bash kalian,


Bila sudah seperti ini berati tandanya anda sudah masuk ke folder project anda

Kelima

copy project Android Studio anda ke dalam folder yang sudah kamu buat tadi...



Keenam

kalian add folder tadi ke dalam project gitlab nya... 

A. add terlebih dahulu folder nya... berikut adalah perintah untuk add folder ke project


git add Latihan1

Ini hasil ketika sudah add folder project android studio kalian

B.  Setelah di add, langkah selanjutnya yaitu kita commit terlebih dahulu project nya, berikut adalah perintah nya


git commit -m "add Project Latihan1"

Jika sudah seperti ini, berati itu tandanya kalian berhasil commit project android studio kalian

C. Langkah terakhir adalah kalian tinggal push project android studio nya... Berikut adalah perintah untuk push di dalam gitlab



git push -u origin master



kalau sudah seperti ini.. Berati anda sudah berhasil push project android studio anda ke dalam gitlab

Keenam

Langkah terakhir yaitu tinggal anda cek.. Apakah project android studio anda sudah tersimpan di gitlab atau belum... Coba lihat di project GitLab anda kemudian Refresh halaman project anda... Bila sudah di Refresh halaman project akan berubah seperti ini





Mungkin cukup sekian yang bisa saya sampaikan pada hari ini.... Semoga bisa bermanfaat bagi saya dan kita semua Amin... Apabila ada kesalahan kata mohon di maafkan... Karena kesalahan itu datang nya dari Syaitan dan Kebaikan itu datang nya dari Allah Ta'ala... Sekaian Dari saya Wasslamualaikum Warahmarullah




Monday, October 23, 2017

[Tutorial] Pengertian GitLab Dan Tutorial Cara Membuat Project GitLab Dengan Mudah

October 23, 2017 3 Comments
Assalamualaikum Warahmatullah... Halo temen-temen... balik lagi bersama saya Ramadhany si programmer ganteng... Nah guys kali ini saya akan membagi tutorial tentang "Cara Membuat Projek di GitLab".... Sebelum masuk ke tutorial saya akan menjelaskan apa pengertian dari gitlab...



GitLab adalah sebuah manajer repositori Git berbasis web dengan fitur wiki dan pelacakan masalah, menggunakan lisensi sumber terbuka, dikembangkan oleh GitLab Inc. Perangkat lunak ini ditulis oleh Dmitriy Zaporozhets dan Valery Sizov... Mereka berdua berasal dari Ukraina....
sebuah software pengelola repository git yang cepat,aman dan handal. Ynag di tuliskan  dalam Ruby on rails dan gitolie

Menurut laporan pada Desember 2016,Gitlab telah memiliki 150 anggota tim dan lebih dari 1.400 proyek open source yang telah berkontribusi dari berbagi organisasi yaitu IBM,sony,nasa.
Gitlab 6.5.0 kali ini mendapatkan upgrade Bootstrap dari versi 2 ke versi 3, sehingga tampilan responsive-nya semakin matang dan lebih segar dari sebelumnya. Selain itu, versi 6.5.0 juga memperkenalkan fasilitas comment dengan AJAX, kemampuan mengubah penanggungjawab “issue” dan milestone sebuah repo.

Gimana....?? Sudah paham belum apa itu GitLab?? Pasti sudah kan?? Hehehe 😀😀

Oke, Langsung saja kita masuk Ke tutorial...

Membuat Project Pertama di GitLab

Pertama

Kalian sudah bikin akun GitLab nya belum.... Kalo belum kalian bisa daftar di sini....


Ini adalah halaman ketika Daftar GitLab

Kedua

Setelah kalian daftar... Langsung login saja ke GitLab... Dan ini adalah tampilan Home GitLab... Lalu langsung saja tekan tombol "New Project"



Ketiga

Setelah klik tombol "New Project" kalian akan masuk ke halaman ini.. disini anda di minta untuk memberi nama projek anda... Sebagai contoh, Saya akan memberi nama project saya dengan "LatihanPertamaKu"....  Kalau kalian ingin memberi deskripsi pada project anda silahkan saja...
Lalu Tekan tombol "Create Project"


Keempat

Setelah kalian membuat project baru..... akan muncul tampilan project anda seperti ini



Kelima

Ketika kalian membuat project baru di GitLab, kalian akan dapat perintah-perintah untuk membuat Repository baru... Di bawah ini adalah Command Line Instructions GitLab

// untuk login kedalam gitlab melalui command line gitlab bash
Git global setup

git config --global user.name "Ramadhany"
git config --global user.email "mang.benta@gmail.com"

// membuat repository baru
Create a new repository

git clone https://gitlab.com/Rama_LFC/LatihanPertamaKu.git
cd LatihanPertamaKu
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master

// keluar dari folder
Existing folder

cd existing_folder
git init
git remote add origin https://gitlab.com/Rama_LFC/LatihanPertamaKu.git
git add .
git commit -m "Initial commit"
git push -u origin master

// keluar dari repository git
Existing Git repository

cd existing_repo
git remote add origin https://gitlab.com/Rama_LFC/LatihanPertamaKu.git
git push -u origin --all
git push -u origin --tags


Mungkin cukup sekian yang bisa saya sampaikan pada hari ini.... Semoga bisa bermanfaat bagi saya dan kita semua Amin... Apabila ada kesalahan kata mohon di maafkan... Karena kesalahan itu datang nya dari Syaitan dan Kebaikan itu datang nya dari Allah Ta'ala... Sekaian Dari saya Wasslamualaikum Warahmarullah
























Wednesday, October 18, 2017

[Tutorial] Cara Login Dan Register Menggunakan Retrofit2 Dan API Server Di Android

October 18, 2017 6 Comments

Assalamualaikum Warahmatullah..  

Halo temen-temen, kembali lagi bersama saya Ramadhany si programmer ganteng.. Ok temen-temen, sekarang saya mau membagi ilmu lagi yaitu tentang "Cara Login Dan Register Menggunakan Retrofit2 Dan API Server Di Android". Isi dari tutorial ini adalah jadi si user ini bisa login dan juga register yang data nya itu akan di simpan di server. Didalam Retrofit2 ini kalian bisa request ke API dengan method POST, GET, DELETE, UPDATE dan lain-lain. Dan kalo misalkan kalian masih bingung tentang retrofit, kalian bisa mengunjungi situs resmi retrofit nya   Situs Retrofit.... Oke langsung aja kita mulai saja



Pertama

Langkah yang pertama adalah siapkan dulu API Login dan registernya. Apabila kalian belum punya API nya, kalian bisa kunjingi tutorial ini terlebih dahulu..  Membuat API Login dan Register Dengan PHP MySQL

Kedua 

Buka Android Studio kalian, lalu buat lah project baru sesuai dengan keinginan kalian. Sebagai contoh saya memberi nama project saya dengan "Latihan1"

Ketiga

Buat EmptyActivity Seperti biasa, Lalu buat MainActivity.java nya. Lalu tekan Finish.

Keempat

Lalu langkah selanjut nya adalah buatlah sturktur seperti di bawah ini.


Kelima

Bukalah AndroidManifests.xml nya lalu tambahkan user permission Internet nya seperti di bawah ini

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

Keenam

Buka layout activity_daftar.xml lalu tambahkan widget-widget seperti di bawah ini


'<TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Register Activity"
        android:textSize="30sp"
        tools:layout_editor_absoluteX="102dp"
        android:textStyle="bold"
        tools:layout_editor_absoluteY="28dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="40dp" />


    <LinearLayout
        android:layout_width="368dp"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:padding="16dp"
        android:orientation="vertical"
        tools:layout_editor_absoluteY="90dp"
        tools:layout_editor_absoluteX="8dp"
        android:id="@+id/linearLayout">


        <EditText
            android:id="@+id/etNama"
            android:layout_marginTop="8dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Nama"
            android:padding="8dp"
            android:inputType="textEmailAddress"
            android:textColor="#000"/>

        <EditText
            android:id="@+id/etEmail"
            android:layout_marginTop="8dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Email"
            android:padding="8dp"
            android:inputType="textEmailAddress"
            android:textColor="#000"/>

        <EditText
            android:id="@+id/etPassword"
            android:layout_marginTop="8dp"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Password"
            android:inputType="textPassword"
            android:padding="8dp"
            android:textColor="#000"/>


        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:id="@+id/btnRegister"
            android:text="Register" />



    </LinearLayout>

    <TextView
        android:id="@+id/txtLogin"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Alreadey have an account ? Login here "
        android:textColor="#0011ff"
        android:layout_below="@+id/linearLayout"
        android:layout_alignParentStart="true"
        android:layout_marginTop="53dp" />'

Ketujuh

Setelah di buat, langkah selanjutnya buka layout activity_login.xml.. Lalu tambahkan komponen-komponen seperti di bawah ini

'<TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="Login Activity"
            android:textSize="30sp"
            tools:layout_editor_absoluteX="102dp"
            android:textStyle="bold"
            tools:layout_editor_absoluteY="28dp"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="40dp" />


        <LinearLayout
            android:layout_width="368dp"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:padding="16dp"
            android:orientation="vertical"
            tools:layout_editor_absoluteY="90dp"
            tools:layout_editor_absoluteX="8dp">


            <EditText
                android:id="@+id/etEmail"
                android:layout_marginTop="8dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Email"
                android:padding="8dp"
                android:inputType="textEmailAddress"
                android:textColor="#000"/>

            <EditText
                android:id="@+id/etPassword"
                android:layout_marginTop="8dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="Password"
                android:inputType="textPassword"
                android:padding="8dp"
                android:textColor="#000"/>

            <Button
                android:id="@+id/btnLogin"
                android:layout_marginTop="16dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="LOG IN"/>

            <Button
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dp"
                android:id="@+id/btnRegister"
                android:text="Register"
                />


        </LinearLayout>'


Kedelapan

Tambahkan library-library berikut ini.. Lalu copy di gradle:app

compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'

Kesembilan

Buka class java RetrofitClient.java yang sudah kalian bikin sebelumnya. Lalu tambahkan code berikut ini

'private static Retrofit retrofit = null;

    public static Retrofit getClient(String baseUrl){
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();

        if (retrofit == null){
            retrofit = new Retrofit.Builder()
                    .baseUrl(baseUrl)
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(client)
                    .build();
        }
        return retrofit;
    }'

Kesepuluh

Buka class Interface ApiService.java. Class ini berfungsi untuk mengisi perintah-perintah apa saja yang diperlukan untuk berkomunikasi dengan API. Seperti GET,POST,UPDATE, DELETE.

'// Fungsi ini untuk memanggil API http://192.168.88.20/latihan1/login.php
 // penamaan link sesuai dengan localhost masing-masing
    @FormUrlEncoded
    @POST("login.php")
    Call<ResponseBody> loginRequest(@Field("email") String email,
                                    @Field("password") String password);

    // Fungsi ini untuk memanggil API http://192.168.88.20/latihan1/register.php

    @FormUrlEncoded
    @POST("register.php")
    Call<ResponseBody> registerRequest(@Field("nama") String nama,
                                       @Field("email") String email,
                                       @Field("password") String password);
}'


Kesebelas

Buka Class UtilsApi.java . Class ini berfungsi untuk menggabungkan class RetrofitClient dan juga meng-deklarasikan class interface BaseApiService .

' // 10.0.2.2 ini adalah localhost.
    // bisa juga di masukan dengan IP address kalian
    public static final String BASE_URL_API =
            "http://192.168.88.20/latihan1/";

    // Mendeklarasikan Interface BaseApiService
    public static ApiService getAPIService(){
        return RetrofitClient.getClient(BASE_URL_API).create(ApiService.class);
    }'

Keduabelas

Selanjutnya adalah buka Activity LoginActivity.java .  Kita Deklarasikan terlebih dahulu komponen-komponen yang ada di dalam layout activity_login.xml . 

    'EditText etEmail;
    EditText etPassword;
    Button btnLogin;
    Button btnRegister;
    ProgressDialog loading;

    Context mContext;
    ApiService mApiService;
'

Di dalam method onCreate, tambahkan code ini

'mContext = this;
        mApiService = UtilsApi.getAPIService(); // meng-init yang ada di package apihelper
        initComponents();'

Setelah membuat method initComponents(); lalu tambahkan code berikut

' etEmail = (EditText) findViewById(R.id.etEmail);
        etPassword = (EditText) findViewById(R.id.etPassword);
        btnLogin = (Button) findViewById(R.id.btnLogin);
        btnRegister = (Button) findViewById(R.id.btnRegister);

        btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                loading = ProgressDialog.show(mContext, null, "Harap Tunggu...", true, false);
                requestLogin();
            }
        });

        btnRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(mContext, DaftarActivity.class));
            }
        });'

Setelah itu buat methode requestLogin(); lalu tambahkan kode seperti di bawah ini

'mApiService.loginRequest(etEmail.getText().toString(), etPassword.getText().toString())
                    .enqueue(new Callback<ResponseBody>() {
                        @Override
                        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                            if (response.isSuccessful()){
                                loading.dismiss();
                                try {
                                    JSONObject jsonRESULTS = new JSONObject(response.body().string());
                                    if (jsonRESULTS.getString("error").equals("false")){
                                        // Jika login berhasil maka data nama yang ada di response API
                                        // akan diparsing ke activity selanjutnya.
                                        Toast.makeText(mContext, "BERHASIL LOGIN", Toast.LENGTH_SHORT).show();
                                        String nama = jsonRESULTS.getJSONObject("user").getString("nama");
                                        Intent intent = new Intent(mContext, MainActivity.class);
                                        intent.putExtra("result_nama", nama);
                                        startActivity(intent);
                                    } else {
                                        // Jika login gagal
                                        String error_message = jsonRESULTS.getString("error_msg");
                                        Toast.makeText(mContext, error_message, Toast.LENGTH_SHORT).show();
                                    }
                                } catch (JSONException e) {
                                    e.printStackTrace();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            } else {
                                loading.dismiss();
                            }
                        }

                        @Override
                        public void onFailure(Call<ResponseBody> call, Throwable t) {
                            Log.e("debug", "onFailure: ERROR > " + t.toString());
                            loading.dismiss();
                        }
                    });'

Keempatbelas

Buka Activity DaftarActivity.java . Lalu tambahkan code berikut ini

   'EditText etNama;
    EditText etEmail;
    EditText etPassword;
    Button btnRegister;
    TextView txtLogin;
    ProgressDialog loading;

    Context mContext;
    ApiService mApiService;'

Selanjutnya adalah tambahkan lagi code berikut di dalam method onCreate

'mContext = this;
        mApiService = UtilsApi.getAPIService();
        // methode ini berfungsi untuk mendeklarasikan widget yang ada
        // di layout activity_daftar
        initComponents();'

Setelah itu adalah, tambahkan kembali code berikut di dalam method initComponents(); 

'etNama = (EditText) findViewById(R.id.etNama);
        etEmail = (EditText) findViewById(R.id.etEmail);
        etPassword = (EditText) findViewById(R.id.etPassword);
        btnRegister = (Button) findViewById(R.id.btnRegister);
        txtLogin = (TextView) findViewById(R.id.txtLogin);


        btnRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                loading = ProgressDialog.show(mContext, null, "Harap Tunggu...", true, false);
                requestRegister();
            }
        });

        txtLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(getApplicationContext(), LoginActivity.class));
            }
        });'

Selanjutnya adalah tambahkan code berikut di dalam method requestRegister(); 

' mApiService.registerRequest(etNama.getText().toString(),
                    etEmail.getText().toString(),
                    etPassword.getText().toString())
                    .enqueue(new Callback<ResponseBody>() {
                        @Override
                        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                            if (response.isSuccessful()){
                                Log.i("debug", "onResponse: Berhasil");
                                loading.dismiss();
                                try {
                                    JSONObject jsonRESULTS = new JSONObject(response.body().string());
                                    if (jsonRESULTS.getString("error").equals("false")){
                                        Toast.makeText(mContext, "Anda Berhasil Registrasi", Toast.LENGTH_SHORT).show();
                                        startActivity(new Intent(mContext, LoginActivity.class));
                                    } else {
                                        String error_message = jsonRESULTS.getString("error_msg");
                                        Toast.makeText(mContext, error_message, Toast.LENGTH_SHORT).show();
                                    }
                                } catch (JSONException e) {
                                    e.printStackTrace();
                                } catch (IOException e) {
                                    e.printStackTrace();
                                }
                            } else {
                                Log.i("debug", "onResponse: Tidak Berhasil");
                                loading.dismiss();
                            }
                        }

                        @Override
                        public void onFailure(Call<ResponseBody> call, Throwable t) {
                            Log.e("debug", "onFailure: ERROR > " + t.getMessage());
                            Toast.makeText(mContext, "Koneksi Internet Bermasalah", Toast.LENGTH_SHORT).show();
                        }
                    });'

Buka Activity MainActivity.java . Activity ini nanti nya akan mucul setelah nantu kita berhasil login.

Keenambelas

Buka layout activity_main.xml lalu tambahkan komponen-komponen di bawah ini

'<TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="49dp"
        android:text="Main Activity"
        android:textSize="35sp"
        tools:layout_editor_absoluteX="163dp"
        tools:layout_editor_absoluteY="52dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Main Activity"
        android:textSize="25sp"
        tools:layout_editor_absoluteX="163dp"
        tools:layout_editor_absoluteY="52dp"
        android:layout_gravity="center"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/textView3" />


    <TextView
        android:id="@+id/txtResultNama"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Text Result Nama"
        android:textSize="15sp"
        android:layout_below="@+id/textView3"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="35dp" />'

Ketujuhbelas

Buka Activity MainActivity.java lalu tambahkan kode seperti di bawah ini

TextView txtResultNama;String resultNama;

Lalu tambahkan code di dalam methode onCreate();

' initComponents();

        // untuk mendapatkan data dari activity sebelumnya, yaitu activity login.
        Bundle extras = getIntent().getExtras();
        if (extras != null)
            resultNama = extras.getString("result_nama");
            txtResultNama.setText(resultNama);
    }

    private void initComponents() {
        txtResultNama = (TextView) findViewById(R.id.txtResultNama);
    }'

Kedelapabelas

Jangan lupa untuk mengganti mengubah inten filter ke dalam activity Register. Supaya ketika aplikasi di jalankan, yang akan muncul pertama adalah Activity Register. Buka AndroidManifests.xml lalu pindahkan inten filter ke dalam activity Register, yang sebelumnya inten filter ini berada di dalam Activity MainActivity

'<activity android:name=".View.DaftarActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".View.LoginActivity"></activity>'

Kesembilanbelas

Langkah terakir adalah menjalankan aplikasinya. Berikut adalah screen aplikasi yang sudah berhasil register dan juga login

Screen DaftarActivity



Akan Muncul Toast ketika sudah berhasil Register


Screen LoginActivity


Akan Muncul Toast dan membawa nama ketika sudah berhasil Login

Berikut ini adalah Demo Aplikasinya

 

Ok Temen-temen, gimana tutorial kali ini. Mungkin cukup sekian tutorial dari saya. Apabila ada kesalahan dari saya itu datang nya dari syaitan dan kebenaran itu datang nya dari Allah. Semoga tutorial ini bermanfaat bagi kita semua. Bila ada yang ingin di tanyakan ke saya bisa DM saya via FB, Instagram, Google Hangout dan WA : 081322579702

Wassalamualaikum Warahmatullah