From 924a0ebb51ae51c4a3039cb2c4dbff4eada8caa7 Mon Sep 17 00:00:00 2001 From: Gergely Hegedus Date: Sat, 18 Jan 2025 02:06:57 +0200 Subject: [PATCH] make restart faster if the app is not the launcher --- .../experiment_shorebird/MainActivity.kt | 63 ++++++++++++------- lib/main.dart | 3 +- pubspec.yaml | 2 +- 3 files changed, 44 insertions(+), 24 deletions(-) diff --git a/android/app/src/main/kotlin/org/fnives/flutter/experiment_shorebird/MainActivity.kt b/android/app/src/main/kotlin/org/fnives/flutter/experiment_shorebird/MainActivity.kt index 5c7e17e..5f8e10b 100644 --- a/android/app/src/main/kotlin/org/fnives/flutter/experiment_shorebird/MainActivity.kt +++ b/android/app/src/main/kotlin/org/fnives/flutter/experiment_shorebird/MainActivity.kt @@ -1,6 +1,5 @@ package org.fnives.flutter.experiment_shorebird -import android.app.Activity import android.app.AlarmManager import android.app.PendingIntent import android.content.Intent @@ -20,36 +19,56 @@ class MainActivity : FlutterActivity() { ).setMethodCallHandler { call, result -> when (call.method) { Methods.RESTART.methodName -> { - val pendingIntent = PendingIntent.getActivity( - context, - 4201, - if (isHomeApp()) Intent(intent.action).apply { - flags = Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS - intent.categories.forEach { - addCategory(it) + try { + if (this.intent.categories.contains(Intent.CATEGORY_HOME)) { + if (isDefaultHomeApp()) { + runViaAlarmManager(getHomeIntent()) + } else { + runViaAlarmManager(Intent.makeRestartActivityTask(componentName)) } - } else Intent(this, this::class.java).apply { - flags = Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS - }, - PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE - ) - val alarmManager = context.getSystemService(ALARM_SERVICE) as AlarmManager - alarmManager[AlarmManager.RTC, System.currentTimeMillis() + 100] = - pendingIntent - if (context is Activity) { - (context as Activity).finishAndRemoveTask() + } else { + runDirectly(Intent.makeRestartActivityTask(componentName)) + } + finishAndRemoveTask() + Runtime.getRuntime().exit(0) + result.success(null) + } catch (e: Throwable) { + result.error("couldn't start activity", e.message ?: "", null) } - Runtime.getRuntime().exit(0) - result.success(Unit) } } } } - private fun isHomeApp(): Boolean { + private fun getHomeIntent() = + Intent(intent.action).apply { + flags = Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS + intent.setComponent(component) + intent.categories.forEach { + addCategory(it) + } + } + + private fun runDirectly(intent: Intent) { + context.startActivity(intent) + } + + private fun runViaAlarmManager(intent: Intent) { + val pendingIntent = PendingIntent.getActivity( + context, + 4201, + intent, + PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE + ) + val alarmManager = context.getSystemService(ALARM_SERVICE) as AlarmManager + alarmManager[AlarmManager.RTC, System.currentTimeMillis()+100] = pendingIntent + } + + private fun isDefaultHomeApp(): Boolean { val intent = Intent(Intent.ACTION_MAIN) intent.addCategory(Intent.CATEGORY_HOME) val res = packageManager.resolveActivity(intent, 0) - return res?.activityInfo != null && (packageName == res.activityInfo.packageName) + val isHomeApp = res?.activityInfo != null && (packageName == res.activityInfo.packageName) + return isHomeApp } } diff --git a/lib/main.dart b/lib/main.dart index 2fbbeef..6bc690e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:shorebird_code_push/shorebird_code_push.dart'; + void main() { runApp(const MyApp()); } @@ -151,7 +152,7 @@ class _MyHomePageState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ const Text( - 'This is a release 1.9.1', + 'This is a release 1.9.9#6', // 'You have times:', ), const Text( diff --git a/pubspec.yaml b/pubspec.yaml index 153908d..9c17ed3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.9.1+191 +version: 1.9.9+199 environment: sdk: '>=3.4.3 <4.0.0'