package com.openvehicles.OVMS.ui.settings;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.openvehicles.OVMS.R;
import com.openvehicles.OVMS.api.ApiService;
import com.openvehicles.OVMS.api.OnResultCommandListener;
import com.openvehicles.OVMS.entities.CarData;
import com.openvehicles.OVMS.ui.BaseFragment;
import com.openvehicles.OVMS.ui.utils.Ui;
import com.openvehicles.OVMS.utils.CarsStorage;
public class ControlParametersFragment extends BaseFragment implements OnResultCommandListener, OnItemClickListener {
private ControlParametersAdapter mAdapter;
private ListView mListView;
private int mEditPosition;
private CarData mCarData;
private ApiService mService;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// get data of car to edit:
mEditPosition = getArguments().getInt("position", -1);
if (mEditPosition >= 0) {
mCarData = CarsStorage.get().getStoredCars().get(mEditPosition);
}
mListView = new ListView(container.getContext());
mListView.setOnItemClickListener(this);
createProgressOverlay(inflater, container, false);
return mListView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
SherlockFragmentActivity activity = getSherlockActivity();
activity.setTitle(R.string.Parameters);
}
@Override
public void onServiceAvailable(ApiService pService) {
mService = pService;
}
@Override
public void update(CarData pCarData) {
requestData();
}
private void requestData() {
// only start request once:
if (mAdapter != null)
return;
// create storage adapter:
mAdapter = new ControlParametersAdapter();
mListView.setAdapter(mAdapter);
// send request:
showProgressOverlay();
mService.sendCommand("3", this);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Context context = parent.getContext();
final int fn = position;
final String val = (String)mAdapter.getItem(position);
boolean isPasswd = position == ControlParametersAdapter.PARAM_REGPASS ||
position == ControlParametersAdapter.PARAM_NETPASS1 ||
position == ControlParametersAdapter.PARAM_GPRSPASS;
// Check content type:
boolean isBinary = false;
if (mCarData.car_type.equals("RT")
&& position >= ControlParametersAdapter.PARAM_PROFILE1
&& position <= ControlParametersAdapter.PARAM_PROFILE3+1) {
isBinary = true;
} else if (position >= ControlParametersAdapter.PARAM_ACC1
&& position <= ControlParametersAdapter.PARAM_ACC4) {
isBinary = true;
}
if (isBinary) {
Toast.makeText(getActivity(), getString(R.string.err_param_not_editable),
Toast.LENGTH_SHORT).show();
} else {
Ui.showEditDialog(context, mAdapter.getTitleRow(context, position), val,
R.string.Set, isPasswd, new Ui.OnChangeListener<String>() {
@Override
public void onAction(String pData) {
if (pData.equals(val)) return;
sendCommand(String.format("4,%d,%s", fn, pData), ControlParametersFragment.this);
mAdapter.setParam(fn, pData);
}
});
}
}
@Override
public void onResultCommand(String[] result) {
if (result.length <= 1) {
return;
}
int command = Integer.parseInt(result[0]);
int resCode = Integer.parseInt(result[1]);
if (command == 4) {
cancelCommand();
switch (resCode) {
case 0:
Toast.makeText(getActivity(), getString(R.string.msg_ok),
Toast.LENGTH_SHORT).show();
break;
case 1: // failed
Toast.makeText(getActivity(), getString(R.string.err_failed, result[2]),
Toast.LENGTH_SHORT).show();
break;
case 2: // unsupported
Toast.makeText(getActivity(), getString(R.string.err_unsupported_operation),
Toast.LENGTH_SHORT).show();
break;
case 3: // unimplemented
Toast.makeText(getActivity(), getString(R.string.err_unimplemented_operation),
Toast.LENGTH_SHORT).show();
break;
}
return;
}
if (command != 3) return; // Not for us
switch (resCode) {
case 0:
if (result.length >= 4) {
int fn = Integer.parseInt(result[2]);
int fm = Integer.parseInt(result[3]);
String fv = (result.length > 4) ? result[4] : "";
stepProgressOverlay(fn + 1, fm);
if (fn < ControlParametersAdapter.PARAM_FEATURE_S) {
mAdapter.setParam(fn, fv);
}
if (fn == (fm - 1)) {
cancelCommand();
}
}
break;
case 1: // failed
Toast.makeText(getActivity(), getString(R.string.err_failed, result[2]),
Toast.LENGTH_SHORT).show();
cancelCommand();
break;
case 2: // unsupported
Toast.makeText(getActivity(), getString(R.string.err_unsupported_operation),
Toast.LENGTH_SHORT).show();
cancelCommand();
break;
case 3: // unimplemented
Toast.makeText(getActivity(), getString(R.string.err_unimplemented_operation),
Toast.LENGTH_SHORT).show();
cancelCommand();
}
}
private class ControlParametersAdapter extends BaseAdapter {
// private static final int PARAM_MAX = 32;
// private static final int PARAM_MAX_LENGTH = 32;
// private static final int PARAM_BANKSIZE = 8;
// Standard:
static final int PARAM_REGPHONE = 0x00;
static final int PARAM_REGPASS = 0x01;
static final int PARAM_MILESKM = 0x02;
static final int PARAM_NOTIFIES = 0x03;
static final int PARAM_SERVERIP = 0x04;
static final int PARAM_GPRSAPN = 0x05;
static final int PARAM_GPRSUSER = 0x06;
static final int PARAM_GPRSPASS = 0x07;
static final int PARAM_MYID = 0x08;
static final int PARAM_NETPASS1 = 0x09;
static final int PARAM_PARANOID = 0x0A;
static final int PARAM_S_GROUP1 = 0x0B;
static final int PARAM_S_GROUP2 = 0x0C;
static final int PARAM_GSMLOCK = 0x0D;
static final int PARAM_VEHICLETYPE = 0x0E;
static final int PARAM_COOLDOWN = 0x0F;
static final int PARAM_ACC1 = 0x10; // base64
static final int PARAM_ACC2 = 0x11; // base64
static final int PARAM_ACC3 = 0x12; // base64
static final int PARAM_ACC4 = 0x13; // base64
static final int PARAM_TIMEZONE = 0x17;
// Renault Twizy:
static final int PARAM_PROFILE = 0x0F; // current cfg profile nr (0..3)
static final int PARAM_PROFILE1 = 0x10; // custom profile #1 (binary, 2 slots)
static final int PARAM_PROFILE2 = 0x12; // custom profile #2 (binary, 2 slots)
static final int PARAM_PROFILE3 = 0x14; // custom profile #3 (binary, 2 slots)
public static final int PARAM_FEATURE_S = 0x18;
// private static final int PARAM_FEATURE8 = 0x18;
// private static final int PARAM_FEATURE9 = 0x19;
// private static final int PARAM_FEATURE10 = 0x1A;
// private static final int PARAM_FEATURE11 = 0x1B;
// private static final int PARAM_FEATURE12 = 0x1C;
// private static final int PARAM_FEATURE13 = 0x1D;
// private static final int PARAM_FEATURE14 = 0x1E;
// private static final int PARAM_FEATURE15 = 0x1F;
private LayoutInflater mInflater;
private final String[] mParams = new String[PARAM_FEATURE_S];
@Override
public int getCount() {
return PARAM_FEATURE_S;
}
@Override
public Object getItem(int position) {
return mParams[position];
}
@Override
public long getItemId(int position) {
return position;
}
public void setParam(int key, String val) {
if (key > (PARAM_FEATURE_S-1)) return;
mParams[key] = val;
notifyDataSetChanged();
}
public String getTitleRow(Context context, int position) {
// Renault Twizy:
if (mCarData.car_type.equals("RT")) {
switch (position) {
case PARAM_PROFILE:
return context.getString(R.string.lb_cp_rt_profile, position);
case PARAM_PROFILE1:
case PARAM_PROFILE1+1:
return context.getString(R.string.lb_cp_rt_profile1, position);
case PARAM_PROFILE2:
case PARAM_PROFILE2+1:
return context.getString(R.string.lb_cp_rt_profile2, position);
case PARAM_PROFILE3:
case PARAM_PROFILE3+1:
return context.getString(R.string.lb_cp_rt_profile3, position);
default:
// fall through to standard
}
}
// Standard:
switch (position) {
case PARAM_REGPHONE:
return context.getString(R.string.lb_cp_registered_telephone, position);
case PARAM_REGPASS:
return context.getString(R.string.lb_cp_module_password, position);
case PARAM_MILESKM:
return context.getString(R.string.lb_cp_miles_km, position);
case PARAM_NOTIFIES:
return context.getString(R.string.lb_cp_notifications, position);
case PARAM_SERVERIP:
return context.getString(R.string.lb_cp_ovms_server_ip, position);
case PARAM_GPRSAPN:
return context.getString(R.string.lb_cp_cellular_network_apn, position);
case PARAM_GPRSUSER:
return context.getString(R.string.lb_cp_cellular_network_user, position);
case PARAM_GPRSPASS:
return context.getString(R.string.lb_cp_cellular_network_password, position);
case PARAM_MYID:
return context.getString(R.string.lb_cp_vehicle_id, position);
case PARAM_NETPASS1:
return context.getString(R.string.lb_cp_server_password, position);
case PARAM_PARANOID:
return context.getString(R.string.lb_cp_paranoid_mode, position);
case PARAM_S_GROUP1:
return context.getString(R.string.lb_cp_social_group_1, position);
case PARAM_S_GROUP2:
return context.getString(R.string.lb_cp_social_group_2, position);
case PARAM_GSMLOCK:
return context.getString(R.string.lb_cp_gsmlock, position);
case PARAM_VEHICLETYPE:
return context.getString(R.string.lb_cp_vehicle_type, position);
case PARAM_COOLDOWN:
return context.getString(R.string.lb_cp_cooldown, position);
case PARAM_TIMEZONE:
return context.getString(R.string.lb_cp_timezone, position);
case PARAM_ACC1:
return context.getString(R.string.lb_cp_acc1, position);
case PARAM_ACC2:
return context.getString(R.string.lb_cp_acc2, position);
case PARAM_ACC3:
return context.getString(R.string.lb_cp_acc3, position);
case PARAM_ACC4:
return context.getString(R.string.lb_cp_acc4, position);
default:
return String.format("#%d:", position);
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Context context = parent.getContext();
if (convertView == null) {
if (mInflater == null) {
mInflater = LayoutInflater.from(context);
}
convertView = mInflater.inflate(R.layout.item_keyvalue, null);
}
TextView tv = (TextView) convertView.findViewById(android.R.id.text1);
tv.setText(getTitleRow(context, position));
tv = (TextView) convertView.findViewById(android.R.id.text2);
tv.setText(mParams[position]);
return convertView;
}
}
}