tenfourfox/mobile/android/base/java/org/mozilla/gecko/GeckoService.java
Cameron Kaiser c9b2922b70 hello FPR
2017-04-19 00:56:45 -07:00

128 lines
4.3 KiB
Java

/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*-
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.gecko;
import android.app.AlarmManager;
import android.app.IntentService;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import org.mozilla.gecko.util.NativeEventListener;
import org.mozilla.gecko.util.NativeJSObject;
import org.mozilla.gecko.util.EventCallback;
public class GeckoService extends IntentService {
private static final String LOGTAG = "GeckoService";
private static final boolean DEBUG = false;
private static class EventListener implements NativeEventListener {
private PendingIntent getIntentForAction(final Context context, final String action) {
final Intent intent = new Intent(action, /* uri */ null, context, GeckoService.class);
return PendingIntent.getService(context, /* requestCode */ 0, intent,
PendingIntent.FLAG_CANCEL_CURRENT);
}
@Override // NativeEventListener
public void handleMessage(final String event,
final NativeJSObject message,
final EventCallback callback) {
final Context context = GeckoAppShell.getApplicationContext();
switch (event) {
case "Gecko:ScheduleRun":
if (DEBUG) {
Log.d(LOGTAG, "Scheduling " + message.getString("action") +
" @ " + message.getInt("interval") + "ms");
}
final AlarmManager am = (AlarmManager)
context.getSystemService(Context.ALARM_SERVICE);
// Cancel any previous alarm and schedule a new one.
am.setInexactRepeating(AlarmManager.ELAPSED_REALTIME,
message.getInt("trigger"),
message.getInt("interval"),
getIntentForAction(context, message.getString("action")));
break;
default:
throw new UnsupportedOperationException(event);
}
}
}
private static final EventListener EVENT_LISTENER = new EventListener();
public GeckoService() {
super("GeckoService");
}
public static void register() {
if (DEBUG) {
Log.d(LOGTAG, "Registered listener");
}
EventDispatcher.getInstance().registerGeckoThreadListener(EVENT_LISTENER,
"Gecko:ScheduleRun");
}
public static void unregister() {
if (DEBUG) {
Log.d(LOGTAG, "Unregistered listener");
}
EventDispatcher.getInstance().unregisterGeckoThreadListener(EVENT_LISTENER,
"Gecko:ScheduleRun");
}
@Override // Service
public void onCreate() {
GeckoAppShell.ensureCrashHandling();
GeckoAppShell.setApplicationContext(getApplicationContext());
super.onCreate();
if (DEBUG) {
Log.d(LOGTAG, "Created");
}
GeckoThread.ensureInit(/* args */ null, /* action */ null);
GeckoThread.launch();
}
@Override // Service
public void onDestroy() {
// TODO: Make sure Gecko is in a somewhat idle state
// because our process could be killed at anytime.
if (DEBUG) {
Log.d(LOGTAG, "Destroyed");
}
super.onDestroy();
}
@Override // IntentService
protected void onHandleIntent(final Intent intent) {
if (intent == null) {
return;
}
// We are on the intent service worker thread.
if (DEBUG) {
Log.d(LOGTAG, "Handling " + intent.getAction());
}
switch (intent.getAction()) {
case "update-addons":
// Run the add-on update service. Because the service is automatically invoked
// when loading Gecko, we don't have to do anything else here.
break;
default:
Log.w(LOGTAG, "Unknown request: " + intent);
}
}
}