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 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?) {
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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(),
|
||||||
|
|
|
@ -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':
|
||||||
|
|
Loading…
Reference in a new issue