Pada kesempatan kali ini saya ingin berbagi kepada para developer semua tentang Membuat Realtime Chat dengan menggunakan Firebase. Buat yang belum tau apa itu FireBase silakan baca disini Apa itu FIREBASE?

Sebelum ke praktek mari kita bahas dulu Kenapa harus menggunakan Firebase? toh pake Ajax bisa?. Jawabannya adalah Jika kita menggunakan ajax memerlukan proses request secara berulang-ulang yang dibutuhkan untuk mengambil data dari server sehingga akan membebankan server. Sedangkan jika kita menggunakan Firebase kita tidak perlu request data untuk mendapatkan sebuah data melainkan server yang akan memberikan data itu ketika ada sebuah perubahan. Contoh ketika kita menggunakan ajax agar realtime maka aplikasi kita akan melakukan request setiap 500ms sekali dengan kata lain 1 second terdapat 2 Request secara berulang ketika ada 100 user dalam waktu 1 Detik maka terdapat 200 request dalam 1 Detik dan terus menerus setiap menit, jam, hari, bulan dan server kita lebih sering Down. Berikut adalah penjelasan yang saya pelajari dan saya pahami.

Nah kalo sudah paham kita lanjutkan tutorialnya. Pertama yang harus kita lakukan adalah menuju ke Firebase Console berikut link nya https://console.firebase.google.com.


Lalu kita buat proyek baru, akan muncul form isian lalu isi nama proyek dan negaranya.


Selanjutnya kita klik menu Database lalu pilih tab Aturan lalu buat menjadi seperti ini :

Lalu klik Publikasikan.

Selanjutnya kita pilih tab Data dan buat Child dengan nama Chat dan Value "" seperti ini :



Oke, settingan untuk aturan sudah selesai sekarang kita menuju menu Overview lalu klik menu Tambahkan Firebase ke aplikasi web Anda. Maka akan muncul popup seperti gambar dan click salin.



Langkah selanjutnya adalah membuat file HTML untuk chat formnya dan jangan lupa menyispkan code dari popup yang sudah kita salin tadi dari firebase, kurang lebih seperti berikut :
 
 <html>  
 <head>  
      <title>Realtime Chat</title>  
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">  
      <script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>  
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>  
      <style>  
           .message-bubble   
           {  
                padding: 10px 0px 10px 0px;  
           }  
           .message-bubble:nth-child(even) { background-color: #F5F5F5; }  
           .message-bubble > *  
           {  
                padding-left: 10px;    
           }  
           .panel-body { padding: 0px; }  
           .panel-heading { background-color: #3d6da7 !important; color: white !important; }  
      </style>  
 </head>  
 <body>  
      <div class="container">  
           <div class="row">  
                <div class="panel panel-default">  
                 <div class="panel-heading">Panel heading without title</div>  
                 <div class="panel-body">  
                     <div class="container" id="chat_data">  
                     </div>  
                     <div class="panel-footer">  
                          <div class="row">  
                               <div class="col-md-4">  
                                    <input type="text" id="name" class="form-control">  
                               </div>  
                               <div class="col-md-8">  
                                    <div class="input-group">  
                                     <input type="text" id="msg" class="form-control">  
                                     <span class="input-group-btn">  
                                         <button class="btn btn-default" type="button">Send</button>  
                                     </span>  
                                    </div>  
                               </div>  
                          </div>  
                     </div>  
                 </div>  
                </div>  
           </div>  
      </div>  
      <script src="https://www.gstatic.com/firebasejs/3.6.3/firebase.js"></script>  
      <script>  
           // Initialize Firebase  
           var config = {  
                apiKey: "AIzaSyAmW1Y2cudtWX_jTYUde01-yKz1K-WnMgk",  
                authDomain: "realtime-chat-6c6e4.firebaseapp.com",  
                databaseURL: "https://realtime-chat-6c6e4.firebaseio.com",  
                storageBucket: "realtime-chat-6c6e4.appspot.com",  
                messagingSenderId: "31374372226"  
           };  
           firebase.initializeApp(config);  
           $(document).ready(function(){  
                var rootchatref = firebase.database().ref('/');  
                var chatref = firebase.database().ref('/Chat');  
                chatref.on('child_added', function(snapshot) {  
                     var data = snapshot.val();  
                     //console.log(data);  
                     $('#chat_data').prepend('<div class="row message-bubble"><p class="text-muted">'+data.user+'</p><span>'+data.msg+'</span></div>');  
                });  
           });  
           function writeChat(user, msg) {  
            // A post entry.  
            var postData = {  
                msg : msg,  
                user: user,  
            };  
            // Get a key for a new Post.  
            var newPostKey = firebase.database().ref().child('Chat').push().key;  
            // Write the new post's data simultaneously in the posts list and the user's post list.  
            var updates = {};  
            updates['/Chat/'+newPostKey] = postData;  
            return firebase.database().ref().update(updates);  
           }  
           $("#msg").keypress(function(e) {  
                var name = $('#name').val();  
                var msg = $('#msg').val();  
                if(e.which == 13) {  
                     if(name == ''){  
                          alert('Isi nama terlebih dahulu..');  
                          $('#name').focus();  
                          return false;  
                     }  
                     if(msg == ''){  
                          alert('Pesan tidakk boleh kosong');  
                          $('#msg').focus();  
                          return false;  
                     }  
                     writeChat(name, msg);  
                     $('#msg').val('');  
                }  
           });  
      </script>  
 </body>  
 </html>  

Oke semua sudah selesai. dan untuk mencobanya kita buka 2 Browser untuk membuktikan Jika Chat Ini realtime.



Berhasil dan realtime :D
Mungkin cukup sekian sharingnya kali ini semoga bermanfaat untuk teman-teman semua.

Selamat pagi para developer kali ini saya akan meneruskan tutorial Membuat Material Sliding Tab, yaitu membuat ListView pada Fragment.

Oke langsung saja kita menuju view pada Fragment lalu buat seperti berikut :

 <FrameLayout 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="com.panduseptian.slidingtab.CallsFragment">  
   <ListView  
     android:id="@+id/list"  
     android:layout_width="match_parent"  
     android:layout_height="match_parent">  
   </ListView>  
 </FrameLayout>  

Jika sudah, kita menuju Fragment nya lalu masukan code seperti berikut :

 package com.panduseptian.slidingtab;  
 import android.os.Bundle;  
 import android.support.v4.app.Fragment;  
 import android.view.LayoutInflater;  
 import android.view.View;  
 import android.view.ViewGroup;  
 import android.widget.AdapterView;  
 import android.widget.ArrayAdapter;  
 import android.widget.ListView;  
 import android.widget.Toast;  
 /**  
  * A simple {@link Fragment} subclass.  
  */  
 public class CallsFragment extends Fragment {  
   public CallsFragment() {  
     // Required empty public constructor  
   }  
   @Override  
   public View onCreateView(LayoutInflater inflater, ViewGroup container,  
                Bundle savedInstanceState) {  
     View rootView = inflater.inflate(R.layout.fragment_calls, container, false);  
     ListView listview =(ListView) rootView.findViewById(R.id.list);  
     final String[] items = new String[] {"Item 1", "Item 2", "Item 3"};  
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, items);  
     listview.setAdapter(adapter);  
     listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {  
       @Override  
       public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {  
         Toast.makeText(getActivity().getApplicationContext(), items[i], Toast.LENGTH_SHORT).show();  
       }  
     });  
     return rootView;  
   }  
 }  

Jika sudah kita run project, maka hasilnya akan seperti berikut :


Mungkin cukup sekian sharing singkatnya, semoga bermanfaat, Terima kasih..

Selamat siang para developer kali ini kita akan membahas tab sliding seperti aplikasi whatsapp karena ada yang request dari facebook.

Oke langsung saja, pertama kita buat project baru lalu import repository design pada build.gradle kita. Perlu diingat versi yang di import harus sesuai dengan yang ada di SDK teman-teman.

Contoh gambar dibawah ini, yang saya block adalah versi dari SDK teman-teman.



 compile 'com.android.support:design:VERSI REPO'  

Jika sudah sekarang kita buat layoutnya terlebih dahulu. Kita buka activity_main.xml lalu buat seperti berikut :

 <?xml version="1.0" encoding="utf-8"?>  
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
   xmlns:tools="http://schemas.android.com/tools"  
   xmlns:app="http://schemas.android.com/apk/res-auto"  
   android:id="@+id/activity_main"  
   android:layout_width="match_parent"  
   android:layout_height="match_parent"  
   android:orientation="vertical"  
   tools:context="com.panduseptian.slidingtab.MainActivity">  
   <android.support.design.widget.TabLayout  
     android:id="@+id/slide"  
     android:layout_width="match_parent"  
     android:layout_height="wrap_content"  
     android:background="@color/colorPrimary"  
     app:tabGravity="fill"  
     app:tabMode="fixed">  
   </android.support.design.widget.TabLayout>  
   <android.support.v4.view.ViewPager  
     android:id="@+id/pager"  
     android:layout_width="match_parent"  
     android:layout_height="match_parent"></android.support.v4.view.ViewPager>  
 </LinearLayout>  

Kita buat 3 fragment untuk di tampilkan pada viewpager dengan cara sperti gambar dibawah :



Jika frgament sudah dibuat, sekarang kita buat adapternya seperti berikut :


Lalu masukan codingan seperti ini :


 package com.panduseptian.slidingtab;  
 import android.support.v4.app.Fragment;  
 import android.support.v4.app.FragmentManager;  
 import android.support.v4.app.FragmentPagerAdapter;  
 /**  
  * Created by pandu on 29/11/16.  
  */  
 public class PagerAdapter extends FragmentPagerAdapter {  
   public PagerAdapter(FragmentManager fm) {  
     super(fm);  
   }  
   @Override  
   public Fragment getItem(int position) {  
     switch (position){  
       case 0:  
         return new CallsFragment();  
       case 1:  
         return new ChatsFragment();  
       case 2:  
         return new ContactsFragment();  
     }  
     return null;  
   }  
   @Override  
   public int getCount() {  
     return 3;  
   }  
   @Override  
   public CharSequence getPageTitle(int position) {  
     switch (position){  
       case 0:  
         return "Calls";  
       case 1:  
         return "Chats";  
       case 2:  
         return "Contacts";  
     }  
     return super.getPageTitle(position);  
   }  
 }  

Sekarang kita ke MainActivity.java


 package com.panduseptian.slidingtab;  
 import android.support.design.widget.TabLayout;  
 import android.support.v4.view.ViewPager;  
 import android.support.v7.app.AppCompatActivity;  
 import android.os.Bundle;  
 public class MainActivity extends AppCompatActivity {  
   private ViewPager viewPager;  
   private PagerAdapter adapter;  
   private TabLayout tabLayout;  
   @Override  
   protected void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.activity_main);  
     getSupportActionBar().setElevation(0);  
     viewPager = (ViewPager) findViewById(R.id.pager);  
     adapter = new PagerAdapter(getSupportFragmentManager());  
     viewPager.setAdapter(adapter);  
     tabLayout = (TabLayout) findViewById(R.id.slide);  
     tabLayout.addTab(tabLayout.newTab().setText("Calls"));  
     tabLayout.addTab(tabLayout.newTab().setText("Chats"));  
     tabLayout.addTab(tabLayout.newTab().setText("Contacts"));  
     viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));  
     tabLayout.setupWithViewPager(viewPager);  
   }  
 }  

Jika sudah kita Run projectnya, Maka hasilnya seperti berikut :







Cukup sekian tutorial singkatnya, Semoga bermanfaat.

Selamat siang para developer, kali ini kita akan mempelajari bagaimana cara merubah font di android dengan Calligraphy Library. 

Seperti biasa kita import librarynya di build.gradle

 dependencies {  
   compile 'uk.co.chrisjenx:calligraphy:2.2.0'  
 }  

Selanjutnya kita copy file .ttf atau .otf pada folder app/src/main/assets/fonts, jika tidak ada folder assets buat dulu foldernya.

Sekarang kita buat file javahya dan beri nama MyApp lalu isi seperti dibawah :




 package com.panduseptian.customfont;  
 import android.app.Application;  
 import uk.co.chrisjenx.calligraphy.CalligraphyConfig;  
 /**  
  * Created by pandu on 28/11/16.  
  */  
 public class MyApp extends Application {  
   @Override  
   public void onCreate() {  
     super.onCreate();  
     CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()  
         .setDefaultFontPath("fonts/Oswald-Stencbab.ttf")  
         .setFontAttrId(R.attr.fontPath)  
         .build()  
     );  
   }  
 }  

Sekarang kita daftarkan MyApp sebagai name Aplikasi kita, buka AndroidManifest.xml lalu tambahkan attribute name pada tag application seperti berikut : 


Sekarang kita inject pada activity dengan cara memasukan void attachBaseContext(Context newBase) seperti dibawah :
 @Override  
   protected void attachBaseContext(Context newBase) {  
     super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));  
   }  

Full codingnya seperti ini :

 package com.panduseptian.customfont;  
 import android.content.Context;  
 import android.support.v7.app.AppCompatActivity;  
 import android.os.Bundle;  
 import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper;  
 public class MainActivity extends AppCompatActivity {  
   @Override  
   protected void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.activity_main);  
   }  
   @Override  
   protected void attachBaseContext(Context newBase) {  
     super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));  
   }  
 }  

Sekarang Kita ubah viewnya agar lebih jelas perubahannya


 <?xml version="1.0" encoding="utf-8"?>  
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
   xmlns:tools="http://schemas.android.com/tools"  
   android:id="@+id/activity_main"  
   android:layout_width="match_parent"  
   android:layout_height="match_parent"  
   android:paddingBottom="@dimen/activity_vertical_margin"  
   android:paddingLeft="@dimen/activity_horizontal_margin"  
   android:paddingRight="@dimen/activity_horizontal_margin"  
   android:paddingTop="@dimen/activity_vertical_margin"  
   tools:context="com.panduseptian.customfont.MainActivity">  
   <TextView  
     android:layout_width="match_parent"  
     android:layout_height="match_parent"  
     android:gravity="center"  
     android:text="Custom Font"  
     android:textSize="30dp"/>  
 </RelativeLayout>  

Sekarang kita run projectnya dan hasilnya seperti ini :



Cukup sekian sharing tentang Custom Font Androidnya, semoga bermanfaat untuk teman-teman semua. Terima Kasih.

Selamat siang para developer android, kali saya akan sharing tentang bagaimana membuat image slider pada android dengan library dari . Langsung saja kita ke TKP...

Pertama kita import dulu library nya dengan cara buka build.gradle pada folder app/ lalu masukan librarynya seperti ini :





 dependencies {  
     compile "com.android.support:support-v4:+"  
     compile 'com.squareup.picasso:picasso:2.3.2'  
     compile 'com.nineoldandroids:library:2.4.0'  
     compile 'com.daimajia.slider:library:1.1.5@aar'  
 }  


Setelah itu tekan tombol Sync Now  lalu tunggu sampai proses build selesai. Sekarang kita buka AndroidManifest lalu masukan permission INTERNET dan
READ_EXTERNAL_STORAGE


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

Sekarang kita menuju ke activity_main.xml lalu buat seperti berikut ini :


 <?xml version="1.0" encoding="utf-8"?>  
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
   xmlns:tools="http://schemas.android.com/tools"  
   android:id="@+id/activity_main"  
   android:layout_width="match_parent"  
   android:layout_height="match_parent"  
   tools:context="com.panduseptian.imageslider.MainActivity">  
   <com.daimajia.slider.library.SliderLayout  
     android:id="@+id/slider"  
     android:layout_width="match_parent"  
     android:layout_height="200dp" />  
 </RelativeLayout>  

Selanjutnya kita ke MainActivity lalu buat seperti ini :


 package com.panduseptian.imageslider;  
 import android.support.v7.app.AppCompatActivity;  
 import android.os.Bundle;  
 import com.daimajia.slider.library.Animations.DescriptionAnimation;  
 import com.daimajia.slider.library.SliderLayout;  
 import com.daimajia.slider.library.SliderTypes.BaseSliderView;  
 import com.daimajia.slider.library.SliderTypes.TextSliderView;  
 import com.daimajia.slider.library.Tricks.ViewPagerEx;  
 import java.util.HashMap;  
 public class MainActivity extends AppCompatActivity {  
   private SliderLayout sliderLayout;  
   @Override  
   protected void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.activity_main);  
     sliderLayout = (SliderLayout) findViewById(R.id.slider);  
     // Load image dari URL  
     HashMap<String,String> url_maps = new HashMap<String, String>();  
     url_maps.put("Hannibal", "http://static2.hypable.com/wp-content/uploads/2013/12/hannibal-season-2-release-date.jpg");  
     url_maps.put("Big Bang Theory", "http://tvfiles.alphacoders.com/100/hdclearart-10.png");  
     url_maps.put("House of Cards", "http://cdn3.nflximg.net/images/3093/2043093.jpg");  
     url_maps.put("Game of Thrones", "http://images.boomsbeat.com/data/images/full/19640/game-of-thrones-season-4-jpg.jpg");  
     // Load Image Dari res/drawable  
     HashMap<String,Integer> file_maps = new HashMap<String, Integer>();  
     file_maps.put("Hannibal",R.drawable.hannibal);  
     file_maps.put("Big Bang Theory",R.drawable.bigbang);  
     file_maps.put("House of Cards",R.drawable.house);  
     file_maps.put("Game of Thrones", R.drawable.game_of_thrones);  
     for(String name : file_maps.keySet()){  
       TextSliderView textSliderView = new TextSliderView(this);  
       // initialize a SliderLayout  
       textSliderView  
           .description(name)  
           .image(file_maps.get(name))  
           .setScaleType(BaseSliderView.ScaleType.Fit);  
       //add your extra information  
       textSliderView.bundle(new Bundle());  
       textSliderView.getBundle()  
           .putString("extra",name);  
       sliderLayout.addSlider(textSliderView);  
     }  
     sliderLayout.setPresetTransformer(SliderLayout.Transformer.Accordion);  
     sliderLayout.setPresetIndicator(SliderLayout.PresetIndicators.Center_Bottom);  
     sliderLayout.setCustomAnimation(new DescriptionAnimation());  
     sliderLayout.setDuration(4000);  
   }  
 }  

Untuk melihat hasilnya kita Run Rpojectnya, dan berikut adalah hasilnya


Berikut tutorial singkat dari saya. Semoga bermanfaat untuk para developer semua.

Salam Sukses.


Firebase adalah penyedia layanan cloud dengan backend sebagai servis. Firebase adalah platform mobile dan aplikasi web dengan sarana dan prasarana yang dirancang untuk membantu pengembang membangun aplikasi realtime.

San Francisco dan Mountain View, California. Perusahaan ini didirikan pada tahun 2011 oleh Andrew Lee dan James Tamplin. Produk awal Firebase adalah database realtime, yang menyediakan API yang memungkinkan pengembang untuk menyimpan dan sinkronisasi data di beberapa klien. Seiring waktu, Firebase telah memperluas produknya untuk menjadi suite lengkap bagi pengembangan aplikasi. Perusahaan ini diakuisisi oleh Google bulan Oktober 2014 dan menambahkan sejumlah besar fitur baru pada bulan Mei 2016, di Google I / O konferensi.

Firebase sendiri memiliki beberapa service yaitu :
  1. Analytics
    1. Firebase Analytics
  2. Develop
    1. Firebase Cloud Messaging
    2. Firebase Auth
    3. Realtime Database
    4. Firebase Storage
    5. Firebase Hosting
    6. Firebase Test Lab for Android
    7. Firebase Crash Reporting
  3. Grow
    1. Firebase Notifications
    2. Firebase App Indexing
    3. Firebase Dynamic Links
    4. Firebase Invites
    5. Adwords
  4. Earn
    1. Admob

Firebase memiliki banyak library yang memungkinkan untuk mengintegrasikan layanan ini dengan Android, iOS, Javascript, Java, Objective-C dan Node.JS. Database Firebase juga bersifat bisa diakses lewat REST API dan data binding untuk beberapa framework Javascript seperti halnya AngularJS, ReactJS, Ember.JS, dan Backbone.JS. REST API tersebut menggunakan protokol Server-Sent Event dengan membuat koneksi HTTP untuk menerima push notification dari server. Pengembang juga bisa menggunakan database ini untuk mengamankan data mereka menggunakan server Firebase dengan rules yang ada.

Berikut adalah penjelasan singkat tentang Firebase. Semoga pemabaca bermanfaat dan termotivasi untuk mengembangkan aplikasi realtime dengan Firebase.

Kali ini kita akan membahas tentang validasi pada android EditText untuk login. Bagi yang belum membaca tentang bagaimana cara login di android silakan kunjungi postingan saya yang ini 


Oke lanjut, sekarang buka project android teman-teman semua. Anggap kita sudah membuat activity dan viewnya.

Kita hanya tinggal menambahkan function validasi() pada click Listener button login nya.

Berikut adalah codingannya : 


 private boolean validasi() {  
     // Validasi Username Jika Value Kosong  
     if (username.getText().toString().isEmpty()){  
       username.setError("Username tidak boleh kosong.");  
       return false;  
     }  
     // Validasi Password Jika Value Kosong  
     if (password.getText().toString().isEmpty()){  
       password.setError("Username tidak boleh kosong.");  
       return false;  
     }  
     return true;  
   }  

Dan berikut adalah full code nya :



 package com.panduseptian.aplikasilogin;  
 import android.content.Intent;  
 import android.support.v7.app.AppCompatActivity;  
 import android.os.Bundle;  
 import android.view.View;  
 import android.widget.Button;  
 import android.widget.EditText;  
 import android.widget.Toast;  
 import com.android.volley.AuthFailureError;  
 import com.android.volley.Request;  
 import com.android.volley.RequestQueue;  
 import com.android.volley.Response;  
 import com.android.volley.VolleyError;  
 import com.android.volley.toolbox.StringRequest;  
 import com.android.volley.toolbox.Volley;  
 import org.json.JSONException;  
 import org.json.JSONObject;  
 import java.util.HashMap;  
 import java.util.Map;  
 public class MainActivity extends AppCompatActivity {  
   // Parameter sesuai dengan tipe data  
   EditText username;  
   EditText password;  
   Button button;  
   @Override  
   protected void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.activity_main);  
     // Deklarasi komponen view  
     username = (EditText) findViewById(R.id.txt_username);  
     password = (EditText) findViewById(R.id.txt_password);  
     button = (Button) findViewById(R.id.btn_login);  
     // Setting button ketika di klik  
     button.setOnClickListener(new View.OnClickListener() {  
       @Override  
       public void onClick(View view) {  
         boolean status = validasi();  
         if (status == true){  
           // Panggil void sendLogin()  
           sendLogin();  
         }  
       }  
     });  
   }  
   private boolean validasi() {  
     // Validasi Username Jika Value Kosong  
     if (username.getText().toString().isEmpty()){  
       username.setError("Username tidak boleh kosong.");  
       return false;  
     }  
     // Validasi Password Jika Value Kosong  
     if (password.getText().toString().isEmpty()){  
       password.setError("Password tidak boleh kosong.");  
       return false;  
     }  
     return true;  
   }  
   private void sendLogin() {  
     // Setting POST request ke server  
     StringRequest loginRequest = new StringRequest(Request.Method.POST, "http://192.168.56.1/server/login.php",  
         new Response.Listener<String>() {  
           @Override  
           public void onResponse(String response) {  
             // Handle response dari server ketika sukses dengan mengkonvert menjadi JSON  
             try {  
               JSONObject json = new JSONObject(response);  
               // Mengambil variable status pada response  
               String status = json.getString("status");  
               if(status.equals("success")){  
                 // Jika Login Sukses Maka pindah ke activity lain.  
                 Intent intent = new Intent(MainActivity.this, HomeActivity.class);  
                 startActivity(intent);  
                 finish();  
               }else{  
                 // Jika Login Gagal Maka mengeluarkan Toast dengan message.  
                 Toast.makeText(getApplicationContext(), "Username & Password Salah", Toast.LENGTH_LONG).show();  
               }  
             } catch (JSONException e) {  
               e.printStackTrace();  
             }  
           }  
         },  
         new Response.ErrorListener() {  
           @Override  
           public void onErrorResponse(VolleyError error) {  
             // Handle response dari server ketika gagal  
             Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();  
           }  
         }  
     ){  
       @Override  
       protected Map<String, String> getParams() throws AuthFailureError {  
         HashMap<String, String> params = new HashMap<>();  
         params.put("username", username.getText().toString());  
         params.put("password", password.getText().toString());  
         return params;  
       }  
     };  
     // Buat antrian request pada cache android  
     RequestQueue requestQueue = Volley.newRequestQueue(this);  
     // Tambahkan Request pada antrian request  
     requestQueue.add(loginRequest);  
   }  
 }  

Dan hasil akhirnya adalah seperti gambar dibawah ini :



Oke, cukup sekian sharing singkatnya. Semoga bermanfaat dan jika ada pertanyaan silakan di kolom comment ya. terima kasih.

Selamat pagi/siang/malam para programmer dan developer android. Pada kesempatan kali ini saya akan sharing tentang tutorial membuat aplikasi login di android dengan Volley Sebagai android librarynya dan PHP MYSQL untuk servernya. Oke langsung aja, pertama yang harus disiapkan adalah :

  1. Android Studio. Bisa di download di sini
  2. XAMPP untuk PHP & MYSQL nya.
  3. HP android / Android Emulator untuk run projectnya.
  4. Kopi, diperlukan jika kalian pusing ngoding. heheheh

Setelah semua perlengkapan siap, langkah pertama adalah install android studio dan xampp nya.
Kalo semua sudah terinstall, buat folder "server" di c:/xampp/htdocs.

Sekarang kalian buat database dengan nama "android"  lalu buat tabel "user" dengan field seperti di gambar :


lalu save tabelnya.

Sekarang kita isi record di di tabel usernya

id : 1
username : admin
password : 21232f297a57a5a743894a0e4a801fc3

21232f297a57a5a743894a0e4a801fc3 adalah admin yang sudah di encrypt menjadi MD5.

Berikut gambarnya :








Database sudah selesai, sekarang kita lanjut ke codingan PHP nya.

Buat file login.php di folder server yang sudah kita buat tadi.

Lalu masukan code berikut.


 <?php  
 $servername = "localhost";  
 $username = "root";  
 $password = "";  
 $dbname = "android";  
 // Create connection  
 $conn = new mysqli($servername, $username, $password, $dbname);  
 // Check connection  
 if ($conn->connect_error) {  
   die("Connection failed: " . $conn->connect_error);  
 }   
 $sql = "SELECT * FROM user WHERE username = ".$_POST['username']."   
 AND ".md5($_POST['password']);  
 $result = $conn->query($sql);  
 if ($result->num_rows > 0) {  
   // output data of each row  
   while($row = $result->fetch_assoc()) {  
     echo json_encode(Array('status' => 'success'));  
   }  
 } else {  
   echo json_encode(Array('status' => 'failed'));  
 }  
 $conn->close();  
 ?>  

Oke server sudah siap. sekarang waktunya kita ke aplikasi androidnya. Sebelum melanjutkan kalo pusing silakan diminum dulu kopinya yang tadi udah disiapin heheheheh.

Kalo udah minum kita lanjut, sekarang buka aplikasi android studionya.

Berikut Adalah Step nya :

Setting Nama Aplikasi Dan Package

Set minimum SDK

Pilih Main Activity

Setting Nama Activity Main

Tunggu Sampai Build Selesai

Setelah Build Selesai.

Selanjutnya buka build.gradle untuk memasukan dependencies, berikut adalah dependenciesnya :

compile 'com.android.support:design:24.2.1' => untuk material design
compile 'com.android.volley:volley:1.0.0' => Untuk volley library



Sekarang kita setting permission INTERNET pada AndroidManifest.XML



Settingan awal sudah complete sekarang kita ke inti programnya. Simak terus ya.
Sebelum masuk kedalam intinya kita buat sebuah activity baru untuk handle request ketika sukses login.

Berikut Caranya :






Seletalh sudah membuat activity baru kita buka folder res/layout/activity_main.xml disini kita akan membuat tampilan login dari aplikasi kita.

Berikut codingannya :


 <?xml version="1.0" encoding="utf-8"?>  
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
   xmlns:tools="http://schemas.android.com/tools"  
   android:id="@+id/activity_main"  
   android:layout_width="match_parent"  
   android:layout_height="match_parent"  
   tools:context="com.panduseptian.aplikasilogin.MainActivity">  
   <LinearLayout  
     android:layout_width="match_parent"  
     android:layout_height="wrap_content"  
     android:layout_centerInParent="true"  
     android:padding="20dp"  
     android:orientation="vertical">  
     <android.support.design.widget.TextInputLayout  
       android:layout_width="match_parent"  
       android:layout_height="wrap_content">  
       <EditText  
         android:id="@+id/txt_username"  
         android:layout_width="match_parent"  
         android:layout_height="wrap_content"  
         android:hint="Username"  
         android:inputType="text"/>  
     </android.support.design.widget.TextInputLayout>  
     <android.support.design.widget.TextInputLayout  
       android:layout_width="match_parent"  
       android:layout_height="wrap_content">  
       <EditText  
         android:id="@+id/txt_password"  
         android:layout_width="match_parent"  
         android:layout_height="wrap_content"  
         android:hint="Password"  
         android:inputType="textPassword"/>  
     </android.support.design.widget.TextInputLayout>  
     <Button  
       android:id="@+id/btn_login"  
       android:layout_width="match_parent"  
       android:layout_height="wrap_content"  
       android:layout_marginTop="20dp"  
       android:background="@color/colorPrimary"  
       android:textColor="#fff"  
       android:text="Login"/>  
   </LinearLayout>  
 </RelativeLayout>  


Sekarang kita menuju ke file javanya, buka folder java/com.namapackage/MainActivity . Masukan codingannya :


 package com.panduseptian.aplikasilogin;  
 import android.content.Intent;  
 import android.support.v7.app.AppCompatActivity;  
 import android.os.Bundle;  
 import android.view.View;  
 import android.widget.Button;  
 import android.widget.EditText;  
 import android.widget.Toast;  
 import com.android.volley.AuthFailureError;  
 import com.android.volley.Request;  
 import com.android.volley.RequestQueue;  
 import com.android.volley.Response;  
 import com.android.volley.VolleyError;  
 import com.android.volley.toolbox.StringRequest;  
 import com.android.volley.toolbox.Volley;  
 import org.json.JSONException;  
 import org.json.JSONObject;  
 import java.util.HashMap;  
 import java.util.Map;  
 public class MainActivity extends AppCompatActivity {  
   // Parameter sesuai dengan tipe data  
   EditText username;  
   EditText password;  
   Button button;  
   @Override  
   protected void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.activity_main);  
     // Deklarasi komponen view  
     username = (EditText) findViewById(R.id.txt_username);  
     password = (EditText) findViewById(R.id.txt_password);  
     button = (Button) findViewById(R.id.btn_login);  
     // Setting button ketika di klik  
     button.setOnClickListener(new View.OnClickListener() {  
       @Override  
       public void onClick(View view) {  
         // Panggil void sendLogin()  
         sendLogin();  
       }  
     });  
   }  
   private void sendLogin() {  
     // Setting POST request ke server  
     StringRequest loginRequest = new StringRequest(Request.Method.POST, "http://192.168.56.1/server/login.php",  
         new Response.Listener<String>() {  
           @Override  
           public void onResponse(String response) {  
             // Handle response dari server ketika sukses dengan mengkonvert menjadi JSON  
             try {  
               JSONObject json = new JSONObject(response);  
               // Mengambil variable status pada response  
               String status = json.getString("status");  
               if(status.equals("success")){  
                 // Jika Login Sukses Maka pindah ke activity lain.  
                 Intent intent = new Intent(MainActivity.this, HomeActivity.class);  
                 startActivity(intent);  
                 finish();  
               }else{  
                 // Jika Login Gagal Maka mengeluarkan Toast dengan message.  
                 Toast.makeText(getApplicationContext(), "Username & Password Salah", Toast.LENGTH_LONG).show();  
               }  
             } catch (JSONException e) {  
               e.printStackTrace();  
             }  
           }  
         },  
         new Response.ErrorListener() {  
           @Override  
           public void onErrorResponse(VolleyError error) {  
             // Handle response dari server ketika gagal  
             Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();  
           }  
         }  
     ){  
       @Override  
       protected Map<String, String> getParams() throws AuthFailureError {  
         HashMap<String, String> params = new HashMap<>();  
         params.put("username", username.getText().toString());  
         params.put("password", password.getText().toString());  
         return params;  
       }  
     };  
     // Buat antrian request pada cache android  
     RequestQueue requestQueue = Volley.newRequestQueue(this);  
     // Tambahkan Request pada antrian request  
     requestQueue.add(loginRequest);  
   }  
 }  

Untuk url nya diubah menjadi url local kalian masing-masing. dan pastikan android teman-temang dengan server local dalam satu jaringan. agar bisa terkoneksi dengan baik.

Setelah semua sudah selesai run/build program :

Run program ke android/emulator via usb debugging

Build aplikasi menjadi APK

Show explorer, lalu copy ke android kalian


Sekian tutorial yang bisa saya bagikan ke teman-teman. semoga bermanfaat.
Jika ada pertanyaan silakan comment di bawah. Terima Kasih.


API (Application Programming Interface) adalah sekumpulan perintah, fungsi, danprotokol yang dapat digunakan oleh programmer saat membangun perangkat lunakuntuk sistem operasi tertentu. API memungkinkan programmer untuk menggunakanfungsi standar untuk berinteraksi dengan sistem operasi lain. -Wikipedia

API sudah banyak digunakan oleh banyak sekali programmer di dunia karena API bisa digunakan oleh Sistem Operasi dan bahasa pemograman yang berbeda.

Berikut adalah cara kerja API




Keuntungan memakai API adalah : 

Portabilitas. 

Programmer yang menggunakan API dapat menjalankan programnya dalam sistem operasi mana saja asalkan sudah ter- install API tersebut. Sedangkan system call berbeda antar sistem operasi, dengan catatan dalam implementasinya mungkin saja berbeda.

Lebih Mudah Dimengerti. 

API menggunakan bahasa yang lebih terstruktur dan mudah dimengerti daripada bahasa system call. Hal ini sangat penting dalam hal editing dan pengembangan.

Integrasi Yang Lebih Luas.

Ketika facebook membuat API, sangat membantu para developer untuk bisa mengakses Profile, Apps, bahkan bisa melakukan posting melalu aplikasi diluar facebook.


Sekarang sudah banyak bahasa pemograman yang mendukung pembuatan API itu sendiri. So buat kalian para developer, banyak cara untuk membuat API dan buat API kalian sesuai dengan bahasa pemograman yang anda mintai.


Sekian tulisan kali ini. Semoga bermanfaat untuk teman-teman semua.


Kali ini penulis akan sharing tentang framework terbaik untuk para developer PHP. Tidak bisa dipungkiri bahwa PHP adalah bahasa pemograman server-side scripting yang paling banyak digunakan oleh para developer selain mudah PHP memiliki banyak komunitas dalam pengembangannya.

Berbicara soal framework PHP, framework adalah sebuah kerangka kerja. Kerangka kerja dimana dapat memudahkan pekerjaan kita. Jika dihubungkan dengan PHP ya tentu saja mempermudah kita dalam membuat aplikasi menggunakan bahasa pemograman PHP.
Dan berikut adalah 10 PHP framework terbaik yang banyak di pakai oleh para developer :

Laravel

Kelebihan : 
  • Sintak lebih mudah dipahami karena lebih simpel
  • Full MVC
Kekurangan :
  • Framework yang tergolong baru sehingga sedikit dokumentasi dan susah dipahami bagi pemula

Symfony

Kelebihan :
  • Dukungan terhadap AJAX, ORM.
  • Kompatibel dengan berbagai macam database.
  • Banyak library dan fungsi symfony yang sudah tersedia. Bahkan hampir mendekati CMS. Sehingga ada yang mengatakan ”Symphony is a CMS with a heart of a framework.” ini menjadi kelebihan sekaligus kekurangan.
Kekurangan : 
  • Tidak mendukung PHP4.
  • Relatif butuh waktu lama untuk mengerti framework ini.
  • Instalasi dan konfigurasinya cukup rumit.

CodeIgniter


Kelebihan :
  • Fungsi-fungsi pendukung yang cukup lengkap
  • Mendukung PHP4 dan PHP5
  • Memakai konsep MVC (Model View Controller)
  • Performa dalam mengeksekusi sangat cepat
  • Dokumentasi lengkap, friendly dan didukung oleh forum, wiki, dan komunitas yang besar
  • Mudah dipelajari bagi pemula
Kekurangan :
  • Tidak support AJAX dan ORM
  • Masih banyak kelonggaran dalam hal coding, misalnya penamaan file dan membebaskan programmer untuk melanggar aturan MVC
  • Karena kelonggaran tersebut, CodeIgniter Tidak ditujukan untuk pembuatan web dengan skala besar (enterprise) walaupun tersedia banyak library, karena pengembangan akan semakin sulit dilakukan.
YII

Kelebihan : 
  • framework yang sangat ringan dan dilengkapi dengan solusi caching yang memuaskan.
  • Yii sangat cocok untuk pengembangan aplikasi dengan lalu lintas-tinggi, seperti portal, manajemen konten (CMS), sistem e-commerce, dll.
  • Yii didokumentasikan dengan jelas, efisien, dan kaya-fitur.
  • Cocok untuk pengembangan aplikasi skala enterprise.
Kekurangan : 
  • Tidak mendukung PHP versi 4

Berikut adalah PHP framework terbaik yang banyak digunakan oleh para developer.
Sekian postingan kali ini, share ke temen kalian dan jika ada tambahan framework menurut versi kalian bisa tulis di kolom comment.

Pada tulisan sebelumnya kita sudah membahas tentang arsitektur android. Kali ini penulis akan sharing tentang cara kerja dari arsitektur android khususnya bagi para programmer / developer. Oke, langsung saja kita bahas bersama-sama.

Komponen Aplikasi

Fitur penting android adalah bahwa satu aplikasi dapat menggunakan elemen dari aplikasi lain (untuk aplikasi yang memungkinkan). Sebagai contoh, sebuah aplikasi memerlukan fitur scroller dan aplikasi lain telah mengembangkan fitur scroller yang baik dan memungkinkan aplikasi lain menggunakannya. Maka pengembang tidak perlu lagi mengembangkan hal serupa untuk aplikasinya, cukup menggunakan scroller yang telah ada [developer.android.com].

Agar fitur tersebut dapat bekerja, sistem harus dapat menjalankan aplikasi ketika setiap bagian aplikasi itu dibutuhkan, dan pemanggilan objek java untuk bagian itu. Oleh karenanya android berbeda dari sistem-sistem lain, Android tidak memiliki satu tampilan utama program seperti fungsi main() pada aplikasi lain. Sebaliknya, aplikasi memiliki komponen penting yang memungkinkan sistem untuk memanggil dan menjalankan ketika dibutuhkan.

- Activities

Activity merupakan bagian yang paling penting dalam sebuah aplikasi, karena Activity menyajikan tampilan visual program yang sedang digunakan oleh pengguna. Setiap Activity dideklarasikan dalam sebuah kelas yang bertugas untuk menampilkan antarmuka pengguna yang terdiri dari Views dan respon terhadap Event. Setiap aplikasi memiliki sebuah activity atau lebih. Biasanya pasti akan ada activity yang pertama kali tampil ketika aplikasi dijalankan.

Perpindahan antara activity dengan activity lainnya diatur melalui sistem, dengan memanfaatkan activity stack. Keadaan suatu activity ditentukan oleh posisinya dalam tumpukan acitivity, LIFO (Last In First Out) dari semua aplikasi yang sedang berjalan. Bila suatu activity baru dimulai, activity yang sebelumnya digunakan maka akan dipindahkan ketumpukan paling atas. Jika pengguna ingin menggunakan activity sebelumnya, cukup menekan tombol Back, atau menutup activity yang sedang digunakan, maka activity yang berada diatas akan aktif kembali. Memory Manager android menggunakan tumpukkan ini untuk menentukan prioritas aplikasi berdasarkan activity, memutuskan untuk mengakhiri suatu aplikasi dan mengambil sumber daya dari aplikasi tersebut.

Ketika activity diambil dan disimpan dalam tumpukkan activity terdapat 4 kemungkinan kondisi transisi yang akan terjadi [Reto Meier, Profesional Android Application Development, Wiley Publishing, Canada, 2009]:

  1. Active, setiap activity yang berada ditumpukan paling atas, maka dia akan terlihat, terfokus, dan menerima masukkan dari pengguna. Android akan berusaha untuk membuat activity aplikasi ini untuk untuk tetap hidup dengan segala cara, bahkan akan menghentikan activity yang berada dibawah tumpukkannya jika diperlukan. Ketika activity sedang aktif, maka yang lainnya akan dihentikan sementara.
  2. Paused, dalam beberapa kasus activity akan terlihat tapi tidak terfokus pada kondisi inilah disebut paused. Keadaan ini terjadi jika activity transparan dan tidak fullscreen pada layar. Ketika activity dalam keadaan paused, dia terlihat active namun tidak dapat menerima masukkan dari pengguna. Dalam kasus ekstrim, android akan menghentikan activity dalam keadaan paused ini, untuk menunjang sumber daya bagi activity yang sedang aktif.
  3. Stopped, ketika sebuah activity tidak terlihat, maka itulah yang disebut stopped. Activity akan tetap berada dalam memori dengan semua keadaan dan informasi yang ada. Namun akan menjadi kandidat utama untuk dieksekusi oleh sistem ketika membutuhkan sumberdaya lebih. Oleh karenanya ketika suatu activity dalam kondisi stopped maka perlu disimpan data dan kondisi antarmuka saat itu. Karena ketika activity telah keluar atau ditutup, maka dia akan menjadi inactive.
  4. Inactive, kondisi ketika activity telah dihentikan dan sebelum dijalankan. Inactive activity telah ditiadakan dari tumpukan activity sehingga perlu restart ulang agar dapat tampil dan digunakan kembali.
Kondisi transisi ini sepenuhnya ditangani oleh manajer memori android. Android akan memulai menutup aplikasi yang mengandung activity inactive, kemudian stopped activity, dan dalam kasus luar biasa paused activity juga akan di tutup.

- Services

Suatu service tidak memiliki tampilan antarmuka, melainkan berjalan di background untuk waktu yang tidak terbatas. Komponen service diproses tidak terlihat, memperbarui sumber data dan menampilkan notifikasi. Service digunakan untuk melakukan pengolahan data yang perlu terus diproses, bahkan ketika Activity tidak aktif atau tidak tampak.
- Intents

Intens merupakan sebuah mekanisme untuk menggambarkan tindakan tertentu, seperti memilih foto, menampilkan halaman web, dan lain sebagainya. Intents tidak selalu dimulai dengan menjalankan aplikasi, namun juga digunakan oleh sistem untuk memberitahukan ke aplikasi bila terjadi suatu hal, misal pesan masuk. Intents dapat eksplisit atau implisit, contohnya jika suatu aplikasi ingin menampilkan URL, sistem akan menentukan komponen apa yang dibutuhkan oleh Intents tersebut.

- Broadcast Receivers

Broadcast Receivers merupakan komponen yang sebenarnya tidak melakukan apa-apa kecuali menerima dan bereaksi menyampaikan pemberitahuan. Sebagian besar Broadcast berasal dari sistem misalnya, Batre sudah hampir habis, informasi zona waktu telah berubah, atau pengguna telah merubah bahasa default pada perangkat. Sama halnya dengan service, Broadcast Receivers tidak menampilkan antarmuka pengguna. Namun, Broadcast Receivers dapat menggunakan Notification Manager untuk memberitahukan sesuatu kepada pengguna.

- Content Providers
Content Providers digunakan untuk mengelola dan berbagi database. Data dapat disimpan dalam file sistem, dalam database SQLite, atau dengan cara lain yang pada prinsipnya sama. Dengan adanya Content Provider memungkinkan antar aplikasi untuk saling berbagi data. Komponen ini sangat berguna ketika sebuah aplikasi membutuhkan data dari aplikasi lain, sehingga mudah dalam penerapannya.


Tipe Aplikasi Android

Terdapat tiga kategori aplikasi pada android [Reto Meier, Profesional Android Application Development, Wiley Publishing, Canada, 2009] :


  1. Foreground Activity, Aplikasi yang hanya dapat dijalankan jika tampil pada layar dan tetap efektif walaupun tidak terlihat. Aplikasi dengan tipe ini pasti mempertimbangkan siklus hidup activity, sehingga perpindahan antar activity dapat berlangsung dengan lancar.
  2. Background Service, Aplikasi yang memiliki interaksi terbatas dengan user, selain dari pengaturan konfigurasi, semua dari prosesnya tidak tidak tampak pada layar. Contohnya aplikasi penyaringan panggilan atau sms auto respon.
  3. Intermittent Activity, Aplikasi yang masih membutuhkan beberapa masukkan dari pengguna, namun sebagian sangat efektif jika dijalankan di background dan jika diperlukan akan memberi tahu pengguna tentang kondisi tertentu. Contohnya pemutar musik.


Untuk aplikasi yang kompleks akan sulit untuk menentukan kategori aplikasi tersebut apalagi aplikasi memiliki ciri-ciri dari semua kategori. Oleh karenanya perlu pertimbangan bagaimana aplikasi tersebut digunakan dan menentukan kategori aplikasi yang sesuai.

Siklus Hidup Aplikasi Android

Siklus hidup aplikasi android dikelola oleh sistem, berdasarkan kebutuhan pengguna, sumberdaya yang tersedia, dan sebagainya. Misalnya Pengguna ingin menjalankan browser web, pada akhirnya sistem yang akan menentukan menjalankan aplikasi. Sistem sangat berperan dalam menentukan apakah aplikasi dijalankan, dihentikan sementara, atau dihentikan sama sekali. Jika pengguna ketika itu sedang menjalankan sebuah Activity, maka sistem akan memberikan perioritas utama untuk aplikasi yang tersebut. Sebaliknya, jika suatu Activity tidak terlihat dan sistem membutuhkan sumber daya yang lebih, maka Activity yang prioritas rendah akan ditutup. [Sayed . Y. Hashimi and Satya Komatineni, Pro Android, Apress, USA 2009]

Android menjalankan setiap aplikasi dalam proses secara terpisah, yang masing-masing memliki mesin virtual pengolah sendiri, dengan ini melindungi penggunaan memori pada aplikasi. Selain itu juga android dapat mengontrol aplikasi mana yang layak menjadi prioritas utama. Karenanya android sangat sensitive dengan siklus hidup aplikasi dan komponen-komponennya. Perlu adanya penanganan terhadap setiap kondisi agar aplikasi menjadi stabil.

Sebagai contoh dibawah ini skema audio pada android:


Sekian pembahasan tentang cara kerja arsitektur android. Semoga bisa bermanfaat untuk pembaca. Di tulisan berikutnya kita akan membahas dan mulai coding aplikasi android. Pantengin terus blognya.

Jangan lupa share jika tulisan ini bermanfaat. terima kasih.

Pandu Septian Gumilar

{picture#http://kekirian.com/wp-content/uploads/2015/12/10419440_814838468537519_2081836625630750537_n-150x150.jpg} YOUR_PROFILE_DESCRIPTION {facebook#YOUR_SOCIAL_PROFILE_URL} {twitter#YOUR_SOCIAL_PROFILE_URL} {google#YOUR_SOCIAL_PROFILE_URL} {pinterest#YOUR_SOCIAL_PROFILE_URL} {youtube#YOUR_SOCIAL_PROFILE_URL} {instagram#YOUR_SOCIAL_PROFILE_URL}
Powered by Blogger.