diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainBottomBar.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainBottomBar.kt
index ce88845557..c69edcdda7 100644
--- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainBottomBar.kt
+++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainBottomBar.kt
@@ -20,9 +20,15 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
@@ -31,6 +37,8 @@ import com.v2ray.ang.ui.compose.AppDivider
import com.v2ray.ang.ui.compose.colorFabActive
import com.v2ray.ang.ui.compose.colorFabInactiveDark
import com.v2ray.ang.ui.compose.colorFabInactiveLight
+import android.view.accessibility.AccessibilityEvent
+import android.view.accessibility.AccessibilityManager
@Composable
fun MainBottomBar(
@@ -39,6 +47,32 @@ fun MainBottomBar(
isDarkTheme: Boolean,
onAction: (MainAction) -> Unit
) {
+ val context = LocalContext.current
+ var lastAnnouncedText by remember { mutableStateOf("") }
+ var isInitialLoad by remember { mutableStateOf(true) }
+
+ LaunchedEffect(displayText) {
+ if (isInitialLoad) {
+ isInitialLoad = false
+ return@LaunchedEffect
+ }
+
+ if (displayText.isNotEmpty() && displayText != lastAnnouncedText) {
+ lastAnnouncedText = displayText
+ try {
+ val am = context.getSystemService(android.content.Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
+ if (am.isEnabled) {
+ val event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_ANNOUNCEMENT)
+ event.text.add(displayText)
+ am.sendAccessibilityEvent(event)
+ event.recycle()
+ }
+ } catch (e: Exception) {
+ // ignore
+ }
+ }
+ }
+
Box(modifier = Modifier.fillMaxWidth()) {
Column(modifier = Modifier.fillMaxWidth()) {
AppDivider()
@@ -84,4 +118,4 @@ fun MainBottomBar(
)
}
}
-}
+}
\ No newline at end of file
diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainServerPager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainServerPager.kt
index dad6ef8364..bd6d5e355d 100644
--- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainServerPager.kt
+++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/main/MainServerPager.kt
@@ -36,6 +36,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.LineBreak
import androidx.compose.ui.text.style.TextOverflow
@@ -351,12 +352,12 @@ fun ServerListItem(
Text(remarks, Modifier.weight(1f), style = MaterialTheme.typography.bodyLarge.copy(lineBreak = LineBreak.Paragraph), maxLines = 2, overflow = TextOverflow.Ellipsis)
if (doubleColumnDisplay) {
IconButton(onClick = onMore, Modifier.size(36.dp)) {
- Icon(painterResource(R.drawable.ic_more_vert_24dp), null, Modifier.size(24.dp))
+ Icon(painterResource(R.drawable.ic_more_vert_24dp), stringResource(R.string.acc_more), Modifier.size(24.dp))
}
} else {
- IconButton(onClick = onShare, Modifier.size(36.dp)) { Icon(painterResource(R.drawable.ic_share_24dp), null, Modifier.size(24.dp)) }
- IconButton(onClick = onEdit, Modifier.size(36.dp)) { Icon(painterResource(R.drawable.ic_edit_24dp), null, Modifier.size(24.dp)) }
- IconButton(onClick = onRemove, Modifier.size(36.dp)) { Icon(painterResource(R.drawable.ic_delete_24dp), null, Modifier.size(24.dp)) }
+ IconButton(onClick = onShare, Modifier.size(36.dp)) { Icon(painterResource(R.drawable.ic_share_24dp), stringResource(R.string.acc_share_server), Modifier.size(24.dp)) }
+ IconButton(onClick = onEdit, Modifier.size(36.dp)) { Icon(painterResource(R.drawable.ic_edit_24dp), stringResource(R.string.acc_edit), Modifier.size(24.dp)) }
+ IconButton(onClick = onRemove, Modifier.size(36.dp)) { Icon(painterResource(R.drawable.ic_delete_24dp), stringResource(R.string.acc_delete), Modifier.size(24.dp)) }
}
}
Spacer(modifier = Modifier.height(6.dp))
@@ -414,4 +415,4 @@ internal suspend fun PagerState.navigateToPageOptimized(
} else {
scrollToPage(target)
}
-}
+}
\ No newline at end of file
diff --git a/V2rayNG/app/src/main/res/values-fa/strings.xml b/V2rayNG/app/src/main/res/values-fa/strings.xml
index f16f1d5f0d..3762020848 100644
--- a/V2rayNG/app/src/main/res/values-fa/strings.xml
+++ b/V2rayNG/app/src/main/res/values-fa/strings.xml
@@ -516,6 +516,7 @@
جستجو
افزودن کانفیگ
گزینههای بیشتر
+اشتراکگذاری
اشتراکگذاری لینک اشتراک
اشتراکگذاری گزارش
حذف عضو زنجیره پروکسی
diff --git a/V2rayNG/app/src/main/res/values/strings.xml b/V2rayNG/app/src/main/res/values/strings.xml
index bf8c2ec7fd..174805a4bc 100644
--- a/V2rayNG/app/src/main/res/values/strings.xml
+++ b/V2rayNG/app/src/main/res/values/strings.xml
@@ -532,6 +532,7 @@
Save
Update subscriptions
Per-app proxy information
+Share
Camera
Notification
Local network