Pages

Saturday, September 22, 2018

Register & Login Android .apk dengan MySQL

Kali ini mau bikin aplikasi buat login dan register Android. Data pake MySQL yg kesimpen di server. koneksinya masih pake cara lama, HttpConnection. Cuma pake 2 activity (1) activity untuk proses Login dan post Login, dan (2) activity untuk Register user. Activity pertama menggunakan RelativeLayout yang di mainin Visible-nya. OK langsung ajahh...

Pertama, diasumsikan kalian dah punya paket AMP (Apache Mysql PHP), entah itu XAMPP atau lainnya, nanti akan difungsikan sebagai WebService. Trus buat MySQL tabelnya.

    CREATE TABLE `users` (
        `idx` int(11) NOT NULL AUTO_INCREMENT,
        `user` varchar(30) NOT NULL,
        `pass` varchar(40) NOT NULL,
        `email` varchar(60) NOT NULL,
        `created_at` datetime DEFAULT NULL,
        `updated_at` datetime DEFAULT NULL,
        PRIMARY KEY (`idx`),
        UNIQUE KEY `user` (`user`),
        UNIQUE KEY `email` (`email`)
    )


Lanjut, file index.php untuk API (Aplication Program Interface), yang akan menjadikan AMP kita jadi WebService. Untuk keperluan ini, letakkan file index.php ini di folder \xampp\httdocs\android\api\

    // =============
    // param2 ini biasa disimpan dalam file .php tersendiri   
    // =============
    $DB_HOST = "localhost";
    $DB_USER = "root";
    $DB_PASS = "";
    $DB_NAME = "android";

    $tb_user = "users";

    // =============
    // mulai routine
    // =============
   
    $conn = mysqli_connect($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME) or die("Koneksi gagal");
    $json = array();

    $u = "";
    $p = "";
    $e = "";

    $s1 = 0;

    if(isset($_POST['u'])){
        $username = $_POST['u'];
    } else $s1++;

    if(isset($_POST['p'])){
        $password = $_POST['p'];
    } else $s1++;

    if(isset($_POST['e'])){
        $email = $_POST['e'];
    } else $s1++;

    if ($s1 > 1) {
        $json['status'] = 0;       
        $json['pesan'] = "Error 404";
        echo json_encode($json);
        return;
    }

    // =============
    // ada email: Registration of new user
    // =============
    if(!empty($username) && !empty($password) && !empty($email)){
        $hashed_password = md5($password);
       
        if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $query = "select * from ".$tb_user." where user= '$username' OR email = '$email'";
            $result = mysqli_query($conn, $query);
            if (mysqli_num_rows($result) > 0){
                $json['status'] = 0;
                $json['pesan'] = "Gagal: username/email sudah digunakan";
            } else {
                $query = "insert into ".$tb_user." (user, pass, email, created_at, updated_at) values ('$username', '$hashed_password', '$email', NOW(), NOW())";
                $inserted = mysqli_query($conn, $query);
                if ($inserted == 1){
                    $json['status'] = 1;
                    $json['pesan'] = "Registrasi sukses";
                } else {
                    $json['status'] = 0;
                    $json['pesan'] = "Gagal: tidak bisa membuat username ".$username;
                }
            }
        } else {
            $json['status'] = 0;
            $json['pesan'] = "Gagal: email nggak valid";
        }   
    }

    // =============
    // tanpa email: User Login
    // =============
    if(!empty($username) && !empty($password) && empty($email)){
        $hashed_password = md5($password);
       
        $query = "select * from ".$tb_user." where user = '$username' AND pass = '$hashed_password' Limit 1";
        $result = mysqli_query($conn, $query);
        if (mysqli_num_rows($result) > 0){
            $json['status'] = 1;
            $json['pesan'] = "Login sukses";
        } else {
            $json['status'] = 0;
            $json['pesan'] = "Login gagal";
        }
    }

    echo json_encode($json);
    mysqli_close($conn);
?>


Lanjutkan dengan file untuk buat aplikasi Android, disini saya pake Eclipse (saya anggap kalian dah biasa bikin apk, jadi langsung file-nya saja)

Pertama, file activity_main.xml


    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#eeffee"
    tools:context=".MainActivity" >

            android:id="@+id/lay_logged"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="@dimen/activity_margin_16"
        android:layout_marginRight="@dimen/activity_margin_16"
        android:visibility="invisible" >
       
                          android:id="@+id/tv_welcome"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:text="@string/app_name"
            android:textAppearance="?android:attr/textAppearanceMedium" />
           
                    android:id="@+id/v1"
            android:layout_width="wrap_content"
            android:layout_height="2dp"
            android:layout_below="@+id/tv_welcome"
            android:background="#88aa88" >
                       
       

       
                    android:id="@+id/linBlank"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@+id/v1"
            android:orientation="vertical"
            android:padding="@dimen/activity_margin_8" >

                            android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:text="@string/login_sukses" />
           

       
   


            android:id="@+id/tbl_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_margin="@dimen/activity_margin_16"
        android:background="#ddeedd"
        android:padding="@dimen/activity_margin_16" >

                    android:layout_width="match_parent"
            android:layout_height="wrap_content" >

                            android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="@dimen/activity_margin_8"
                android:text="@string/username"
                android:textAppearance="?android:attr/textAppearanceMedium"
                tools:ignore="RtlHardcoded" />

                            android:id="@+id/username_field"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:inputType="text" />

       


                    android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/activity_margin_8" >

                            android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/password"
                android:textAppearance="?android:attr/textAppearanceMedium" />

                            android:id="@+id/password_field"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:inputType="textPassword" />

       


       

   


Kedua file activity_regs.xml


    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#eeffee"
    tools:context="com.munengan7camp.gotrah.RegsActivity" >
   
            android:id="@+id/lin_register"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_margin="@dimen/activity_margin_16"
        android:background="#00008800"
        android:orientation="vertical" >
       
                    android:id="@+id/et_username"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/activity_margin_8"
            android:hint="@string/username"
            android:inputType="text"
            android:textColor="#444444" />
           
                    android:id="@+id/et_pass"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/activity_margin_8"
            android:hint="@string/password"
            android:inputType="textPassword"
            android:textColor="#444444" />
       
                    android:id="@+id/et_retype_pass"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/activity_margin_8"
            android:hint="@string/re_type_pwd"
            android:inputType="textPassword"
            android:textColor="#444444" />
       
                    android:id="@+id/et_email"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/activity_margin_8"
            android:hint="@string/email"
            android:inputType="textEmailAddress"
            android:textColor="#444444" />
       
       


Lanjut file pendukung, string.xml




    Registrasi Login
    Username
    Password
    re-type pwd
    Email
    Login
    Logout
    Not registered\nKlik buton to register
    Register now
    Login sukses
    unable to connect to server, check internet connection


Dan ini file dimens.xml untuk spasi layout




   
    4dp
    8dp
    16dp
    32dp



Sekarang file java-nya

Pertama file MainActivity.java

package com.munengan7camp.registrasilogin;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TableLayout;
import android.widget.TextView;
import android.widget.Toast;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity {

    protected String enteredUsername;
    String last_user = "";

    TableLayout tbl_log_in;
    LinearLayout linBlank;
    RelativeLayout lay_logged;

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

        last_user = getItemShared(UtilitiLogin.shared_user_info);

        tbl_log_in = (TableLayout) findViewById(R.id.tbl_login);
        lay_logged = (RelativeLayout) findViewById(R.id.lay_logged);
        linBlank   = (LinearLayout) findViewById(R.id.linBlank);

        final EditText et_username = (EditText) findViewById(R.id.username_field);
        final EditText et_password = (EditText) findViewById(R.id.password_field);

        Button loginButton = (Button) findViewById(R.id.btn_login);
        loginButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                enteredUsername = et_username.getText().toString();
                String enteredPassword = et_password.getText().toString();
                if (enteredUsername.equals("") || enteredPassword.equals("")) {
                    Toast.makeText(MainActivity.this,
                            "Username / password can not zonk",
                            Toast.LENGTH_SHORT).show();
                    return;
                }

                POST_LoginClass asyncRequestObject = new POST_LoginClass();
                asyncRequestObject.execute(UtilitiLogin.urlIndex,
                        enteredUsername, enteredPassword);
            }
        });

        Button registerButton = (Button) findViewById(R.id.btn_register);
        registerButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent_register = new Intent(MainActivity.this,RegsActivity.class);
                startActivity(intent_register);
            }
        });

        Button btLogout = (Button) findViewById(R.id.btn_logout);
        btLogout.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                AlertDialog.Builder log_out = new AlertDialog.Builder(MainActivity.this);
                log_out.setTitle("Log-out ?");

                // OK
                log_out.setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                                // hapus data login
                                SharedPreferences preferences = PreferenceManager
                                        .getDefaultSharedPreferences(getApplicationContext());
                                SharedPreferences.Editor editor = preferences.edit();
                                editor.clear();
                                editor.commit();

                                last_user = "";
                                tbl_log_in.setVisibility(View.VISIBLE);
                                lay_logged.setVisibility(View.GONE);
                            }
                        });

                // CANCEL
                log_out.setNegativeButton("No",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int whichButton) {
                            }
                        });

                log_out.show();               
            }
        });
    }

    protected void onResume() {

        super.onResume();
        last_user = getItemShared(UtilitiLogin.shared_user_info);

        if (last_user == null) {
            tbl_log_in.setVisibility(View.VISIBLE);
            lay_logged.setVisibility(View.GONE);
        } else {
            logged_in();
        }
    }

    private void saveItemShared(String item, String isi) {
        SharedPreferences preferences = PreferenceManager
                .getDefaultSharedPreferences(getApplicationContext());
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString(item, isi);
        editor.apply();
    }

    private String getItemShared(String item) {
        SharedPreferences preferences = PreferenceManager
                .getDefaultSharedPreferences(getApplicationContext());
        String name = preferences.getString(item, null);
        return name;
    }

    private void logged_in() {
        TextView tv_log_as = (TextView) findViewById(R.id.tv_welcome);
        tv_log_as.setText("Login as " + last_user);

        tbl_log_in.setVisibility(View.GONE);
        lay_logged.setVisibility(View.VISIBLE);
    }

    // ===========
    // class login
    // ===========
    private class POST_LoginClass extends AsyncTask {
        ProgressDialog pdQuery = new ProgressDialog(MainActivity.this);

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pdQuery.setTitle("Loging in");
            pdQuery.setMessage("Please wait...");
            pdQuery.setCancelable(false);
            pdQuery.show();
        }

        @Override
        protected String doInBackground(String... params) {
            List nameValuePairs = new ArrayList(2);
            nameValuePairs.add(new BasicNameValuePair("u", params[1]));
            nameValuePairs.add(new BasicNameValuePair("p", params[2]));

            String jRes = UtilitiLogin.POST_HTTP_Request(params[0],
                    nameValuePairs);
            return jRes;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            pdQuery.dismiss();

            if (result.equals("") || result == null) {
                Toast.makeText(MainActivity.this, getString(R.string.gagal_konek),
                        Toast.LENGTH_SHORT).show();
                return;
            }

            int status = UtilitiLogin.integerParsedJsonObject(result);
            if (status == 0) {
                String pesan = UtilitiLogin.stringParsedJsonObject(result);
                Toast.makeText(MainActivity.this, pesan, Toast.LENGTH_LONG).show();
                return;
            }

            if (status == 1) {
                saveItemShared(UtilitiLogin.shared_user_info, enteredUsername);
                last_user = enteredUsername;
                logged_in();
            }
        }
    }

    // ===============
    // class list_trah, kalo mo pake GET [bukan POST]
    // ===============
    /*
    private class GET_ListClass extends AsyncTask {
        ProgressDialog pdQuery = new ProgressDialog(MainActivity.this);
        String url="";

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pdQuery.setTitle("retrieving");
            pdQuery.setMessage("please_wait");
            pdQuery.setIndeterminate(false);
            pdQuery.setCancelable(false);
            pdQuery.show();
        }

        @Override
        protected String doInBackground(String... params) {
            url = params[0];
            String jsonResult = UtilitiLogin.GET_HTTP_Request(url);
            return jsonResult;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            pdQuery.dismiss();

            if ( url.startsWith(UtilitiLogin.urlListTrah) ) {
                list_trah(result);
            } else {
                hapus_item(result);
            }
        }
    }
    */
}


Lanjut ke file RegsActivity.java

package com.munengan7camp.registrasilogin;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import java.util.ArrayList;
import java.util.List;

public class RegsActivity extends Activity {

    protected String enteredUsername;

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

        final EditText username = (EditText) findViewById(R.id.et_username);
        final EditText password = (EditText) findViewById(R.id.et_pass);
        final EditText re_type = (EditText) findViewById(R.id.et_retype_pass);
        final EditText email = (EditText) findViewById(R.id.et_email);

        Button signUpButton = (Button) findViewById(R.id.btn_ok_register);
        signUpButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                enteredUsername = username.getText().toString();
                String enteredPassword = password.getText().toString();
                String retypePassword = re_type.getText().toString();
                String enteredEmail = email.getText().toString();

                if (enteredUsername.equals("") || enteredPassword.equals("")
                        || retypePassword.equals("") || enteredEmail.equals("")) {
                    Toast.makeText(RegsActivity.this,
                            "Username / password / email can not empty",
                            Toast.LENGTH_SHORT).show();
                    return;
                }

                if (!enteredPassword.equals(retypePassword)) {
                    Toast.makeText(RegsActivity.this,
                            "re-type password not match", Toast.LENGTH_SHORT)
                            .show();
                    return;
                }
                // request authentication with remote server
                POST_RegistrasiClass asyncRequestObject = new POST_RegistrasiClass();
                asyncRequestObject.execute(UtilitiLogin.urlIndex, enteredUsername,
                        enteredPassword, enteredEmail);
            }
        });

    }

    // ================
    // class registrasi
    // ================
    private class POST_RegistrasiClass extends AsyncTask {
        ProgressDialog pdQuery= new ProgressDialog(RegsActivity.this);

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pdQuery.setTitle("Registering");
            pdQuery.setMessage("Wait please ...");
            pdQuery.setCancelable(false);
            pdQuery.show();
        }

        @Override
        protected String doInBackground(String... params) {
            List nameValuePairs = new ArrayList(2);
            nameValuePairs.add(new BasicNameValuePair("u", params[1]));
            nameValuePairs.add(new BasicNameValuePair("p", params[2]));
            nameValuePairs.add(new BasicNameValuePair("e", params[3]));

            String jRes = UtilitiLogin.POST_HTTP_Request(params[0], nameValuePairs);   
            return jRes;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            pdQuery.dismiss();

            if (result.equals("") || result == null) {
                Toast.makeText(RegsActivity.this, getString(R.string.gagal_konek), Toast.LENGTH_SHORT).show();
                return;
            }

            int status = UtilitiLogin.integerParsedJsonObject(result);
            String pesan = UtilitiLogin.stringParsedJsonObject(result);
            if (status == 0) {
                if (pesan == null) pesan="Kesalahan lain-lain";
                Toast.makeText(RegsActivity.this, pesan, Toast.LENGTH_SHORT).show();
                return;
            }

            if (status == 1) {
                // simpan login info
                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
                SharedPreferences.Editor editor = preferences.edit();
                editor.putString(UtilitiLogin.shared_user_info, enteredUsername);
                editor.apply();
                editor.commit();

                onBackPressed();
                return;
            }
        }
    }
   
}


dan jangan lupa file utilitas pembantu. UtilitiLogin.java

package com.munengan7camp.registrasilogin;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.json.JSONException;
import org.json.JSONObject;

public class UtilitiLogin {

    public static final String shared_user_info = "my_user_name";            // sesuaikan, jgn ampe bentrok ama apk lain
    public static final String urlServer   = "http://10.0.2.2/android/api/"; // sesuaikan ama (X)AMP ente
    public static final String urlIndex    = urlServer + "index.php";

    public static StringBuilder inputStreamToString(InputStream is) {
        String rLine = "";
        StringBuilder answer = new StringBuilder();
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        try {
            while ((rLine = rd.readLine()) != null) {
                answer.append(rLine);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return answer;
    }

    public static int integerParsedJsonObject(String result) {
        JSONObject resultObject = null;
        int returnedResult = 0;
        try {
            resultObject = new JSONObject(result);
            returnedResult = resultObject.getInt("status");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return returnedResult;
    }

    public static String stringParsedJsonObject(String result) {
        JSONObject resultObject = null;
        String returnedResult = "";
        try {
            resultObject = new JSONObject(result);
            returnedResult = resultObject.getString("pesan");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return returnedResult;
    }
   
    public static String POST_HTTP_Request(String url, List params) {
        HttpParams httpParameters = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParameters, 10000);
        HttpConnectionParams.setSoTimeout(httpParameters, 10000);       
        HttpClient httpClient = new DefaultHttpClient(httpParameters);

        HttpPost httpPost = new HttpPost(url);

        String jsonResult = "";
        try {
            httpPost.setEntity(new UrlEncodedFormEntity(params));
            HttpResponse response = httpClient.execute(httpPost);
            jsonResult = inputStreamToString(
                    response.getEntity().getContent()).toString();
            System.out.println("Returned Json object "+ jsonResult.toString());
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonResult;
    }   
   
    /*
    public static String GET_HTTP_Request(String params) {
        HttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(params);
        String jsonResult = "";
        try {
            HttpResponse response = httpClient.execute(httpGet);
            jsonResult  = inputStreamToString(
                    response.getEntity().getContent()).toString();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return jsonResult;
    }
    */
}


Jangan lupa, tambahkan permission.INTERNET di Manifest, ini  lengkapnya file AndroidManifest.xml


    package="com.munengan7camp.registrasilogin"
    android:versionCode="1"
    android:versionName="1.0"
    android:installLocation="auto" >
   
   

            android:minSdkVersion="14"
        android:targetSdkVersion="14" />

            android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
                    android:name=".MainActivity"
            android:label="@string/app_name" >
           
               

               
           

       

                    android:name=".RegsActivity" >
       

   

 

dan, itu ajah. Kalo mo donlod file .zip (tanpa password) dari 4shared ini link-nya, dan selamat mencoba moga suskes... amin

oh ya, ditunggu komennya

Friday, June 23, 2017

Gotrah [silsilah keluarga]


Iseng-iseng lagi mbuat aplikasi untuk menyusun silsilah keluarga, saya kasih nama Gotrah. Aslinya, istilah gotrah itu merupakan istilah di Jawa yang berkonotasi keluarga besar.

Saya buat 2 versi : web dan .apk [android], keduanya menggunakan data yang sama sehingga akses dari web maupun .apk akan memberikan hasil yang sama. Tentu saja data ini dititipkan di server web [walau masih server gratisan, (sub)domain gratisan juga malah] sehingga kalian musti on-line untuk menggunakannya

Langsung ajah, alamatnya di http://gotrah.orgfree.com, dan yang menginginkan aplikasi ini untuk android ada link untuk unduh .apk-nya.




Memulai:
  1. Kunjungi http://gotrah.orgfree.com dan klik login atau register. Untuk yg penasaran dan pengin coba-coba dulu, gunakan username & password coba-2 : qwerty
  2. Kalo kalian pikir ini OK ya registrasi sendiri, gratis selamanya [eh... selama orgfree.com masih berkibar ya]
Download
Link donlot baru ada di filehosting gratisan, tolong kasih tau kalo dead-link ya. Kenapa blom ada di play-store: karna belom punya dana buat bikin akun Google Developer... hiks... makanya, plis deh klik iklan biar ada tambahan kocek buat ane... (ngarep dot kom)

Registrasi
  1. Username minimal 6 karakter
  2. email harus valid
Proses registrasi akan memeriksa apakah username dan/atau email sudah digunakan. Jika sudah digunakan maka registrasi gagal, cobalah mengganti username dan/atau email.

Menjalankan
Jika registrasi sukses, akan langsung dalam kondisi logged in. Tentu saja data masih kosong... Mulailah buat data baru DARI LELUHUR TERATAS [top level]. Aplikasi ini bisa untuk menambahkan data anak, cucu, dst, namun tidak diberi fasilitas untuk menambah “orang tua”. Data orang tua hanya bisa diganti, tidak ditambah.

Oh ya, untuk nyusun pohon silsilah keluarga mungkin perlu waktu agak lama, dan ini menguras resource server [ yg gratisan :) ]. Buat kalian yg berkutat di dunia koding mungkin dah maklum ama yg namanya proses rekursif. Berhubung datanya masih pake MySQL 5.x maka rekursi-nya pake php. MariaDB yg support kan versi 10.2.2, tp masih beta juga to (per Mei 2018).


Menambah data baru
Akan muncul form kosong, isi sesuai kemampuan. Jangan lupa klik simpan, atau tekan "back" untuk batal

Pada status Edit data [bukan tambah data], dapat dimasukkan foto pada anggota trah dengan menekan lama [long click] gambar bawah form. Gunakan file .JPG / .JPEG untuk poto, karna file .PNG belom bisa ditangani dengan baik . . .

Jika sudah ada beberapa data, beberapa menu berikut akan membantu selanjutnya
  1. menu Option
tekan tombol menu di Android kalian, akan muncul menu

  • Menu pertama adalah search [untuk memfilter hanya nama tertentu yang ditampilkan]
  • Menu info. Sebelum login bisa menampilkan option Cari, sesudah login menampilkan info angota grup
  • Menu berikutnya adalah menggambar pohon silsilah
  • Menu menampilkan data anggota trah yang yatim-piatu [tak ber-orang tua, misal karena data orang-tuanya di hapus]
  • Logout

  1. menu Context

Tekan lama [long click] salah satu nama di daftar nama, maka muncul menu context diatas

Di versi .apk, di menu Cari ada opsi untuk mengirim SMS (ke user ybs) atau e-mail (ke admin yang mendaftarkan). Kalo fungsi ini belom jalan baik, sabar ya....
Yg versi web, fungsi kirim e-mail malah di dis-able sama orgfree.com... jadi ya udah ya, drpd dikira spam...


Tips

Sebarkan username dan password yang kalian buat ke anggota trah agar semua bisa menambah & ngoreksi seperlunya




 
[obsolete]
link apk sebelumnya https://www.4shared.com/mobile/csnnpo6Gca/Gotrah.html
[update link 2 juli 2017 via mediafire]

Monday, January 2, 2017

Walikan.apk

Boso Walikan

Melanjutkan program boso walikan yang untuk PC (under win) penulis iseng buat program boso walikan yang untuk android. Hasilnya lumayan lah, tentu saja "hanya" mem-balik kata/kalimat secara apa adanya sesuai "pakem" boso walikan :) dan untuk "enak"nya pengucapan, masih musti disesuaikan. Silahkan berkreasi sendiri di bagian ini.
Kali ini, ada 3 item walikan : Jogja, Malang, dan Rotasi. Rotasi akan mem-flip teks menjadi terbalik.
Disediakan tombol untuk:
1. menghapus teks input
2. meng-copy teks konversi ke clipboard


Oh ya, ada menu untuk mencari weton tanggalan... Sementara baru weton dan hitungan neptu saja, belom ada primbon-nya... he he he


Disebelah kanan teks, disediakan tombol untuk menghapus [ X ] atau men-copy teks ke clipboard; kali aja ada yg mau paste ke sosmed  kalian... he he he

ini link di 4shared ... Seperti biasa, ada iklan AdMob nya... jangan lupa di klik ya iklannya . . .

[update link 2 juli 2017 via mediafire]

[ update 13 juli 2018 via playstore ]

Saturday, November 12, 2016

Struk SPBU 57mm [.apk]

hhmm . . .
ternyata posting Struk SPBU lumayan banyak peminatnya. Itu program under Win buat cetak struk di kertas berukuran 75mm. Yang donlot dari 4shared lebih dari 3500 unduhan sejak publikasi... lumayan ya... gak tau juga pada dipake buat apa... gak usah su'uzon [halah, sok alim]
OK... ceritanya, kemaren belajar bikin aplikasi buat android, dan karya pertama adalah Kiblat by Map [buat nyari kiblat ke Mekah dari lokasi "manapun"] pake peta simbah. Trus jadi tertarik buat aplikasi android yg Struk SPBU, ukuran 57mm. Dan ini hasilnya, sementara biar mangkal di 4shared [suwer, lom ada $25 buat bikin akun GD]. Gratis, tapi ada iklannya.. kalo kalian make, jangan lupa klik iklan ya... he he he . . . mksh sebelomnya . . .


itu ss di android 3,5"

Kalo ada yg minat, ini sebagian source-nya


1. Mulai dari halaman isian data SPBU, dll

Activity.xml

Spoiler Activity.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/mm57"
        android:background="#ff99cc00"
        android:id="@+id/textKop"
        android:gravity="center_horizontal"
        android:textColor="#ffff4444"
        android:textStyle="bold"
        android:textSize="20sp"
        android:paddingTop="5dp"
        android:paddingBottom="5dp" />

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textKop"
        android:layout_above="@+id/btn_ok">

        <TableLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="12dp">

            <!-- baris 1 : ID SPBU -->
            <TableRow
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingTop="5dp">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_column="1"
                    android:text="@string/id_spbu" />

                <EditText
                    android:id="@+id/id_spbu"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_column="2"
                    android:inputType="textCapCharacters" />

            </TableRow>

            <!-- baris 2 -->

            <TableRow>

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_column="1"
                    android:text="@string/header" />

                <EditText
                    android:id="@+id/header"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:inputType="text|textMultiLine|textPostalAddress"
                    android:hint="@string/alamat_spbu" />

            </TableRow>

            <!-- baris 3 -->

            <TableRow>

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_column="1"
                    android:text="@string/tgl_jam" />

                <EditText
                    android:id="@+id/tgl_jam"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:inputType="datetime"
                    android:hint="@string/dmy_hint" />
            </TableRow>

            <!-- baris 4 -->

            <TableRow>

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_column="1"
                    android:text="@string/no_nota" />

                <EditText
                    android:id="@+id/no_nota"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:inputType="number" />
            </TableRow>

            <!-- baris 5 -->

            <TableRow>

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_column="1"
                    android:text="@string/jns_bbm" />

                <EditText
                    android:id="@+id/jns_bbm"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_column="2"
                    android:inputType="text" />
            </TableRow>

            <!-- baris 6 -->

            <TableRow>

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_column="1"
                    android:text="@string/harga_l" />

                <EditText
                    android:id="@+id/harga_liter"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_column="2"
                    android:inputType="numberDecimal" />

            </TableRow>

            <!-- baris 7 -->

            <TableRow>

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_column="1"
                    android:text="@string/rp_beli" />

                <EditText
                    android:id="@+id/rp_beli"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:inputType="numberDecimal"/>

            </TableRow>

            <!-- baris 8 -->

            <TableRow>

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_column="1"
                    android:text="@string/ltr_beli" />

                <EditText
                    android:id="@+id/ltr_beli"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:inputType="numberDecimal" />

            </TableRow>

            <!-- baris 9 -->

            <TableRow
                android:layout_marginBottom="5dp">

                <TextView
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_column="1"
                    android:text="@string/footer" />

                <EditText
                    android:id="@+id/kaki"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="@string/footer_hint"
                    android:inputType="text|textMultiLine" />
            </TableRow>
        </TableLayout>
    </ScrollView>

    <!-- baris 10 -->

    <Button
        android:id="@+id/btn_ok"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/btn_ok"
        android:textColor="#ffcc0000"
        android:textStyle="bold"

        android:layout_alignParentBottom="true"/>

</RelativeLayout>





ini Activity.java

Spoiler Activity.java:
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;

import android.os.Bundle;
import android.text.InputFilter;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;
 

public class MainActivity extends Activity {

    Button btnOK;

    EditText etID_SPBU, et_header, et_tg_jam, et_noNota, et_jnsBBM;
    EditText et_h_ltr, et_RpBeli, et_LtrBeli, et_footer;

    AdsController app;
    LinearLayout layAd;
    MyUtils myU;
    Boolean gPlayOK;
    private InterstitialAd interstitial;

    private void saveItemStruk(String item, String isi) {
        SharedPreferences sharedPref = getSharedPreferences(item, MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPref.edit();
        editor.putString(item, isi);
        editor.commit();
    }

    private String getItemStruk(String item) {
        SharedPreferences sharedPref = getSharedPreferences(item, MODE_PRIVATE);
        String mySetting = sharedPref.getString(item, null);
        return mySetting;
    }

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

        etID_SPBU = (EditText)findViewById(R.id.id_spbu);
        etID_SPBU.setFilters(new InputFilter[]{new InputFilter.AllCaps()});

        et_header = (EditText)findViewById(R.id.header);
        et_tg_jam = (EditText)findViewById(R.id.tgl_jam);
        et_noNota = (EditText)findViewById(R.id.no_nota);
        et_jnsBBM = (EditText)findViewById(R.id.jns_bbm);
        et_h_ltr  = (EditText)findViewById(R.id.harga_liter);
        et_RpBeli = (EditText)findViewById(R.id.rp_beli);
        et_LtrBeli= (EditText)findViewById(R.id.ltr_beli);
        et_footer = (EditText)findViewById(R.id.kaki);

        etID_SPBU.setText(getItemStruk("ID"));
        et_header.setText(getItemStruk("heder"));
        et_tg_jam.setText(getItemStruk("tgl"));
        et_noNota.setText(getItemStruk("nota"));
        et_jnsBBM.setText(getItemStruk("bbm"));
        et_h_ltr.setText(getItemStruk("harga"));
        et_RpBeli.setText(getItemStruk("beli"));
        et_LtrBeli.setText(getItemStruk("liter"));
        et_footer.setText(getItemStruk("f00ter"));

        btnOK = (Button) findViewById(R.id.btn_ok);
        registerForContextMenu(btnOK);

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

    public void displayInterstitial() {
        if (interstitial.isLoaded()) {
            interstitial.show();
        }
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
                                    ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("Lanjut mode cetak");
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.struk_1:
                struk_1();
                break;
            case R.id.struk_2:
                struk_2();
                break;
            case R.id.struk_3:
                struk_3();
                break;
            case R.id.help:
                panduan();
                break;
            default:
                return super.onContextItemSelected(item);
        }
        return true;
    }

    private void posting(Intent intent) {
        intent.putExtra("ID", etID_SPBU.getText().toString());
        intent.putExtra("header", et_header.getText().toString());
        intent.putExtra("tgl_jam", et_tg_jam.getText().toString());
        intent.putExtra("no_nota", et_noNota.getText().toString());
        intent.putExtra("BBM", et_jnsBBM.getText().toString());
        intent.putExtra("harga", et_h_ltr.getText().toString());
        intent.putExtra("rp_beli", et_RpBeli.getText().toString());
        intent.putExtra("ltr_beli", et_LtrBeli.getText().toString());
        intent.putExtra("f00ter", et_footer.getText().toString());
    }

    public void struk_1() {
        Intent intent = new Intent(MainActivity.this, Struk1.class);
        posting(intent);
        startActivity(intent);
    }
 

    public void onDestroy() {
        saveItemStruk("ID",etID_SPBU.getText().toString());
        saveItemStruk("heder",et_header.getText().toString());
        saveItemStruk("tgl",et_tg_jam.getText().toString());
        saveItemStruk("nota",et_noNota.getText().toString());
        saveItemStruk("bbm",et_jnsBBM.getText().toString());
        saveItemStruk("harga",et_h_ltr.getText().toString());
        saveItemStruk("beli",et_RpBeli.getText().toString());
        saveItemStruk("liter",et_LtrBeli.getText().toString());
        saveItemStruk("f00ter",et_footer.getText().toString());

        super.onDestroy();
    }
}



2. Halaman struk


struk1.xml

Spoiler Struk1.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ScrollView
        android:id="@+id/sv_id1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_marginBottom="5dp"
        android:layout_above="@+id/linearLayout">

        <LinearLayout
            android:layout_width="57mm"
            android:layout_marginLeft="3mm"
            android:layout_marginRight="3mm"
            android:layout_marginTop="3mm"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <ImageView
                android:id="@+id/img_kop"
                android:layout_width="wrap_content"
                android:layout_height="100dp"
                android:contentDescription="@string/todo"
                android:src="@drawable/kop_256" />

                <!-- baris 2 ; ID SPBU -->

            <TextView
                android:id="@+id/id_spbu1"
                android:textSize="28sp"
                android:textStyle="bold"
                android:gravity="center_horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/id_spbu" />

            <TextView
                android:id="@+id/header1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/alamat_spbu"
                android:textSize="22sp"
                android:paddingBottom="15dp"
                android:text="@string/alamat_spbu"
                android:gravity="center_horizontal" />

            <TextView
                android:id="@+id/shift1"
                android:text="@string/shift"
                android:textSize="22sp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/tgl_jam1"
                android:textSize="22sp"
                android:text="@string/tgl_jam"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

            <TextView
                android:id="@+id/top_line1"
                android:layout_width="wrap_content"
                android:layout_height="12dp"
                android:textSize="22sp"
                android:text="@string/line"
                android:textStyle="bold" />

            <!-- sebelum garis atas -->

            <TableLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:stretchColumns="3">

                <TableRow
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" >

                    <TextView
                        android:id="@+id/p_pompa11"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_column="1"
                        android:text="@string/pulau"
                        android:textSize="22sp" />

                    <TextView
                        android:id="@+id/p_pompa12"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_column="2"
                        android:textSize="22sp"
                        android:text="@string/pompa"
                        android:layout_span="2"
                        android:layout_weight="1" />
                </TableRow>

                <!-- baris 3 ; jenis BBM  -->

                <TableRow
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content">

                    <TextView
                        android:id="@+id/jns_bbm11"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_column="1"
                        android:text="@string/produk"
                        android:textSize="22sp" />

                    <TextView
                        android:id="@+id/jns_bbm12"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_column="2"
                        android:textSize="22sp"
                        android:layout_weight="1"
                        android:layout_span="2" />
                </TableRow>

                <!-- baris 3 ; harga / liter -->

                <TableRow
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content">

                    <TextView
                        android:id="@+id/harga_liter11"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_column="1"
                        android:text="@string/harga_l"
                        android:textSize="22sp" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_column="2"
                        android:text="@string/rp"
                        android:textSize="22sp"
                        android:id="@+id/harga_liter12"
                        android:layout_weight="1"
                        android:layout_span="2" />

                    <TextView
                        android:id="@+id/harga_liter13"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_column="3"
                        android:text="@string/tmp"
                        android:textSize="22sp"
                        android:paddingRight="66dp"
                        android:gravity="right" />
                </TableRow>

                <!-- baris 5 ; liter beli  -->

                <TableRow
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content">

                    <TextView
                        android:id="@+id/ltr_beli11"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_column="1"
                        android:text="@string/ltr_beli"
                        android:textSize="22sp" />

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_column="2"
                        android:text="@string/n1"
                        android:textSize="22sp"
                        android:id="@+id/ltr_beli12"
                        android:layout_span="2"
                        android:layout_weight="1" />

                    <TextView
                        android:id="@+id/ltr_beli13"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_column="3"
                        android:text="@string/tmp"
                        android:textSize="22sp"
                        android:paddingRight="66dp"
                        android:gravity="right" />
                </TableRow>

                <!-- baris 6 ; jumlah bayar -->
               
                <TableRow
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" >

                    <TextView
                        android:id="@+id/rp_beli11"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_column="1"
                        android:text="@string/rp_beli"
                        android:textSize="22sp" />

                    <TextView
                        android:id="@+id/rp_beli12"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_column="2"
                        android:text="@string/rp"
                        android:textSize="22sp"
                        android:layout_span="2"
                        android:layout_weight="1" />

                    <TextView
                        android:id="@+id/rp_beli13"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_column="3"
                        android:text="@string/tmp"
                        android:textSize="21sp"
                        android:layout_weight="1"
                        android:paddingRight="66dp"
                        android:gravity="right" />

                </TableRow>

                <!-- baris 7 ; FOOTER -->

                <TableRow
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content">
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="12dp"
                        android:layout_span="3"
                        android:layout_weight="1"
                        android:textSize="22sp"
                        android:text="@string/line"
                        android:textStyle="bold"
                        android:id="@+id/btm_line1"
                        android:layout_column="1" />
                </TableRow>

                <TableRow
                    android:paddingBottom="15dp"
                    android:layout_width="match_parent">
                    <TextView
                        android:id="@+id/f00ter"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:textSize="22sp"
                        android:layout_span="3"
                        android:layout_weight="1"
                        android:text="@string/footer"
                        android:gravity="center_horizontal"
                        android:layout_column="1" />
                </TableRow>
            </TableLayout>
        </LinearLayout>
    </ScrollView>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/linearLayout"
        android:gravity="center_horizontal"
        android:layout_alignParentBottom="true" >

        <Button
            android:id="@+id/btn_back"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/btn_back" />
        <Button
            android:id="@+id/btn_simpan_jpg"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/btn_jpeg" />
        <Button
            android:id="@+id/btn_print"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/btn_print"  />
    </LinearLayout>

</RelativeLayout>



struk1.java

Spoiler Struk1.java:
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.v4.print.PrintHelper;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

public class Struk1 extends Activity {

    Typeface face_txt;

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

        Intent intent = getIntent();
        String ID = intent.getStringExtra("ID");
        String header = intent.getStringExtra("header");
        String tgl_jam = intent.getStringExtra("tgl_jam");
        String no_nota = intent.getStringExtra("no_nota");
        String BBM = intent.getStringExtra("BBM");
        String harga = intent.getStringExtra("harga");
        String rp_beli = intent.getStringExtra("rp_beli");
        String ltr_beli = intent.getStringExtra("ltr_beli");
        String f00ter = intent.getStringExtra("f00ter");

        face_txt = Typeface.createFromAsset(getAssets(), "fonts/telidon_hv.ttf");

        TextView tvID_SPBU1 = (TextView) findViewById(R.id.id_spbu1);
        tvID_SPBU1.setTypeface(face_txt);
        tvID_SPBU1.setText(ID);

        TextView tvHeader1 = (TextView) findViewById(R.id.header1);
        tvHeader1.setTypeface(face_txt);
        tvHeader1.setText(header);

        TextView tvShift1 = (TextView) findViewById(R.id.shift1);
        tvShift1.setTypeface(face_txt);
        tvShift1.setText("Shift: 1 No. Trans.: "+no_nota);

        TextView tvTglJam1= (TextView) findViewById(R.id.tgl_jam1);
        tvTglJam1.setTypeface(face_txt);
        tvTglJam1.setText("Waktu: "+tgl_jam);
 

        TextView no_pp11 = (TextView) findViewById(R.id.p_pompa11);
        no_pp11.setTypeface(face_txt);

        TextView no_pp12 = (TextView) findViewById(R.id.p_pompa12);
        no_pp12.setTypeface(face_txt);

        TextView jns_bbm0 = (TextView) findViewById(R.id.jns_bbm11);
        jns_bbm0.setTypeface(face_txt);

        TextView tvJnsBBM1= (TextView) findViewById(R.id.jns_bbm12);
        tvJnsBBM1.setTypeface(face_txt);
        tvJnsBBM1.setText(" : "+BBM);

        TextView hl11 = (TextView) findViewById(R.id.harga_liter11);
        hl11.setTypeface(face_txt);

        TextView hl12 = (TextView) findViewById(R.id.harga_liter12);
        hl12.setTypeface(face_txt);

        TextView tvHLiter1= (TextView) findViewById(R.id.harga_liter13);
        tvHLiter1.setTypeface(face_txt);
        tvHLiter1.setText(harga);

        TextView lb11 = (TextView) findViewById(R.id.ltr_beli11);
        lb11.setTypeface(face_txt);

        TextView lb12 = (TextView) findViewById(R.id.ltr_beli12);
        lb12.setTypeface(face_txt);

        TextView tvLtrBeli1= (TextView) findViewById(R.id.ltr_beli13);
        tvLtrBeli1.setTypeface(face_txt);
        tvLtrBeli1.setText(ltr_beli);

        TextView rb11 = (TextView) findViewById(R.id.rp_beli11);
        rb11.setTypeface(face_txt);

        TextView rb12 = (TextView) findViewById(R.id.rp_beli12);
        rb12.setTypeface(face_txt);

        TextView tvRpBeli1= (TextView) findViewById(R.id.rp_beli13);
        tvRpBeli1.setTypeface(face_txt);
        tvRpBeli1.setText(rp_beli);

        TextView tvBtmLine= (TextView) findViewById(R.id.btm_line1);
        tvBtmLine.setTypeface(face_txt);

        TextView tvFooter1 = (TextView) findViewById(R.id.f00ter);
        tvFooter1.setTypeface(face_txt);
        tvFooter1.setText(f00ter);

        Button btnBack = (Button)findViewById(R.id.btn_back);
        btnBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        Button btnPrint = (Button) findViewById(R.id.btn_print);
        btnPrint.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                View u = findViewById(R.id.sv_id1);
                ScrollView z = (ScrollView) findViewById(R.id.sv_id1);
 

                Bitmap bitmap = takeScreenShot(u, z);

                PrintHelper printHelper = new PrintHelper(Struk1.this);
                printHelper.setScaleMode(PrintHelper.SCALE_MODE_FIT);
                printHelper.printBitmap("Print Bitmap", bitmap);
            }
        });

        Button btn_jpeg = (Button) findViewById(R.id.btn_simpan_jpg);
        btn_jpeg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                View u = findViewById(R.id.sv_id1);
                ScrollView z = (ScrollView) findViewById(R.id.sv_id1);
                Bitmap bitmap = takeScreenShot(u, z);
                String sss = myU.simpanBitmap(bitmap);
                Toast.makeText(Struk1.this, sss, Toast.LENGTH_SHORT).show();
            }
        });
    }


    public Bitmap takeScreenShot(View u, ScrollView z) {
        int totalHeight = z.getChildAt(0).getHeight();
        int totalWidth = z.getChildAt(0).getWidth();

        Bitmap returnedBitmap = Bitmap.createBitmap(totalWidth,totalHeight , Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(returnedBitmap);
        Drawable bgDrawable = u.getBackground();
        if (bgDrawable != null) bgDrawable.draw(canvas);
        else canvas.drawColor(Color.WHITE);
        u.draw(canvas);
        return returnedBitmap;
    }

    public String simpanBitmap(Bitmap b){
        // siapin nama file
        File folder = new File(Environment.getExternalStorageDirectory() + "/StrukSPBU57mm");
        if (!folder.exists()) folder.mkdir();

        final Calendar c = Calendar.getInstance();
        String new_Date = c.get(Calendar.DAY_OF_MONTH) + "-" + ((c.get(Calendar.MONTH)) + 1) + "-"
                + c.get(Calendar.YEAR) + " " + c.get(Calendar.HOUR) + "-"
                + c.get(Calendar.MINUTE) + "-" + c.get(Calendar.SECOND);
        String path  = String.format(Environment.getExternalStorageDirectory() + "/StrukSPBU57mm/%s.png", new_Date);
        File f_struk = new File(path);

        //Save bitmap
        String string = "";
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(f_struk);
            b.compress(Bitmap.CompressFormat.PNG, 100, fos);
            fos.flush();
            fos.close();
            string = "disimpan: "+path;
        } catch (FileNotFoundException e) {
            string = "Error: FileNotFound Exception";
        } catch (IOException e) {
            string = "Error: IO Exception";
        }
        return string;
    }

}



ini Manifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.munengan7camp.strukspbu"
    android:versionCode="1"
    android:versionName="1.0" >

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

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="14" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
       
        <activity
            android:name=".Struk1"
            android:label="@string/app_name">
            <intent-filter >
                <action  android:name="com.munengan7camp.strukspbu.Struk1"/>

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

    </application>

</manifest>


File lain : menu.xml dan strings.xml dibuat sendiri aja [kalo mau nyoba mbuat]

[update link 2 juli 2017 via mediafire]