diff --git a/android/BOINC/AndroidManifest.xml b/android/BOINC/AndroidManifest.xml index 802f70ad6d..9da1a88186 100755 --- a/android/BOINC/AndroidManifest.xml +++ b/android/BOINC/AndroidManifest.xml @@ -36,7 +36,6 @@ android:screenOrientation="portrait" > - @@ -52,6 +51,9 @@ + diff --git a/android/BOINC/src/edu/berkeley/boinc/client/ClientRemoteService.java b/android/BOINC/src/edu/berkeley/boinc/client/ClientRemoteService.java index 8372d509f5..6eb931b38d 100755 --- a/android/BOINC/src/edu/berkeley/boinc/client/ClientRemoteService.java +++ b/android/BOINC/src/edu/berkeley/boinc/client/ClientRemoteService.java @@ -1,8 +1,10 @@ package edu.berkeley.boinc.client; import edu.berkeley.boinc.rpc.AccountOut; +import edu.berkeley.boinc.rpc.ProjectAttachReply; import android.app.Service; import android.content.ComponentName; +import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; @@ -14,7 +16,7 @@ public class ClientRemoteService extends Service { private final String TAG = "ClientRemoteService"; private Monitor monitor; - private Boolean mIsBound = false; + private Boolean mIsMonitorBound = false; @Override public void onCreate() { @@ -35,17 +37,29 @@ public class ClientRemoteService extends Service { private final IClientRemoteService.Stub mBinder = new IClientRemoteService.Stub() { + @Override + public boolean isReady() throws RemoteException { + return mIsMonitorBound; + } + @Override public boolean attachProject(String packageName, String url, String id, String pwd) throws RemoteException { // TODO store packageName in AppPreferences - if(mIsBound) { + if(mIsMonitorBound) { return monitor.attachProject(url, id, pwd); } else {Log.e(TAG, "could not attach project, service not bound!"); return false;} } + @Override + public boolean checkProjectAttached(String url) throws RemoteException { + if(mIsMonitorBound) { + return monitor.checkProjectAttached(url); + } else {Log.e(TAG, "could not attach project, service not bound!"); return false;} + } + @Override public AccountOut verifyCredentials(String url, String id, String pwd) throws RemoteException { - if(mIsBound) { + if(mIsMonitorBound) { return monitor.lookupCredentials(url, id, pwd); } else {Log.e(TAG, "could not verify credentials, service not bound!"); return null;} } @@ -53,21 +67,21 @@ public class ClientRemoteService extends Service { @Override public boolean detachProject(String packageName, String url) throws RemoteException { // TODO remove packageName in AppPreferences - if(mIsBound) { + if(mIsMonitorBound) { return monitor.detachProject(url); } else {Log.e(TAG, "could not detach project, service not bound!"); return false;} } @Override public AccountOut createAccount(String url, String email, String userName, String pwd, String teamName) throws RemoteException { - if(mIsBound) { + if(mIsMonitorBound) { return monitor.createAccount(url, email, userName, pwd, teamName); } else {Log.e(TAG, "could not create account, service not bound!"); return null;} } @Override public String getRpcAuthToken() throws RemoteException { - if(mIsBound) { + if(mIsMonitorBound) { return monitor.readAuthToken(); } else {Log.e(TAG, "could not read auth token, service not bound!"); return null;} } @@ -81,25 +95,26 @@ public class ClientRemoteService extends Service { public void onServiceConnected(ComponentName className, IBinder service) { Log.d(TAG,"onServiceConnected - local Monitor service bound."); monitor = ((Monitor.LocalBinder)service).getService(); - mIsBound = true; + mIsMonitorBound = true; } public void onServiceDisconnected(ComponentName className) { monitor = null; - mIsBound = false; + mIsMonitorBound = false; } }; private void doBindService() { - if(!mIsBound) { - getApplicationContext().bindService(new Intent(this, Monitor.class), mConnection, 0); + if(!mIsMonitorBound) { + Log.d(TAG, "binding local Monitor service..."); + getApplicationContext().bindService(new Intent(this, Monitor.class), mConnection, Context.BIND_AUTO_CREATE); } } private void doUnbindService() { - if (mIsBound) { + if(mIsMonitorBound) { getApplicationContext().unbindService(mConnection); - mIsBound = false; + mIsMonitorBound = false; } } diff --git a/android/BOINC/src/edu/berkeley/boinc/client/IClientRemoteService.aidl b/android/BOINC/src/edu/berkeley/boinc/client/IClientRemoteService.aidl index 2c8fabc00c..949a9f6e21 100755 --- a/android/BOINC/src/edu/berkeley/boinc/client/IClientRemoteService.aidl +++ b/android/BOINC/src/edu/berkeley/boinc/client/IClientRemoteService.aidl @@ -30,6 +30,10 @@ import edu.berkeley.boinc.rpc.AccountOut; interface IClientRemoteService { + /* Checks whether interface recipient is ready to serve commands. + * returns success*/ + boolean isReady(); + //== project management == /* Attach project to BOINC application. * packageName: package name of Android application causing this attach @@ -39,6 +43,11 @@ interface IClientRemoteService { * returns success*/ boolean attachProject(in String packageName, in String url, in String id, in String authenticator); + /* Check whether given project URL is attached to BOINC + * url: project URL + * returns success*/ + boolean checkProjectAttached(in String url); + /* Verifies given credentials to project account * url: project URL * id: project login identifier, i.e. email address diff --git a/android/BOINC/src/edu/berkeley/boinc/client/Monitor.java b/android/BOINC/src/edu/berkeley/boinc/client/Monitor.java index d8a356e4b7..34d146e721 100755 --- a/android/BOINC/src/edu/berkeley/boinc/client/Monitor.java +++ b/android/BOINC/src/edu/berkeley/boinc/client/Monitor.java @@ -108,12 +108,28 @@ public class Monitor extends Service{ return mBinder; } + //onCreate is life-cycle method of service. regardless of bound or started service, this method gets called once upon first creation. @Override public void onCreate() { Log.d(TAG,"onCreate()"); + + //populate attributes with XML resource values clientName = getString(R.string.client_name); authFileName = getString(R.string.auth_file_name); clientPath = getString(R.string.client_path); + + // initialize singleton helper classes and provide application context + getClientStatus().setCtx(this); + getAppPrefs().readPrefs(this); + + if(!started) { + started = true; + (new ClientMonitorAsync()).execute(new Integer[0]); //start monitor in new thread + Log.d(TAG, "asynchronous monitor started!"); + } + else { + Log.d(TAG, "asynchronous monitor NOT started!"); + } } @Override @@ -123,37 +139,12 @@ public class Monitor extends Service{ Boolean autostart = false; try { - autostart = intent.getBooleanExtra("autostart", false); //if true, received intent is for autostart and got fired by the BootReceiver on start up. - } - catch (NullPointerException e) { // occurs, when onStartCommand is called with a null intent. Occurs on re-start, if START_STICKY is used. - Log.d(TAG,"NullPointerException, intent flags: " + flags); - } - - getAppPrefs().readPrefs(this); //create singleton AppPreferences prefs with current application context - - /* - * start monitor if either - * the user's preference autostart is enabled and the intent carries the autostart flag (intent from BootReceiver) - * or it is not an autostart-intent (not from BootReceiver) and the service hasnt been started yet - */ - Log.d(TAG, "values: intent-autostart " + autostart + " - prefs-autostart " + appPrefs.getAutostart() + " - started " + started); - if((!autostart && !started) || (autostart && appPrefs.getAutostart())) { - started = true; - Log.d(TAG, "starting service sticky & setup start of monitor..."); - - getClientStatus().setCtx(this); - - if(autostart) { - // show notification about started service in notification panel - showNotification(); - } - - (new ClientMonitorAsync()).execute(new Integer[0]); //start monitor in new thread - - Log.d(TAG, "asynchronous monitor started!"); - } - else { - Log.d(TAG, "asynchronous monitor NOT started!"); + autostart = intent.getBooleanExtra("autostart", false); + } catch (Exception e) {} + if(autostart) { + // show notification about started service in notification panel + // only necessary + showNotification(); } /* * START_NOT_STICKY is now used and replaced START_STICKY in previous implementations. @@ -290,6 +281,11 @@ public class Monitor extends Service{ return success; } + public Boolean checkProjectAttached(String url) { + //TODO + return false; + } + public AccountOut lookupCredentials(String url, String id, String pwd) { Integer retval = -1; AccountOut auth = null; diff --git a/android/BOINC/src/edu/berkeley/boinc/receiver/BootReceiver.java b/android/BOINC/src/edu/berkeley/boinc/receiver/BootReceiver.java index a2937ff064..771039b339 100755 --- a/android/BOINC/src/edu/berkeley/boinc/receiver/BootReceiver.java +++ b/android/BOINC/src/edu/berkeley/boinc/receiver/BootReceiver.java @@ -18,20 +18,32 @@ ******************************************************************************/ package edu.berkeley.boinc.receiver; +import edu.berkeley.boinc.AppPreferences; import edu.berkeley.boinc.client.Monitor; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.util.Log; public class BootReceiver extends BroadcastReceiver { - + + private final String TAG = "BootReceiver"; + @Override public void onReceive(Context context, Intent intent) { - // check whether preference "autostart" is enabled is done within the service - Intent startServiceIntent = new Intent(context, Monitor.class); - startServiceIntent.putExtra("autostart", true); - context.startService(startServiceIntent); + //TODO untested! + AppPreferences prefs = new AppPreferences(); + prefs.readPrefs(context); + if(prefs.getAutostart()) { + Log.d(TAG,"autostart enabled, start Monitor..."); + Intent startServiceIntent = new Intent(context, Monitor.class); + startServiceIntent.putExtra("autostart", true); + context.startService(startServiceIntent); + } else { + // do nothing + Log.d(TAG,"autostart disabeld"); + } } }