diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml
index 400684530c1f21f30a682f725c9f109656ec9a8c..d59ae2cc76753cb1e1e712aa7125c6732d522d95 100644
--- a/src/main/AndroidManifest.xml
+++ b/src/main/AndroidManifest.xml
@@ -1,4 +1,5 @@
@@ -8,6 +9,7 @@
-
+
diff --git a/src/main/java/org/qpython/qsl4a/qsl4a/FutureActivityTaskExecutor.java b/src/main/java/org/qpython/qsl4a/qsl4a/FutureActivityTaskExecutor.java
index 5634294bb21ef7e8a9f6dc742856afc465511c58..24c2f48b4b15416d21591589f1469dcfd2691539 100644
--- a/src/main/java/org/qpython/qsl4a/qsl4a/FutureActivityTaskExecutor.java
+++ b/src/main/java/org/qpython/qsl4a/qsl4a/FutureActivityTaskExecutor.java
@@ -34,6 +34,8 @@ public class FutureActivityTaskExecutor {
new ConcurrentHashMap>();
private final AtomicInteger mIdGenerator = new AtomicInteger(0);
+ private final int intentFlags = Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
+
public FutureActivityTaskExecutor(Context context) {
mContext = context;
}
@@ -41,17 +43,23 @@ public class FutureActivityTaskExecutor {
public void execute(FutureActivityTask> task) {
int id = mIdGenerator.incrementAndGet();
mTaskMap.put(id, task);
- launchHelper(id);
- }
-
- public FutureActivityTask> getTask(int id) {
- return mTaskMap.remove(id);
+ Intent helper = new Intent(mContext, FutureActivity.class);
+ helper.putExtra(Constants.EXTRA_TASK_ID, id);
+ helper.setFlags(intentFlags);
+ mContext.startActivity(helper);
}
- private void launchHelper(int id) {
+ public void execute(FutureActivityTask> task,int flags) {
+ int id = mIdGenerator.incrementAndGet();
+ mTaskMap.put(id, task);
Intent helper = new Intent(mContext, FutureActivity.class);
- helper.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
helper.putExtra(Constants.EXTRA_TASK_ID, id);
+ helper.setFlags(flags);
mContext.startActivity(helper);
}
+
+ public FutureActivityTask> getTask(int id) {
+ return mTaskMap.remove(id);
+ }
+
}
diff --git a/src/main/java/org/qpython/qsl4a/qsl4a/facade/SettingsFacade.java b/src/main/java/org/qpython/qsl4a/qsl4a/facade/SettingsFacade.java
index f478780fe2a3710127cecc2657dcf46a04e4bd17..d89d605c3de9586f242c75563888a3233a79354b 100644
--- a/src/main/java/org/qpython/qsl4a/qsl4a/facade/SettingsFacade.java
+++ b/src/main/java/org/qpython/qsl4a/qsl4a/facade/SettingsFacade.java
@@ -16,12 +16,15 @@
package org.qpython.qsl4a.qsl4a.facade;
+import android.app.NotificationManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.AudioManager;
+import android.os.Build;
import android.os.PowerManager;
+import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.view.WindowManager;
@@ -51,6 +54,9 @@ public class SettingsFacade extends RpcReceiver {
private final AudioManager mAudio;
private final PowerManager mPower;
+ private final AndroidFacade mAndroidFacade;
+ private final Context context;
+
/**
* Creates a new SettingsFacade.
*
@@ -62,8 +68,21 @@ public class SettingsFacade extends RpcReceiver {
mService = manager.getService();
mAudio = (AudioManager) mService.getSystemService(Context.AUDIO_SERVICE);
mPower = (PowerManager) mService.getSystemService(Context.POWER_SERVICE);
+ mAndroidFacade = manager.getReceiver(AndroidFacade.class);
+ context = mAndroidFacade.context;
}
+ private void NotificationPolicyAccessGranted() throws Exception {
+ NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
+ && !notificationManager.isNotificationPolicyAccessGranted()) {
+ Intent intent = new Intent(Settings.ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);
+ mAndroidFacade.startActivityForResult(intent);
+ if(!notificationManager.isNotificationPolicyAccessGranted()){
+ throw new Exception("Need Permission of NOTIFICATION_POLICY_ACCESS_SETTINGS .");
+ }
+ }}
+
@Rpc(description = "Sets the screen timeout to this number of seconds.", returns = "The original screen timeout.")
public Integer setScreenTimeout(@RpcParameter(name = "value") Integer value) {
Integer oldValue = getScreenTimeout();
@@ -108,25 +127,31 @@ public class SettingsFacade extends RpcReceiver {
return enabled;
}
- @Rpc(description = "Checks the ringer silent mode setting.", returns = "True if ringer silent mode is enabled.")
- public Boolean checkRingerSilentMode() {
- return mAudio.getRingerMode() == AudioManager.RINGER_MODE_SILENT;
- }
-
@Rpc(description = "Toggles ringer silent mode on and off.", returns = "True if ringer silent mode is enabled.")
- public Boolean toggleRingerSilentMode(@RpcParameter(name = "enabled") @RpcOptional Boolean enabled) {
+ public Boolean toggleRingerSilentMode(
+ @RpcParameter(name = "enabled") @RpcOptional Boolean enabled
+ ) throws Exception {
+ NotificationPolicyAccessGranted();
if (enabled == null) {
enabled = !checkRingerSilentMode();
}
mAudio.setRingerMode(enabled ? AudioManager.RINGER_MODE_SILENT
- : AudioManager.RINGER_MODE_NORMAL);
+ : AudioManager.RINGER_MODE_NORMAL);
return enabled;
}
+ @Rpc(description = "Checks the ringer silent mode setting.", returns = "True if ringer silent mode is enabled.")
+ public Boolean checkRingerSilentMode() {
+ return mAudio.getRingerMode() == AudioManager.RINGER_MODE_SILENT;
+ }
+
@SuppressWarnings("deprecation")
-@Rpc(description = "Toggles vibrate mode on and off. If ringer=true then set Ringer setting, else set Notification setting", returns = "True if vibrate mode is enabled.")
- public Boolean toggleVibrateMode(@RpcParameter(name = "enabled") @RpcOptional Boolean enabled,
- @RpcParameter(name = "ringer") @RpcOptional Boolean ringer) {
+ @Rpc(description = "Toggles vibrate mode on and off. If ringer=true then set Ringer setting, else set Notification setting", returns = "True if vibrate mode is enabled.")
+ public Boolean toggleVibrateMode(
+ @RpcParameter(name = "enabled") @RpcOptional Boolean enabled,
+ @RpcParameter(name = "ringer") @RpcOptional Boolean ringer
+ ) throws Exception {
+ NotificationPolicyAccessGranted();
int atype = ringer ? AudioManager.VIBRATE_TYPE_RINGER : AudioManager.VIBRATE_TYPE_NOTIFICATION;
int asetting = enabled ? AudioManager.VIBRATE_SETTING_ON : AudioManager.VIBRATE_SETTING_OFF;
mAudio.setVibrateSetting(atype, asetting);
@@ -151,7 +176,10 @@ public class SettingsFacade extends RpcReceiver {
}
@Rpc(description = "Sets the ringer volume.")
- public void setRingerVolume(@RpcParameter(name = "volume") Integer volume) {
+ public void setRingerVolume(
+ @RpcParameter(name = "volume") Integer volume
+ ) throws Exception {
+ NotificationPolicyAccessGranted();
mAudio.setStreamVolume(AudioManager.STREAM_RING, volume, 0);
}
diff --git a/src/main/java/org/qpython/qsl4a/qsl4a/facade/ui/FullScreenTask.java b/src/main/java/org/qpython/qsl4a/qsl4a/facade/ui/FullScreenTask.java
index 1cec678994e1ea554d6373c5def8657f9fbbf5da..a49ba9c04698ccf3abeb541486a2b6aaac8ce575 100644
--- a/src/main/java/org/qpython/qsl4a/qsl4a/facade/ui/FullScreenTask.java
+++ b/src/main/java/org/qpython/qsl4a/qsl4a/facade/ui/FullScreenTask.java
@@ -18,7 +18,15 @@
package org.qpython.qsl4a.qsl4a.facade.ui;
import android.R;
+import android.app.Activity;
+import android.app.ActivityManager;
+import android.graphics.Bitmap;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.LayerDrawable;
+import android.os.Build;
import android.os.Handler;
+import android.support.annotation.RequiresApi;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
@@ -27,13 +35,15 @@ import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
+import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
-import android.widget.TextView;
+import org.json.JSONArray;
import org.qpython.qsl4a.qsl4a.facade.EventFacade;
import org.qpython.qsl4a.qsl4a.future.FutureActivityTask;
+import org.xmlpull.v1.XmlPullParser;
import java.io.StringReader;
import java.util.HashMap;
@@ -41,9 +51,6 @@ import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
-import org.json.JSONArray;
-import org.xmlpull.v1.XmlPullParser;
-
public class FullScreenTask extends FutureActivityTask