improve stability

This commit is contained in:
Fabian Freund
2025-05-12 06:38:23 +02:00
parent 32eaa02360
commit baa67d2c0b
4 changed files with 68 additions and 22 deletions
+7 -2
View File
@@ -55,13 +55,18 @@
android:icon="@mipmap/launcher_icon"
android:usesCleartextTraffic="true"
android:enableOnBackInvokedCallback="true">
<activity android:name="eu.lensai.flutter_mozilla_components.activities.NotificationActivity" android:theme="@style/Theme.AppCompat.Translucent" />
<activity
android:name="eu.lensai.flutter_mozilla_components.activities.NotificationActivity"
android:theme="@style/Theme.AppCompat.Translucent"
android:exported="false"
android:launchMode="singleTop" />
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTask"
android:taskAffinity=""
android:taskAffinity="me.movenext.bang_navigator.task"
android:theme="@style/LaunchTheme"
android:supportsPictureInPicture="true"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
@@ -1,6 +1,8 @@
package eu.lensai.flutter_mozilla_components
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle
@@ -17,6 +19,7 @@ import eu.lensai.flutter_mozilla_components.databinding.FragmentBrowserBinding
import eu.lensai.flutter_mozilla_components.ext.getPreferenceKey
import eu.lensai.flutter_mozilla_components.pip.PictureInPictureIntegration
import eu.lensai.flutter_mozilla_components.services.DownloadService
import io.flutter.Log
import mozilla.components.browser.state.selector.selectedTab
import mozilla.components.concept.engine.EngineView
import mozilla.components.feature.app.links.AppLinksFeature
@@ -294,28 +297,50 @@ abstract class BaseBrowserFragment : Fragment(), UserInteractionHandler, Activit
)
}
private fun restartApp(context: Context) {
val packageManager = context.packageManager
val intent = packageManager.getLaunchIntentForPackage(context.packageName)
intent?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
intent?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(intent)
if (context is Activity) {
context.finish()
}
Runtime.getRuntime().exit(0)
}
private fun createAndSetupEngine() {
try {
// Set layout parameters
val layoutParams = FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT
)
val engineView = createEngine(components)
val originalContext = ActivityContextWrapper.getOriginalContext(requireActivity())
val engineNativeView = engineView.asView()
engineNativeView.layoutParams = layoutParams
engineView.setActivityContext(originalContext)
binding.swipeToRefresh.addView(engineNativeView)
components.engineView = engineView
} catch (e: Exception) {
Log.e("EngineCreation", "Failed to create engine: ${e.message}", e)
context?.let { restartApp(it) }
}
}
@CallSuper
@Suppress("LongMethod")
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = FragmentBrowserBinding.inflate(inflater, container, false)
// Set layout parameters
val layoutParams = FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT
)
val originalContext = ActivityContextWrapper.getOriginalContext(requireActivity())
val engineView = createEngine(components)
components.engineView = engineView
val engineNativeView = engineView.asView()
engineNativeView.layoutParams = layoutParams
engineView.setActivityContext(originalContext)
binding.swipeToRefresh.addView(engineNativeView)
createAndSetupEngine()
return binding.root
}
@@ -16,4 +16,9 @@ class NotificationActivity: AppCompatActivity() {
finish()
}
override fun onDestroy() {
super.onDestroy()
components.notificationsDelegate.unBindActivity(this)
}
}
@@ -1,5 +1,6 @@
package me.movenext.simple_intent_receiver
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.os.Bundle
@@ -14,10 +15,10 @@ class SimpleIntentReceiverPlugin: FlutterPlugin, ActivityAware, PluginRegistry.N
private lateinit var context: Context
private var intentReceiver: IntentReceiver? = null
private var handledInitialIntent = false
private var activity: Activity? = null
override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
context = flutterPluginBinding.applicationContext
intentReceiver = IntentReceiver(flutterPluginBinding.binaryMessenger)
}
@@ -26,6 +27,7 @@ class SimpleIntentReceiverPlugin: FlutterPlugin, ActivityAware, PluginRegistry.N
}
override fun onAttachedToActivity(binding: ActivityPluginBinding) {
activity = binding.activity
binding.addOnNewIntentListener(this)
// Process the initial intent if available
@@ -38,22 +40,31 @@ class SimpleIntentReceiverPlugin: FlutterPlugin, ActivityAware, PluginRegistry.N
}
override fun onDetachedFromActivityForConfigChanges() {
// No implementation needed
activity = null
}
override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
activity = binding.activity
binding.addOnNewIntentListener(this)
}
override fun onDetachedFromActivity() {
// No implementation needed
activity = null
}
override fun onNewIntent(intent: Intent): Boolean {
// Update the activity's intent to ensure proper state
activity?.setIntent(intent)
return handleIntent(intent)
}
private fun handleIntent(intent: Intent): Boolean {
// Check if this intent is coming from a different task
if (intent.flags and Intent.FLAG_ACTIVITY_NEW_TASK != 0) {
// Clear any existing tasks with this activity
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
}
val pigeonIntent = convertToPigeonIntent(intent)
intentReceiver?.sendIntent(System.currentTimeMillis(), pigeonIntent)
return true