From a727b81263f387565396c8ae37079ac2405c5a0e Mon Sep 17 00:00:00 2001 From: Tamim Hossain <132823494+CodeWithTamim@users.noreply.github.com> Date: Tue, 5 Nov 2024 14:42:17 +0600 Subject: [PATCH] Update registerReceiver usage to comply with Android Tiramisu+ guidelines (#3871) ### Summary - Updated `registerReceiver` usage to align with Android Tiramisu+ documentation. ### Details - Replaced direct `registerReceiver` calls with `ContextCompat.registerReceiver` for improved compatibility. - Used `RECEIVER_EXPORTED` and `RECEIVER_NOT_EXPORTED` flags based on API level to ensure correct receiver permissions. - Added reference to the official Android documentation for `registerReceiver`. ### References - [Documentation on registerReceiver](https://developer.android.com/reference/androidx/core/content/ContextCompat#registerReceiver(android.content.Context,android.content.BroadcastReceiver,android.content.IntentFilter,int)) This commit ensures that the `registerReceiver` call is consistent with the latest Android standards, improving compatibility and security across Android versions. --- .../com/v2ray/ang/service/QSTileService.kt | 12 +++++++++-- .../v2ray/ang/service/V2RayServiceManager.kt | 16 ++++++++++++-- .../com/v2ray/ang/viewmodel/MainViewModel.kt | 21 ++++++++++++------- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/QSTileService.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/QSTileService.kt index e9ff99dd..723ee643 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/QSTileService.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/QSTileService.kt @@ -9,8 +9,10 @@ import android.graphics.drawable.Icon import android.os.Build import android.service.quicksettings.Tile import android.service.quicksettings.TileService +import androidx.core.content.ContextCompat import com.v2ray.ang.AppConfig import com.v2ray.ang.R +import com.v2ray.ang.extension.v2RayApplication import com.v2ray.ang.util.MessageUtil import com.v2ray.ang.util.Utils import java.lang.ref.SoftReference @@ -32,14 +34,20 @@ class QSTileService : TileService() { qsTile?.updateTile() } + /** + * Refer to the official documentation for [registerReceiver](https://developer.android.com/reference/androidx/core/content/ContextCompat#registerReceiver(android.content.Context,android.content.BroadcastReceiver,android.content.IntentFilter,int): + * `registerReceiver(Context, BroadcastReceiver, IntentFilter, int)`. + */ + override fun onStartListening() { super.onStartListening() setState(Tile.STATE_INACTIVE) mMsgReceive = ReceiveMessageHandler(this) + val mFilter = IntentFilter(AppConfig.BROADCAST_ACTION_ACTIVITY) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - registerReceiver(mMsgReceive, IntentFilter(AppConfig.BROADCAST_ACTION_ACTIVITY), RECEIVER_EXPORTED) + ContextCompat.registerReceiver(applicationContext,mMsgReceive,mFilter,ContextCompat.RECEIVER_EXPORTED) } else { - registerReceiver(mMsgReceive, IntentFilter(AppConfig.BROADCAST_ACTION_ACTIVITY)) + ContextCompat.registerReceiver(applicationContext,mMsgReceive,mFilter,ContextCompat.RECEIVER_NOT_EXPORTED) } MessageUtil.sendMsg2Service(this, AppConfig.MSG_REGISTER_CLIENT, "") diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt index 7518163f..33f89825 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayServiceManager.kt @@ -13,6 +13,7 @@ import android.os.Build import android.util.Log import androidx.annotation.RequiresApi import androidx.core.app.NotificationCompat +import androidx.core.content.ContextCompat import com.v2ray.ang.AppConfig import com.v2ray.ang.AppConfig.ANG_PACKAGE import com.v2ray.ang.AppConfig.TAG_DIRECT @@ -126,6 +127,11 @@ object V2RayServiceManager { } } + /** + * Refer to the official documentation for [registerReceiver](https://developer.android.com/reference/androidx/core/content/ContextCompat#registerReceiver(android.content.Context,android.content.BroadcastReceiver,android.content.IntentFilter,int): + * `registerReceiver(Context, BroadcastReceiver, IntentFilter, int)`. + */ + fun startV2rayPoint() { val service = serviceControl?.get()?.getService() ?: return val guid = MmkvManager.getSelectServer() ?: return @@ -143,9 +149,15 @@ object V2RayServiceManager { mFilter.addAction(Intent.ACTION_SCREEN_OFF) mFilter.addAction(Intent.ACTION_USER_PRESENT) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - service.registerReceiver(mMsgReceive, mFilter, Context.RECEIVER_EXPORTED) + ContextCompat.registerReceiver( + service, mMsgReceive, mFilter, + ContextCompat.RECEIVER_EXPORTED + ) } else { - service.registerReceiver(mMsgReceive, mFilter) + ContextCompat.registerReceiver( + service, mMsgReceive, mFilter, + ContextCompat.RECEIVER_NOT_EXPORTED + ) } } catch (e: Exception) { Log.d(ANG_PACKAGE, e.toString()) diff --git a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt index a62be1fa..1177633a 100644 --- a/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt +++ b/V2rayNG/app/src/main/kotlin/com/v2ray/ang/viewmodel/MainViewModel.kt @@ -8,6 +8,7 @@ import android.content.IntentFilter import android.content.res.AssetManager import android.os.Build import android.util.Log +import androidx.core.content.ContextCompat import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope @@ -44,18 +45,24 @@ class MainViewModel(application: Application) : AndroidViewModel(application) { val updateTestResultAction by lazy { MutableLiveData() } private val tcpingTestScope by lazy { CoroutineScope(Dispatchers.IO) } + /** + * Refer to the official documentation for [registerReceiver](https://developer.android.com/reference/androidx/core/content/ContextCompat#registerReceiver(android.content.Context,android.content.BroadcastReceiver,android.content.IntentFilter,int): + * `registerReceiver(Context, BroadcastReceiver, IntentFilter, int)`. + */ + fun startListenBroadcast() { isRunning.value = false + val mFilter = IntentFilter(AppConfig.BROADCAST_ACTION_ACTIVITY) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { - getApplication().registerReceiver( - mMsgReceiver, - IntentFilter(AppConfig.BROADCAST_ACTION_ACTIVITY), - Context.RECEIVER_EXPORTED + ContextCompat.registerReceiver( + getApplication(), mMsgReceiver, mFilter, + ContextCompat.RECEIVER_EXPORTED ) } else { - getApplication().registerReceiver( - mMsgReceiver, - IntentFilter(AppConfig.BROADCAST_ACTION_ACTIVITY) + ContextCompat.registerReceiver( + getApplication(), mMsgReceiver, mFilter, + ContextCompat.RECEIVER_NOT_EXPORTED ) } MessageUtil.sendMsg2Service(getApplication(), AppConfig.MSG_REGISTER_CLIENT, "")