/*
* 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.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.Button;
import android.widget.NumberPicker;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.google.common.base.Strings;
import org.kegbot.backend.Backend;
import org.kegbot.backend.BackendException;
import org.kegbot.core.KegbotCore;
import org.kegbot.core.SyncManager;
import org.kegbot.proto.Models.Controller;
import butterknife.ButterKnife;
/**
* Activity shown when a new controller is connected.
*
* @author mike wakerly (opensource@hoho.com)
*/
public class NewControllerActivity extends Activity {
private static final String TAG = NewControllerActivity.class.getSimpleName();
private static final String EXTRA_CONTROLLER_NAME = "name";
private static final String EXTRA_SERIAL_NUMBER = "serial";
private static final String EXTRA_DEVICE_TYPE = "type";
private String mControllerName;
private String mSerialNumber;
private String mDeviceType;
TextView mTitle;
TextView mSubtitle;
ProgressBar mProgressBar;
Button mCancelButton;
Button mAssignButton;
ViewGroup mNumMetersGroup;
NumberPicker mNumMeters;
private final Handler mHandler = new Handler(Looper.getMainLooper());
private final Runnable mFinishRunnable = new Runnable() {
@Override
public void run() {
finish();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.new_controller_activity);
mTitle = ButterKnife.findById(this, R.id.new_controller_title);
mSubtitle = ButterKnife.findById(this, R.id.new_controller_subtitle);
mProgressBar = ButterKnife.findById(this, R.id.new_controller_progbar);
mCancelButton = ButterKnife.findById(this, R.id.new_controller_cancel_button);
mAssignButton = ButterKnife.findById(this, R.id.new_controller_add_button);
mNumMetersGroup = ButterKnife.findById(this, R.id.new_controller_num_meters_group);
mNumMeters = ButterKnife.findById(this, R.id.new_controller_num_meters);
mProgressBar.setVisibility(View.INVISIBLE);
mProgressBar.setIndeterminate(true);
mNumMeters.setMinValue(1);
mNumMeters.setMaxValue(16);
mNumMeters.setValue(2);
// Prevents soft keyboard from appearing.
mNumMeters.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
mAssignButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
createController();
}
});
mCancelButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
handleIntent();
}
private void createController() {
showAdding();
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
Log.d(TAG, "Creating controller...");
final Backend backend = KegbotCore.getInstance(NewControllerActivity.this).getBackend();
try {
final Controller controller =
backend.createController(mControllerName, mSerialNumber, mDeviceType);
final int numMeters = mNumMeters.getValue();
for (int portNum = 0; portNum < numMeters; portNum++) {
backend.createFlowMeter(controller,
String.format("flow%d", Integer.valueOf(portNum)), 5.4d);
}
final SyncManager syncManager =
KegbotCore.getInstance(NewControllerActivity.this).getSyncManager();
syncManager.requestSync();
Log.d(TAG, "Done!");
return null;
} catch (BackendException e) {
Log.e(TAG, "Error creating controller: " + e, e);
return String.format("Error creating controller (%s).", e.getMessage());
}
}
@Override
protected void onPostExecute(String result) {
if (result == null) {
showSuccess();
} else {
showError(result);
}
}
}.execute();
}
private void showInitial() {
mSubtitle.setText(R.string.new_controller_title);
mSubtitle.setText(String.format("%s %s", mSubtitle.getText(), mControllerName));
mProgressBar.setVisibility(View.INVISIBLE);
mAssignButton.setVisibility(View.VISIBLE);
mCancelButton.setVisibility(View.VISIBLE);
mNumMetersGroup.setVisibility(View.VISIBLE);
}
private void showAdding() {
mSubtitle.setText(R.string.new_controller_status_adding);
mProgressBar.setVisibility(View.VISIBLE);
mProgressBar.setIndeterminate(true);
mAssignButton.setVisibility(View.GONE);
mCancelButton.setVisibility(View.GONE);
mNumMetersGroup.setVisibility(View.GONE);
}
private void showSuccess() {
mSubtitle.setText(R.string.new_controller_status_added);
mProgressBar.setIndeterminate(false);
mProgressBar.setProgress(100);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
finish();
}
}, 3000);
}
private void showError(String error) {
mSubtitle.setText(error);
mProgressBar.setProgress(100);
mProgressBar.setIndeterminate(false);
mCancelButton.setVisibility(View.VISIBLE);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
showInitial();
}
}, 5000);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d(TAG, "onNewIntent: " + intent);
setIntent(intent);
handleIntent();
}
private void handleIntent() {
final Intent intent = getIntent();
Log.d(TAG, "Handling intent: " + intent);
mControllerName = intent.getStringExtra(EXTRA_CONTROLLER_NAME);
mSerialNumber = Strings.nullToEmpty(intent.getStringExtra(EXTRA_SERIAL_NUMBER));
mDeviceType = Strings.nullToEmpty(intent.getStringExtra(EXTRA_DEVICE_TYPE));
mSubtitle.setText(String.format("%s %s", mSubtitle.getText(), mControllerName));
}
@Override
protected void onPause() {
super.onPause();
mHandler.removeCallbacks(mFinishRunnable);
}
public static void startForNewController(Context context, String controllerName,
String serialNumber, String deviceType) {
final Intent intent = new Intent(context, NewControllerActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(EXTRA_CONTROLLER_NAME, Strings.nullToEmpty(controllerName));
intent.putExtra(EXTRA_SERIAL_NUMBER, Strings.nullToEmpty(serialNumber));
intent.putExtra(EXTRA_DEVICE_TYPE, Strings.nullToEmpty(deviceType));
context.startActivity(intent);
}
}