From 5b437f50ccf171888fdb9f71873521e5959ca54c Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 6 Mar 2020 11:12:08 -0800 Subject: [PATCH 1/6] fix potential crash --- packages/in_app_purchase/CHANGELOG.md | 4 ++++ .../flutter/plugins/inapppurchase/InAppPurchasePlugin.java | 6 ++++-- packages/in_app_purchase/pubspec.yaml | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/in_app_purchase/CHANGELOG.md b/packages/in_app_purchase/CHANGELOG.md index d78df4f3f06f..2463ca74d8fd 100644 --- a/packages/in_app_purchase/CHANGELOG.md +++ b/packages/in_app_purchase/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.1+2 + +* Fix potential casting crash on Android v1 embedding when registering life cycle callbacks. + ## 0.3.1+1 * Add `pedantic` to dev_dependency. diff --git a/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java b/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java index b7edcfbcf5d5..5b7949a943f4 100644 --- a/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java +++ b/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java @@ -50,8 +50,10 @@ static final class MethodNames { public static void registerWith(Registrar registrar) { InAppPurchasePlugin plugin = new InAppPurchasePlugin(); plugin.setupMethodChannel(registrar.activity(), registrar.messenger(), registrar.context()); - ((Application) registrar.context()) - .registerActivityLifecycleCallbacks(plugin.methodCallHandler); + if (registrar.context().getApplicationContext() instanceof Application) { + ((Application) registrar.context().getApplicationContext()) + .registerActivityLifecycleCallbacks(plugin.methodCallHandler); + } } @Override diff --git a/packages/in_app_purchase/pubspec.yaml b/packages/in_app_purchase/pubspec.yaml index ff1f40443b22..b2fd2304ae5c 100644 --- a/packages/in_app_purchase/pubspec.yaml +++ b/packages/in_app_purchase/pubspec.yaml @@ -1,7 +1,7 @@ name: in_app_purchase description: A Flutter plugin for in-app purchases. Exposes APIs for making in-app purchases through the App Store and Google Play. homepage: https://github.com/flutter/plugins/tree/master/packages/in_app_purchase -version: 0.3.1+1 +version: 0.3.1+2 dependencies: From fa6804ae18609173852ca018e8c13a6cc6a543be Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 6 Mar 2020 11:42:13 -0800 Subject: [PATCH 2/6] tests --- .../inapppurchase/InAppPurchasePlugin.java | 3 +- .../InAppPurchasePluginTest.java | 48 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java diff --git a/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java b/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java index 5b7949a943f4..d96cf897e63e 100644 --- a/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java +++ b/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java @@ -50,7 +50,8 @@ static final class MethodNames { public static void registerWith(Registrar registrar) { InAppPurchasePlugin plugin = new InAppPurchasePlugin(); plugin.setupMethodChannel(registrar.activity(), registrar.messenger(), registrar.context()); - if (registrar.context().getApplicationContext() instanceof Application) { + if (registrar.context().getApplicationContext() != null + && registrar.context().getApplicationContext() instanceof Application) { ((Application) registrar.context().getApplicationContext()) .registerActivityLifecycleCallbacks(plugin.methodCallHandler); } diff --git a/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java b/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java new file mode 100644 index 000000000000..a11a46449727 --- /dev/null +++ b/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java @@ -0,0 +1,48 @@ +package io.flutter.plugins.inapppurchase; + +import static org.mockito.Mockito.when; + +import android.app.Activity; +import android.app.Application; +import android.content.Context; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugin.common.PluginRegistry; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +public class InAppPurchasePluginTest { + @Mock Activity activity; + @Mock Context context; + @Mock PluginRegistry.Registrar mockRegistrar; // For v1 embedding + @Mock BinaryMessenger mockMessenger; + @Mock Application mockApplication; + @Mock Context mockApplicatonContext; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + when(mockRegistrar.activity()).thenReturn(activity); + when(mockRegistrar.messenger()).thenReturn(mockMessenger); + when(mockRegistrar.context()).thenReturn(context); + } + + @Test + public void registerWith_doNotCrashWhenApplicationContextIsTypeContext() { + when(context.getApplicationContext()).thenReturn(mockApplicatonContext); + InAppPurchasePlugin.registerWith(mockRegistrar); + } + + @Test + public void registerWith_doNotCrashWhenApplicationContextIsTypeApplication() { + when(context.getApplicationContext()).thenReturn(mockApplication); + InAppPurchasePlugin.registerWith(mockRegistrar); + } + + @Test + public void registerWith_doNotCrashWhenApplicationContextIsNull() { + when(context.getApplicationContext()).thenReturn(null); + InAppPurchasePlugin.registerWith(mockRegistrar); + } +} From 2423162d5bdc2664432c00bbcbd2abcfe1848c62 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 6 Mar 2020 13:37:17 -0800 Subject: [PATCH 3/6] remove legacy build setting --- .../xcshareddata/WorkspaceSettings.xcsettings | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 packages/in_app_purchase/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings diff --git a/packages/in_app_purchase/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/packages/in_app_purchase/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index 949b67898200..000000000000 --- a/packages/in_app_purchase/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - BuildSystemType - Original - - From 216ee9bdad9d12531f237d64ca34e4fb5cecc779 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 6 Mar 2020 14:15:13 -0800 Subject: [PATCH 4/6] Update CHANGELOG.md --- packages/in_app_purchase/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/in_app_purchase/CHANGELOG.md b/packages/in_app_purchase/CHANGELOG.md index 2463ca74d8fd..9c454a8ee71c 100644 --- a/packages/in_app_purchase/CHANGELOG.md +++ b/packages/in_app_purchase/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.3.1+2 * Fix potential casting crash on Android v1 embedding when registering life cycle callbacks. +* Remove hard-coded legacy xcode build setting. ## 0.3.1+1 From a3abc729661eb20456042ce350bdb0e525314c56 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 6 Mar 2020 16:18:11 -0800 Subject: [PATCH 5/6] remove the null check --- .../inapppurchase/InAppPurchasePlugin.java | 7 ++----- .../inapppurchase/InAppPurchasePluginTest.java | 17 ++++------------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java b/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java index d96cf897e63e..de2080cfebf2 100644 --- a/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java +++ b/packages/in_app_purchase/android/src/main/java/io/flutter/plugins/inapppurchase/InAppPurchasePlugin.java @@ -50,11 +50,8 @@ static final class MethodNames { public static void registerWith(Registrar registrar) { InAppPurchasePlugin plugin = new InAppPurchasePlugin(); plugin.setupMethodChannel(registrar.activity(), registrar.messenger(), registrar.context()); - if (registrar.context().getApplicationContext() != null - && registrar.context().getApplicationContext() instanceof Application) { - ((Application) registrar.context().getApplicationContext()) - .registerActivityLifecycleCallbacks(plugin.methodCallHandler); - } + ((Application) registrar.context().getApplicationContext()) + .registerActivityLifecycleCallbacks(plugin.methodCallHandler); } @Override diff --git a/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java b/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java index a11a46449727..cd44a26aa359 100644 --- a/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java +++ b/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java @@ -1,3 +1,7 @@ +// Copyright 2019 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + package io.flutter.plugins.inapppurchase; import static org.mockito.Mockito.when; @@ -18,7 +22,6 @@ public class InAppPurchasePluginTest { @Mock PluginRegistry.Registrar mockRegistrar; // For v1 embedding @Mock BinaryMessenger mockMessenger; @Mock Application mockApplication; - @Mock Context mockApplicatonContext; @Before public void setUp() { @@ -28,21 +31,9 @@ public void setUp() { when(mockRegistrar.context()).thenReturn(context); } - @Test - public void registerWith_doNotCrashWhenApplicationContextIsTypeContext() { - when(context.getApplicationContext()).thenReturn(mockApplicatonContext); - InAppPurchasePlugin.registerWith(mockRegistrar); - } - @Test public void registerWith_doNotCrashWhenApplicationContextIsTypeApplication() { when(context.getApplicationContext()).thenReturn(mockApplication); InAppPurchasePlugin.registerWith(mockRegistrar); } - - @Test - public void registerWith_doNotCrashWhenApplicationContextIsNull() { - when(context.getApplicationContext()).thenReturn(null); - InAppPurchasePlugin.registerWith(mockRegistrar); - } } From 365b46a8200545c5b7b1cbb927ec919d3a332aaa Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Mon, 9 Mar 2020 10:33:29 -0700 Subject: [PATCH 6/6] update test --- .../plugins/inapppurchase/InAppPurchasePluginTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java b/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java index cd44a26aa359..0befa87e1d05 100644 --- a/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java +++ b/packages/in_app_purchase/example/android/app/src/test/java/io/flutter/plugins/inapppurchase/InAppPurchasePluginTest.java @@ -32,8 +32,9 @@ public void setUp() { } @Test - public void registerWith_doNotCrashWhenApplicationContextIsTypeApplication() { - when(context.getApplicationContext()).thenReturn(mockApplication); + public void registerWith_doNotCrashWhenRegisterContextIsActivity_V1Embedding() { + when(mockRegistrar.context()).thenReturn(activity); + when(activity.getApplicationContext()).thenReturn(mockApplication); InAppPurchasePlugin.registerWith(mockRegistrar); } }