summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Xamarin.Forms.Platform.Android/Forms.cs21
1 files changed, 13 insertions, 8 deletions
diff --git a/Xamarin.Forms.Platform.Android/Forms.cs b/Xamarin.Forms.Platform.Android/Forms.cs
index fd742875..3d2a735c 100644
--- a/Xamarin.Forms.Platform.Android/Forms.cs
+++ b/Xamarin.Forms.Platform.Android/Forms.cs
@@ -130,10 +130,7 @@ namespace Xamarin.Forms
Device.info = null;
}
- // probably could be done in a better way
- var deviceInfoProvider = activity as IDeviceInfoProvider;
- if (deviceInfoProvider != null)
- Device.Info = new AndroidDeviceInfo(deviceInfoProvider);
+ Device.Info = new AndroidDeviceInfo(activity);
var ticker = Ticker.Default as AndroidTicker;
if (ticker != null)
@@ -190,17 +187,21 @@ namespace Xamarin.Forms
class AndroidDeviceInfo : DeviceInfo
{
- readonly IDeviceInfoProvider _formsActivity;
+ bool disposed;
+ readonly Context _formsActivity;
readonly Size _pixelScreenSize;
readonly double _scalingFactor;
Orientation _previousOrientation = Orientation.Undefined;
- public AndroidDeviceInfo(IDeviceInfoProvider formsActivity)
+ public AndroidDeviceInfo(Context formsActivity)
{
_formsActivity = formsActivity;
CheckOrientationChanged(_formsActivity.Resources.Configuration.Orientation);
- formsActivity.ConfigurationChanged += ConfigurationChanged;
+ // This will not be an implementation of IDeviceInfoProvider when running inside the context
+ // of layoutlib, which is what the Android Designer does.
+ if (_formsActivity is IDeviceInfoProvider)
+ ((IDeviceInfoProvider) _formsActivity).ConfigurationChanged += ConfigurationChanged;
using (DisplayMetrics display = formsActivity.Resources.DisplayMetrics)
{
@@ -224,7 +225,11 @@ namespace Xamarin.Forms
protected override void Dispose(bool disposing)
{
- _formsActivity.ConfigurationChanged -= ConfigurationChanged;
+ if (disposing && !disposed) {
+ disposed = true;
+ if (_formsActivity is IDeviceInfoProvider)
+ ((IDeviceInfoProvider) _formsActivity).ConfigurationChanged -= ConfigurationChanged;
+ }
base.Dispose(disposing);
}