package de.blau.android.prefs;
import java.util.List;
import java.util.Map.Entry;
import android.app.Activity;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.Intent;
import android.graphics.PorterDuff;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.util.Patterns;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.CheckBox;
import android.widget.TextView;
import de.blau.android.R;
import de.blau.android.util.Snack;
import de.blau.android.util.ThemeUtils;
/** Provides an activity for editing the API list */
public class APIEditorActivity extends URLListEditActivity {
private static final int ERROR_COLOR = R.color.ccc_red;
private static final int VALID_COLOR = R.color.black;
private AdvancedPrefDatabase db;
public APIEditorActivity() {
super();
}
public static void startForResult(@NonNull Activity activity,
@NonNull String apiName,
@NonNull String apiUrl,
int requestCode) {
Intent intent = new Intent(activity, APIEditorActivity.class);
intent.setAction(ACTION_NEW);
intent.putExtra(EXTRA_NAME, apiName);
intent.putExtra(EXTRA_VALUE, apiUrl);
activity.startActivityForResult(intent, requestCode);
}
@Override
public void onCreate(Bundle savedInstanceState) {
Preferences prefs = new Preferences(this);
if (prefs.lightThemeEnabled()) {
setTheme(R.style.Theme_customLight);
}
db = new AdvancedPrefDatabase(this);
super.onCreate(savedInstanceState);
}
@Override
protected int getAddTextResId() {
return R.string.urldialog_add_api;
}
@Override
protected void onLoadList(List<ListEditItem> items) {
API[] apis = db.getAPIs();
API current = db.getCurrentAPI();
for (API api : apis) {
items.add(new ListEditItem(api.id, api.name, api.url, api.readonlyurl, api.notesurl, api.oauth, current.id.equals(api.id)));
}
}
@Override
protected void onItemClicked(ListEditItem item) {
db.selectAPI(item.id);
// this is a bit hackish, but only one can be selected
for (ListEditItem lei:items) {
lei.active = false;
}
item.active = true;
updateAdapter();
// finish();
}
@Override
protected void onItemCreated(ListEditItem item) {
db.addAPI(item.id, item.name, item.value, item.value_2, item.value_3, "", "", "", item.enabled);
}
@Override
protected void onItemEdited(ListEditItem item) {
db.setAPIDescriptors(item.id, item.name, item.value, item.value_2, item.value_3, item.enabled);
}
@Override
protected void onItemDeleted(ListEditItem item) {
db.deleteAPI(item.id);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
selectedItem = (ListEditItem)getListView().getItemAtPosition(info.position);
if (selectedItem != null ) {
menu.add(Menu.NONE, MENUITEM_EDIT, Menu.NONE, r.getString(R.string.edit)).setOnMenuItemClickListener(this);
if (!selectedItem.id.equals(LISTITEM_ID_DEFAULT)) {
menu.add(Menu.NONE, MENUITEM_DELETE, Menu.NONE, r.getString(R.string.delete)).setOnMenuItemClickListener(this);
for (Entry<Integer, Integer> entry : additionalMenuItems.entrySet() ) {
menu.add(Menu.NONE, entry.getKey() + MENUITEM_ADDITIONAL_OFFSET, Menu.NONE, r.getString(entry.getValue()))
.setOnMenuItemClickListener(this);
}
}
}
}
/**
* Opens the dialog to edit an item
* @param item the selected item
*/
@Override
protected void itemEditDialog(final ListEditItem item) {
final AlertDialog.Builder builder = new AlertDialog.Builder(ctx);
final LayoutInflater inflater = ThemeUtils.getLayoutInflater(ctx);
final View mainView = inflater.inflate(R.layout.listedit_apiedit, null);
// final View mainView = View.inflate(ctx, R.layout.listedit_apiedit, null);
final TextView editName = (TextView)mainView.findViewById(R.id.listedit_editName);
final TextView editValue = (TextView)mainView.findViewById(R.id.listedit_editValue);
final TextView editValue_2 = (TextView)mainView.findViewById(R.id.listedit_editValue_2);
final TextView editValue_3 = (TextView)mainView.findViewById(R.id.listedit_editValue_3);
final CheckBox oauth = (CheckBox)mainView.findViewById(R.id.listedit_oauth);
if (item != null) {
editName.setText(item.name);
editValue.setText(item.value);
editValue_2.setText(item.value_2);
editValue_3.setText(item.value_3);
oauth.setChecked(item.enabled);
} else if (isAddingViaIntent()) {
String tmpName = getIntent().getExtras().getString(EXTRA_NAME);
String tmpValue = getIntent().getExtras().getString(EXTRA_VALUE);
editName.setText(tmpName == null ? "" : tmpName);
editValue.setText(tmpValue == null ? "" : tmpValue);
oauth.setChecked(false);
}
if (item != null && item.id.equals(LISTITEM_ID_DEFAULT)) {
// name and value are not editable
editName.setEnabled(false);
editValue.setEnabled(false);
editValue_2.setEnabled(false);
editValue_3.setEnabled(false);
}
builder.setView(mainView);
builder.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which){
//Do nothing here because we override this button later to change the close behaviour.
//However, we still need this because on older versions of Android unless we
//pass a handler the button doesn't get instantiated
}
});
builder.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which){
//leave empty
}
});
builder.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
if (isAddingViaIntent()) {
setResult(RESULT_CANCELED);
finish();
}
}
});
final AlertDialog dialog =builder.create();
dialog.setView(mainView);
dialog.show();
//overriding the handlers
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Boolean validAPIURL = true;
Boolean validReadOnlyAPIURL = true;
Boolean validNotesAPIURL = true;
String name = editName.getText().toString().trim();
String apiURL = editValue.getText().toString().trim();
String readOnlyAPIURL = editValue_2.getText().toString().trim();
String notesAPIURL = editValue_3.getText().toString().trim();
boolean enabled = oauth.isChecked();
// (re-)set to black
changeBackgroundColor(editValue,VALID_COLOR);
changeBackgroundColor(editValue_2,VALID_COLOR);
changeBackgroundColor(editValue_3,VALID_COLOR);
// validate entries
validAPIURL= Patterns.WEB_URL.matcher(apiURL).matches();
if (!"".equals(readOnlyAPIURL)) {
validReadOnlyAPIURL = Patterns.WEB_URL.matcher(readOnlyAPIURL).matches();
} else {
readOnlyAPIURL = null;
}
if (!"".equals(notesAPIURL)) {
validNotesAPIURL = Patterns.WEB_URL.matcher(notesAPIURL).matches();
} else {
notesAPIURL = null;
}
// save or display toast
if(validAPIURL && validNotesAPIURL && validReadOnlyAPIURL) { //check if fields valid, optional ones checked if values entered
if (!"".equals(apiURL)) {
if (item == null) {
// new item
finishCreateItem(new ListEditItem(name, apiURL, readOnlyAPIURL, notesAPIURL, enabled));
} else {
item.name = name;
item.value = apiURL;
item.value_2 = readOnlyAPIURL;
item.value_3 = notesAPIURL;
item.enabled = enabled;
finishEditItem(item);
}
}
dialog.dismiss();
} else if (validAPIURL==false) {
Snack.barError(APIEditorActivity.this, R.string.toast_invalid_apiurl); //if garbage value entered
changeBackgroundColor(editValue,ERROR_COLOR);
} else if (!validReadOnlyAPIURL) {
Snack.barError(APIEditorActivity.this, R.string.toast_invalid_readonlyurl); //if garbage value entered
changeBackgroundColor(editValue_2,ERROR_COLOR);
} else if (!validNotesAPIURL) {
Snack.barError(APIEditorActivity.this, R.string.toast_invalid_notesurl);//if garbage value entered
changeBackgroundColor(editValue_3,ERROR_COLOR);
}
}
});
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
}
});
}
void changeBackgroundColor(TextView textView, int color) {
textView.getBackground().mutate().setColorFilter(ContextCompat.getColor(APIEditorActivity.this,color), PorterDuff.Mode.SRC_ATOP);
}
}