diff --git a/app/src/main/java/eu/faircode/email/ActivityMain.java b/app/src/main/java/eu/faircode/email/ActivityMain.java index f487edcb0c..a9cbbbb327 100644 --- a/app/src/main/java/eu/faircode/email/ActivityMain.java +++ b/app/src/main/java/eu/faircode/email/ActivityMain.java @@ -58,7 +58,7 @@ public class ActivityMain extends AppCompatActivity implements FragmentManager.O startActivity(new Intent(ActivityMain.this, ActivitySetup.class)); else { startActivity(new Intent(ActivityMain.this, ActivityView.class)); - ServiceSynchronize.init(ActivityMain.this); + ServiceSynchronize.init(ActivityMain.this, false); } finish(); } diff --git a/app/src/main/java/eu/faircode/email/Helper.java b/app/src/main/java/eu/faircode/email/Helper.java index 67ed6a4f6f..65a8919fb7 100644 --- a/app/src/main/java/eu/faircode/email/Helper.java +++ b/app/src/main/java/eu/faircode/email/Helper.java @@ -98,6 +98,9 @@ import static android.os.Process.THREAD_PRIORITY_BACKGROUND; import static androidx.browser.customtabs.CustomTabsService.ACTION_CUSTOM_TABS_CONNECTION; public class Helper { + static final int NOTIFICATION_SYNCHRONIZE = 1; + static final int NOTIFICATION_EXTERNAL = 2; + static final int JOB_DAILY = 1001; static final int AUTH_TYPE_PASSWORD = 1; diff --git a/app/src/main/java/eu/faircode/email/ReceiverAutostart.java b/app/src/main/java/eu/faircode/email/ReceiverAutostart.java index 5553910222..0cb690a4fa 100644 --- a/app/src/main/java/eu/faircode/email/ReceiverAutostart.java +++ b/app/src/main/java/eu/faircode/email/ReceiverAutostart.java @@ -33,7 +33,7 @@ public class ReceiverAutostart extends BroadcastReceiver { if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction()) || Intent.ACTION_MY_PACKAGE_REPLACED.equals(intent.getAction())) { EntityLog.log(context, intent.getAction()); - ServiceSynchronize.init(context); + ServiceSynchronize.init(context, true); Thread thread = new Thread(new Runnable() { @Override diff --git a/app/src/main/java/eu/faircode/email/ServiceExternal.java b/app/src/main/java/eu/faircode/email/ServiceExternal.java index 82209138c9..cdb082804b 100644 --- a/app/src/main/java/eu/faircode/email/ServiceExternal.java +++ b/app/src/main/java/eu/faircode/email/ServiceExternal.java @@ -1,50 +1,82 @@ package eu.faircode.email; -import android.app.IntentService; +import android.app.Notification; +import android.app.Service; import android.content.Intent; import android.content.SharedPreferences; +import android.os.Build; +import android.os.IBinder; import android.preference.PreferenceManager; import androidx.annotation.Nullable; -public class ServiceExternal extends IntentService { +public class ServiceExternal extends Service { private final static String ACTION_ENABLE = "eu.faircode.email.ENABLE"; private final static String ACTION_DISABLE = "eu.faircode.email.DISABLE"; // adb shell am startservice -a eu.faircode.email.ENABLE // adb shell am startservice -a eu.faircode.email.DISABLE - public ServiceExternal() { - super(ServiceExternal.class.getName()); - } - - public ServiceExternal(String name) { - super(name); - } @Override - protected void onHandleIntent(@Nullable Intent intent) { - if (intent == null) - return; + public int onStartCommand(Intent intent, int flags, int startId) { + try { + startForeground(Helper.NOTIFICATION_EXTERNAL, getNotification().build()); - if (!Helper.isPro(this)) - return; + Log.i("Received intent=" + intent); + Log.logExtras(intent); - Boolean enabled = null; - if (ACTION_ENABLE.equals(intent.getAction())) - enabled = true; - else if (ACTION_DISABLE.equals(intent.getAction())) - enabled = false; + if (intent == null) + return START_NOT_STICKY; - if (enabled != null) { - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - prefs.edit().putBoolean("schedule", false).apply(); + if (!Helper.isPro(this)) + return START_NOT_STICKY; - boolean previous = prefs.getBoolean("enabled", true); - if (!enabled.equals(previous)) { - prefs.edit().putBoolean("enabled", enabled).apply(); - ServiceSynchronize.reload(this, "external"); + Boolean enabled = null; + if (ACTION_ENABLE.equals(intent.getAction())) + enabled = true; + else if (ACTION_DISABLE.equals(intent.getAction())) + enabled = false; + + if (enabled != null) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); + prefs.edit().putBoolean("schedule", false).apply(); + + boolean previous = prefs.getBoolean("enabled", true); + if (!enabled.equals(previous)) { + prefs.edit().putBoolean("enabled", enabled).apply(); + ServiceSynchronize.reload(this, "external"); + } } + + return START_NOT_STICKY; + } finally { + stopForeground(true); } } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + private Notification.Builder getNotification() { + Notification.Builder builder; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) + builder = new Notification.Builder(this, "service"); + else + builder = new Notification.Builder(this); + + builder + .setSmallIcon(R.drawable.baseline_compare_arrows_white_24) + .setContentTitle(getString(R.string.tile_synchronize)) + .setAutoCancel(false) + .setShowWhen(false) + .setPriority(Notification.PRIORITY_MIN) + .setCategory(Notification.CATEGORY_STATUS) + .setVisibility(Notification.VISIBILITY_SECRET); + + return builder; + } } diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index f3c84cf858..0318f544b2 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -141,8 +141,6 @@ public class ServiceSynchronize extends LifecycleService { private ServiceManager serviceManager = new ServiceManager(); private ExecutorService executor = Executors.newSingleThreadExecutor(Helper.backgroundThreadFactory); - private static final int NOTIFICATION_SYNCHRONIZE = 1; - private static final int CONNECT_BACKOFF_START = 8; // seconds private static final int CONNECT_BACKOFF_MAX = 64; // seconds (totally 2 minutes) private static final int CONNECT_BACKOFF_AlARM = 15; // minutes @@ -184,7 +182,7 @@ public class ServiceSynchronize extends LifecycleService { @Override public void onChanged(@Nullable TupleAccountStats stats) { NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - nm.notify(NOTIFICATION_SYNCHRONIZE, getNotificationService(stats).build()); + nm.notify(Helper.NOTIFICATION_SYNCHRONIZE, getNotificationService(stats).build()); } }); @@ -296,7 +294,7 @@ public class ServiceSynchronize extends LifecycleService { stopForeground(true); NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); - nm.cancel(NOTIFICATION_SYNCHRONIZE); + nm.cancel(Helper.NOTIFICATION_SYNCHRONIZE); super.onDestroy(); } @@ -307,7 +305,7 @@ public class ServiceSynchronize extends LifecycleService { Log.i("Service command intent=" + intent + " action=" + action); Log.logExtras(intent); - startForeground(NOTIFICATION_SYNCHRONIZE, getNotificationService(null).build()); + startForeground(Helper.NOTIFICATION_SYNCHRONIZE, getNotificationService(null).build()); super.onStartCommand(intent, flags, startId); @@ -334,7 +332,7 @@ public class ServiceSynchronize extends LifecycleService { case "init": // Network events will manage the service - serviceManager.service_init(); + serviceManager.service_init(intent.getBooleanExtra("schedule", false)); break; case "schedule": @@ -3019,13 +3017,16 @@ public class ServiceSynchronize extends LifecycleService { return prefs.getBoolean("enabled", true); } - private void service_init() { - EntityLog.log(ServiceSynchronize.this, "Service init"); - - next_schedule(); - + private void service_init(boolean schedule) { boolean enabled = isEnabled(); - JobDaily.schedule(ServiceSynchronize.this, enabled); + EntityLog.log(ServiceSynchronize.this, + "Service init schedule=" + schedule + " enabled=" + enabled); + + if (schedule) { + next_schedule(); + JobDaily.schedule(ServiceSynchronize.this, enabled); + } + if (!enabled) stopSelf(); } @@ -3350,10 +3351,11 @@ public class ServiceSynchronize extends LifecycleService { } } - public static void init(Context context) { + public static void init(Context context, boolean schedule) { ContextCompat.startForegroundService(context, new Intent(context, ServiceSynchronize.class) - .setAction("init")); + .setAction("init") + .putExtra("schedule", schedule)); } public static void schedule(Context context) {