Commit fdf2da1b authored by Mygod's avatar Mygod

Immersive theme everywhere

parent 2b5d708e
...@@ -34,11 +34,7 @@ import android.os.Build ...@@ -34,11 +34,7 @@ import android.os.Build
import android.system.Os import android.system.Os
import android.system.OsConstants import android.system.OsConstants
import android.util.TypedValue import android.util.TypedValue
import android.view.View
import android.view.ViewGroup
import androidx.annotation.AttrRes import androidx.annotation.AttrRes
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.updateLayoutParams
import androidx.preference.Preference import androidx.preference.Preference
import com.crashlytics.android.Crashlytics import com.crashlytics.android.Crashlytics
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
...@@ -125,19 +121,6 @@ fun Resources.Theme.resolveResourceId(@AttrRes resId: Int): Int { ...@@ -125,19 +121,6 @@ fun Resources.Theme.resolveResourceId(@AttrRes resId: Int): Int {
val Intent.datas get() = listOfNotNull(data) + (clipData?.asIterable()?.mapNotNull { it.uri } ?: emptyList()) val Intent.datas get() = listOfNotNull(data) + (clipData?.asIterable()?.mapNotNull { it.uri } ?: emptyList())
fun AppCompatActivity.consumeSystemWindowInsetsWithList() = findViewById<View>(android.R.id.content).apply {
setOnApplyWindowInsetsListener { v, insets ->
v.updateLayoutParams<ViewGroup.MarginLayoutParams> {
leftMargin = insets.systemWindowInsetLeft
topMargin = insets.systemWindowInsetTop
rightMargin = insets.systemWindowInsetRight
}
@Suppress("DEPRECATION")
insets.replaceSystemWindowInsets(0, 0, 0, insets.systemWindowInsetBottom)
}
systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
}
fun printLog(t: Throwable) { fun printLog(t: Throwable) {
Crashlytics.logException(t) Crashlytics.logException(t)
t.printStackTrace() t.printStackTrace()
......
...@@ -33,6 +33,8 @@ import android.widget.TextView ...@@ -33,6 +33,8 @@ import android.widget.TextView
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.core.text.HtmlCompat import androidx.core.text.HtmlCompat
import androidx.core.text.parseAsHtml import androidx.core.text.parseAsHtml
import com.github.shadowsocks.widget.ListHolderListener
import com.github.shadowsocks.widget.MainListListener
class AboutFragment : ToolbarFragment() { class AboutFragment : ToolbarFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
...@@ -40,8 +42,10 @@ class AboutFragment : ToolbarFragment() { ...@@ -40,8 +42,10 @@ class AboutFragment : ToolbarFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
view.setOnApplyWindowInsetsListener(ListHolderListener)
toolbar.title = getString(R.string.about_title, BuildConfig.VERSION_NAME) toolbar.title = getString(R.string.about_title, BuildConfig.VERSION_NAME)
view.findViewById<TextView>(R.id.tv_about).apply { view.findViewById<TextView>(R.id.tv_about).apply {
setOnApplyWindowInsetsListener(MainListListener)
text = SpannableStringBuilder(resources.openRawResource(R.raw.about).bufferedReader().readText() text = SpannableStringBuilder(resources.openRawResource(R.raw.about).bufferedReader().readText()
.parseAsHtml(HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM)).apply { .parseAsHtml(HtmlCompat.FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM)).apply {
for (span in getSpans(0, length, URLSpan::class.java)) { for (span in getSpans(0, length, URLSpan::class.java)) {
......
...@@ -42,7 +42,6 @@ import androidx.annotation.UiThread ...@@ -42,7 +42,6 @@ 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.core.util.set
import androidx.core.view.updatePadding
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
...@@ -52,7 +51,8 @@ import com.github.shadowsocks.preference.DataStore ...@@ -52,7 +51,8 @@ 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.github.shadowsocks.utils.SingleInstanceActivity import com.github.shadowsocks.utils.SingleInstanceActivity
import com.github.shadowsocks.utils.consumeSystemWindowInsetsWithList import com.github.shadowsocks.widget.ListHolderListener
import com.github.shadowsocks.widget.ListListener
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
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.*
...@@ -214,7 +214,7 @@ class AppManager : AppCompatActivity() { ...@@ -214,7 +214,7 @@ class AppManager : AppCompatActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
SingleInstanceActivity.register(this) ?: return SingleInstanceActivity.register(this) ?: return
setContentView(R.layout.layout_apps) setContentView(R.layout.layout_apps)
consumeSystemWindowInsetsWithList() ListHolderListener.setup(this)
setSupportActionBar(toolbar) setSupportActionBar(toolbar)
supportActionBar!!.setDisplayHomeAsUpEnabled(true) supportActionBar!!.setDisplayHomeAsUpEnabled(true)
...@@ -237,10 +237,7 @@ class AppManager : AppCompatActivity() { ...@@ -237,10 +237,7 @@ class AppManager : AppCompatActivity() {
} }
initProxiedUids() initProxiedUids()
list.setOnApplyWindowInsetsListener { v, insets -> list.setOnApplyWindowInsetsListener(ListListener)
v.updatePadding(bottom = insets.systemWindowInsetBottom)
insets.consumeSystemWindowInsets()
}
list.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false) list.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)
list.itemAnimator = DefaultItemAnimator() list.itemAnimator = DefaultItemAnimator()
list.adapter = appsAdapter list.adapter = appsAdapter
......
...@@ -24,6 +24,7 @@ import android.os.Bundle ...@@ -24,6 +24,7 @@ import android.os.Bundle
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import com.github.shadowsocks.widget.ListHolderListener
class GlobalSettingsFragment : ToolbarFragment() { class GlobalSettingsFragment : ToolbarFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
...@@ -31,6 +32,7 @@ class GlobalSettingsFragment : ToolbarFragment() { ...@@ -31,6 +32,7 @@ class GlobalSettingsFragment : ToolbarFragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
view.setOnApplyWindowInsetsListener(ListHolderListener)
toolbar.setTitle(R.string.settings) toolbar.setTitle(R.string.settings)
if (savedInstanceState != null) return if (savedInstanceState != null) return
......
...@@ -24,6 +24,7 @@ import android.app.Activity ...@@ -24,6 +24,7 @@ import android.app.Activity
import android.content.Intent import android.content.Intent
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.View
import androidx.preference.EditTextPreference import androidx.preference.EditTextPreference
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
...@@ -38,6 +39,7 @@ import com.github.shadowsocks.preference.EditTextPreferenceModifiers ...@@ -38,6 +39,7 @@ import com.github.shadowsocks.preference.EditTextPreferenceModifiers
import com.github.shadowsocks.preference.HostsSummaryProvider import com.github.shadowsocks.preference.HostsSummaryProvider
import com.github.shadowsocks.utils.readableMessage import com.github.shadowsocks.utils.readableMessage
import com.github.shadowsocks.utils.remove import com.github.shadowsocks.utils.remove
import com.github.shadowsocks.widget.MainListListener
class GlobalSettingsPreferenceFragment : PreferenceFragmentCompat() { class GlobalSettingsPreferenceFragment : PreferenceFragmentCompat() {
companion object { companion object {
...@@ -115,6 +117,11 @@ class GlobalSettingsPreferenceFragment : PreferenceFragmentCompat() { ...@@ -115,6 +117,11 @@ class GlobalSettingsPreferenceFragment : PreferenceFragmentCompat() {
serviceMode.onPreferenceChangeListener = onServiceModeChange serviceMode.onPreferenceChangeListener = onServiceModeChange
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
listView.setOnApplyWindowInsetsListener(MainListListener)
}
override fun onDisplayPreferenceDialog(preference: Preference?) { override fun onDisplayPreferenceDialog(preference: Preference?) {
if (preference == hosts) BrowsableEditTextPreferenceDialogFragment().apply { if (preference == hosts) BrowsableEditTextPreferenceDialogFragment().apply {
setKey(hosts.key) setKey(hosts.key)
......
...@@ -29,10 +29,7 @@ import android.os.Bundle ...@@ -29,10 +29,7 @@ import android.os.Bundle
import android.os.Handler import android.os.Handler
import android.os.RemoteException import android.os.RemoteException
import android.util.Log import android.util.Log
import android.view.KeyCharacterMap import android.view.*
import android.view.KeyEvent
import android.view.MenuItem
import android.view.View
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.browser.customtabs.CustomTabColorSchemeParams import androidx.browser.customtabs.CustomTabColorSchemeParams
import androidx.browser.customtabs.CustomTabsIntent import androidx.browser.customtabs.CustomTabsIntent
...@@ -40,6 +37,7 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout ...@@ -40,6 +37,7 @@ import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.core.net.toUri import androidx.core.net.toUri
import androidx.core.view.GravityCompat import androidx.core.view.GravityCompat
import androidx.core.view.updateLayoutParams
import androidx.drawerlayout.widget.DrawerLayout import androidx.drawerlayout.widget.DrawerLayout
import androidx.preference.PreferenceDataStore import androidx.preference.PreferenceDataStore
import com.crashlytics.android.Crashlytics import com.crashlytics.android.Crashlytics
...@@ -170,6 +168,13 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref ...@@ -170,6 +168,13 @@ class MainActivity : AppCompatActivity(), ShadowsocksConnection.Callback, OnPref
fab = findViewById(R.id.fab) fab = findViewById(R.id.fab)
fab.setOnClickListener { toggle() } fab.setOnClickListener { toggle() }
fab.setOnApplyWindowInsetsListener { view, insets ->
view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
bottomMargin = insets.systemWindowInsetBottom +
resources.getDimensionPixelOffset(R.dimen.mtrl_bottomappbar_fab_bottom_margin)
}
insets
}
changeState(BaseService.State.Idle) // reset everything to init state changeState(BaseService.State.Idle) // reset everything to init state
connection.connect(this, this) connection.connect(this, this)
......
...@@ -33,7 +33,7 @@ import com.github.shadowsocks.plugin.Empty ...@@ -33,7 +33,7 @@ import com.github.shadowsocks.plugin.Empty
import com.github.shadowsocks.plugin.PluginContract import com.github.shadowsocks.plugin.PluginContract
import com.github.shadowsocks.preference.DataStore import com.github.shadowsocks.preference.DataStore
import com.github.shadowsocks.utils.SingleInstanceActivity import com.github.shadowsocks.utils.SingleInstanceActivity
import com.github.shadowsocks.utils.consumeSystemWindowInsetsWithList import com.github.shadowsocks.widget.ListHolderListener
class ProfileConfigActivity : AppCompatActivity() { class ProfileConfigActivity : AppCompatActivity() {
companion object { companion object {
...@@ -55,7 +55,7 @@ class ProfileConfigActivity : AppCompatActivity() { ...@@ -55,7 +55,7 @@ class ProfileConfigActivity : AppCompatActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
SingleInstanceActivity.register(this) ?: return SingleInstanceActivity.register(this) ?: return
setContentView(R.layout.layout_profile_config) setContentView(R.layout.layout_profile_config)
consumeSystemWindowInsetsWithList() ListHolderListener.setup(this)
setSupportActionBar(findViewById(R.id.toolbar)) setSupportActionBar(findViewById(R.id.toolbar))
supportActionBar!!.apply { supportActionBar!!.apply {
setDisplayHomeAsUpEnabled(true) setDisplayHomeAsUpEnabled(true)
......
...@@ -30,7 +30,6 @@ import android.os.Parcelable ...@@ -30,7 +30,6 @@ import android.os.Parcelable
import android.view.MenuItem import android.view.MenuItem
import android.view.View import android.view.View
import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AlertDialog
import androidx.core.view.updatePadding
import androidx.preference.* import androidx.preference.*
import com.github.shadowsocks.Core.app import com.github.shadowsocks.Core.app
import com.github.shadowsocks.database.Profile import com.github.shadowsocks.database.Profile
...@@ -38,6 +37,7 @@ import com.github.shadowsocks.database.ProfileManager ...@@ -38,6 +37,7 @@ import com.github.shadowsocks.database.ProfileManager
import com.github.shadowsocks.plugin.* import com.github.shadowsocks.plugin.*
import com.github.shadowsocks.preference.* import com.github.shadowsocks.preference.*
import com.github.shadowsocks.utils.* import com.github.shadowsocks.utils.*
import com.github.shadowsocks.widget.ListListener
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import kotlinx.android.parcel.Parcelize import kotlinx.android.parcel.Parcelize
...@@ -116,10 +116,7 @@ class ProfileConfigFragment : PreferenceFragmentCompat(), ...@@ -116,10 +116,7 @@ class ProfileConfigFragment : PreferenceFragmentCompat(),
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
listView.setOnApplyWindowInsetsListener { v, insets -> listView.setOnApplyWindowInsetsListener(ListListener)
v.updatePadding(bottom = insets.systemWindowInsetBottom)
insets.consumeSystemWindowInsets()
}
} }
private fun initPlugins() { private fun initPlugins() {
......
...@@ -22,7 +22,10 @@ package com.github.shadowsocks ...@@ -22,7 +22,10 @@ package com.github.shadowsocks
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.content.* import android.content.ActivityNotFoundException
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Intent
import android.os.Bundle import android.os.Bundle
import android.text.format.Formatter import android.text.format.Formatter
import android.util.LongSparseArray import android.util.LongSparseArray
...@@ -47,6 +50,8 @@ import com.github.shadowsocks.utils.Action ...@@ -47,6 +50,8 @@ import com.github.shadowsocks.utils.Action
import com.github.shadowsocks.utils.datas import com.github.shadowsocks.utils.datas
import com.github.shadowsocks.utils.printLog import com.github.shadowsocks.utils.printLog
import com.github.shadowsocks.utils.readableMessage import com.github.shadowsocks.utils.readableMessage
import com.github.shadowsocks.widget.ListHolderListener
import com.github.shadowsocks.widget.MainListListener
import com.github.shadowsocks.widget.UndoSnackbarManager import com.github.shadowsocks.widget.UndoSnackbarManager
import com.google.android.gms.ads.AdRequest import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.AdSize import com.google.android.gms.ads.AdSize
...@@ -301,6 +306,7 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener { ...@@ -301,6 +306,7 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
view.setOnApplyWindowInsetsListener(ListHolderListener)
toolbar.setTitle(R.string.profiles) toolbar.setTitle(R.string.profiles)
toolbar.inflateMenu(R.menu.profile_manager_menu) toolbar.inflateMenu(R.menu.profile_manager_menu)
toolbar.setOnMenuItemClickListener(this) toolbar.setOnMenuItemClickListener(this)
...@@ -309,6 +315,7 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener { ...@@ -309,6 +315,7 @@ class ProfilesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener {
ProfileManager.ensureNotEmpty() ProfileManager.ensureNotEmpty()
val profilesList = view.findViewById<RecyclerView>(R.id.list) val profilesList = view.findViewById<RecyclerView>(R.id.list)
profilesList.setOnApplyWindowInsetsListener(MainListListener)
val layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false) val layoutManager = LinearLayoutManager(context, RecyclerView.VERTICAL, false)
profilesList.layoutManager = layoutManager profilesList.layoutManager = layoutManager
profilesList.addItemDecoration(DividerItemDecoration(context, layoutManager.orientation)) profilesList.addItemDecoration(DividerItemDecoration(context, layoutManager.orientation))
......
...@@ -28,7 +28,6 @@ import android.view.ViewGroup ...@@ -28,7 +28,6 @@ import android.view.ViewGroup
import android.widget.CheckedTextView import android.widget.CheckedTextView
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.core.view.updatePadding
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
...@@ -37,8 +36,9 @@ import com.github.shadowsocks.database.ProfileManager ...@@ -37,8 +36,9 @@ import com.github.shadowsocks.database.ProfileManager
import com.github.shadowsocks.plugin.PluginConfiguration import com.github.shadowsocks.plugin.PluginConfiguration
import com.github.shadowsocks.preference.DataStore import com.github.shadowsocks.preference.DataStore
import com.github.shadowsocks.utils.SingleInstanceActivity import com.github.shadowsocks.utils.SingleInstanceActivity
import com.github.shadowsocks.utils.consumeSystemWindowInsetsWithList
import com.github.shadowsocks.utils.resolveResourceId import com.github.shadowsocks.utils.resolveResourceId
import com.github.shadowsocks.widget.ListHolderListener
import com.github.shadowsocks.widget.ListListener
class UdpFallbackProfileActivity : AppCompatActivity() { class UdpFallbackProfileActivity : AppCompatActivity() {
inner class ProfileViewHolder(view: View) : RecyclerView.ViewHolder(view), View.OnClickListener { inner class ProfileViewHolder(view: View) : RecyclerView.ViewHolder(view), View.OnClickListener {
...@@ -87,7 +87,7 @@ class UdpFallbackProfileActivity : AppCompatActivity() { ...@@ -87,7 +87,7 @@ class UdpFallbackProfileActivity : AppCompatActivity() {
} }
SingleInstanceActivity.register(this) ?: return SingleInstanceActivity.register(this) ?: return
setContentView(R.layout.layout_udp_fallback) setContentView(R.layout.layout_udp_fallback)
consumeSystemWindowInsetsWithList() ListHolderListener.setup(this)
val toolbar = findViewById<Toolbar>(R.id.toolbar) val toolbar = findViewById<Toolbar>(R.id.toolbar)
toolbar.setTitle(R.string.udp_fallback) toolbar.setTitle(R.string.udp_fallback)
...@@ -95,10 +95,7 @@ class UdpFallbackProfileActivity : AppCompatActivity() { ...@@ -95,10 +95,7 @@ class UdpFallbackProfileActivity : AppCompatActivity() {
toolbar.setNavigationOnClickListener { finish() } toolbar.setNavigationOnClickListener { finish() }
findViewById<RecyclerView>(R.id.list).apply { findViewById<RecyclerView>(R.id.list).apply {
setOnApplyWindowInsetsListener { v, insets -> setOnApplyWindowInsetsListener(ListListener)
v.updatePadding(bottom = insets.systemWindowInsetBottom)
insets.consumeSystemWindowInsets()
}
itemAnimator = DefaultItemAnimator() itemAnimator = DefaultItemAnimator()
adapter = profilesAdapter adapter = profilesAdapter
layoutManager = LinearLayoutManager(this@UdpFallbackProfileActivity, RecyclerView.VERTICAL, false).apply { layoutManager = LinearLayoutManager(this@UdpFallbackProfileActivity, RecyclerView.VERTICAL, false).apply {
......
...@@ -50,6 +50,8 @@ import com.github.shadowsocks.plugin.AlertDialogFragment ...@@ -50,6 +50,8 @@ import com.github.shadowsocks.plugin.AlertDialogFragment
import com.github.shadowsocks.utils.asIterable import com.github.shadowsocks.utils.asIterable
import com.github.shadowsocks.utils.readableMessage import com.github.shadowsocks.utils.readableMessage
import com.github.shadowsocks.utils.resolveResourceId import com.github.shadowsocks.utils.resolveResourceId
import com.github.shadowsocks.widget.ListHolderListener
import com.github.shadowsocks.widget.MainListListener
import com.github.shadowsocks.widget.UndoSnackbarManager import com.github.shadowsocks.widget.UndoSnackbarManager
import com.google.android.material.textfield.TextInputLayout import com.google.android.material.textfield.TextInputLayout
import kotlinx.android.parcel.Parcelize import kotlinx.android.parcel.Parcelize
...@@ -373,6 +375,7 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener, ...@@ -373,6 +375,7 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener,
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
view.setOnApplyWindowInsetsListener(ListHolderListener)
if (savedInstanceState != null) { if (savedInstanceState != null) {
selectedItems.addAll(savedInstanceState.getStringArray(SELECTED_SUBNETS) selectedItems.addAll(savedInstanceState.getStringArray(SELECTED_SUBNETS)
?.mapNotNull(Subnet.Companion::fromString) ?: listOf()) ?.mapNotNull(Subnet.Companion::fromString) ?: listOf())
...@@ -387,6 +390,7 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener, ...@@ -387,6 +390,7 @@ class CustomRulesFragment : ToolbarFragment(), Toolbar.OnMenuItemClickListener,
toolbar.setOnMenuItemClickListener(this) toolbar.setOnMenuItemClickListener(this)
val activity = activity as MainActivity val activity = activity as MainActivity
list = view.findViewById(R.id.list) list = view.findViewById(R.id.list)
list.setOnApplyWindowInsetsListener(MainListListener)
list.layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL, false) list.layoutManager = LinearLayoutManager(activity, RecyclerView.VERTICAL, false)
list.itemAnimator = DefaultItemAnimator() list.itemAnimator = DefaultItemAnimator()
list.adapter = adapter list.adapter = adapter
......
...@@ -30,15 +30,15 @@ import android.widget.CheckedTextView ...@@ -30,15 +30,15 @@ import android.widget.CheckedTextView
import android.widget.Switch import android.widget.Switch
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar import androidx.appcompat.widget.Toolbar
import androidx.core.view.updatePadding
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
import com.github.shadowsocks.R import com.github.shadowsocks.R
import com.github.shadowsocks.database.Profile import com.github.shadowsocks.database.Profile
import com.github.shadowsocks.database.ProfileManager import com.github.shadowsocks.database.ProfileManager
import com.github.shadowsocks.utils.consumeSystemWindowInsetsWithList
import com.github.shadowsocks.utils.resolveResourceId import com.github.shadowsocks.utils.resolveResourceId
import com.github.shadowsocks.widget.ListHolderListener
import com.github.shadowsocks.widget.ListListener
class ConfigActivity : AppCompatActivity() { class ConfigActivity : AppCompatActivity() {
inner class ProfileViewHolder(view: View) : RecyclerView.ViewHolder(view), View.OnClickListener { inner class ProfileViewHolder(view: View) : RecyclerView.ViewHolder(view), View.OnClickListener {
...@@ -94,7 +94,7 @@ class ConfigActivity : AppCompatActivity() { ...@@ -94,7 +94,7 @@ class ConfigActivity : AppCompatActivity() {
} }
taskerOption = Settings.fromIntent(intent) taskerOption = Settings.fromIntent(intent)
setContentView(R.layout.layout_tasker) setContentView(R.layout.layout_tasker)
consumeSystemWindowInsetsWithList() ListHolderListener.setup(this)
val toolbar = findViewById<Toolbar>(R.id.toolbar) val toolbar = findViewById<Toolbar>(R.id.toolbar)
toolbar.setTitle(R.string.app_name) toolbar.setTitle(R.string.app_name)
...@@ -104,10 +104,7 @@ class ConfigActivity : AppCompatActivity() { ...@@ -104,10 +104,7 @@ class ConfigActivity : AppCompatActivity() {
switch = findViewById(R.id.serviceSwitch) switch = findViewById(R.id.serviceSwitch)
switch.isChecked = taskerOption.switchOn switch.isChecked = taskerOption.switchOn
findViewById<RecyclerView>(R.id.list).apply { findViewById<RecyclerView>(R.id.list).apply {
setOnApplyWindowInsetsListener { v, insets -> setOnApplyWindowInsetsListener(ListListener)
v.updatePadding(bottom = insets.systemWindowInsetBottom)
insets.consumeSystemWindowInsets()
}
itemAnimator = DefaultItemAnimator() itemAnimator = DefaultItemAnimator()
adapter = profilesAdapter adapter = profilesAdapter
layoutManager = LinearLayoutManager(this@ConfigActivity, RecyclerView.VERTICAL, false).apply { layoutManager = LinearLayoutManager(this@ConfigActivity, RecyclerView.VERTICAL, false).apply {
......
/*******************************************************************************
* *
* Copyright (C) 2019 by Max Lv <max.c.lv@gmail.com> *
* Copyright (C) 2019 by Mygod Studio <contact-shadowsocks-android@mygod.be> *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
*******************************************************************************/
package com.github.shadowsocks.widget
import android.view.View
import android.view.WindowInsets
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.updatePadding
import com.github.shadowsocks.R
object ListHolderListener : View.OnApplyWindowInsetsListener {
override fun onApplyWindowInsets(view: View, insets: WindowInsets): WindowInsets {
view.updatePadding(insets.systemWindowInsetLeft, insets.systemWindowInsetTop, insets.systemWindowInsetRight)
@Suppress("DEPRECATION")
return insets.replaceSystemWindowInsets(0, 0, 0, insets.systemWindowInsetBottom)
}
fun setup(activity: AppCompatActivity) = activity.findViewById<View>(android.R.id.content).apply {
setOnApplyWindowInsetsListener(ListHolderListener)
systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
}
}
object MainListListener : View.OnApplyWindowInsetsListener {
override fun onApplyWindowInsets(view: View, insets: WindowInsets) = insets.apply {
view.updatePadding(bottom = view.resources.getDimensionPixelOffset(R.dimen.main_list_padding_bottom) +
systemWindowInsetBottom)
}
}
object ListListener : View.OnApplyWindowInsetsListener {
override fun onApplyWindowInsets(view: View, insets: WindowInsets) = insets.apply {
view.updatePadding(bottom = systemWindowInsetBottom)
}
}
...@@ -4,7 +4,8 @@ ...@@ -4,7 +4,8 @@
android:orientation="vertical" android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:id="@+id/about_container"> android:id="@+id/about_container"
android:fitsSystemWindows="true">
<include layout="@layout/toolbar_light_dark"/> <include layout="@layout/toolbar_light_dark"/>
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView
android:layout_width="match_parent" android:layout_width="match_parent"
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical"> android:orientation="vertical">
<include layout="@layout/toolbar_light_dark"/> <include layout="@layout/toolbar_light_dark"/>
<FrameLayout android:layout_width="match_parent" <FrameLayout android:layout_width="match_parent"
...@@ -13,7 +14,6 @@ ...@@ -13,7 +14,6 @@
android:id="@+id/list" android:id="@+id/list"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:paddingBottom="32dp"
android:clipToPadding="false" android:clipToPadding="false"
app:fastScrollEnabled="true" app:fastScrollEnabled="true"
app:fastScrollHorizontalThumbDrawable="@drawable/fastscroll_thumb" app:fastScrollHorizontalThumbDrawable="@drawable/fastscroll_thumb"
......
...@@ -2,7 +2,8 @@ ...@@ -2,7 +2,8 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:fitsSystemWindows="true">
<include layout="@layout/toolbar_light_dark" /> <include layout="@layout/toolbar_light_dark" />
<FrameLayout android:id="@+id/content" <FrameLayout android:id="@+id/content"
android:layout_width="match_parent" android:layout_width="match_parent"
......
...@@ -3,14 +3,14 @@ ...@@ -3,14 +3,14 @@
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical"
android:fitsSystemWindows="true">
<include layout="@layout/toolbar_light_dark"/> <include layout="@layout/toolbar_light_dark"/>
<androidx.recyclerview.widget.RecyclerView android:id="@+id/list" <androidx.recyclerview.widget.RecyclerView android:id="@+id/list"
tools:listitem="@layout/layout_profile" tools:listitem="@layout/layout_profile"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1" android:layout_weight="1"
android:paddingBottom="88dp"
android:scrollbars="vertical" android:scrollbars="vertical"
android:clipChildren="false" android:clipChildren="false"
android:clipToPadding="false"/> android:clipToPadding="false"/>
......
...@@ -6,19 +6,19 @@ ...@@ -6,19 +6,19 @@
android:id="@+id/drawer" android:id="@+id/drawer"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/color_primary"
android:fitsSystemWindows="true"> android:fitsSystemWindows="true">
<androidx.coordinatorlayout.widget.CoordinatorLayout <androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/snackbar" android:id="@+id/snackbar"
android:background="?android:attr/windowBackground"
android:clipChildren="false" android:clipChildren="false"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:fitsSystemWindows="true">
<FrameLayout <androidx.coordinatorlayout.widget.CoordinatorLayout
android:id="@+id/fragment_holder" android:id="@+id/fragment_holder"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"/> android:layout_height="match_parent"
android:fitsSystemWindows="true"/>
<com.github.shadowsocks.widget.ServiceButton <com.github.shadowsocks.widget.ServiceButton
android:id="@+id/fab" android:id="@+id/fab"
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:elevation="6dp" android:elevation="6dp"
android:nextFocusDown="@+id/stats" android:nextFocusDown="@+id/stats"
app:layout_dodgeInsetEdges="top"
app:layout_anchor="@id/stats" app:layout_anchor="@id/stats"
app:backgroundTint="@color/background_service" app:backgroundTint="@color/background_service"
app:fabSize="normal" app:fabSize="normal"
...@@ -38,6 +37,7 @@ ...@@ -38,6 +37,7 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom" android:layout_gravity="bottom"
android:fitsSystemWindows="true"
android:nextFocusUp="@+id/fab" android:nextFocusUp="@+id/fab"
app:backgroundTint="@color/background_stat" app:backgroundTint="@color/background_stat"
app:contentInsetStart="0dp" app:contentInsetStart="0dp"
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
<GridLayout <GridLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"
android:orientation="vertical" android:orientation="vertical"
android:padding="16dip"> android:padding="16dip">
...@@ -128,6 +128,7 @@ ...@@ -128,6 +128,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_gravity="start" android:layout_gravity="start"
app:insetForeground="@null"
app:itemIconTint="@color/nav_item_tint" app:itemIconTint="@color/nav_item_tint"
app:itemTextColor="@color/nav_item_tint" app:itemTextColor="@color/nav_item_tint"
app:headerLayout="@layout/navigation_header" app:headerLayout="@layout/navigation_header"
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
<resources> <resources>
<dimen name="qr_code_size">250dp</dimen> <dimen name="qr_code_size">250dp</dimen>
<dimen name="profile_padding">8dp</dimen> <dimen name="profile_padding">8dp</dimen>
<dimen name="main_list_padding_bottom">88dp</dimen>
<dimen name="bottom_sheet_padding">8dp</dimen> <dimen name="bottom_sheet_padding">8dp</dimen>
<dimen name="stats_bar_scroll_threshold">4dp</dimen> <dimen name="stats_bar_scroll_threshold">4dp</dimen>
</resources> </resources>
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"> <resources>
<style name="Theme.Shadowsocks.Immersive.Navigation"> <style name="Theme.Shadowsocks.Immersive.Navigation">
<item name="android:statusBarColor">@android:color/transparent</item> <item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:enforceNavigationBarContrast" tools:targetApi="q">false</item>
</style> </style>
</resources> </resources>
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