diff --git a/app/src/banglejs/AndroidManifest.xml b/app/src/banglejs/AndroidManifest.xml
index 4a43bcf19..f285bad1f 100644
--- a/app/src/banglejs/AndroidManifest.xml
+++ b/app/src/banglejs/AndroidManifest.xml
@@ -2,7 +2,14 @@
-
-
-
+
+
+
+
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ef58e16d3..578f7e773 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -50,7 +50,6 @@
-
@@ -707,9 +706,15 @@
+
+
+
+
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ControlCenterv2.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ControlCenterv2.java
index 601feb69c..26cdeb3ad 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ControlCenterv2.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/ControlCenterv2.java
@@ -633,6 +633,8 @@ public class ControlCenterv2 extends AppCompatActivity
Intent enableIntent = new Intent(android.provider.Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivity(enableIntent);
}
+ }).setNegativeButton(R.string.dismiss, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int id) {}
});
return builder.create();
}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/WakeActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/WakeActivity.java
new file mode 100644
index 000000000..1495c9b8a
--- /dev/null
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/WakeActivity.java
@@ -0,0 +1,41 @@
+package nodomain.freeyourgadget.gadgetbridge.activities;
+
+import android.app.Activity;
+import android.app.KeyguardManager;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+import android.os.Bundle;
+import android.view.WindowManager;
+
+import androidx.annotation.Nullable;
+
+public class WakeActivity extends Activity {
+ /*
+ By starting this activity via an intent sent e.g. by a Bangle.js the keyguard can be
+ dismissed automatically if the android device is in a trusted state (e.g. using a GB Device (Bangle.js) as a
+ trusted device via smart lock settings)
+
+ First try to start the activity you want to start with an intent and then start this activity with a second intent, both initiated on the Bangle.js, or other device.
+ */
+
+ private void dismissKeyguard() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
+ setTurnScreenOn(true);
+ KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
+ keyguardManager.requestDismissKeyguard(this, null);
+ } else {
+ this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON|WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
+ }
+ }
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(null);
+ // Unlock the android device if it's in a trusted state, otherwise request user action to unlock
+ dismissKeyguard();
+ // Go back to last activity, which can have been waiting to start under
+ // the lock screen, e.g. it was previously initiated via intent message from Bangle.js
+ this.onBackPressed();
+ }
+}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/banglejs/BangleJSCoordinator.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/banglejs/BangleJSCoordinator.java
index 5a68cf384..47ed683b8 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/banglejs/BangleJSCoordinator.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/banglejs/BangleJSCoordinator.java
@@ -190,5 +190,4 @@ public class BangleJSCoordinator extends AbstractBLEDeviceCoordinator {
for (int i=0; i iter = extra.keys();
while (iter.hasNext()) {
String key = iter.next();
- in.putExtra(key, extra.getString(key));
+ in.putExtra(key, extra.getString(key)); // Should this be implemented for other types, e.g. extra.getInt(key)? Or will this always work even if receiving ints/doubles/etc.?
}
}
- LOG.info("Sending intent: " + String.valueOf(in));
+ LOG.info("Executing intent:\n\t" + String.valueOf(in) + "\n\tTargeting: " + target);
+ //GB.toast(getContext(), String.valueOf(in), Toast.LENGTH_LONG, GB.INFO);
switch (target) {
- case "":
- // This case should make sure intents matched to the original Bangle.js Gadgetbridge intents implementation still work.
- this.getContext().getApplicationContext().sendBroadcast(in);
- break;
case "broadcastreceiver":
- this.getContext().getApplicationContext().sendBroadcast(in);
+ getContext().sendBroadcast(in);
break;
- case "activity":
- in.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- this.getContext().getApplicationContext().startActivity(in);
+ case "activity": // See wakeActivity.java if you want to start activities from under the keyguard/lock sceen.
+ getContext().startActivity(in);
break;
- case "service": // Targeting 'Service' is not yet implemented.
- LOG.info("Targeting 'Service' not yet implemented.");
- GB.toast(getContext(), "Targeting '"+target+"' is not yet implemented.", Toast.LENGTH_LONG, GB.INFO);
- // Use jobInfo() and jobScheduler to program this part? Context.startService()? Context.bindService()?
+ case "service": // Should this be implemented differently, e.g. workManager?
+ getContext().startService(in);
+ break;
+ case "foregroundservice": // Should this be implemented differently, e.g. workManager?
+ getContext().startForegroundService(in);
break;
default:
LOG.info("Targeting '"+target+"' isn't implemented or doesn't exist.");
@@ -761,6 +776,19 @@ public class BangleJSDeviceSupport extends AbstractBTLEDeviceSupport {
}
}
+ private Intent addIntentFlag(Intent intent, String flag) {
+ try {
+ final Class intentClass = Intent.class;
+ final Field flagField = intentClass.getDeclaredField(flag);
+ intent.addFlags(flagField.getInt(null));
+ } catch (final Exception e) {
+ // The user sent an invalid flag
+ LOG.info("Flag '"+flag+"' isn't implemented or doesn't exist and was therefore not set.");
+ GB.toast(getContext(), "Flag '"+flag+"' isn't implemented or it doesn't exist and was therefore not set.", Toast.LENGTH_LONG, GB.INFO);
+ }
+ return intent;
+ }
+
@Override
public boolean onCharacteristicChanged(BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic) {
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index c9c14dc71..1252b9b65 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -944,6 +944,7 @@
Cancel
Delete
OK
+ Dismiss
Start
Set
Export/Import directory content
@@ -1301,7 +1302,7 @@
%1$s needs access to Notifications in order to display them on your watch when your phone\'s screen is off.\n\nPlease tap \'%2$s\' then \'%1$s\' and enable \'Allow Notification Access\', then tap \'Back\' to return to %1$s.
%1$s needs access to Do Not Disturb settings in order to honour them on your watch when your phone\'s screen is off.\n\nPlease tap \'%2$s\' then \'%1$s\' and enable \'Allow Do Not Disturb\', then tap \'Back\' to return to %1$s.
%1$s needs access to your location in the background to allow it to stay connected to your watch even when your screen is off.\n\nPlease tap \'%2$s\' to agree.
- %1$s needs permission to display over other apps in order to let Bangle.js watches start activities via intents when %1$s is in the background.\n\nThis can be used to start a music app and play a song, and many other things.\n\nPlease tap \'%2$s\' then \'%1$s\' and enable \'Allow display over other apps\', then tap \'Back\' to return to %1$s.
+ %1$s needs permission to display over other apps in order to let Bangle.js watches start activities via intents when %1$s is in the background.\n\nThis can be used to start a music app and play a song, and many other things.\n\nPlease tap \'%2$s\' then \'%1$s\' and enable \'Allow display over other apps\', then tap \'Back\' to return to %1$s.\n\nTo stop %1$s asking for permissions go to \'Settings\' and uncheck \'Check permission status\'.\n\nMake sure to grant %1$s the permissions needed to function as you expect.
CAUTION: Error when checking version information! You should not continue! Saw version name \"%s\"
Location must be enabled
CompanionDevice Pairing