|
1 |
| -package com.usagestatsmanager |
| 1 | +package io.justdice.usagestats |
2 | 2 |
|
3 | 3 | import android.annotation.TargetApi
|
4 | 4 | import android.app.AppOpsManager
|
@@ -28,15 +28,16 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule
|
28 | 28 | import com.facebook.react.bridge.ReactMethod
|
29 | 29 | import com.facebook.react.bridge.WritableMap
|
30 | 30 | import com.facebook.react.bridge.WritableNativeMap
|
| 31 | +import com.facebook.react.bridge.WritableNativeArray |
31 | 32 | import com.facebook.react.common.MapBuilder
|
32 |
| -import com.usagestatsmanager.model.AppData |
33 |
| -import com.usagestatsmanager.utils.SortOrder |
34 |
| -import com.usagestatsmanager.utils.UsageUtils |
35 |
| -import com.usagestatsmanager.utils.UsageUtils.getAppUid |
36 |
| -import com.usagestatsmanager.utils.UsageUtils.getTimeRange |
37 |
| -import com.usagestatsmanager.utils.UsageUtils.humanReadableMillis |
38 |
| -import com.usagestatsmanager.utils.UsageUtils.isSystemApp |
39 |
| -import com.usagestatsmanager.utils.UsageUtils.parsePackageName |
| 33 | +import io.justdice.usagestats.model.AppData |
| 34 | +import io.justdice.usagestats.utils.SortOrder |
| 35 | +import io.justdice.usagestats.utils.UsageUtils |
| 36 | +import io.justdice.usagestats.utils.UsageUtils.getAppUid |
| 37 | +import io.justdice.usagestats.utils.UsageUtils.getTimeRange |
| 38 | +import io.justdice.usagestats.utils.UsageUtils.humanReadableMillis |
| 39 | +import io.justdice.usagestats.utils.UsageUtils.isSystemApp |
| 40 | +import io.justdice.usagestats.utils.UsageUtils.parsePackageName |
40 | 41 |
|
41 | 42 |
|
42 | 43 | class UsageStatsManagerModule(reactContext: ReactApplicationContext) :
|
@@ -169,133 +170,37 @@ class UsageStatsManagerModule(reactContext: ReactApplicationContext) :
|
169 | 170 | return writableMap
|
170 | 171 | }
|
171 | 172 |
|
| 173 | + private fun containItem(items: List<AppData>, packageName: String): AppData? { |
| 174 | + for (item in items) { |
| 175 | + if (item.mPackageName == packageName) return item |
| 176 | + } |
| 177 | + return null |
| 178 | + } |
| 179 | + |
172 | 180 | @ReactMethod
|
173 | 181 | fun queryEvents(startTime: Double, endTime: Double, promise: Promise) {
|
174 |
| -// val result: WritableMap = WritableNativeMap() |
175 |
| - val items: MutableList<AppData> = mutableListOf<AppData>() |
176 |
| - val newList: MutableList<AppData> = mutableListOf() |
| 182 | + val result = WritableNativeArray() |
| 183 | + |
177 | 184 | val manager: UsageStatsManager =
|
178 | 185 | reactContext?.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager
|
179 | 186 |
|
180 |
| - // val events: UsageEvents = manager.queryEvents(startTime.toLong(), endTime.toLong()) |
181 |
| - var prevPackage: String? = "" |
182 |
| - val startPoints: MutableMap<String, Long> = mutableMapOf() |
183 |
| - val endPoints: MutableMap<String, ClonedEvent> = mutableMapOf() |
184 |
| - |
185 |
| - val sortEnum: SortOrder = SortOrder.getSortEnum(0) |
186 |
| - val range = getTimeRange(sortEnum) |
187 |
| - |
188 |
| -// val events: UsageEvents = if (sortEnum.name.equals("MONTH", ignoreCase = true)) { |
189 |
| -// manager.queryEvents(UsageStatsManager.INTERVAL_DAILY.toLong(), range[1]) |
190 |
| -// } else { |
191 |
| -// manager.queryEvents(range[0], range[1]) |
192 |
| -// } |
193 | 187 | val events: UsageEvents = manager.queryEvents(startTime.toLong(), endTime.toLong())
|
194 |
| - |
195 | 188 | val event = UsageEvents.Event()
|
196 |
| - while (events.hasNextEvent()) { |
197 |
| - events.getNextEvent(event); |
198 |
| - |
199 |
| - val eventType: Int = event.eventType |
200 |
| - val eventTime: Long = event.timeStamp |
201 |
| - val eventPackage: String = event.packageName |
202 |
| - |
203 |
| - if (eventType === UsageEvents.Event.MOVE_TO_FOREGROUND) { |
204 |
| - var item: AppData? = containItem(items, eventPackage) |
205 |
| - if (item == null) { |
206 |
| - item = AppData() |
207 |
| - item.mPackageName = eventPackage |
208 |
| - items.add(item) |
209 |
| - } |
210 |
| - if (!startPoints.containsKey(eventPackage)) { |
211 |
| - startPoints.put(eventPackage, eventTime) |
212 |
| - } |
213 |
| - } |
214 |
| - |
215 |
| - if (eventType == UsageEvents.Event.MOVE_TO_BACKGROUND) { |
216 |
| - if (startPoints.isNotEmpty() && startPoints.containsKey(eventPackage)) { |
217 |
| - endPoints[eventPackage] = ClonedEvent(event); |
218 |
| - } |
219 |
| - } |
220 |
| - |
221 |
| - if (TextUtils.isEmpty(prevPackage)) prevPackage = eventPackage; |
222 |
| - if (!prevPackage.equals(eventPackage)) { |
223 |
| - if (startPoints.containsKey(prevPackage) && endPoints.containsKey(prevPackage)) { |
224 |
| - val lastEndEvent = endPoints[prevPackage] |
225 |
| - val listItem = containItem(items, prevPackage!!) |
226 |
| - if (listItem != null) { // update list item info |
227 |
| - listItem.mEventTime = lastEndEvent!!.timeStamp |
228 |
| - var duration = lastEndEvent!!.timeStamp - startPoints[prevPackage]!! |
229 |
| - if (duration <= 0) duration = 0 |
230 |
| - listItem.mUsageTime += duration |
231 |
| - if (duration > UsageUtils.USAGE_TIME_MIX) { |
232 |
| - listItem.mCount++ |
233 |
| - } |
234 |
| - } |
235 |
| - startPoints.remove(prevPackage) |
236 |
| - endPoints.remove(prevPackage) |
237 |
| - } |
238 |
| - prevPackage = eventPackage |
239 |
| - } |
240 |
| - } |
241 |
| - |
242 |
| - if (items.size > 0) { |
243 |
| - var canCalculateDataUsage: Boolean = false |
244 |
| - |
245 |
| - var mobileData: MutableMap<String?, Long?> = HashMap() |
246 |
| - var wifiData: Map<String?, Long?>? = HashMap() |
247 |
| - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { |
248 |
| - canCalculateDataUsage = true |
249 |
| - val networkStatsManager = reactContext.getSystemService(Context.NETWORK_STATS_SERVICE) |
250 |
| - val telephonyManager = reactContext.getSystemService(Context.TELEPHONY_SERVICE) |
251 |
| -// mobileData = getMobileData(context, telephonyManager, networkStatsManager, offset) |
252 |
| -// wifiData = getWifiUsageData(context, telephonyManager, networkStatsManager, offset) |
253 |
| - } else { |
254 |
| - mobileData["mobile"] = TrafficStats.getMobileRxBytes() + TrafficStats.getMobileTxBytes() |
255 |
| - } |
256 |
| - |
257 | 189 |
|
258 |
| - val hideSystem = true |
259 |
| - val hideUninstall = true |
260 |
| - val packageManager: PackageManager = reactContext.packageManager |
| 190 | + while (events.hasNextEvent()) { |
| 191 | + events.getNextEvent(event) |
261 | 192 |
|
262 |
| - for (item in items) { |
263 |
| -// if (!openable(packageManager, item.mPackageName!!)) { |
264 |
| -// continue |
265 |
| -// } |
266 |
| - if (hideSystem && isSystemApp(packageManager, item.mPackageName!!)) { |
267 |
| - continue |
268 |
| - } |
269 |
| -// if (hideUninstall && !isInstalled(packageManager, item.mPackageName!!)) { |
270 |
| -// continue |
271 |
| -// } |
272 |
| - if (canCalculateDataUsage) { |
273 |
| - val key = "u" + getAppUid(packageManager, item.mPackageName!!) |
274 |
| -// if (mobileData.size() > 0 && mobileData.containsKey(key)) { |
275 |
| -// item.mMobile = mobileData.get(key) |
276 |
| -// } |
277 |
| -// if (wifiData.size() > 0 && wifiData.containsKey(key)) { |
278 |
| -// item.mWifi = wifiData.get(key) |
279 |
| -// } |
280 |
| - } |
281 |
| - item.mName = parsePackageName(packageManager, item.mPackageName!!).toString() |
282 |
| - newList.add(item) |
283 |
| - } |
| 193 | + val _event: WritableMap = WritableNativeMap() |
| 194 | + _event.putInt("eventType", event.eventType) |
| 195 | + _event.putDouble("timeStamp", event.timeStamp.toDouble()) |
| 196 | + _event.putString("packageName", event.packageName) |
284 | 197 |
|
285 |
| - newList.sortWith(Comparator { left: AppData, right: AppData -> (right.mUsageTime - left.mUsageTime).toInt() }) |
| 198 | + result.pushMap(_event) |
286 | 199 | }
|
287 |
| - promise.resolve(writeToWritableMap(newList)) |
288 |
| - } |
289 | 200 |
|
290 |
| - private fun containItem(items: List<AppData>, packageName: String): AppData? { |
291 |
| - for (item in items) { |
292 |
| - if (item.mPackageName == packageName) return item |
293 |
| - } |
294 |
| - return null |
| 201 | + promise.resolve(result) |
295 | 202 | }
|
296 | 203 |
|
297 |
| - |
298 |
| - |
299 | 204 | @RequiresApi(Build.VERSION_CODES.P)
|
300 | 205 | @ReactMethod
|
301 | 206 | fun queryEventsStats(interval: Int, startTime: Double, endTime: Double, promise: Promise) {
|
@@ -482,7 +387,7 @@ class UsageStatsManagerModule(reactContext: ReactApplicationContext) :
|
482 | 387 | }
|
483 | 388 |
|
484 | 389 | companion object {
|
485 |
| - const val NAME = "UsageStatsManager" |
| 390 | + const val NAME = "JustDiceReactNativeUsageStats" |
486 | 391 | }
|
487 | 392 | }
|
488 | 393 |
|
|
0 commit comments