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()) {