From 51fedba26b4c2ddef0d653e16413ef09e0ef2366 Mon Sep 17 00:00:00 2001
From: hyb1996 <946994919@qq.com>
Date: Sat, 6 Oct 2018 14:08:00 +0800
Subject: [PATCH] fix(target O): static broadcast receiver not working
---
app/src/main/AndroidManifest.xml | 5 -
.../foreground/ForegroundService.java | 6 +-
.../receiver/DynamicBroadcastReceivers.java | 111 +++++++++++++-----
.../receiver/StaticBroadcastReceiver.java | 8 ++
.../autojs/timing/TimedTaskManager.java | 7 +-
.../autojs/autojs/ui/edit/EditActivity.java | 30 +++++
6 files changed, 130 insertions(+), 37 deletions(-)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 98304279..bc3fdf25 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -144,11 +144,6 @@
-
-
-
-
-
diff --git a/app/src/main/java/org/autojs/autojs/external/foreground/ForegroundService.java b/app/src/main/java/org/autojs/autojs/external/foreground/ForegroundService.java
index e9108beb..a600f0a5 100644
--- a/app/src/main/java/org/autojs/autojs/external/foreground/ForegroundService.java
+++ b/app/src/main/java/org/autojs/autojs/external/foreground/ForegroundService.java
@@ -13,11 +13,12 @@ import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.v4.app.NotificationCompat;
-import com.stardust.app.GlobalAppContext;
-
import org.autojs.autojs.R;
import org.autojs.autojs.ui.main.MainActivity_;
+import java.lang.reflect.Array;
+import java.util.Arrays;
+
public class ForegroundService extends Service {
@@ -64,6 +65,7 @@ public class ForegroundService extends Service {
.setWhen(System.currentTimeMillis())
.setContentIntent(contentIntent)
.setChannelId(CHANEL_ID)
+ .setVibrate(new long[0])
.build();
}
diff --git a/app/src/main/java/org/autojs/autojs/external/receiver/DynamicBroadcastReceivers.java b/app/src/main/java/org/autojs/autojs/external/receiver/DynamicBroadcastReceivers.java
index b837f046..b80bcc39 100644
--- a/app/src/main/java/org/autojs/autojs/external/receiver/DynamicBroadcastReceivers.java
+++ b/app/src/main/java/org/autojs/autojs/external/receiver/DynamicBroadcastReceivers.java
@@ -4,10 +4,14 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.IntentFilter;
import android.os.Build;
+import android.util.Log;
+import android.util.Pair;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
+import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@@ -18,61 +22,110 @@ import static android.content.Intent.ACTION_PACKAGES_SUSPENDED;
import static android.content.Intent.ACTION_PACKAGES_UNSUSPENDED;
import static android.content.Intent.ACTION_SCREEN_OFF;
import static android.content.Intent.ACTION_SCREEN_ON;
-import static android.content.Intent.ACTION_TIME_TICK;
public class DynamicBroadcastReceivers {
- private static final List DEFAULT_ACTIONS = new ArrayList<>(Arrays.asList(
- ACTION_TIME_TICK,
- ACTION_SCREEN_OFF,
- ACTION_SCREEN_ON,
- ACTION_BATTERY_CHANGED,
- ACTION_CONFIGURATION_CHANGED
- ));
-
- static {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- DEFAULT_ACTIONS.addAll(Arrays.asList(
- ACTION_PACKAGES_SUSPENDED,
- ACTION_PACKAGES_UNSUSPENDED
- ));
- }
- }
+ private static final String LOG_TAG = "DynBroadcastReceivers";
private final Set mActions = new LinkedHashSet<>();
- private final List mReceivers = new ArrayList<>();
+ private final List mReceiverRegistries = new ArrayList<>();
+ private final BaseBroadcastReceiver mDefaultActionReceiver = new BaseBroadcastReceiver();
+ private final BaseBroadcastReceiver mPackageActionReceiver = new BaseBroadcastReceiver();
private final Context mContext;
public DynamicBroadcastReceivers(Context context) {
mContext = context;
- register(DEFAULT_ACTIONS);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ mContext.registerReceiver(mDefaultActionReceiver, createIntentFilter(StaticBroadcastReceiver.ACTIONS));
+ IntentFilter filter = createIntentFilter(StaticBroadcastReceiver.PACKAGE_ACTIONS);
+ filter.addDataScheme("package");
+ mContext.registerReceiver(mPackageActionReceiver, filter);
+ }
+
+
}
public void register(String action) {
register(Collections.singletonList(action));
}
- public void register(List actions) {
- IntentFilter filter = new IntentFilter();
+ public synchronized void register(List actions) {
+ LinkedHashSet newActions = new LinkedHashSet<>();
for (String action : actions) {
if (!StaticBroadcastReceiver.ACTIONS.contains(action)
+ && !StaticBroadcastReceiver.PACKAGE_ACTIONS.contains(action)
&& !mActions.contains(action)) {
- mActions.add(action);
- filter.addAction(action);
+ newActions.add(action);
}
}
- if (filter.countActions() == 0) {
+ if (newActions.isEmpty()) {
return;
}
- BaseBroadcastReceiver receiver = new BaseBroadcastReceiver();
- mContext.registerReceiver(receiver, filter);
+ ReceiverRegistry receiverRegistry = new ReceiverRegistry(newActions);
+ receiverRegistry.register();
+ mReceiverRegistries.add(receiverRegistry);
}
- public void unregisterAll() {
- for (BroadcastReceiver receiver : mReceivers) {
+ public synchronized void unregister(String action) {
+ if (!mActions.contains(action)) {
+ return;
+ }
+ mActions.remove(action);
+ Iterator iterator = mReceiverRegistries.iterator();
+ while (iterator.hasNext()) {
+ ReceiverRegistry receiverRegistry = iterator.next();
+ if (!receiverRegistry.actions.contains(action)) {
+ continue;
+ }
+ receiverRegistry.actions.remove(action);
+ receiverRegistry.unregister();
+ if (!receiverRegistry.register()) {
+ iterator.remove();
+ }
+ break;
+ }
+ }
+
+ public synchronized void unregisterAll() {
+ for (ReceiverRegistry registry : mReceiverRegistries) {
+ registry.unregister();
+ }
+ mReceiverRegistries.clear();
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ mContext.unregisterReceiver(mDefaultActionReceiver);
+ mContext.unregisterReceiver(mPackageActionReceiver);
+ }
+ }
+
+ static IntentFilter createIntentFilter(Collection actions) {
+ IntentFilter filter = new IntentFilter();
+ for (String action : actions) {
+ filter.addAction(action);
+ }
+ return filter;
+ }
+
+ private class ReceiverRegistry {
+ BroadcastReceiver receiver;
+ LinkedHashSet actions;
+
+ ReceiverRegistry(LinkedHashSet actions) {
+ this.actions = actions;
+ receiver = new BaseBroadcastReceiver();
+ }
+
+ void unregister() {
mContext.unregisterReceiver(receiver);
}
- mReceivers.clear();
+
+ boolean register() {
+ if (actions.isEmpty())
+ return false;
+ IntentFilter intentFilter = createIntentFilter(actions);
+ mContext.registerReceiver(receiver, intentFilter);
+ Log.d(LOG_TAG, "register: " + actions);
+ return true;
+ }
}
}
diff --git a/app/src/main/java/org/autojs/autojs/external/receiver/StaticBroadcastReceiver.java b/app/src/main/java/org/autojs/autojs/external/receiver/StaticBroadcastReceiver.java
index 55b93726..31ee2ba9 100644
--- a/app/src/main/java/org/autojs/autojs/external/receiver/StaticBroadcastReceiver.java
+++ b/app/src/main/java/org/autojs/autojs/external/receiver/StaticBroadcastReceiver.java
@@ -37,4 +37,12 @@ public class StaticBroadcastReceiver extends BaseBroadcastReceiver {
"android.net.conn.CONNECTIVITY_CHANGE"
));
+ static final List PACKAGE_ACTIONS = new ArrayList<>(Arrays.asList(
+ "android.intent.action.PACKAGE_ADDED",
+ "android.intent.action.PACKAGE_CHANGED",
+ "android.intent.action.PACKAGE_DATA_CLEARED",
+ "android.intent.action.PACKAGE_REMOVED",
+ "android.intent.action.PACKAGE_RESTARTED"
+ ));
+
}
diff --git a/app/src/main/java/org/autojs/autojs/timing/TimedTaskManager.java b/app/src/main/java/org/autojs/autojs/timing/TimedTaskManager.java
index a8898ce9..b0bcd9a2 100644
--- a/app/src/main/java/org/autojs/autojs/timing/TimedTaskManager.java
+++ b/app/src/main/java/org/autojs/autojs/timing/TimedTaskManager.java
@@ -94,7 +94,12 @@ public class TimedTaskManager {
@SuppressLint("CheckResult")
public void removeTask(IntentTask intentTask) {
mIntentTaskDatabase.delete(intentTask)
- .subscribe(EmptyObservers.consumer(), Throwable::printStackTrace);;
+ .subscribe(i -> {
+ if(!TextUtils.isEmpty(intentTask.getAction())){
+ App.getApp().getDynamicBroadcastReceivers()
+ .unregister(intentTask.getAction());
+ }
+ }, Throwable::printStackTrace);
}
public Flowable getAllTasks() {
diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.java b/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.java
index 0ec43fef..2063ab26 100644
--- a/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.java
+++ b/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.java
@@ -6,6 +6,7 @@ import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.util.Log;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
@@ -48,6 +49,7 @@ public class
EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHost, PermissionRequestProxyActivity {
private OnActivityResultDelegate.Mediator mMediator = new OnActivityResultDelegate.Mediator();
+ private static final String LOG_TAG = "EditActivity";
@ViewById(R.id.editor_view)
EditorView mEditorView;
@@ -125,6 +127,7 @@ EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHo
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
+ Log.d(LOG_TAG, "onPrepareOptionsMenu: " + menu);
boolean isScriptRunning = mEditorView.getScriptExecutionId() != ScriptExecution.NO_ID;
MenuItem forceStopItem = menu.findItem(R.id.action_force_stop);
forceStopItem.setEnabled(isScriptRunning);
@@ -132,6 +135,7 @@ EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHo
}
public boolean onPrepareActionMode(Menu menu) {
+ Log.d(LOG_TAG, "onPrepareActionMode: " + menu);
boolean isScriptRunning = mEditorView.getScriptExecutionId() != ScriptExecution.NO_ID;
MenuItem forceStopItem = menu.findItem(R.id.action_force_stop);
forceStopItem.setEnabled(isScriptRunning);
@@ -140,6 +144,7 @@ EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHo
@Override
public void onActionModeStarted(ActionMode mode) {
+ Log.d(LOG_TAG, "onActionModeStarted: " + mode);
Menu menu = mode.getMenu();
MenuItem item = menu.getItem(menu.size() - 1);
menu.add(item.getGroupId(), R.id.action_delete_line, 10000, R.string.text_delete_line);
@@ -147,6 +152,31 @@ EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHo
super.onActionModeStarted(mode);
}
+ @Override
+ public void onSupportActionModeStarted(@NonNull android.support.v7.view.ActionMode mode) {
+ Log.d(LOG_TAG, "onSupportActionModeStarted: mode = " + mode);
+ super.onSupportActionModeStarted(mode);
+ }
+
+ @Nullable
+ @Override
+ public android.support.v7.view.ActionMode onWindowStartingSupportActionMode(@NonNull android.support.v7.view.ActionMode.Callback callback) {
+ Log.d(LOG_TAG, "onWindowStartingSupportActionMode: callback = " + callback);
+ return super.onWindowStartingSupportActionMode(callback);
+ }
+
+ @Override
+ public ActionMode startActionMode(ActionMode.Callback callback, int type) {
+ Log.d(LOG_TAG, "startActionMode: callback = " + callback + ", type = " + type);
+ return super.startActionMode(callback, type);
+ }
+
+ @Override
+ public ActionMode startActionMode(ActionMode.Callback callback) {
+ Log.d(LOG_TAG, "startActionMode: callback = " + callback );
+ return super.startActionMode(callback);
+ }
+
@Override
public void onBackPressed() {
if (!mEditorView.onBackPressed()) {