package com.kuxhausen.huemore.automation; import com.google.gson.Gson; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.database.Cursor; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.SimpleCursorAdapter; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.Spinner; import android.widget.TextView; import com.kuxhausen.huemore.Helpers; import com.kuxhausen.huemore.NetworkManagedActivity; import com.kuxhausen.huemore.R; import com.kuxhausen.huemore.persistence.Definitions.GroupColumns; import com.kuxhausen.huemore.persistence.Definitions.MoodColumns; public class EditActivity extends NetworkManagedActivity implements LoaderManager.LoaderCallbacks<Cursor>, OnCheckedChangeListener, OnClickListener { // don't change value protected static final String EXTRA_BUNDLE_SERIALIZED_BY_NAME = "com.kuxhausen.huemore.EXTRA_BUNDLE_SERIALIZED_BY_NAME"; protected static final String PERCENT_BRIGHTNESS_KEY = "com.kuxhausen.huemore.PERCENT_BRIGHTNESS"; protected static final String PERCENT_BRIGHTNESS_VALUE = "%percentbrightness"; protected static final String MOOD_NAME_KEY = "com.kuxhausen.huemore.MOOD_NAME"; protected static final String MOOD_NAME_VALUE = "%moodname"; protected static final String TASKER_VARIABLE_TARGETS_KEY = "net.dinglisch.android.tasker.extras.VARIABLE_REPLACE_KEYS"; protected static final String TASKER_VARIABLE_TARGETS_VALUE = PERCENT_BRIGHTNESS_KEY + " " + MOOD_NAME_KEY; private Button okayButton, cancelButton; Context context; Gson gson = new Gson(); // Identifies a particular Loader being used in this component private static final int GROUPS_LOADER = 0, MOODS_LOADER = 1; private static final String[] GROUP_SELECTION = {GroupColumns.COL_GROUP_NAME, GroupColumns._ID}; private static final String[] MOOD_SELECTION = {MoodColumns.COL_MOOD_NAME, MoodColumns._ID}; private SeekBar brightnessBar; private CheckBox brightnessCheckBox; private TextView brightnessDescripterTextView; private Spinner groupSpinner, moodSpinner; private SimpleCursorAdapter groupDataSource, moodDataSource; private LegacyGMB priorGMB; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Helpers.applyLocalizationPreference(this); setContentView(R.layout.edit_automation); SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); // check full version unlocked Bundle b = this.getIntent().getExtras(); if (b != null && b.containsKey(com.twofortyfouram.locale.Intent.EXTRA_BUNDLE) && b.getBundle(com.twofortyfouram.locale.Intent.EXTRA_BUNDLE).containsKey( EXTRA_BUNDLE_SERIALIZED_BY_NAME)) { setSerializedByName(b.getBundle(com.twofortyfouram.locale.Intent.EXTRA_BUNDLE).getString( EXTRA_BUNDLE_SERIALIZED_BY_NAME)); } okayButton = (Button) this.findViewById(R.id.okay); okayButton.setOnClickListener(this); cancelButton = (Button) this.findViewById(R.id.cancel); cancelButton.setOnClickListener(this); int layout = android.R.layout.simple_list_item_activated_1; LoaderManager lm = getSupportLoaderManager(); lm.initLoader(GROUPS_LOADER, null, this); lm.initLoader(MOODS_LOADER, null, this); brightnessBar = (SeekBar) this.findViewById(R.id.brightnessBar); brightnessBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { // preview(); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } }); brightnessDescripterTextView = (TextView) this.findViewById(R.id.brightnessDescripterTextView); brightnessCheckBox = (CheckBox) this.findViewById(R.id.includeBrightnessCheckBox); brightnessCheckBox.setOnCheckedChangeListener(this); groupSpinner = (Spinner) this.findViewById(R.id.groupSpinner); groupDataSource = new SimpleCursorAdapter(this, layout, null, GROUP_SELECTION, new int[]{android.R.id.text1}, 0); groupDataSource.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); groupSpinner.setAdapter(groupDataSource); moodSpinner = (Spinner) this.findViewById(R.id.moodSpinner); moodDataSource = new SimpleCursorAdapter(this, layout, null, MOOD_SELECTION, new int[]{android.R.id.text1}, 0); moodDataSource.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); moodSpinner.setAdapter(moodDataSource); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.okay: Intent i = new Intent(); i.putExtra(com.twofortyfouram.locale.Intent.EXTRA_STRING_BLURB, getSerializedByNamePreview()); Bundle b = new Bundle(); b.putString(EXTRA_BUNDLE_SERIALIZED_BY_NAME, getSerializedByName()); i.putExtra(com.twofortyfouram.locale.Intent.EXTRA_BUNDLE, b); i.putExtra(TASKER_VARIABLE_TARGETS_KEY, TASKER_VARIABLE_TARGETS_VALUE); i.putExtra(PERCENT_BRIGHTNESS_KEY, PERCENT_BRIGHTNESS_VALUE); i.putExtra(MOOD_NAME_KEY, MOOD_NAME_VALUE); setResult(Activity.RESULT_OK, i); super.finish(); break; case R.id.cancel: setResult(Activity.RESULT_CANCELED); super.finish(); break; } } public String getSerializedByNamePreview() { LegacyGMB gmb = new LegacyGMB(); gmb.group = ((TextView) groupSpinner.getSelectedView()).getText().toString(); gmb.mood = ((TextView) moodSpinner.getSelectedView()).getText().toString(); if (brightnessBar.getVisibility() == View.VISIBLE) { gmb.brightness = brightnessBar.getProgress(); } String preview = gmb.group + " \u2192 " + gmb.mood; if (brightnessBar.getVisibility() == View.VISIBLE) { preview += " @ " + ((gmb.brightness * 100) / 255) + "%"; } return preview; } public void setSerializedByName(String s) { priorGMB = gson.fromJson(s, LegacyGMB.class); } public String getSerializedByName() { LegacyGMB gmb = new LegacyGMB(); gmb.group = ((TextView) groupSpinner.getSelectedView()).getText().toString(); gmb.mood = ((TextView) moodSpinner.getSelectedView()).getText().toString(); if (brightnessBar.getVisibility() == View.VISIBLE) { gmb.brightness = brightnessBar.getProgress(); } return gson.toJson(gmb); } @Override public Loader<Cursor> onCreateLoader(int loaderID, Bundle arg1) { switch (loaderID) { case GROUPS_LOADER: return new CursorLoader(this, GroupColumns.URI, GROUP_SELECTION, null, null, null); case MOODS_LOADER: return new CursorLoader(this, MoodColumns.MOODS_URI, MOOD_SELECTION, null, null, null); default: return null; } } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { switch (loader.getId()) { case GROUPS_LOADER: if (groupDataSource != null) { groupDataSource.changeCursor(cursor); } break; case MOODS_LOADER: if (moodDataSource != null) { moodDataSource.changeCursor(cursor); } break; } if (priorGMB != null) { // apply prior state int moodPos = 0; for (int i = 0; i < moodDataSource.getCount(); i++) { if (((Cursor) moodDataSource.getItem(i)).getString(0).equals(priorGMB.mood)) { moodPos = i; } } moodSpinner.setSelection(moodPos); int groupPos = 0; for (int i = 0; i < groupDataSource.getCount(); i++) { if (((Cursor) groupDataSource.getItem(i)).getString(0).equals(priorGMB.group)) { groupPos = i; } } groupSpinner.setSelection(groupPos); if (priorGMB.brightness != null) { brightnessBar.setProgress(priorGMB.brightness); } } } @Override public void onLoaderReset(Loader<Cursor> loader) { /* * Clears out the adapter's reference to the Cursor. This prevents memory leaks. */ // unregisterForContextMenu(getListView()); switch (loader.getId()) { case GROUPS_LOADER: if (groupDataSource != null) { groupDataSource.changeCursor(null); } break; case MOODS_LOADER: if (moodDataSource != null) { moodDataSource.changeCursor(null); } break; } } @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { brightnessBar.setVisibility(View.VISIBLE); brightnessDescripterTextView.setVisibility(View.VISIBLE); } else { brightnessBar.setVisibility(View.INVISIBLE); brightnessDescripterTextView.setVisibility(View.INVISIBLE); } } }