OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.chrome.browser.notifications; | 5 package org.chromium.chrome.browser.notifications; |
6 | 6 |
7 import android.app.IntentService; | 7 import android.app.IntentService; |
8 import android.app.job.JobInfo; | 8 import android.app.job.JobInfo; |
9 import android.app.job.JobScheduler; | 9 import android.app.job.JobScheduler; |
10 import android.content.BroadcastReceiver; | 10 import android.content.BroadcastReceiver; |
11 import android.content.ComponentName; | 11 import android.content.ComponentName; |
12 import android.content.Context; | 12 import android.content.Context; |
13 import android.content.Intent; | 13 import android.content.Intent; |
14 import android.os.Build; | 14 import android.os.Build; |
15 import android.os.PersistableBundle; | 15 import android.os.PersistableBundle; |
16 import android.os.StrictMode; | 16 import android.os.StrictMode; |
17 import android.util.Log; | 17 import android.util.Log; |
18 | 18 |
19 import org.chromium.base.ThreadUtils; | 19 import org.chromium.base.ThreadUtils; |
20 import org.chromium.base.annotations.SuppressFBWarnings; | 20 import org.chromium.base.annotations.SuppressFBWarnings; |
21 import org.chromium.base.library_loader.ProcessInitException; | 21 import org.chromium.base.library_loader.ProcessInitException; |
| 22 import org.chromium.chrome.browser.JobSchedulerConstants; |
22 import org.chromium.chrome.browser.init.ChromeBrowserInitializer; | 23 import org.chromium.chrome.browser.init.ChromeBrowserInitializer; |
23 import org.chromium.chrome.browser.webapps.WebappRegistry; | 24 import org.chromium.chrome.browser.webapps.WebappRegistry; |
24 | 25 |
25 /** | 26 /** |
26 * The Notification service receives intents fired as responses to user actions
issued on Android | 27 * The Notification service receives intents fired as responses to user actions
issued on Android |
27 * notifications displayed in the notification tray. | 28 * notifications displayed in the notification tray. |
28 */ | 29 */ |
29 public class NotificationService extends IntentService { | 30 public class NotificationService extends IntentService { |
30 private static final String TAG = NotificationService.class.getSimpleName(); | 31 private static final String TAG = NotificationService.class.getSimpleName(); |
31 | 32 |
32 /** | 33 /** |
33 * The class which receives the intents from the Android framework. It initi
alizes the | 34 * The class which receives the intents from the Android framework. It initi
alizes the |
34 * Notification service, and forward the intents there. Declared public as i
t needs to be | 35 * Notification service, and forward the intents there. Declared public as i
t needs to be |
35 * initialized by the Android framework. | 36 * initialized by the Android framework. |
36 */ | 37 */ |
37 public static class Receiver extends BroadcastReceiver { | 38 public static class Receiver extends BroadcastReceiver { |
38 @Override | 39 @Override |
39 public void onReceive(Context context, Intent intent) { | 40 public void onReceive(Context context, Intent intent) { |
40 Log.i(TAG, "Received a notification intent in the NotificationServic
e's receiver."); | 41 Log.i(TAG, "Received a notification intent in the NotificationServic
e's receiver."); |
41 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { | 42 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { |
42 // Android encourages us not to start services directly on N+, s
o instead we | 43 // Android encourages us not to start services directly on N+, s
o instead we |
43 // schedule a job to handle the notification intent. We use the
Android JobScheduler | 44 // schedule a job to handle the notification intent. We use the
Android JobScheduler |
44 // rather than GcmNetworkManager or FirebaseJobDispatcher since
the JobScheduler | 45 // rather than GcmNetworkManager or FirebaseJobDispatcher since
the JobScheduler |
45 // allows us to execute immediately by setting an override deadl
ine of zero | 46 // allows us to execute immediately by setting an override deadl
ine of zero |
46 // milliseconds. | 47 // milliseconds. |
47 // TODO(crbug.com/685210): UMA to check this does not introduce
noticeable latency. | 48 // TODO(crbug.com/685210): UMA to check this does not introduce
noticeable latency. |
48 PersistableBundle extras = NotificationJobService.getJobExtrasFr
omIntent(intent); | 49 PersistableBundle extras = NotificationJobService.getJobExtrasFr
omIntent(intent); |
49 JobInfo job = | 50 JobInfo job = |
50 new JobInfo | 51 new JobInfo |
51 .Builder(NotificationJobService.JOB_ID, | 52 .Builder(JobSchedulerConstants.NOTIFICATION_SERV
ICE_JOB_ID, |
52 new ComponentName(context, NotificationJ
obService.class)) | 53 new ComponentName(context, NotificationJ
obService.class)) |
53 .setExtras(extras) | 54 .setExtras(extras) |
54 .setOverrideDeadline(0) | 55 .setOverrideDeadline(0) |
55 .build(); | 56 .build(); |
56 JobScheduler scheduler = | 57 JobScheduler scheduler = |
57 (JobScheduler) context.getSystemService(Context.JOB_SCHE
DULER_SERVICE); | 58 (JobScheduler) context.getSystemService(Context.JOB_SCHE
DULER_SERVICE); |
58 scheduler.schedule(job); | 59 scheduler.schedule(job); |
59 } else { | 60 } else { |
60 // TODO(peter): Do we need to acquire a wake lock here? | 61 // TODO(peter): Do we need to acquire a wake lock here? |
61 | 62 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 | 123 |
123 // TODO(peter): Verify that the lifetime of the NotificationService
is sufficient | 124 // TODO(peter): Verify that the lifetime of the NotificationService
is sufficient |
124 // when a notification event could be dispatched successfully. | 125 // when a notification event could be dispatched successfully. |
125 | 126 |
126 } catch (ProcessInitException e) { | 127 } catch (ProcessInitException e) { |
127 Log.e(TAG, "Unable to start the browser process.", e); | 128 Log.e(TAG, "Unable to start the browser process.", e); |
128 System.exit(-1); | 129 System.exit(-1); |
129 } | 130 } |
130 } | 131 } |
131 } | 132 } |
OLD | NEW |