package com.appboy.sample.logging;
import android.app.DatePickerDialog;
import android.content.Context;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.appboy.models.outgoing.AppboyProperties;
import com.appboy.sample.R;
import com.appboy.support.AppboyLogger;
import com.appboy.support.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
public class PropertyManager implements AdapterView.OnItemSelectedListener {
private static final String[] propertyTypes = new String[]{"integer", "double", "string", "boolean", "date"};
private Map<String, Object> mProperties = new HashMap<>();
private List<String> mKeys = new ArrayList<>();
private int selectedPropertyType;
private Date lastDatePicked;
private LinearLayout mLinearLayout;
private EditText mPropertyKey;
private EditText mPropertyValue;
private Spinner mPropertyTypeSpinner;
private Button mAddProperty;
private Context mContext;
public PropertyManager(Context context, LinearLayout linearLayout, EditText propertyKey, EditText propertyValue, Spinner propertyTypeSpinner, Button addPropertyButton) {
mContext = context;
mLinearLayout = linearLayout;
mPropertyKey = propertyKey;
mPropertyValue = propertyValue;
mPropertyTypeSpinner = propertyTypeSpinner;
mAddProperty = addPropertyButton;
ArrayAdapter<String> adapter = new ArrayAdapter<>(mContext, android.R.layout.simple_spinner_dropdown_item, propertyTypes);
mPropertyTypeSpinner.setAdapter(adapter);
mPropertyTypeSpinner.setOnItemSelectedListener(this);
mAddProperty.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String key = mPropertyKey.getText().toString();
Object value;
switch (selectedPropertyType) {
case 0:
value = getIntegerProperty();
break;
case 1:
value = getDoubleProperty();
break;
case 2:
value = getStringProperty();
break;
case 3:
value = getBooleanProperty();
break;
case 4:
value = lastDatePicked;
break;
default:
value = null;
break;
}
if (value != null) {
mPropertyKey.setText("");
mPropertyValue.setText("");
addPropertyView(key, value);
}
}
});
}
public AppboyProperties getAppboyProperties() {
AppboyProperties appboyProperties = new AppboyProperties();
for (String key : mKeys) {
Object value = mProperties.get(key);
if (value instanceof Integer) {
appboyProperties.addProperty(key, (int) value);
} else if (value instanceof Double) {
appboyProperties.addProperty(key, (double) value);
} else if (value instanceof Boolean) {
appboyProperties.addProperty(key, (boolean) value);
} else if (value instanceof String) {
appboyProperties.addProperty(key, (String) value);
} else if (value instanceof Date) {
appboyProperties.addProperty(key, (Date) value);
} else {
AppboyLogger.e(PropertyManager.this.getClass().toString(), "invalid property type");
}
}
return appboyProperties;
}
private void addPropertyView(String key, Object value) {
mKeys.add(key);
mProperties.put(key, value);
View view = View.inflate(mContext, R.layout.property_list_item, null);
TextView keyTextView = (TextView) view.findViewById(R.id.key_text_view);
TextView valTextView = (TextView) view.findViewById(R.id.value_text_view);
keyTextView.setText(key);
if (value instanceof Date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime((Date) value);
valTextView.setText(String.format(Locale.getDefault(), "%d/%d/%d",
calendar.get(Calendar.MONTH) + 1,
calendar.get(Calendar.DAY_OF_MONTH),
calendar.get(Calendar.YEAR)));
} else {
valTextView.setText(value.toString());
}
mLinearLayout.addView(view);
}
private Object getIntegerProperty() {
try {
return Integer.parseInt(mPropertyValue.getText().toString());
} catch (NumberFormatException nfe) {
Toast.makeText(mContext, "Make sure the value is an integer", Toast.LENGTH_LONG).show();
return null;
}
}
private Object getDoubleProperty() {
try {
return Double.parseDouble(mPropertyValue.getText().toString());
} catch (NumberFormatException nfe) {
Toast.makeText(mContext, "Make sure the value is a double", Toast.LENGTH_LONG).show();
return null;
}
}
private Object getStringProperty() {
String value = mPropertyValue.getText().toString();
if (StringUtils.isNullOrBlank(value)) {
Toast.makeText(mContext, "value should not be blank", Toast.LENGTH_LONG).show();
return null;
} else {
return value;
}
}
private Object getBooleanProperty() {
String value = mPropertyValue.getText().toString();
if (value.equals("true") || value.equals("True")) {
return true;
} else if (value.equals("false") || value.equals("False")) {
return false;
}
Toast.makeText(mContext, "boolean should either be true or false", Toast.LENGTH_LONG).show();
return null;
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
selectedPropertyType = position;
List<String> properties = Arrays.asList(propertyTypes);
if (selectedPropertyType == properties.indexOf("date")) {
Calendar calendar = Calendar.getInstance();
final DatePickerDialog datePickerDialog = new DatePickerDialog(mContext, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
mPropertyValue.setText(String.format(Locale.getDefault(), "%d/%d/%d", monthOfYear + 1, dayOfMonth, year));
Calendar pickedCalendar = Calendar.getInstance();
pickedCalendar.set(year, monthOfYear, dayOfMonth);
lastDatePicked = pickedCalendar.getTime();
}
}, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));
mPropertyValue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!datePickerDialog.isShowing()) {
datePickerDialog.show();
}
}
});
mPropertyValue.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
mPropertyValue.performClick();
return true;
}
});
mPropertyValue.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int keyCode, KeyEvent event) {
mPropertyValue.performClick();
return true;
}
});
} else {
mPropertyValue.setOnClickListener(null);
mPropertyValue.setOnTouchListener(null);
mPropertyValue.setOnKeyListener(null);
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}