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 var intentDataMap: MutableMap<String, Any?>? = null
private lateinit var intentDataMap: MutableMap<String, Any?>
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<String>("uri")
if (resultUri != null) {
val pickedUri = call.argument<String>("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<String, Any?> {
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?) {

View file

@ -15,7 +15,7 @@ class IntentStreamHandler : EventChannel.StreamHandler {
override fun onCancel(arguments: Any?) {}
fun notifyNewIntent() {
eventSink?.success(true)
fun notifyNewIntent(intentData: MutableMap<String, Any?>?) {
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
void initState() {
super.initState();
_appSetup = _setup();
_newIntentChannel.receiveBroadcastStream().listen((_) => _onNewIntent());
_newIntentChannel.receiveBroadcastStream().listen((event) => _onNewIntent(event as Map));
}
Future<void> _setup() async {
@ -109,11 +109,16 @@ class _AvesAppState extends State<AvesApp> {
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<AvesApp> {
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(),

View file

@ -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<HomePage> {
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':