diff --git a/app/src/main/java/org/linphone/core/CoreContext.kt b/app/src/main/java/org/linphone/core/CoreContext.kt
index e4cb1f437..575792d89 100644
--- a/app/src/main/java/org/linphone/core/CoreContext.kt
+++ b/app/src/main/java/org/linphone/core/CoreContext.kt
@@ -35,6 +35,7 @@ import androidx.annotation.UiThread
import androidx.annotation.WorkerThread
import androidx.lifecycle.MutableLiveData
import com.google.firebase.crashlytics.FirebaseCrashlytics
+import kotlin.system.exitProcess
import org.linphone.BuildConfig
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.contacts.ContactsManager
@@ -494,14 +495,15 @@ class CoreContext @UiThread constructor(val context: Context) : HandlerThread("C
val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
audioManager.unregisterAudioDeviceCallback(audioDeviceCallback)
- core.stopAsync()
+ core.stop()
contactsManager.onCoreStopped(core)
telecomManager.onCoreStopped(core)
notificationsManager.onCoreStopped(core)
// It's very unlikely the process will survive until the Core reaches GlobalStateOff sadly
- Log.w("$TAG Core is shutting down but probably won't reach Off state")
+ Log.w("$TAG Core has been shut down")
+ exitProcess(0)
}
@AnyThread
diff --git a/app/src/main/java/org/linphone/ui/main/help/fragment/HelpFragment.kt b/app/src/main/java/org/linphone/ui/main/help/fragment/HelpFragment.kt
index 5080f47a7..4c6cf8bf3 100644
--- a/app/src/main/java/org/linphone/ui/main/help/fragment/HelpFragment.kt
+++ b/app/src/main/java/org/linphone/ui/main/help/fragment/HelpFragment.kt
@@ -28,6 +28,7 @@ import android.view.ViewGroup
import androidx.annotation.UiThread
import androidx.navigation.fragment.findNavController
import androidx.navigation.navGraphViewModels
+import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R
import org.linphone.core.tools.Log
import org.linphone.databinding.HelpFragmentBinding
@@ -73,6 +74,16 @@ class HelpFragment : GenericMainFragment() {
findNavController().navigate(action)
}
+ binding.setQuitClickListener {
+ coreContext.postOnCoreThread {
+ Log.i("$TAG Stopping Core Context")
+ coreContext.quitSafely()
+ }
+
+ Log.i("$TAG Quitting app")
+ requireActivity().finishAffinity()
+ }
+
binding.setPrivacyPolicyClickListener {
val url = getString(R.string.website_privacy_policy_url)
try {
diff --git a/app/src/main/res/drawable/power.xml b/app/src/main/res/drawable/power.xml
new file mode 100644
index 000000000..73dd8f930
--- /dev/null
+++ b/app/src/main/res/drawable/power.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/layout/help_fragment.xml b/app/src/main/res/layout/help_fragment.xml
index 6f13c154c..a97412ab5 100644
--- a/app/src/main/res/layout/help_fragment.xml
+++ b/app/src/main/res/layout/help_fragment.xml
@@ -20,6 +20,9 @@
+
@@ -306,6 +309,34 @@
app:layout_constraintStart_toEndOf="@id/debug_icon"
app:layout_constraintEnd_toEndOf="parent"/>
+
+
+
+
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index d6267e454..18080583a 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -160,6 +160,7 @@
Une erreur est survenue
Mise à jour disponible
Une nouvelle version %s est disponible. Voulez-vous mettre à jour ?
+ Quitter l\'application
Dépannage
Nettoyer les journaux
Partager les journaux
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 984cd6b60..e2ff4d1c2 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -197,6 +197,7 @@
An error occurred while checking for update
Update available
A new version %s is available. Do you want to update?
+ Quit app
Troubleshooting
Clean logs
Share logs