diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/broadcast_receivers/PackageReceiver.java b/app/src/main/java/com/amaze/filemanager/asynchronous/broadcast_receivers/PackageReceiver.java index 9128b78e2c..c619d8d2a6 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/broadcast_receivers/PackageReceiver.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/broadcast_receivers/PackageReceiver.java @@ -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. * @@ -35,7 +38,7 @@ */ public class PackageReceiver extends BroadcastReceiver { - private AppListLoader listLoader; + private final AppListLoader listLoader; public PackageReceiver(AppListLoader listLoader) { @@ -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 diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/services/CopyService.java b/app/src/main/java/com/amaze/filemanager/asynchronous/services/CopyService.java index 0e03e0dfb2..398cb8ff64 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/services/CopyService.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/services/CopyService.java @@ -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; @@ -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 { @@ -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 @@ -226,7 +232,7 @@ protected void clearDataPackages() { public void onDestroy() { super.onDestroy(); - unregisterReceiver(receiver3); + unregisterReceiver(cancelReceiver); } private class DoInBackground extends AsyncTask { @@ -529,7 +535,7 @@ private void copyFiles( } } - private final BroadcastReceiver receiver3 = + private final BroadcastReceiver cancelReceiver = new BroadcastReceiver() { @Override diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/services/DecryptService.java b/app/src/main/java/com/amaze/filemanager/asynchronous/services/DecryptService.java index 494d2452f4..7ba876aceb 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/services/DecryptService.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/services/DecryptService.java @@ -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; @@ -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; /** @@ -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 diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/services/EncryptService.java b/app/src/main/java/com/amaze/filemanager/asynchronous/services/EncryptService.java index 71980ec11d..c10c02ce85 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/services/EncryptService.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/services/EncryptService.java @@ -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; @@ -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 */ @@ -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 diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/services/ExtractService.java b/app/src/main/java/com/amaze/filemanager/asynchronous/services/ExtractService.java index 28d1cdca05..0ed4775a43 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/services/ExtractService.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/services/ExtractService.java @@ -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; @@ -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 { @@ -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 @@ -220,7 +226,7 @@ public void onDestroy() { if (extractingAsyncTask != null) { extractingAsyncTask.cancel(true); } - unregisterReceiver(receiver1); + unregisterReceiver(cancelReceiver); } /** @@ -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) { diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/services/ZipService.kt b/app/src/main/java/com/amaze/filemanager/asynchronous/services/ZipService.kt index d08164320d..6563066577 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/services/ZipService.kt +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/services/ZipService.kt @@ -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 @@ -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 @@ -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( @@ -99,7 +106,14 @@ class ZipService : AbstractProgressiveService() { ): Int { val mZipPath = intent.getStringExtra(KEY_COMPRESS_PATH) val baseFiles: ArrayList = - 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()) { diff --git a/app/src/main/java/com/amaze/filemanager/ui/activities/MainActivity.java b/app/src/main/java/com/amaze/filemanager/ui/activities/MainActivity.java index fac4f49dbd..a5e63b5d3a 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/activities/MainActivity.java +++ b/app/src/main/java/com/amaze/filemanager/ui/activities/MainActivity.java @@ -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; @@ -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; @@ -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(); @@ -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 */ diff --git a/app/src/main/java/com/amaze/filemanager/ui/activities/superclasses/ThemedActivity.java b/app/src/main/java/com/amaze/filemanager/ui/activities/superclasses/ThemedActivity.java index cbee76f25d..cb7f1ec354 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/activities/superclasses/ThemedActivity.java +++ b/app/src/main/java/com/amaze/filemanager/ui/activities/superclasses/ThemedActivity.java @@ -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; @@ -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); } } diff --git a/app/src/main/java/com/amaze/filemanager/ui/fragments/FtpServerFragment.kt b/app/src/main/java/com/amaze/filemanager/ui/fragments/FtpServerFragment.kt index 4cba8f6b73..329bef09ae 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/fragments/FtpServerFragment.kt +++ b/app/src/main/java/com/amaze/filemanager/ui/fragments/FtpServerFragment.kt @@ -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 @@ -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() } diff --git a/app/src/main/java/com/amaze/filemanager/ui/fragments/MainFragment.java b/app/src/main/java/com/amaze/filemanager/ui/fragments/MainFragment.java index 29c2a3393b..7bfa5bd6ff 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/fragments/MainFragment.java +++ b/app/src/main/java/com/amaze/filemanager/ui/fragments/MainFragment.java @@ -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; @@ -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; @@ -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 @@ -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(); diff --git a/app/src/main/java/com/amaze/filemanager/utils/ContextCompatExt.kt b/app/src/main/java/com/amaze/filemanager/utils/ContextCompatExt.kt new file mode 100644 index 0000000000..56cc28cc22 --- /dev/null +++ b/app/src/main/java/com/amaze/filemanager/utils/ContextCompatExt.kt @@ -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( + broadcastReceiver: BroadcastReceiver, + intentFilter: IntentFilter, + flag: Int = 0x4, +) { + if (Build.VERSION.SDK_INT >= O) { + this.registerReceiver(broadcastReceiver, intentFilter, flag) + } else { + this.registerReceiver(broadcastReceiver, intentFilter) + } +} diff --git a/app/src/main/java/com/amaze/filemanager/utils/MainActivityHelper.java b/app/src/main/java/com/amaze/filemanager/utils/MainActivityHelper.java index 8eeaabe7ef..b9532d49c3 100644 --- a/app/src/main/java/com/amaze/filemanager/utils/MainActivityHelper.java +++ b/app/src/main/java/com/amaze/filemanager/utils/MainActivityHelper.java @@ -122,7 +122,7 @@ public void showFailedOperationDialog( @Override public void onReceive(Context context, Intent intent) { if (intent != null) { - if (intent.getAction().equals(Intent.ACTION_MEDIA_MOUNTED)) { + if (Intent.ACTION_MEDIA_MOUNTED.equals(intent.getAction())) { Toast.makeText(mainActivity, "Media Mounted", Toast.LENGTH_SHORT).show(); String a = intent.getData().getPath(); if (a != null @@ -134,8 +134,7 @@ && new File(a).canExecute()) { } else { mainActivity.getDrawer().refreshDrawer(); } - } else if (intent.getAction().equals(Intent.ACTION_MEDIA_UNMOUNTED)) { - + } else if (Intent.ACTION_MEDIA_UNMOUNTED.equals(intent.getAction())) { mainActivity.getDrawer().refreshDrawer(); } } diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/services/FtpServiceAndroidFileSystemIntegrationTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/services/FtpServiceAndroidFileSystemIntegrationTest.kt index 8a2fa1df4f..3dbfc48c0d 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/services/FtpServiceAndroidFileSystemIntegrationTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/services/FtpServiceAndroidFileSystemIntegrationTest.kt @@ -47,6 +47,7 @@ import org.junit.Assert.assertNotNull import org.junit.Assert.assertNull import org.junit.Assert.assertTrue import org.junit.Before +import org.junit.Ignore import org.junit.Test import org.junit.runner.RunWith import org.robolectric.Shadows.shadowOf @@ -61,6 +62,7 @@ import java.io.FileOutputStream import java.net.InetAddress import kotlin.random.Random +@Ignore("Pending fix for testing against newer Androids") @RunWith(AndroidJUnit4::class) @Config(sdk = [LOLLIPOP], shadows = [ShadowMultiDex::class]) @LooperMode(LooperMode.Mode.PAUSED)