do not reset the app when relaunching with main intent

This commit is contained in:
Thibault Deckers 2020-10-22 19:29:27 +09:00
parent d6b233ac2c
commit 6f1dcd152b
5 changed files with 35 additions and 38 deletions

View file

@ -1,7 +0,0 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="deckers.thibault.aves">
<!-- Flutter needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>

View file

@ -26,12 +26,13 @@ class MainActivity : FlutterActivity() {
} }
private val intentStreamHandler = IntentStreamHandler() private val intentStreamHandler = IntentStreamHandler()
private var intentDataMap: MutableMap<String, Any?>? = null private lateinit var intentDataMap: MutableMap<String, Any?>
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
Log.i(LOG_TAG, "onCreate intent=$intent")
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
handleIntent(intent) intentDataMap = extractIntentData(intent)
val messenger = flutterEngine!!.dartExecutor.binaryMessenger val messenger = flutterEngine!!.dartExecutor.binaryMessenger
@ -50,15 +51,13 @@ class MainActivity : FlutterActivity() {
when (call.method) { when (call.method) {
"getIntentData" -> { "getIntentData" -> {
result.success(intentDataMap) result.success(intentDataMap)
intentDataMap = null intentDataMap.clear()
} }
"pick" -> { "pick" -> {
result.success(intentDataMap) val pickedUri = call.argument<String>("uri")
intentDataMap = null if (pickedUri != null) {
val resultUri = call.argument<String>("uri")
if (resultUri != null) {
val intent = Intent().apply { val intent = Intent().apply {
data = Uri.parse(resultUri) data = Uri.parse(pickedUri)
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
} }
setResult(RESULT_OK, intent) setResult(RESULT_OK, intent)
@ -104,28 +103,24 @@ class MainActivity : FlutterActivity() {
} }
override fun onNewIntent(intent: Intent) { override fun onNewIntent(intent: Intent) {
Log.i(LOG_TAG, "onNewIntent intent=$intent")
super.onNewIntent(intent) super.onNewIntent(intent)
handleIntent(intent) intentStreamHandler.notifyNewIntent(extractIntentData(intent))
intentStreamHandler.notifyNewIntent()
} }
private fun handleIntent(intent: Intent?) { private fun extractIntentData(intent: Intent?): MutableMap<String, Any?> {
Log.i(LOG_TAG, "handleIntent intent=$intent") when (intent?.action) {
if (intent == null) return
when (intent.action) {
Intent.ACTION_MAIN -> { Intent.ACTION_MAIN -> {
val page = intent.getStringExtra("page") intent.getStringExtra("page")?.let { page ->
if (page != null) { return hashMapOf(
intentDataMap = hashMapOf(
"page" to page, "page" to page,
"filters" to intent.getStringArrayExtra("filters")?.toList(), "filters" to intent.getStringArrayExtra("filters")?.toList(),
) )
} }
} }
Intent.ACTION_VIEW -> { Intent.ACTION_VIEW -> {
val uri = intent.data intent.data?.let { uri ->
if (uri != null) { return hashMapOf(
intentDataMap = hashMapOf(
"action" to "view", "action" to "view",
"uri" to uri.toString(), "uri" to uri.toString(),
"mimeType" to intent.type, // MIME type is optional "mimeType" to intent.type, // MIME type is optional
@ -133,12 +128,13 @@ class MainActivity : FlutterActivity() {
} }
} }
Intent.ACTION_GET_CONTENT, Intent.ACTION_PICK -> { Intent.ACTION_GET_CONTENT, Intent.ACTION_PICK -> {
intentDataMap = hashMapOf( return hashMapOf(
"action" to "pick", "action" to "pick",
"mimeType" to intent.type, "mimeType" to intent.type,
) )
} }
} }
return HashMap()
} }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

View file

@ -15,7 +15,7 @@ class IntentStreamHandler : EventChannel.StreamHandler {
override fun onCancel(arguments: Any?) {} override fun onCancel(arguments: Any?) {}
fun notifyNewIntent() { fun notifyNewIntent(intentData: MutableMap<String, Any?>?) {
eventSink?.success(true) eventSink?.success(intentData)
} }
} }

View file

@ -82,13 +82,13 @@ class _AvesAppState extends State<AvesApp> {
), ),
); );
Widget get firstPage => settings.hasAcceptedTerms ? HomePage() : WelcomePage(); Widget getFirstPage({Map intentData}) => settings.hasAcceptedTerms ? HomePage(intentData: intentData) : WelcomePage();
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_appSetup = _setup(); _appSetup = _setup();
_newIntentChannel.receiveBroadcastStream().listen((_) => _onNewIntent()); _newIntentChannel.receiveBroadcastStream().listen((event) => _onNewIntent(event as Map));
} }
Future<void> _setup() async { Future<void> _setup() async {
@ -109,11 +109,16 @@ class _AvesAppState extends State<AvesApp> {
await settings.initCrashlytics(); 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'); FirebaseCrashlytics.instance.log('New intent');
_navigatorKey.currentState.pushReplacement(DirectMaterialPageRoute( _navigatorKey.currentState.pushReplacement(DirectMaterialPageRoute(
settings: RouteSettings(name: HomePage.routeName), settings: RouteSettings(name: HomePage.routeName),
builder: (_) => firstPage, builder: (_) => getFirstPage(intentData: intentData),
)); ));
} }
@ -125,7 +130,7 @@ class _AvesAppState extends State<AvesApp> {
future: _appSetup, future: _appSetup,
builder: (context, snapshot) { builder: (context, snapshot) {
if (!snapshot.hasError && snapshot.connectionState == ConnectionState.done) { if (!snapshot.hasError && snapshot.connectionState == ConnectionState.done) {
return firstPage; return getFirstPage();
} }
return Scaffold( return Scaffold(
body: snapshot.hasError ? _buildError(snapshot.error) : SizedBox.shrink(), body: snapshot.hasError ? _buildError(snapshot.error) : SizedBox.shrink(),

View file

@ -24,7 +24,10 @@ import 'package:permission_handler/permission_handler.dart';
class HomePage extends StatefulWidget { class HomePage extends StatefulWidget {
static const routeName = '/'; static const routeName = '/';
const HomePage(); // untyped map as it is coming from the platform
final Map intentData;
const HomePage({this.intentData});
@override @override
_HomePageState createState() => _HomePageState(); _HomePageState createState() => _HomePageState();
@ -64,8 +67,8 @@ class _HomePageState extends State<HomePage> {
unawaited(androidFileUtils.initAppNames()); unawaited(androidFileUtils.initAppNames());
AvesApp.mode = AppMode.main; AvesApp.mode = AppMode.main;
final intentData = await ViewerService.getIntentData(); final intentData = widget.intentData ?? await ViewerService.getIntentData();
if (intentData != null) { if (intentData?.isNotEmpty == true) {
final action = intentData['action']; final action = intentData['action'];
switch (action) { switch (action) {
case 'view': case 'view':