From 6f1dcd152b029135851f9542c109fe22e61df90a Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Thu, 22 Oct 2020 19:29:27 +0900 Subject: [PATCH] do not reset the app when relaunching with main intent --- android/app/src/debug/AndroidManifest.xml | 7 ---- .../deckers/thibault/aves/MainActivity.kt | 38 +++++++++---------- .../channel/streams/IntentStreamHandler.kt | 4 +- lib/main.dart | 15 +++++--- lib/widgets/home_page.dart | 9 +++-- 5 files changed, 35 insertions(+), 38 deletions(-) delete mode 100644 android/app/src/debug/AndroidManifest.xml diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index ebcc4799f..000000000 --- a/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt b/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt index 7e4a1b6ff..7827394d0 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/MainActivity.kt @@ -26,12 +26,13 @@ class MainActivity : FlutterActivity() { } private val intentStreamHandler = IntentStreamHandler() - private var intentDataMap: MutableMap? = null + private lateinit var intentDataMap: MutableMap override fun onCreate(savedInstanceState: Bundle?) { + Log.i(LOG_TAG, "onCreate intent=$intent") super.onCreate(savedInstanceState) - handleIntent(intent) + intentDataMap = extractIntentData(intent) val messenger = flutterEngine!!.dartExecutor.binaryMessenger @@ -50,15 +51,13 @@ class MainActivity : FlutterActivity() { when (call.method) { "getIntentData" -> { result.success(intentDataMap) - intentDataMap = null + intentDataMap.clear() } "pick" -> { - result.success(intentDataMap) - intentDataMap = null - val resultUri = call.argument("uri") - if (resultUri != null) { + val pickedUri = call.argument("uri") + if (pickedUri != null) { val intent = Intent().apply { - data = Uri.parse(resultUri) + data = Uri.parse(pickedUri) addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) } setResult(RESULT_OK, intent) @@ -104,28 +103,24 @@ class MainActivity : FlutterActivity() { } override fun onNewIntent(intent: Intent) { + Log.i(LOG_TAG, "onNewIntent intent=$intent") super.onNewIntent(intent) - handleIntent(intent) - intentStreamHandler.notifyNewIntent() + intentStreamHandler.notifyNewIntent(extractIntentData(intent)) } - private fun handleIntent(intent: Intent?) { - Log.i(LOG_TAG, "handleIntent intent=$intent") - if (intent == null) return - when (intent.action) { + private fun extractIntentData(intent: Intent?): MutableMap { + when (intent?.action) { Intent.ACTION_MAIN -> { - val page = intent.getStringExtra("page") - if (page != null) { - intentDataMap = hashMapOf( + intent.getStringExtra("page")?.let { page -> + return hashMapOf( "page" to page, "filters" to intent.getStringArrayExtra("filters")?.toList(), ) } } Intent.ACTION_VIEW -> { - val uri = intent.data - if (uri != null) { - intentDataMap = hashMapOf( + intent.data?.let { uri -> + return hashMapOf( "action" to "view", "uri" to uri.toString(), "mimeType" to intent.type, // MIME type is optional @@ -133,12 +128,13 @@ class MainActivity : FlutterActivity() { } } Intent.ACTION_GET_CONTENT, Intent.ACTION_PICK -> { - intentDataMap = hashMapOf( + return hashMapOf( "action" to "pick", "mimeType" to intent.type, ) } } + return HashMap() } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/IntentStreamHandler.kt b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/IntentStreamHandler.kt index b796e340e..abd594c58 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/IntentStreamHandler.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/channel/streams/IntentStreamHandler.kt @@ -15,7 +15,7 @@ class IntentStreamHandler : EventChannel.StreamHandler { override fun onCancel(arguments: Any?) {} - fun notifyNewIntent() { - eventSink?.success(true) + fun notifyNewIntent(intentData: MutableMap?) { + eventSink?.success(intentData) } } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index 7ccf819e1..6272441c2 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -82,13 +82,13 @@ class _AvesAppState extends State { ), ); - Widget get firstPage => settings.hasAcceptedTerms ? HomePage() : WelcomePage(); + Widget getFirstPage({Map intentData}) => settings.hasAcceptedTerms ? HomePage(intentData: intentData) : WelcomePage(); @override void initState() { super.initState(); _appSetup = _setup(); - _newIntentChannel.receiveBroadcastStream().listen((_) => _onNewIntent()); + _newIntentChannel.receiveBroadcastStream().listen((event) => _onNewIntent(event as Map)); } Future _setup() async { @@ -109,11 +109,16 @@ class _AvesAppState extends State { await settings.initCrashlytics(); } - void _onNewIntent() { + void _onNewIntent(Map intentData) { + debugPrint('$runtimeType onNewIntent with intentData=$intentData'); + + // do not reset when relaunching the app + if (AvesApp.mode == AppMode.main && (intentData == null || intentData.isEmpty == true)) return; + FirebaseCrashlytics.instance.log('New intent'); _navigatorKey.currentState.pushReplacement(DirectMaterialPageRoute( settings: RouteSettings(name: HomePage.routeName), - builder: (_) => firstPage, + builder: (_) => getFirstPage(intentData: intentData), )); } @@ -125,7 +130,7 @@ class _AvesAppState extends State { future: _appSetup, builder: (context, snapshot) { if (!snapshot.hasError && snapshot.connectionState == ConnectionState.done) { - return firstPage; + return getFirstPage(); } return Scaffold( body: snapshot.hasError ? _buildError(snapshot.error) : SizedBox.shrink(), diff --git a/lib/widgets/home_page.dart b/lib/widgets/home_page.dart index 8b7eeeba5..1e6ad8ffc 100644 --- a/lib/widgets/home_page.dart +++ b/lib/widgets/home_page.dart @@ -24,7 +24,10 @@ import 'package:permission_handler/permission_handler.dart'; class HomePage extends StatefulWidget { static const routeName = '/'; - const HomePage(); + // untyped map as it is coming from the platform + final Map intentData; + + const HomePage({this.intentData}); @override _HomePageState createState() => _HomePageState(); @@ -64,8 +67,8 @@ class _HomePageState extends State { unawaited(androidFileUtils.initAppNames()); AvesApp.mode = AppMode.main; - final intentData = await ViewerService.getIntentData(); - if (intentData != null) { + final intentData = widget.intentData ?? await ViewerService.getIntentData(); + if (intentData?.isNotEmpty == true) { final action = intentData['action']; switch (action) { case 'view':