From 569f056a22adb0236f4eb1c44dc4fb8fff01bb77 Mon Sep 17 00:00:00 2001 From: Mygod Date: Sat, 26 Dec 2015 18:56:12 +0800 Subject: [PATCH] Reduce battery usage - register broadcast at runtime --- src/main/AndroidManifest.xml | 8 ------ .../com/github/shadowsocks/AppManager.scala | 26 ++++++++++++++----- .../shadowsocks/AppManagerReceiver.scala | 11 -------- 3 files changed, 19 insertions(+), 26 deletions(-) delete mode 100644 src/main/scala/com/github/shadowsocks/AppManagerReceiver.scala diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index f17450ae..ad614eae 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -108,14 +108,6 @@ - - - - - - - - diff --git a/src/main/scala/com/github/shadowsocks/AppManager.scala b/src/main/scala/com/github/shadowsocks/AppManager.scala index 7e86eb9f..fb1eab80 100644 --- a/src/main/scala/com/github/shadowsocks/AppManager.scala +++ b/src/main/scala/com/github/shadowsocks/AppManager.scala @@ -40,7 +40,7 @@ package com.github.shadowsocks import android.content.pm.PackageManager -import android.content.{ClipData, ClipboardManager, Context} +import android.content._ import android.graphics.PixelFormat import android.graphics.drawable.Drawable import android.os.{Bundle, Handler} @@ -65,13 +65,25 @@ object AppManager { case class ProxiedApp(name: String, packageName: String, icon: Drawable) private case class ListEntry(switch: Switch, text: TextView, icon: ImageView) - var cachedApps: Array[ProxiedApp] = _ + private var receiverRegistered: Boolean = _ + private var cachedApps: Array[ProxiedApp] = _ private def getApps(pm: PackageManager) = { - if (cachedApps == null) cachedApps = pm.getInstalledPackages(PackageManager.GET_PERMISSIONS) - .filter(p => p.requestedPermissions != null && p.requestedPermissions.contains(permission.INTERNET)) - .map(p => new ProxiedApp(pm.getApplicationLabel(p.applicationInfo).toString, p.packageName, - p.applicationInfo.loadIcon(pm))).toArray - cachedApps + if (!receiverRegistered) { + val filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED) + filter.addAction(Intent.ACTION_PACKAGE_REMOVED) + filter.addDataScheme("package") + ShadowsocksApplication.instance.registerReceiver((context: Context, intent: Intent) => + if (intent.getAction != Intent.ACTION_PACKAGE_REMOVED || !intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) + synchronized(cachedApps = null), filter) + receiverRegistered = true + } + synchronized { + if (cachedApps == null) cachedApps = pm.getInstalledPackages(PackageManager.GET_PERMISSIONS) + .filter(p => p.requestedPermissions != null && p.requestedPermissions.contains(permission.INTERNET)) + .map(p => new ProxiedApp(pm.getApplicationLabel(p.applicationInfo).toString, p.packageName, + p.applicationInfo.loadIcon(pm))).toArray + cachedApps + } } } diff --git a/src/main/scala/com/github/shadowsocks/AppManagerReceiver.scala b/src/main/scala/com/github/shadowsocks/AppManagerReceiver.scala deleted file mode 100644 index f3170f21..00000000 --- a/src/main/scala/com/github/shadowsocks/AppManagerReceiver.scala +++ /dev/null @@ -1,11 +0,0 @@ -package com.github.shadowsocks - -import android.content.{Intent, Context, BroadcastReceiver} - -/** - * @author Mygod - */ -class AppManagerReceiver extends BroadcastReceiver { - override def onReceive(context: Context, intent: Intent) = if (intent.getAction != Intent.ACTION_PACKAGE_REMOVED || - !intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) AppManager.synchronized(AppManager.cachedApps = null) -}