diff --git a/app/src/main/java/net/i2p/android/router/MainActivity.java b/app/src/main/java/net/i2p/android/router/MainActivity.java index d14a9da4e46b9e45539a9b210ed26755a1b6a231..973058f1af41420161c1a1e6204bb1f47e28d5ee 100644 --- a/app/src/main/java/net/i2p/android/router/MainActivity.java +++ b/app/src/main/java/net/i2p/android/router/MainActivity.java @@ -108,9 +108,9 @@ public class MainActivity extends I2PActivityBase implements if (mStateService.isStarted()) { // Update for the current state. Util.d("Fetching state."); - int curState = mStateService.getState(); + State curState = mStateService.getState(); Message msg = mHandler.obtainMessage(STATE_MSG); - msg.getData().putInt(MSG_DATA, curState); + msg.getData().putParcelable(MSG_DATA, curState); mHandler.sendMessage(msg); } else { Util.d("StateService not started yet"); @@ -206,9 +206,9 @@ public class MainActivity extends I2PActivityBase implements mStateService.registerCallback(mStateCallback); // Update for the current state. Util.d("Fetching state."); - int curState = mStateService.getState(); + State curState = mStateService.getState(); Message msg = mHandler.obtainMessage(STATE_MSG); - msg.getData().putInt(MSG_DATA, curState); + msg.getData().putParcelable(MSG_DATA, curState); mHandler.sendMessage(msg); } else { // Unbind @@ -239,9 +239,9 @@ public class MainActivity extends I2PActivityBase implements * NOT be running in our main thread like most other things -- so, * to update the UI, we need to use a Handler to hop over there. */ - public void stateChanged(int newState) throws RemoteException { + public void stateChanged(State newState) throws RemoteException { Message msg = mHandler.obtainMessage(STATE_MSG); - msg.getData().putInt(MSG_DATA, newState); + msg.getData().putParcelable(MSG_DATA, newState); mHandler.sendMessage(msg); } }; @@ -250,13 +250,13 @@ public class MainActivity extends I2PActivityBase implements private static final String MSG_DATA = "state"; private Handler mHandler = new Handler() { - private int lastRouterState = -1; + private State lastRouterState = null; @Override public void handleMessage(Message msg) { switch (msg.what) { case STATE_MSG: - int state = msg.getData().getInt(MSG_DATA); - if (lastRouterState == -1 || lastRouterState != state) { + State state = msg.getData().getParcelable(MSG_DATA); + if (lastRouterState == null || lastRouterState != state) { if (mMainFragment == null) mMainFragment = (MainFragment) getSupportFragmentManager().findFragmentById(R.id.main_fragment); if (mMainFragment != null) { diff --git a/app/src/main/java/net/i2p/android/router/MainFragment.java b/app/src/main/java/net/i2p/android/router/MainFragment.java index b96d9f133483c6ba6ea113a855e403b473e7887f..121778b9db30f43418314beb418957e6306d1305 100644 --- a/app/src/main/java/net/i2p/android/router/MainFragment.java +++ b/app/src/main/java/net/i2p/android/router/MainFragment.java @@ -235,7 +235,7 @@ public class MainFragment extends I2PFragmentBase { } } - public void updateState(int newState) { + public void updateState(State newState) { final ImageView lightImage = (ImageView) getView().findViewById(R.id.main_lights); if (newState == State.INIT || newState == State.STOPPED || diff --git a/app/src/main/java/net/i2p/android/router/service/RouterService.java b/app/src/main/java/net/i2p/android/router/service/RouterService.java index edb09eb0d8ec1ca38691370f79b75c6c3f5afc30..13a772ec4899ea1159670ddc48c0535b5f9154f1 100644 --- a/app/src/main/java/net/i2p/android/router/service/RouterService.java +++ b/app/src/main/java/net/i2p/android/router/service/RouterService.java @@ -37,7 +37,7 @@ public class RouterService extends Service { private RouterContext _context; private String _myDir; //private String _apkPath; - private int _state = State.INIT; + private State _state = State.INIT; private Thread _starterThread; private StatusBar _statusBar; private Notifications _notif; @@ -63,7 +63,7 @@ public class RouterService extends Service { @Override public void onCreate() { mStartCalled = false; - int lastState = getSavedState(); + State lastState = getSavedState(); setState(State.INIT); Util.d(this + " onCreate called" + " Saved state is: " + lastState @@ -445,7 +445,7 @@ public class RouterService extends Service { return mStartCalled; } - public int getState() throws RemoteException { + public State getState() throws RemoteException { return _state; } }; @@ -481,8 +481,8 @@ public class RouterService extends Service { /** * debug */ - public int getState() { - return _state; + public String getState() { + return _state.toString(); } public boolean canManualStop() { @@ -584,7 +584,7 @@ public class RouterService extends Service { public void handleMessage(Message msg) { switch (msg.what) { case STATE_MSG: - final int state = _state; + final State state = _state; // Broadcast to all clients the new state. final int N = mStateCallbacks.beginBroadcast(); for (int i = 0; i < N; i++) { @@ -646,13 +646,13 @@ public class RouterService extends Service { */ private class Stopper implements Runnable { - private final int nextState; - private final int stopState; + private final State nextState; + private final State stopState; /** * call holding statelock */ - public Stopper(int next, int stop) { + public Stopper(State next, State stop) { nextState = next; stopState = stop; setState(next); @@ -764,17 +764,17 @@ public class RouterService extends Service { } } - private int getSavedState() { + private State getSavedState() { SharedPreferences prefs = getSharedPreferences(SHARED_PREFS, 0); + String stateString = prefs.getString(LAST_STATE, State.INIT.toString()); try { - return prefs.getInt(LAST_STATE, State.INIT); - } catch (ClassCastException e) { - // Only a problem for first run after upgrade from old Enum state + return State.valueOf(stateString); + } catch (IllegalArgumentException e) { return State.INIT; } } - private void setState(int s) { + private void setState(State s) { _state = s; saveState(); mHandler.sendEmptyMessage(STATE_MSG); @@ -786,7 +786,7 @@ public class RouterService extends Service { private boolean saveState() { SharedPreferences prefs = getSharedPreferences(SHARED_PREFS, 0); SharedPreferences.Editor edit = prefs.edit(); - edit.putInt(LAST_STATE, _state); + edit.putString(LAST_STATE, _state.toString()); return edit.commit(); } } diff --git a/client/src/main/aidl/net/i2p/android/router/service/IRouterState.aidl b/client/src/main/aidl/net/i2p/android/router/service/IRouterState.aidl index 95cf3d636a1f823362fb96f270241bc57fd497ad..92bc3f3219255ae041d25f48a8ed05339ea4c5d4 100644 --- a/client/src/main/aidl/net/i2p/android/router/service/IRouterState.aidl +++ b/client/src/main/aidl/net/i2p/android/router/service/IRouterState.aidl @@ -1,5 +1,6 @@ package net.i2p.android.router.service; +import net.i2p.android.router.service.State; import net.i2p.android.router.service.IRouterStateCallback; /** @@ -28,6 +29,6 @@ interface IRouterState { /** * Get the state of the I2P router **/ - int getState(); + State getState(); } diff --git a/client/src/main/aidl/net/i2p/android/router/service/IRouterStateCallback.aidl b/client/src/main/aidl/net/i2p/android/router/service/IRouterStateCallback.aidl index 20221b4c3b6a6cf3b9479dd1254c01c7bdbb89da..5158ce44ebcc511f753a0554f504ac12ba9ab8b3 100644 --- a/client/src/main/aidl/net/i2p/android/router/service/IRouterStateCallback.aidl +++ b/client/src/main/aidl/net/i2p/android/router/service/IRouterStateCallback.aidl @@ -1,5 +1,7 @@ package net.i2p.android.router.service; +import net.i2p.android.router.service.State; + /** * Callback interface used to send synchronous notifications of the current * RouterService state back to registered clients. Note that this is a @@ -9,5 +11,5 @@ oneway interface IRouterStateCallback { /** * Called when the state of the I2P router changes */ - void stateChanged(int newState); + void stateChanged(in State newState); } diff --git a/client/src/main/aidl/net/i2p/android/router/service/State.aidl b/client/src/main/aidl/net/i2p/android/router/service/State.aidl new file mode 100644 index 0000000000000000000000000000000000000000..193b3574951a0714aac7678c8b45548fc4d9a222 --- /dev/null +++ b/client/src/main/aidl/net/i2p/android/router/service/State.aidl @@ -0,0 +1,3 @@ +package net.i2p.android.router.service; + +parcelable State; diff --git a/client/src/main/java/net/i2p/android/router/service/State.java b/client/src/main/java/net/i2p/android/router/service/State.java index 59756435884c15a83ec49b0b3e932efd177c43de..46916596634ff6464d845aaa6d6fb19cbda91652 100644 --- a/client/src/main/java/net/i2p/android/router/service/State.java +++ b/client/src/main/java/net/i2p/android/router/service/State.java @@ -1,30 +1,45 @@ package net.i2p.android.router.service; +import android.os.Parcel; +import android.os.Parcelable; + /** - * Extracted from RouterService because Enums should be avoided on Android. - * <p/> - * https://developer.android.com/training/articles/memory.html#Overhead + * Extracted from RouterService. * * @author str4d * @since 0.9.14 */ -public class State { +public enum State implements Parcelable { // These states persist even if we died... Yuck, it causes issues. - public static final int INIT = 0; - public static final int WAITING = 1; - public static final int STARTING = 2; - public static final int RUNNING = 3; - public static final int ACTIVE = 4; + INIT, WAITING, STARTING, RUNNING, ACTIVE, // unplanned (router stopped itself), next: killSelf() - public static final int STOPPING = 5; - public static final int STOPPED = 6; + STOPPING, STOPPED, // button, don't kill service when stopped, stay in MANUAL_STOPPED - public static final int MANUAL_STOPPING = 7; - public static final int MANUAL_STOPPED = 8; + MANUAL_STOPPING, MANUAL_STOPPED, // button, DO kill service when stopped, next: killSelf() - public static final int MANUAL_QUITTING = 9; - public static final int MANUAL_QUITTED = 10; + MANUAL_QUITTING, MANUAL_QUITTED, // Stopped by listener (no network), next: WAITING (spin waiting for network) - public static final int NETWORK_STOPPING = 11; - public static final int NETWORK_STOPPED = 12; + NETWORK_STOPPING, NETWORK_STOPPED; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(final Parcel dest, final int flags) { + dest.writeString(name()); + } + + public static final Creator<State> CREATOR = new Creator<State>() { + @Override + public State createFromParcel(final Parcel source) { + return State.valueOf(source.readString()); + } + + @Override + public State[] newArray(final int size) { + return new State[size]; + } + }; }