From 54e7b2a09b7c3f4a3931c01dcdbefcf3df913f16 Mon Sep 17 00:00:00 2001 From: TBog Date: Wed, 8 May 2024 22:55:20 +0300 Subject: [PATCH] fix Android 14 local broadcast Intent must have package set or else receiver with RECEIVER_NOT_EXPORTED will not receive --- .../rocks/tbog/tblauncher/TBApplication.java | 3 +-- .../tbog/tblauncher/TBLauncherActivity.java | 19 ++++++++-------- .../tblauncher/dataprovider/DBProvider.java | 6 ++--- .../tblauncher/dataprovider/IProvider.java | 4 ++-- .../tblauncher/dataprovider/Provider.java | 4 ++-- .../tbog/tblauncher/handler/DataHandler.java | 22 ++++++++++--------- 6 files changed, 29 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/rocks/tbog/tblauncher/TBApplication.java b/app/src/main/java/rocks/tbog/tblauncher/TBApplication.java index efe2b3122..57e440744 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/TBApplication.java +++ b/app/src/main/java/rocks/tbog/tblauncher/TBApplication.java @@ -421,8 +421,7 @@ public void initDataHandler() { } if (dataHandler.fullLoadOverSent()) { // Already loaded! We still need to fire the FULL_LOAD event - Intent i = new Intent(TBLauncherActivity.FULL_LOAD_OVER); - sendBroadcast(i); + DataHandler.sendBroadcast(this, TBLauncherActivity.FULL_LOAD_OVER, TAG); } } diff --git a/app/src/main/java/rocks/tbog/tblauncher/TBLauncherActivity.java b/app/src/main/java/rocks/tbog/tblauncher/TBLauncherActivity.java index 8b90ae648..a27eb11c1 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/TBLauncherActivity.java +++ b/app/src/main/java/rocks/tbog/tblauncher/TBLauncherActivity.java @@ -32,9 +32,10 @@ public class TBLauncherActivity extends AppCompatActivity implements ActivityCompat.OnRequestPermissionsResultCallback { private static final String TAG = "TBL"; - public static final String START_LOAD = "fr.neamar.summon.START_LOAD"; - public static final String LOAD_OVER = "fr.neamar.summon.LOAD_OVER"; - public static final String FULL_LOAD_OVER = "fr.neamar.summon.FULL_LOAD_OVER"; + public static final String START_LOAD = "rocks.tbog.provider.START_LOAD"; + public static final String LOAD_OVER = "rocks.tbog.provider.LOAD_OVER"; + public static final String FULL_LOAD_OVER = "rocks.tbog.provider.FULL_LOAD_OVER"; + public static final String INTENT_DATA = "rocks.tbog.provider.INTENT_DATA"; /** * Receive events from providers @@ -42,6 +43,7 @@ public class TBLauncherActivity extends AppCompatActivity implements ActivityCom private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { + Log.d(TAG, "BroadcastReceiver action=`" + intent.getAction() + "` extra=`" + intent.getStringExtra(INTENT_DATA) + "`"); if (START_LOAD.equalsIgnoreCase(intent.getAction())) { behaviour.displayLoader(true); } else if (LOAD_OVER.equalsIgnoreCase(intent.getAction())) { @@ -120,13 +122,12 @@ protected void onCreate(Bundle savedInstanceState) { /* * Initialize data handler and start loading providers */ - IntentFilter intentFilterLoad = new IntentFilter(START_LOAD); - IntentFilter intentFilterLoadOver = new IntentFilter(LOAD_OVER); - IntentFilter intentFilterFullLoadOver = new IntentFilter(FULL_LOAD_OVER); + IntentFilter intentFilter = new IntentFilter(); + intentFilter.addAction(START_LOAD); + intentFilter.addAction(LOAD_OVER); + intentFilter.addAction(FULL_LOAD_OVER); - ActivityCompat.registerReceiver(this, mReceiver, intentFilterLoad, ContextCompat.RECEIVER_NOT_EXPORTED); - ActivityCompat.registerReceiver(this, mReceiver, intentFilterLoadOver, ContextCompat.RECEIVER_NOT_EXPORTED); - ActivityCompat.registerReceiver(this, mReceiver, intentFilterFullLoadOver, ContextCompat.RECEIVER_NOT_EXPORTED); + ActivityCompat.registerReceiver(this, mReceiver, intentFilter, ContextCompat.RECEIVER_NOT_EXPORTED); // init DataHandler after we register the receiver app.initDataHandler(); diff --git a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/DBProvider.java b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/DBProvider.java index 86ff38f07..68795ecf5 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/DBProvider.java +++ b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/DBProvider.java @@ -1,7 +1,6 @@ package rocks.tbog.tblauncher.dataprovider; import android.content.Context; -import android.content.Intent; import android.util.Log; import androidx.annotation.MainThread; @@ -15,12 +14,12 @@ import java.util.List; import rocks.tbog.tblauncher.BuildConfig; -import rocks.tbog.tblauncher.handler.DataHandler; import rocks.tbog.tblauncher.TBApplication; import rocks.tbog.tblauncher.TBLauncherActivity; import rocks.tbog.tblauncher.WorkAsync.AsyncTask; import rocks.tbog.tblauncher.WorkAsync.TaskRunner; import rocks.tbog.tblauncher.entry.EntryItem; +import rocks.tbog.tblauncher.handler.DataHandler; import rocks.tbog.tblauncher.searcher.ISearcher; import rocks.tbog.tblauncher.utils.Timer; @@ -162,8 +161,7 @@ protected void onPostExecute(List entryItems) { provider.mTimer.stop(); Log.i("time", "Time to load " + provider.getClass().getSimpleName() + ": " + provider.mTimer); - Intent i = new Intent(TBLauncherActivity.LOAD_OVER); - provider.context.sendBroadcast(i); + DataHandler.sendBroadcast(provider.context, TBLauncherActivity.LOAD_OVER, provider.getClass().getSimpleName()); } public void execute() { diff --git a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/IProvider.java b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/IProvider.java index 7e7aed13f..441423dd0 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/IProvider.java +++ b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/IProvider.java @@ -30,7 +30,7 @@ public interface IProvider { /** * Reload the data stored in this provider *

- * `"fr.neamar.summon.LOAD_OVER"` will be emitted once the reload is complete. The data provider + * `LOAD_OVER` will be emitted once the reload is complete. The data provider * will stay usable (using it's old data) during the reload. * @param cancelCurrentLoadTask pass true to stop current loading task and start another; * pass false to do nothing if already loading @@ -41,7 +41,7 @@ public interface IProvider { * Indicate whether this provider has already loaded it's data *

* If this method returns `false` then the client may listen for the - * `"fr.neamar.summon.LOAD_OVER"` intent for notification of when the provider is ready. + * `LOAD_OVER` intent for notification of when the provider is ready. * * @return Is the provider ready to process search results? */ diff --git a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/Provider.java b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/Provider.java index ec6f8c961..dbd8ea743 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/dataprovider/Provider.java +++ b/app/src/main/java/rocks/tbog/tblauncher/dataprovider/Provider.java @@ -17,6 +17,7 @@ import rocks.tbog.tblauncher.TBApplication; import rocks.tbog.tblauncher.TBLauncherActivity; import rocks.tbog.tblauncher.entry.EntryItem; +import rocks.tbog.tblauncher.handler.DataHandler; import rocks.tbog.tblauncher.loader.LoadEntryItem; import rocks.tbog.tblauncher.utils.Timer; @@ -113,8 +114,7 @@ public void loadOver(ArrayList results) { this.loader = null; // Broadcast this event - Intent i = new Intent(TBLauncherActivity.LOAD_OVER); - this.sendBroadcast(i); + DataHandler.sendBroadcast(this, TBLauncherActivity.LOAD_OVER, getClass().getSimpleName()); } @NonNull diff --git a/app/src/main/java/rocks/tbog/tblauncher/handler/DataHandler.java b/app/src/main/java/rocks/tbog/tblauncher/handler/DataHandler.java index 8d902bc3c..0fd16f59e 100644 --- a/app/src/main/java/rocks/tbog/tblauncher/handler/DataHandler.java +++ b/app/src/main/java/rocks/tbog/tblauncher/handler/DataHandler.java @@ -128,8 +128,7 @@ public DataHandler(@NonNull Application app) { ActivityCompat.registerReceiver(ctx, this, intentFilter, ContextCompat.RECEIVER_NOT_EXPORTED); - Intent i = new Intent(TBLauncherActivity.START_LOAD); - ctx.sendBroadcast(i); + sendBroadcast(ctx, TBLauncherActivity.START_LOAD, TAG); // Monitor changes for service preferences (to automatically start and stop services) SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx); @@ -161,6 +160,13 @@ public DataHandler(@NonNull Application app) { } } + public static void sendBroadcast(@NonNull Context context, @NonNull String action, @Nullable String data) { + Intent msg = new Intent(action) + .setPackage(context.getPackageName()) + .putExtra(TBLauncherActivity.INTENT_DATA, data); + context.sendBroadcast(msg); + } + @NonNull public Context getContext() { return mApplication.getApplicationContext(); @@ -486,8 +492,7 @@ private void handleProviderLoaded() { // Broadcast the fact that the new providers list is ready try { context.unregisterReceiver(this); - Intent i = new Intent(TBLauncherActivity.FULL_LOAD_OVER); - context.sendBroadcast(i); + sendBroadcast(context, TBLauncherActivity.FULL_LOAD_OVER, TAG); } catch (IllegalArgumentException e) { Log.e(TAG, "send FULL_LOAD_OVER", e); } @@ -959,8 +964,7 @@ public void onProviderRecreated(Provider provider) { IntentFilter intentFilter = new IntentFilter(TBLauncherActivity.LOAD_OVER); ActivityCompat.registerReceiver(context, this, intentFilter, ContextCompat.RECEIVER_NOT_EXPORTED); - Intent i = new Intent(TBLauncherActivity.START_LOAD); - context.sendBroadcast(i); + sendBroadcast(context, TBLauncherActivity.START_LOAD, provider.getClass().getSimpleName()); // reload providers for the next steps for (int step : IProvider.LOAD_STEPS) { @@ -986,8 +990,7 @@ public void reloadProviders(int loadStep) { IntentFilter intentFilter = new IntentFilter(TBLauncherActivity.LOAD_OVER); ActivityCompat.registerReceiver(context, this, intentFilter, ContextCompat.RECEIVER_NOT_EXPORTED); - Intent i = new Intent(TBLauncherActivity.START_LOAD); - context.sendBroadcast(i); + sendBroadcast(context, TBLauncherActivity.START_LOAD, "reload_" + loadStep); for (int step : IProvider.LOAD_STEPS) { if (step < loadStep) @@ -1007,8 +1010,7 @@ public void reloadProviders() { IntentFilter intentFilter = new IntentFilter(TBLauncherActivity.LOAD_OVER); ActivityCompat.registerReceiver(context, this, intentFilter, ContextCompat.RECEIVER_NOT_EXPORTED); - Intent i = new Intent(TBLauncherActivity.START_LOAD); - context.sendBroadcast(i); + sendBroadcast(context, TBLauncherActivity.START_LOAD, "reload"); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); toggleableProviders(prefs);