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