소스 검색

add setting meta features

djoeni 3 년 전
부모
커밋
34f1e6f984

+ 5 - 0
app/src/main/AndroidManifest.xml

@@ -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"

+ 49 - 0
app/src/main/java/com/github/kr328/clash/MetaFeatureSettingsActivity.kt

@@ -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()
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 2 - 0
app/src/main/java/com/github/kr328/clash/SettingsActivity.kt

@@ -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)
                     }
                 }
             }

+ 48 - 0
core/src/main/java/com/github/kr328/clash/core/model/ConfigurationOverride.kt

@@ -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)
     }

+ 16 - 45
design/src/main/java/com/github/kr328/clash/design/HelpDesign.kt

@@ -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
-                ) {
-                    clicked {
-                        openLink(Uri.parse(context.getString(R.string.google_play_url)))
-                    }
-                }
-            }
-
             clickable(
-                title = R.string.github_issues,
-                summary = R.string.github_issues_url
+                title = R.string.clash_meta_wiki,
+                summary = R.string.clash_meta_wiki_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)
+            category(R.string.sources)
 
-                clickable(
-                    title = R.string.clash_for_android,
-                    summary = R.string.github_url
-                ) {
-                    clicked {
-                        openLink(Uri.parse(context.getString(R.string.github_url)))
-                    }
-                }
-
-                clickable(
-                    title = R.string.clash_core,
-                    summary = R.string.clash_core_url
-                ) {
-                    clicked {
-                        openLink(Uri.parse(context.getString(R.string.clash_core_url)))
-                    }
+            clickable(
+                title = R.string.clash_meta_for_android,
+                summary = R.string.meta_github_url
+            ) {
+                clicked {
+                    openLink(Uri.parse(context.getString(R.string.meta_github_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)))
-                    }
+            clickable(
+                title = R.string.clash_meta_core,
+                summary = R.string.clash_meta_core_url
+            ) {
+                clicked {
+                    openLink(Uri.parse(context.getString(R.string.clash_meta_core_url)))
                 }
             }
         }

+ 198 - 0
design/src/main/java/com/github/kr328/clash/design/MetaFeatureSettingsDesign.kt

@@ -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)
+    }
+}

+ 1 - 1
design/src/main/java/com/github/kr328/clash/design/SettingsDesign.kt

@@ -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

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 8 - 0
design/src/main/res/drawable/ic_baseline_meta.xml


+ 7 - 0
design/src/main/res/layout/design_settings.xml

@@ -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 - 0
design/src/main/res/layout/design_settings_meta_feature.xml

@@ -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>

+ 5 - 5
design/src/main/res/values-zh-rHK/strings.xml

@@ -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>

+ 5 - 5
design/src/main/res/values-zh-rTW/strings.xml

@@ -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>

+ 5 - 5
design/src/main/res/values-zh/strings.xml

@@ -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>

+ 34 - 10
design/src/main/res/values/strings.xml

@@ -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>

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.