mirror of
https://github.com/TonyJiangWJ/Auto.js.git
synced 2026-06-21 21:01:43 +08:00
fix(target O): static broadcast receiver not working
This commit is contained in:
parent
8d2c0dd9f3
commit
51fedba26b
@ -144,11 +144,6 @@
|
||||
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
|
||||
<action android:name="android.intent.action.TIME_SET"/>
|
||||
<action android:name="android.intent.action.TIMEZONE_CHANGED"/>
|
||||
<action android:name="android.intent.action.PACKAGE_ADDED"/>
|
||||
<action android:name="android.intent.action.PACKAGE_CHANGED"/>
|
||||
<action android:name="android.intent.action.PACKAGE_DATA_CLEARED"/>
|
||||
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
|
||||
<action android:name="android.intent.action.PACKAGE_RESTARTED"/>
|
||||
<action android:name="android.intent.action.UID_REMOVED"/>
|
||||
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
|
||||
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
@ -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<String> 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<String> mActions = new LinkedHashSet<>();
|
||||
private final List<BroadcastReceiver> mReceivers = new ArrayList<>();
|
||||
private final List<ReceiverRegistry> 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<String> actions) {
|
||||
IntentFilter filter = new IntentFilter();
|
||||
public synchronized void register(List<String> actions) {
|
||||
LinkedHashSet<String> 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<ReceiverRegistry> 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<String> actions) {
|
||||
IntentFilter filter = new IntentFilter();
|
||||
for (String action : actions) {
|
||||
filter.addAction(action);
|
||||
}
|
||||
return filter;
|
||||
}
|
||||
|
||||
private class ReceiverRegistry {
|
||||
BroadcastReceiver receiver;
|
||||
LinkedHashSet<String> actions;
|
||||
|
||||
ReceiverRegistry(LinkedHashSet<String> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -37,4 +37,12 @@ public class StaticBroadcastReceiver extends BaseBroadcastReceiver {
|
||||
"android.net.conn.CONNECTIVITY_CHANGE"
|
||||
));
|
||||
|
||||
static final List<String> 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"
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
@ -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<TimedTask> getAllTasks() {
|
||||
|
||||
@ -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()) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user