package de.devland.masterpassword.util;
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import com.inputstick.api.ConnectionManager;
import com.inputstick.api.InputStickStateListener;
import com.inputstick.api.basic.InputStickHID;
import com.inputstick.api.layout.KeyboardLayout;
import de.devland.masterpassword.R;
import de.devland.masterpassword.base.BaseApp;
import de.devland.masterpassword.base.util.SnackbarUtil;
import lombok.RequiredArgsConstructor;
/**
* Created by David Kunzler on 25.09.2016.
*/
public class InputStickUtil {
private static final String INPUTSTICK_PACKAGENAME = "com.inputstick.apps.inputstickutility";
public static void checkAndType(AppCompatActivity activity, String text, String layout) {
PackageManager pm = activity.getPackageManager();
boolean exists = true;
try {
pm.getPackageInfo(INPUTSTICK_PACKAGENAME, PackageManager.GET_META_DATA);
} catch (PackageManager.NameNotFoundException e) {
exists = false;
}
if (exists) {
InputStickHID.addStateListener(new TypeListener(activity, text, layout));
int currentState = InputStickHID.getState();
if (currentState == ConnectionManager.STATE_DISCONNECTED || currentState == ConnectionManager.STATE_FAILURE) {
InputStickHID.connect(BaseApp.get());
} else if (currentState == ConnectionManager.STATE_READY) {
type(activity, text, layout);
}
} else {
InputStickUtilityDownloadDialog downloadDialog = new InputStickUtilityDownloadDialog(activity);
downloadDialog.show(activity.getSupportFragmentManager(), null);
}
}
private static void type(AppCompatActivity activity, String text, String layout) {
KeyboardLayout keyboardLayout = KeyboardLayout.getLayout(layout);
keyboardLayout.type(text);
SnackbarUtil.showShort(activity, R.string.msg_typedSuccessfully);
}
@RequiredArgsConstructor(suppressConstructorProperties = true)
private static class TypeListener implements InputStickStateListener, DialogInterface.OnCancelListener {
private final AppCompatActivity activity;
private final String text;
private final String layout;
private ProgressDialog progressDialog;
@Override
public void onStateChanged(int state) {
switch (state) {
case ConnectionManager.STATE_CONNECTED:
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
break;
case ConnectionManager.STATE_CONNECTING:
progressDialog = ProgressDialog.show(activity,
activity.getString(R.string.title_inputstick),
activity.getString(R.string.msg_connecting), true, true, this);
break;
case ConnectionManager.STATE_DISCONNECTED:
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
break;
case ConnectionManager.STATE_FAILURE:
SnackbarUtil.showShort(activity, R.string.msg_inputstickFailed);
break;
case ConnectionManager.STATE_READY:
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
type(activity, text, layout);
break;
}
}
@Override
public void onCancel(DialogInterface dialog) {
InputStickHID.disconnect();
}
}
@SuppressLint("ValidFragment")
public static class InputStickUtilityDownloadDialog extends DialogFragment {
private AppCompatActivity activity;
public InputStickUtilityDownloadDialog(AppCompatActivity activity) {
this.activity = activity;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle(R.string.title_inputstick);
builder.setMessage(R.string.msg_inputstickUtilityDownload);
builder.setCancelable(true);
builder.setNeutralButton(getString(R.string.caption_homepage), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://inputstick.com/index.php/developers/download")));
}
});
builder.setPositiveButton(R.string.caption_playStore, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=" + INPUTSTICK_PACKAGENAME)));
} catch (ActivityNotFoundException e) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + INPUTSTICK_PACKAGENAME)));
}
}
});
return builder.create();
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
}
}
}