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