mirror of
https://github.com/MetaCubeX/ClashMetaForAndroid.git
synced 2024-11-25 23:06:09 +03:00
add setting meta features
This commit is contained in:
parent
41127e9312
commit
34f1e6f984
@ -136,6 +136,11 @@
|
||||
android:configChanges="uiMode"
|
||||
android:exported="false"
|
||||
android:label="@string/override" />
|
||||
<activity
|
||||
android:name=".MetaFeatureSettingsActivity"
|
||||
android:configChanges="uiMode"
|
||||
android:exported="false"
|
||||
android:label="@string/meta_features" />
|
||||
<activity
|
||||
android:name=".AccessControlActivity"
|
||||
android:configChanges="uiMode"
|
||||
|
@ -0,0 +1,49 @@
|
||||
package com.github.kr328.clash
|
||||
|
||||
import com.github.kr328.clash.core.Clash
|
||||
import com.github.kr328.clash.design.MetaFeatureSettingsDesign
|
||||
import com.github.kr328.clash.util.withClash
|
||||
import kotlinx.coroutines.isActive
|
||||
import kotlinx.coroutines.selects.select
|
||||
|
||||
class MetaFeatureSettingsActivity : BaseActivity<MetaFeatureSettingsDesign>() {
|
||||
override suspend fun main() {
|
||||
val configuration = withClash { queryOverride(Clash.OverrideSlot.Persist) }
|
||||
|
||||
defer {
|
||||
withClash {
|
||||
patchOverride(Clash.OverrideSlot.Persist, configuration)
|
||||
}
|
||||
}
|
||||
|
||||
val design = MetaFeatureSettingsDesign(
|
||||
this,
|
||||
configuration
|
||||
)
|
||||
|
||||
setContentDesign(design)
|
||||
|
||||
while (isActive) {
|
||||
select<Unit> {
|
||||
events.onReceive {
|
||||
|
||||
}
|
||||
design.requests.onReceive {
|
||||
when (it) {
|
||||
MetaFeatureSettingsDesign.Request.ResetOverride -> {
|
||||
if (design.requestResetConfirm()) {
|
||||
defer {
|
||||
withClash {
|
||||
clearOverride(Clash.OverrideSlot.Persist)
|
||||
}
|
||||
}
|
||||
|
||||
finish()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -24,6 +24,8 @@ class SettingsActivity : BaseActivity<SettingsDesign>() {
|
||||
startActivity(NetworkSettingsActivity::class.intent)
|
||||
SettingsDesign.Request.StartOverride ->
|
||||
startActivity(OverrideSettingsActivity::class.intent)
|
||||
SettingsDesign.Request.StartMetaFeature ->
|
||||
startActivity(MetaFeatureSettingsActivity::class.intent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -44,11 +44,32 @@ data class ConfigurationOverride(
|
||||
@SerialName("hosts")
|
||||
var hosts: Map<String, String>? = null,
|
||||
|
||||
@SerialName("force-cert-verify")
|
||||
var forceCertVeriy: Boolean? = null,
|
||||
|
||||
@SerialName("unified-delay")
|
||||
var unifiedDelay: Boolean? = null,
|
||||
|
||||
@SerialName("geodata-mode")
|
||||
var geodataMode: Boolean? = null,
|
||||
|
||||
@SerialName("tcp-concurrent")
|
||||
var tcpConcurrent: Boolean? = null,
|
||||
|
||||
@SerialName("enable-process")
|
||||
var enableProcess: Boolean? = null,
|
||||
|
||||
@SerialName("dns")
|
||||
val dns: Dns = Dns(),
|
||||
|
||||
@SerialName("clash-for-android")
|
||||
val app: App = App(),
|
||||
|
||||
@SerialName("sniffer")
|
||||
val sniffer: Sniffer = Sniffer(),
|
||||
|
||||
@SerialName("geox-url")
|
||||
val geoxurl: GeoXUrl = GeoXUrl(),
|
||||
) : Parcelable {
|
||||
@Serializable
|
||||
data class Dns(
|
||||
@ -119,6 +140,33 @@ data class ConfigurationOverride(
|
||||
FakeIp,
|
||||
}
|
||||
|
||||
@Serializable
|
||||
data class Sniffer(
|
||||
@SerialName("enable")
|
||||
var enable: Boolean? = null,
|
||||
|
||||
@SerialName("sniffing")
|
||||
var sniffing: List<String>? = null,
|
||||
|
||||
@SerialName("force-domain")
|
||||
var forceDomain: List<String>? = null,
|
||||
|
||||
@SerialName("skip-domain")
|
||||
var skipDomain: List<String>? = null,
|
||||
)
|
||||
|
||||
@Serializable
|
||||
data class GeoXUrl(
|
||||
@SerialName("geoip")
|
||||
var geoip: String? = null,
|
||||
|
||||
@SerialName("mmdb")
|
||||
var mmdb: String? = null,
|
||||
|
||||
@SerialName("geosite")
|
||||
var geosite: String? = null,
|
||||
)
|
||||
|
||||
override fun writeToParcel(parcel: Parcel, flags: Int) {
|
||||
Parcelizer.encodeToParcel(serializer(), parcel, this)
|
||||
}
|
||||
|
@ -3,7 +3,6 @@ package com.github.kr328.clash.design
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import android.view.View
|
||||
import com.github.kr328.clash.common.compat.preferredLocale
|
||||
import com.github.kr328.clash.design.databinding.DesignSettingsCommonBinding
|
||||
import com.github.kr328.clash.design.preference.category
|
||||
import com.github.kr328.clash.design.preference.clickable
|
||||
@ -45,60 +44,32 @@ class HelpDesign(
|
||||
}
|
||||
}
|
||||
|
||||
category(R.string.feedback)
|
||||
|
||||
if (BuildConfig.PREMIUM) {
|
||||
clickable(
|
||||
title = R.string.google_play,
|
||||
summary = R.string.google_play_url
|
||||
title = R.string.clash_meta_wiki,
|
||||
summary = R.string.clash_meta_wiki_url
|
||||
) {
|
||||
clicked {
|
||||
openLink(Uri.parse(context.getString(R.string.google_play_url)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
clickable(
|
||||
title = R.string.github_issues,
|
||||
summary = R.string.github_issues_url
|
||||
) {
|
||||
clicked {
|
||||
openLink(Uri.parse(context.getString(R.string.github_issues_url)))
|
||||
openLink(Uri.parse(context.getString(R.string.clash_meta_wiki_url)))
|
||||
}
|
||||
}
|
||||
|
||||
if (!BuildConfig.PREMIUM) {
|
||||
category(R.string.sources)
|
||||
|
||||
clickable(
|
||||
title = R.string.clash_for_android,
|
||||
summary = R.string.github_url
|
||||
title = R.string.clash_meta_for_android,
|
||||
summary = R.string.meta_github_url
|
||||
) {
|
||||
clicked {
|
||||
openLink(Uri.parse(context.getString(R.string.github_url)))
|
||||
openLink(Uri.parse(context.getString(R.string.meta_github_url)))
|
||||
}
|
||||
}
|
||||
|
||||
clickable(
|
||||
title = R.string.clash_core,
|
||||
summary = R.string.clash_core_url
|
||||
title = R.string.clash_meta_core,
|
||||
summary = R.string.clash_meta_core_url
|
||||
) {
|
||||
clicked {
|
||||
openLink(Uri.parse(context.getString(R.string.clash_core_url)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (context.resources.configuration.preferredLocale.language == "zh") {
|
||||
category(R.string.donate)
|
||||
|
||||
clickable(
|
||||
title = R.string.donate,
|
||||
summary = R.string.donate_url
|
||||
) {
|
||||
clicked {
|
||||
openLink(Uri.parse(context.getString(R.string.donate_url)))
|
||||
}
|
||||
openLink(Uri.parse(context.getString(R.string.clash_meta_core_url)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,198 @@
|
||||
package com.github.kr328.clash.design
|
||||
|
||||
import android.content.Context
|
||||
import android.view.View
|
||||
import com.github.kr328.clash.core.model.ConfigurationOverride
|
||||
import com.github.kr328.clash.design.databinding.DesignSettingsMetaFeatureBinding
|
||||
import com.github.kr328.clash.design.preference.*
|
||||
import com.github.kr328.clash.design.util.*
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import kotlinx.coroutines.suspendCancellableCoroutine
|
||||
import kotlin.coroutines.resume
|
||||
|
||||
class MetaFeatureSettingsDesign(
|
||||
context: Context,
|
||||
configuration: ConfigurationOverride
|
||||
) : Design<MetaFeatureSettingsDesign.Request>(context) {
|
||||
enum class Request {
|
||||
ResetOverride
|
||||
}
|
||||
|
||||
private val binding = DesignSettingsMetaFeatureBinding
|
||||
.inflate(context.layoutInflater, context.root, false)
|
||||
|
||||
override val root: View
|
||||
get() = binding.root
|
||||
|
||||
suspend fun requestResetConfirm(): Boolean {
|
||||
return suspendCancellableCoroutine { ctx ->
|
||||
val dialog = MaterialAlertDialogBuilder(context)
|
||||
.setTitle(R.string.reset_override_settings)
|
||||
.setMessage(R.string.reset_override_settings_message)
|
||||
.setPositiveButton(R.string.ok) { _, _ -> ctx.resume(true) }
|
||||
.setNegativeButton(R.string.cancel) { _, _ -> }
|
||||
.show()
|
||||
|
||||
dialog.setOnDismissListener {
|
||||
if (!ctx.isCompleted)
|
||||
ctx.resume(false)
|
||||
}
|
||||
|
||||
ctx.invokeOnCancellation {
|
||||
dialog.dismiss()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
init {
|
||||
binding.self = this
|
||||
|
||||
binding.activityBarLayout.applyFrom(context)
|
||||
|
||||
binding.scrollRoot.bindAppBarElevation(binding.activityBarLayout)
|
||||
|
||||
val booleanValues: Array<Boolean?> = arrayOf(
|
||||
null,
|
||||
true,
|
||||
false
|
||||
)
|
||||
val booleanValuesText: Array<Int> = arrayOf(
|
||||
R.string.dont_modify,
|
||||
R.string.enabled,
|
||||
R.string.disabled
|
||||
)
|
||||
|
||||
val screen = preferenceScreen(context) {
|
||||
category(R.string.meta_features)
|
||||
|
||||
selectableList(
|
||||
value = configuration::forceCertVeriy,
|
||||
values = booleanValues,
|
||||
valuesText = booleanValuesText,
|
||||
title = R.string.force_cert_verify,
|
||||
)
|
||||
|
||||
selectableList(
|
||||
value = configuration::unifiedDelay,
|
||||
values = booleanValues,
|
||||
valuesText = booleanValuesText,
|
||||
title = R.string.unified_delay,
|
||||
)
|
||||
|
||||
selectableList(
|
||||
value = configuration::geodataMode,
|
||||
values = booleanValues,
|
||||
valuesText = booleanValuesText,
|
||||
title = R.string.geodata_mode,
|
||||
)
|
||||
|
||||
selectableList(
|
||||
value = configuration::tcpConcurrent,
|
||||
values = booleanValues,
|
||||
valuesText = booleanValuesText,
|
||||
title = R.string.tcp_concurrent,
|
||||
)
|
||||
|
||||
selectableList(
|
||||
value = configuration::enableProcess,
|
||||
values = booleanValues,
|
||||
valuesText = booleanValuesText,
|
||||
title = R.string.enable_process,
|
||||
)
|
||||
|
||||
category(R.string.sniffer_setting)
|
||||
|
||||
val snifferDependencies: MutableList<Preference> = mutableListOf()
|
||||
|
||||
val sniffer = selectableList(
|
||||
value = configuration.sniffer::enable,
|
||||
values = arrayOf(
|
||||
null,
|
||||
true,
|
||||
false
|
||||
),
|
||||
valuesText = arrayOf(
|
||||
R.string.sniffer_config,
|
||||
R.string.sniffer_override,
|
||||
R.string.disable_sniffer,
|
||||
),
|
||||
title = R.string.strategy
|
||||
) {
|
||||
listener = OnChangedListener {
|
||||
if (configuration.sniffer.enable == false) {
|
||||
snifferDependencies.forEach {
|
||||
it.enabled = false
|
||||
}
|
||||
} else {
|
||||
snifferDependencies.forEach {
|
||||
it.enabled = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
editableTextList(
|
||||
value = configuration.sniffer::sniffing,
|
||||
adapter = TextAdapter.String,
|
||||
title = R.string.sniffing,
|
||||
placeholder = R.string.dont_modify,
|
||||
configure = snifferDependencies::add,
|
||||
)
|
||||
|
||||
editableTextList(
|
||||
value = configuration.sniffer::forceDomain,
|
||||
adapter = TextAdapter.String,
|
||||
title = R.string.force_domain,
|
||||
placeholder = R.string.dont_modify,
|
||||
configure = snifferDependencies::add,
|
||||
)
|
||||
|
||||
editableTextList(
|
||||
value = configuration.sniffer::skipDomain,
|
||||
adapter = TextAdapter.String,
|
||||
title = R.string.skip_domain,
|
||||
placeholder = R.string.dont_modify,
|
||||
configure = snifferDependencies::add,
|
||||
)
|
||||
|
||||
sniffer.listener?.onChanged()
|
||||
|
||||
category(R.string.geox_url_setting)
|
||||
|
||||
val geoxurlDependencies: MutableList<Preference> = mutableListOf()
|
||||
|
||||
editableText(
|
||||
value = configuration.geoxurl::geoip,
|
||||
adapter = NullableTextAdapter.String,
|
||||
title = R.string.geox_geoip,
|
||||
placeholder = R.string.dont_modify,
|
||||
empty = R.string.geoip_url,
|
||||
configure = geoxurlDependencies::add,
|
||||
)
|
||||
|
||||
editableText(
|
||||
value = configuration.geoxurl::geoip,
|
||||
adapter = NullableTextAdapter.String,
|
||||
title = R.string.geox_mmdb,
|
||||
placeholder = R.string.dont_modify,
|
||||
empty = R.string.mmdb_url,
|
||||
configure = geoxurlDependencies::add,
|
||||
)
|
||||
|
||||
editableText(
|
||||
value = configuration.geoxurl::geoip,
|
||||
adapter = NullableTextAdapter.String,
|
||||
title = R.string.geox_geosite,
|
||||
placeholder = R.string.dont_modify,
|
||||
empty = R.string.geosite_url,
|
||||
configure = geoxurlDependencies::add,
|
||||
)
|
||||
}
|
||||
|
||||
binding.content.addView(screen.root)
|
||||
}
|
||||
|
||||
fun requestClear() {
|
||||
requests.trySend(Request.ResetOverride)
|
||||
}
|
||||
}
|
@ -10,7 +10,7 @@ import com.github.kr328.clash.design.util.root
|
||||
|
||||
class SettingsDesign(context: Context) : Design<SettingsDesign.Request>(context) {
|
||||
enum class Request {
|
||||
StartApp, StartNetwork, StartOverride,
|
||||
StartApp, StartNetwork, StartOverride, StartMetaFeature,
|
||||
}
|
||||
|
||||
private val binding = DesignSettingsBinding
|
||||
|
10
design/src/main/res/drawable/ic_baseline_meta.xml
Normal file
10
design/src/main/res/drawable/ic_baseline_meta.xml
Normal file
@ -0,0 +1,10 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:tint="?attr/colorControlNormal"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M 6.52 4.88 C 6.59 4.88 6.67 4.87 6.74 4.91 C 6.84 4.98 6.92 5.07 7.01 5.15 C 8.32 6.43 9.63 7.7 10.94 8.98 C 11.03 9.06 11.11 9.16 11.22 9.22 C 11.31 9.26 11.4 9.24 11.49 9.23 C 11.73 9.19 11.97 9.18 12.22 9.18 C 12.45 9.18 12.69 9.19 12.92 9.23 C 13.01 9.24 13.12 9.27 13.19 9.19 C 14.63 7.78 16.08 6.38 17.52 4.97 C 17.64 4.83 17.83 4.86 17.99 4.88 C 18.39 4.94 18.8 4.97 19.2 5.02 C 19.27 5.03 19.36 5.04 19.39 5.12 C 19.42 5.27 19.4 5.42 19.41 5.57 L 19.41 14.7 C 19.41 14.85 19.42 15.01 19.4 15.16 C 19.39 15.22 19.39 15.28 19.35 15.32 C 19.26 15.36 19.16 15.38 19.07 15.4 C 18.67 15.5 18.26 15.57 17.85 15.68 C 17.65 15.74 17.44 15.72 17.23 15.72 C 17.12 15.72 17.02 15.73 16.91 15.71 C 16.85 15.7 16.8 15.65 16.8 15.58 C 16.78 15.43 16.79 15.28 16.79 15.12 L 16.79 10.63 C 16.79 10.48 16.8 10.33 16.78 10.18 C 16.75 10.01 16.59 9.89 16.43 9.91 C 16.34 9.91 16.27 9.97 16.21 10.03 C 15.51 10.72 14.81 11.39 14.11 12.07 C 14.03 12.14 13.94 12.23 13.83 12.22 C 13.68 12.21 13.54 12.15 13.4 12.11 C 12.82 11.96 12.22 11.94 11.63 11.99 C 11.34 12.03 11.05 12.07 10.77 12.16 C 10.68 12.19 10.59 12.22 10.5 12.21 C 10.41 12.2 10.33 12.14 10.26 12.07 C 9.57 11.39 8.87 10.72 8.18 10.05 C 8.11 9.99 8.04 9.92 7.95 9.9 C 7.83 9.88 7.72 9.94 7.64 10.02 C 7.57 10.1 7.57 10.22 7.57 10.32 L 7.57 15.42 C 7.57 15.49 7.57 15.55 7.54 15.61 C 7.5 15.68 7.42 15.68 7.35 15.69 L 6.81 15.69 C 6.61 15.69 6.41 15.63 6.22 15.59 C 5.86 15.51 5.51 15.42 5.15 15.34 C 5.07 15.32 4.97 15.3 4.95 15.2 C 4.93 15.03 4.94 14.85 4.94 14.67 L 4.94 5.57 C 4.94 5.43 4.93 5.28 4.94 5.14 C 4.94 5.09 4.96 5.03 5.01 5 C 5.06 4.98 5.12 4.97 5.17 4.96 C 5.62 4.93 6.07 4.87 6.52 4.82 Z M 11.9 16.06 C 12.1 16.04 12.31 16.05 12.51 16.06 C 12.67 16.06 12.76 16.26 12.69 16.4 C 12.6 16.59 12.51 16.77 12.41 16.95 C 12.34 17.08 12.15 17.1 12.07 16.99 C 11.99 16.88 11.94 16.75 11.87 16.63 C 11.82 16.53 11.76 16.43 11.73 16.32 C 11.71 16.2 11.79 16.08 11.9 16.06 Z M 5.09 16.45 C 5.13 16.45 5.17 16.44 5.21 16.44 L 8.58 16.44 C 8.68 16.44 8.8 16.46 8.86 16.56 C 8.92 16.67 8.91 16.84 8.8 16.91 C 8.73 16.96 8.64 16.96 8.55 16.97 L 5.21 16.97 C 5.15 16.97 5.08 16.97 5.03 16.95 C 4.93 16.91 4.87 16.8 4.88 16.69 C 4.89 16.57 4.98 16.46 5.09 16.45 Z M 15.7 16.45 C 15.85 16.43 16 16.45 16.16 16.44 L 19.17 16.44 C 19.23 16.44 19.3 16.44 19.36 16.47 C 19.45 16.51 19.5 16.62 19.5 16.72 C 19.5 16.84 19.41 16.95 19.3 16.96 C 19.16 16.98 19.01 16.97 18.87 16.97 L 16.1 16.97 C 15.96 16.97 15.82 16.98 15.68 16.96 C 15.57 16.94 15.49 16.84 15.5 16.72 C 15.49 16.58 15.6 16.46 15.72 16.45 Z M 8.53 17.74 C 8.6 17.72 8.69 17.71 8.76 17.75 C 8.91 17.82 8.94 18.07 8.81 18.18 C 8.73 18.24 8.64 18.26 8.55 18.3 C 8.22 18.41 7.89 18.55 7.56 18.66 C 7.18 18.79 6.8 18.94 6.42 19.08 C 6.14 19.18 5.86 19.28 5.59 19.38 C 5.48 19.42 5.36 19.48 5.25 19.5 C 5.18 19.52 5.1 19.5 5.04 19.45 C 4.95 19.37 4.93 19.22 4.98 19.11 C 5.02 19.03 5.11 19 5.19 18.97 C 5.43 18.88 5.66 18.79 5.91 18.71 C 6.51 18.5 7.1 18.26 7.71 18.06 C 7.99 17.96 8.26 17.84 8.55 17.75 Z M 15.67 17.72 C 15.76 17.7 15.84 17.73 15.92 17.76 C 16.18 17.86 16.44 17.96 16.7 18.05 C 17.32 18.26 17.93 18.51 18.55 18.72 C 18.75 18.79 18.96 18.87 19.16 18.95 C 19.24 18.98 19.32 19.01 19.38 19.08 C 19.47 19.21 19.42 19.42 19.27 19.48 C 19.18 19.52 19.08 19.48 18.99 19.45 C 18.62 19.3 18.25 19.17 17.87 19.04 C 17.51 18.91 17.14 18.76 16.78 18.64 C 16.45 18.53 16.12 18.39 15.79 18.28 C 15.7 18.25 15.61 18.22 15.54 18.16 C 15.41 18.03 15.48 17.76 15.66 17.73 Z" />
|
||||
</vector>
|
@ -49,6 +49,13 @@
|
||||
app:icon="@drawable/ic_baseline_extension"
|
||||
app:text="@string/override" />
|
||||
|
||||
<com.github.kr328.clash.design.view.ActionLabel
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:onClick="@{() -> self.request(Request.StartMetaFeature)}"
|
||||
app:icon="@drawable/ic_baseline_meta"
|
||||
app:text="@string/meta_features" />
|
||||
|
||||
</LinearLayout>
|
||||
</com.github.kr328.clash.design.view.ObservableScrollView>
|
||||
|
||||
|
66
design/src/main/res/layout/design_settings_meta_feature.xml
Normal file
66
design/src/main/res/layout/design_settings_meta_feature.xml
Normal file
@ -0,0 +1,66 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<layout xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<data>
|
||||
<variable
|
||||
name="self"
|
||||
type="com.github.kr328.clash.design.MetaFeatureSettingsDesign" />
|
||||
</data>
|
||||
|
||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:paddingStart="@{self.surface.insets.start}"
|
||||
android:paddingEnd="@{self.surface.insets.end}">
|
||||
|
||||
<com.github.kr328.clash.design.view.ObservableScrollView
|
||||
android:id="@+id/scroll_root"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:scrollbars="none">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="@{(float) self.surface.insets.top + @dimen/toolbar_height}"
|
||||
android:paddingBottom="@{self.surface.insets.bottom}" />
|
||||
</com.github.kr328.clash.design.view.ObservableScrollView>
|
||||
|
||||
<com.github.kr328.clash.design.view.ActivityBarLayout
|
||||
android:id="@+id/activity_bar_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingTop="@{self.surface.insets.top}">
|
||||
|
||||
<RelativeLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:paddingEnd="@dimen/item_tailing_margin">
|
||||
|
||||
<include
|
||||
layout="@layout/common_activity_bar"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_toStartOf="@id/clear_view" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/clear_view"
|
||||
android:layout_width="@dimen/item_tailing_component_size"
|
||||
android:layout_height="@dimen/item_tailing_component_size"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_gravity="end|center_vertical"
|
||||
android:layout_marginStart="@dimen/item_tailing_margin"
|
||||
android:background="?attr/selectableItemBackgroundBorderless"
|
||||
android:clickable="true"
|
||||
android:contentDescription="@string/reset"
|
||||
android:focusable="true"
|
||||
android:onClick="@{() -> self.requestClear()}"
|
||||
android:padding="@dimen/toolbar_image_action_padding"
|
||||
android:src="@drawable/ic_baseline_replay" />
|
||||
</RelativeLayout>
|
||||
</com.github.kr328.clash.design.view.ActivityBarLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</layout>
|
@ -6,7 +6,7 @@
|
||||
<string name="access_control_packages">訪問控制應用包列表</string>
|
||||
<string name="append_system_dns">追加系統 DNS</string>
|
||||
<string name="application_broken">應用損壞</string>
|
||||
<string name="application_name">Clash for Android</string>
|
||||
<string name="application_name">Clash Meta for Android</string>
|
||||
<string name="auto_update">自動更新</string>
|
||||
<string name="behavior">行為</string>
|
||||
<string name="bypass_private_network">繞過私有網絡</string>
|
||||
@ -43,7 +43,7 @@
|
||||
<string name="import_from_url">從 URL 導入</string>
|
||||
<string name="interface_">界面</string>
|
||||
<string name="invalid_url">無效的 URL</string>
|
||||
<string name="launch_name">Clash</string>
|
||||
<string name="launch_name">Clash Meta for Android</string>
|
||||
<string name="logcat">Logcat</string>
|
||||
<string name="logs">日誌</string>
|
||||
<string name="mode">模式</string>
|
||||
@ -79,12 +79,11 @@
|
||||
<string name="update_time">更新時間</string>
|
||||
<string name="package_name">應用包名稱</string>
|
||||
<string name="install_time">安裝時間</string>
|
||||
<string name="clash_for_android">Clash for Android</string>
|
||||
<string name="feedback">反饋</string>
|
||||
<string name="github_issues">Github Issues</string>
|
||||
<string name="tips_properties"><![CDATA[僅接受 <strong>Clash 配置文件</strong>(包含<strong>代理</strong>/<strong>規則</strong>)]]></string>
|
||||
<string name="loading">載入中</string>
|
||||
<string name="tips_help"><![CDATA[Clash for Android 是一個<strong>免費軟件</strong>並且我們<strong>不</strong>為其提供任何服務, <strong>請務必不要反饋非應用自身引起的問題</strong>]]></string>
|
||||
<string name="tips_help"><![CDATA[Clash Meta for Android 是一個<strong>免費軟件</strong>並且我們<strong>不</strong>為其提供任何服務, <strong>請務必不要反饋非應用自身引起的問題</strong>]]></string>
|
||||
<string name="donate">捐贈</string>
|
||||
<string name="allow_all_apps">允許所有應用</string>
|
||||
<string name="allow_selected_apps">僅允許已選擇的應用</string>
|
||||
@ -209,8 +208,9 @@
|
||||
<string name="mode_switch_tips">僅在本次會話中有效</string>
|
||||
<string name="import_">導入</string>
|
||||
<string name="sources">源代碼</string>
|
||||
<string name="clash_core">Clash 核心</string>
|
||||
<string name="clash_meta_core">Clash 核心</string>
|
||||
<string name="name_server_policy">Name Server 策略</string>
|
||||
<string name="block_loopback">阻止本地迴環</string>
|
||||
<string name="block_loopback_summary">阻止本地迴環連接</string>
|
||||
<string name="clash_meta_for_android">Clash Meta for Android</string>
|
||||
</resources>
|
@ -6,7 +6,7 @@
|
||||
<string name="access_control_packages">存取控制應用程式套件清單</string>
|
||||
<string name="append_system_dns">附加作業系統 DNS</string>
|
||||
<string name="application_broken">應用程式損毀</string>
|
||||
<string name="application_name">Clash for Android</string>
|
||||
<string name="application_name">Clash Meta for Android</string>
|
||||
<string name="auto_update">自動更新</string>
|
||||
<string name="behavior">行為</string>
|
||||
<string name="bypass_private_network">略過私有網路</string>
|
||||
@ -43,7 +43,7 @@
|
||||
<string name="import_from_url">從 URL 匯入</string>
|
||||
<string name="interface_">介面</string>
|
||||
<string name="invalid_url">無效 URL</string>
|
||||
<string name="launch_name">Clash</string>
|
||||
<string name="launch_name">Clash Meta for Android</string>
|
||||
<string name="logcat">Logcat</string>
|
||||
<string name="logs">日誌</string>
|
||||
<string name="mode">模式</string>
|
||||
@ -79,12 +79,11 @@
|
||||
<string name="update_time">更新時間</string>
|
||||
<string name="package_name">套件名稱</string>
|
||||
<string name="install_time">安裝時間</string>
|
||||
<string name="clash_for_android">Clash for Android</string>
|
||||
<string name="feedback">回饋</string>
|
||||
<string name="github_issues">Github Issues</string>
|
||||
<string name="tips_properties"><![CDATA[僅接受 <strong>Clash 設定檔</strong> (包含<strong>Proxy</strong> /<strong>規則</strong>)]]></string>
|
||||
<string name="loading">載入中</string>
|
||||
<string name="tips_help"><![CDATA[Clash for Android 是一個<strong>免費應用程式</strong>並且我們<strong>不</strong>為其提供任何服務, <strong>請務必不要回報非應用程式自身引起的問題</strong>]]></string>
|
||||
<string name="tips_help"><![CDATA[Clash Meta for Android 是一個<strong>免費應用程式</strong>並且我們<strong>不</strong>為其提供任何服務, <strong>請務必不要回報非應用程式自身引起的問題</strong>]]></string>
|
||||
<string name="donate">捐助</string>
|
||||
<string name="allow_all_apps">允許所有應用</string>
|
||||
<string name="allow_selected_apps">僅允許已選擇的應用</string>
|
||||
@ -209,8 +208,9 @@
|
||||
<string name="mode_switch_tips">僅在本次工作階段中有效</string>
|
||||
<string name="import_">匯入</string>
|
||||
<string name="sources">原始碼</string>
|
||||
<string name="clash_core">Clash 核心</string>
|
||||
<string name="clash_meta_core">Clash 核心</string>
|
||||
<string name="name_server_policy">Name Server 政策</string>
|
||||
<string name="block_loopback">攔截本地回送</string>
|
||||
<string name="block_loopback_summary">攔截本地回送連結</string>
|
||||
<string name="clash_meta_for_android">Clash Meta for Android</string>
|
||||
</resources>
|
||||
|
@ -6,7 +6,7 @@
|
||||
<string name="access_control_packages">访问控制应用包列表</string>
|
||||
<string name="append_system_dns">追加系统 DNS</string>
|
||||
<string name="application_broken">应用损坏</string>
|
||||
<string name="application_name">Clash for Android</string>
|
||||
<string name="application_name">Clash Meta for Android</string>
|
||||
<string name="auto_update">自动更新</string>
|
||||
<string name="behavior">行为</string>
|
||||
<string name="bypass_private_network">绕过私有网络</string>
|
||||
@ -43,7 +43,7 @@
|
||||
<string name="import_from_url">从 URL 导入</string>
|
||||
<string name="interface_">界面</string>
|
||||
<string name="invalid_url">无效的 URL</string>
|
||||
<string name="launch_name">Clash</string>
|
||||
<string name="launch_name">Clash Meta for Android</string>
|
||||
<string name="logcat">Logcat</string>
|
||||
<string name="logs">日志</string>
|
||||
<string name="mode">模式</string>
|
||||
@ -79,12 +79,12 @@
|
||||
<string name="update_time">更新时间</string>
|
||||
<string name="package_name">应用包名称</string>
|
||||
<string name="install_time">安装时间</string>
|
||||
<string name="clash_for_android">Clash for Android</string>
|
||||
<string name="clash_meta_for_android">Clash Meta for Android</string>
|
||||
<string name="feedback">反馈</string>
|
||||
<string name="github_issues">Github Issues</string>
|
||||
<string name="tips_properties"><![CDATA[仅接受 <strong>Clash 配置文件</strong>(包含<strong>代理</strong>/<strong>规则</strong>)]]></string>
|
||||
<string name="loading">载入中</string>
|
||||
<string name="tips_help"><![CDATA[Clash for Android 是一个<strong>免费软件</strong>并且我们<strong>不</strong>为其提供任何服务, <strong>请务必不要反馈非应用自身引起的问题</strong>]]></string>
|
||||
<string name="tips_help"><![CDATA[Clash Meta for Android 是一个<strong>免费软件</strong>并且我们<strong>不</strong>为其提供任何服务, <strong>请务必不要反馈非应用自身引起的问题</strong>]]></string>
|
||||
<string name="donate">捐赠</string>
|
||||
<string name="allow_all_apps">允许所有应用</string>
|
||||
<string name="allow_selected_apps">仅允许已选择的应用</string>
|
||||
@ -209,7 +209,7 @@
|
||||
<string name="mode_switch_tips">仅在本次会话中有效</string>
|
||||
<string name="import_">导入</string>
|
||||
<string name="sources">源代码</string>
|
||||
<string name="clash_core">Clash 核心</string>
|
||||
<string name="clash_meta_core">Clash Meta 核心</string>
|
||||
<string name="name_server_policy">Name Server 策略</string>
|
||||
<string name="block_loopback">阻止本地回环</string>
|
||||
<string name="block_loopback_summary">阻止本地回环连接</string>
|
||||
|
@ -1,6 +1,6 @@
|
||||
<resources xmlns:tools="http://schemas.android.com/tools" tools:ignore="PluralsCandidate">
|
||||
<string name="launch_name">Clash</string>
|
||||
<string name="application_name">Clash for Android</string>
|
||||
<string name="launch_name">Clash Meta for Android</string>
|
||||
<string name="application_name">Clash Meta for Android</string>
|
||||
|
||||
<string name="stopped">Stopped</string>
|
||||
<string name="tap_to_start">Tap to start</string>
|
||||
@ -49,7 +49,6 @@
|
||||
<string name="application_broken_tips">App lacks the necessary runtime components, which is usually caused by downloading an incomplete apk.</string>
|
||||
<string name="reinstall">Reinstall</string>
|
||||
<string name="github_releases">Github Releases</string>
|
||||
<string name="github_releases_url" translatable="false">https://github.com/kr328/clashforandroid/releases</string>
|
||||
|
||||
<string name="profile">Profile</string>
|
||||
<string name="name">Name</string>
|
||||
@ -196,7 +195,7 @@
|
||||
<string name="import_from_clipboard">Import from Clipboard</string>
|
||||
<string name="export_to_clipboard">Export to Clipboard</string>
|
||||
|
||||
<string name="clash_for_android">Clash for Android</string>
|
||||
<string name="clash_meta_for_android">Clash Meta for Android</string>
|
||||
|
||||
<string name="document">Document</string>
|
||||
<string name="feedback">Feedback</string>
|
||||
@ -205,15 +204,13 @@
|
||||
<string name="clash_wiki">Clash Wiki</string>
|
||||
<string name="github_issues">Github Issues</string>
|
||||
<string name="google_play">Google Play</string>
|
||||
<string name="clash_core">Clash Core</string>
|
||||
<string name="clash_meta_core">Clash Meta Core</string>
|
||||
<string name="clash_wiki_url" translatable="false">https://github.com/Dreamacro/clash/wiki</string>
|
||||
<string name="github_issues_url" translatable="false">https://github.com/Kr328/ClashForAndroid/issues</string>
|
||||
<string name="donate_url" translatable="false">https://donate.kr328.app</string>
|
||||
<string name="github_url" translatable="false">https://github.com/Kr328/ClashForAndroid</string>
|
||||
<string name="clash_core_url" translatable="false">https://github.com/Dreamacro/clash</string>
|
||||
<string name="meta_github_url" translatable="false">https://github.com/MetaCubeX/ClashMetaForAndroid</string>
|
||||
<string name="clash_meta_core_url" translatable="false">https://github.com/MetaCubeX/Clash.Meta</string>
|
||||
|
||||
<string name="tips_properties"><![CDATA[Accept Only <strong>Clash Config</strong>(including <strong>Proxy</strong>/<strong>Rules</strong>)]]></string>
|
||||
<string name="tips_help"><![CDATA[Clash for Android is a <strong>freeware</strong> and we do <strong>NOT</strong> provide any service for it]]></string>
|
||||
<string name="tips_help"><![CDATA[Clash Meta for Android is a <strong>freeware</strong> and we do <strong>NOT</strong> provide any service for it]]></string>
|
||||
|
||||
<string name="google_play_url" translatable="false">https://play.google.com/store/apps/details?id=com.github.kr328.clash</string>
|
||||
|
||||
@ -278,4 +275,31 @@
|
||||
<string name="version_updated_tips">The settings have been reseted and the old profiles needs to be saved again.</string>
|
||||
|
||||
<string name="mode_switch_tips">Valid only for current session</string>
|
||||
|
||||
<string name="clash_meta_wiki">Clash Meta Wiki</string>
|
||||
<string name="clash_meta_wiki_url" translatable="false">https://docs.metacubex.one/</string>
|
||||
|
||||
<string name="meta_features">Meta Features</string>
|
||||
<string name="force_cert_verify">Force Cert Verify</string>
|
||||
<string name="unified_delay">Unified Delay</string>
|
||||
<string name="geodata_mode">Geodata Mode</string>
|
||||
<string name="tcp_concurrent">TCP Concurrent</string>
|
||||
<string name="enable_process">Enable Process</string>
|
||||
|
||||
<string name="sniffer_setting">Sniffer Setting</string>
|
||||
<string name="sniffer">Sniffer</string>
|
||||
<string name="sniffing">Sniffer Mode</string>
|
||||
<string name="force_domain">Force Domain</string>
|
||||
<string name="skip_domain">Skip Domain</string>
|
||||
<string name="disable_sniffer">Disable Sniffer</string>
|
||||
<string name="sniffer_config">Load Sniffer From Config</string>
|
||||
<string name="sniffer_override">Override Sniffer Config</string>
|
||||
|
||||
<string name="geox_url_setting">GeoX Url Setting</string>
|
||||
<string name="geox_geoip">GeoIp Url</string>
|
||||
<string name="geox_mmdb">MMDB Url</string>
|
||||
<string name="geox_geosite">Geosite Url</string>
|
||||
<string name="geoip_url" translatable="false">https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/geoip.dat</string>
|
||||
<string name="mmdb_url" translatable="false">https://raw.githubusercontent.com/Loyalsoldier/geoip/release/Country.mmdb</string>
|
||||
<string name="geosite_url" translatable="false">https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/geosite.dat</string>
|
||||
</resources>
|
||||
|
Loading…
Reference in New Issue
Block a user