diff --git a/mailbox-android/src/main/AndroidManifest.xml b/mailbox-android/src/main/AndroidManifest.xml index 2d7e4c828214f06da4492b43d79d6f3f8a24cc3c..ee9849f4d42f338fdbba1853db241dc546aeca6b 100644 --- a/mailbox-android/src/main/AndroidManifest.xml +++ b/mailbox-android/src/main/AndroidManifest.xml @@ -2,11 +2,16 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.briarproject.mailbox"> + <uses-feature + android:name="android.hardware.touchscreen" + android:required="false" /> + <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> + <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <application android:name=".android.MailboxApplication" @@ -19,7 +24,9 @@ <service android:name=".android.MailboxService" /> - <activity android:name=".android.MainActivity"> + <activity + android:name=".android.MainActivity" + android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> @@ -29,6 +36,15 @@ <receiver android:name=".core.system.AlarmReceiver" /> + <receiver + android:name=".android.StartReceiver" + android:exported="false"> + <intent-filter> + <action android:name="android.intent.action.BOOT_COMPLETED" /> + <action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> + </intent-filter> + </receiver> + </application> </manifest> diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/StartReceiver.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/StartReceiver.kt new file mode 100644 index 0000000000000000000000000000000000000000..9865d44008e9c131cd57ec6d083f8440b87ffabb --- /dev/null +++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/StartReceiver.kt @@ -0,0 +1,55 @@ +/* + * Briar Mailbox + * Copyright (C) 2021-2022 The Briar Project + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <https://www.gnu.org/licenses/>. + * + */ + +package org.briarproject.mailbox.android + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.Intent.ACTION_BOOT_COMPLETED +import android.content.Intent.ACTION_MY_PACKAGE_REPLACED +import dagger.hilt.android.AndroidEntryPoint +import org.briarproject.mailbox.core.lifecycle.LifecycleManager +import org.briarproject.mailbox.core.lifecycle.LifecycleManager.LifecycleState.NOT_STARTED +import org.briarproject.mailbox.core.util.LogUtils.debug +import org.slf4j.LoggerFactory.getLogger +import javax.inject.Inject + +private val LOG = getLogger(StartReceiver::class.java) + +@AndroidEntryPoint +class StartReceiver : BroadcastReceiver() { + + @Inject + internal lateinit var lifecycleManager: LifecycleManager + + override fun onReceive(context: Context, intent: Intent) { + val action = intent.action + if (action != ACTION_BOOT_COMPLETED && action != ACTION_MY_PACKAGE_REPLACED) return + + val lifecycleState = lifecycleManager.lifecycleStateFlow.value + LOG.debug { "Received $action in state ${lifecycleState.name}" } + if (lifecycleState == NOT_STARTED) { + // On API 31, we can still start a foreground service from background here: + // https://developer.android.com/guide/components/foreground-services#background-start-restriction-exemptions + MailboxService.startService(context) + } + } + +}