/* Copyright (C) 2015-2020 0nse, Andreas Shimokawa, Carsten Pfeiffer, Daniele Gobbetti, Normano64, Zhong Jianxin 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.externalevents; import android.app.NotificationManager; import android.app.NotificationManager.Policy; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.os.PowerManager; import android.telephony.SmsMessage; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.Map; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.model.NotificationSpec; import nodomain.freeyourgadget.gadgetbridge.model.NotificationType; import nodomain.freeyourgadget.gadgetbridge.util.Prefs; public class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Prefs prefs = GBApplication.getPrefs(); if ("never".equals(prefs.getString("notification_mode_sms", "when_screen_off"))) { return; } if ("when_screen_off".equals(prefs.getString("notification_mode_sms", "when_screen_off"))) { PowerManager powermanager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); if (powermanager != null && powermanager.isScreenOn()) { return; } } NotificationSpec notificationSpec = new NotificationSpec(); notificationSpec.type = NotificationType.GENERIC_SMS; Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] pdus = (Object[]) bundle.get("pdus"); if (pdus != null) { int pduSize = pdus.length; Map messageMap = new LinkedHashMap<>(); SmsMessage[] messages = new SmsMessage[pduSize]; for (int i = 0; i < pduSize; i++) { messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); String originatingAddress = messages[i].getOriginatingAddress(); if (!messageMap.containsKey(originatingAddress)) { messageMap.put(originatingAddress, new StringBuilder()); } messageMap.get(originatingAddress).append(messages[i].getMessageBody()); } for (Map.Entry entry : messageMap.entrySet()) { String originatingAddress = entry.getKey(); if (originatingAddress != null) { notificationSpec.body = entry.getValue().toString(); notificationSpec.phoneNumber = originatingAddress; notificationSpec.attachedActions = new ArrayList<>(); // REPLY action NotificationSpec.Action replyAction = new NotificationSpec.Action(); replyAction.title = "Reply"; replyAction.type = NotificationSpec.Action.TYPE_SYNTECTIC_REPLY_PHONENR; notificationSpec.attachedActions.add(replyAction); // DISMISS ALL action NotificationSpec.Action dismissAllAction = new NotificationSpec.Action(); dismissAllAction.title = "Dismiss All"; dismissAllAction.type = NotificationSpec.Action.TYPE_SYNTECTIC_DISMISS_ALL; notificationSpec.attachedActions.add(dismissAllAction); int dndSuppressed = 0; switch (GBApplication.getGrantedInterruptionFilter()) { case NotificationManager.INTERRUPTION_FILTER_ALL: break; case NotificationManager.INTERRUPTION_FILTER_ALARMS: case NotificationManager.INTERRUPTION_FILTER_NONE: dndSuppressed = 1; break; case NotificationManager.INTERRUPTION_FILTER_PRIORITY: if (GBApplication.isPriorityNumber(Policy.PRIORITY_CATEGORY_MESSAGES, notificationSpec.phoneNumber)) { break; } dndSuppressed = 1; } if (prefs.getBoolean("notification_filter", false) && dndSuppressed == 1) { return; } notificationSpec.dndSuppressed = dndSuppressed; GBApplication.deviceService().onNotification(notificationSpec); } } } } } }