Skip to content

Commit

Permalink
Changes per PR feedback
Browse files Browse the repository at this point in the history
- Fix Context.registerReceiver() on newer Androids
- Quirks to work around problems with ContextCompat.registerReceiver() at Robolectric tests
  • Loading branch information
TranceLove committed Oct 8, 2024
1 parent 161a90e commit 55857a4
Show file tree
Hide file tree
Showing 13 changed files with 116 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,15 @@
package com.amaze.filemanager.asynchronous.broadcast_receivers;

import com.amaze.filemanager.asynchronous.loaders.AppListLoader;
import com.amaze.filemanager.utils.ContextCompatExtKt;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;

import androidx.core.content.ContextCompat;

/**
* Created by vishal on 23/2/17.
*
Expand All @@ -35,7 +38,7 @@
*/
public class PackageReceiver extends BroadcastReceiver {

private AppListLoader listLoader;
private final AppListLoader listLoader;

public PackageReceiver(AppListLoader listLoader) {

Expand All @@ -45,12 +48,14 @@ public PackageReceiver(AppListLoader listLoader) {
filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
filter.addDataScheme("package");
listLoader.getContext().registerReceiver(this, filter);
ContextCompatExtKt.registerReceiverCompat(
listLoader.getContext(), this, filter, ContextCompat.RECEIVER_NOT_EXPORTED);

// Register for events related to SD card installation
IntentFilter sdcardFilter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
sdcardFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
listLoader.getContext().registerReceiver(this, sdcardFilter);
ContextCompatExtKt.registerReceiverCompat(
listLoader.getContext(), this, sdcardFilter, ContextCompat.RECEIVER_NOT_EXPORTED);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
import com.amaze.filemanager.filesystem.root.MoveFileCommand;
import com.amaze.filemanager.ui.activities.MainActivity;
import com.amaze.filemanager.ui.notifications.NotificationConstants;
import com.amaze.filemanager.utils.ContextCompatExtKt;
import com.amaze.filemanager.utils.DatapointParcelable;
import com.amaze.filemanager.utils.ObtainableServiceBinder;
import com.amaze.filemanager.utils.ProgressHandler;
Expand All @@ -67,6 +68,7 @@
import androidx.annotation.StringRes;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import androidx.core.content.ContextCompat;
import androidx.preference.PreferenceManager;

public class CopyService extends AbstractProgressiveService {
Expand Down Expand Up @@ -96,7 +98,11 @@ public class CopyService extends AbstractProgressiveService {
public void onCreate() {
super.onCreate();
c = getApplicationContext();
registerReceiver(receiver3, new IntentFilter(TAG_BROADCAST_COPY_CANCEL));
ContextCompatExtKt.registerReceiverCompat(
this,
cancelReceiver,
new IntentFilter(TAG_BROADCAST_COPY_CANCEL),
ContextCompat.RECEIVER_NOT_EXPORTED);
}

@Override
Expand Down Expand Up @@ -226,7 +232,7 @@ protected void clearDataPackages() {

public void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver3);
unregisterReceiver(cancelReceiver);
}

private class DoInBackground extends AsyncTask<Bundle, Void, Void> {
Expand Down Expand Up @@ -529,7 +535,7 @@ private void copyFiles(
}
}

private final BroadcastReceiver receiver3 =
private final BroadcastReceiver cancelReceiver =
new BroadcastReceiver() {

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
import com.amaze.filemanager.ui.activities.MainActivity;
import com.amaze.filemanager.ui.notifications.NotificationConstants;
import com.amaze.filemanager.utils.AESCrypt;
import com.amaze.filemanager.utils.ContextCompatExtKt;
import com.amaze.filemanager.utils.DatapointParcelable;
import com.amaze.filemanager.utils.ObtainableServiceBinder;
import com.amaze.filemanager.utils.ProgressHandler;
Expand All @@ -59,6 +60,7 @@
import androidx.annotation.StringRes;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import androidx.core.content.ContextCompat;
import androidx.preference.PreferenceManager;

/**
Expand Down Expand Up @@ -94,7 +96,11 @@ public void onCreate() {
super.onCreate();

context = getApplicationContext();
registerReceiver(cancelReceiver, new IntentFilter(TAG_BROADCAST_CRYPT_CANCEL));
ContextCompatExtKt.registerReceiverCompat(
this,
cancelReceiver,
new IntentFilter(TAG_BROADCAST_CRYPT_CANCEL),
ContextCompat.RECEIVER_NOT_EXPORTED);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import com.amaze.filemanager.filesystem.files.CryptUtil;
import com.amaze.filemanager.ui.activities.MainActivity;
import com.amaze.filemanager.ui.notifications.NotificationConstants;
import com.amaze.filemanager.utils.ContextCompatExtKt;
import com.amaze.filemanager.utils.DatapointParcelable;
import com.amaze.filemanager.utils.ObtainableServiceBinder;
import com.amaze.filemanager.utils.ProgressHandler;
Expand All @@ -57,6 +58,7 @@
import androidx.annotation.StringRes;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import androidx.core.content.ContextCompat;
import androidx.preference.PreferenceManager;

/** Created by vishal on 8/4/17 edited by Emmanuel Messulam <[email protected]> */
Expand Down Expand Up @@ -95,7 +97,11 @@ public void onCreate() {
super.onCreate();

context = getApplicationContext();
registerReceiver(cancelReceiver, new IntentFilter(TAG_BROADCAST_CRYPT_CANCEL));
ContextCompatExtKt.registerReceiverCompat(
this,
cancelReceiver,
new IntentFilter(TAG_BROADCAST_CRYPT_CANCEL),
ContextCompat.RECEIVER_NOT_EXPORTED);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import com.amaze.filemanager.ui.activities.MainActivity;
import com.amaze.filemanager.ui.dialogs.GeneralDialogCreation;
import com.amaze.filemanager.ui.notifications.NotificationConstants;
import com.amaze.filemanager.utils.ContextCompatExtKt;
import com.amaze.filemanager.utils.DatapointParcelable;
import com.amaze.filemanager.utils.ObtainableServiceBinder;
import com.amaze.filemanager.utils.ProgressHandler;
Expand All @@ -62,6 +63,7 @@
import androidx.appcompat.widget.AppCompatEditText;
import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;
import androidx.core.content.ContextCompat;
import androidx.preference.PreferenceManager;

public class ExtractService extends AbstractProgressiveService {
Expand All @@ -87,7 +89,11 @@ public class ExtractService extends AbstractProgressiveService {
@Override
public void onCreate() {
super.onCreate();
registerReceiver(receiver1, new IntentFilter(TAG_BROADCAST_EXTRACT_CANCEL));
ContextCompatExtKt.registerReceiverCompat(
this,
cancelReceiver,
new IntentFilter(TAG_BROADCAST_EXTRACT_CANCEL),
ContextCompat.RECEIVER_NOT_EXPORTED);
}

@Override
Expand Down Expand Up @@ -220,7 +226,7 @@ public void onDestroy() {
if (extractingAsyncTask != null) {
extractingAsyncTask.cancel(true);
}
unregisterReceiver(receiver1);
unregisterReceiver(cancelReceiver);
}

/**
Expand Down Expand Up @@ -449,7 +455,7 @@ private void toastOnParseError(IOException result) {
* Class used for the client Binder. Because we know this service always runs in the same process
* as its clients, we don't need to deal with IPC.
*/
private final BroadcastReceiver receiver1 =
private final BroadcastReceiver cancelReceiver =
new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,13 @@ import android.content.SharedPreferences
import android.net.Uri
import android.os.Build.VERSION.SDK_INT
import android.os.Build.VERSION_CODES.O
import android.os.Build.VERSION_CODES.TIRAMISU
import android.os.IBinder
import android.widget.RemoteViews
import androidx.annotation.StringRes
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.core.content.ContextCompat
import androidx.preference.PreferenceManager
import com.amaze.filemanager.R
import com.amaze.filemanager.application.AppConfig
Expand All @@ -48,6 +50,7 @@ import com.amaze.filemanager.ui.notifications.NotificationConstants
import com.amaze.filemanager.utils.DatapointParcelable
import com.amaze.filemanager.utils.ObtainableServiceBinder
import com.amaze.filemanager.utils.ProgressHandler
import com.amaze.filemanager.utils.registerReceiverCompat
import io.reactivex.Completable
import io.reactivex.CompletableEmitter
import io.reactivex.android.schedulers.AndroidSchedulers
Expand Down Expand Up @@ -89,7 +92,11 @@ class ZipService : AbstractProgressiveService() {

override fun onCreate() {
super.onCreate()
registerReceiver(receiver1, IntentFilter(KEY_COMPRESS_BROADCAST_CANCEL))
registerReceiverCompat(
receiver1,
IntentFilter(KEY_COMPRESS_BROADCAST_CANCEL),
ContextCompat.RECEIVER_NOT_EXPORTED,
)
}

override fun onStartCommand(
Expand All @@ -99,7 +106,14 @@ class ZipService : AbstractProgressiveService() {
): Int {
val mZipPath = intent.getStringExtra(KEY_COMPRESS_PATH)
val baseFiles: ArrayList<HybridFileParcelable> =
intent.getParcelableArrayListExtra(KEY_COMPRESS_FILES)!!
if (SDK_INT >= TIRAMISU) {
intent.getParcelableArrayListExtra(
KEY_COMPRESS_FILES,
HybridFileParcelable::class.java,
)!!
} else {
intent.getParcelableArrayListExtra(KEY_COMPRESS_FILES)!!
}
val zipFile = File(mZipPath)
mNotifyManager = NotificationManagerCompat.from(applicationContext)
if (!zipFile.exists()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@
import com.amaze.filemanager.ui.views.drawer.Drawer;
import com.amaze.filemanager.utils.AppConstants;
import com.amaze.filemanager.utils.BookSorter;
import com.amaze.filemanager.utils.ContextCompatExtKt;
import com.amaze.filemanager.utils.DataUtils;
import com.amaze.filemanager.utils.GenericExtKt;
import com.amaze.filemanager.utils.MainActivityActionMode;
Expand Down Expand Up @@ -198,6 +199,7 @@
import androidx.annotation.StringRes;
import androidx.arch.core.util.Function;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
import androidx.loader.app.LoaderManager;
Expand Down Expand Up @@ -1362,8 +1364,14 @@ public void onResume() {
newFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
newFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
newFilter.addDataScheme(ContentResolver.SCHEME_FILE);
registerReceiver(mainActivityHelper.mNotificationReceiver, newFilter);
registerReceiver(receiver2, new IntentFilter(TAG_INTENT_FILTER_GENERAL));
// This receiver is responsible for receiving media mount events, should be exported
ContextCompatExtKt.registerReceiverCompat(
this, mainActivityHelper.mNotificationReceiver, newFilter, ContextCompat.RECEIVER_EXPORTED);
ContextCompatExtKt.registerReceiverCompat(
this,
receiver2,
new IntentFilter(TAG_INTENT_FILTER_GENERAL),
ContextCompat.RECEIVER_NOT_EXPORTED);

if (SDK_INT >= Build.VERSION_CODES.KITKAT) {
updateUsbInformation();
Expand Down Expand Up @@ -1406,7 +1414,7 @@ private void updateUsbInformation() {
IntentFilter otgFilter = new IntentFilter();
otgFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
otgFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
registerReceiver(mOtgReceiver, otgFilter);
ContextCompat.registerReceiver(this, mOtgReceiver, otgFilter, ContextCompat.RECEIVER_EXPORTED);
}

/** Receiver to check if a USB device is connected at the runtime of application */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import com.amaze.filemanager.ui.fragments.preferencefragments.PreferencesConstants;
import com.amaze.filemanager.ui.theme.AppTheme;
import com.amaze.filemanager.ui.theme.AppThemePreference;
import com.amaze.filemanager.utils.ContextCompatExtKt;
import com.amaze.filemanager.utils.PreferenceUtils;
import com.amaze.filemanager.utils.Utils;
import com.readystatesoftware.systembartint.SystemBarTintManager;
Expand Down Expand Up @@ -356,8 +357,11 @@ protected void onDestroy() {
*/
private void registerPowerModeReceiver() {
if (SDK_INT >= LOLLIPOP) {
registerReceiver(
powerModeReceiver, new IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED));
ContextCompatExtKt.registerReceiverCompat(
this,
powerModeReceiver,
new IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED),
ContextCompat.RECEIVER_EXPORTED);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ import androidx.appcompat.widget.AppCompatButton
import androidx.appcompat.widget.AppCompatImageButton
import androidx.appcompat.widget.AppCompatTextView
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.content.ContextCompat
import androidx.core.text.HtmlCompat
import androidx.core.text.HtmlCompat.FROM_HTML_MODE_COMPACT
import androidx.fragment.app.Fragment
Expand Down Expand Up @@ -542,7 +543,11 @@ class FtpServerFragment : Fragment(R.layout.fragment_ftp) {
super.onResume()
val wifiFilter = IntentFilter()
wifiFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)
requireContext().registerReceiver(mWifiReceiver, wifiFilter)
requireContext().registerReceiver(
mWifiReceiver,
wifiFilter,
ContextCompat.RECEIVER_NOT_EXPORTED,
)
EventBus.getDefault().register(this)
updateStatus()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@
import com.amaze.filemanager.ui.views.FastScroller;
import com.amaze.filemanager.ui.views.WarnableTextInputValidator;
import com.amaze.filemanager.utils.BottomBarButtonPath;
import com.amaze.filemanager.utils.ContextCompatExtKt;
import com.amaze.filemanager.utils.DataUtils;
import com.amaze.filemanager.utils.GenericExtKt;
import com.amaze.filemanager.utils.OTGUtil;
Expand Down Expand Up @@ -116,6 +117,7 @@
import androidx.appcompat.widget.AppCompatEditText;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.appcompat.widget.AppCompatTextView;
import androidx.core.content.ContextCompat;
import androidx.core.content.pm.ShortcutInfoCompat;
import androidx.core.content.pm.ShortcutManagerCompat;
import androidx.core.graphics.drawable.IconCompat;
Expand Down Expand Up @@ -962,9 +964,11 @@ private LayoutElementParcelable getBackElement() {
*/
private void resumeDecryptOperations() {
if (SDK_INT >= JELLY_BEAN_MR2) {
(requireMainActivity())
.registerReceiver(
decryptReceiver, new IntentFilter(EncryptDecryptUtils.DECRYPT_BROADCAST));
ContextCompatExtKt.registerReceiverCompat(
requireMainActivity(),
decryptReceiver,
new IntentFilter(EncryptDecryptUtils.DECRYPT_BROADCAST),
ContextCompat.RECEIVER_NOT_EXPORTED);
if (!mainFragmentViewModel.isEncryptOpen()
&& !Utils.isNullOrEmpty(mainFragmentViewModel.getEncryptBaseFiles())) {
// we've opened the file and are ready to delete it
Expand Down Expand Up @@ -1227,8 +1231,11 @@ public void updateList(boolean forceReload) {
@Override
public void onResume() {
super.onResume();
(requireActivity())
.registerReceiver(receiver2, new IntentFilter(MainActivity.KEY_INTENT_LOAD_LIST));
ContextCompatExtKt.registerReceiverCompat(
requireMainActivity(),
receiver2,
new IntentFilter(MainActivity.KEY_INTENT_LOAD_LIST),
ContextCompat.RECEIVER_NOT_EXPORTED);

resumeDecryptOperations();
startFileObserver();
Expand Down
21 changes: 21 additions & 0 deletions app/src/main/java/com/amaze/filemanager/utils/ContextCompatExt.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.amaze.filemanager.utils

import android.annotation.SuppressLint
import android.content.BroadcastReceiver
import android.content.Context
import android.content.IntentFilter
import android.os.Build
import android.os.Build.VERSION_CODES.O

@SuppressLint("WrongConstant")
fun Context.registerReceiverCompat(

Check warning on line 11 in app/src/main/java/com/amaze/filemanager/utils/ContextCompatExt.kt

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

app/src/main/java/com/amaze/filemanager/utils/ContextCompatExt.kt#L11

The function registerReceiverCompat is missing documentation.
broadcastReceiver: BroadcastReceiver,
intentFilter: IntentFilter,
flag: Int = 0x4,
) {
if (Build.VERSION.SDK_INT >= O) {
this.registerReceiver(broadcastReceiver, intentFilter, flag)
} else {
this.registerReceiver(broadcastReceiver, intentFilter)
}
}
Loading

0 comments on commit 55857a4

Please sign in to comment.