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