Wednesday 22 August 2018

Mantra (MFS 100) Biometric Android Example

Mantra (MFS 100) Biometric Android Example




Creating a New Project
·                     First, we will create a new Android Studio Project.

Adding Jar File
·                     Now download the mantra.mfs100.jar. We need to add this file in our project dependencies.
·                     So first on the project explorer select Project.
·                     Then inside app/lib paste the mantra.mfs100.jar that we downloaded.
·                     Then add dependency in your build.gradle.

implementation files('libs/mantra.mfs100.jar')

Adding jniLibs Folder
·                     jniLibs.jar
·                     Download jinLibs.jar file And then Extract.
·                     Put jniLibs folder src/main/


mantra.mfs100.jar
·                     mantra.mfs100.jar it is inside the lib folder app/lib/

 build.gradle
apply plugin: 'com.android.application'
android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.mihirpanchasara.biometricexample"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        ndk {
            abiFilters "armeabi-v7a", "x86"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    repositories {
        flatDir {
            dirs 'libs'
        }
    }
    //JNI Lib Declaration
    sourceSets.main {
        jniLibs.srcDirs 'src/main/jniLibs'
    }
}
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    testImplementation 'junit:junit:4.12'
    implementation files('libs/mantra.mfs100.jar')
}

string.xml
<resources>
    <string name="app_name">BioMetricExample</string>
    <string name="action_settings">Settings</string>
    <string name="app_title">MANTRA-MFS100-TEST</string>
    <string name="Init">INIT</string>
    <string name="UnInit">UNINIT</string>
    <string name="ExtractISO">ISO(FMR)</string>
    <string name="ExtractWSQ">WSQ</string>
    <string name="MatchISO">MATCH ISO</string>
    <string name="foorLoop">Init/Uninit</string>
    <string name="ClearLog">CLEAR LOG</string>
    <string name="SyncCapture">CAPTURE</string>
    <string name="StopSyncCapture">STOP CAP</string>
    <string name="WriteBit">Write Bit</string>
    <string name="ReadBit">Read Bit</string>
    <string name="ChangeKey">Change Key</string>
    <string name="GetKey">Get Key</string>
    <string-array name="MFS100Ver">
        <item>41</item>
        <item>31</item>
    </string-array>
    <string name="title_activity_preference">Preference</string>
</resources>

styles.xml
<style name="title">
    <item name="android:padding">0dp</item>
    <item name="android:layout_margin">1dp</item>
    <item name="android:textColor">#FFFFFF </item>
</style>
<style name="message">
    <item name="android:padding">0dp</item>
    <item name="android:layout_margin">1dp</item>
    <item name="android:textColor">#000000 </item>
</style>
<style name="button">
    <item name="android:padding">0dp</item>
    <item name="android:layout_width">86dp</item>
    <item name="android:layout_height">35dp</item>
    <item name="android:layout_margin">1dp</item>
    <item name="android:textColor">#FFFFFF </item>
</style>
<style name="buttonbig">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">35dp</item>
    <item name="android:layout_margin">1dp</item>
    <item name="android:textColor">#FFFFFF </item>
</style>
<style name="buttonbig2">
    <item name="android:layout_width">0dp</item>
    <item name="android:layout_weight">1</item>
    <item name="android:layout_height">35dp</item>
    <item name="android:layout_margin">1dp</item>
    <item name="android:textColor">#FFFFFF </item>
</style>
<style name="buttonfull">
    <item name="android:padding">0dp</item>
    <item name="android:layout_height">35dp</item>
    <item name="android:layout_margin">1dp</item>
    <item name="android:textColor">#FFFFFF </item>
</style>
<style name="Theme.Transparent" parent="android:Theme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowIsFloating">true</item>
    <item name="android:backgroundDimEnabled">false</item>
</style>


xml/config.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
    <ListPreference android:dialogTitle="MFS100 Version" android:key="MFSVer" android:title="MFS100 Version" android:defaultValue="41" android:entries="@array/MFS100Ver" android:entryValues="@array/MFS100Ver"/>   
</PreferenceScreen>

xml/device_config.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <usb-device vendor-id="1204" product-id="34323" />
    <usb-device vendor-id="11279" product-id="4101" />
</resources>

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mihirpanchasara.biometricexample">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.USB_PERMISSION" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MFS100Test"
            android:configChanges="orientation|screenSize|keyboardHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

MFS100Test.java
 
package com.mihirpanchasara.biometricexample;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.TextView.BufferType;
import android.widget.Toast;
import com.mantra.mfs100.FingerData;
import com.mantra.mfs100.MFS100;
import com.mantra.mfs100.MFS100Event;
import java.io.File;
import java.io.FileOutputStream;
public class MFS100Test extends Activity implements MFS100Event {
    Button btnInit;
    Button btnUninit;
    Button btnSyncCapture;
    Button btnStopCapture;
    Button btnMatchISOTemplate;
    Button btnExtractISOImage;
    Button btnExtractAnsi;
    Button btnExtractWSQImage;
    Button btnClearLog;
    TextView lblMessage;
    EditText txtEventLog;
    ImageView imgFinger;
    CheckBox cbFastDetection;
    private enum ScannerAction {
        Capture, Verify
    }
    byte[] Enroll_Template;
    byte[] Verify_Template;
    private FingerData lastCapFingerData = null;
    ScannerAction scannerAction = ScannerAction.Capture;
    int timeout = 10000;
    MFS100 mfs100 = null;
    private boolean isCaptureRunning = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mfs100_sample);
        FindFormControls();
        try {
            this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        } catch (Exception e) {
            Log.e("Error", e.toString());
        }
    }
    @Override
    protected void onStart() {
        if (mfs100 == null) {
            mfs100 = new MFS100(this);
            mfs100.SetApplicationContext(MFS100Test.this);
        } else {
            InitScanner();
        }
        super.onStart();
    }
    protected void onStop() {
        UnInitScanner();
        super.onStop();
    }
    @Override
    protected void onDestroy() {
        if (mfs100 != null) {
            mfs100.Dispose();
        }
        super.onDestroy();
    }
    public void FindFormControls() {
        btnInit = (Button) findViewById(R.id.btnInit);
        btnUninit = (Button) findViewById(R.id.btnUninit);
        btnMatchISOTemplate = (Button) findViewById(R.id.btnMatchISOTemplate);
        btnExtractISOImage = (Button) findViewById(R.id.btnExtractISOImage);
        btnExtractAnsi = (Button) findViewById(R.id.btnExtractAnsi);
        btnExtractWSQImage = (Button) findViewById(R.id.btnExtractWSQImage);
        btnClearLog = (Button) findViewById(R.id.btnClearLog);
        lblMessage = (TextView) findViewById(R.id.lblMessage);
        txtEventLog = (EditText) findViewById(R.id.txtEventLog);
        imgFinger = (ImageView) findViewById(R.id.imgFinger);
        btnSyncCapture = (Button) findViewById(R.id.btnSyncCapture);
        btnStopCapture = (Button) findViewById(R.id.btnStopCapture);
        cbFastDetection = (CheckBox) findViewById(R.id.cbFastDetection);
    }
    public void onControlClicked(View v) {
        switch (v.getId()) {
            case R.id.btnInit:
                InitScanner();
                break;
            case R.id.btnUninit:
                UnInitScanner();
                break;
            case R.id.btnSyncCapture:
                scannerAction = ScannerAction.Capture;
                if (!isCaptureRunning) {
                    StartSyncCapture();
                }
                break;
            case R.id.btnStopCapture:
                StopCapture();
                break;
            case R.id.btnMatchISOTemplate:
                scannerAction = ScannerAction.Verify;
                if (!isCaptureRunning) {
                    StartSyncCapture();
                }
                break;
            case R.id.btnExtractISOImage:
                ExtractISOImage();
                break;
            case R.id.btnExtractAnsi:
                ExtractANSITemplate();
                break;
            case R.id.btnExtractWSQImage:
                ExtractWSQImage();
                break;
            case R.id.btnClearLog:
                ClearLog();
                break;
            default:
                break;
        }
    }
    private void InitScanner() {
        try {
            int ret = mfs100.Init();
            if (ret != 0) {
                SetTextOnUIThread(mfs100.GetErrorMsg(ret));
            } else {
                SetTextOnUIThread("Init success");
                String info = "Serial: " + mfs100.GetDeviceInfo().SerialNo()
                        + " Make: " + mfs100.GetDeviceInfo().Make()
                        + " Model: " + mfs100.GetDeviceInfo().Model()
                        + "\nCertificate: " + mfs100.GetCertification();
                SetLogOnUIThread(info);
            }
        } catch (Exception ex) {
            Toast.makeText(this, "Init failed, unhandled exception",
                    Toast.LENGTH_LONG).show();
            SetTextOnUIThread("Init failed, unhandled exception");
        }
    }
    private void StartSyncCapture() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                SetTextOnUIThread("");
                isCaptureRunning = true;
                try {
                    FingerData fingerData = new FingerData();
                    int ret = mfs100.AutoCapture(fingerData, timeout, cbFastDetection.isChecked());
                    Log.e("StartSyncCapture.RET", ""+ret);
                    if (ret != 0) {
                        SetTextOnUIThread(mfs100.GetErrorMsg(ret));
                    } else {
                        lastCapFingerData = fingerData;
                        final Bitmap bitmap = BitmapFactory.decodeByteArray(fingerData.FingerImage(), 0,
                                fingerData.FingerImage().length);
                        MFS100Test.this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                imgFinger.setImageBitmap(bitmap);
                            }
                        });
                        SetTextOnUIThread("Capture Success");
                        String log = "\nQuality: " + fingerData.Quality()
                                + "\nNFIQ: " + fingerData.Nfiq()
                                + "\nWSQ Compress Ratio: "
                                + fingerData.WSQCompressRatio()
                                + "\nImage Dimensions (inch): "
                                + fingerData.InWidth() + "\" X "
                                + fingerData.InHeight() + "\""
                                + "\nImage Area (inch): " + fingerData.InArea()
                                + "\"" + "\nResolution (dpi/ppi): "
                                + fingerData.Resolution() + "\nGray Scale: "
                                + fingerData.GrayScale() + "\nBits Per Pixal: "
                                + fingerData.Bpp() + "\nWSQ Info: "
                                + fingerData.WSQInfo();
                        SetLogOnUIThread(log);
                        SetData2(fingerData);
                    }
                } catch (Exception ex) {
                    SetTextOnUIThread("Error");
                } finally {
                    isCaptureRunning = false;
                }
            }
        }).start();
    }
    private void StopCapture() {
        try {
            mfs100.StopAutoCapture();
        } catch (Exception e) {
            SetTextOnUIThread("Error");
        }
    }
    private void ExtractANSITemplate() {
        try {
            if (lastCapFingerData == null) {
                SetTextOnUIThread("Finger not capture");
                return;
            }
            byte[] tempData = new byte[2000]; // length 2000 is mandatory
            byte[] ansiTemplate;
            int dataLen = mfs100.ExtractANSITemplate(lastCapFingerData.RawData(), tempData);
            if (dataLen <= 0) {
                if (dataLen == 0) {
                    SetTextOnUIThread("Failed to extract ANSI Template");
                } else {
                    SetTextOnUIThread(mfs100.GetErrorMsg(dataLen));
                }
            } else {
                ansiTemplate = new byte[dataLen];
                System.arraycopy(tempData, 0, ansiTemplate, 0, dataLen);
                WriteFile("ANSITemplate.ansi", ansiTemplate);
                SetTextOnUIThread("Extract ANSI Template Success");
            }
        } catch (Exception e) {
            Log.e("Error", "Extract ANSI Template Error", e);
        }
    }
    private void ExtractISOImage() {
        try {
            if (lastCapFingerData == null) {
                SetTextOnUIThread("Finger not capture");
                return;
            }
            byte[] tempData = new byte[(mfs100.GetDeviceInfo().Width() * mfs100.GetDeviceInfo().Height()) + 1078];
            byte[] isoImage;
            int dataLen = mfs100.ExtractISOImage(lastCapFingerData.RawData(), tempData);
            if (dataLen <= 0) {
                if (dataLen == 0) {
                    SetTextOnUIThread("Failed to extract ISO Image");
                } else {
                    SetTextOnUIThread(mfs100.GetErrorMsg(dataLen));
                }
            } else {
                isoImage = new byte[dataLen];
                System.arraycopy(tempData, 0, isoImage, 0, dataLen);
                WriteFile("ISOImage.iso", isoImage);
                SetTextOnUIThread("Extract ISO Image Success");
            }
        } catch (Exception e) {
            Log.e("Error", "Extract ISO Image Error", e);
        }
    }
    private void ExtractWSQImage() {
        try {
            if (lastCapFingerData == null) {
                SetTextOnUIThread("Finger not capture");
                return;
            }
            byte[] tempData = new byte[(mfs100.GetDeviceInfo().Width() * mfs100.GetDeviceInfo().Height()) + 1078];
            byte[] wsqImage;
            int dataLen = mfs100.ExtractWSQImage(lastCapFingerData.RawData(), tempData);
            if (dataLen <= 0) {
                if (dataLen == 0) {
                    SetTextOnUIThread("Failed to extract WSQ Image");
                } else {
                    SetTextOnUIThread(mfs100.GetErrorMsg(dataLen));
                }
            } else {
                wsqImage = new byte[dataLen];
                System.arraycopy(tempData, 0, wsqImage, 0, dataLen);
                WriteFile("WSQ.wsq", wsqImage);
                SetTextOnUIThread("Extract WSQ Image Success");
            }
        } catch (Exception e) {
            Log.e("Error", "Extract WSQ Image Error", e);
        }
    }
    private void UnInitScanner() {
        try {
            int ret = mfs100.UnInit();
            if (ret != 0) {
                SetTextOnUIThread(mfs100.GetErrorMsg(ret));
            } else {
                SetLogOnUIThread("Uninit Success");
                SetTextOnUIThread("Uninit Success");
                lastCapFingerData = null;
            }
        } catch (Exception e) {
            Log.e("UnInitScanner.EX", e.toString());
        }
    }
    private void WriteFile(String filename, byte[] bytes) {
        try {
            String path = Environment.getExternalStorageDirectory()
                    + "//FingerData";
            File file = new File(path);
            if (!file.exists()) {
                file.mkdirs();
            }
            path = path + "//" + filename;
            file = new File(path);
            if (!file.exists()) {
                file.createNewFile();
            }
            FileOutputStream stream = new FileOutputStream(path);
            stream.write(bytes);
            stream.close();
        } catch (Exception e1) {
            e1.printStackTrace();
        }
    }
    private void ClearLog() {
        txtEventLog.post(new Runnable() {
            public void run() {
                txtEventLog.setText("", BufferType.EDITABLE);
            }
        });
    }
    private void SetTextOnUIThread(final String str) {
        lblMessage.post(new Runnable() {
            public void run() {
                lblMessage.setText(str);
            }
        });
    }
    private void SetLogOnUIThread(final String str) {
        txtEventLog.post(new Runnable() {
            public void run() {
                txtEventLog.append("\n" + str);
            }
        });
    }
    public void SetData2(FingerData fingerData) {
        if (scannerAction.equals(ScannerAction.Capture)) {
            Enroll_Template = new byte[fingerData.ISOTemplate().length];
            System.arraycopy(fingerData.ISOTemplate(), 0, Enroll_Template, 0,
                    fingerData.ISOTemplate().length);
        } else if (scannerAction.equals(ScannerAction.Verify)) {
            Verify_Template = new byte[fingerData.ISOTemplate().length];
            System.arraycopy(fingerData.ISOTemplate(), 0, Verify_Template, 0,
                    fingerData.ISOTemplate().length);
            int ret = mfs100.MatchISO(Enroll_Template, Verify_Template);
            if (ret < 0) {
                SetTextOnUIThread("Error: " + ret + "(" + mfs100.GetErrorMsg(ret) + ")");
            } else {
                if (ret >= 1400) {
                    SetTextOnUIThread("Finger matched with score: " + ret);
                } else {
                    SetTextOnUIThread("Finger not matched, score: " + ret);
                }
            }
        }
        WriteFile("Raw.raw", fingerData.RawData());
        WriteFile("Bitmap.bmp", fingerData.FingerImage());
        WriteFile("ISOTemplate.iso", fingerData.ISOTemplate());
    }
    @Override
    public void OnDeviceAttached(int vid, int pid, boolean hasPermission) {
        int ret;
        if (!hasPermission) {
            SetTextOnUIThread("Permission denied");
            return;
        }
        if (vid == 1204 || vid == 11279) {
            if (pid == 34323) {
                ret = mfs100.LoadFirmware();
                if (ret != 0) {
                    SetTextOnUIThread(mfs100.GetErrorMsg(ret));
                } else {
                    SetTextOnUIThread("Load firmware success");
                }
            } else if (pid == 4101) {
                String key = "Without Key";
                ret = mfs100.Init();
                if (ret == 0) {
                    showSuccessLog(key);
                } else {
                    SetTextOnUIThread(mfs100.GetErrorMsg(ret));
                }
            }
        }
    }
    private void showSuccessLog(String key) {
        SetTextOnUIThread("Init success");
        String info = "\nKey: " + key + "\nSerial: "
                + mfs100.GetDeviceInfo().SerialNo() + " Make: "
                + mfs100.GetDeviceInfo().Make() + " Model: "
                + mfs100.GetDeviceInfo().Model()
                + "\nCertificate: " + mfs100.GetCertification();
        SetLogOnUIThread(info);
    }
    @Override
    public void OnDeviceDetached() {
        UnInitScanner();
        SetTextOnUIThread("Device removed");
    }
    @Override
    public void OnHostCheckFailed(String err) {
        try {
            SetLogOnUIThread(err);
            Toast.makeText(this, err, Toast.LENGTH_LONG).show();
        } catch (Exception ignored) {
        }
    }
}
activity_mfs100_sample.xml
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    tools:context=".MFS100Test" >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="top"
        android:orientation="vertical"
        android:paddingTop="0dp" >
        <TextView
            android:id="@+id/lblTitle"
            style="@style/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/title"
            android:gravity="center"
            android:padding="5dp"
            android:text="@string/app_title"
            android:textSize="20sp"
            android:textStyle="bold"
            android:visibility="gone"/>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="top"
        android:orientation="vertical"
        android:paddingTop="5dp" >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:orientation="horizontal"
            android:paddingLeft="10dp"
            android:paddingRight="10dp" >
            <ImageView
                android:id="@+id/imgFinger"
                android:layout_width="100dp"
                android:layout_height="120dp"
                android:background="@drawable/imagefinger"
                android:contentDescription="@string/app_name"
                android:scaleType="fitXY"
                android:src="@drawable/finger" />
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:paddingLeft="5dp" >
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal" >
                    <Button
                        android:id="@+id/btnInit"
                        style="@style/buttonbig2"
                        android:background="@drawable/button"
                        android:onClick="onControlClicked"
                        android:text="@string/Init" />
                    <Button
                        android:id="@+id/btnUninit"
                        style="@style/buttonbig2"
                        android:background="@drawable/button"
                        android:onClick="onControlClicked"
                        android:text="@string/UnInit" />
                </LinearLayout>
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal" >
                    <Button
                        android:id="@+id/btnSyncCapture"
                        style="@style/buttonbig2"
                        android:background="@drawable/button"
                        android:onClick="onControlClicked"
                        android:text="@string/SyncCapture" />
                    <Button
                        android:id="@+id/btnStopCapture"
                        style="@style/buttonbig2"
                        android:background="@drawable/button"
                        android:onClick="onControlClicked"
                        android:text="@string/StopSyncCapture" />
                </LinearLayout>
                <CheckBox
                    android:id="@+id/cbFastDetection"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:paddingLeft="5dp"
                    android:text="Fast Finger Detection"
                    android:textColor="@android:color/black"
                    android:textSize="15sp"
                    android:textStyle="bold" />
            </LinearLayout>
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:layout_marginTop="1dp"
            android:orientation="horizontal"
            android:paddingLeft="10dp"
            android:paddingRight="10dp" >
            <Button
                android:id="@+id/btnMatchISOTemplate"
                style="@style/buttonbig2"
                android:background="@drawable/button"
                android:onClick="onControlClicked"
                android:text="@string/MatchISO" />
            <Button
                android:id="@+id/btnExtractISOImage"
                style="@style/buttonbig2"
                android:background="@drawable/button"
                android:onClick="onControlClicked"
                android:text="EXTRACT ISO" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:layout_marginTop="1dp"
            android:orientation="horizontal"
            android:paddingLeft="10dp"
            android:paddingRight="10dp" >
            <Button
                android:id="@+id/btnExtractAnsi"
                style="@style/buttonbig2"
                android:background="@drawable/button"
                android:onClick="onControlClicked"
                android:text="EXTRACT ANSI" />
            <Button
                android:id="@+id/btnExtractWSQImage"
                style="@style/buttonbig2"
                android:background="@drawable/button"
                android:onClick="onControlClicked"
                android:text="EXTRACT WSQ" />
        </LinearLayout>
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="top"
        android:orientation="vertical"
        android:paddingBottom="3dp"
        android:paddingTop="5dp" >
        <TextView
            android:id="@+id/lblMessage"
            style="@style/message"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/message"
            android:gravity="center"
            android:padding="5dp"
            android:text=""
            android:textSize="15dp"
            android:textStyle="bold" />
        <EditText
            android:id="@+id/txtEventLog"
            style="@style/message"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="0.70"
            android:background="@drawable/message"
            android:gravity="top|left"
            android:inputType="textMultiLine"
            android:padding="5dp"
            android:text=""
            android:textSize="14dp" />
        <Button
            android:id="@+id/btnClearLog"
            style="@style/buttonfull"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/button"
            android:onClick="onControlClicked"
            android:text="@string/ClearLog" />
    </LinearLayout>
</LinearLayout>

 

CCAvenue Payment Gateway Android Integration

CCAvenue Payment Gateway Android Integration CCAvenue payment gateway android integration using PHP RSA and Response Handling. An...