blob: f3918ee9e8ff63b1e570094aacfee7f3ff1e6f62 [file] [log] [blame]
Yu-Han Yang3557cc72018-03-21 12:48:36 -07001package com.android.server.location;
2
3import android.util.Log;
4
5import com.android.internal.annotations.VisibleForTesting;
6
7/**
8 * Manages GNSS Batching operations.
9 *
10 * <p>This class is not thread safe (It's client's responsibility to make sure calls happen on
11 * the same thread).
12 */
13public class GnssBatchingProvider {
14
15 private static final String TAG = "GnssBatchingProvider";
16 private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
17
18 private final GnssBatchingProviderNative mNative;
19 private boolean mEnabled;
20 private boolean mStarted;
21 private long mPeriodNanos;
22 private boolean mWakeOnFifoFull;
23
24 GnssBatchingProvider() {
25 this(new GnssBatchingProviderNative());
26 }
27
28 @VisibleForTesting
29 GnssBatchingProvider(GnssBatchingProviderNative gnssBatchingProviderNative) {
30 mNative = gnssBatchingProviderNative;
31 }
32
33 /**
34 * Returns the GNSS batching size
35 */
36 public int getBatchSize() {
37 return mNative.getBatchSize();
38 }
39
40 /** Enable GNSS batching. */
41 public void enable() {
42 mEnabled = mNative.initBatching();
43 if (!mEnabled) {
44 Log.e(TAG, "Failed to initialize GNSS batching");
45 }
46 }
47
48 /**
49 * Starts the hardware batching operation
50 */
51 public boolean start(long periodNanos, boolean wakeOnFifoFull) {
52 if (!mEnabled) {
53 throw new IllegalStateException();
54 }
55 if (periodNanos <= 0) {
56 Log.e(TAG, "Invalid periodNanos " + periodNanos +
57 " in batching request, not started");
58 return false;
59 }
60 mStarted = mNative.startBatch(periodNanos, wakeOnFifoFull);
61 if (mStarted) {
62 mPeriodNanos = periodNanos;
63 mWakeOnFifoFull = wakeOnFifoFull;
64 }
65 return mStarted;
66 }
67
68 /**
69 * Forces a flush of existing locations from the hardware batching
70 */
71 public void flush() {
72 if (!mStarted) {
73 Log.w(TAG, "Cannot flush since GNSS batching has not started.");
74 return;
75 }
76 mNative.flushBatch();
77 }
78
79 /**
80 * Stops the batching operation
81 */
82 public boolean stop() {
83 boolean stopped = mNative.stopBatch();
84 if (stopped) {
85 mStarted = false;
86 }
87 return stopped;
88 }
89
90 /** Disable GNSS batching. */
91 public void disable() {
92 stop();
93 mNative.cleanupBatching();
94 mEnabled = false;
95 }
96
97 // TODO(b/37460011): Use this with death recovery logic.
98 void resumeIfStarted() {
99 if (DEBUG) {
100 Log.d(TAG, "resumeIfStarted");
101 }
102 if (mStarted) {
103 mNative.startBatch(mPeriodNanos, mWakeOnFifoFull);
104 }
105 }
106
107 @VisibleForTesting
108 static class GnssBatchingProviderNative {
109 public int getBatchSize() {
110 return native_get_batch_size();
111 }
112
113 public boolean startBatch(long periodNanos, boolean wakeOnFifoFull) {
114 return native_start_batch(periodNanos, wakeOnFifoFull);
115 }
116
117 public void flushBatch() {
118 native_flush_batch();
119 }
120
121 public boolean stopBatch() {
122 return native_stop_batch();
123 }
124
125 public boolean initBatching() {
126 return native_init_batching();
127 }
128
129 public void cleanupBatching() {
130 native_cleanup_batching();
131 }
132 }
133
134 private static native int native_get_batch_size();
135
136 private static native boolean native_start_batch(long periodNanos, boolean wakeOnFifoFull);
137
138 private static native void native_flush_batch();
139
140 private static native boolean native_stop_batch();
141
142 private static native boolean native_init_batching();
143
144 private static native void native_cleanup_batching();
145}