Eric Kok
11 years ago
15 changed files with 327 additions and 52 deletions
@ -0,0 +1,155 @@ |
|||||||
|
package org.transdroid.core.service; |
||||||
|
|
||||||
|
import org.androidannotations.annotations.Bean; |
||||||
|
import org.androidannotations.annotations.EService; |
||||||
|
import org.transdroid.core.app.settings.ApplicationSettings; |
||||||
|
import org.transdroid.core.app.settings.ServerSetting; |
||||||
|
import org.transdroid.core.gui.log.Log; |
||||||
|
import org.transdroid.core.widget.ListWidgetConfig; |
||||||
|
import org.transdroid.core.widget.ListWidgetProvider; |
||||||
|
import org.transdroid.core.widget.ListWidgetProvider_; |
||||||
|
import org.transdroid.daemon.IDaemonAdapter; |
||||||
|
import org.transdroid.daemon.task.DaemonTask; |
||||||
|
import org.transdroid.daemon.task.DaemonTaskResult; |
||||||
|
import org.transdroid.daemon.task.DaemonTaskSuccessResult; |
||||||
|
import org.transdroid.daemon.task.PauseAllTask; |
||||||
|
import org.transdroid.daemon.task.ResumeAllTask; |
||||||
|
import org.transdroid.daemon.task.SetTransferRatesTask; |
||||||
|
import org.transdroid.daemon.task.StartAllTask; |
||||||
|
import org.transdroid.daemon.task.StopAllTask; |
||||||
|
|
||||||
|
import android.app.IntentService; |
||||||
|
import android.appwidget.AppWidgetManager; |
||||||
|
import android.content.Intent; |
||||||
|
|
||||||
|
@EService |
||||||
|
public class ControlService extends IntentService { |
||||||
|
|
||||||
|
// NOTE: These are the same strings as Transdroid 1, for backwards compatibility
|
||||||
|
public static final String INTENT_SETTRANSFERRATES = "org.transdroid.control.SET_TRANSFER_RATES"; |
||||||
|
public static final String INTENT_PAUSEALL = "org.transdroid.control.PAUSE_ALL"; |
||||||
|
public static final String INTENT_RESUMEALL = "org.transdroid.control.RESUME_ALL"; |
||||||
|
public static final String INTENT_STARTALL = "org.transdroid.control.START_ALL"; |
||||||
|
public static final String INTENT_STOPALL = "org.transdroid.control.STOP_ALL"; |
||||||
|
public static final String EXTRA_DAEMON = "DAEMON"; |
||||||
|
public static final String EXTRA_UPLOAD_RATE = "UPLOAD_RATE"; |
||||||
|
public static final String EXTRA_DOWNLOAD_RATE = "DOWNLOAD_RATE"; |
||||||
|
|
||||||
|
@Bean |
||||||
|
protected ConnectivityHelper connectivityHelper; |
||||||
|
@Bean |
||||||
|
protected ApplicationSettings applicationSettings; |
||||||
|
|
||||||
|
public ControlService() { |
||||||
|
super("ControlService"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void onHandleIntent(Intent intent) { |
||||||
|
|
||||||
|
if (intent == null) |
||||||
|
return; |
||||||
|
|
||||||
|
// We should have been supplied either am EXTRA_DAEMON or an AppWidgetManager.EXTRA_APPWIDGET_ID
|
||||||
|
ServerSetting server = null; |
||||||
|
int appWidgetId = -1; |
||||||
|
if (intent.hasExtra(EXTRA_DAEMON)) { |
||||||
|
|
||||||
|
// See if the supplied server id is pointing to a valid server
|
||||||
|
int serverId = intent.getIntExtra(EXTRA_DAEMON, -1); |
||||||
|
if (serverId < 0 || serverId > applicationSettings.getMaxServer()) { |
||||||
|
// This server does not exist (any more) or no valid EXTRA_DAEMON value was supplied
|
||||||
|
Log.e(this, "The control service can be started with a DAEMON extra zero-based server id, but the" |
||||||
|
+ "supplied id was invalid or no longer points to an existing server."); |
||||||
|
return; |
||||||
|
} |
||||||
|
server = applicationSettings.getServerSetting(serverId); |
||||||
|
|
||||||
|
} else if (intent.hasExtra(AppWidgetManager.EXTRA_APPWIDGET_ID)) { |
||||||
|
|
||||||
|
// This was called directly form a home screen widget
|
||||||
|
appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1); |
||||||
|
ListWidgetConfig config = applicationSettings.getWidgetConfig(appWidgetId); |
||||||
|
if (config == null) { |
||||||
|
Log.e(this, |
||||||
|
"The control service can be started by a widget using the AppWidgetManager.EXTRA_APPWIDGET_ID, " |
||||||
|
+ "but the id that was supplied does not point to an existing home screen widget."); |
||||||
|
return; |
||||||
|
} |
||||||
|
int serverId = config.getServerId(); |
||||||
|
if (serverId < 0 || serverId > applicationSettings.getMaxServer()) { |
||||||
|
Log.e(this, "The home screen widget points to a server that no longer exists."); |
||||||
|
return; |
||||||
|
} |
||||||
|
server = applicationSettings.getServerSetting(serverId); |
||||||
|
|
||||||
|
} else { |
||||||
|
|
||||||
|
// Simply use the last-used server
|
||||||
|
server = applicationSettings.getLastUsedServer(); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
// Still no server? Then we don't have one specified yet
|
||||||
|
if (server == null) { |
||||||
|
Log.e(this, "The control service was called, but there are nog servers configured at all."); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
// See which action should be performed on the server
|
||||||
|
IDaemonAdapter adapter = server.createServerAdapter(connectivityHelper.getConnectedNetworkName(), this); |
||||||
|
DaemonTask task = null; |
||||||
|
if (intent.getAction().equals(INTENT_RESUMEALL)) { |
||||||
|
task = ResumeAllTask.create(adapter); |
||||||
|
} else if (intent.getAction().equals(INTENT_PAUSEALL)) { |
||||||
|
task = PauseAllTask.create(adapter); |
||||||
|
} else if (intent.getAction().equals(INTENT_STARTALL)) { |
||||||
|
task = StartAllTask.create(adapter, false); |
||||||
|
} else if (intent.getAction().equals(INTENT_STOPALL)) { |
||||||
|
task = StopAllTask.create(adapter); |
||||||
|
} else if (intent.getAction().equals(INTENT_SETTRANSFERRATES)) { |
||||||
|
// NOTE: If the upload or download rate was not specified, it will be reset on the server instead
|
||||||
|
int uploadRate = intent.getIntExtra(EXTRA_UPLOAD_RATE, -1); |
||||||
|
int downloadRate = intent.getIntExtra(EXTRA_DOWNLOAD_RATE, -1); |
||||||
|
task = SetTransferRatesTask.create(adapter, uploadRate == -1 ? null : uploadRate, downloadRate == -1 ? null |
||||||
|
: downloadRate); |
||||||
|
} |
||||||
|
|
||||||
|
// Execute the task, if we have one now
|
||||||
|
if (task == null) { |
||||||
|
Log.e(this, "The control service was started, but no (valid) action was specified, such as " |
||||||
|
+ "org.transdroid.control.START_ALL or org.transdroid.control.SET_TRANSFER_RATES"); |
||||||
|
return; |
||||||
|
} |
||||||
|
DaemonTaskResult result = task.execute(); |
||||||
|
if (result instanceof DaemonTaskSuccessResult) { |
||||||
|
Log.i(this, |
||||||
|
task.getMethod().name() + " was successfully executed on " + server.getHumanReadableIdentifier()); |
||||||
|
} else { |
||||||
|
Log.i(this, |
||||||
|
task.getMethod().name() + " was NOT succcessfully executed on " |
||||||
|
+ server.getHumanReadableIdentifier() + " (and we are NOT trying again)"); |
||||||
|
// No need to continue now
|
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
// The task was successful, so maybe we need to update the original calling widget now too
|
||||||
|
if (appWidgetId >= 0) { |
||||||
|
|
||||||
|
// Just wait for (max) two seconds, to give the server time to finish its last action
|
||||||
|
try { |
||||||
|
Thread.sleep(2000); |
||||||
|
} catch (Exception e) { |
||||||
|
} |
||||||
|
|
||||||
|
// Ask the app widget provider to update this specific widget
|
||||||
|
Intent update = new Intent(this, ListWidgetProvider_.class); |
||||||
|
update.setAction("android.appwidget.action.APPWIDGET_UPDATE"); |
||||||
|
update.putExtra(ListWidgetProvider.EXTRA_REFRESH, appWidgetId); |
||||||
|
update.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); |
||||||
|
sendBroadcast(update); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue