/* Copyright (C) 2023-2024 Frank Ertl
This file is part of Gadgetbridge.
Gadgetbridge is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Gadgetbridge is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see . */
package nodomain.freeyourgadget.gadgetbridge.service.devices.withingssteelhr.communication.message.incoming;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.widget.Toast;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec;
import nodomain.freeyourgadget.gadgetbridge.service.devices.withingssteelhr.IconHelper;
import nodomain.freeyourgadget.gadgetbridge.service.devices.withingssteelhr.WithingsSteelHRDeviceSupport;
import nodomain.freeyourgadget.gadgetbridge.service.devices.withingssteelhr.communication.datastructures.ImageData;
import nodomain.freeyourgadget.gadgetbridge.service.devices.withingssteelhr.communication.datastructures.ImageMetaData;
import nodomain.freeyourgadget.gadgetbridge.service.devices.withingssteelhr.communication.datastructures.SourceAppId;
import nodomain.freeyourgadget.gadgetbridge.service.devices.withingssteelhr.communication.message.Message;
import nodomain.freeyourgadget.gadgetbridge.service.devices.withingssteelhr.communication.message.WithingsMessage;
import nodomain.freeyourgadget.gadgetbridge.service.devices.withingssteelhr.communication.message.WithingsMessageType;
import nodomain.freeyourgadget.gadgetbridge.service.devices.withingssteelhr.communication.notification.NotificationProvider;
import nodomain.freeyourgadget.gadgetbridge.util.GB;
public class NotificationRequestHandler implements IncomingMessageHandler {
private static final Logger logger = LoggerFactory.getLogger(NotificationRequestHandler.class);
private final WithingsSteelHRDeviceSupport support;
private Map appIconCache = new HashMap<>();
public NotificationRequestHandler(WithingsSteelHRDeviceSupport support) {
this.support = support;
}
@Override
public void handleMessage(Message message) {
try {
SourceAppId appId = message.getStructureByType(SourceAppId.class);
ImageMetaData imageMetaData = message.getStructureByType(ImageMetaData.class);
Message reply = new WithingsMessage(WithingsMessageType.GET_NOTIFICATION);
reply.addDataStructure(appId);
reply.addDataStructure(imageMetaData);
ImageData imageData = new ImageData();
imageData.setImageData(getImageData(appId.getAppId()));
reply.addDataStructure(imageData);
logger.info("Sending reply to notification request: " + reply);
support.sendToDevice(reply);
} catch (Exception e) {
logger.error("Failed to respond to notification request.", e);
GB.toast("Failed to respond to notification request:" + e.getMessage(), Toast.LENGTH_LONG, GB.WARN);
}
}
private byte[] getImageData(String sourceAppId) {
byte[] imageData = appIconCache.get(sourceAppId);
if (imageData == null) {
NotificationSpec notificationSpec = NotificationProvider.getInstance(support).getNotificationSpecForSourceAppId(sourceAppId);
if (notificationSpec != null) {
int iconId = notificationSpec.iconId;
try {
Drawable icon = null;
if (notificationSpec.iconId != 0) {
Context sourcePackageContext = support.getContext().createPackageContext(sourceAppId, 0);
icon = sourcePackageContext.getResources().getDrawable(notificationSpec.iconId);
}
if (icon == null) {
PackageManager pm = support.getContext().getPackageManager();
icon = pm.getApplicationIcon(sourceAppId);
}
imageData = IconHelper.getIconBytesFromDrawable(icon);
appIconCache.put(sourceAppId, imageData);
} catch (PackageManager.NameNotFoundException e) {
logger.error("Error while updating notification icons", e);
imageData = new byte[0];
}
} else {
imageData = new byte[0];
}
}
return imageData;
}
}