From 70aa1ac5c682dc345106efe39ad781ae2452a2b3 Mon Sep 17 00:00:00 2001 From: Andre Rosado Date: Fri, 16 Jan 2026 13:56:22 +0000 Subject: [PATCH] Set landscape orientation for HorizonOS devices --- .../kotlin/com/x8bit/bitwarden/MainActivity.kt | 8 ++++++++ .../com/bitwarden/core/util/AndroidPropUtils.kt | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/MainActivity.kt b/app/src/main/kotlin/com/x8bit/bitwarden/MainActivity.kt index 512e9f3ddf..bb5e274c3e 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/MainActivity.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/MainActivity.kt @@ -2,6 +2,7 @@ package com.x8bit.bitwarden import android.app.ComponentCaller import android.content.Intent +import android.content.pm.ActivityInfo import android.os.Build import android.os.Bundle import android.view.KeyEvent @@ -22,6 +23,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.NavController import androidx.navigation.compose.NavHost import com.bitwarden.annotation.OmitFromCoverage +import com.bitwarden.core.util.isHorizonOS import com.bitwarden.ui.platform.base.util.EventsEffect import com.bitwarden.ui.platform.theme.BitwardenTheme import com.bitwarden.ui.platform.util.setupEdgeToEdge @@ -85,6 +87,12 @@ class MainActivity : AppCompatActivity() { var shouldShowSplashScreen = true installSplashScreen().setKeepOnScreenCondition { shouldShowSplashScreen } super.onCreate(savedInstanceState) + + // Set landscape orientation for Horizon OS devices + if (isHorizonOS()) { + requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE + } + window.decorView.filterTouchesWhenObscured = true if (savedInstanceState == null) { mainViewModel.trySendAction(MainAction.ReceiveFirstIntent(intent = intent)) diff --git a/core/src/main/kotlin/com/bitwarden/core/util/AndroidPropUtils.kt b/core/src/main/kotlin/com/bitwarden/core/util/AndroidPropUtils.kt index ee742132a9..97c36e958e 100644 --- a/core/src/main/kotlin/com/bitwarden/core/util/AndroidPropUtils.kt +++ b/core/src/main/kotlin/com/bitwarden/core/util/AndroidPropUtils.kt @@ -5,12 +5,26 @@ package com.bitwarden.core.util import com.bitwarden.annotation.OmitFromCoverage private const val KEY_XIAOMI_HYPER_OS_NAME = "ro.mi.os.version.name" +private const val HORIZON_OS_SDK = "horizonos.os.Build\$HorizonOsSdk" /** * Returns true if the device is running Xiaomi HyperOS. */ fun isHyperOS(): Boolean = !getSystemProperty(KEY_XIAOMI_HYPER_OS_NAME).isNullOrEmpty() +/** + * Returns true if the device is running Horizon OS. + */ +fun isHorizonOS(): Boolean { + return try { + val horizonOsSdk = Class.forName(HORIZON_OS_SDK) + val getVersionMethod = horizonOsSdk.getMethod("getVersion") + getVersionMethod.invoke(null) != null + } catch (_: Throwable) { + false + } +} + /** * Reads an Android system property using the android.os.SystemProperties API *