Compare commits

...

11 Commits

Author SHA1 Message Date
2dust
7e99b1ac78 up 1.9.32 2025-01-13 15:04:01 +08:00
2dust
6ff3a73bf2 Adjust UI for subscription 2025-01-13 14:56:48 +08:00
2dust
2a43b52344 Logcat add pull-down refresh 2025-01-13 14:31:36 +08:00
2dust
abff80ec23 Adjust UI 2025-01-13 12:51:26 +08:00
2dust
a4edf86195 Improved logcat 2025-01-13 12:50:35 +08:00
alphax-hue3682
0d0da6bfec Update Persian translate (#4256)
* Update Persian translate

* Update strings.xml
2025-01-12 13:47:18 +08:00
ᡠᠵᡠᡳ ᡠᠵᡠ ᠮᠠᠨᡩ᠋ᠠᠨ
e0c8ece9b5 Reproducible Builds for libhysteria2.so (#4249)
* Patch Go use 600296

* -buildvcs=false for libhysteria2

* fix if

* fixup! Build and cache libhysteria2.so (#4226)
2025-01-11 10:38:47 +08:00
2dust
4d875bc3d4 Add theme to SwitchCompat for tasker 2025-01-09 09:48:37 +08:00
2dust
3a6e23bcef Fix the bug of mux parameter taking 2025-01-08 11:23:21 +08:00
2dust
efd0716707 Custom configuration can use any outbound
https://github.com/2dust/v2rayNG/issues/4243
2025-01-07 17:14:23 +08:00
2dust
c94a5fb743 Update Luri Bakhtiari translation 2025-01-07 14:47:18 +08:00
33 changed files with 303 additions and 174 deletions

View File

@@ -95,7 +95,14 @@ jobs:
if: steps.cache-libhysteria2-restore.outputs.cache-hit != 'true' if: steps.cache-libhysteria2-restore.outputs.cache-hit != 'true'
uses: actions/setup-go@v5 uses: actions/setup-go@v5
with: with:
go-mod-file: 'AndroidLibXrayLite/go.mod' go-version-file: 'AndroidLibXrayLite/go.mod'
- name: Patch Go use 600296
if: steps.cache-libhysteria2-restore.outputs.cache-hit != 'true'
#https://go-review.googlesource.com/c/go/+/600296
run: |
cd "$(go env GOROOT)"
curl "https://go-review.googlesource.com/changes/go~600296/revisions/5/patch" | base64 -d | patch --verbose -p 1
- name: Build libhysteria2 - name: Build libhysteria2
if: steps.cache-libhysteria2-restore.outputs.cache-hit != 'true' if: steps.cache-libhysteria2-restore.outputs.cache-hit != 'true'

View File

@@ -12,8 +12,8 @@ android {
applicationId = "com.v2ray.ang" applicationId = "com.v2ray.ang"
minSdk = 21 minSdk = 21
targetSdk = 35 targetSdk = 35
versionCode = 627 versionCode = 628
versionName = "1.9.31" versionName = "1.9.32"
multiDexEnabled = true multiDexEnabled = true
val abiFilterList = (properties["ABI_FILTERS"] as? String)?.split(';') val abiFilterList = (properties["ABI_FILTERS"] as? String)?.split(';')
@@ -144,6 +144,7 @@ dependencies {
implementation(libs.androidx.constraintlayout) implementation(libs.androidx.constraintlayout)
implementation(libs.preference.ktx) implementation(libs.preference.ktx)
implementation(libs.recyclerview) implementation(libs.recyclerview)
implementation(libs.androidx.swiperefreshlayout)
// UI Libraries // UI Libraries
implementation(libs.material) implementation(libs.material)

View File

@@ -1,5 +1,7 @@
package com.v2ray.ang.dto package com.v2ray.ang.dto
import com.v2ray.ang.AppConfig.LOOPBACK
import com.v2ray.ang.AppConfig.PORT_SOCKS
import com.v2ray.ang.AppConfig.TAG_BLOCKED import com.v2ray.ang.AppConfig.TAG_BLOCKED
import com.v2ray.ang.AppConfig.TAG_DIRECT import com.v2ray.ang.AppConfig.TAG_DIRECT
import com.v2ray.ang.AppConfig.TAG_PROXY import com.v2ray.ang.AppConfig.TAG_PROXY
@@ -66,6 +68,9 @@ data class ProfileItem(
} }
fun getServerAddressAndPort(): String { fun getServerAddressAndPort(): String {
if (server.isNullOrEmpty() && configType == EConfigType.CUSTOM) {
return "$LOOPBACK:$PORT_SOCKS"
}
return Utils.getIpv6Address(server) + ":" + serverPort return Utils.getIpv6Address(server) + ":" + serverPort
} }

View File

@@ -476,9 +476,9 @@ data class V2rayConfig(
data class MuxBean( data class MuxBean(
var enabled: Boolean, var enabled: Boolean,
var concurrency: Int = 8, var concurrency: Int? = null,
var xudpConcurrency: Int = 8, var xudpConcurrency: Int? = null,
var xudpProxyUDP443: String = "", var xudpProxyUDP443: String? = null,
) )
fun getServerAddress(): String? { fun getServerAddress(): String? {

View File

@@ -349,10 +349,6 @@ object MmkvManager {
return settingsStorage.decodeBool(key, defaultValue) return settingsStorage.decodeBool(key, defaultValue)
} }
fun decodeSettingsInt(key: String, defaultValue: Int): Int {
return settingsStorage.decodeInt(key, defaultValue)
}
fun decodeSettingsStringSet(key: String): MutableSet<String>? { fun decodeSettingsStringSet(key: String): MutableSet<String>? {
return settingsStorage.decodeStringSet(key) return settingsStorage.decodeStringSet(key)
} }

View File

@@ -438,21 +438,18 @@ object V2rayConfigManager {
|| protocol.equals(EConfigType.HYSTERIA2.name, true) || protocol.equals(EConfigType.HYSTERIA2.name, true)
) { ) {
muxEnabled = false muxEnabled = false
} else if (protocol.equals(EConfigType.VLESS.name, true)
&& outbound.settings?.vnext?.first()?.users?.first()?.flow?.isNotEmpty() == true
) {
muxEnabled = false
} else if (outbound.streamSettings?.network == NetworkType.XHTTP.type) { } else if (outbound.streamSettings?.network == NetworkType.XHTTP.type) {
muxEnabled = false muxEnabled = false
} }
if (muxEnabled == true) { if (muxEnabled == true) {
outbound.mux?.enabled = true outbound.mux?.enabled = true
outbound.mux?.concurrency = outbound.mux?.concurrency = MmkvManager.decodeSettingsString(AppConfig.PREF_MUX_CONCURRENCY, "8").orEmpty().toInt()
MmkvManager.decodeSettingsInt(AppConfig.PREF_MUX_CONCURRENCY, 8) outbound.mux?.xudpConcurrency = MmkvManager.decodeSettingsString(AppConfig.PREF_MUX_XUDP_CONCURRENCY, "16").orEmpty().toInt()
outbound.mux?.xudpConcurrency = outbound.mux?.xudpProxyUDP443 = MmkvManager.decodeSettingsString(AppConfig.PREF_MUX_XUDP_QUIC,"reject")
MmkvManager.decodeSettingsInt(AppConfig.PREF_MUX_XUDP_CONCURRENCY, 16) if (protocol.equals(EConfigType.VLESS.name, true) && outbound.settings?.vnext?.first()?.users?.first()?.flow?.isNotEmpty() == true) {
outbound.mux?.xudpProxyUDP443 = outbound.mux?.concurrency = -1
MmkvManager.decodeSettingsString(AppConfig.PREF_MUX_XUDP_QUIC) ?: "reject" }
} else { } else {
outbound.mux?.enabled = false outbound.mux?.enabled = false
outbound.mux?.concurrency = -1 outbound.mux?.concurrency = -1

View File

@@ -20,6 +20,7 @@ import com.v2ray.ang.AppConfig.ANG_PACKAGE
import com.v2ray.ang.AppConfig.TAG_DIRECT import com.v2ray.ang.AppConfig.TAG_DIRECT
import com.v2ray.ang.AppConfig.VPN import com.v2ray.ang.AppConfig.VPN
import com.v2ray.ang.R import com.v2ray.ang.R
import com.v2ray.ang.dto.EConfigType
import com.v2ray.ang.dto.ProfileItem import com.v2ray.ang.dto.ProfileItem
import com.v2ray.ang.extension.toSpeedString import com.v2ray.ang.extension.toSpeedString
import com.v2ray.ang.extension.toast import com.v2ray.ang.extension.toast
@@ -68,7 +69,10 @@ object V2RayServiceManager {
if (v2rayPoint.isRunning) return if (v2rayPoint.isRunning) return
val guid = MmkvManager.getSelectServer() ?: return val guid = MmkvManager.getSelectServer() ?: return
val config = MmkvManager.decodeServerConfig(guid) ?: return val config = MmkvManager.decodeServerConfig(guid) ?: return
if (!Utils.isValidUrl(config.server) && !Utils.isIpAddress(config.server)) return if (config.configType != EConfigType.CUSTOM
&& !Utils.isValidUrl(config.server)
&& !Utils.isIpAddress(config.server)
) return
// val result = V2rayConfigUtil.getV2rayConfig(context, guid) // val result = V2rayConfigUtil.getV2rayConfig(context, guid)
// if (!result.status) return // if (!result.status) return

View File

@@ -1,13 +1,13 @@
package com.v2ray.ang.ui package com.v2ray.ang.ui
import android.os.Bundle import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.text.method.ScrollingMovementMethod
import android.view.Menu import android.view.Menu
import android.view.MenuItem import android.view.MenuItem
import android.view.View import androidx.appcompat.widget.SearchView
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import com.v2ray.ang.AppConfig.ANG_PACKAGE import com.v2ray.ang.AppConfig.ANG_PACKAGE
import com.v2ray.ang.R import com.v2ray.ang.R
import com.v2ray.ang.databinding.ActivityLogcatBinding import com.v2ray.ang.databinding.ActivityLogcatBinding
@@ -18,10 +18,13 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import java.io.IOException import java.io.IOException
class LogcatActivity : BaseActivity() {
private val binding by lazy { class LogcatActivity : BaseActivity(), SwipeRefreshLayout.OnRefreshListener {
ActivityLogcatBinding.inflate(layoutInflater) private val binding by lazy { ActivityLogcatBinding.inflate(layoutInflater) }
}
var logsetsAll: MutableList<String> = mutableListOf()
var logsets: MutableList<String> = mutableListOf()
private val adapter by lazy { LogcatRecyclerAdapter(this) }
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
@@ -29,24 +32,22 @@ class LogcatActivity : BaseActivity() {
title = getString(R.string.title_logcat) title = getString(R.string.title_logcat)
logcat(false) binding.recyclerView.setHasFixedSize(true)
binding.recyclerView.layoutManager = LinearLayoutManager(this)
binding.recyclerView.adapter = adapter
binding.recyclerView.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL))
binding.refreshLayout.setOnRefreshListener(this)
logsets.add(getString(R.string.pull_down_to_refresh))
} }
private fun logcat(shouldFlushLog: Boolean) { private fun getLogcat() {
try { try {
binding.pbWaiting.visibility = View.VISIBLE binding.refreshLayout.isRefreshing = true
lifecycleScope.launch(Dispatchers.Default) { lifecycleScope.launch(Dispatchers.Default) {
if (shouldFlushLog) {
val lst = LinkedHashSet<String>()
lst.add("logcat")
lst.add("-c")
withContext(Dispatchers.IO) {
val process = Runtime.getRuntime().exec(lst.toTypedArray())
process.waitFor()
}
}
val lst = LinkedHashSet<String>() val lst = LinkedHashSet<String>()
lst.add("logcat") lst.add("logcat")
lst.add("-d") lst.add("-d")
@@ -57,15 +58,34 @@ class LogcatActivity : BaseActivity() {
val process = withContext(Dispatchers.IO) { val process = withContext(Dispatchers.IO) {
Runtime.getRuntime().exec(lst.toTypedArray()) Runtime.getRuntime().exec(lst.toTypedArray())
} }
// val bufferedReader = BufferedReader(
// InputStreamReader(process.inputStream)) val allText = process.inputStream.bufferedReader().use { it.readLines() }
// val allText = bufferedReader.use(BufferedReader::readText)
val allText = process.inputStream.bufferedReader().use { it.readText() }
launch(Dispatchers.Main) { launch(Dispatchers.Main) {
binding.tvLogcat.text = allText logsetsAll = allText.toMutableList()
binding.tvLogcat.movementMethod = ScrollingMovementMethod() logsets = allText.toMutableList()
binding.pbWaiting.visibility = View.GONE adapter.notifyDataSetChanged()
Handler(Looper.getMainLooper()).post { binding.svLogcat.fullScroll(View.FOCUS_DOWN) } binding.refreshLayout.isRefreshing = false
}
}
} catch (e: IOException) {
e.printStackTrace()
}
}
private fun clearLogcat() {
try {
lifecycleScope.launch(Dispatchers.Default) {
val lst = LinkedHashSet<String>()
lst.add("logcat")
lst.add("-c")
withContext(Dispatchers.IO) {
val process = Runtime.getRuntime().exec(lst.toTypedArray())
process.waitFor()
}
launch(Dispatchers.Main) {
logsetsAll.clear()
logsets.clear()
adapter.notifyDataSetChanged()
} }
} }
} catch (e: IOException) { } catch (e: IOException) {
@@ -75,21 +95,55 @@ class LogcatActivity : BaseActivity() {
override fun onCreateOptionsMenu(menu: Menu): Boolean { override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_logcat, menu) menuInflater.inflate(R.menu.menu_logcat, menu)
val searchItem = menu.findItem(R.id.search_view)
if (searchItem != null) {
val searchView = searchItem.actionView as SearchView
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean = false
override fun onQueryTextChange(newText: String?): Boolean {
filterLogs(newText)
return false
}
})
searchView.setOnCloseListener {
filterLogs("")
false
}
}
return super.onCreateOptionsMenu(menu) return super.onCreateOptionsMenu(menu)
} }
override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
R.id.copy_all -> { R.id.copy_all -> {
Utils.setClipboard(this, binding.tvLogcat.text.toString()) Utils.setClipboard(this, logsets.joinToString("\n"))
toast(R.string.toast_success) toast(R.string.toast_success)
true true
} }
R.id.clear_all -> { R.id.clear_all -> {
logcat(true) clearLogcat()
true true
} }
else -> super.onOptionsItemSelected(item) else -> super.onOptionsItemSelected(item)
} }
}
private fun filterLogs(content: String?): Boolean {
val key = content?.trim()
logsets = if (key.isNullOrEmpty()) {
logsetsAll.toMutableList()
} else {
logsetsAll.filter { it.contains(key) }.toMutableList()
}
adapter?.notifyDataSetChanged()
return true
}
override fun onRefresh() {
getLogcat()
}
}

View File

@@ -0,0 +1,31 @@
package com.v2ray.ang.ui
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.v2ray.ang.databinding.ItemRecyclerLogcatBinding
class LogcatRecyclerAdapter(val activity: LogcatActivity) : RecyclerView.Adapter<LogcatRecyclerAdapter.MainViewHolder>() {
private var mActivity: LogcatActivity = activity
override fun getItemCount() = mActivity.logsets.size
override fun onBindViewHolder(holder: MainViewHolder, position: Int) {
val content = mActivity.logsets[position]
holder.itemSubSettingBinding.logContent.text = content
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainViewHolder {
return MainViewHolder(
ItemRecyclerLogcatBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
}
class MainViewHolder(val itemSubSettingBinding: ItemRecyclerLogcatBinding) : RecyclerView.ViewHolder(itemSubSettingBinding.root)
}

View File

@@ -77,6 +77,7 @@
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view" android:id="@+id/recycler_view"
android:scrollbars="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"

View File

@@ -1,40 +1,26 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
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:fitsSystemWindows="true"
android:paddingStart="@dimen/padding_start"
android:paddingEnd="@dimen/padding_end"
tools:context=".ui.LogcatActivity"> tools:context=".ui.LogcatActivity">
<ProgressBar <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/pb_waiting" android:id="@+id/refreshLayout"
style="@android:style/Widget.DeviceDefault.ProgressBar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent">
android:layout_centerHorizontal="true"
android:layout_centerVertical="true" />
<ScrollView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/sv_logcat" android:id="@+id/recycler_view"
android:layout_width="match_parent" android:scrollbars="vertical"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_alignParentEnd="true"
android:layout_alignParentBottom="true"
android:fillViewport="false"
android:foregroundGravity="bottom">
<TextView
android:id="@+id/tv_logcat"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:gravity="bottom" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
android:maxLines="65536"
android:textAppearance="?android:attr/textAppearanceSmall" /> </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</ScrollView>
</RelativeLayout> </RelativeLayout>

View File

@@ -54,6 +54,7 @@
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view" android:id="@+id/recycler_view"
android:scrollbars="vertical"
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"

View File

@@ -1,4 +1,5 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
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"
@@ -16,18 +17,16 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:checked="true" /> android:checked="true"
app:theme="@style/BrandedSwitch" />
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_toStartOf="@id/switch_start_service" android:layout_toStartOf="@id/switch_start_service"
android:layout_toLeftOf="@id/switch_start_service"
android:text="@string/tasker_start_service" android:text="@string/tasker_start_service"
android:textAppearance="@style/TextAppearance.AppCompat.Medium" /> android:textAppearance="@style/TextAppearance.AppCompat.Medium" />

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:gravity="center_vertical"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="@dimen/layout_margin_spacing">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/log_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="@style/TextAppearance.AppCompat.Small" />
</LinearLayout>
</LinearLayout>

View File

@@ -44,70 +44,76 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_margin_spacing" android:layout_marginTop="@dimen/layout_margin_spacing"
android:lines="1" android:lines="2"
android:textAppearance="@style/TextAppearance.AppCompat.Small" /> android:textAppearance="@style/TextAppearance.AppCompat.Small" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="@dimen/sub_height"
android:gravity="center"
android:orientation="vertical"
android:paddingStart="@dimen/padding_start"
android:paddingEnd="@dimen/padding_end">
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_margin_spacing" android:gravity="center"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/layout_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:gravity="center"
android:orientation="vertical"
android:padding="@dimen/layout_margin_spacing">
<ImageView
android:layout_width="@dimen/png_height"
android:layout_height="@dimen/png_height"
app:srcCompat="@drawable/ic_share_24dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/layout_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:gravity="center"
android:nextFocusLeft="@+id/info_container"
android:orientation="vertical"
android:padding="@dimen/layout_margin_spacing">
<ImageView
android:layout_width="@dimen/png_height"
android:layout_height="@dimen/png_height"
app:srcCompat="@drawable/ic_edit_24dp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/layout_margin_top_height"
android:orientation="horizontal"> android:orientation="horizontal">
<androidx.appcompat.widget.SwitchCompat <androidx.appcompat.widget.SwitchCompat
android:id="@+id/chk_enable" android:id="@+id/chk_enable"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/sub_setting_enable"
app:theme="@style/BrandedSwitch" /> app:theme="@style/BrandedSwitch" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="@dimen/sub_height"
android:gravity="center"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/layout_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:gravity="center"
android:orientation="vertical"
android:padding="@dimen/layout_margin_spacing">
<ImageView
android:layout_width="@dimen/png_height"
android:layout_height="@dimen/png_height"
app:srcCompat="@drawable/ic_share_24dp" />
</LinearLayout>
<LinearLayout
android:id="@+id/layout_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/selectableItemBackgroundBorderless"
android:clickable="true"
android:focusable="true"
android:gravity="center"
android:nextFocusLeft="@+id/info_container"
android:orientation="vertical"
android:padding="@dimen/layout_margin_spacing">
<ImageView
android:layout_width="@dimen/png_height"
android:layout_height="@dimen/png_height"
app:srcCompat="@drawable/ic_edit_24dp" />
</LinearLayout>
</LinearLayout>
</LinearLayout> </LinearLayout>
</androidx.cardview.widget.CardView> </androidx.cardview.widget.CardView>

View File

@@ -5,10 +5,10 @@
android:id="@+id/del_config" android:id="@+id/del_config"
android:icon="@drawable/ic_delete_24dp" android:icon="@drawable/ic_delete_24dp"
android:title="@string/menu_item_del_config" android:title="@string/menu_item_del_config"
app:showAsAction="always" /> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/save_config" android:id="@+id/save_config"
android:icon="@drawable/ic_action_done" android:icon="@drawable/ic_action_done"
android:title="@string/menu_item_save_config" android:title="@string/menu_item_save_config"
app:showAsAction="always" /> app:showAsAction="ifRoom" />
</menu> </menu>

View File

@@ -5,10 +5,10 @@
android:id="@+id/add_config" android:id="@+id/add_config"
android:icon="@drawable/ic_add_24dp" android:icon="@drawable/ic_add_24dp"
android:title="@string/menu_item_add_config" android:title="@string/menu_item_add_config"
app:showAsAction="always" /> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/sub_update" android:id="@+id/sub_update"
android:icon="@drawable/ic_restore_24dp" android:icon="@drawable/ic_restore_24dp"
android:title="@string/title_sub_update" android:title="@string/title_sub_update"
app:showAsAction="always" /> app:showAsAction="ifRoom" />
</menu> </menu>

View File

@@ -24,5 +24,5 @@
android:id="@+id/download_file" android:id="@+id/download_file"
android:icon="@drawable/ic_cloud_download_24dp" android:icon="@drawable/ic_cloud_download_24dp"
android:title="@string/menu_item_download_file" android:title="@string/menu_item_download_file"
app:showAsAction="always" /> app:showAsAction="ifRoom" />
</menu> </menu>

View File

@@ -6,7 +6,7 @@
android:icon="@drawable/ic_description_24dp" android:icon="@drawable/ic_description_24dp"
android:title="@string/menu_item_search" android:title="@string/menu_item_search"
app:actionViewClass="androidx.appcompat.widget.SearchView" app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="always" /> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/select_all" android:id="@+id/select_all"
android:icon="@drawable/ic_select_all_24dp" android:icon="@drawable/ic_select_all_24dp"

View File

@@ -1,14 +1,20 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/search_view"
android:icon="@drawable/ic_outline_filter_alt_24"
android:title="@string/menu_item_search"
app:actionViewClass="androidx.appcompat.widget.SearchView"
app:showAsAction="always|collapseActionView" />
<item <item
android:id="@+id/clear_all" android:id="@+id/clear_all"
android:icon="@drawable/ic_delete_24dp" android:icon="@drawable/ic_delete_24dp"
android:title="@string/logcat_clear" android:title="@string/logcat_clear"
app:showAsAction="always" /> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/copy_all" android:id="@+id/copy_all"
android:icon="@drawable/ic_copy" android:icon="@drawable/ic_copy"
android:title="@string/logcat_copy" android:title="@string/logcat_copy"
app:showAsAction="always" /> app:showAsAction="ifRoom" />
</menu> </menu>

View File

@@ -55,7 +55,7 @@
<item <item
android:title="@string/menu_item_import_config_custom" android:title="@string/menu_item_import_config_custom"
app:showAsAction="always"> app:showAsAction="ifRoom">
<menu> <menu>
<item <item
android:id="@+id/import_config_custom_clipboard" android:id="@+id/import_config_custom_clipboard"

View File

@@ -5,10 +5,10 @@
android:id="@+id/scan_code" android:id="@+id/scan_code"
android:icon="@drawable/ic_scan_24dp" android:icon="@drawable/ic_scan_24dp"
android:title="" android:title=""
app:showAsAction="always" /> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/select_photo" android:id="@+id/select_photo"
android:icon="@drawable/ic_image_24dp" android:icon="@drawable/ic_image_24dp"
android:title="" android:title=""
app:showAsAction="always" /> app:showAsAction="ifRoom" />
</menu> </menu>

View File

@@ -8,6 +8,7 @@
<string name="navigation_drawer_close">إغلاق درج التنقل</string> <string name="navigation_drawer_close">إغلاق درج التنقل</string>
<string name="migration_success">نجحت عملية ترحيل البيانات!</string> <string name="migration_success">نجحت عملية ترحيل البيانات!</string>
<string name="migration_fail">فشلت عملية ترحيل البيانات!</string> <string name="migration_fail">فشلت عملية ترحيل البيانات!</string>
<string name="pull_down_to_refresh">Please pull down to refresh!</string>
<!-- Notifications --> <!-- Notifications -->
<string name="notification_action_stop_v2ray">إيقاف</string> <string name="notification_action_stop_v2ray">إيقاف</string>

View File

@@ -8,6 +8,7 @@
<string name="navigation_drawer_close">নেভিগেশন ড্রয়ার বন্ধ করুন</string> <string name="navigation_drawer_close">নেভিগেশন ড্রয়ার বন্ধ করুন</string>
<string name="migration_success">ডেটা স্থানান্তর সফল!</string> <string name="migration_success">ডেটা স্থানান্তর সফল!</string>
<string name="migration_fail">ডেটা স্থানান্তর ব্যর্থ!</string> <string name="migration_fail">ডেটা স্থানান্তর ব্যর্থ!</string>
<string name="pull_down_to_refresh">Please pull down to refresh!</string>
<!-- Notifications --> <!-- Notifications -->
<string name="notification_action_stop_v2ray">বন্ধ করুন</string> <string name="notification_action_stop_v2ray">বন্ধ করুন</string>

View File

@@ -8,6 +8,7 @@
<string name="navigation_drawer_close">بستن نومگه کشاری</string> <string name="navigation_drawer_close">بستن نومگه کشاری</string>
<string name="migration_success">مووفقیت من جاگورویی داده</string> <string name="migration_success">مووفقیت من جاگورویی داده</string>
<string name="migration_fail">جاگورویی داده ٱنجوم نگرؽڌ</string> <string name="migration_fail">جاگورویی داده ٱنجوم نگرؽڌ</string>
<string name="pull_down_to_refresh">Please pull down to refresh!</string>
<!-- Notifications --> <!-- Notifications -->
<string name="notification_action_stop_v2ray">واڌاشتن</string> <string name="notification_action_stop_v2ray">واڌاشتن</string>
@@ -40,16 +41,16 @@
<string name="menu_item_import_config_custom_url">کانفیگ سفارشین ز آدرس اینترنتی و من بیار</string> <string name="menu_item_import_config_custom_url">کانفیگ سفارشین ز آدرس اینترنتی و من بیار</string>
<string name="menu_item_import_config_custom_url_scan">نشۊوی اینترنتی اسکن کانفیگ سفارشین بزݩ</string> <string name="menu_item_import_config_custom_url_scan">نشۊوی اینترنتی اسکن کانفیگ سفارشین بزݩ</string>
<string name="del_config_comfirm">پاک بۊ؟</string> <string name="del_config_comfirm">پاک بۊ؟</string>
<string name="del_invalid_config_comfirm">پؽش ز پاک کردن کانفیگ نا موئتبر قوۊل کوݩ! پاک کردن کانفیگن قوۊل اکۊنی؟</string> <string name="del_invalid_config_comfirm">پؽش ز پاک کردن کانفیگ نا موئتبر واجۊری کوݩ! پاک کردن کانفیگن قوۊل اکۊنی؟</string>
<string name="server_lab_remarks">نیشتنا</string> <string name="server_lab_remarks">نیشتنا</string>
<string name="server_lab_address">آدرس</string> <string name="server_lab_address">آدرس</string>
<string name="server_lab_port">پورت</string> <string name="server_lab_port">پورت</string>
<string name="server_lab_id">نوم من توری</string> <string name="server_lab_id">نوم من توری</string>
<string name="server_lab_alterid">alterId</string> <string name="server_lab_alterid">شناسه جایگۊزین</string>
<string name="server_lab_security">ٱمنیت</string> <string name="server_lab_security">ٱمنیت</string>
<string name="server_lab_network">شبکه</string> <string name="server_lab_network">شبکه</string>
<string name="server_lab_more_function">جاگورو</string> <string name="server_lab_more_function">جاگورو</string>
<string name="server_lab_head_type">نوء head</string> <string name="server_lab_head_type">نوء سر بلگ</string>
<string name="server_lab_mode_type">هالت gRPC</string> <string name="server_lab_mode_type">هالت gRPC</string>
<string name="server_lab_request_host">هاست</string> <string name="server_lab_request_host">هاست</string>
<string name="server_lab_request_host_http">هاست http</string> <string name="server_lab_request_host_http">هاست http</string>
@@ -58,14 +59,14 @@
<string name="server_lab_request_host_xhttp">هاست xhttp</string> <string name="server_lab_request_host_xhttp">هاست xhttp</string>
<string name="server_lab_request_host_h2">هاست h2</string> <string name="server_lab_request_host_h2">هاست h2</string>
<string name="server_lab_request_host_quic">ٱمنیت QUIC</string> <string name="server_lab_request_host_quic">ٱمنیت QUIC</string>
<string name="server_lab_request_host_grpc">اختیار gRPC</string> <string name="server_lab_request_host_grpc">Authority gRPC</string>
<string name="server_lab_path">تور</string> <string name="server_lab_path">تور</string>
<string name="server_lab_path_ws">تور ws</string> <string name="server_lab_path_ws">تور WS</string>
<string name="server_lab_path_httpupgrade">تور httpupgrade</string> <string name="server_lab_path_httpupgrade">تور HTTPUpgrade</string>
<string name="server_lab_path_xhttp">تور xhttp</string> <string name="server_lab_path_xhttp">تور XHTTP</string>
<string name="server_lab_path_h2">تور h2</string> <string name="server_lab_path_h2">تور H2</string>
<string name="server_lab_path_quic">کیلیت QUIC</string> <string name="server_lab_path_quic">تور QUIC</string>
<string name="server_lab_path_kcp">سید kcp</string> <string name="server_lab_path_kcp">KCP seed</string>
<string name="server_lab_path_grpc">نوم خدمات gRPC</string> <string name="server_lab_path_grpc">نوم خدمات gRPC</string>
<string name="server_lab_stream_security">TLS</string> <string name="server_lab_stream_security">TLS</string>
<string name="server_lab_stream_fingerprint" translatable="false">Fingerprint</string> <string name="server_lab_stream_fingerprint" translatable="false">Fingerprint</string>
@@ -82,12 +83,12 @@
<string name="server_lab_flow">جریان</string> <string name="server_lab_flow">جریان</string>
<string name="server_lab_public_key">کیلیت پوی وولاتی</string> <string name="server_lab_public_key">کیلیت پوی وولاتی</string>
<string name="server_lab_preshared_key">کیلیت رمز ناهاڌن ازاف (اختیاری)</string> <string name="server_lab_preshared_key">کیلیت رمز ناهاڌن ازاف (اختیاری)</string>
<string name="server_lab_short_id">ShortId</string> <string name="server_lab_short_id">ShortID</string>
<string name="server_lab_spider_x">SpiderX</string> <string name="server_lab_spider_x">SpiderX</string>
<string name="server_lab_secret_key">کیلیت سیخومی</string> <string name="server_lab_secret_key">کیلیت سیخومی</string>
<string name="server_lab_reserved">Reserved(اختیاری، وا کاما ز یک جوڌا ابۊن)</string> <string name="server_lab_reserved">Reserved(اختیاری، وا کاما ز یک جوڌا ابۊن)</string>
<string name="server_lab_local_address">آدرس مهلی (اختیاری IPv4/IPv6، وا کاما ز یک جوڌا ابۊن)</string> <string name="server_lab_local_address">آدرس مهلی (اختیاری IPv4/IPv6، وا کاما ز یک جوڌا ابۊن)</string>
<string name="server_lab_local_mtu">Mtu(اختیاری، خوتکار 1420)</string> <string name="server_lab_local_mtu">Mtu(اختیاری، پؽش فرز 1420)</string>
<string name="toast_success">وا مووفقیت ٱنجوم وابی</string> <string name="toast_success">وا مووفقیت ٱنجوم وابی</string>
<string name="toast_failure">شکست خرد</string> <string name="toast_failure">شکست خرد</string>
<string name="toast_none_data">هیچ داده ای وۊجۊڌ نڌاره</string> <string name="toast_none_data">هیچ داده ای وۊجۊڌ نڌاره</string>
@@ -107,7 +108,7 @@
<string name="toast_asset_copy_failed">لف گیری فایل ٱنجوم نوابی، ز ی برنومه دؽوۉداری فایل هیاری بگرین</string> <string name="toast_asset_copy_failed">لف گیری فایل ٱنجوم نوابی، ز ی برنومه دؽوۉداری فایل هیاری بگرین</string>
<string name="menu_item_add_asset">ازاف کردن دارایی</string> <string name="menu_item_add_asset">ازاف کردن دارایی</string>
<string name="menu_item_add_file">ازاف کردن فایل</string> <string name="menu_item_add_file">ازاف کردن فایل</string>
<string name="menu_item_add_url">ازاف کردن آدرس اینترنتی</string> <string name="menu_item_add_url">ازاف کردن لینگ</string>
<string name="menu_item_scan_qrcode">اسکن QRcode</string> <string name="menu_item_scan_qrcode">اسکن QRcode</string>
<string name="title_url">آدرس اینترنتی</string> <string name="title_url">آدرس اینترنتی</string>
<string name="menu_item_download_file">دانلود فایلا</string> <string name="menu_item_download_file">دانلود فایلا</string>
@@ -115,7 +116,7 @@
<string name="msg_file_not_found">فایلن نجوست</string> <string name="msg_file_not_found">فایلن نجوست</string>
<string name="msg_remark_is_duplicate">ائزارات ز زیتر بیڌسۉݩ</string> <string name="msg_remark_is_duplicate">ائزارات ز زیتر بیڌسۉݩ</string>
<string name="toast_action_not_allowed">ای کار ممنۊ هڌ</string> <string name="toast_action_not_allowed">ای کار ممنۊ هڌ</string>
<string name="server_obfs_password">رزم Obfs</string> <string name="server_obfs_password">رزم obfs</string>
<string name="server_lab_port_hop">پورت گوم (درگا سرورن ز نۊ هؽل اکونه)</string> <string name="server_lab_port_hop">پورت گوم (درگا سرورن ز نۊ هؽل اکونه)</string>
<string name="server_lab_port_hop_interval">فاسله پورت گوم (سانیه)</string> <string name="server_lab_port_hop_interval">فاسله پورت گوم (سانیه)</string>
<string name="server_lab_stream_pinsha256">pinSHA256</string> <string name="server_lab_stream_pinsha256">pinSHA256</string>
@@ -176,7 +177,7 @@
<string name="summary_pref_remote_dns">DNS</string> <string name="summary_pref_remote_dns">DNS</string>
<string name="title_pref_vpn_dns">VPN DNS (تینا IPv4/v6)</string> <string name="title_pref_vpn_dns">VPN DNS (تینا IPv4/v6)</string>
<string name="title_pref_vpn_bypass_lan">Does VPN bypass LAN</string> <string name="title_pref_vpn_bypass_lan">VPN ز شبکه مهلی اگوڌرته؟</string>
<string name="title_pref_domestic_dns">DNS منی (اختیاری)</string> <string name="title_pref_domestic_dns">DNS منی (اختیاری)</string>
<string name="summary_pref_domestic_dns">DNS</string> <string name="summary_pref_domestic_dns">DNS</string>
@@ -187,9 +188,9 @@
<string name="title_pref_delay_test_url">آدرس اینترنتی آزمایش تئخیر واقعی (http/https)</string> <string name="title_pref_delay_test_url">آدرس اینترنتی آزمایش تئخیر واقعی (http/https)</string>
<string name="summary_pref_delay_test_url">نشۊوی اینترنتی</string> <string name="summary_pref_delay_test_url">نشۊوی اینترنتی</string>
<string name="title_pref_proxy_sharing_enabled">هشتن منپیزا ز LAN</string> <string name="title_pref_proxy_sharing_enabled">هشتن منپیزا ز شبکه مهلی</string>
<string name="summary_pref_proxy_sharing_enabled">پوی دسگایل ترن وا آدرس IP ایسا، ز ر socks/http و پروکسی منپیز بۊن، تینا من شبکه قابل اعتماد فعال بۊ تا ز منپیز ؛یر موجاز جلو گری بۊ.</string> <string name="summary_pref_proxy_sharing_enabled">پوی دسگایل ترن وا آدرس IP ایسا، ز ر socks/http و پروکسی منپیز بۊن، تینا من شبکه قابل اعتماد فعال بۊ تا ز منپیز ؛یر موجاز جلو گری بۊ.</string>
<string name="toast_warning_pref_proxysharing_short">منپیزا ز LAN ن موجار کۊنین، موتمعن بۊین ک من ی شبکه قابل ائتماڌ هڌین.</string> <string name="toast_warning_pref_proxysharing_short">منپیزا ز شبکه مهلی ن موجار کۊنین، موتمعن بۊین ک من ی شبکه قابل ائتماڌ هڌین.</string>
<string name="title_pref_allow_insecure">اجازه نا ٱمن</string> <string name="title_pref_allow_insecure">اجازه نا ٱمن</string>
<string name="summary_pref_allow_insecure">مجال و کار بردن TLS ب تۉر پؽش فرز، موجوز نا ٱمن فعال هڌ.</string> <string name="summary_pref_allow_insecure">مجال و کار بردن TLS ب تۉر پؽش فرز، موجوز نا ٱمن فعال هڌ.</string>
@@ -232,7 +233,7 @@
<string name="title_core_loglevel">سئت داسووا</string> <string name="title_core_loglevel">سئت داسووا</string>
<string name="title_mode">هالت</string> <string name="title_mode">هالت</string>
<string name="title_mode_help">سی هیاری بیشتر ری ای هؽل بزݩ</string> <string name="title_mode_help">سی دووسمندیا وو هیاری بیشتر، ری ای هؽل بزݩ</string>
<string name="title_language">زۉݩ</string> <string name="title_language">زۉݩ</string>
<string name="title_ui_settings">سامووا رابت منتوری</string> <string name="title_ui_settings">سامووا رابت منتوری</string>
<string name="title_pref_ui_mode_night">سامووا هالت رابت منتوری</string> <string name="title_pref_ui_mode_night">سامووا هالت رابت منتوری</string>
@@ -248,12 +249,12 @@
<string name="title_sub_setting">سامووا جرگه اشتراک</string> <string name="title_sub_setting">سامووا جرگه اشتراک</string>
<string name="sub_setting_remarks">نیشتنا</string> <string name="sub_setting_remarks">نیشتنا</string>
<string name="sub_setting_url">نشۊوی اینترنتی اختیاری</string> <string name="sub_setting_url">نشۊوی اینترنتی اختیاری</string>
<string name="sub_setting_filter">نیشتنا فیلتر مئمۊلی</string> <string name="sub_setting_filter">نوم موستعار فیلتر</string>
<string name="sub_setting_enable">فعال بیڌن ورۊ کردن</string> <string name="sub_setting_enable">فعال بیڌن ورۊ کردن</string>
<string name="sub_auto_update">فعال بیڌن ورۊ کردن خوتکار</string> <string name="sub_auto_update">فعال بیڌن ورۊ کردن خوتکار</string>
<string name="sub_setting_pre_profile">نیشتنا پروکسی پؽشی</string> <string name="sub_setting_pre_profile">نوم موستعار پروکسی دیندایی</string>
<string name="sub_setting_next_profile">نیشتنا پروکسی نیایی</string> <string name="sub_setting_next_profile">نوم موستعار پروکسی نیایی</string>
<string name="sub_setting_pre_profile_tip">نیشتنا هڌسۉݩ وو هرف نارن</string> <string name="sub_setting_pre_profile_tip">موتمعن بۊ ک نوم موستعار هڌس وو جۊرس نی</string>
<string name="title_sub_update">ورۊ کردن اشتراک جرگه سکویی</string> <string name="title_sub_update">ورۊ کردن اشتراک جرگه سکویی</string>
<string name="title_ping_all_server">Tcping کانفیگا جرگه سکویی</string> <string name="title_ping_all_server">Tcping کانفیگا جرگه سکویی</string>
<string name="title_real_ping_all_server">تئخیر واقعی کانفیگا جرگه سکویی</string> <string name="title_real_ping_all_server">تئخیر واقعی کانفیگا جرگه سکویی</string>
@@ -340,9 +341,9 @@
</string-array> </string-array>
<string-array name="vpn_bypass_lan"> <string-array name="vpn_bypass_lan">
<item>Follow config</item> <item>پؽش فرز کانفیگ</item>
<item>Bypass</item> <item>دور زیڌه بۊ</item>
<item>Not Bypass</item> <item>دور زیڌه نبۊ</item>
</string-array> </string-array>
</resources> </resources>

View File

@@ -8,6 +8,7 @@
<string name="navigation_drawer_close">بستن منو کشویی</string> <string name="navigation_drawer_close">بستن منو کشویی</string>
<string name="migration_success">موفقیت در انتقال داده</string> <string name="migration_success">موفقیت در انتقال داده</string>
<string name="migration_fail">انتقال داده انجام نشد!</string> <string name="migration_fail">انتقال داده انجام نشد!</string>
<string name="pull_down_to_refresh">Please pull down to refresh!</string>
<!-- Notifications --> <!-- Notifications -->
<string name="notification_action_stop_v2ray">توقف</string> <string name="notification_action_stop_v2ray">توقف</string>
@@ -69,7 +70,7 @@
<string name="server_lab_path_grpc">gRPC ServiceName</string> <string name="server_lab_path_grpc">gRPC ServiceName</string>
<string name="server_lab_stream_security">TLS</string> <string name="server_lab_stream_security">TLS</string>
<string name="server_lab_stream_fingerprint">اثرانگشت</string> <string name="server_lab_stream_fingerprint">اثرانگشت</string>
<string name="server_lab_stream_alpn">AlPN</string> <string name="server_lab_stream_alpn">Alpn</string>
<string name="server_lab_allow_insecure">اعطای مجوز ناامن</string> <string name="server_lab_allow_insecure">اعطای مجوز ناامن</string>
<string name="server_lab_sni">SNI</string> <string name="server_lab_sni">SNI</string>
<string name="server_lab_address3">نشانی</string> <string name="server_lab_address3">نشانی</string>
@@ -155,7 +156,7 @@
<string name="title_pref_speed_enabled">فعال کردن نمایش سرعت</string> <string name="title_pref_speed_enabled">فعال کردن نمایش سرعت</string>
<string name="summary_pref_speed_enabled">نمایش سرعت فعلی در قسمت اعلان. \nآیکون اعلان بر اساس استفاده تغییر می‌کند.</string> <string name="summary_pref_speed_enabled">نمایش سرعت فعلی در قسمت اعلان. \nآیکون اعلان بر اساس استفاده تغییر می‌کند.</string>
<string name="title_pref_sniffing_enabled">فعال کردن تجزیه و تحلیل بسته ها (SNIFFING)</string> <string name="title_pref_sniffing_enabled">فعال کردن تجزیه و تحلیل بسته ها (Sniffing)</string>
<string name="summary_pref_sniffing_enabled">استفاده از تشخیص نام دامنه (Sniff) در بسته ها (به طور پیش فرض فعال است)</string> <string name="summary_pref_sniffing_enabled">استفاده از تشخیص نام دامنه (Sniff) در بسته ها (به طور پیش فرض فعال است)</string>
<string name="title_pref_route_only_enabled">فعال کردن دامنه فقط مسیر یابی (RouteOnly)</string> <string name="title_pref_route_only_enabled">فعال کردن دامنه فقط مسیر یابی (RouteOnly)</string>
<string name="summary_pref_route_only_enabled">از نام دامنه (Snnifed) فقط برای مسیریابی استفاده کنید و آدرس مقصد را به عنوان IP ذخیره کنید.</string> <string name="summary_pref_route_only_enabled">از نام دامنه (Snnifed) فقط برای مسیریابی استفاده کنید و آدرس مقصد را به عنوان IP ذخیره کنید.</string>
@@ -179,8 +180,8 @@
<string name="title_pref_domestic_dns">DNS داخلی (اختیاری)</string> <string name="title_pref_domestic_dns">DNS داخلی (اختیاری)</string>
<string name="summary_pref_domestic_dns">DNS</string> <string name="summary_pref_domestic_dns">DNS</string>
<string name="title_pref_dns_hosts">DNS مستقیم هاست(فرمت: دامنه: آدرس،…)</string> <string name="title_pref_dns_hosts">DNS مستقیم هاست (فرمت: دامنه:آدرس،…)</string>
<string name="summary_pref_dns_hosts">دامنه: آدرس، </string> <string name="summary_pref_dns_hosts">دامنه:آدرس،…</string>
<string name="title_pref_delay_test_url">آدرس اینترنتی آزمایش تاخیر واقعی کانفیگ ها (HTTP/HTTPS)</string> <string name="title_pref_delay_test_url">آدرس اینترنتی آزمایش تاخیر واقعی کانفیگ ها (HTTP/HTTPS)</string>
<string name="summary_pref_delay_test_url">URL</string> <string name="summary_pref_delay_test_url">URL</string>

View File

@@ -7,6 +7,7 @@
<string name="navigation_drawer_close">Закрыть панель навигации</string> <string name="navigation_drawer_close">Закрыть панель навигации</string>
<string name="migration_success">Успешный перенос данных!</string> <string name="migration_success">Успешный перенос данных!</string>
<string name="migration_fail">Перенос данных не выполнен!</string> <string name="migration_fail">Перенос данных не выполнен!</string>
<string name="pull_down_to_refresh">Please pull down to refresh!</string>
<!-- Notifications --> <!-- Notifications -->
<string name="notification_action_stop_v2ray">Остановить</string> <string name="notification_action_stop_v2ray">Остановить</string>

View File

@@ -7,6 +7,7 @@
<string name="navigation_drawer_close">Đóng Menu ứng dụng</string> <string name="navigation_drawer_close">Đóng Menu ứng dụng</string>
<string name="migration_success">Đã chuyển dữ liệu!</string> <string name="migration_success">Đã chuyển dữ liệu!</string>
<string name="migration_fail">Không thể chuyển dữ liệu!</string> <string name="migration_fail">Không thể chuyển dữ liệu!</string>
<string name="pull_down_to_refresh">Please pull down to refresh!</string>
<!-- Notifications --> <!-- Notifications -->
<string name="notification_action_stop_v2ray">Ngắt kết nối v2rayNG</string> <string name="notification_action_stop_v2ray">Ngắt kết nối v2rayNG</string>

View File

@@ -7,6 +7,7 @@
<string name="navigation_drawer_close">Close navigation drawer</string> <string name="navigation_drawer_close">Close navigation drawer</string>
<string name="migration_success">数据迁移成功!</string> <string name="migration_success">数据迁移成功!</string>
<string name="migration_fail">数据迁移失败啦!</string> <string name="migration_fail">数据迁移失败啦!</string>
<string name="pull_down_to_refresh">请下拉刷新!</string>
<!-- Notifications --> <!-- Notifications -->
<string name="notification_action_stop_v2ray">停止</string> <string name="notification_action_stop_v2ray">停止</string>

View File

@@ -7,6 +7,7 @@
<string name="navigation_drawer_close">關閉導覽匣</string> <string name="navigation_drawer_close">關閉導覽匣</string>
<string name="migration_success">資料遷移成功!</string> <string name="migration_success">資料遷移成功!</string>
<string name="migration_fail">資料遷移失敗!</string> <string name="migration_fail">資料遷移失敗!</string>
<string name="pull_down_to_refresh">請下拉刷新!</string>
<!-- Notifications --> <!-- Notifications -->
<string name="notification_action_stop_v2ray">停止</string> <string name="notification_action_stop_v2ray">停止</string>

View File

@@ -8,6 +8,7 @@
<string name="navigation_drawer_close">Close navigation drawer</string> <string name="navigation_drawer_close">Close navigation drawer</string>
<string name="migration_success">Data migration success!</string> <string name="migration_success">Data migration success!</string>
<string name="migration_fail">Data migration failed!</string> <string name="migration_fail">Data migration failed!</string>
<string name="pull_down_to_refresh">Please pull down to refresh!</string>
<!-- Notifications --> <!-- Notifications -->
<string name="notification_action_stop_v2ray">Stop</string> <string name="notification_action_stop_v2ray">Stop</string>

View File

@@ -17,6 +17,7 @@ quickieFoss = "1.13.1"
rxjava = "3.1.9" rxjava = "3.1.9"
rxandroid = "3.0.2" rxandroid = "3.0.2"
rxpermissions = "0.12" rxpermissions = "0.12"
swiperefreshlayout = "1.1.0"
toastcompat = "1.1.0" toastcompat = "1.1.0"
editorkit = "2.9.0" editorkit = "2.9.0"
core = "3.5.3" core = "3.5.3"
@@ -29,6 +30,7 @@ preferenceKtx = "1.2.1"
recyclerview = "1.3.2" recyclerview = "1.3.2"
[libraries] [libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
androidx-swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "swiperefreshlayout" }
desugar_jdk_libs = { module = "com.android.tools:desugar_jdk_libs", version.ref = "desugar_jdk_libs" } desugar_jdk_libs = { module = "com.android.tools:desugar_jdk_libs", version.ref = "desugar_jdk_libs" }
gradle-license-plugin = { module = "com.jaredsburrows:gradle-license-plugin", version.ref = "gradleLicensePlugin" } gradle-license-plugin = { module = "com.jaredsburrows:gradle-license-plugin", version.ref = "gradleLicensePlugin" }
junit = { group = "junit", name = "junit", version.ref = "junit" } junit = { group = "junit", name = "junit", version.ref = "junit" }

View File

@@ -14,7 +14,7 @@ for target in "${targets[@]}"; do
echo "Building for ${abi} with ${ndk_target} (${goarch})" echo "Building for ${abi} with ${ndk_target} (${goarch})"
CC="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/${ndk_target}-clang" CGO_ENABLED=1 CGO_LDFLAGS="-Wl,-z,max-page-size=16384" GOOS=android GOARCH=$goarch go build -o libs/$abi/libhysteria2.so -trimpath -ldflags "-s -w -buildid=" ./app CC="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin/${ndk_target}-clang" CGO_ENABLED=1 CGO_LDFLAGS="-Wl,-z,max-page-size=16384" GOOS=android GOARCH=$goarch go build -o libs/$abi/libhysteria2.so -trimpath -ldflags "-s -w -buildid=" -buildvcs=false ./app
echo "Built libhysteria2.so for ${abi}" echo "Built libhysteria2.so for ${abi}"
done done