Commit 9c1da29b authored by Mygod's avatar Mygod Committed by Max Lv

Fix importing

parent 8298f891
...@@ -60,7 +60,6 @@ dependencies { ...@@ -60,7 +60,6 @@ dependencies {
implementation 'androidx.constraintlayout:constraintlayout:1.1.3' implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.google.android.gms:play-services-vision:17.0.2' implementation 'com.google.android.gms:play-services-vision:17.0.2'
implementation 'com.google.firebase:firebase-ads:17.1.3' implementation 'com.google.firebase:firebase-ads:17.1.3'
implementation 'com.google.guava:guava:27.0.1-android'
implementation "com.takisoft.preferencex:preferencex-simplemenu:$preferencexVersion" implementation "com.takisoft.preferencex:preferencex-simplemenu:$preferencexVersion"
implementation 'com.twofortyfouram:android-plugin-api-for-locale:1.0.4' implementation 'com.twofortyfouram:android-plugin-api-for-locale:1.0.4'
implementation 'net.glxn.qrgen:android:2.0' implementation 'net.glxn.qrgen:android:2.0'
......
...@@ -32,6 +32,7 @@ import android.content.pm.PackageInfo ...@@ -32,6 +32,7 @@ import android.content.pm.PackageInfo
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.os.Bundle import android.os.Bundle
import android.util.SparseBooleanArray
import android.view.* import android.view.*
import android.widget.Filter import android.widget.Filter
import android.widget.Filterable import android.widget.Filterable
...@@ -39,6 +40,7 @@ import android.widget.SearchView ...@@ -39,6 +40,7 @@ import android.widget.SearchView
import androidx.annotation.UiThread import androidx.annotation.UiThread
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.getSystemService import androidx.core.content.getSystemService
import androidx.core.util.set
import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
...@@ -48,8 +50,6 @@ import com.github.shadowsocks.preference.DataStore ...@@ -48,8 +50,6 @@ import com.github.shadowsocks.preference.DataStore
import com.github.shadowsocks.utils.DirectBoot import com.github.shadowsocks.utils.DirectBoot
import com.github.shadowsocks.utils.Key import com.github.shadowsocks.utils.Key
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import com.google.common.collect.Multimap
import com.google.common.collect.MultimapBuilder
import kotlinx.android.synthetic.main.layout_apps.* import kotlinx.android.synthetic.main.layout_apps.*
import kotlinx.android.synthetic.main.layout_apps_item.view.* import kotlinx.android.synthetic.main.layout_apps_item.view.*
import kotlinx.coroutines.* import kotlinx.coroutines.*
...@@ -60,8 +60,8 @@ class AppManager : AppCompatActivity() { ...@@ -60,8 +60,8 @@ class AppManager : AppCompatActivity() {
private var instance: AppManager? = null private var instance: AppManager? = null
private var receiver: BroadcastReceiver? = null private var receiver: BroadcastReceiver? = null
private var cachedApps: List<PackageInfo>? = null private var cachedApps: Map<String, PackageInfo>? = null
private suspend fun getApps(pm: PackageManager) = synchronized(AppManager) { private fun getCachedApps(pm: PackageManager) = synchronized(AppManager) {
if (receiver == null) receiver = Core.listenForPackageChanges { if (receiver == null) receiver = Core.listenForPackageChanges {
synchronized(AppManager) { synchronized(AppManager) {
receiver = null receiver = null
...@@ -75,14 +75,16 @@ class AppManager : AppCompatActivity() { ...@@ -75,14 +75,16 @@ class AppManager : AppCompatActivity() {
when (it.packageName) { when (it.packageName) {
app.packageName -> false app.packageName -> false
"android" -> true "android" -> true
else -> it.requestedPermissions?.contains(Manifest.permission.INTERNET) ?: false else -> it.requestedPermissions?.contains(Manifest.permission.INTERNET) == true
} }
} }
.associateBy { it.packageName }
this.cachedApps = cachedApps this.cachedApps = cachedApps
cachedApps cachedApps
}.map { }
private suspend fun getApps(pm: PackageManager) = getCachedApps(pm).map { (packageName, packageInfo) ->
yield() yield()
ProxiedApp(pm, it.applicationInfo, it.packageName) ProxiedApp(pm, packageInfo.applicationInfo, packageName)
} }
} }
...@@ -113,14 +115,8 @@ class AppManager : AppCompatActivity() { ...@@ -113,14 +115,8 @@ class AppManager : AppCompatActivity() {
} }
override fun onClick(v: View?) { override fun onClick(v: View?) {
if (isProxiedApp(item)) { if (isProxiedApp(item)) proxiedUids.delete(item.uid) else proxiedUids[item.uid] = true
val list = proxiedUidMap.removeAll(item.uid) DataStore.individual = apps.filter { isProxiedApp(it) }.joinToString("\n") { it.packageName }
proxiedApps.removeAll(list)
} else {
proxiedApps.add(item.packageName)
proxiedUidMap.put(item.uid, item.packageName)
}
DataStore.individual = proxiedApps.joinToString("\n")
DataStore.dirty = true DataStore.dirty = true
appsAdapter.notifyItemRangeChanged(0, appsAdapter.itemCount, "switch") appsAdapter.notifyItemRangeChanged(0, appsAdapter.itemCount, "switch")
...@@ -132,15 +128,6 @@ class AppManager : AppCompatActivity() { ...@@ -132,15 +128,6 @@ class AppManager : AppCompatActivity() {
suspend fun reload() { suspend fun reload() {
val list = getApps(packageManager) val list = getApps(packageManager)
val map = MultimapBuilder.treeKeys().arrayListValues().build<Int, String>()
list.filter { app ->
app.packageName in proxiedApps
}.forEach { app ->
map.put(app.uid, app.packageName)
}
proxiedUidMap = map
apps = list.sortedWith(compareBy({ !isProxiedApp(it) }, { it.name.toString() })) apps = list.sortedWith(compareBy({ !isProxiedApp(it) }, { it.name.toString() }))
filteredApps = apps filteredApps = apps
} }
...@@ -183,12 +170,11 @@ class AppManager : AppCompatActivity() { ...@@ -183,12 +170,11 @@ class AppManager : AppCompatActivity() {
} }
} }
private lateinit var proxiedApps: HashSet<String> private val proxiedUids = SparseBooleanArray()
private lateinit var proxiedUidMap: Multimap<Int, String>
private lateinit var appsAdapter: AppsAdapter private lateinit var appsAdapter: AppsAdapter
private val clipboard by lazy { getSystemService<ClipboardManager>()!! } private val clipboard by lazy { getSystemService<ClipboardManager>()!! }
private var loader: Job? = null private var loader: Job? = null
private var apps = listOf<ProxiedApp>() private var apps = emptyList<ProxiedApp>()
private val shortAnimTime by lazy { resources.getInteger(android.R.integer.config_shortAnimTime).toLong() } private val shortAnimTime by lazy { resources.getInteger(android.R.integer.config_shortAnimTime).toLong() }
private fun View.crossFadeFrom(other: View) { private fun View.crossFadeFrom(other: View) {
...@@ -205,11 +191,13 @@ class AppManager : AppCompatActivity() { ...@@ -205,11 +191,13 @@ class AppManager : AppCompatActivity() {
}).duration = shortAnimTime }).duration = shortAnimTime
} }
private fun initProxiedApps(str: String = DataStore.individual) { private fun initProxiedUids(str: String = DataStore.individual) {
proxiedApps = str.split('\n').toHashSet() proxiedUids.clear()
val apps = getCachedApps(packageManager)
for (line in str.lineSequence()) proxiedUids[(apps[line] ?: continue).applicationInfo.uid] = true
} }
private fun isProxiedApp(app: ProxiedApp) = proxiedUidMap.containsKey(app.uid) private fun isProxiedApp(app: ProxiedApp) = proxiedUids[app.uid]
@UiThread @UiThread
private fun loadApps() { private fun loadApps() {
...@@ -254,7 +242,7 @@ class AppManager : AppCompatActivity() { ...@@ -254,7 +242,7 @@ class AppManager : AppCompatActivity() {
} }
} }
initProxiedApps() initProxiedUids()
list.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false) list.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)
list.itemAnimator = DefaultItemAnimator() list.itemAnimator = DefaultItemAnimator()
appsAdapter = AppsAdapter() appsAdapter = AppsAdapter()
...@@ -305,8 +293,8 @@ class AppManager : AppCompatActivity() { ...@@ -305,8 +293,8 @@ class AppManager : AppCompatActivity() {
DataStore.individual = apps DataStore.individual = apps
DataStore.dirty = true DataStore.dirty = true
Snackbar.make(list, R.string.action_import_msg, Snackbar.LENGTH_LONG).show() Snackbar.make(list, R.string.action_import_msg, Snackbar.LENGTH_LONG).show()
initProxiedApps(apps) initProxiedUids(apps)
loadApps() appsAdapter.notifyDataSetChanged()
return true return true
} catch (_: IllegalArgumentException) { } } catch (_: IllegalArgumentException) { }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment