mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-11-25 11:26:47 +01:00
Somewhat hacky support for Mi2 notification icons #323
This commit is contained in:
parent
2a0d97b39a
commit
5bdc7933b3
@ -75,6 +75,10 @@ public class DebugActivity extends GBActivity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
private Button sendChatButton;
|
||||||
|
private Button sendTelegramButton;
|
||||||
|
private Button sendTwitterButton;
|
||||||
|
private Button sendFacebookButton;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
@ -114,6 +118,58 @@ public class DebugActivity extends GBActivity {
|
|||||||
GBApplication.deviceService().onNotification(notificationSpec);
|
GBApplication.deviceService().onNotification(notificationSpec);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
sendChatButton = (Button) findViewById(R.id.sendChatButton);
|
||||||
|
sendChatButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
NotificationSpec notificationSpec = new NotificationSpec();
|
||||||
|
notificationSpec.sender = getResources().getText(R.string.app_name).toString();
|
||||||
|
notificationSpec.subject = editContent.getText().toString();
|
||||||
|
notificationSpec.body = editContent.getText().toString();
|
||||||
|
notificationSpec.type = NotificationType.CHAT;
|
||||||
|
notificationSpec.id = -1;
|
||||||
|
GBApplication.deviceService().onNotification(notificationSpec);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
sendTelegramButton = (Button) findViewById(R.id.sendTelegramButton);
|
||||||
|
sendTelegramButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
NotificationSpec notificationSpec = new NotificationSpec();
|
||||||
|
notificationSpec.sender = getResources().getText(R.string.app_name).toString();
|
||||||
|
notificationSpec.subject = editContent.getText().toString();
|
||||||
|
notificationSpec.body = editContent.getText().toString();
|
||||||
|
notificationSpec.type = NotificationType.TELEGRAM;
|
||||||
|
notificationSpec.id = -1;
|
||||||
|
GBApplication.deviceService().onNotification(notificationSpec);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
sendTwitterButton = (Button) findViewById(R.id.sendTwitterButton);
|
||||||
|
sendTwitterButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
NotificationSpec notificationSpec = new NotificationSpec();
|
||||||
|
notificationSpec.sender = getResources().getText(R.string.app_name).toString();
|
||||||
|
notificationSpec.subject = editContent.getText().toString();
|
||||||
|
notificationSpec.body = editContent.getText().toString();
|
||||||
|
notificationSpec.type = NotificationType.TWITTER;
|
||||||
|
notificationSpec.id = -1;
|
||||||
|
GBApplication.deviceService().onNotification(notificationSpec);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
sendFacebookButton = (Button) findViewById(R.id.sendFacebookButton);
|
||||||
|
sendFacebookButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
NotificationSpec notificationSpec = new NotificationSpec();
|
||||||
|
notificationSpec.sender = getResources().getText(R.string.app_name).toString();
|
||||||
|
notificationSpec.subject = editContent.getText().toString();
|
||||||
|
notificationSpec.body = editContent.getText().toString();
|
||||||
|
notificationSpec.type = NotificationType.FACEBOOK;
|
||||||
|
notificationSpec.id = -1;
|
||||||
|
GBApplication.deviceService().onNotification(notificationSpec);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
incomingCallButton = (Button) findViewById(R.id.incomingCallButton);
|
incomingCallButton = (Button) findViewById(R.id.incomingCallButton);
|
||||||
incomingCallButton.setOnClickListener(new View.OnClickListener() {
|
incomingCallButton.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@ -26,6 +26,11 @@ public class MiBand2Service {
|
|||||||
public static final UUID UUID_CHARACTERISTIC_AUTH = UUID.fromString("00000009-0000-3512-2118-0009af100700");
|
public static final UUID UUID_CHARACTERISTIC_AUTH = UUID.fromString("00000009-0000-3512-2118-0009af100700");
|
||||||
public static final UUID UUID_UNKNOWN_CHARACTERISTIC10 = UUID.fromString("00000010-0000-3512-2118-0009af100700");
|
public static final UUID UUID_UNKNOWN_CHARACTERISTIC10 = UUID.fromString("00000010-0000-3512-2118-0009af100700");
|
||||||
|
|
||||||
|
public static final int ALERT_LEVEL_NONE = 0;
|
||||||
|
public static final int ALERT_LEVEL_MESSAGE = 1;
|
||||||
|
public static final int ALERT_LEVEL_PHONE_CALL = 2;
|
||||||
|
public static final int ALERT_LEVEL_VIBRATE_ONLY = 3;
|
||||||
|
|
||||||
// set metric distance
|
// set metric distance
|
||||||
// set 12 hour time mode
|
// set 12 hour time mode
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ import android.content.Context;
|
|||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.alertnotification.AlertLevel;
|
||||||
|
|
||||||
public class VibrationProfile {
|
public class VibrationProfile {
|
||||||
public static final Context CONTEXT = GBApplication.getContext();
|
public static final Context CONTEXT = GBApplication.getContext();
|
||||||
@ -42,6 +43,7 @@ public class VibrationProfile {
|
|||||||
|
|
||||||
private final int[] onOffSequence;
|
private final int[] onOffSequence;
|
||||||
private final short repeat;
|
private final short repeat;
|
||||||
|
private int alertLevel = AlertLevel.MildAlert.getId();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new profile instance.
|
* Creates a new profile instance.
|
||||||
@ -67,4 +69,12 @@ public class VibrationProfile {
|
|||||||
public short getRepeat() {
|
public short getRepeat() {
|
||||||
return repeat;
|
return repeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setAlertLevel(int alertLevel) {
|
||||||
|
this.alertLevel = alertLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAlertLevel() {
|
||||||
|
return alertLevel;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,9 @@ import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.AbortTransactio
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.ConditionalWriteAction;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.ConditionalWriteAction;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateAction;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.SetDeviceStateAction;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.WriteAction;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.actions.WriteAction;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.alertnotification.AlertLevel;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfoProfile;
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.profiles.deviceinfo.DeviceInfoProfile;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.miband2.Mi2NotificationStrategy;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.miband2.operations.InitOperation;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.miband2.operations.InitOperation;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils;
|
import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
import nodomain.freeyourgadget.gadgetbridge.util.GB;
|
||||||
@ -291,7 +293,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private NotificationStrategy getNotificationStrategy() {
|
private NotificationStrategy getNotificationStrategy() {
|
||||||
return new V2NotificationStrategy(this);
|
return new Mi2NotificationStrategy(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
static final byte[] reboot = new byte[]{MiBandService.COMMAND_REBOOT};
|
static final byte[] reboot = new byte[]{MiBandService.COMMAND_REBOOT};
|
||||||
@ -475,7 +477,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void performPreferredNotification(String task, String notificationOrigin, BtLEAction extraAction) {
|
private void performPreferredNotification(String task, String notificationOrigin, int alertLevel, BtLEAction extraAction) {
|
||||||
try {
|
try {
|
||||||
TransactionBuilder builder = performInitialized(task);
|
TransactionBuilder builder = performInitialized(task);
|
||||||
Prefs prefs = GBApplication.getPrefs();
|
Prefs prefs = GBApplication.getPrefs();
|
||||||
@ -483,6 +485,7 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport {
|
|||||||
int vibratePause = getPreferredVibratePause(notificationOrigin, prefs);
|
int vibratePause = getPreferredVibratePause(notificationOrigin, prefs);
|
||||||
short vibrateTimes = getPreferredVibrateCount(notificationOrigin, prefs);
|
short vibrateTimes = getPreferredVibrateCount(notificationOrigin, prefs);
|
||||||
VibrationProfile profile = getPreferredVibrateProfile(notificationOrigin, prefs, vibrateTimes);
|
VibrationProfile profile = getPreferredVibrateProfile(notificationOrigin, prefs, vibrateTimes);
|
||||||
|
profile.setAlertLevel(alertLevel);
|
||||||
|
|
||||||
int flashTimes = getPreferredFlashCount(notificationOrigin, prefs);
|
int flashTimes = getPreferredFlashCount(notificationOrigin, prefs);
|
||||||
int flashColour = getPreferredFlashColour(notificationOrigin, prefs);
|
int flashColour = getPreferredFlashColour(notificationOrigin, prefs);
|
||||||
@ -553,20 +556,47 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onNotification(NotificationSpec notificationSpec) {
|
public void onNotification(NotificationSpec notificationSpec) {
|
||||||
// FIXME: these ORIGIN contants do not really make sense anymore
|
String task;
|
||||||
|
String origin;
|
||||||
|
int alertLevel;
|
||||||
switch (notificationSpec.type) {
|
switch (notificationSpec.type) {
|
||||||
case SMS:
|
case SMS:
|
||||||
performPreferredNotification("sms received", ORIGIN_SMS, null);
|
task = "sms received";
|
||||||
|
origin = ORIGIN_SMS;
|
||||||
|
alertLevel = MiBand2Service.ALERT_LEVEL_MESSAGE;
|
||||||
break;
|
break;
|
||||||
case EMAIL:
|
case EMAIL:
|
||||||
performPreferredNotification("email received", ORIGIN_K9MAIL, null);
|
task = "email received";
|
||||||
|
origin = ORIGIN_K9MAIL;
|
||||||
|
alertLevel = MiBand2Service.ALERT_LEVEL_MESSAGE;
|
||||||
|
break;
|
||||||
|
case FACEBOOK:
|
||||||
|
task = "facebook message received";
|
||||||
|
origin = ORIGIN_GENERIC;
|
||||||
|
alertLevel = MiBand2Service.ALERT_LEVEL_MESSAGE;
|
||||||
|
break;
|
||||||
|
case TWITTER:
|
||||||
|
task = "twitter message received";
|
||||||
|
origin = ORIGIN_GENERIC;
|
||||||
|
alertLevel = MiBand2Service.ALERT_LEVEL_MESSAGE;
|
||||||
|
break;
|
||||||
|
case TELEGRAM:
|
||||||
|
task = "telegram message received";
|
||||||
|
origin = ORIGIN_GENERIC;
|
||||||
|
alertLevel = MiBand2Service.ALERT_LEVEL_MESSAGE;
|
||||||
break;
|
break;
|
||||||
case CHAT:
|
case CHAT:
|
||||||
performPreferredNotification("chat message received", ORIGIN_PEBBLEMSG, null);
|
task = "chat message received";
|
||||||
|
origin = ORIGIN_PEBBLEMSG;
|
||||||
|
alertLevel = MiBand2Service.ALERT_LEVEL_MESSAGE;
|
||||||
break;
|
break;
|
||||||
|
case UNDEFINED:
|
||||||
default:
|
default:
|
||||||
performPreferredNotification("generic notification received", ORIGIN_GENERIC, null);
|
task = "generic notification received";
|
||||||
|
origin = ORIGIN_GENERIC;
|
||||||
|
alertLevel = MiBand2Service.ALERT_LEVEL_VIBRATE_ONLY;
|
||||||
}
|
}
|
||||||
|
performPreferredNotification(task, origin, alertLevel, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -624,8 +654,20 @@ public class MiBand2Support extends AbstractBTLEDeviceSupport {
|
|||||||
protected boolean shouldAbort() {
|
protected boolean shouldAbort() {
|
||||||
return !isTelephoneRinging();
|
return !isTelephoneRinging();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean run(BluetoothGatt gatt) {
|
||||||
|
if (!super.run(gatt)) {
|
||||||
|
// send a signal to stop the vibration
|
||||||
|
BluetoothGattCharacteristic characteristic = MiBand2Support.this.getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_ALERT_LEVEL);
|
||||||
|
characteristic.setValue(new byte[] {MiBand2Service.ALERT_LEVEL_NONE});
|
||||||
|
gatt.writeCharacteristic(characteristic);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
performPreferredNotification("incoming call", MiBandConst.ORIGIN_INCOMING_CALL, abortAction);
|
performPreferredNotification("incoming call", MiBandConst.ORIGIN_INCOMING_CALL, MiBand2Service.ALERT_LEVEL_PHONE_CALL, abortAction);
|
||||||
} else if ((callSpec.command == CallSpec.CALL_START) || (callSpec.command == CallSpec.CALL_END)) {
|
} else if ((callSpec.command == CallSpec.CALL_START) || (callSpec.command == CallSpec.CALL_END)) {
|
||||||
telephoneRinging = false;
|
telephoneRinging = false;
|
||||||
}
|
}
|
||||||
|
@ -15,13 +15,17 @@ public class V2NotificationStrategy implements NotificationStrategy {
|
|||||||
this.support = support;
|
this.support = support;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected AbstractBTLEDeviceSupport getSupport() {
|
||||||
|
return support;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendDefaultNotification(TransactionBuilder builder, BtLEAction extraAction) {
|
public void sendDefaultNotification(TransactionBuilder builder, BtLEAction extraAction) {
|
||||||
VibrationProfile profile = VibrationProfile.getProfile(VibrationProfile.ID_MEDIUM, (short) 3);
|
VibrationProfile profile = VibrationProfile.getProfile(VibrationProfile.ID_MEDIUM, (short) 3);
|
||||||
sendCustomNotification(profile, extraAction, builder);
|
sendCustomNotification(profile, extraAction, builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendCustomNotification(VibrationProfile vibrationProfile, BtLEAction extraAction, TransactionBuilder builder) {
|
protected void sendCustomNotification(VibrationProfile vibrationProfile, BtLEAction extraAction, TransactionBuilder builder) {
|
||||||
//use the new alert characteristic
|
//use the new alert characteristic
|
||||||
BluetoothGattCharacteristic alert = support.getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_ALERT_LEVEL);
|
BluetoothGattCharacteristic alert = support.getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_ALERT_LEVEL);
|
||||||
for (short i = 0; i < vibrationProfile.getRepeat(); i++) {
|
for (short i = 0; i < vibrationProfile.getRepeat(); i++) {
|
||||||
@ -31,6 +35,14 @@ public class V2NotificationStrategy implements NotificationStrategy {
|
|||||||
on = Math.min(500, on); // longer than 500ms is not possible
|
on = Math.min(500, on); // longer than 500ms is not possible
|
||||||
builder.write(alert, new byte[]{GattCharacteristic.MILD_ALERT}); //MILD_ALERT lights up GREEN leds, HIGH_ALERT lights up RED leds
|
builder.write(alert, new byte[]{GattCharacteristic.MILD_ALERT}); //MILD_ALERT lights up GREEN leds, HIGH_ALERT lights up RED leds
|
||||||
builder.wait(on);
|
builder.wait(on);
|
||||||
|
builder.write(alert, new byte[]{GattCharacteristic.HIGH_ALERT});
|
||||||
|
builder.wait(on);
|
||||||
|
builder.write(alert, new byte[]{0x3});
|
||||||
|
builder.wait(on);
|
||||||
|
builder.write(alert, new byte[]{0x4});
|
||||||
|
builder.wait(on);
|
||||||
|
builder.write(alert, new byte[]{0x5});
|
||||||
|
builder.wait(on);
|
||||||
builder.write(alert, new byte[]{GattCharacteristic.NO_ALERT});
|
builder.write(alert, new byte[]{GattCharacteristic.NO_ALERT});
|
||||||
|
|
||||||
if (++j < onOffSequence.length) {
|
if (++j < onOffSequence.length) {
|
||||||
|
@ -0,0 +1,49 @@
|
|||||||
|
package nodomain.freeyourgadget.gadgetbridge.service.devices.miband2;
|
||||||
|
|
||||||
|
import android.bluetooth.BluetoothGattCharacteristic;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.devices.miband.VibrationProfile;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.AbstractBTLEDeviceSupport;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.BtLEAction;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.GattCharacteristic;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.miband.NotificationStrategy;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.miband.V2NotificationStrategy;
|
||||||
|
|
||||||
|
public class Mi2NotificationStrategy extends V2NotificationStrategy {
|
||||||
|
|
||||||
|
public Mi2NotificationStrategy(AbstractBTLEDeviceSupport support) {
|
||||||
|
super(support);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void sendCustomNotification(VibrationProfile vibrationProfile, BtLEAction extraAction, TransactionBuilder builder) {
|
||||||
|
//use the new alert characteristic
|
||||||
|
BluetoothGattCharacteristic alert = getSupport().getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_ALERT_LEVEL);
|
||||||
|
for (short i = 0; i < vibrationProfile.getRepeat(); i++) {
|
||||||
|
int[] onOffSequence = vibrationProfile.getOnOffSequence();
|
||||||
|
for (int j = 0; j < onOffSequence.length; j++) {
|
||||||
|
int on = onOffSequence[j];
|
||||||
|
on = Math.min(500, on); // longer than 500ms is not possible
|
||||||
|
builder.write(alert, new byte[]{(byte) vibrationProfile.getAlertLevel()});
|
||||||
|
// builder.wait(on);
|
||||||
|
// builder.write(alert, new byte[]{GattCharacteristic.NO_ALERT});
|
||||||
|
|
||||||
|
if (++j < onOffSequence.length) {
|
||||||
|
int off = Math.max(onOffSequence[j], 25); // wait at least 25ms
|
||||||
|
builder.wait(off);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (extraAction != null) {
|
||||||
|
builder.add(extraAction);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void sendCustomNotification(VibrationProfile vibrationProfile, int flashTimes, int flashColour, int originalColour, long flashDuration, BtLEAction extraAction, TransactionBuilder builder) {
|
||||||
|
// all other parameters are unfortunately not supported anymore ;-(
|
||||||
|
sendCustomNotification(vibrationProfile, extraAction, builder);
|
||||||
|
}
|
||||||
|
}
|
@ -42,7 +42,7 @@
|
|||||||
android:layout_column="0"
|
android:layout_column="0"
|
||||||
android:layout_gravity="fill_horizontal"
|
android:layout_gravity="fill_horizontal"
|
||||||
android:layout_row="2"
|
android:layout_row="2"
|
||||||
android:text="send as SMS" />
|
android:text="SMS" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/sendEmailButton"
|
android:id="@+id/sendEmailButton"
|
||||||
@ -51,8 +51,43 @@
|
|||||||
android:layout_column="1"
|
android:layout_column="1"
|
||||||
android:layout_gravity="fill_horizontal"
|
android:layout_gravity="fill_horizontal"
|
||||||
android:layout_row="2"
|
android:layout_row="2"
|
||||||
android:text="send as E-Mail"
|
android:text="E-Mail"/>
|
||||||
android:layout_columnSpan="2" />
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/sendChatButton"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_column="2"
|
||||||
|
android:layout_gravity="fill_horizontal"
|
||||||
|
android:layout_row="2"
|
||||||
|
android:text="Chat"/>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/sendTelegramButton"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_column="0"
|
||||||
|
android:layout_gravity="fill_horizontal"
|
||||||
|
android:layout_row="3"
|
||||||
|
android:text="Telegram" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/sendTwitterButton"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_column="1"
|
||||||
|
android:layout_gravity="fill_horizontal"
|
||||||
|
android:layout_row="3"
|
||||||
|
android:text="Twitter"/>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/sendFacebookButton"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_column="2"
|
||||||
|
android:layout_gravity="fill_horizontal"
|
||||||
|
android:layout_row="3"
|
||||||
|
android:text="Facebook"/>
|
||||||
|
|
||||||
<EditText
|
<EditText
|
||||||
android:id="@+id/editContent"
|
android:id="@+id/editContent"
|
||||||
@ -73,7 +108,7 @@
|
|||||||
android:layout_column="0"
|
android:layout_column="0"
|
||||||
android:layout_columnSpan="3"
|
android:layout_columnSpan="3"
|
||||||
android:layout_gravity="fill_horizontal"
|
android:layout_gravity="fill_horizontal"
|
||||||
android:layout_row="10"
|
android:layout_row="11"
|
||||||
android:text="create test notification" />
|
android:text="create test notification" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
@ -82,7 +117,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_column="0"
|
android:layout_column="0"
|
||||||
android:layout_gravity="fill_horizontal"
|
android:layout_gravity="fill_horizontal"
|
||||||
android:layout_row="3"
|
android:layout_row="4"
|
||||||
android:text="incoming call" />
|
android:text="incoming call" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
@ -91,7 +126,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_column="1"
|
android:layout_column="1"
|
||||||
android:layout_gravity="fill_horizontal"
|
android:layout_gravity="fill_horizontal"
|
||||||
android:layout_row="3"
|
android:layout_row="4"
|
||||||
android:text="outgoing call"
|
android:text="outgoing call"
|
||||||
android:layout_columnSpan="2" />
|
android:layout_columnSpan="2" />
|
||||||
|
|
||||||
@ -101,7 +136,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_column="0"
|
android:layout_column="0"
|
||||||
android:layout_gravity="fill_horizontal"
|
android:layout_gravity="fill_horizontal"
|
||||||
android:layout_row="4"
|
android:layout_row="5"
|
||||||
android:text="start call" />
|
android:text="start call" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
@ -110,7 +145,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_column="1"
|
android:layout_column="1"
|
||||||
android:layout_gravity="fill_horizontal"
|
android:layout_gravity="fill_horizontal"
|
||||||
android:layout_row="4"
|
android:layout_row="5"
|
||||||
android:text="end call"
|
android:text="end call"
|
||||||
android:layout_columnSpan="2" />
|
android:layout_columnSpan="2" />
|
||||||
|
|
||||||
@ -121,7 +156,7 @@
|
|||||||
android:layout_column="0"
|
android:layout_column="0"
|
||||||
android:layout_columnSpan="1"
|
android:layout_columnSpan="1"
|
||||||
android:layout_gravity="fill_horizontal"
|
android:layout_gravity="fill_horizontal"
|
||||||
android:layout_row="5"
|
android:layout_row="6"
|
||||||
android:text="set time" />
|
android:text="set time" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
@ -131,7 +166,7 @@
|
|||||||
android:layout_column="1"
|
android:layout_column="1"
|
||||||
android:layout_columnSpan="2"
|
android:layout_columnSpan="2"
|
||||||
android:layout_gravity="fill_horizontal"
|
android:layout_gravity="fill_horizontal"
|
||||||
android:layout_row="5"
|
android:layout_row="6"
|
||||||
android:text="set music info" />
|
android:text="set music info" />
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/HearRateButton"
|
android:id="@+id/HearRateButton"
|
||||||
@ -140,7 +175,7 @@
|
|||||||
android:layout_column="0"
|
android:layout_column="0"
|
||||||
android:layout_columnSpan="3"
|
android:layout_columnSpan="3"
|
||||||
android:layout_gravity="fill_horizontal"
|
android:layout_gravity="fill_horizontal"
|
||||||
android:layout_row="8"
|
android:layout_row="9"
|
||||||
android:text="Heart Rate Test" />
|
android:text="Heart Rate Test" />
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/rebootButton"
|
android:id="@+id/rebootButton"
|
||||||
@ -149,7 +184,7 @@
|
|||||||
android:layout_column="0"
|
android:layout_column="0"
|
||||||
android:layout_columnSpan="3"
|
android:layout_columnSpan="3"
|
||||||
android:layout_gravity="fill_horizontal"
|
android:layout_gravity="fill_horizontal"
|
||||||
android:layout_row="11"
|
android:layout_row="12"
|
||||||
android:text="reboot" />
|
android:text="reboot" />
|
||||||
|
|
||||||
</GridLayout>
|
</GridLayout>
|
||||||
|
Loading…
Reference in New Issue
Block a user