/*
FPLUGControllerFragment.java
Copyright (c) 2015 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.fplug.setting.fragment;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import org.deviceconnect.android.deviceplugin.fplug.R;
import org.deviceconnect.android.deviceplugin.fplug.fplug.FPLUGController;
import org.deviceconnect.android.deviceplugin.fplug.fplug.FPLUGRequestCallback;
import org.deviceconnect.android.deviceplugin.fplug.fplug.FPLUGResponse;
import org.deviceconnect.android.deviceplugin.fplug.fplug.WattHour;
import java.util.ArrayList;
import java.util.List;
/**
* Fragment for Control F-PLUG.
*
* @author NTT DOCOMO, INC.
*/
public class FPLUGControllerFragment extends Fragment {
private FPLUGController mController;
private TextView mAddressView;
private ItemAdapter mAdapter;
public void setTargetFPlugAddress(FPLUGController controller) {
mController = controller;
mAddressView.setText(getString(R.string.setting_controller_mac_address, controller.getAddress()));
}
@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) {
mController = null;
final View root = inflater.inflate(R.layout.control_fplug, container, false);
setupUI(root);
return root;
}
private void setupUI(final View root) {
mAddressView = (TextView) root.findViewById(R.id.mac_address);
setInitButton(root);
setListView(root);
}
private void setListView(final View root) {
ListView list = (ListView) root.findViewById(R.id.list);
ItemAdapter adapter = new ItemAdapter(getActivity(), createItems());
list.setAdapter(adapter);
list.setItemsCanFocus(true);
mAdapter = adapter;
}
private void setInitButton(final View root) {
root.findViewById(R.id.init).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!checkController()) {
return;
}
new AlertDialog.Builder(getActivity())
.setTitle(getString(R.string.setting_controller_init_dialog_title))
.setMessage(getString(R.string.setting_controller_init_dialog_message))
.setPositiveButton(getString(R.string.ok),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mController.requestInitPlug(new FPLUGRequestCallback() {
@Override
public void onSuccess(FPLUGResponse response) {
if (getActivity() != null) {
updateText(root, R.id.init_res, getString(R.string.success));
}
}
@Override
public void onError(String message) {
if (getActivity() != null) {
updateText(root, R.id.init_res, getString(R.string.failed));
}
}
@Override
public void onTimeout() {
if (getActivity() != null) {
updateText(root, R.id.init_res, getString(R.string.timeout));
}
}
});
dialog.dismiss();
}
})
.setNegativeButton(getString(R.string.cancel),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).show();
}
});
}
private void requestRealtime(Item item) {
if (!checkController()) {
return;
}
mController.requestRealtimeWatt(new SimpleRequestCallback(item) {
@Override
public void onSuccess(FPLUGResponse response) {
getItem().value = "" + response.getRealtimeWatt();
updateValue();
}
});
}
private void requestIntegrated(Item item) {
if (!checkController()) {
return;
}
mController.requestWattHour(new SimpleRequestCallback(item) {
@Override
public void onSuccess(FPLUGResponse response) {
int total = 0;
for (WattHour wh : response.getWattHourList()) {
total += wh.getWatt();
}
getItem().value = "" + total;
updateValue();
}
});
}
private void requestTemperature(Item item) {
if (!checkController()) {
return;
}
mController.requestTemperature(new SimpleRequestCallback(item) {
@Override
public void onSuccess(FPLUGResponse response) {
getItem().value = "" + response.getTemperature();
updateValue();
}
});
}
private void requestHumidity(Item item) {
if (!checkController()) {
return;
}
mController.requestHumidity(new SimpleRequestCallback(item) {
@Override
public void onSuccess(FPLUGResponse response) {
getItem().value = "" + response.getHumidity();
updateValue();
}
});
}
private void requestIlluminance(Item item) {
if (!checkController()) {
return;
}
mController.requestIlluminance(new SimpleRequestCallback(item) {
@Override
public void onSuccess(FPLUGResponse response) {
getItem().value = "" + response.getIlluminance();
updateValue();
}
});
}
private void updateText(final View root, final int resId, final String text) {
if (!isResumed()) {
return;
}
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
((TextView) root.findViewById(resId)).setText(text);
}
});
}
private void updateValue() {
if (!isResumed()) {
return;
}
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter.notifyDataSetChanged();
}
});
}
private boolean checkController() {
if (mController == null) {
Toast.makeText(getActivity(), getString(R.string.setting_controller_unselected_fplug), Toast.LENGTH_SHORT).show();
return false;
}
return true;
}
private List<Item> createItems() {
List<Item> items = new ArrayList<>();
items.add(new Item(getString(R.string.realtime), "0", "w", ITEM_TYPE.REALTIME));
items.add(new Item(getString(R.string.integrated), "0", "w", ITEM_TYPE.INTEGRATED));
items.add(new Item(getString(R.string.temperature), "0", "℃", ITEM_TYPE.TEMPERATURE));
items.add(new Item(getString(R.string.humidity), "0", "%", ITEM_TYPE.HUMIDITY));
items.add(new Item(getString(R.string.illuminance), "0", "lx", ITEM_TYPE.ILLUMINANCE));
items.add(new Item(ITEM_TYPE.LED));
return items;
}
private void onClickButton(Item item) {
switch (item.type) {
case REALTIME:
requestRealtime(item);
break;
case INTEGRATED:
requestIntegrated(item);
break;
case TEMPERATURE:
requestTemperature(item);
break;
case HUMIDITY:
requestHumidity(item);
break;
case ILLUMINANCE:
requestIlluminance(item);
break;
}
}
private void onClickLED(boolean isOn) {
if (!checkController()) {
return;
}
mController.requestLEDControl(isOn, new FPLUGRequestCallback() {
@Override
public void onSuccess(FPLUGResponse response) {
}
@Override
public void onError(String message) {
}
@Override
public void onTimeout() {
}
});
}
private class ItemAdapter extends ArrayAdapter<Item> {
private LayoutInflater mInflater;
public ItemAdapter(final Context context, final List<Item> objects) {
super(context, 0, objects);
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final Item item = getItem(position);
if (item.type == ITEM_TYPE.LED) {
convertView = mInflater.inflate(R.layout.led_button_item, parent, false);
convertView.findViewById(R.id.on).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onClickLED(true);
}
});
convertView.findViewById(R.id.off).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onClickLED(false);
}
});
} else {
convertView = mInflater.inflate(R.layout.getable_item, parent, false);
convertView.findViewById(R.id.get).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onClickButton(item);
}
});
((TextView) convertView.findViewById(R.id.name)).setText(item.name);
((TextView) convertView.findViewById(R.id.value)).setText(item.value);
TextView unitTextView = (TextView) convertView.findViewById(R.id.unit);
if (!isFailedValue(item.value)) {
unitTextView.setText(item.unit);
unitTextView.setVisibility(View.VISIBLE);
} else {
unitTextView.setVisibility(View.INVISIBLE);
}
}
return convertView;
}
private boolean isFailedValue(String value) {
return getString(R.string.get_failed).equals(value) || getString(R.string.timeout).equals(value);
}
}
enum ITEM_TYPE {
REALTIME, INTEGRATED,
LED, TEMPERATURE, HUMIDITY, ILLUMINANCE
}
private class Item {
ITEM_TYPE type;
String name;
String value;
String unit;
Item(ITEM_TYPE type) {
this.type = type;
}
Item(String name, String value, String unit, ITEM_TYPE type) {
this.name = name;
this.value = value;
this.unit = unit;
this.type = type;
}
}
private abstract class SimpleRequestCallback implements FPLUGRequestCallback {
Item mItem;
public SimpleRequestCallback(Item item) {
mItem = item;
}
@Override
public void onError(String message) {
mItem.value = getString(R.string.get_failed);
updateValue();
}
@Override
public void onTimeout() {
mItem.value = getString(R.string.timeout);
updateValue();
}
protected Item getItem() {
return mItem;
}
}
}