diff --git a/mobile/src/main/java/com/github/shadowsocks/AppManager.kt b/mobile/src/main/java/com/github/shadowsocks/AppManager.kt index 6a9db475..0c5d7439 100644 --- a/mobile/src/main/java/com/github/shadowsocks/AppManager.kt +++ b/mobile/src/main/java/com/github/shadowsocks/AppManager.kt @@ -38,6 +38,7 @@ import android.support.v7.widget.DefaultItemAnimator import android.support.v7.widget.LinearLayoutManager import android.support.v7.widget.RecyclerView import android.support.v7.widget.Toolbar +import android.util.TypedValue import android.view.* import android.widget.ImageView import android.widget.Switch @@ -49,6 +50,7 @@ import com.github.shadowsocks.database.ProfileManager import com.github.shadowsocks.preference.DataStore import com.github.shadowsocks.utils.DirectBoot import com.github.shadowsocks.utils.Key +import com.github.shadowsocks.utils.resolveResourceId import com.github.shadowsocks.utils.thread import java.util.concurrent.atomic.AtomicBoolean @@ -181,9 +183,7 @@ class AppManager : AppCompatActivity(), Toolbar.OnMenuItemClickListener { setContentView(R.layout.layout_apps) toolbar = findViewById(R.id.toolbar) toolbar.setTitle(R.string.proxied_apps) - val arr = obtainStyledAttributes(intArrayOf(R.attr.homeAsUpIndicator)) - toolbar.navigationIcon = arr.getDrawable(0) - arr.recycle() + toolbar.setNavigationIcon(theme.resolveResourceId(R.attr.homeAsUpIndicator)) toolbar.setNavigationOnClickListener { val intent = parentActivityIntent if (shouldUpRecreateTask(intent) || isTaskRoot) diff --git a/mobile/src/main/java/com/github/shadowsocks/ScannerActivity.kt b/mobile/src/main/java/com/github/shadowsocks/ScannerActivity.kt index dacb0a0d..167a8822 100644 --- a/mobile/src/main/java/com/github/shadowsocks/ScannerActivity.kt +++ b/mobile/src/main/java/com/github/shadowsocks/ScannerActivity.kt @@ -32,6 +32,7 @@ import android.support.v7.widget.Toolbar import android.widget.Toast import com.github.shadowsocks.database.Profile import com.github.shadowsocks.database.ProfileManager +import com.github.shadowsocks.utils.resolveResourceId import com.google.zxing.Result import me.dm7.barcodescanner.zxing.ZXingScannerView @@ -54,9 +55,7 @@ class ScannerActivity : AppCompatActivity(), ZXingScannerView.ResultHandler { setContentView(R.layout.layout_scanner) val toolbar = findViewById(R.id.toolbar) toolbar.title = title - val arr = obtainStyledAttributes(intArrayOf(R.attr.homeAsUpIndicator)) - toolbar.navigationIcon = arr.getDrawable(0) - arr.recycle() + toolbar.setNavigationIcon(theme.resolveResourceId(R.attr.homeAsUpIndicator)) toolbar.setNavigationOnClickListener { navigateUp() } scannerView = findViewById(R.id.scanner) if (Build.VERSION.SDK_INT >= 25) getSystemService(ShortcutManager::class.java).reportShortcutUsed("scan") diff --git a/mobile/src/main/java/com/github/shadowsocks/tasker/ConfigActivity.kt b/mobile/src/main/java/com/github/shadowsocks/tasker/ConfigActivity.kt index 1e2f459e..68afd7c4 100644 --- a/mobile/src/main/java/com/github/shadowsocks/tasker/ConfigActivity.kt +++ b/mobile/src/main/java/com/github/shadowsocks/tasker/ConfigActivity.kt @@ -37,6 +37,7 @@ import android.widget.Switch import com.github.shadowsocks.R import com.github.shadowsocks.database.Profile import com.github.shadowsocks.database.ProfileManager +import com.github.shadowsocks.utils.resolveResourceId class ConfigActivity : AppCompatActivity() { inner class ProfileViewHolder(view: View) : RecyclerView.ViewHolder(view), View.OnClickListener { @@ -44,9 +45,7 @@ class ConfigActivity : AppCompatActivity() { private val text = itemView.findViewById(android.R.id.text1) init { - val typedArray = obtainStyledAttributes(intArrayOf(android.R.attr.selectableItemBackground)) - view.setBackgroundResource(typedArray.getResourceId(0, 0)) - typedArray.recycle() + view.setBackgroundResource(theme.resolveResourceId(android.R.attr.selectableItemBackground)) itemView.setOnClickListener(this) } diff --git a/mobile/src/main/java/com/github/shadowsocks/utils/Utils.kt b/mobile/src/main/java/com/github/shadowsocks/utils/Utils.kt index 027e7865..cf0fabee 100644 --- a/mobile/src/main/java/com/github/shadowsocks/utils/Utils.kt +++ b/mobile/src/main/java/com/github/shadowsocks/utils/Utils.kt @@ -3,10 +3,13 @@ package com.github.shadowsocks.utils import android.content.BroadcastReceiver import android.content.Context import android.content.Intent +import android.content.res.Resources import android.os.Build +import android.support.annotation.AttrRes import android.support.v4.app.Fragment import android.support.v4.app.FragmentManager import android.support.v7.util.SortedList +import android.util.TypedValue import com.github.shadowsocks.App.Companion.app import java.lang.reflect.InvocationTargetException import java.net.InetAddress @@ -64,6 +67,15 @@ var Fragment.childFragManager: FragmentManager? get() = childFragmentManager set(value) = fieldChildFragmentManager.set(this, value) +/** + * Based on: https://stackoverflow.com/a/26348729/2245107 + */ +fun Resources.Theme.resolveResourceId(@AttrRes resId: Int): Int { + val typedValue = TypedValue() + if (!resolveAttribute(resId, typedValue, true)) throw Resources.NotFoundException() + return typedValue.resourceId +} + private class SortedListIterable(private val list: SortedList) : Iterable { override fun iterator(): Iterator = SortedListIterator(list) }