package it.angelic.soulissclient;
import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RemoteViews;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import java.util.LinkedList;
import java.util.List;
import it.angelic.soulissclient.model.ISoulissCommand;
import it.angelic.soulissclient.model.ISoulissExecutable;
import it.angelic.soulissclient.model.SoulissCommand;
import it.angelic.soulissclient.model.SoulissNode;
import it.angelic.soulissclient.model.SoulissScene;
import it.angelic.soulissclient.model.SoulissTypical;
import it.angelic.soulissclient.model.db.SoulissDBHelper;
public class SoulissWidgetConfig extends Activity {
private SoulissNode[] nodiArray;
private int mAppWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
private Spinner outputNodeSpinner;
private Spinner outputCommandSpinner;
private Spinner outputTypicalSpinner;
private EditText widgetLabel;
private LinkedList<SoulissScene> scenes;
private TextView textViewCommand;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setResult(RESULT_CANCELED);
setContentView(R.layout.soulisswidgetconfig);
outputTypicalSpinner = (Spinner) findViewById(R.id.spinner3);
outputCommandSpinner = (Spinner) findViewById(R.id.spinnerCommand);
outputNodeSpinner = (Spinner) findViewById(R.id.spinner2);
Button configOkButton = (Button) findViewById(R.id.buttonOkWidgetConfig);
Button configCancelButton = (Button) findViewById(R.id.buttonCancelWidgetConfig);
widgetLabel = (EditText) findViewById(R.id.editTextWidgetLabel);
textViewCommand = (TextView) findViewById(R.id.textViewCommand);
configOkButton.setOnClickListener(configOkButtonOnClickListener);
configCancelButton.setOnClickListener(configCancelButtonOnClickListener);
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
mAppWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
}
// If they gave us an intent without the widget id, just bail.
if (mAppWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
finish();
}
SoulissDBHelper datasource = new SoulissDBHelper(this);
SoulissDBHelper.open();
// prendo tipici dal DB
List<SoulissNode> goer = datasource.getAllNodes();
//Aggiungo massivo
SoulissNode massive = new SoulissNode(getApplicationContext(), Constants.MASSIVE_NODE_ID);// MASSIVO
massive.setName(getString(R.string.allnodes));
massive.setTypicals(datasource.getUniqueTypicals(massive));
goer.add(massive);
//AGGIUNGO scene
SoulissNode fake = new SoulissNode(getApplicationContext(), Constants.COMMAND_FAKE_SCENE);// MASSIVO
fake.setName(getString(R.string.scenes_title));
goer.add(fake);
scenes = datasource.getScenes();
nodiArray = new SoulissNode[goer.size()];
nodiArray = goer.toArray(nodiArray);
fillNodeSpinner(outputNodeSpinner);
OnItemSelectedListener lit = new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
setTypicalSpinner(outputTypicalSpinner, nodiArray[pos]);
}
public void onNothingSelected(AdapterView<?> parent) {
}
};
outputNodeSpinner.setOnItemSelectedListener(lit);
OnItemSelectedListener lib = new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
// if (pos > 0) {
SoulissNode re = nodiArray[(int) outputNodeSpinner.getSelectedItemId()];
if (re.getNodeId() > Constants.COMMAND_FAKE_SCENE) {
//le scene non hanno comandi
List<SoulissTypical> rer = re.getActiveTypicals();
fillCommandSpinner(outputCommandSpinner, rer.get(pos));
} else {
SoulissScene questa = (SoulissScene) outputTypicalSpinner.getSelectedItem();
fillSceneCommandSpinner(outputCommandSpinner, questa);
widgetLabel.setText(questa.getNiceName());
}
}
public void onNothingSelected(AdapterView<?> parent) {
}
};
outputTypicalSpinner.setOnItemSelectedListener(lib);
}
private Button.OnClickListener configOkButtonOnClickListener = new Button.OnClickListener() {
private SharedPreferences customSharedPreference;
@Override
public void onClick(View arg0) {
final Context context = SoulissWidgetConfig.this;
customSharedPreference = context.getSharedPreferences("SoulissWidgetPrefs", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = customSharedPreference.edit();
SoulissCommand ccm = null;
//if (outputTypicalSpinner.getSelectedItem() == null){
// Toast.makeText(context, getString(R.string.widget_cantsave) , Toast.LENGTH_LONG).show();
// return;
//}
//se massivo -1, se scena -2
editor.putInt(mAppWidgetId + "_NODE", ((SoulissNode) outputNodeSpinner.getSelectedItem()).getNodeId());
ISoulissExecutable IToSave = (ISoulissExecutable) outputCommandSpinner.getSelectedItem();
if (IToSave instanceof SoulissScene) {
SoulissScene toExec = (SoulissScene) IToSave;
editor.putInt(mAppWidgetId + "_SLOT", toExec.getId());
editor.putInt(mAppWidgetId + "_FONTCODE", toExec.getIconResourceId());
} else if (IToSave instanceof SoulissCommand) {
ccm = (SoulissCommand) IToSave;
editor.putInt(mAppWidgetId + "_SLOT", ((SoulissTypical)outputTypicalSpinner.getSelectedItem()).getSlot());
editor.putLong(mAppWidgetId + "_CMD", ccm.getCommand());
editor.putInt(mAppWidgetId + "_FONTCODE", ccm.getIconResId());
} else if (IToSave == null) {//maybe a sensor
Toast.makeText(context, getString(R.string.widget_cantsave), Toast.LENGTH_LONG).show();
editor.putInt(mAppWidgetId + "_SLOT", ((SoulissTypical) outputTypicalSpinner.getSelectedItem()).getSlot());
editor.putInt(mAppWidgetId + "_FONTCODE", ((SoulissTypical) outputTypicalSpinner.getSelectedItem()).getIconResourceId());
}
editor.putString(mAppWidgetId + "_NAME", widgetLabel.getText().toString());
//editor.putString("COMMAND", outputCommandSpinner.getSelectedItem());
editor.commit();
Log.i(Constants.TAG, "Saving new Widget: "+mAppWidgetId );
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
appWidgetManager.updateAppWidget(mAppWidgetId, views);
SoulissWidget.forcedUpdate(context, appWidgetManager, mAppWidgetId);
Intent resultValue = new Intent();
resultValue.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mAppWidgetId);
Uri data = Uri.withAppendedPath(
Uri.parse("W://widget/id/")
, String.valueOf(mAppWidgetId));
resultValue.setData(data);
Log.i(Constants.TAG, "WIDGET URI:" + data.toString());
setResult(RESULT_OK, resultValue);
Log.i(Constants.TAG, "saving widget, id:"+mAppWidgetId);
finish();
}
};
private Button.OnClickListener configCancelButtonOnClickListener = new Button.OnClickListener() {
@Override
public void onClick(View arg0) {
finish();
}
};
/**
* Fills a spinner with nodes
*
* @param tgt
*/
private void fillNodeSpinner(Spinner tgt) {
// spinner popolato in base nodeArray
ArrayAdapter<SoulissNode> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_item,
nodiArray);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
tgt.setAdapter(adapter);
}
/**
* popola spinner tipici in base al nodo. per es. la V non ha il neutro
*
* @param tgt
* @param ref
*/
private void setTypicalSpinner(Spinner tgt, SoulissNode ref) {
try {
if (ref.getNodeId() > Constants.COMMAND_FAKE_SCENE) {
SoulissTypical[] strArray = new SoulissTypical[ref.getActiveTypicals().size()];
ref.getActiveTypicals().toArray(strArray);
ArrayAdapter<SoulissTypical> adapter = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_item, strArray);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
tgt.setAdapter(adapter);
} else if (ref.getNodeId() == Constants.COMMAND_FAKE_SCENE) {
SoulissScene[] strArray = new SoulissScene[scenes.size()];
strArray = scenes.toArray(strArray);
ArrayAdapter<SoulissScene> adapter = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_item, strArray);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
tgt.setAdapter(adapter);
} else {
Log.e(Constants.TAG, "UNPREDICTED");
}
} catch (Exception e) {
Log.e(Constants.TAG, "Errore in setTypicalSpinner:" + e.getMessage(), e);
}
}
/**
* popola spinner comandi in base al tipico. Mette nell'adapter i comandi
* ottenuti da getCommands
*
* @param tgt Spinner da riempire
* @param ref tipico da cui ottenere i comandi
*/
private void fillCommandSpinner(Spinner tgt, SoulissTypical ref) {
tgt.setVisibility(View.VISIBLE);
textViewCommand.setVisibility(View.VISIBLE);
ISoulissCommand[] strArray = new SoulissCommand[ref.getCommands(this).size()];
ref.getCommands(this).toArray(strArray);
// SoulissCommand[] etichette = new SoulissCommand[strArray.length];
ArrayAdapter<ISoulissCommand> adapter = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_item, strArray);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
tgt.setAdapter(adapter);
}
/**
* Mette un comando fake, ovvero la scena che verra\ eseguita
* NODEID = -2
*
* @param tgt Spinner da riempire
* @param ref tipico da cui ottenere i comandi
*/
private void fillSceneCommandSpinner(Spinner tgt, SoulissScene ref) {
tgt.setVisibility(View.INVISIBLE);
textViewCommand.setVisibility(View.INVISIBLE);
ISoulissExecutable[] strArray = new SoulissScene[1];
strArray[0] = ref;
ArrayAdapter<ISoulissExecutable> adapter = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_item, strArray);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
tgt.setAdapter(adapter);
}
}