package ideasourceswiper;
import java.util.HashMap;
import java.util.Map.Entry;
import com.bbpos.swiper.SwiperController;
import com.bbpos.swiper.SwiperController.DecodeResult;
import com.bbpos.swiper.SwiperController.SwiperStateChangedListener;
import android.content.SharedPreferences;
import android.util.Log;
import anywheresoftware.b4a.BA;
import anywheresoftware.b4a.BA.Author;
import anywheresoftware.b4a.BA.DependsOn;
import anywheresoftware.b4a.BA.Events;
import anywheresoftware.b4a.BA.Permissions;
import anywheresoftware.b4a.BA.RaisesSynchronousEvents;
import anywheresoftware.b4a.BA.ShortName;
@ShortName("RoamPaySwiper") // this is the name as it appear on the IDE
@Permissions(values = { "android.permission.INTERNET"
, "android.permission.READ_PHONE_STATE"
, "android.permission.RECORD_AUDIO"
, "android.permission.MODIFY_AUDIO_SETTINGS"
})
@Author("Gary Kimble") // your name
@DependsOn(values = {"swiperapi-android-4.3.0"})
public class IdeaSourceSwiper {
private BA _ba;
private String _eventName;
private SwiperStateChangedListener stateChangedListener;
private SwiperController swiperController;
public String outMsg;
public String encryptedTrack;
public SharedPreferences settings;
// -----------------------------------------------------------------------
// Interface
// -----------------------------------------------------------------------
private void setSwiperControllerValues() {
if (swiperController == null) return;
/*
if (settings == null) settings = PreferenceManager.getDefaultSharedPreferences(BA.applicationContext);
boolean setDetectDeviceChangePref = settings.getBoolean("setDetectDeviceChangePref", true);
boolean setFskRequiredPref = settings.getBoolean("setFskRequiredPref", false);
String setTimeoutlistPref = settings.getString("setTimeoutlistPref", "-1");
String setKsnChargeUplistPref = settings.getString("setKsnChargeUplistPref", "0.6");
String setSwipeChargeUplistPref = settings.getString("setSwipeChargeUplistPref", "0.6");
*/
swiperController.setDetectDeviceChange(true);
swiperController.setFskRequired(false);
swiperController.setSwipeTimeout(-1);
swiperController.setChargeUpTime(.6);
swiperController.setKsnChargeUpTime(.6);
}
public IdeaSourceSwiper(){
}
public void Initialize(final BA ba, String eventname){
_ba = ba;
_eventName = eventname;
stateChangedListener = new StateChangedListener();
swiperController = SwiperController.createInstance(BA.applicationContext, stateChangedListener);
setSwiperControllerValues();
Log.d("B4A", "Initiliazed!");
}
public Boolean isInitialized(){
if (_ba == null)
return false;
else
return true;
}
public Boolean checkSwiper(){
return swiperController.isDevicePresent();
}
public Boolean isFskRequired(){
return swiperController.isFskRequired();
}
@RaisesSynchronousEvents
public void deleteSwiper(){
swiperController.deleteSwiper();
}
public String QuerySwiperFirmwareVersion(){
return swiperController.getSwiperFirmwareVersion();
}
@RaisesSynchronousEvents
public void QuerySwiperKSN(){
swiperController.getSwiperKsn();
}
public void isSwiperHere(){
swiperController.isSwiperHere();
}
public String QuerySwiperState(){
return swiperController.getSwiperState().toString();
}
@RaisesSynchronousEvents
public void StartSwiper(){
Log.d("B4A", "Starting Swiper");
SwiperController tmpSwipe = SwiperController.getInstance();
tmpSwipe.startSwiper();
//swiperController.startSwiper();
Log.d("B4A", "After Starting Swiper");
}
@RaisesSynchronousEvents
public void StopSwiper(){
swiperController.stopSwiper();
}
@RaisesSynchronousEvents
public void WaitSwiper() throws InterruptedException{
swiperController.wait();
}
@RaisesSynchronousEvents
public String QuerySwiperAPIVersion(){
return SwiperController.getSwiperAPIVersion();
}
///////////////////////////////////////////////////////////////////////////
@ShortName("SwiperHandler") // this is the name as it appear on the IDE
@Permissions(values = { "android.permission.INTERNET"
, "android.permission.READ_PHONE_STATE"
, "android.permission.RECORD_AUDIO"
, "android.permission.MODIFY_AUDIO_SETTINGS"
})
@Author("Gary Kimble") // your name
@Events(values={ "oncardswipedetected(message as String)",
"ondecodecompleted(outParams() as String)",
"ondecodeerror(DecResult as String)",
"onerror(message as String)",
"ongetksncompleted(ksn as String)",
"oninterrupted(message as String)",
"onnodevicedetected(message as String)",
"ontimeout(message as String)",
"onwaitingforcardswipe(message as String)",
"onwaitingfordevice(message as String)",
"ondeviceplugged(message as String)",
"ondeviceunplugged(message as String)",
"onswiperhere(isHere as Boolean)"
})
public class StateChangedListener implements SwiperStateChangedListener {
@Override
public void onCardSwipeDetected() {
if (_ba.subExists(_eventName + "_oncardswipedetected")) {
_ba.raiseEvent(this, _eventName + "_oncardswipedetected", "Card Swipe Detected");
}
}
@Override
public void onDecodeCompleted(HashMap<String, String> decodeData) {
StringBuilder sb = new StringBuilder();
for (Entry<String, String> entry : decodeData.entrySet()) {
sb.append(entry.getKey() + ": " + entry.getValue() + "\n");
}
String formatID = decodeData.get("formatID");
String encTrack = decodeData.get("encTrack");
String partialTrack = decodeData.get("partialTrack");
sb.append("packEncTrackData: " + SwiperController.packEncTrackData(formatID, encTrack, partialTrack));
outMsg = "Card Read";
encryptedTrack = sb.toString();
String [] bMap = convertToMap(decodeData);
if (_ba.subExists(_eventName + "_ondecodecompleted")) {
_ba.raiseEvent(this, _eventName + "_ondecodecompleted", new Object[]{bMap});
}
}
@Override
public void onDecodeError(DecodeResult decodeResult) {
if (_ba.subExists(_eventName + "_ondecodeerror")) {
_ba.raiseEvent(this, _eventName + "_ondecodeerror", decodeResult.toString());
}
}
@Override
public void onError(String message) {
if (_ba.subExists(_eventName + "_onerror")) {
_ba.raiseEvent(this, _eventName + "_onerror", message);
}
}
@Override
public void onGetKsnCompleted(String ksn) {
if (_ba.subExists(_eventName + "_ongetksncompleted")) {
_ba.raiseEvent(this, _eventName + "_ongetksncompleted", ksn);
}
}
@Override
public void onInterrupted() {
if (_ba.subExists(_eventName + "_oninterrupted")) {
_ba.raiseEvent(this, _eventName + "_oninterrupted", "Card Read Interuppted");
}
}
@Override
public void onNoDeviceDetected() {
if (_ba.subExists(_eventName + "_onnodevicedetected")) {
_ba.raiseEvent(this, _eventName + "_onnodevicedetected", "Swiper Unplugged");
}
}
@Override
public void onTimeout() {
if (_ba.subExists(_eventName + "_ontimeout")) {
_ba.raiseEvent(this, _eventName + "_ontimeout", "Swiper Timed Out");
}
}
@Override
public void onWaitingForCardSwipe() {
if (_ba.subExists(_eventName + "_onwaitingforcardswipe")) {
_ba.raiseEvent(this, _eventName + "_onwaitingforcardswipe", "Waiting card swipe...");
}
}
@Override
public void onWaitingForDevice() {
if (_ba.subExists(_eventName + "_onwaitingforcardswipe")) {
_ba.raiseEvent(this, _eventName + "_onwaitingforcardswipe", "Waiting for device...");
}
}
@Override
public void onDevicePlugged() {
String msg = "";
try {
if (swiperController.getSwiperState() == SwiperController.SwiperControllerState.STATE_IDLE) {
swiperController.isSwiperHere();
msg = "Checking for Swiper...";
}
}
catch (IllegalStateException ex) {
msg = "Invalid state for device...";
}
if (_ba.subExists(_eventName + "_ondeviceplugged")) {
_ba.raiseEvent(this, _eventName + "_ondeviceplugged", msg);
}
}
@Override
public void onDeviceUnplugged() {
if (_ba.subExists(_eventName + "_ondeviceunplugged")) {
_ba.raiseEvent(this, _eventName + "_ondeviceunplugged", "Swiper Unplugged");
}
}
@Override
public void onSwiperHere(boolean isHere) {
Log.d("B4A", "onSwiperHere: " + isHere);
if (_ba.subExists(_eventName + "_onswiperhere")) {
_ba.raiseEvent(this, _eventName + "_onswiperhere", isHere);
}
}
private String[] convertToMap(HashMap<String, String> javaMap) {
String[] m = new String[javaMap.size()];
Integer i = 0;
for (Entry<String, String> e : javaMap.entrySet()) {
m[i] = e.getKey().toString()+"="+e.getValue().toString();
i++;
}
return m;
}
}
}