Skip to content

Commit

Permalink
Add export behavior to registered broadcast receivers
Browse files Browse the repository at this point in the history
  • Loading branch information
karlenDimla committed Jan 10, 2024
1 parent c60e17b commit 402e249
Show file tree
Hide file tree
Showing 15 changed files with 47 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import android.content.Intent
import android.content.IntentFilter
import androidx.annotation.MainThread
import androidx.annotation.WorkerThread
import androidx.core.content.ContextCompat
import com.duckduckgo.common.utils.DispatcherProvider
import com.duckduckgo.di.scopes.AppScope
import com.duckduckgo.di.scopes.VpnScope
Expand Down Expand Up @@ -81,7 +82,7 @@ class NewAppBroadcastReceiver @Inject constructor(
addAction(Intent.ACTION_PACKAGE_ADDED)
addDataScheme("package")
}.run {
applicationContext.registerReceiver(this@NewAppBroadcastReceiver, this)
ContextCompat.registerReceiver(applicationContext, this@NewAppBroadcastReceiver, this, ContextCompat.RECEIVER_EXPORTED)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner
import com.duckduckgo.app.di.AppCoroutineScope
import com.duckduckgo.app.lifecycle.MainProcessLifecycleObserver
Expand Down Expand Up @@ -49,7 +50,7 @@ class DeviceShieldNotificationsDebugReceiver(
) : BroadcastReceiver() {

init {
context.registerReceiver(this, IntentFilter(intentAction))
ContextCompat.registerReceiver(context, this, IntentFilter(intentAction), ContextCompat.RECEIVER_NOT_EXPORTED)
}

override fun onReceive(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import androidx.core.content.ContextCompat
import com.duckduckgo.appbuildconfig.api.AppBuildConfig
import com.duckduckgo.common.utils.DispatcherProvider
import com.duckduckgo.common.utils.formatters.time.DatabaseDateFormatter
Expand Down Expand Up @@ -66,7 +67,7 @@ class SendTrackerDebugReceiver @Inject constructor(
}

logcat { "Debug receiver SendTrackerDebugReceiver registered" }
context.registerReceiver(this, IntentFilter(INTENT_ACTION))
ContextCompat.registerReceiver(context, this, IntentFilter(INTENT_ACTION), ContextCompat.RECEIVER_NOT_EXPORTED)
}

private fun unregister() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import androidx.core.content.ContextCompat
import com.duckduckgo.app.di.AppCoroutineScope
import com.duckduckgo.appbuildconfig.api.AppBuildConfig
import com.duckduckgo.appbuildconfig.api.isInternalBuild
Expand Down Expand Up @@ -56,7 +57,7 @@ class RestartReceiver @Inject constructor(
if (appBuildConfig.isInternalBuild()) {
logcat { "Starting vpn-service receiver" }
unregister()
context.registerReceiver(this, IntentFilter("vpn-service"))
ContextCompat.registerReceiver(context, this, IntentFilter("vpn-service"), ContextCompat.RECEIVER_NOT_EXPORTED)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ class RestartReceiverTest {
receiver.onVpnStarted(coroutineRule.testScope)

verify(context).unregisterReceiver(any())
verify(context).registerReceiver(any(), any())
verify(context).registerReceiver(any(), any(), isNull(), isNull(), any())
}

@Test
Expand All @@ -66,7 +66,7 @@ class RestartReceiverTest {
receiver.onVpnStarted(coroutineRule.testScope)

verify(context, never()).unregisterReceiver(any())
verify(context, never()).registerReceiver(any(), any())
verify(context, never()).registerReceiver(any(), any(), isNull(), isNull(), any())
}

@Test
Expand All @@ -76,7 +76,7 @@ class RestartReceiverTest {
receiver.onVpnStopped(coroutineRule.testScope, VpnStateMonitor.VpnStopReason.SELF_STOP())

verify(context).unregisterReceiver(any())
verify(context, never()).registerReceiver(any(), any())
verify(context, never()).registerReceiver(any(), any(), isNull(), isNull(), any())
}

@Test
Expand All @@ -86,6 +86,6 @@ class RestartReceiverTest {
receiver.onVpnStopped(coroutineRule.testScope, VpnStateMonitor.VpnStopReason.SELF_STOP())

verify(context).unregisterReceiver(any())
verify(context, never()).registerReceiver(any(), any())
verify(context, never()).registerReceiver(any(), any(), isNull(), isNull(), any())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import androidx.core.content.ContextCompat

/**
* Abstract class to create generic receivers for internal features accessible through
Expand All @@ -44,7 +45,7 @@ abstract class InternalFeatureReceiver(

fun register() {
unregister()
context.registerReceiver(this, IntentFilter(intentAction()))
ContextCompat.registerReceiver(context, this, IntentFilter(intentAction()), ContextCompat.RECEIVER_NOT_EXPORTED)
}

fun unregister() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import androidx.core.content.ContextCompat
import com.duckduckgo.common.utils.DispatcherProvider
import com.duckduckgo.di.scopes.VpnScope
import com.duckduckgo.mobile.android.vpn.service.VpnServiceCallbacks
Expand Down Expand Up @@ -48,7 +49,7 @@ class ExceptionRulesDebugReceiver(

init {
kotlin.runCatching { context.unregisterReceiver(this) }
context.registerReceiver(this, IntentFilter(intentAction))
ContextCompat.registerReceiver(context, this, IntentFilter(intentAction), ContextCompat.RECEIVER_NOT_EXPORTED)
}

override fun onReceive(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@ package com.duckduckgo.app.dev.settings.privacy
import android.annotation.SuppressLint
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Context.RECEIVER_NOT_EXPORTED
import android.content.Intent
import android.content.IntentFilter
import android.widget.Toast
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner
import com.duckduckgo.app.lifecycle.MainProcessLifecycleObserver
import com.duckduckgo.app.trackerdetection.api.TrackerDataDownloader
Expand All @@ -39,7 +41,7 @@ class TrackerDataDevReceiver(
private val receiver: (Intent) -> Unit,
) : BroadcastReceiver() {
init {
context.registerReceiver(this, IntentFilter(intentAction))
ContextCompat.registerReceiver(context, this, IntentFilter(intentAction), ContextCompat.RECEIVER_NOT_EXPORTED)
}

override fun onReceive(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import android.content.Intent
import android.content.IntentFilter
import android.os.Build
import android.widget.Toast
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner
import com.duckduckgo.app.browser.R
import com.duckduckgo.app.lifecycle.MainProcessLifecycleObserver
Expand All @@ -46,7 +47,7 @@ class WidgetAddedReceiver @Inject constructor(

override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
context.registerReceiver(this, IntentFilter(ACTION_ADD_WIDGET))
ContextCompat.registerReceiver(context, this, IntentFilter(ACTION_ADD_WIDGET), ContextCompat.RECEIVER_NOT_EXPORTED)
}

override fun onDestroy(owner: LifecycleOwner) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.os.Environment
import androidx.core.content.ContextCompat
import androidx.lifecycle.LifecycleOwner
import com.duckduckgo.app.di.AppCoroutineScope
import com.duckduckgo.app.lifecycle.MainProcessLifecycleObserver
Expand Down Expand Up @@ -55,7 +56,7 @@ class FileDownloadNotificationActionReceiver @Inject constructor(
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
Timber.v("Registering file download notification action receiver")
context.registerReceiver(this, IntentFilter(INTENT_DOWNLOADS_NOTIFICATION_ACTION))
ContextCompat.registerReceiver(context, this, IntentFilter(INTENT_DOWNLOADS_NOTIFICATION_ACTION), ContextCompat.RECEIVER_NOT_EXPORTED)

// When the app process is killed and restarted, this onCreate method is called and we take the opportunity
// to clean up the pending downloads that were in progress and will be no longer downloading.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import androidx.core.content.ContextCompat
import com.duckduckgo.di.scopes.VpnScope
import com.duckduckgo.mobile.android.vpn.VpnFeaturesRegistry
import com.duckduckgo.mobile.android.vpn.service.VpnServiceCallbacks
Expand Down Expand Up @@ -76,7 +77,7 @@ class NetPTimezoneMonitor @Inject constructor(
IntentFilter().apply {
addAction(Intent.ACTION_TIMEZONE_CHANGED)
}.run {
context.registerReceiver(this@NetPTimezoneMonitor, this)
ContextCompat.registerReceiver(context, this@NetPTimezoneMonitor, this, ContextCompat.RECEIVER_NOT_EXPORTED)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import androidx.core.content.ContextCompat

/**
* Abstract class to create generic receivers for internal features accessible through
Expand All @@ -44,7 +45,7 @@ abstract class InternalFeatureReceiver(

fun register() {
unregister()
context.registerReceiver(this, IntentFilter(intentAction()))
ContextCompat.registerReceiver(context, this, IntentFilter(intentAction()), ContextCompat.RECEIVER_NOT_EXPORTED)
}

fun unregister() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import android.annotation.SuppressLint
import android.content.*
import android.telephony.PhoneStateListener
import android.telephony.TelephonyManager
import androidx.core.content.ContextCompat
import androidx.core.content.edit
import androidx.lifecycle.LifecycleOwner
import com.duckduckgo.anvil.annotations.InjectWith
Expand Down Expand Up @@ -75,7 +76,10 @@ class VpnCallStateReceiver @Inject constructor(
private val _listener: PhoneStateListener =
object : PhoneStateListener() {
@Deprecated("Deprecated in Java")
override fun onCallStateChanged(state: Int, phoneNumber: String?) {
override fun onCallStateChanged(
state: Int,
phoneNumber: String?
) {
appCoroutineScope.launch(dispatcherProvider.io()) {
logcat { "Call state: $state" }
if (state == TelephonyManager.CALL_STATE_IDLE) {
Expand Down Expand Up @@ -128,12 +132,14 @@ class VpnCallStateReceiver @Inject constructor(
registerListener()
}
}

ACTION_UNREGISTER_STATE_CALL_LISTENER -> {
logcat { "ACTION_UNREGISTER_STATE_CALL_LISTENER" }
goAsync(pendingResult) {
unregisterListener()
}
}

else -> {
logcat { "Unknown action ${intent.action}" }
}
Expand All @@ -155,12 +161,14 @@ class VpnCallStateReceiver @Inject constructor(
private fun register() {
unregister()
logcat { "Registering vpn call state receiver" }
context.registerReceiver(
ContextCompat.registerReceiver(
context,
this,
IntentFilter().apply {
addAction(ACTION_REGISTER_STATE_CALL_LISTENER)
addAction(ACTION_UNREGISTER_STATE_CALL_LISTENER)
},
ContextCompat.RECEIVER_NOT_EXPORTED,
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import androidx.core.content.ContextCompat
import com.duckduckgo.anvil.annotations.InjectWith
import com.duckduckgo.app.di.ProcessName
import com.duckduckgo.di.scopes.VpnScope
Expand Down Expand Up @@ -61,6 +62,7 @@ class DebugRekeyReceiver @Inject constructor(
rekeyer.forceRekey()
}
}

else -> {
logcat(LogPriority.WARN) { "Unknown action" }
pendingResult?.finish()
Expand All @@ -72,7 +74,10 @@ class DebugRekeyReceiver @Inject constructor(
register()
}

override fun onVpnStopped(coroutineScope: CoroutineScope, vpnStopReason: VpnStateMonitor.VpnStopReason) {
override fun onVpnStopped(
coroutineScope: CoroutineScope,
vpnStopReason: VpnStateMonitor.VpnStopReason
) {
logcat { "Unregistering debug re-keying receiver" }
unregister()
}
Expand All @@ -81,11 +86,13 @@ class DebugRekeyReceiver @Inject constructor(
private fun register() {
unregister()
logcat { "Registering debug re-keying receiver" }
context.registerReceiver(
ContextCompat.registerReceiver(
context,
this,
IntentFilter().apply {
addAction(ACTION_FORCE_REKEY)
},
ContextCompat.RECEIVER_NOT_EXPORTED,
)
}

Expand Down
2 changes: 1 addition & 1 deletion versions.properties
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ version.androidx.localbroadcastmanager=1.1.0

version.androidx.recyclerview=1.3.2

version.androidx.core=1.8.0
version.androidx.core=1.9.0

version.androidx.fragment=1.5.2

Expand Down

0 comments on commit 402e249

Please sign in to comment.