/*
* The MIT License (MIT)
*
* Copyright (c) 2014 Curt Binder
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package info.curtbinder.reefangel.phone;
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TableRow;
import android.widget.TextView;
import info.curtbinder.reefangel.controller.Controller;
import info.curtbinder.reefangel.db.StatusTable;
public class PageControllerFragment extends Fragment
implements PageRefreshInterface,
View.OnLongClickListener {
private static final String TAG = PageControllerFragment.class.getSimpleName();
//Context ctx; // saved context from parent
private TextView[] deviceText =
new TextView[Controller.MAX_CONTROLLER_VALUES];
private TableRow[] deviceRow =
new TableRow[Controller.MAX_CONTROLLER_VALUES];
private short dpValue;
private short apValue;
public static PageControllerFragment newInstance() {
return new PageControllerFragment();
}
@Override
public View onCreateView(
LayoutInflater inflater,
ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.page_controller, container, false);
// do something with the rootView
findViews(rootView);
return rootView;
}
private void findViews(View root) {
deviceRow[Globals.T1_INDEX] = (TableRow) root.findViewById(R.id.t1_row);
deviceRow[Globals.T2_INDEX] = (TableRow) root.findViewById(R.id.t2_row);
deviceRow[Globals.T3_INDEX] = (TableRow) root.findViewById(R.id.t3_row);
deviceRow[Globals.PH_INDEX] = (TableRow) root.findViewById(R.id.ph_row);
deviceRow[Globals.DP_INDEX] = (TableRow) root.findViewById(R.id.dp_row);
deviceRow[Globals.AP_INDEX] = (TableRow) root.findViewById(R.id.ap_row);
deviceRow[Globals.ATOLO_INDEX] = (TableRow) root.findViewById(R.id.atolow_row);
deviceRow[Globals.ATOHI_INDEX] = (TableRow) root.findViewById(R.id.atohi_row);
deviceRow[Globals.SALINITY_INDEX] = (TableRow) root.findViewById(R.id.salinity_row);
deviceRow[Globals.ORP_INDEX] = (TableRow) root.findViewById(R.id.orp_row);
deviceRow[Globals.PHE_INDEX] = (TableRow) root.findViewById(R.id.phe_row);
deviceRow[Globals.WL_INDEX] = (TableRow) root.findViewById(R.id.water_row);
deviceRow[Globals.WL1_INDEX] = (TableRow) root.findViewById(R.id.water1_row);
deviceRow[Globals.WL2_INDEX] = (TableRow) root.findViewById(R.id.water2_row);
deviceRow[Globals.WL3_INDEX] = (TableRow) root.findViewById(R.id.water3_row);
deviceRow[Globals.WL4_INDEX] = (TableRow) root.findViewById(R.id.water4_row);
deviceRow[Globals.HUMIDITY_INDEX] = (TableRow) root.findViewById(R.id.humidity_row);
for (int i = 0; i < Controller.MAX_CONTROLLER_VALUES; i++) {
deviceText[i] = (TextView) deviceRow[i].findViewById(R.id.rowValue);
}
}
@Override
public void onResume() {
super.onResume();
updateLabelsAndVisibility();
updateClickable();
refreshData();
}
private void updateClickable() {
boolean fClickable = ((RAApplication) getActivity().getApplication()).raprefs.isCommunicateController();
View.OnLongClickListener l = null;
// Update the long clickablility and longclick listener based on the device we communicate
if (fClickable) {
l = this;
}
deviceText[Globals.AP_INDEX].setLongClickable(fClickable);
deviceText[Globals.AP_INDEX].setOnLongClickListener(l);
deviceText[Globals.DP_INDEX].setLongClickable(fClickable);
deviceText[Globals.DP_INDEX].setOnLongClickListener(l);
}
@Override
public void onPause() {
super.onPause();
}
@Override
public boolean onLongClick(View v) {
View parent = (View) v.getParent();
StatusFragment f = (StatusFragment) getParentFragment();
switch (parent.getId()) {
default:
return false;
case R.id.dp_row:
f.displayOverrideDialog(Globals.OVERRIDE_DAYLIGHT, dpValue);
break;
case R.id.ap_row:
f.displayOverrideDialog(Globals.OVERRIDE_ACTINIC, apValue);
break;
}
return true;
}
private void updateLabelsAndVisibility() {
Log.d(TAG, "updateLabelsAndVisibility");
RAApplication raApp = (RAApplication)getActivity().getApplication();
RAPreferences raPrefs = raApp.raprefs;
// TODO update for new water level and humidity labels
for(int i = 0; i < Controller.MAX_CONTROLLER_VALUES; i++) {
setLabel(i, raPrefs.getControllerLabel(i), getDeviceSubtitle(i));
setVisibility(i, raPrefs.getControllerVisibility(i));
}
}
private String getDeviceSubtitle(int index) {
int resId;
switch(index){
default:
case Globals.T1_INDEX:
resId = R.string.labelTemp1;
break;
case Globals.T2_INDEX:
resId = R.string.labelTemp2;
break;
case Globals.T3_INDEX:
resId = R.string.labelTemp3;
break;
case Globals.PH_INDEX:
resId = R.string.labelPH;
break;
case Globals.DP_INDEX:
resId = R.string.labelDP;
break;
case Globals.AP_INDEX:
resId = R.string.labelAP;
break;
case Globals.ATOLO_INDEX:
resId = R.string.labelAtoLow;
break;
case Globals.ATOHI_INDEX:
resId = R.string.labelAtoHigh;
break;
case Globals.SALINITY_INDEX:
resId = R.string.labelSalinity;
break;
case Globals.ORP_INDEX:
resId = R.string.labelORP;
break;
case Globals.PHE_INDEX:
resId = R.string.labelPHExp;
break;
case Globals.HUMIDITY_INDEX:
resId = R.string.labelHumidity;
break;
case Globals.WL_INDEX:
case Globals.WL1_INDEX:
case Globals.WL2_INDEX:
case Globals.WL3_INDEX:
case Globals.WL4_INDEX:
RAApplication raApp = (RAApplication)getActivity().getApplication();
return raApp.raprefs.getWaterLevelDefaultLabel(index - Globals.WL_INDEX);
}
return getString(resId);
}
private void setLabel(int device, String title, String subtitle) {
TextView tv;
tv = (TextView) deviceRow[device].findViewById(R.id.rowTitle);
tv.setText(title);
tv = (TextView) deviceRow[device].findViewById(R.id.rowSubTitle);
tv.setText(subtitle);
}
private void setVisibility(int device, boolean fVisible) {
int v;
if (fVisible) {
//Log.d(TAG, device + " visible");
v = View.VISIBLE;
} else {
//Log.d(TAG, device + " gone");
v = View.GONE;
}
deviceRow[device].setVisibility(v);
}
private String[] getValues(Cursor c) {
// FIXME switch to only setting the string to 1 or 0
// FIXME so the controllerpage can easily update the images
String l, h;
if (c.getShort(c.getColumnIndex(StatusTable.COL_ATOLO)) == 1)
l = getString(R.string.labelON); // ACTIVE, GREEN, ON
else
l = getString(R.string.labelOFF); // INACTIVE, RED, OFF
if (c.getShort(c.getColumnIndex(StatusTable.COL_ATOHI)) == 1)
h = getString(R.string.labelON); // ACTIVE, GREEN, ON
else
h = getString(R.string.labelOFF); // INACTIVE, RED, OFF
// update the ap & dp values
dpValue = c.getShort(c.getColumnIndex(StatusTable.COL_DP));
apValue = c.getShort(c.getColumnIndex(StatusTable.COL_AP));
return new String[]{c.getString(c.getColumnIndex(StatusTable.COL_T1)),
c.getString(c.getColumnIndex(StatusTable.COL_T2)),
c.getString(c.getColumnIndex(StatusTable.COL_T3)),
c.getString(c.getColumnIndex(StatusTable.COL_PH)),
Controller.getPWMDisplayValue(dpValue,
c.getShort(c.getColumnIndex(StatusTable.COL_PWMDO))),
Controller.getPWMDisplayValue(apValue,
c.getShort(c.getColumnIndex(StatusTable.COL_PWMAO))),
l, h,
c.getString(c.getColumnIndex(StatusTable.COL_SAL)) + " ppt",
c.getString(c.getColumnIndex(StatusTable.COL_ORP)) + " mV",
c.getString(c.getColumnIndex(StatusTable.COL_PHE)),
c.getString(c.getColumnIndex(StatusTable.COL_WL)) + "%",
c.getString(c.getColumnIndex(StatusTable.COL_WL1)) + "%",
c.getString(c.getColumnIndex(StatusTable.COL_WL2)) + "%",
c.getString(c.getColumnIndex(StatusTable.COL_WL3)) + "%",
c.getString(c.getColumnIndex(StatusTable.COL_WL4)) + "%",
c.getString(c.getColumnIndex(StatusTable.COL_HUM)) + "%"};
}
@Override
public void refreshData() {
Activity a = getActivity();
if ( a == null ) {
return;
}
// only update if the activity exists
StatusFragment f = ((StatusFragment) getParentFragment());
Cursor c = f.getLatestDataCursor();
String updateStatus;
String[] v;
if (c.moveToFirst()) {
updateStatus = c.getString(c.getColumnIndex(StatusTable.COL_LOGDATE));
v = getValues(c);
} else {
updateStatus = getString(R.string.messageNever);
v = f.getNeverValues(Controller.MAX_CONTROLLER_VALUES);
}
c.close();
f.updateDisplayText(updateStatus);
// set ATO LO and HI to icons instead of text
for (int i = 0; i < Controller.MAX_CONTROLLER_VALUES; i++ ) {
deviceText[i].setText(v[i]);
}
}
}