FitPro: Add camera

This commit is contained in:
José Rebelo
2026-06-13 17:31:22 +01:00
parent 5e9e0c05e2
commit 0a0dd83220
4 changed files with 47 additions and 23 deletions
@@ -17,11 +17,15 @@
package nodomain.freeyourgadget.gadgetbridge.devices;
import android.content.Context;
import android.content.Intent;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.CameraActivity;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventCameraRemote;
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
public interface DeviceCardAction {
@@ -41,4 +45,28 @@ public interface DeviceCardAction {
}
void onClick(@NonNull final GBDevice device, @NonNull final Context context);
class CameraAction implements DeviceCardAction {
@Override
public int getIcon(@NonNull GBDevice device) {
return R.drawable.ic_camera_remote;
}
@NonNull
@Override
public String getDescription(@NonNull GBDevice device, @NonNull Context context) {
return context.getString(R.string.open_camera);
}
@Override
public void onClick(@NonNull GBDevice device, @NonNull Context context) {
final Intent cameraIntent = new Intent(context, CameraActivity.class);
cameraIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
cameraIntent.putExtra(
CameraActivity.intentExtraEvent,
GBDeviceEventCameraRemote.eventToInt(GBDeviceEventCameraRemote.Event.OPEN_CAMERA)
);
context.startActivity(cameraIntent);
}
}
}
@@ -26,15 +26,19 @@ import androidx.annotation.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import de.greenrobot.dao.AbstractDao;
import de.greenrobot.dao.Property;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.CameraActivity;
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractBLEDeviceCoordinator;
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCardAction;
import nodomain.freeyourgadget.gadgetbridge.devices.SampleProvider;
import nodomain.freeyourgadget.gadgetbridge.entities.DaoSession;
import nodomain.freeyourgadget.gadgetbridge.entities.FitProActivitySampleDao;
@@ -175,4 +179,13 @@ public class FitProDeviceCoordinator extends AbstractBLEDeviceCoordinator {
public DeviceKind getDeviceKind(@NonNull GBDevice device) {
return DeviceKind.FITNESS_BAND;
}
@Override
public List<DeviceCardAction> getCustomActions() {
if (!CameraActivity.supportsCamera()) {
return Collections.emptyList();
}
return Collections.singletonList(new DeviceCardAction.CameraAction());
}
}
@@ -16,8 +16,6 @@
along with this program. If not, see <https://www.gnu.org/licenses/>. */
package nodomain.freeyourgadget.gadgetbridge.devices.gloryfit
import android.content.Context
import android.content.Intent
import de.greenrobot.dao.AbstractDao
import de.greenrobot.dao.Property
import nodomain.freeyourgadget.gadgetbridge.R
@@ -26,7 +24,6 @@ import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSpec
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSpecificSettingsCustomizer
import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSpecificSettingsScreen
import nodomain.freeyourgadget.gadgetbridge.capabilities.HeartRateCapability.MeasurementInterval
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventCameraRemote
import nodomain.freeyourgadget.gadgetbridge.devices.AbstractBLEDeviceCoordinator
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCardAction
import nodomain.freeyourgadget.gadgetbridge.devices.DeviceCoordinator
@@ -251,25 +248,7 @@ abstract class GloryFitCoordinator : AbstractBLEDeviceCoordinator() {
}
return listOf(
object : DeviceCardAction {
override fun getIcon(device: GBDevice): Int {
return R.drawable.ic_camera_remote
}
override fun getDescription(device: GBDevice, context: Context): String {
return context.getString(R.string.open_camera)
}
override fun onClick(device: GBDevice, context: Context) {
val cameraIntent = Intent(context, CameraActivity::class.java)
cameraIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
cameraIntent.putExtra(
CameraActivity.intentExtraEvent,
GBDeviceEventCameraRemote.eventToInt(GBDeviceEventCameraRemote.Event.OPEN_CAMERA)
)
context.startActivity(cameraIntent)
}
}
DeviceCardAction.CameraAction()
)
}
}
@@ -122,6 +122,7 @@ import nodomain.freeyourgadget.gadgetbridge.activities.devicesettings.DeviceSett
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
import nodomain.freeyourgadget.gadgetbridge.database.DBHelper;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventBatteryInfo;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventCameraRemote;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventFindPhone;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventMusicControl;
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventVersionInfo;
@@ -789,7 +790,10 @@ public class FitProDeviceSupport extends AbstractBTLESingleDeviceSupport {
*/
public void handleCamera(byte command) {
GB.toast(getContext(), "Camera buttons are detected but not further handled.", Toast.LENGTH_SHORT, GB.INFO);
LOG.debug("Got camera button: {}", String.format("0x%02x", command));
final GBDeviceEventCameraRemote cameraEvent = new GBDeviceEventCameraRemote();
cameraEvent.event = GBDeviceEventCameraRemote.Event.TAKE_PICTURE;
evaluateGBDeviceEvent(cameraEvent);
}
public void handleFindPhone() {