Fossil Q: Fix commands being sent to all connected Fossil watches

This commit is contained in:
Arjan Schrijver
2026-04-05 14:18:10 +02:00
committed by Arjan Schrijver
parent f161d129f5
commit b6b9781f0b
11 changed files with 161 additions and 73 deletions
@@ -39,9 +39,6 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import org.json.JSONArray;
import org.json.JSONException;
import java.util.List;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBActivity;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
@@ -51,6 +48,7 @@ import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSuppo
import nodomain.freeyourgadget.gadgetbridge.util.GB;
public class AppsManagementActivity extends AbstractGBActivity {
private GBDevice device;
ListView appsListView;
String[] appNames;
@@ -59,6 +57,13 @@ public class AppsManagementActivity extends AbstractGBActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qhybrid_apps_management);
device = getIntent().getParcelableExtra(GBDevice.EXTRA_DEVICE);
if (device == null || !device.isInitialized()) {
GB.toast(this, getString(R.string.watch_not_connected), Toast.LENGTH_LONG, GB.ERROR);
finish();
return;
}
initViews();
refreshInstalledApps();
}
@@ -69,8 +74,6 @@ public class AppsManagementActivity extends AbstractGBActivity {
private void refreshInstalledApps() {
try {
List<GBDevice> devices = GBApplication.app().getDeviceManager().getSelectedDevices();
for(GBDevice device : devices){
if (
device.getType() == DeviceType.FOSSILQHYBRID &&
device.isConnected() &&
@@ -88,15 +91,13 @@ public class AppsManagementActivity extends AbstractGBActivity {
appNames[i] = apps.getString(i);
}
appsListView.setAdapter(new AppsListAdapter(this, appNames));
} else {
throw new RuntimeException("Device not connected");
}
return;
}
} catch (JSONException e) {
toast(e.getLocalizedMessage());
finish();
return;
}
throw new RuntimeException("Device not connected");
}
static class AppsListAdapter extends ArrayAdapter<String> {
@@ -149,6 +150,7 @@ public class AppsManagementActivity extends AbstractGBActivity {
@Override
public boolean onMenuItemClick(MenuItem item) {
Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_UNINSTALL_APP);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
intent.putExtra("EXTRA_APP_NAME", appNames[position]);
LocalBroadcastManager.getInstance(AppsManagementActivity.this).sendBroadcast(intent);
return true;
@@ -23,22 +23,20 @@ import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import java.util.List;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBActivity;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.model.DeviceType;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSupport;
import nodomain.freeyourgadget.gadgetbridge.util.GB;
public class CalibrationActivity extends AbstractGBActivity {
GBDevice device;
enum HAND{
MINUTE,
HOUR,
@@ -87,33 +85,25 @@ public class CalibrationActivity extends AbstractGBActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qhybrid_calibration);
List<GBDevice> devices = GBApplication.app().getDeviceManager().getSelectedDevices();
boolean atLeastOneConnected = false;
for(GBDevice device : devices){
if(device.getType() == DeviceType.FOSSILQHYBRID){
atLeastOneConnected = true;
break;
}
}
if(!atLeastOneConnected){
Toast.makeText(this, R.string.watch_not_connected, Toast.LENGTH_LONG).show();
device = getIntent().getParcelableExtra(GBDevice.EXTRA_DEVICE);
if (device == null || !device.isInitialized()) {
GB.toast(this, getString(R.string.watch_not_connected), Toast.LENGTH_LONG, GB.ERROR);
finish();
return;
}
localBroadcastManager = LocalBroadcastManager.getInstance(this);
localBroadcastManager.sendBroadcast(
new Intent(QHybridSupport.QHYBRID_COMMAND_CONTROL)
);
final Intent cncIntent = new Intent(QHybridSupport.QHYBRID_COMMAND_CONTROL);
cncIntent.putExtra(GBDevice.EXTRA_DEVICE, device);
localBroadcastManager.sendBroadcast(cncIntent);
initViews();
}
private void initViews(){
Spinner handSpinner = findViewById(R.id.qhybrid_calibration_hand_spinner);
handSpinner.setAdapter(new ArrayAdapter<HAND>(this, android.R.layout.simple_spinner_dropdown_item, HAND.values()));
handSpinner.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, HAND.values()));
handSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
@@ -122,21 +112,18 @@ public class CalibrationActivity extends AbstractGBActivity {
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
for(final MOVE_BUTTON buttonDeclaration : MOVE_BUTTON.values()) {
final Button button = findViewById(buttonDeclaration.layoutId);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_MOVE);
intent.putExtra("EXTRA_DISTANCE_" + selectedHand.getVariableName(), (short) buttonDeclaration.distance);
button.setOnClickListener(v -> {
final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_MOVE);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
intent.putExtra("EXTRA_DISTANCE_" + selectedHand.getVariableName(), (short) buttonDeclaration.distance);
localBroadcastManager.sendBroadcast(intent);
}
localBroadcastManager.sendBroadcast(intent);
});
}
}
@@ -151,8 +138,12 @@ public class CalibrationActivity extends AbstractGBActivity {
protected void onDestroy() {
super.onDestroy();
if (localBroadcastManager != null) {
localBroadcastManager.sendBroadcast(new Intent(QHybridSupport.QHYBRID_COMMAND_SAVE_CALIBRATION));
localBroadcastManager.sendBroadcast(new Intent(QHybridSupport.QHYBRID_COMMAND_UNCONTROL));
final Intent saveIntent = new Intent(QHybridSupport.QHYBRID_COMMAND_SAVE_CALIBRATION);
saveIntent.putExtra(GBDevice.EXTRA_DEVICE, device);
localBroadcastManager.sendBroadcast(saveIntent);
final Intent uncontrolIntent = new Intent(QHybridSupport.QHYBRID_COMMAND_UNCONTROL);
uncontrolIntent.putExtra(GBDevice.EXTRA_DEVICE, device);
localBroadcastManager.sendBroadcast(uncontrolIntent);
}
}
}
@@ -23,6 +23,7 @@ import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
@@ -43,11 +44,14 @@ import java.util.List;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBActivity;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSupport;
import nodomain.freeyourgadget.gadgetbridge.util.GB;
public class CommuteActionsActivity extends AbstractGBActivity implements CommuteActionsListAdapter.ItemClickListener, DialogInterface.OnClickListener, View.OnClickListener {
protected final List<String> actionsList = new ArrayList<>();
private static final Logger LOG = LoggerFactory.getLogger(CommuteActionsActivity.class);
private GBDevice device;
private SharedPreferences sharedPreferences;
private ItemTouchHelper actionTouchHelper;
private CommuteActionsListAdapter actionsListAdapter;
@@ -57,6 +61,14 @@ public class CommuteActionsActivity extends AbstractGBActivity implements Commut
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_commute_actions);
device = getIntent().getParcelableExtra(GBDevice.EXTRA_DEVICE);
if (device == null || !device.isInitialized()) {
GB.toast(this, getString(R.string.watch_not_connected), Toast.LENGTH_LONG, GB.ERROR);
finish();
return;
}
sharedPreferences = GBApplication.getPrefs().getPreferences();
findViewById(R.id.actionAddFab).setOnClickListener(this);
@@ -134,7 +146,9 @@ public class CommuteActionsActivity extends AbstractGBActivity implements Commut
putActionItems(actionsList);
refreshActions();
LocalBroadcastManager.getInstance(CommuteActionsActivity.this).sendBroadcast(new Intent(QHybridSupport.QHYBRID_COMMAND_OVERWRITE_BUTTONS));
final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_OVERWRITE_BUTTONS);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
LocalBroadcastManager.getInstance(CommuteActionsActivity.this).sendBroadcast(intent);
}
})
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@@ -144,7 +158,9 @@ public class CommuteActionsActivity extends AbstractGBActivity implements Commut
putActionItems(actionsList);
refreshActions();
LocalBroadcastManager.getInstance(CommuteActionsActivity.this).sendBroadcast(new Intent(QHybridSupport.QHYBRID_COMMAND_OVERWRITE_BUTTONS));
final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_OVERWRITE_BUTTONS);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
LocalBroadcastManager.getInstance(CommuteActionsActivity.this).sendBroadcast(intent);
}
})
.setTitle(R.string.fossil_hr_edit_action)
@@ -162,7 +178,9 @@ public class CommuteActionsActivity extends AbstractGBActivity implements Commut
sharedPreferences.edit().putString(CONFIG_KEY_Q_ACTIONS, actionArray.toString()).apply();
refreshActions();
LocalBroadcastManager.getInstance(CommuteActionsActivity.this).sendBroadcast(new Intent(QHybridSupport.QHYBRID_COMMAND_OVERWRITE_BUTTONS));
final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_OVERWRITE_BUTTONS);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
LocalBroadcastManager.getInstance(CommuteActionsActivity.this).sendBroadcast(intent);
} catch (JSONException e) {
LOG.error("Error adding new commute action", e);
}
@@ -207,7 +225,9 @@ public class CommuteActionsActivity extends AbstractGBActivity implements Commut
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
putActionItems(actionsList);
LocalBroadcastManager.getInstance(CommuteActionsActivity.this).sendBroadcast(new Intent(QHybridSupport.QHYBRID_COMMAND_OVERWRITE_BUTTONS));
final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_OVERWRITE_BUTTONS);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
LocalBroadcastManager.getInstance(CommuteActionsActivity.this).sendBroadcast(intent);
}
}
}
@@ -38,12 +38,14 @@ import java.io.IOException;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBActivity;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.file.FileHandle;
import nodomain.freeyourgadget.gadgetbridge.util.AndroidUtils;
import nodomain.freeyourgadget.gadgetbridge.util.GB;
public class FileManagementActivity extends AbstractGBActivity implements View.OnClickListener {
private GBDevice device;
private final int REQUEST_CODE_PICK_UPLOAD_FILE = 0;
private Spinner fileTypesSpinner;
@@ -79,6 +81,13 @@ public class FileManagementActivity extends AbstractGBActivity implements View.O
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qhybrid_file_management);
device = getIntent().getParcelableExtra(GBDevice.EXTRA_DEVICE);
if (device == null || !device.isInitialized()) {
GB.toast(this, getString(R.string.watch_not_connected), Toast.LENGTH_LONG, GB.ERROR);
finish();
return;
}
initViews();
}
@@ -156,6 +165,7 @@ public class FileManagementActivity extends AbstractGBActivity implements View.O
}
Intent callIntent = new Intent(QHybridSupport.QHYBRID_COMMAND_UPLOAD_FILE);
callIntent.putExtra(GBDevice.EXTRA_DEVICE, device);
callIntent.putExtra("EXTRA_HANDLE", (FileHandle) fileTypesSpinner.getSelectedItem());
callIntent.putExtra("EXTRA_ENCRYPTED", encryptedFile.isChecked());
callIntent.putExtra("EXTRA_GENERATE_FILE_HEADER", generateFileHeader);
@@ -173,9 +183,9 @@ public class FileManagementActivity extends AbstractGBActivity implements View.O
boolean isEncrypted = encryptedFile.isChecked();
if (v.getId() == R.id.qhybrid_button_download_file) {
Intent fileIntent = new Intent();
Intent fileIntent = new Intent(QHybridSupport.QHYBRID_COMMAND_DOWNLOAD_FILE);
fileIntent.putExtra(GBDevice.EXTRA_DEVICE, device);
fileIntent.putExtra("EXTRA_ENCRYPTED", isEncrypted);
fileIntent.setAction(QHybridSupport.QHYBRID_COMMAND_DOWNLOAD_FILE);
fileIntent.putExtra("EXTRA_MAJORHANDLE", ((FileHandle) fileTypesSpinner.getSelectedItem()).getMajorHandle());
fileIntent.putExtra("EXTRA_MINORHANDLE", ((FileHandle) fileTypesSpinner.getSelectedItem()).getMinorHandle());
fileIntent.putExtra("EXTRA_NAME", ((FileHandle) fileTypesSpinner.getSelectedItem()).name());
@@ -17,8 +17,6 @@
along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.devices.qhybrid;
import static nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSupport.QHYBRID_COMMAND_UPDATE_WIDGETS;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
@@ -62,6 +60,7 @@ import nodomain.freeyourgadget.gadgetbridge.util.GB;
import nodomain.freeyourgadget.gadgetbridge.util.Version;
public class HRConfigActivity extends AbstractGBActivity {
private GBDevice device;
private SharedPreferences sharedPreferences;
private WidgetListAdapter widgetListAdapter;
private ArrayList<CustomWidget> customWidgets = new ArrayList<>();
@@ -77,6 +76,13 @@ public class HRConfigActivity extends AbstractGBActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qhybrid_hr_settings);
device = getIntent().getParcelableExtra(GBDevice.EXTRA_DEVICE);
if (device == null || !device.isInitialized()) {
GB.toast(this, getString(R.string.watch_not_connected), Toast.LENGTH_LONG, GB.ERROR);
finish();
return;
}
sharedPreferences = GBApplication.getPrefs().getPreferences();
initMappings();
@@ -133,6 +139,7 @@ public class HRConfigActivity extends AbstractGBActivity {
@Override
public void onClick(View view) {
Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_SET_BACKGROUND_IMAGE);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
intent.putIntegerArrayListExtra("EXTRA_PIXELS", null);
LocalBroadcastManager.getInstance(HRConfigActivity.this).sendBroadcast(intent);
}
@@ -203,7 +210,9 @@ public class HRConfigActivity extends AbstractGBActivity {
refreshWidgetList();
saveCustomWidgetList();
LocalBroadcastManager.getInstance(HRConfigActivity.this).sendBroadcast(new Intent(QHYBRID_COMMAND_UPDATE_WIDGETS));
final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_UPDATE_WIDGETS);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
LocalBroadcastManager.getInstance(HRConfigActivity.this).sendBroadcast(intent);
} else if (resultCode == WidgetSettingsActivity.RESULT_CODE_WIDGET_UPDATED) {
CustomWidget widget = (CustomWidget) data.getExtras().get("EXTRA_WIDGET");
int updateIndex = data.getIntExtra("EXTRA_WIDGET_IDNEX", -1);
@@ -221,7 +230,9 @@ public class HRConfigActivity extends AbstractGBActivity {
refreshWidgetList();
saveCustomWidgetList();
LocalBroadcastManager.getInstance(HRConfigActivity.this).sendBroadcast(new Intent(QHYBRID_COMMAND_UPDATE_WIDGETS));
final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_UPDATE_WIDGETS);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
LocalBroadcastManager.getInstance(HRConfigActivity.this).sendBroadcast(intent);
} else if (resultCode == WidgetSettingsActivity.RESULT_CODE_WIDGET_DELETED) {
int updateIndex = data.getIntExtra("EXTRA_WIDGET_IDNEX", -1);
@@ -230,7 +241,9 @@ public class HRConfigActivity extends AbstractGBActivity {
refreshWidgetList();
saveCustomWidgetList();
LocalBroadcastManager.getInstance(HRConfigActivity.this).sendBroadcast(new Intent(QHYBRID_COMMAND_UPDATE_WIDGETS));
final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_UPDATE_WIDGETS);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
LocalBroadcastManager.getInstance(HRConfigActivity.this).sendBroadcast(intent);
}
}else if(requestCode == REQUEST_CODE_IMAGE_PICK){
if (resultCode == RESULT_OK)
@@ -245,6 +258,7 @@ public class HRConfigActivity extends AbstractGBActivity {
}else if(requestCode == REQUEST_CODE_IMAGE_EDIT){
if(resultCode == ImageEditActivity.RESULT_CODE_EDIT_SUCCESS){
data.setAction(QHybridSupport.QHYBRID_COMMAND_SET_BACKGROUND_IMAGE);
data.putExtra(GBDevice.EXTRA_DEVICE, device);
LocalBroadcastManager.getInstance(this).sendBroadcast(data);
}
}
@@ -343,7 +357,10 @@ public class HRConfigActivity extends AbstractGBActivity {
keyConfig.remove(jsonKey);
}
sharedPreferences.edit().putString("FOSSIL_HR_WIDGETS", keyConfig.toString()).apply();
LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent(QHYBRID_COMMAND_UPDATE_WIDGETS));
final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_UPDATE_WIDGETS);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
LocalBroadcastManager.getInstance(HRConfigActivity.this).sendBroadcast(intent);
loadWidgetConfigs();
} catch (JSONException e) {
@@ -47,12 +47,14 @@ import java.util.concurrent.atomic.AtomicLong;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.AbstractGBActivity;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
import nodomain.freeyourgadget.gadgetbridge.service.devices.qhybrid.QHybridSupport;
import nodomain.freeyourgadget.gadgetbridge.util.GB;
public class QHybridAppChooserActivity extends AbstractGBActivity {
private static final AtomicLong THREAD_COUNTER = new AtomicLong(0L);
private GBDevice device;
boolean hasControl = false;
private PackageConfigHelper helper;
@@ -62,6 +64,13 @@ public class QHybridAppChooserActivity extends AbstractGBActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_qhybrid_app_chooser);
device = getIntent().getParcelableExtra(GBDevice.EXTRA_DEVICE);
if (device == null || !device.isInitialized()) {
GB.toast(this, getString(R.string.watch_not_connected), Toast.LENGTH_LONG, GB.ERROR);
finish();
return;
}
helper = new PackageConfigHelper(getApplicationContext());
final ListView appList = findViewById(R.id.qhybrid_appChooserList);
@@ -111,6 +120,7 @@ public class QHybridAppChooserActivity extends AbstractGBActivity {
private void setControl(boolean control) {
if (hasControl == control) return;
Intent intent = new Intent(control ? QHybridSupport.QHYBRID_COMMAND_CONTROL : QHybridSupport.QHYBRID_COMMAND_UNCONTROL);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
this.hasControl = control;
}
@@ -125,6 +135,7 @@ public class QHybridAppChooserActivity extends AbstractGBActivity {
private void sendControl(NotificationConfiguration config, String request){
Intent intent = new Intent(request);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
intent.putExtra("CONFIG", config);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
@@ -140,7 +151,9 @@ public class QHybridAppChooserActivity extends AbstractGBActivity {
if(success){
try {
helper.saveNotificationConfiguration(config);
LocalBroadcastManager.getInstance(QHybridAppChooserActivity.this).sendBroadcast(new Intent(QHybridSupport.QHYBRID_COMMAND_NOTIFICATION_CONFIG_CHANGED));
final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_NOTIFICATION_CONFIG_CHANGED);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
LocalBroadcastManager.getInstance(QHybridAppChooserActivity.this).sendBroadcast(intent);
} catch (Exception e) {
GB.toast("error saving configuration", Toast.LENGTH_SHORT, GB.ERROR, e);
}
@@ -85,7 +85,7 @@ public class QHybridConfigActivity extends AbstractGBActivity {
SharedPreferences prefs;
GBDevice device;
private GBDevice device;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -142,7 +142,9 @@ public class QHybridConfigActivity extends AbstractGBActivity {
if (success) {
try {
helper.saveNotificationConfiguration(config);
LocalBroadcastManager.getInstance(QHybridConfigActivity.this).sendBroadcast(new Intent(QHybridSupport.QHYBRID_COMMAND_NOTIFICATION_CONFIG_CHANGED));
final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_NOTIFICATION_CONFIG_CHANGED);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
LocalBroadcastManager.getInstance(QHybridConfigActivity.this).sendBroadcast(intent);
} catch (Exception e) {
GB.toast("error saving notification", Toast.LENGTH_SHORT, GB.ERROR, e);
}
@@ -158,7 +160,9 @@ public class QHybridConfigActivity extends AbstractGBActivity {
case 1: {
try {
helper.deleteNotificationConfiguration((NotificationConfiguration) adapterView.getItemAtPosition(i));
LocalBroadcastManager.getInstance(QHybridConfigActivity.this).sendBroadcast(new Intent(QHybridSupport.QHYBRID_COMMAND_NOTIFICATION_CONFIG_CHANGED));
final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_NOTIFICATION_CONFIG_CHANGED);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
LocalBroadcastManager.getInstance(QHybridConfigActivity.this).sendBroadcast(intent);
} catch (Exception e) {
GB.toast("error deleting setting", Toast.LENGTH_SHORT, GB.ERROR, e);
}
@@ -178,6 +182,7 @@ public class QHybridConfigActivity extends AbstractGBActivity {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent notificationIntent = new Intent(QHybridSupport.QHYBRID_COMMAND_NOTIFICATION);
notificationIntent.putExtra(GBDevice.EXTRA_DEVICE, device);
notificationIntent.putExtra("CONFIG", (NotificationConfiguration) adapterView.getItemAtPosition(i));
LocalBroadcastManager.getInstance(QHybridConfigActivity.this).sendBroadcast(notificationIntent);
}
@@ -253,6 +258,7 @@ public class QHybridConfigActivity extends AbstractGBActivity {
device.addDeviceInfo(new GenericItem(FossilWatchAdapter.ITEM_BUTTONS, buttonConfig.toString()));
updateSettings();
Intent buttonIntent = new Intent(QHybridSupport.QHYBRID_COMMAND_OVERWRITE_BUTTONS);
buttonIntent.putExtra(GBDevice.EXTRA_DEVICE, device);
buttonIntent.putExtra(FossilWatchAdapter.ITEM_BUTTONS, buttonConfig.toString());
LocalBroadcastManager.getInstance(QHybridConfigActivity.this).sendBroadcast(buttonIntent);
} catch (JSONException e) {
@@ -278,6 +284,7 @@ public class QHybridConfigActivity extends AbstractGBActivity {
private void setControl(boolean control, NotificationConfiguration config) {
if (hasControl == control) return;
Intent intent = new Intent(control ? QHybridSupport.QHYBRID_COMMAND_CONTROL : QHybridSupport.QHYBRID_COMMAND_UNCONTROL);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
intent.putExtra("CONFIG", config);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
this.hasControl = control;
@@ -293,6 +300,7 @@ public class QHybridConfigActivity extends AbstractGBActivity {
private void sendControl(NotificationConfiguration config, String request) {
Intent intent = new Intent(request);
intent.putExtra(GBDevice.EXTRA_DEVICE, device);
intent.putExtra("CONFIG", config);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
@@ -373,11 +381,10 @@ public class QHybridConfigActivity extends AbstractGBActivity {
Button addButton = new Button(QHybridConfigActivity.this);
addButton.setText("+");
addButton.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
addButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivityForResult(new Intent(QHybridConfigActivity.this, QHybridAppChooserActivity.class), REQUEST_CODE_ADD_APP);
}
addButton.setOnClickListener(view1 -> {
final Intent appChooserIntent = new Intent(QHybridConfigActivity.this, QHybridAppChooserActivity.class);
appChooserIntent.putExtra(GBDevice.EXTRA_DEVICE, device);
startActivityForResult(appChooserIntent, REQUEST_CODE_ADD_APP);
});
return addButton;
}
@@ -38,9 +38,9 @@ public class QHybridSettingsCustomizer implements DeviceSpecificSettingsCustomiz
public void customizeSettings(final DeviceSpecificSettingsHandler handler, final Prefs prefs, final String rootKey) {
handler.addPreferenceHandlerFor("use_activity_hand_as_notification_counter");
final Preference pref = handler.findPreference("pref_key_qhybrid_legacy");
if (pref != null) {
pref.setOnPreferenceClickListener(preference -> {
final Preference legacyPref = handler.findPreference("pref_key_qhybrid_legacy");
if (legacyPref != null) {
legacyPref.setOnPreferenceClickListener(preference -> {
final Intent intent = new Intent(handler.getContext(), QHybridConfigActivity.class);
intent.putExtra(GBDevice.EXTRA_DEVICE, handler.getDevice());
handler.getContext().startActivity(intent);
@@ -48,6 +48,26 @@ public class QHybridSettingsCustomizer implements DeviceSpecificSettingsCustomiz
});
}
final Preference calibrationPref = handler.findPreference("pref_key_qhybrid_calibration");
if (calibrationPref != null) {
calibrationPref.setOnPreferenceClickListener(preference -> {
final Intent intent = new Intent(handler.getContext(), CalibrationActivity.class);
intent.putExtra(GBDevice.EXTRA_DEVICE, handler.getDevice());
handler.getContext().startActivity(intent);
return true;
});
}
final Preference commutePref = handler.findPreference("pref_key_qhybrid_commute_actions");
if (commutePref != null) {
commutePref.setOnPreferenceClickListener(preference -> {
final Intent intent = new Intent(handler.getContext(), CommuteActionsActivity.class);
intent.putExtra(GBDevice.EXTRA_DEVICE, handler.getDevice());
handler.getContext().startActivity(intent);
return true;
});
}
timeOffsetPref = handler.findPreference("time_offset");
if (timeOffsetPref != null) {
timeOffsetPref.setOnPreferenceClickListener(preference -> {
@@ -80,7 +100,9 @@ public class QHybridSettingsCustomizer implements DeviceSpecificSettingsCustomiz
int value = hourPicker.getValue() * 60 + minPicker.getValue();
prefs.getPreferences().edit().putInt("QHYBRID_TIME_OFFSET", value).apply();
updateTimeOffsetSummary(value);
LocalBroadcastManager.getInstance(handler.getContext()).sendBroadcast(new Intent(QHybridSupport.QHYBRID_COMMAND_UPDATE));
final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_UPDATE);
intent.putExtra(GBDevice.EXTRA_DEVICE, handler.getDevice());
LocalBroadcastManager.getInstance(handler.getContext()).sendBroadcast(intent);
GB.toast(handler.getContext().getString(R.string.qhybrid_changes_delay_prompt), Toast.LENGTH_SHORT, GB.INFO);
})
.setNegativeButton(handler.getContext().getString(R.string.fossil_hr_new_action_cancel), null)
@@ -122,7 +144,9 @@ public class QHybridSettingsCustomizer implements DeviceSpecificSettingsCustomiz
int value = hourPicker.getValue() * 60 + minPicker.getValue();
prefs.getPreferences().edit().putInt("QHYBRID_TIMEZONE_OFFSET", value).apply();
updateTimezoneOffsetSummary(value);
LocalBroadcastManager.getInstance(handler.getContext()).sendBroadcast(new Intent(QHybridSupport.QHYBRID_COMMAND_UPDATE_TIMEZONE));
final Intent intent = new Intent(QHybridSupport.QHYBRID_COMMAND_UPDATE_TIMEZONE);
intent.putExtra(GBDevice.EXTRA_DEVICE, handler.getDevice());
LocalBroadcastManager.getInstance(handler.getContext()).sendBroadcast(intent);
GB.toast(handler.getContext().getString(R.string.qhybrid_changes_delay_prompt), Toast.LENGTH_SHORT, GB.INFO);
})
.setNegativeButton(handler.getContext().getString(R.string.fossil_hr_new_action_cancel), null)
@@ -43,7 +43,6 @@ import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Objects;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -62,7 +61,6 @@ import nodomain.freeyourgadget.gadgetbridge.model.CalendarEventSpec;
import nodomain.freeyourgadget.gadgetbridge.model.CallSpec;
import nodomain.freeyourgadget.gadgetbridge.model.CannedMessagesSpec;
import nodomain.freeyourgadget.gadgetbridge.model.GenericItem;
import nodomain.freeyourgadget.gadgetbridge.model.ItemWithDetails;
import nodomain.freeyourgadget.gadgetbridge.model.MusicSpec;
import nodomain.freeyourgadget.gadgetbridge.model.MusicStateSpec;
import nodomain.freeyourgadget.gadgetbridge.model.NavigationInfoSpec;
@@ -179,6 +177,16 @@ public class QHybridSupport extends QHybridBaseSupport {
return;
}
final GBDevice intentDevice = intent.getParcelableExtra(GBDevice.EXTRA_DEVICE);
if (intentDevice == null) {
logger.warn("Received command Intent without device extra. Command will not be sent to any device.");
return;
}
if (!intentDevice.getAddress().equals(gbDevice.getAddress())) {
// Abort, the command is targeted at another device
return;
}
switch (intent.getAction()) {
case QHYBRID_COMMAND_CONTROL: {
log("sending control request");
@@ -3,11 +3,9 @@
<Preference
android:title="@string/qhybrid_title_calibration"
android:key="pref_key_qhybrid_calibration"
android:icon="@drawable/ic_sensor_calibration"
android:summary="@string/qhybrid_summary_calibration">
<intent
android:targetPackage="@string/applicationId"
android:targetClass="nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.CalibrationActivity" />
</Preference>
</androidx.preference.PreferenceScreen>
@@ -57,11 +57,9 @@
<Preference
android:title="@string/qhybrid_pref_title_actions"
android:key="pref_key_qhybrid_commute_actions"
android:icon="@drawable/ic_pending_actions"
android:summary="@string/qhybrid_pref_summary_actions">
<intent
android:targetPackage="@string/applicationId"
android:targetClass="nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.CommuteActionsActivity" />
</Preference>
</androidx.preference.PreferenceScreen>