diff --git a/V2rayNG/app/src/main/java/xyz/zarazaex/olc/AngApplication.kt b/V2rayNG/app/src/main/java/xyz/zarazaex/olc/AngApplication.kt
index 89640f8f..b2509754 100644
--- a/V2rayNG/app/src/main/java/xyz/zarazaex/olc/AngApplication.kt
+++ b/V2rayNG/app/src/main/java/xyz/zarazaex/olc/AngApplication.kt
@@ -32,8 +32,9 @@ class AngApplication : Application() {
*/
override fun onCreate() {
super.onCreate()
- // Apply Material You dynamic colors (Android 12+)
- DynamicColors.applyToActivitiesIfAvailable(this)
+ // DynamicColors отключён — на Android 12-15 он красит статус-бар в акцент ОС
+ // и это нельзя переопределить через statusBarColor
+ // DynamicColors.applyToActivitiesIfAvailable(this)
val mmkvDir = java.io.File(filesDir, "mmkv")
if (!java.io.File(mmkvDir, "MAIN").exists()) {
diff --git a/V2rayNG/app/src/main/java/xyz/zarazaex/olc/ui/BaseActivity.kt b/V2rayNG/app/src/main/java/xyz/zarazaex/olc/ui/BaseActivity.kt
index 6d171cb6..ac9ba288 100644
--- a/V2rayNG/app/src/main/java/xyz/zarazaex/olc/ui/BaseActivity.kt
+++ b/V2rayNG/app/src/main/java/xyz/zarazaex/olc/ui/BaseActivity.kt
@@ -1,7 +1,6 @@
package xyz.zarazaex.olc.ui
import android.content.Context
-import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.view.LayoutInflater
import android.view.MenuItem
@@ -16,7 +15,6 @@ import androidx.core.view.WindowCompat
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.appbar.MaterialToolbar
-import com.google.android.material.color.MaterialColors
import com.google.android.material.progressindicator.LinearProgressIndicator
import xyz.zarazaex.olc.R
import xyz.zarazaex.olc.handler.SettingsManager
@@ -187,13 +185,10 @@ abstract class BaseActivity : AppCompatActivity() {
}
private fun syncStatusBarWithToolbar(toolbar: Toolbar) {
- val toolbarColor = (toolbar.background as? ColorDrawable)?.color
- ?: toolbar.backgroundTintList?.defaultColor
- ?: MaterialColors.getColor(toolbar, com.google.android.material.R.attr.colorSurface)
-
- window.statusBarColor = toolbarColor
+ // Статус-бар прозрачный (задан в теме). Управляем только цветом иконок.
+ val bgColor = ContextCompat.getColor(this, R.color.md_theme_surface)
WindowCompat.getInsetsController(window, window.decorView)?.isAppearanceLightStatusBars =
- ColorUtils.calculateLuminance(toolbarColor) > 0.5
+ ColorUtils.calculateLuminance(bgColor) > 0.5
}
/**
diff --git a/V2rayNG/app/src/main/java/xyz/zarazaex/olc/ui/MainActivity.kt b/V2rayNG/app/src/main/java/xyz/zarazaex/olc/ui/MainActivity.kt
index 9cfc9aad..e356fe87 100644
--- a/V2rayNG/app/src/main/java/xyz/zarazaex/olc/ui/MainActivity.kt
+++ b/V2rayNG/app/src/main/java/xyz/zarazaex/olc/ui/MainActivity.kt
@@ -18,6 +18,7 @@ import androidx.appcompat.widget.SearchView
import androidx.core.content.ContextCompat
import androidx.core.view.GravityCompat
import androidx.core.view.ViewCompat
+import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
@@ -76,6 +77,19 @@ class MainActivity : HelperBaseActivity(), NavigationView.OnNavigationItemSelect
setContentView(binding.root)
setupToolbar(binding.toolbar, false, getString(R.string.app_name))
+ // edge-to-edge: контент идёт под статус-бар, AppBarLayout тянется под него же
+ WindowCompat.setDecorFitsSystemWindows(window, false)
+ ViewCompat.setOnApplyWindowInsetsListener(binding.appBarLayout) { v, insets ->
+ v.setPadding(0, insets.getInsets(WindowInsetsCompat.Type.statusBars()).top, 0, 0)
+ insets
+ }
+ // Нижние кнопки поднимаются над навигационной панелью
+ ViewCompat.setOnApplyWindowInsetsListener(binding.bottomContainer) { v, insets ->
+ val navBarHeight = insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom
+ v.setPadding(0, 0, 0, navBarHeight)
+ insets
+ }
+
groupPagerAdapter = GroupPagerAdapter(this, emptyList())
binding.viewPager.adapter = groupPagerAdapter
binding.viewPager.isUserInputEnabled = true
@@ -171,15 +185,15 @@ class MainActivity : HelperBaseActivity(), NavigationView.OnNavigationItemSelect
mainViewModel.isTesting.observe(this) { testing ->
setButtonsEnabled(!testing)
if (testing) {
- // Allow stopping the test
binding.btnSummaryLite.isEnabled = true
binding.btnSummaryLite.alpha = 1.0f
+ binding.btnSummaryLite.setImageResource(R.drawable.ic_stop_24dp)
+ binding.btnSummaryLite.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.color_fab_active))
} else {
binding.btnSummaryLite.setImageResource(R.drawable.bolt_24)
- // Re-apply running state to set correct enabled state
- val isRunning = mainViewModel.isRunning.value == true
- binding.btnSummaryLite.isEnabled = !isRunning
- binding.btnSummaryLite.alpha = if (isRunning) 0.5f else 1.0f
+ binding.btnSummaryLite.isEnabled = true
+ binding.btnSummaryLite.alpha = 1.0f
+ binding.btnSummaryLite.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.color_fab_inactive))
}
}
@@ -414,6 +428,16 @@ class MainActivity : HelperBaseActivity(), NavigationView.OnNavigationItemSelect
private fun showStatus(resId: Int) = showStatus(getString(resId))
+ private fun accentColor(): ColorStateList {
+ val typedValue = android.util.TypedValue()
+ theme.resolveAttribute(androidx.appcompat.R.attr.colorPrimary, typedValue, true)
+ val color = if (typedValue.resourceId != 0)
+ ContextCompat.getColor(this, typedValue.resourceId)
+ else
+ typedValue.data
+ return ColorStateList.valueOf(color)
+ }
+
private fun applyRunningState(isLoading: Boolean, isRunning: Boolean) {
if (isLoading) {
binding.fab.isEnabled = false
@@ -424,27 +448,22 @@ class MainActivity : HelperBaseActivity(), NavigationView.OnNavigationItemSelect
if (isRunning) {
binding.fab.isEnabled = true
binding.fab.alpha = 1.0f
- binding.fab.setImageResource(R.drawable.security_24)
- binding.fab.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.color_fab_active))
- binding.btnSummaryLite.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.color_fab_active))
+ binding.fab.backgroundTintList = accentColor()
+ binding.btnSummaryLite.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.color_fab_inactive))
binding.fab.contentDescription = getString(R.string.action_stop_service)
setTestState(getString(R.string.connection_connected))
binding.layoutTest.isFocusable = true
- // Block lightning while VPN is connected (unless test is running)
- if (mainViewModel.isTesting.value != true) {
- binding.btnSummaryLite.isEnabled = false
- binding.btnSummaryLite.alpha = 0.5f
- }
+ // Молния всегда активна — пользователь может запустить тест даже при работающем VPN
+ binding.btnSummaryLite.isEnabled = true
+ binding.btnSummaryLite.alpha = 1.0f
} else {
binding.fab.isEnabled = true
binding.fab.alpha = 1.0f
- binding.fab.setImageResource(R.drawable.shield_24)
binding.fab.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.color_fab_inactive))
binding.btnSummaryLite.backgroundTintList = ColorStateList.valueOf(ContextCompat.getColor(this, R.color.color_fab_inactive))
binding.fab.contentDescription = getString(R.string.tasker_start_service)
setTestState(getString(R.string.connection_not_connected))
binding.layoutTest.isFocusable = false
- // Enable lightning when VPN is disconnected
binding.btnSummaryLite.isEnabled = true
binding.btnSummaryLite.alpha = 1.0f
}
diff --git a/V2rayNG/app/src/main/res/drawable/update_24.xml b/V2rayNG/app/src/main/res/drawable/update_24.xml
new file mode 100644
index 00000000..3448ac02
--- /dev/null
+++ b/V2rayNG/app/src/main/res/drawable/update_24.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/V2rayNG/app/src/main/res/layout/activity_main.xml b/V2rayNG/app/src/main/res/layout/activity_main.xml
index d74abb9b..8d189b49 100644
--- a/V2rayNG/app/src/main/res/layout/activity_main.xml
+++ b/V2rayNG/app/src/main/res/layout/activity_main.xml
@@ -4,17 +4,19 @@
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:fitsSystemWindows="true">
+ android:background="@color/md_theme_surface">
+ android:layout_height="wrap_content"
+ android:background="@color/md_theme_surface"
+ app:elevation="0dp">
diff --git a/V2rayNG/app/src/main/res/menu/menu_main.xml b/V2rayNG/app/src/main/res/menu/menu_main.xml
index 0cc78616..a2442996 100644
--- a/V2rayNG/app/src/main/res/menu/menu_main.xml
+++ b/V2rayNG/app/src/main/res/menu/menu_main.xml
@@ -13,15 +13,15 @@
android:title="Проверить задержку профилей"
app:showAsAction="always" />
+
+
-
-
\ No newline at end of file
diff --git a/V2rayNG/app/src/main/res/values/themes.xml b/V2rayNG/app/src/main/res/values/themes.xml
index 2cde196f..990b9f16 100644
--- a/V2rayNG/app/src/main/res/values/themes.xml
+++ b/V2rayNG/app/src/main/res/values/themes.xml
@@ -49,7 +49,7 @@
- @color/md_theme_inversePrimary
- - @color/md_theme_surface
+ - @android:color/transparent
- @color/md_theme_surface