1df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev/* 2df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev * Copyright (C) 2016 The Android Open Source Project 3df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev * 4df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev * Licensed under the Apache License, Version 2.0 (the "License"); 5df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev * you may not use this file except in compliance with the License. 6df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev * You may obtain a copy of the License at 7df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev * 8df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev * http://www.apache.org/licenses/LICENSE-2.0 9df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev * 10df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev * Unless required by applicable law or agreed to in writing, software 11df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev * distributed under the License is distributed on an "AS IS" BASIS, 12df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev * See the License for the specific language governing permissions and 14df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev * limitations under the License. 15df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev */ 16df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev 17df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsevpackage com.android.car.cluster.sample; 18df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev 19df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsevimport android.app.Notification; 20df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsevimport android.graphics.Bitmap; 21df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsevimport android.service.notification.StatusBarNotification; 22df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsevimport android.support.v4.app.NotificationCompat.CarExtender; 23df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsevimport android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation; 24df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsevimport android.text.TextUtils; 25df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsevimport android.util.Log; 26df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev 27df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev/** 28df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev * Convert a {@link CarExtender} notification into a {@link MessageContactDetails} 29df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev */ 30df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsevpublic class MessagingConverter { 31df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev private static final String TAG = DebugUtil.getTag(MessagingConverter.class); 32df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev 33df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev public static boolean canConvert(StatusBarNotification sbn) { 34df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev Notification notification = sbn.getNotification(); 35df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev if (notification == null) { 36df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev if (DebugUtil.DEBUG) { 37df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev Log.d(TAG, "Notification is empty."); 38df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev } 39df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev return false; 40df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev } 41df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev CarExtender ce = new CarExtender(sbn.getNotification()); 42df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev if (ce.getUnreadConversation() == null) { 43df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev if (DebugUtil.DEBUG) { 44df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev Log.d(TAG, "Notification with no messaging component."); 45df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev } 46df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev return false; 47df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev } 48df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev 49df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev CarExtender.UnreadConversation uc = ce.getUnreadConversation(); 50df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev String[] messages = uc.getMessages(); 51df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev if (messages == null || messages.length == 0) { 52df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev Log.w(TAG, "Car message notification with no messages."); 53df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev return false; 54df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev } 55df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev 56df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev if (TextUtils.isEmpty(uc.getParticipant())) { 57df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev Log.w(TAG, "Car message notification with no participant."); 58df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev return false; 59df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev } 60df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev 61df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev if (uc.getReplyPendingIntent() == null) { 62df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev Log.w(TAG, "Car message notification with no reply intent."); 63df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev return false; 64df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev } 65df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev 66df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev for (String m : messages) { 67df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev if (m == null) { 68df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev Log.w(TAG, "Car message with null text."); 69df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev return false; 70df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev } 71df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev } 72df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev return true; 73df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev } 74df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev 75df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev public static MessageContactDetails convert(StatusBarNotification sbn) { 76df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev CarExtender ce = new CarExtender(sbn.getNotification()); 77df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev UnreadConversation uc = ce.getUnreadConversation(); 78df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev 79df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev Bitmap largeIcon = ce.getLargeIcon(); 80df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev if (largeIcon == null) { 81df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev largeIcon = sbn.getNotification().largeIcon; 82df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev } 83df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev String name = uc.getParticipant(); 84df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev 85df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev return new MessageContactDetails(largeIcon, name); 86df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev } 87df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev 88df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev public static class MessageContactDetails { 89df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev private final Bitmap mContactImage; 90df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev private final String mContactName; 91df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev 92df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev private MessageContactDetails(Bitmap contactImage, String contactName) { 93df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev mContactImage = contactImage; 94df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev mContactName = contactName; 95df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev } 96df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev 97df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev public Bitmap getContactImage() { 98df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev return mContactImage; 99df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev } 100df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev 101df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev public String getContactName() { 102df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev return mContactName; 103df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev } 104df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev } 105df4db1d3efb85be01f0973067c9e104b5f93f205Pavel Maltsev} 106