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':