From bb575e92cfc1d59e67b3953ce7cce283f4e1fb0f Mon Sep 17 00:00:00 2001 From: arm64v8a <48624112+arm64v8a@users.noreply.github.com> Date: Thu, 13 Apr 2023 14:04:23 +0900 Subject: [PATCH] fix gui --- .../sagernet/ui/ConfigurationFragment.kt | 35 +++++++++++-------- .../sagernet/ui/GroupSettingsActivity.kt | 16 +++++++-- .../sagernet/ui/RouteSettingsActivity.kt | 16 +++++++-- .../ui/profile/ProfileSettingsActivity.kt | 19 ++++++---- .../moe/matsuri/nb4a/ui/UrlTestPreference.kt | 3 ++ .../layout_urltest_preference_dialog.xml | 4 ++- 6 files changed, 67 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/io/nekohasekai/sagernet/ui/ConfigurationFragment.kt b/app/src/main/java/io/nekohasekai/sagernet/ui/ConfigurationFragment.kt index fc8eefe..be4d2a0 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/ui/ConfigurationFragment.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/ui/ConfigurationFragment.kt @@ -550,33 +550,34 @@ class ConfigurationFragment @JvmOverloads constructor( suspend fun update(profile: ProxyEntity) { fragment?.configurationListView?.post { + val context = context ?: return@post + if (!isAdded) return@post + var profileStatusText: String? = null var profileStatusColor = 0 when (profile.status) { -1 -> { profileStatusText = profile.error - profileStatusColor = - requireContext().getColorAttr(android.R.attr.textColorSecondary) + profileStatusColor = context.getColorAttr(android.R.attr.textColorSecondary) } 0 -> { profileStatusText = getString(R.string.connection_test_testing) - profileStatusColor = - requireContext().getColorAttr(android.R.attr.textColorSecondary) + profileStatusColor = context.getColorAttr(android.R.attr.textColorSecondary) } 1 -> { profileStatusText = getString(R.string.available, profile.ping) - profileStatusColor = requireContext().getColour(R.color.material_green_500) + profileStatusColor = context.getColour(R.color.material_green_500) } 2 -> { profileStatusText = profile.error - profileStatusColor = requireContext().getColour(R.color.material_red_500) + profileStatusColor = context.getColour(R.color.material_red_500) } 3 -> { val err = profile.error ?: "" val msg = Protocols.genFriendlyMsg(err) profileStatusText = if (msg != err) msg else getString(R.string.unavailable) - profileStatusColor = requireContext().getColour(R.color.material_red_500) + profileStatusColor = context.getColour(R.color.material_red_500) } } @@ -585,7 +586,7 @@ class ConfigurationFragment @JvmOverloads constructor( append("\n") append( profile.displayType(), - ForegroundColorSpan(requireContext().getProtocolColor(profile.type)), + ForegroundColorSpan(context.getProtocolColor(profile.type)), SPAN_EXCLUSIVE_EXCLUSIVE ) append(" ") @@ -1277,15 +1278,19 @@ class ConfigurationFragment @JvmOverloads constructor( } override suspend fun onUpdated(data: TrafficData) { - val index = configurationIdList.indexOf(data.id) - if (index != -1) { - val holder = layoutManager.findViewByPosition(index) - ?.let { configurationListView.getChildViewHolder(it) } as ConfigurationHolder? - if (holder != null) { - onMainDispatcher { - holder.bind(holder.entity, data) + try { + val index = configurationIdList.indexOf(data.id) + if (index != -1) { + val holder = layoutManager.findViewByPosition(index) + ?.let { configurationListView.getChildViewHolder(it) } as ConfigurationHolder? + if (holder != null) { + onMainDispatcher { + holder.bind(holder.entity, data) + } } } + } catch (e: Exception) { + Logs.w(e) } } diff --git a/app/src/main/java/io/nekohasekai/sagernet/ui/GroupSettingsActivity.kt b/app/src/main/java/io/nekohasekai/sagernet/ui/GroupSettingsActivity.kt index 4d2e1c2..cf27dd0 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/ui/GroupSettingsActivity.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/ui/GroupSettingsActivity.kt @@ -9,6 +9,7 @@ import android.os.Parcelable import android.view.Menu import android.view.MenuItem import android.view.View +import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.annotation.LayoutRes import androidx.appcompat.app.AlertDialog @@ -19,8 +20,10 @@ import com.github.shadowsocks.plugin.fragment.AlertDialogFragment import io.nekohasekai.sagernet.GroupType import io.nekohasekai.sagernet.Key import io.nekohasekai.sagernet.R +import io.nekohasekai.sagernet.SagerNet import io.nekohasekai.sagernet.database.* import io.nekohasekai.sagernet.database.preference.OnPreferenceDataStoreChangeListener +import io.nekohasekai.sagernet.ktx.Logs import io.nekohasekai.sagernet.ktx.applyDefaultValues import io.nekohasekai.sagernet.ktx.onMainDispatcher import io.nekohasekai.sagernet.ktx.runOnDefaultDispatcher @@ -300,8 +303,17 @@ class GroupSettingsActivity( override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { preferenceManager.preferenceDataStore = DataStore.profileCacheStore - activity.apply { - createPreferences(savedInstanceState, rootKey) + try { + activity.apply { + createPreferences(savedInstanceState, rootKey) + } + } catch (e: Exception) { + Toast.makeText( + SagerNet.application, + "Error on createPreferences, please try again.", + Toast.LENGTH_SHORT + ).show() + Logs.e(e) } } diff --git a/app/src/main/java/io/nekohasekai/sagernet/ui/RouteSettingsActivity.kt b/app/src/main/java/io/nekohasekai/sagernet/ui/RouteSettingsActivity.kt index 460a48d..85ef9a7 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/ui/RouteSettingsActivity.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/ui/RouteSettingsActivity.kt @@ -8,6 +8,7 @@ import android.os.Parcelable import android.view.Menu import android.view.MenuItem import android.view.View +import android.widget.Toast import androidx.activity.result.component1 import androidx.activity.result.component2 import androidx.activity.result.contract.ActivityResultContracts @@ -23,11 +24,13 @@ import com.github.shadowsocks.plugin.fragment.AlertDialogFragment import com.google.android.material.dialog.MaterialAlertDialogBuilder import io.nekohasekai.sagernet.Key import io.nekohasekai.sagernet.R +import io.nekohasekai.sagernet.SagerNet import io.nekohasekai.sagernet.database.DataStore import io.nekohasekai.sagernet.database.ProfileManager import io.nekohasekai.sagernet.database.RuleEntity import io.nekohasekai.sagernet.database.SagerDatabase import io.nekohasekai.sagernet.database.preference.OnPreferenceDataStoreChangeListener +import io.nekohasekai.sagernet.ktx.Logs import io.nekohasekai.sagernet.ktx.app import io.nekohasekai.sagernet.ktx.onMainDispatcher import io.nekohasekai.sagernet.ktx.runOnDefaultDispatcher @@ -310,8 +313,17 @@ class RouteSettingsActivity( override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { preferenceManager.preferenceDataStore = DataStore.profileCacheStore - activity.apply { - createPreferences(savedInstanceState, rootKey) + try { + activity.apply { + createPreferences(savedInstanceState, rootKey) + } + } catch (e: Exception) { + Toast.makeText( + SagerNet.application, + "Error on createPreferences, please try again.", + Toast.LENGTH_SHORT + ).show() + Logs.e(e) } } diff --git a/app/src/main/java/io/nekohasekai/sagernet/ui/profile/ProfileSettingsActivity.kt b/app/src/main/java/io/nekohasekai/sagernet/ui/profile/ProfileSettingsActivity.kt index 1d138eb..553ae14 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/ui/profile/ProfileSettingsActivity.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/ui/profile/ProfileSettingsActivity.kt @@ -10,6 +10,7 @@ import android.view.Menu import android.view.MenuItem import android.view.View import android.widget.LinearLayout +import android.widget.Toast import androidx.activity.result.component1 import androidx.activity.result.component2 import androidx.activity.result.contract.ActivityResultContracts @@ -35,10 +36,7 @@ import io.nekohasekai.sagernet.database.SagerDatabase import io.nekohasekai.sagernet.database.preference.OnPreferenceDataStoreChangeListener import io.nekohasekai.sagernet.databinding.LayoutGroupItemBinding import io.nekohasekai.sagernet.fmt.AbstractBean -import io.nekohasekai.sagernet.ktx.applyDefaultValues -import io.nekohasekai.sagernet.ktx.onMainDispatcher -import io.nekohasekai.sagernet.ktx.runOnDefaultDispatcher -import io.nekohasekai.sagernet.ktx.runOnMainDispatcher +import io.nekohasekai.sagernet.ktx.* import io.nekohasekai.sagernet.ui.ThemedActivity import io.nekohasekai.sagernet.widget.ListListener import kotlinx.parcelize.Parcelize @@ -215,8 +213,17 @@ abstract class ProfileSettingsActivity( override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { preferenceManager.preferenceDataStore = DataStore.profileCacheStore - activity.apply { - createPreferences(savedInstanceState, rootKey) + try { + activity.apply { + createPreferences(savedInstanceState, rootKey) + } + } catch (e: Exception) { + Toast.makeText( + SagerNet.application, + "Error on createPreferences, please try again.", + Toast.LENGTH_SHORT + ).show() + Logs.e(e) } } diff --git a/app/src/main/java/moe/matsuri/nb4a/ui/UrlTestPreference.kt b/app/src/main/java/moe/matsuri/nb4a/ui/UrlTestPreference.kt index 7a339b3..4f4f5d3 100644 --- a/app/src/main/java/moe/matsuri/nb4a/ui/UrlTestPreference.kt +++ b/app/src/main/java/moe/matsuri/nb4a/ui/UrlTestPreference.kt @@ -3,7 +3,9 @@ package moe.matsuri.nb4a.ui import android.content.Context import android.util.AttributeSet import android.widget.EditText +import android.widget.LinearLayout import androidx.core.content.res.TypedArrayUtils +import androidx.core.view.isVisible import androidx.preference.EditTextPreference import io.nekohasekai.sagernet.R import io.nekohasekai.sagernet.database.DataStore @@ -30,6 +32,7 @@ constructor( concurrent?.apply { setText(DataStore.connectionTestConcurrent.toString()) } + it.rootView.findViewById(R.id.concurrent_layout)?.isVisible = true } setOnPreferenceChangeListener { _, _ -> diff --git a/app/src/main/res/layout/layout_urltest_preference_dialog.xml b/app/src/main/res/layout/layout_urltest_preference_dialog.xml index d1c2b9e..6562b10 100644 --- a/app/src/main/res/layout/layout_urltest_preference_dialog.xml +++ b/app/src/main/res/layout/layout_urltest_preference_dialog.xml @@ -31,8 +31,10 @@ android:typeface="monospace" /> + android:layout_height="wrap_content" + android:visibility="gone">