package com.jasonette.seed.Action;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.provider.ContactsContract;
import android.support.design.widget.Snackbar;
import android.support.v4.app.DialogFragment;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AlertDialog;
import android.text.InputType;
import android.text.format.DateFormat;
import android.util.Base64;
import android.util.Log;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TimePicker;
import android.widget.Toast;
import com.github.florent37.singledateandtimepicker.dialog.SingleDateAndTimePickerDialog;
import com.jasonette.seed.Core.JasonViewActivity;
import com.jasonette.seed.Helper.JasonHelper;
import com.jasonette.seed.Helper.JasonImageHelper;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class JasonUtilAction {
private int counter; // general purpose counter;
private Intent callback_intent; // general purpose intent;
public void banner(final JSONObject action, final JSONObject data, final JSONObject event, final Context context) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
try {
JSONObject options = action.getJSONObject("options");
Snackbar snackbar = Snackbar.make(((JasonViewActivity)context).rootLayout, options.getString("title") + "\n" + options.getString("description"), Snackbar.LENGTH_LONG);
snackbar.show();
} catch (Exception e){
Log.d("Error", e.toString());
}
}
});
try {
JasonHelper.next("success", action, new JSONObject(), event, context);
} catch (Exception e) {
Log.d("Error", e.toString());
}
}
public void toast(final JSONObject action, final JSONObject data, final JSONObject event, final Context context) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
try {
JSONObject options = action.getJSONObject("options");
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, (CharSequence)options.getString("text"), duration);
toast.show();
} catch (Exception e){
Log.d("Error", e.toString());
}
}
});
try {
JasonHelper.next("success", action, new JSONObject(), event, context);
} catch (Exception err) {
Log.d("Error", err.toString());
}
}
public void alert(final JSONObject action, final JSONObject data, final JSONObject event, final Context context){
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
try {
JSONObject options = new JSONObject();
final ArrayList<EditText> textFields = new ArrayList<EditText>();
if (action.has("options")) {
options = action.getJSONObject("options");
String title = options.getString("title");
String description = options.getString("description");
builder.setTitle(title);
builder.setMessage(description);
if(options.has("form"))
{
LinearLayout lay = new LinearLayout(context);
lay.setOrientation(LinearLayout.VERTICAL);
lay.setPadding(20,5,20,5);
JSONArray formArr = options.getJSONArray("form");
for (int i=0; i<formArr.length();i++) {
JSONObject obj = formArr.getJSONObject(i);
final EditText textBox = new EditText(context);
if(obj.has("placeholder")){
textBox.setHint(obj.getString("placeholder"));
}
if(obj.has("type") && obj.getString("type").equals("secure")){
textBox.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
}
if(obj.has("value")){
textBox.setText(obj.getString("value"));
}
textBox.setTag(obj.get("name"));
lay.addView(textBox);
textFields.add(textBox);
builder.setView(lay);
}
// Set focous on first text field
final EditText focousedTextField = (EditText)textFields.get(0);
focousedTextField.post(new Runnable() {
public void run() {
focousedTextField.requestFocus();
InputMethodManager lManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
lManager.showSoftInput(focousedTextField, 0);
}
});
}
}
builder.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
try {
if (action.has("success")) {
JSONObject postObject = new JSONObject();
if(action.getJSONObject("options").has("form")){
for(int i = 0; i<textFields.size();i++){
EditText textField = (EditText) textFields.get(i);
postObject.put(textField.getTag().toString(),textField.getText().toString());
}
}
JasonHelper.next("success", action, postObject, event, context);
}
} catch (Exception err) {
}
}
});
builder.setNeutralButton("CANCEL",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
//
}
});
builder.show();
} catch (Exception e) {
Log.d("Error", e.toString());
}
}
});
}
public void picker(final JSONObject action, final JSONObject data, final JSONObject event, final Context context){
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
try {
JSONObject options = action.getJSONObject("options");
if(options.has("items")){
final JSONArray items = options.getJSONArray("items");
AlertDialog.Builder builder = new AlertDialog.Builder(context);
ArrayList<String> listItems = new ArrayList<String>();
for (int i = 0; i < items.length() ; i++) {
JSONObject item = (JSONObject)items.get(i);
if(item.has("text")){
listItems.add(item.getString("text"));
} else {
listItems.add("");
}
}
final CharSequence[] charSequenceItems = listItems.toArray(new CharSequence[listItems.size()]);
builder.setItems(charSequenceItems, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int val) {
JSONObject item;
try {
item = items.getJSONObject(val);
if(item.has("action")){
Intent intent = new Intent("call");
intent.putExtra("action", item.get("action").toString());
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
} else if(item.has("href")){
Intent intent = new Intent("call");
JSONObject href = new JSONObject();
href.put("type", "$href");
href.put("options", item.get("href").toString());
intent.putExtra("action", item.get("action").toString());
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}
} catch (Exception e){
Log.d("Error", e.toString());
}
}
});
builder.setNeutralButton("CANCEL",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int val) {
}
}
);
builder.create().show();
}
} catch (Exception e){
Log.d("Error", e.toString());
}
}
});
try {
JasonHelper.next("success", action, new JSONObject(), event, context);
} catch (Exception e) {
Log.d("Error", e.toString());
}
}
public static class TimePickerFragment extends DialogFragment
implements TimePickerDialog.OnTimeSetListener {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current time as the default values for the picker
final Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
// Create a new instance of TimePickerDialog and return it
return new TimePickerDialog(getActivity(), this, hour, minute,
DateFormat.is24HourFormat(getActivity()));
}
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
// Do something with the time chosen by the user
}
}
public void datepicker(final JSONObject action, final JSONObject data, final JSONObject event, final Context context) {
new SingleDateAndTimePickerDialog.Builder(context)
.bottomSheet()
.curved()
//.minutesStep(15)
//.title("Simple")
.listener(new SingleDateAndTimePickerDialog.Listener() {
@Override
public void onDateSelected(Date date) {
try {
String val = String.valueOf(date.getTime()/1000);
JSONObject value = new JSONObject();
value.put("value", val);
JasonHelper.next("success", action, value, event, context);
} catch (Exception e) {
Log.d("Error", e.toString());
}
}
}).display();
}
public void addressbook(final JSONObject action, final JSONObject data, final JSONObject event, final Context context) {
new Thread(new Runnable() {
@Override
public void run() {
getContacts(action, data, event, context);
}
}).start();
}
private void getContacts(final JSONObject action, final JSONObject data, final JSONObject event, final Context context) {
JSONArray contactList = new JSONArray();
String phoneNumber = null;
String email = null;
ContentResolver contentResolver = ((JasonViewActivity)context).getContentResolver();
try {
final Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if (cursor.getCount() > 0) {
counter = 0;
while (cursor.moveToNext()) {
JSONObject contact = new JSONObject();
String contact_id = cursor.getString(cursor.getColumnIndex( ContactsContract.Contacts._ID ));
String name = cursor.getString(cursor.getColumnIndex( ContactsContract.Contacts.DISPLAY_NAME ));
try {
// name
contact.put("name", name);
// phone
Cursor phoneCursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{contact_id}, null);
while (phoneCursor.moveToNext()) {
phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
if(phoneNumber != null) {
contact.put("phone", phoneNumber);
}
}
if(!contact.has("phone")){
contact.put("phone", "");
}
phoneCursor.close();
// email
Cursor emailCursor = contentResolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{contact_id}, null);
while (emailCursor.moveToNext()) {
email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
if(email != null) {
contact.put("email", email);
}
}
if(!contact.has("email")){
contact.put("email", "");
}
emailCursor.close();
// Add to array
contactList.put(contact);
} catch (Exception e){
Log.d("Error", e.toString());
}
}
try {
JasonHelper.next("success", action, contactList, event, context);
} catch (Exception e) {
Log.d("Error", e.toString());
}
}
} catch (SecurityException e){
JasonHelper.permission_exception("$util.addressbook", context);
}
}
public void share(final JSONObject action, final JSONObject data, final JSONObject event, final Context context) {
new Thread(new Runnable() {
@Override
public void run() {
try {
JSONObject options = action.getJSONObject("options");
if (options.has("items")) {
callback_intent = new Intent();
callback_intent.setAction(Intent.ACTION_SEND);
final JSONArray items = options.getJSONArray("items");
counter = 0;
final int l = items.length();
for (int i = 0; i < l; i++) {
JSONObject item = (JSONObject) items.get(i);
if (item.has("type")) {
String type = item.getString("type");
if (type.equalsIgnoreCase("text")) {
callback_intent.putExtra(Intent.EXTRA_TEXT, item.getString("text"));
if (callback_intent.getType() == null) {
callback_intent.setType("text/plain");
}
counter++;
if (counter == l) {
JasonHelper.next("success", action, new JSONObject(), event, context);
context.startActivity(Intent.createChooser(callback_intent, "Share"));
}
} else if (type.equalsIgnoreCase("image")) {
// Fetch remote url
// Turn it into Bitmap
// Create a file
// Share the url
if (item.has("url")) {
JasonImageHelper helper = new JasonImageHelper(item.getString("url"), context);
helper.setListener(new JasonImageHelper.JasonImageDownloadListener() {
@Override
public void onLoaded(byte[] data, Uri uri) {
callback_intent.putExtra(Intent.EXTRA_STREAM, uri);
// override with image type if one of the items is an image
callback_intent.setType("image/*");
callback_intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
counter++;
if (counter == l) {
JasonHelper.next("success", action, new JSONObject(), event, context);
context.startActivity(Intent.createChooser(callback_intent, "Share"));
}
}
});
helper.fetch();
} else if (item.has("data")) {
// "data" is a byte[] stored as string
// so we need to restore it back to byte[] before working with it.
byte[] d = Base64.decode(item.getString("data"), Base64.DEFAULT);
JasonImageHelper helper = new JasonImageHelper(d, context);
helper.setListener(new JasonImageHelper.JasonImageDownloadListener() {
@Override
public void onLoaded(byte[] data, Uri uri) {
callback_intent.putExtra(Intent.EXTRA_STREAM, uri);
// override with image type if one of the items is an image
callback_intent.setType("image/*");
callback_intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
counter++;
if (counter == l) {
JasonHelper.next("success", action, new JSONObject(), event, context);
context.startActivity(Intent.createChooser(callback_intent, "Share"));
}
}
});
helper.load();
}
} else if (type.equalsIgnoreCase("video")){
if(item.has("file_url")){
Uri uri = Uri.parse(item.getString("file_url"));
callback_intent.putExtra(Intent.EXTRA_STREAM, uri);
// override with image type if one of the items is an image
callback_intent.setType("video/*");
callback_intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
counter++;
if (counter == l) {
JasonHelper.next("success", action, new JSONObject(), event, context);
context.startActivity(Intent.createChooser(callback_intent, "Share"));
}
}
} else if (type.equalsIgnoreCase("audio")){
if(item.has("file_url")){
Uri uri = Uri.parse(item.getString("file_url"));
callback_intent.putExtra(Intent.EXTRA_STREAM, uri);
callback_intent.setType("audio/*");
callback_intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
counter++;
if (counter == l) {
JasonHelper.next("success", action, new JSONObject(), event, context);
context.startActivity(Intent.createChooser(callback_intent, "Share"));
}
}
}
}
}
}
} catch (Exception e) {
Log.d("Error", e.toString());
}
}
}).start();
}
}