diff --git a/core/build.gradle.kts b/core/build.gradle.kts index d59c1bea7e..566ff04d16 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -4,8 +4,8 @@ plugins { id("com.android.library") id("org.mozilla.rust-android-gradle.rust-android") kotlin("android") - kotlin("android.extensions") kotlin("kapt") + id("kotlin-parcelize") } setupCore() diff --git a/core/src/main/java/com/github/shadowsocks/UrlImportActivity.kt b/core/src/main/java/com/github/shadowsocks/UrlImportActivity.kt index 0c3d2b68dd..c96abf0434 100644 --- a/core/src/main/java/com/github/shadowsocks/UrlImportActivity.kt +++ b/core/src/main/java/com/github/shadowsocks/UrlImportActivity.kt @@ -32,7 +32,7 @@ import com.github.shadowsocks.database.ProfileManager import com.github.shadowsocks.plugin.AlertDialogFragment import com.github.shadowsocks.plugin.Empty import com.github.shadowsocks.plugin.showAllowingStateLoss -import kotlinx.android.parcel.Parcelize +import kotlinx.parcelize.Parcelize class UrlImportActivity : AppCompatActivity() { @Parcelize diff --git a/core/src/main/java/com/github/shadowsocks/aidl/TrafficStats.kt b/core/src/main/java/com/github/shadowsocks/aidl/TrafficStats.kt index a675dd4428..17c0c6d705 100644 --- a/core/src/main/java/com/github/shadowsocks/aidl/TrafficStats.kt +++ b/core/src/main/java/com/github/shadowsocks/aidl/TrafficStats.kt @@ -21,7 +21,7 @@ package com.github.shadowsocks.aidl import android.os.Parcelable -import kotlinx.android.parcel.Parcelize +import kotlinx.parcelize.Parcelize @Parcelize data class TrafficStats( diff --git a/core/src/main/java/com/github/shadowsocks/database/Profile.kt b/core/src/main/java/com/github/shadowsocks/database/Profile.kt index e0f915b350..4468a8520b 100644 --- a/core/src/main/java/com/github/shadowsocks/database/Profile.kt +++ b/core/src/main/java/com/github/shadowsocks/database/Profile.kt @@ -36,7 +36,7 @@ import com.google.gson.JsonArray import com.google.gson.JsonElement import com.google.gson.JsonObject import com.google.gson.JsonPrimitive -import kotlinx.android.parcel.Parcelize +import kotlinx.parcelize.Parcelize import org.json.JSONArray import org.json.JSONObject import timber.log.Timber diff --git a/mobile/build.gradle.kts b/mobile/build.gradle.kts index 01de34b4e0..8e13ef5ed7 100644 --- a/mobile/build.gradle.kts +++ b/mobile/build.gradle.kts @@ -4,7 +4,7 @@ plugins { id("com.google.gms.google-services") id("com.google.firebase.crashlytics") kotlin("android") - kotlin("android.extensions") + id("kotlin-parcelize") } setupApp() diff --git a/mobile/src/main/java/com/github/shadowsocks/AppManager.kt b/mobile/src/main/java/com/github/shadowsocks/AppManager.kt index 68b26d9156..ab281283da 100644 --- a/mobile/src/main/java/com/github/shadowsocks/AppManager.kt +++ b/mobile/src/main/java/com/github/shadowsocks/AppManager.kt @@ -33,11 +33,10 @@ import android.graphics.drawable.Drawable import android.os.Bundle import android.util.SparseBooleanArray import android.view.* -import android.widget.Filter -import android.widget.Filterable -import android.widget.SearchView +import android.widget.* import androidx.annotation.UiThread import androidx.appcompat.app.AppCompatActivity +import androidx.appcompat.widget.Toolbar import androidx.core.util.set import androidx.core.view.ViewCompat import androidx.lifecycle.lifecycleScope @@ -52,8 +51,6 @@ import com.github.shadowsocks.utils.listenForPackageChanges import com.github.shadowsocks.widget.ListHolderListener import com.github.shadowsocks.widget.ListListener import com.google.android.material.snackbar.Snackbar -import kotlinx.android.synthetic.main.layout_apps.* -import kotlinx.android.synthetic.main.layout_apps_item.view.* import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.ensureActive @@ -110,14 +107,14 @@ class AppManager : AppCompatActivity() { fun bind(app: ProxiedApp) { item = app - itemView.itemicon.setImageDrawable(app.icon) - itemView.title.text = app.name - itemView.desc.text = "${app.packageName} (${app.uid})" - itemView.itemcheck.isChecked = isProxiedApp(app) + itemView.findViewById(R.id.itemicon).setImageDrawable(app.icon) + itemView.findViewById(R.id.title).text = app.name + itemView.findViewById(R.id.desc).text = "${app.packageName} (${app.uid})" + itemView.findViewById(R.id.itemcheck).isChecked = isProxiedApp(app) } fun handlePayload(payloads: List) { - if (payloads.contains(SWITCH)) itemView.itemcheck.isChecked = isProxiedApp(item) + if (payloads.contains(SWITCH)) itemView.findViewById(R.id.itemcheck).isChecked = isProxiedApp(item) } override fun onClick(v: View?) { @@ -175,6 +172,11 @@ class AppManager : AppCompatActivity() { override fun getPopupText(position: Int) = filteredApps[position].name.firstOrNull()?.toString() ?: "" } + private val loading by lazy { findViewById(R.id.loading) } + private lateinit var toolbar: Toolbar + private lateinit var bypassGroup: RadioGroup + private lateinit var list: RecyclerView + private lateinit var search: SearchView private val proxiedUids = SparseBooleanArray() private var loader: Job? = null private var apps = emptyList() @@ -219,6 +221,7 @@ class AppManager : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.layout_apps) ListHolderListener.setup(this) + toolbar = findViewById(R.id.toolbar) setSupportActionBar(toolbar) supportActionBar!!.setDisplayHomeAsUpEnabled(true) @@ -227,6 +230,7 @@ class AppManager : AppCompatActivity() { DataStore.dirty = true } + bypassGroup = findViewById(R.id.bypassGroup) bypassGroup.check(if (DataStore.bypass) R.id.btn_bypass else R.id.btn_on) bypassGroup.setOnCheckedChangeListener { _, checkedId -> DataStore.dirty = true @@ -241,12 +245,14 @@ class AppManager : AppCompatActivity() { } initProxiedUids() + list = findViewById(R.id.list) ViewCompat.setOnApplyWindowInsetsListener(list, ListListener) list.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false) list.itemAnimator = DefaultItemAnimator() list.adapter = appsAdapter FastScrollerBuilder(list).useMd2Style().build() + search = findViewById(R.id.search) search.setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String?) = false override fun onQueryTextChange(newText: String?) = true.also { appsAdapter.filter.filter(newText) } diff --git a/mobile/src/main/java/com/github/shadowsocks/ProfileConfigFragment.kt b/mobile/src/main/java/com/github/shadowsocks/ProfileConfigFragment.kt index 37fcc4748f..a27d8bc977 100644 --- a/mobile/src/main/java/com/github/shadowsocks/ProfileConfigFragment.kt +++ b/mobile/src/main/java/com/github/shadowsocks/ProfileConfigFragment.kt @@ -45,9 +45,9 @@ import com.github.shadowsocks.preference.* import com.github.shadowsocks.utils.* import com.github.shadowsocks.widget.ListListener import com.google.android.material.snackbar.Snackbar -import kotlinx.android.parcel.Parcelize import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import kotlinx.parcelize.Parcelize class ProfileConfigFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener, OnPreferenceDataStoreChangeListener { diff --git a/mobile/src/main/java/com/github/shadowsocks/acl/CustomRulesFragment.kt b/mobile/src/main/java/com/github/shadowsocks/acl/CustomRulesFragment.kt index 775dcff685..e18950c1e6 100644 --- a/mobile/src/main/java/com/github/shadowsocks/acl/CustomRulesFragment.kt +++ b/mobile/src/main/java/com/github/shadowsocks/acl/CustomRulesFragment.kt @@ -54,7 +54,7 @@ import com.github.shadowsocks.widget.ListHolderListener import com.github.shadowsocks.widget.MainListListener import com.github.shadowsocks.widget.UndoSnackbarManager import com.google.android.material.textfield.TextInputLayout -import kotlinx.android.parcel.Parcelize +import kotlinx.parcelize.Parcelize import me.zhanghai.android.fastscroll.FastScrollerBuilder import timber.log.Timber import java.net.IDN diff --git a/mobile/src/main/java/com/github/shadowsocks/subscription/SubscriptionFragment.kt b/mobile/src/main/java/com/github/shadowsocks/subscription/SubscriptionFragment.kt index dde9cfade0..7f3199226b 100644 --- a/mobile/src/main/java/com/github/shadowsocks/subscription/SubscriptionFragment.kt +++ b/mobile/src/main/java/com/github/shadowsocks/subscription/SubscriptionFragment.kt @@ -47,7 +47,7 @@ import com.github.shadowsocks.widget.ListHolderListener import com.github.shadowsocks.widget.MainListListener import com.github.shadowsocks.widget.UndoSnackbarManager import com.google.android.material.textfield.TextInputLayout -import kotlinx.android.parcel.Parcelize +import kotlinx.parcelize.Parcelize import me.zhanghai.android.fastscroll.FastScrollerBuilder import java.net.MalformedURLException import java.net.URL diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index 3a97ef9bf2..936accc434 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("com.android.library") id("com.vanniktech.maven.publish") kotlin("android") - kotlin("android.extensions") + id("kotlin-parcelize") } setupCommon() diff --git a/plugin/src/main/java/com/github/shadowsocks/plugin/Utils.kt b/plugin/src/main/java/com/github/shadowsocks/plugin/Utils.kt index d0453aa91f..37dfdb4abf 100644 --- a/plugin/src/main/java/com/github/shadowsocks/plugin/Utils.kt +++ b/plugin/src/main/java/com/github/shadowsocks/plugin/Utils.kt @@ -25,7 +25,7 @@ package com.github.shadowsocks.plugin import android.os.Parcelable import androidx.fragment.app.DialogFragment import androidx.fragment.app.FragmentManager -import kotlinx.android.parcel.Parcelize +import kotlinx.parcelize.Parcelize @Parcelize class Empty : Parcelable