From 005dd9f1a8d6302debfa5017c9f843b83d5562c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20Sua=CC=81rez=20Ruiz?= Date: Fri, 26 Jun 2020 12:59:19 +0200 Subject: [PATCH] Updated the logic to detect the Idiom on Android (based on Xamarin.Essentials) --- Xamarin.Forms.Platform.Android/Forms.cs | 34 +++++++++++++++++++------ 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/Xamarin.Forms.Platform.Android/Forms.cs b/Xamarin.Forms.Platform.Android/Forms.cs index db4e72648d2..941facdd36a 100644 --- a/Xamarin.Forms.Platform.Android/Forms.cs +++ b/Xamarin.Forms.Platform.Android/Forms.cs @@ -366,7 +366,7 @@ static void SetupInit( var currentIdiom = TargetIdiom.Unsupported; - // first try UIModeManager + // First try UIModeManager using (var uiModeManager = UiModeManager.FromContext(ApplicationContext)) { try @@ -380,11 +380,29 @@ static void SetupInit( } } + // Then try Configuration if (TargetIdiom.Unsupported == currentIdiom) { - // This could change as a result of a config change, so we need to check it every time - int minWidthDp = activity.Resources.Configuration.SmallestScreenWidthDp; - Device.SetIdiom(minWidthDp >= TabletCrossover ? TargetIdiom.Tablet : TargetIdiom.Phone); + var configuration = ApplicationContext.Resources?.Configuration; + + if (configuration != null) + { + var minWidth = configuration.SmallestScreenWidthDp; + var isWide = minWidth >= TabletCrossover; + currentIdiom = isWide ? TargetIdiom.Tablet : TargetIdiom.Phone; + } + else + { + // Start clutching at straws + var metrics = ApplicationContext.Resources?.DisplayMetrics; + + if (metrics != null) + { + var minSize = Math.Min(metrics.WidthPixels, metrics.HeightPixels); + var isWide = minSize * metrics.Density >= TabletCrossover; + currentIdiom = isWide ? TargetIdiom.Tablet : TargetIdiom.Phone; + } + } } if (SdkInt >= BuildVersionCodes.JellyBeanMr1) @@ -400,13 +418,13 @@ static void SetupInit( static TargetIdiom DetectIdiom(UiMode uiMode) { var returnValue = TargetIdiom.Unsupported; - if (uiMode.HasFlag(UiMode.TypeNormal)) + if (uiMode == UiMode.TypeNormal) returnValue = TargetIdiom.Unsupported; - else if (uiMode.HasFlag(UiMode.TypeTelevision)) + else if (uiMode == UiMode.TypeTelevision) returnValue = TargetIdiom.TV; - else if (uiMode.HasFlag(UiMode.TypeDesk)) + else if (uiMode == UiMode.TypeDesk) returnValue = TargetIdiom.Desktop; - else if (SdkInt >= BuildVersionCodes.KitkatWatch && uiMode.HasFlag(UiMode.TypeWatch)) + else if (SdkInt >= BuildVersionCodes.KitkatWatch && uiMode == UiMode.TypeWatch) returnValue = TargetIdiom.Watch; Device.SetIdiom(returnValue);