/*
* Copyright 2014 Bevbot LLC <info@bevbot.com>
*
* This file is part of the Kegtab package from the Kegbot project. For
* more information on Kegtab or Kegbot, see <http://kegbot.org/>.
*
* Kegtab is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free
* Software Foundation, version 2.
*
* Kegtab is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with Kegtab. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kegbot.app;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import org.kegbot.app.config.AppConfiguration;
import org.kegbot.app.config.SharedPreferencesConfigurationStore;
import org.kegbot.app.util.KegSizes;
import org.kegbot.backend.Backend;
import org.kegbot.backend.BackendException;
import org.kegbot.core.KegbotCore;
import org.kegbot.proto.Models.KegTap;
import java.util.Map;
/**
* @author mike wakerly (opensource@hoho.com)
*/
public class NewKegActivity extends Activity {
private static final String TAG = NewKegActivity.class.getSimpleName();
private static final String EXTRA_TAP_ID = "tap_id";
private KegTap mTap;
private AutoCompleteTextView mName;
private AutoCompleteTextView mBrewerName;
private AutoCompleteTextView mStyle;
private Spinner mSize;
private ArrayAdapter<KegSizeItem> mSizeAdapter;
private Button mActivateButton;
private static class KegSizeItem {
private String mName;
private String mDescription;
KegSizeItem(String name, String description) {
this.mName = name;
this.mDescription = description;
}
@Override
public String toString() {
return mDescription;
}
public String getName() {
return mName;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.new_keg_activity);
mName = (AutoCompleteTextView) findViewById(R.id.newKegBeerName);
mBrewerName = (AutoCompleteTextView) findViewById(R.id.newKegBrewer);
mStyle = (AutoCompleteTextView) findViewById(R.id.newKegStyle);
// Hack: TextView "next" doesn't advance to the Spinner without
// this hack..
mStyle.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_NEXT) {
hideKeyboard();
mSize.requestFocus();
mSize.performClick();
}
return true;
}
});
mSize = (Spinner) findViewById(R.id.newKegSize);
mSizeAdapter = new ArrayAdapter<KegSizeItem>(this, R.layout.keg_size_spinner_item);
mSize.setAdapter(mSizeAdapter);
for (final Map.Entry<String, String> entry : KegSizes.DESCRIPTIONS.entrySet()) {
mSizeAdapter.add(new KegSizeItem(entry.getKey(), entry.getValue()));
}
mSize.setSelection(getLastUsedKegSizeIndex());
mActivateButton = (Button) findViewById(R.id.newKegButton);
mActivateButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handleDoneButton();
}
});
}
private void setLastUsedKegSize(String size){
AppConfiguration appConfiguration = new AppConfiguration(
SharedPreferencesConfigurationStore.getDefaultSharedPreferncesConfigurationStore(this));
appConfiguration.setLastUsedKegSize(size);
}
private int getLastUsedKegSizeIndex(){
AppConfiguration appConfiguration = new AppConfiguration(
SharedPreferencesConfigurationStore.getDefaultSharedPreferncesConfigurationStore(this));
String lastUsedKeg = appConfiguration.getLastUsedKegSize();
if (mSizeAdapter != null && mSizeAdapter.getCount() > 1){
for (int i = 0; i < mSizeAdapter.getCount(); i++){
if (mSizeAdapter.getItem(i).getName().equals(lastUsedKeg)){
return i;
}
}
}
return 0;
}
private void hideKeyboard() {
InputMethodManager inputManager =
(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
}
@Override
protected void onResume() {
super.onResume();
final int tapId = getIntent().getIntExtra(EXTRA_TAP_ID, 0);
mTap = KegbotCore.getInstance(this).getTapManager().getTap(tapId);
if (mTap == null) {
Log.e(TAG, "Could not find tap for id: " + tapId);
finish();
}
}
@Override
protected void onPause() {
super.onPause();
}
private void handleDoneButton() {
final ProgressDialog dialog = new ProgressDialog(this);
dialog.setIndeterminate(true);
dialog.setCancelable(false);
dialog.setTitle("Activating Keg");
dialog.setMessage("Please wait ...");
dialog.show();
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
KegSizeItem selected = (KegSizeItem) mSize.getSelectedItem();
if (selected == null) {
Log.e(TAG, "No Selection!!");
return "No Selection.";
}
try {
final Backend backend = KegbotCore.getInstance(NewKegActivity.this).getBackend();
backend.startKeg(mTap, mName.getText().toString(),
mBrewerName.getText().toString(), mStyle.getText().toString(),
selected.getName());
setLastUsedKegSize(selected.getName());
return "";
} catch (BackendException e) {
Log.w(TAG, "Activation failed.", e);
return e.toString();
}
}
@Override
protected void onPostExecute(String result) {
if (dialog.isShowing()) {
dialog.dismiss();
}
if (result.isEmpty()) {
Log.d(TAG, "Keg started!");
KegbotCore.getInstance(NewKegActivity.this).getSyncManager().requestSync();
finish();
return;
}
if (isCancelled() || isFinishing()) {
return;
}
new AlertDialog.Builder(NewKegActivity.this)
.setCancelable(true)
.setNegativeButton("Ok", null)
.setTitle("Activation failed")
.setMessage("Activation failed: " + result)
.show();
}
}.execute();
}
static Intent getStartIntent(Context context, final KegTap tap) {
// TODO(mikey): Handle tap meter null.
final Intent intent = new Intent(context, NewKegActivity.class);
intent.putExtra(EXTRA_TAP_ID, tap.getId());
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
return intent;
}
}