fix(target O): static broadcast receiver not working
This commit is contained in:
@@ -144,11 +144,6 @@
|
|||||||
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
|
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
|
||||||
<action android:name="android.intent.action.TIME_SET"/>
|
<action android:name="android.intent.action.TIME_SET"/>
|
||||||
<action android:name="android.intent.action.TIMEZONE_CHANGED"/>
|
<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.UID_REMOVED"/>
|
||||||
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
|
<action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
|
||||||
<action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/>
|
<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.annotation.RequiresApi;
|
||||||
import android.support.v4.app.NotificationCompat;
|
import android.support.v4.app.NotificationCompat;
|
||||||
|
|
||||||
import com.stardust.app.GlobalAppContext;
|
|
||||||
|
|
||||||
import org.autojs.autojs.R;
|
import org.autojs.autojs.R;
|
||||||
import org.autojs.autojs.ui.main.MainActivity_;
|
import org.autojs.autojs.ui.main.MainActivity_;
|
||||||
|
|
||||||
|
import java.lang.reflect.Array;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
public class ForegroundService extends Service {
|
public class ForegroundService extends Service {
|
||||||
|
|
||||||
|
|
||||||
@@ -64,6 +65,7 @@ public class ForegroundService extends Service {
|
|||||||
.setWhen(System.currentTimeMillis())
|
.setWhen(System.currentTimeMillis())
|
||||||
.setContentIntent(contentIntent)
|
.setContentIntent(contentIntent)
|
||||||
.setChannelId(CHANEL_ID)
|
.setChannelId(CHANEL_ID)
|
||||||
|
.setVibrate(new long[0])
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,10 +4,14 @@ import android.content.BroadcastReceiver;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.util.Pair;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
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_PACKAGES_UNSUSPENDED;
|
||||||
import static android.content.Intent.ACTION_SCREEN_OFF;
|
import static android.content.Intent.ACTION_SCREEN_OFF;
|
||||||
import static android.content.Intent.ACTION_SCREEN_ON;
|
import static android.content.Intent.ACTION_SCREEN_ON;
|
||||||
import static android.content.Intent.ACTION_TIME_TICK;
|
|
||||||
|
|
||||||
public class DynamicBroadcastReceivers {
|
public class DynamicBroadcastReceivers {
|
||||||
|
|
||||||
private static final List<String> DEFAULT_ACTIONS = new ArrayList<>(Arrays.asList(
|
private static final String LOG_TAG = "DynBroadcastReceivers";
|
||||||
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 final Set<String> mActions = new LinkedHashSet<>();
|
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;
|
private final Context mContext;
|
||||||
|
|
||||||
|
|
||||||
public DynamicBroadcastReceivers(Context context) {
|
public DynamicBroadcastReceivers(Context context) {
|
||||||
mContext = 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) {
|
public void register(String action) {
|
||||||
register(Collections.singletonList(action));
|
register(Collections.singletonList(action));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void register(List<String> actions) {
|
public synchronized void register(List<String> actions) {
|
||||||
IntentFilter filter = new IntentFilter();
|
LinkedHashSet<String> newActions = new LinkedHashSet<>();
|
||||||
for (String action : actions) {
|
for (String action : actions) {
|
||||||
if (!StaticBroadcastReceiver.ACTIONS.contains(action)
|
if (!StaticBroadcastReceiver.ACTIONS.contains(action)
|
||||||
|
&& !StaticBroadcastReceiver.PACKAGE_ACTIONS.contains(action)
|
||||||
&& !mActions.contains(action)) {
|
&& !mActions.contains(action)) {
|
||||||
mActions.add(action);
|
newActions.add(action);
|
||||||
filter.addAction(action);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (filter.countActions() == 0) {
|
if (newActions.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
BaseBroadcastReceiver receiver = new BaseBroadcastReceiver();
|
ReceiverRegistry receiverRegistry = new ReceiverRegistry(newActions);
|
||||||
mContext.registerReceiver(receiver, filter);
|
receiverRegistry.register();
|
||||||
|
mReceiverRegistries.add(receiverRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void unregisterAll() {
|
public synchronized void unregister(String action) {
|
||||||
for (BroadcastReceiver receiver : mReceivers) {
|
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);
|
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"
|
"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")
|
@SuppressLint("CheckResult")
|
||||||
public void removeTask(IntentTask intentTask) {
|
public void removeTask(IntentTask intentTask) {
|
||||||
mIntentTaskDatabase.delete(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() {
|
public Flowable<TimedTask> getAllTasks() {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import android.content.Intent;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
import android.util.Log;
|
||||||
import android.view.ActionMode;
|
import android.view.ActionMode;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
@@ -48,6 +49,7 @@ public class
|
|||||||
EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHost, PermissionRequestProxyActivity {
|
EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHost, PermissionRequestProxyActivity {
|
||||||
|
|
||||||
private OnActivityResultDelegate.Mediator mMediator = new OnActivityResultDelegate.Mediator();
|
private OnActivityResultDelegate.Mediator mMediator = new OnActivityResultDelegate.Mediator();
|
||||||
|
private static final String LOG_TAG = "EditActivity";
|
||||||
|
|
||||||
@ViewById(R.id.editor_view)
|
@ViewById(R.id.editor_view)
|
||||||
EditorView mEditorView;
|
EditorView mEditorView;
|
||||||
@@ -125,6 +127,7 @@ EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHo
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onPrepareOptionsMenu(Menu menu) {
|
public boolean onPrepareOptionsMenu(Menu menu) {
|
||||||
|
Log.d(LOG_TAG, "onPrepareOptionsMenu: " + menu);
|
||||||
boolean isScriptRunning = mEditorView.getScriptExecutionId() != ScriptExecution.NO_ID;
|
boolean isScriptRunning = mEditorView.getScriptExecutionId() != ScriptExecution.NO_ID;
|
||||||
MenuItem forceStopItem = menu.findItem(R.id.action_force_stop);
|
MenuItem forceStopItem = menu.findItem(R.id.action_force_stop);
|
||||||
forceStopItem.setEnabled(isScriptRunning);
|
forceStopItem.setEnabled(isScriptRunning);
|
||||||
@@ -132,6 +135,7 @@ EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHo
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean onPrepareActionMode(Menu menu) {
|
public boolean onPrepareActionMode(Menu menu) {
|
||||||
|
Log.d(LOG_TAG, "onPrepareActionMode: " + menu);
|
||||||
boolean isScriptRunning = mEditorView.getScriptExecutionId() != ScriptExecution.NO_ID;
|
boolean isScriptRunning = mEditorView.getScriptExecutionId() != ScriptExecution.NO_ID;
|
||||||
MenuItem forceStopItem = menu.findItem(R.id.action_force_stop);
|
MenuItem forceStopItem = menu.findItem(R.id.action_force_stop);
|
||||||
forceStopItem.setEnabled(isScriptRunning);
|
forceStopItem.setEnabled(isScriptRunning);
|
||||||
@@ -140,6 +144,7 @@ EditActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHo
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onActionModeStarted(ActionMode mode) {
|
public void onActionModeStarted(ActionMode mode) {
|
||||||
|
Log.d(LOG_TAG, "onActionModeStarted: " + mode);
|
||||||
Menu menu = mode.getMenu();
|
Menu menu = mode.getMenu();
|
||||||
MenuItem item = menu.getItem(menu.size() - 1);
|
MenuItem item = menu.getItem(menu.size() - 1);
|
||||||
menu.add(item.getGroupId(), R.id.action_delete_line, 10000, R.string.text_delete_line);
|
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);
|
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
|
@Override
|
||||||
public void onBackPressed() {
|
public void onBackPressed() {
|
||||||
if (!mEditorView.onBackPressed()) {
|
if (!mEditorView.onBackPressed()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user