package com.pekall.smartplug.smartplugapp;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;
import android.widget.ToggleButton;
import com.pekall.smartplug.model.SmartPlug;
import com.pekall.smartplug.model.SmartPlug.SmartPlugListener;
import com.pekall.smartplug.model.SmartPlugImpl;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MainActivity extends Activity implements OnClickListener, SmartPlugListener {
private static final String HOST = "zealot.eicp.net";
private static final int PORT = 10854;
// private static final String HOST = "192.168.1.104";
// private static final int PORT = 16668;
private static final String DEVICE_ID = "1";
private static final String DEVICE_MODE = "light_01_m";
private static final int WHAT_DISCONNECTED = 1;
private static final int WHAT_SET_STATUS = 2;
private Lamp mLamp;
private ToggleButton mNetworkSwitch;
private ToggleButton mLightSwitch;
private SmartPlug mSmartPlug;
private ExecutorService mExecutorService;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case WHAT_DISCONNECTED:
Toast.makeText(MainActivity.this, "disconnected", Toast.LENGTH_SHORT).show();
mNetworkSwitch.setChecked(false);
break;
case WHAT_SET_STATUS:
boolean status = (msg.arg1 == 1);
mLamp.setState(status);
mLightSwitch.setChecked(status);
break;
default:
break;
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLamp = (Lamp) findViewById(R.id.lamp1);
mNetworkSwitch = (ToggleButton) findViewById(R.id.network_switch);
mLightSwitch = (ToggleButton) findViewById(R.id.light_switch);
mNetworkSwitch.setOnClickListener(this);
mLightSwitch.setOnClickListener(this);
mSmartPlug = new SmartPlugImpl(this);
mExecutorService = Executors.newSingleThreadExecutor();
}
@Override
public boolean onSetStatusRequested(SmartPlug smartPlug, final boolean on) {
Message msg = mHandler.obtainMessage(WHAT_SET_STATUS, (on ? 1 : 0), 0);
return mHandler.sendMessage(msg);
}
@Override
public boolean onGetStatusRequested(SmartPlug smartPlug) {
return mLamp.getState();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mSmartPlug.isConnected()) {
mSmartPlug.disconnect();
}
mSmartPlug.release();
mExecutorService.shutdown();
}
@Override
public void onError(SmartPlug smartPlug, String msg) {
// TODO Auto-generated method stub
}
@Override
public void onDisconnected(SmartPlug smartPlug) {
mHandler.sendEmptyMessage(WHAT_DISCONNECTED);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (v == mNetworkSwitch) {
if (mNetworkSwitch.isChecked()) {
login(HOST, PORT, DEVICE_ID, DEVICE_MODE);
} else {
mSmartPlug.disconnect();
}
} else if (v == mLightSwitch) {
final boolean status = mLightSwitch.isChecked();
mLamp.setState(status);
reportStatus(status);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
private void reportStatus(boolean status) {
mExecutorService.execute(new ReportStateTask(status));
}
private void login(String host, int port, String deviceId, String deviceMode) {
new LoginTask(host, port, deviceId, deviceMode).execute((Void)null);
}
private class ReportStateTask implements Runnable {
private boolean mStatus;
public ReportStateTask(boolean status) {
mStatus = status;
}
@Override
public void run() {
mSmartPlug.reportStatus(mStatus);
}
}
private class LoginTask extends AsyncTask<Void, Void, Boolean> {
private String mHost;
private int mPort;
private String mDeviceId;
private String mDeviceMode;
public LoginTask(String host, int port, String deviceId, String deviceMode) {
mHost = host;
mPort = port;
mDeviceId = deviceId;
mDeviceMode = deviceMode;
}
@Override
protected Boolean doInBackground(Void... params) {
boolean ret = mSmartPlug.connect(mHost, mPort);
Slog.d("connect " + (ret ? "ok" : "fail"));
if (!ret) {
return false;
}
ret = mSmartPlug.login(mDeviceId, mDeviceMode);
Slog.d("login " + (ret ? "ok" : "fail"));
return ret;
}
@Override
protected void onPostExecute(Boolean result) {
mNetworkSwitch.setEnabled(true);
mNetworkSwitch.setChecked(result);
}
@Override
protected void onPreExecute() {
mNetworkSwitch.setEnabled(false);
}
}
}