package com.openvehicles.OVMS.api; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.text.TextUtils; import android.util.Log; import android.widget.Toast; import com.openvehicles.OVMS.R; import com.openvehicles.OVMS.api.ApiTask.OnUpdateStatusListener; import com.openvehicles.OVMS.entities.CarData; import com.openvehicles.OVMS.utils.CarsStorage; public class ApiService extends Service implements OnUpdateStatusListener { private static final String TAG = "ApiService"; private final IBinder mBinder = new ApiBinder(); private volatile CarData mCarData; private ApiTask mApiTask; private OnResultCommandListener mOnResultCommandListener; @Override public IBinder onBind(Intent intent) { return mBinder; } @Override public void onCreate() { super.onCreate(); changeCar(CarsStorage.get().getSelectedCarData()); } @Override public void onDestroy() { try { if (mApiTask != null) { Log.v(TAG, "Shutting down TCP connection"); mApiTask.connClose(); mApiTask.cancel(true); mApiTask = null; } } catch (Exception e) { Log.e(TAG, "ERROR stop ApiTask", e); } super.onDestroy(); } public void changeCar(CarData pCarData) { Log.i(TAG, "Changed car to: " + pCarData.sel_vehicleid); mCarData = pCarData; // kill previous connection if (mApiTask != null) { Log.v("TCP", "Shutting down previous TCP connection (ChangeCar())"); mApiTask.connClose(); mApiTask.cancel(true); } // start new connection // reset the paranoid mode flag in car data // it will be set again when the TCP task detects paranoid mode messages mCarData.sel_paranoid = false; mApiTask = new ApiTask(mCarData, this); Log.v(TAG, "Starting TCP Connection (changeCar())"); mApiTask.execute(); } public void sendCommand(int pResIdMessage, String pCommand, OnResultCommandListener pOnResultCommandListener) { sendCommand(getString(pResIdMessage), pCommand, pOnResultCommandListener); } public void sendCommand(String pMessage, String pCommand, OnResultCommandListener pOnResultCommandListener) { if (mApiTask == null) return; mOnResultCommandListener = pOnResultCommandListener; mApiTask.sendCommand(String.format("MP-0 C%s", pCommand)); Toast.makeText(this, pMessage, Toast.LENGTH_SHORT).show(); } public boolean sendCommand(String pCommand, OnResultCommandListener pOnResultCommandListener) { if (mApiTask == null || TextUtils.isEmpty(pCommand)) return false; mOnResultCommandListener = pOnResultCommandListener; return mApiTask.sendCommand(pCommand.startsWith("MP-0") ? pCommand : String.format("MP-0 C%s", pCommand)); } public void cancelCommand() { mOnResultCommandListener = null; } @Override public void onUpdateStatus() { ApiObservable.get().notifyUpdate(mCarData); } @Override public void onServerSocketError(Throwable e) { Intent intent = new Intent(getPackageName() + ".ApiEvent"); intent.putExtra("onServerSocketError", e); intent.putExtra("message", getString(mApiTask.isLoggedIn() ? R.string.err_connection_lost : R.string.err_check_following)); sendBroadcast(intent); } @Override public void onResultCommand(String pCmd) { if (TextUtils.isEmpty(pCmd)) return; String[] data = pCmd.split(",\\s*"); if (mOnResultCommandListener != null) { mOnResultCommandListener.onResultCommand(data); return; } } @Override public void onLoginBegin() { Log.d(TAG, "onLoginBegin"); Intent intent = new Intent(getPackageName() + ".ApiEvent"); intent.putExtra("onLoginBegin", true); sendBroadcast(intent); } @Override public void onLoginComplete() { Log.d(TAG, "onLoginComplete"); //Intent intent = new Intent(getPackageName() + ".ApiEvent"); //intent.putExtra("onLoginComplete", true); //sendBroadcast(intent); } public boolean isLoggedIn() { return mApiTask.isLoggedIn(); } public CarData getCarData() { return mCarData; } public CarData getLoggedInCarData() { return mApiTask.isLoggedIn() ? mCarData : null; } public class ApiBinder extends Binder { public ApiService getService() { return ApiService.this; } } }