do not reset the app when relaunching with main intent
This commit is contained in:
parent
d6b233ac2c
commit
6f1dcd152b
5 changed files with 35 additions and 38 deletions
|
@ -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>
|
|
@ -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?) {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
|
@ -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(),
|
||||
|
|
|
@ -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':
|
||||
|
|
Loading…
Reference in a new issue