From 52b9f14255ff104987b9bf4629e04cf5e1cb3895 Mon Sep 17 00:00:00 2001 From: google-automerger Date: Tue, 18 Nov 2014 09:12:08 -0800 Subject: [PATCH] Initial Commit --- Application/build.gradle | 71 +++++++ Application/src/main/AndroidManifest.xml | 52 +++++ .../messagingservice/Conversations.java | 126 +++++++++++ .../messagingservice/MainActivity.java | 34 +++ .../messagingservice/MessageLogger.java | 57 +++++ .../messagingservice/MessageReadReceiver.java | 42 ++++ .../MessageReplyReceiver.java | 58 +++++ .../messagingservice/MessagingFragment.java | 170 +++++++++++++++ .../messagingservice/MessagingService.java | 174 +++++++++++++++ .../res/drawable-hdpi/android_contact.png | Bin 0 -> 1575 bytes .../main/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 3964 bytes .../res/drawable-hdpi/notification_icon.png | Bin 0 -> 937 bytes .../res/drawable-mdpi/android_contact.png | Bin 0 -> 959 bytes .../main/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 2327 bytes .../res/drawable-mdpi/notification_icon.png | Bin 0 -> 609 bytes .../res/drawable-xhdpi/android_contact.png | Bin 0 -> 2451 bytes .../main/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 5488 bytes .../res/drawable-xhdpi/notification_icon.png | Bin 0 -> 1233 bytes .../res/drawable-xxhdpi/android_contact.png | Bin 0 -> 3267 bytes .../main/res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 9578 bytes .../res/drawable-xxhdpi/notification_icon.png | Bin 0 -> 1973 bytes .../res/layout-land/fragment_message_me.xml | 66 ++++++ .../src/main/res/layout/activity_main.xml | 22 ++ .../main/res/layout/fragment_message_me.xml | 57 +++++ .../src/main/res/values-v21/styles.xml | 22 ++ Application/src/main/res/values/colors.xml | 20 ++ Application/src/main/res/values/dimens.xml | 21 ++ Application/src/main/res/values/strings.xml | 26 +++ Application/src/main/res/values/styles.xml | 20 ++ .../src/main/res/xml/automotive_app_desc.xml | 19 ++ CONTRIB.md | 35 +++ LICENSE | 201 ++++++++++++++++++ README.md | 88 ++++++++ build.gradle | 11 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49896 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 ++++++++++++++ gradlew.bat | 90 ++++++++ packaging.yaml | 15 ++ settings.gradle | 1 + 40 files changed, 1668 insertions(+) create mode 100644 Application/build.gradle create mode 100644 Application/src/main/AndroidManifest.xml create mode 100644 Application/src/main/java/com/example/android/messagingservice/Conversations.java create mode 100644 Application/src/main/java/com/example/android/messagingservice/MainActivity.java create mode 100644 Application/src/main/java/com/example/android/messagingservice/MessageLogger.java create mode 100644 Application/src/main/java/com/example/android/messagingservice/MessageReadReceiver.java create mode 100644 Application/src/main/java/com/example/android/messagingservice/MessageReplyReceiver.java create mode 100644 Application/src/main/java/com/example/android/messagingservice/MessagingFragment.java create mode 100644 Application/src/main/java/com/example/android/messagingservice/MessagingService.java create mode 100644 Application/src/main/res/drawable-hdpi/android_contact.png create mode 100644 Application/src/main/res/drawable-hdpi/ic_launcher.png create mode 100644 Application/src/main/res/drawable-hdpi/notification_icon.png create mode 100644 Application/src/main/res/drawable-mdpi/android_contact.png create mode 100644 Application/src/main/res/drawable-mdpi/ic_launcher.png create mode 100644 Application/src/main/res/drawable-mdpi/notification_icon.png create mode 100644 Application/src/main/res/drawable-xhdpi/android_contact.png create mode 100644 Application/src/main/res/drawable-xhdpi/ic_launcher.png create mode 100644 Application/src/main/res/drawable-xhdpi/notification_icon.png create mode 100644 Application/src/main/res/drawable-xxhdpi/android_contact.png create mode 100644 Application/src/main/res/drawable-xxhdpi/ic_launcher.png create mode 100644 Application/src/main/res/drawable-xxhdpi/notification_icon.png create mode 100644 Application/src/main/res/layout-land/fragment_message_me.xml create mode 100644 Application/src/main/res/layout/activity_main.xml create mode 100644 Application/src/main/res/layout/fragment_message_me.xml create mode 100644 Application/src/main/res/values-v21/styles.xml create mode 100644 Application/src/main/res/values/colors.xml create mode 100644 Application/src/main/res/values/dimens.xml create mode 100644 Application/src/main/res/values/strings.xml create mode 100644 Application/src/main/res/values/styles.xml create mode 100644 Application/src/main/res/xml/automotive_app_desc.xml create mode 100644 CONTRIB.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 packaging.yaml create mode 100644 settings.gradle diff --git a/Application/build.gradle b/Application/build.gradle new file mode 100644 index 0000000..e57466f --- /dev/null +++ b/Application/build.gradle @@ -0,0 +1,71 @@ +buildscript { + repositories { + mavenCentral() + } + + dependencies { + classpath 'com.android.tools.build:gradle:0.12.+' + } +} + +apply plugin: 'com.android.application' + + +dependencies { + + compile "com.android.support:support-v4:21.+" + compile "com.android.support:support-v13:21.+" + compile "com.android.support:cardview-v7:21.+" + +} + +// The sample build uses multiple directories to +// keep boilerplate and common code separate from +// the main sample code. +List dirs = [ + 'main', // main sample code; look here for the interesting stuff. + 'common', // components that are reused by multiple samples + 'template'] // boilerplate code that is generated by the sample template process + +android { + compileSdkVersion 21 + buildToolsVersion "21.0.0" + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 21 + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_7 + targetCompatibility JavaVersion.VERSION_1_7 + } + + sourceSets { + main { + dirs.each { dir -> + java.srcDirs "src/${dir}/java" + res.srcDirs "src/${dir}/res" + } + } + androidTest.setRoot('tests') + androidTest.java.srcDirs = ['tests/src'] + + } + +} + + + + + + + + + + + + + + + diff --git a/Application/src/main/AndroidManifest.xml b/Application/src/main/AndroidManifest.xml new file mode 100644 index 0000000..f8a5850 --- /dev/null +++ b/Application/src/main/AndroidManifest.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Application/src/main/java/com/example/android/messagingservice/Conversations.java b/Application/src/main/java/com/example/android/messagingservice/Conversations.java new file mode 100644 index 0000000..7425df4 --- /dev/null +++ b/Application/src/main/java/com/example/android/messagingservice/Conversations.java @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.messagingservice; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +/** + * A simple class that denotes unread conversations and messages. In a real world application, + * this would be replaced by a content provider that actually gets the unread messages to be + * shown to the user. + */ +public class Conversations { + + /** + * Set of strings used as messages by the sample. + */ + private static final String[] MESSAGES = new String[]{ + "Are you at home?", + "Can you give me a call?", + "Hey yt?", + "Don't forget to get some milk on your way back home", + "Is that project done?", + "Did you finish the Messaging app yet?" + }; + + /** + * Senders of the said messages. + */ + private static final String[] PARTICIPANTS = new String[]{ + "John Smith", + "Robert Lawrence", + "James Smith", + "Jane Doe" + }; + + static class Conversation { + + private final int conversationId; + + private final String participantName; + + /** + * A given conversation can have a single or multiple messages. + * Note that the messages are sorted from *newest* to *oldest* + */ + private final List messages; + + private final long timestamp; + + public Conversation(int conversationId, String participantName, + List messages) { + this.conversationId = conversationId; + this.participantName = participantName; + this.messages = messages == null ? Collections.emptyList() : messages; + this.timestamp = System.currentTimeMillis(); + } + + public int getConversationId() { + return conversationId; + } + + public String getParticipantName() { + return participantName; + } + + public List getMessages() { + return messages; + } + + public long getTimestamp() { + return timestamp; + } + + public String toString() { + return "[Conversation: conversationId=" + conversationId + + ", participantName=" + participantName + + ", messages=" + messages + + ", timestamp=" + timestamp + "]"; + } + } + + private Conversations() { + } + + public static Conversation[] getUnreadConversations(int howManyConversations, + int messagesPerConversation) { + Conversation[] conversations = new Conversation[howManyConversations]; + for (int i = 0; i < howManyConversations; i++) { + conversations[i] = new Conversation( + ThreadLocalRandom.current().nextInt(), + name(), makeMessages(messagesPerConversation)); + } + return conversations; + } + + private static List makeMessages(int messagesPerConversation) { + int maxLen = MESSAGES.length; + List messages = new ArrayList<>(messagesPerConversation); + for (int i = 0; i < messagesPerConversation; i++) { + messages.add(MESSAGES[ThreadLocalRandom.current().nextInt(0, maxLen)]); + } + return messages; + } + + private static String name() { + return PARTICIPANTS[ThreadLocalRandom.current().nextInt(0, PARTICIPANTS.length)]; + } +} diff --git a/Application/src/main/java/com/example/android/messagingservice/MainActivity.java b/Application/src/main/java/com/example/android/messagingservice/MainActivity.java new file mode 100644 index 0000000..e558a64 --- /dev/null +++ b/Application/src/main/java/com/example/android/messagingservice/MainActivity.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.messagingservice; + +import android.app.Activity; +import android.os.Bundle; + +public class MainActivity extends Activity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + if (savedInstanceState == null) { + getFragmentManager().beginTransaction() + .add(R.id.container, new MessagingFragment()) + .commit(); + } + } +} diff --git a/Application/src/main/java/com/example/android/messagingservice/MessageLogger.java b/Application/src/main/java/com/example/android/messagingservice/MessageLogger.java new file mode 100644 index 0000000..d1007b5 --- /dev/null +++ b/Application/src/main/java/com/example/android/messagingservice/MessageLogger.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.messagingservice; + +import android.content.Context; +import android.content.SharedPreferences; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * A simple logger that uses shared preferences to log messages, their reads + * and replies. Don't use this in a real world application. This logger is only + * used for displaying the messages in the text view. + */ +public class MessageLogger { + + private static final String PREF_MESSAGE = "MESSAGE_LOGGER"; + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + public static final String LOG_KEY = "message_data"; + public static final String LINE_BREAKS = "\n\n"; + + public static void logMessage(Context context, String message) { + SharedPreferences prefs = getPrefs(context); + message = DATE_FORMAT.format(new Date(System.currentTimeMillis())) + ": " + message; + prefs.edit() + .putString(LOG_KEY, prefs.getString(LOG_KEY, "") + LINE_BREAKS + message) + .apply(); + } + + public static SharedPreferences getPrefs(Context context) { + return context.getSharedPreferences(PREF_MESSAGE, Context.MODE_PRIVATE); + } + + public static String getAllMessages(Context context) { + return getPrefs(context).getString(LOG_KEY, ""); + } + + public static void clear(Context context) { + getPrefs(context).edit().remove(LOG_KEY).apply(); + } +} diff --git a/Application/src/main/java/com/example/android/messagingservice/MessageReadReceiver.java b/Application/src/main/java/com/example/android/messagingservice/MessageReadReceiver.java new file mode 100644 index 0000000..f28a3a7 --- /dev/null +++ b/Application/src/main/java/com/example/android/messagingservice/MessageReadReceiver.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.messagingservice; + +import android.app.NotificationManager; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.support.v4.app.NotificationManagerCompat; +import android.util.Log; + +public class MessageReadReceiver extends BroadcastReceiver { + private static final String TAG = MessageReadReceiver.class.getSimpleName(); + + private static final String CONVERSATION_ID = "conversation_id"; + + @Override + public void onReceive(Context context, Intent intent) { + Log.d(TAG, "onReceive"); + int conversationId = intent.getIntExtra(CONVERSATION_ID, -1); + if (conversationId != -1) { + Log.d(TAG, "Conversation " + conversationId + " was read"); + MessageLogger.logMessage(context, "Conversation " + conversationId + " was read."); + NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context); + notificationManager.cancel(conversationId); + } + } +} diff --git a/Application/src/main/java/com/example/android/messagingservice/MessageReplyReceiver.java b/Application/src/main/java/com/example/android/messagingservice/MessageReplyReceiver.java new file mode 100644 index 0000000..0a3eba6 --- /dev/null +++ b/Application/src/main/java/com/example/android/messagingservice/MessageReplyReceiver.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.messagingservice; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.v4.app.RemoteInput; +import android.util.Log; + +/** + * A receiver that gets called when a reply is sent to a given conversationId + */ +public class MessageReplyReceiver extends BroadcastReceiver { + + private static final String TAG = MessageReplyReceiver.class.getSimpleName(); + + @Override + public void onReceive(Context context, Intent intent) { + if (MessagingService.REPLY_ACTION.equals(intent.getAction())) { + int conversationId = intent.getIntExtra(MessagingService.CONVERSATION_ID, -1); + CharSequence reply = getMessageText(intent); + if (conversationId != -1) { + Log.d(TAG, "Got reply (" + reply + ") for ConversationId " + conversationId); + MessageLogger.logMessage(context, "ConversationId: " + conversationId + + " received a reply: [" + reply + "]"); + } + } + } + + /** + * Get the message text from the intent. + * Note that you should call {@code RemoteInput#getResultsFromIntent(intent)} to process + * the RemoteInput. + */ + private CharSequence getMessageText(Intent intent) { + Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); + if (remoteInput != null) { + return remoteInput.getCharSequence(MessagingService.EXTRA_VOICE_REPLY); + } + return null; + } +} diff --git a/Application/src/main/java/com/example/android/messagingservice/MessagingFragment.java b/Application/src/main/java/com/example/android/messagingservice/MessagingFragment.java new file mode 100644 index 0000000..f8efcc0 --- /dev/null +++ b/Application/src/main/java/com/example/android/messagingservice/MessagingFragment.java @@ -0,0 +1,170 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.messagingservice; + +import android.app.Fragment; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.content.SharedPreferences; +import android.os.Bundle; +import android.os.IBinder; +import android.os.Message; +import android.os.Messenger; +import android.os.RemoteException; +import android.text.method.ScrollingMovementMethod; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.TextView; + +/** + * The main fragment that shows the buttons and the text view containing the log. + */ +public class MessagingFragment extends Fragment implements View.OnClickListener { + + private static final String TAG = MessagingFragment.class.getSimpleName(); + + private Button mSendSingleConversation; + private Button mSendTwoConversations; + private Button mSendConversationWithThreeMessages; + private TextView mDataPortView; + private Button mClearLogButton; + + private Messenger mService; + private boolean mBound; + + private ServiceConnection mConnection = new ServiceConnection() { + @Override + public void onServiceConnected(ComponentName componentName, IBinder service) { + mService = new Messenger(service); + mBound = true; + setButtonsState(true); + } + + @Override + public void onServiceDisconnected(ComponentName componentName) { + mService = null; + mBound = false; + setButtonsState(false); + } + }; + + private SharedPreferences.OnSharedPreferenceChangeListener listener = + new SharedPreferences.OnSharedPreferenceChangeListener() { + @Override + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + if (MessageLogger.LOG_KEY.equals(key)) { + mDataPortView.setText(MessageLogger.getAllMessages(getActivity())); + } + } + }; + + public MessagingFragment() { + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_message_me, container, false); + + mSendSingleConversation = (Button) rootView.findViewById(R.id.send_1_conversation); + mSendSingleConversation.setOnClickListener(this); + + mSendTwoConversations = (Button) rootView.findViewById(R.id.send_2_conversations); + mSendTwoConversations.setOnClickListener(this); + + mSendConversationWithThreeMessages = + (Button) rootView.findViewById(R.id.send_1_conversation_3_messages); + mSendConversationWithThreeMessages.setOnClickListener(this); + + mDataPortView = (TextView) rootView.findViewById(R.id.data_port); + mDataPortView.setMovementMethod(new ScrollingMovementMethod()); + + mClearLogButton = (Button) rootView.findViewById(R.id.clear); + mClearLogButton.setOnClickListener(this); + + setButtonsState(false); + + return rootView; + } + + @Override + public void onClick(View view) { + if (view == mSendSingleConversation) { + sendMsg(1, 1); + } else if (view == mSendTwoConversations) { + sendMsg(2, 1); + } else if (view == mSendConversationWithThreeMessages) { + sendMsg(1, 3); + } else if (view == mClearLogButton) { + MessageLogger.clear(getActivity()); + mDataPortView.setText(MessageLogger.getAllMessages(getActivity())); + } + } + + @Override + public void onStart() { + super.onStart(); + getActivity().bindService(new Intent(getActivity(), MessagingService.class), mConnection, + Context.BIND_AUTO_CREATE); + } + + @Override + public void onPause() { + super.onPause(); + MessageLogger.getPrefs(getActivity()).unregisterOnSharedPreferenceChangeListener(listener); + } + + @Override + public void onResume() { + super.onResume(); + mDataPortView.setText(MessageLogger.getAllMessages(getActivity())); + MessageLogger.getPrefs(getActivity()).registerOnSharedPreferenceChangeListener(listener); + } + + @Override + public void onStop() { + super.onStop(); + if (mBound) { + getActivity().unbindService(mConnection); + mBound = false; + } + } + + private void sendMsg(int howManyConversations, int messagesPerConversation) { + if (mBound) { + Message msg = Message.obtain(null, MessagingService.MSG_SEND_NOTIFICATION, + howManyConversations, messagesPerConversation); + try { + mService.send(msg); + } catch (RemoteException e) { + Log.e(TAG, "Error sending a message", e); + MessageLogger.logMessage(getActivity(), "Error occurred while sending a message."); + } + } + } + + private void setButtonsState(boolean enable) { + mSendSingleConversation.setEnabled(enable); + mSendTwoConversations.setEnabled(enable); + mSendConversationWithThreeMessages.setEnabled(enable); + } +} diff --git a/Application/src/main/java/com/example/android/messagingservice/MessagingService.java b/Application/src/main/java/com/example/android/messagingservice/MessagingService.java new file mode 100644 index 0000000..f590061 --- /dev/null +++ b/Application/src/main/java/com/example/android/messagingservice/MessagingService.java @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.android.messagingservice; + +import android.app.PendingIntent; +import android.app.Service; +import android.content.Intent; +import android.graphics.BitmapFactory; +import android.os.Handler; +import android.os.IBinder; +import android.os.Message; +import android.os.Messenger; +import android.support.v4.app.NotificationCompat.CarExtender; +import android.support.v4.app.NotificationCompat.CarExtender.UnreadConversation; +import android.support.v4.app.NotificationCompat; +import android.support.v4.app.NotificationManagerCompat; +import android.support.v4.app.RemoteInput; +import android.util.Log; + +import java.util.Iterator; + +public class MessagingService extends Service { + private static final String TAG = MessagingService.class.getSimpleName(); + + public static final String READ_ACTION = + "com.example.android.messagingservice.ACTION_MESSAGE_READ"; + public static final String REPLY_ACTION = + "com.example.android.messagingservice.ACTION_MESSAGE_REPLY"; + public static final String CONVERSATION_ID = "conversation_id"; + public static final String EXTRA_VOICE_REPLY = "extra_voice_reply"; + public static final int MSG_SEND_NOTIFICATION = 1; + public static final String EOL = "\n"; + + private NotificationManagerCompat mNotificationManager; + + private final Messenger mMessenger = new Messenger(new IncomingHandler()); + + /** + * Handler of incoming messages from clients. + */ + class IncomingHandler extends Handler { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MSG_SEND_NOTIFICATION: + int howManyConversations = msg.arg1 <= 0 ? 1 : msg.arg1; + int messagesPerConv = msg.arg2 <= 0 ? 1 : msg.arg2; + sendNotification(howManyConversations, messagesPerConv); + break; + default: + super.handleMessage(msg); + } + } + } + + @Override + public void onCreate() { + Log.d(TAG, "onCreate"); + mNotificationManager = NotificationManagerCompat.from(getApplicationContext()); + } + + @Override + public IBinder onBind(Intent intent) { + Log.d(TAG, "onBind"); + return mMessenger.getBinder(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Log.d(TAG, "onStartCommand"); + return START_STICKY; + } + + @Override + public void onDestroy() { + super.onDestroy(); + Log.d(TAG, "onDestroy"); + } + + // Creates an intent that will be triggered when a message is marked as read. + private Intent getMessageReadIntent(int id) { + return new Intent() + .addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES) + .setAction(READ_ACTION) + .putExtra(CONVERSATION_ID, id); + } + + // Creates an Intent that will be triggered when a voice reply is received. + private Intent getMessageReplyIntent(int conversationId) { + return new Intent() + .addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES) + .setAction(REPLY_ACTION) + .putExtra(CONVERSATION_ID, conversationId); + } + + private void sendNotification(int howManyConversations, int messagesPerConversation) { + Conversations.Conversation[] conversations = Conversations.getUnreadConversations( + howManyConversations, messagesPerConversation); + for (Conversations.Conversation conv : conversations) { + sendNotificationForConversation(conv); + } + } + + private void sendNotificationForConversation(Conversations.Conversation conversation) { + // A pending Intent for reads + PendingIntent readPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), + conversation.getConversationId(), + getMessageReadIntent(conversation.getConversationId()), + PendingIntent.FLAG_UPDATE_CURRENT); + + // Build a RemoteInput for receiving voice input in a Car Notification + RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY) + .setLabel(getApplicationContext().getString(R.string.notification_reply)) + .build(); + + // Building a Pending Intent for the reply action to trigger + PendingIntent replyIntent = PendingIntent.getBroadcast(getApplicationContext(), + conversation.getConversationId(), + getMessageReplyIntent(conversation.getConversationId()), + PendingIntent.FLAG_UPDATE_CURRENT); + + // Create the UnreadConversation and populate it with the participant name, + // read and reply intents. + UnreadConversation.Builder unreadConvBuilder = + new UnreadConversation.Builder(conversation.getParticipantName()) + .setLatestTimestamp(conversation.getTimestamp()) + .setReadPendingIntent(readPendingIntent) + .setReplyAction(replyIntent, remoteInput); + + // Note: Add messages from oldest to newest to the UnreadConversation.Builder + StringBuilder messageForNotification = new StringBuilder(); + for (Iterator messages = conversation.getMessages().iterator(); + messages.hasNext(); ) { + String message = messages.next(); + unreadConvBuilder.addMessage(message); + messageForNotification.append(message); + if (messages.hasNext()) { + messageForNotification.append(EOL); + } + } + + NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext()) + .setSmallIcon(R.drawable.notification_icon) + .setLargeIcon(BitmapFactory.decodeResource( + getApplicationContext().getResources(), R.drawable.android_contact)) + .setContentText(messageForNotification.toString()) + .setWhen(conversation.getTimestamp()) + .setContentTitle(conversation.getParticipantName()) + .setContentIntent(readPendingIntent) + .extend(new CarExtender() + .setUnreadConversation(unreadConvBuilder.build()) + .setColor(getApplicationContext() + .getResources().getColor(R.color.default_color_light))); + + MessageLogger.logMessage(getApplicationContext(), "Sending notification " + + conversation.getConversationId() + " conversation: " + conversation); + + mNotificationManager.notify(conversation.getConversationId(), builder.build()); + } +} diff --git a/Application/src/main/res/drawable-hdpi/android_contact.png b/Application/src/main/res/drawable-hdpi/android_contact.png new file mode 100644 index 0000000000000000000000000000000000000000..00d0ec43a4ffb85c1082b517a1d7f4793e3b90a2 GIT binary patch literal 1575 zcmZ`(dpOg382@6J_w#%{&-;1b|6X25&}Nf)OXdLpO#J=G zkd`sO0XNY0aNU_~Ey0-Hf!+XIJ7+u_rLWaGY-lqH)O8?-w8A#V4+;bz%>jVS69CL; zw5;`0v|ENF0l*gnV4YO3>!Gi9)*yPzW-`$HuJSuIg<8jGzh49!0AtJF&;i0y1OWO- zf3kO2T>nKxc=Bfqyy|1hNQR`;>1?9^OzS4ID6f8u)Sb16oYbaLG4%kgNT1HK)mT0k z-k2Idf}5ky#wgqK=UPo>5WA$4o^ficRmOx*ab^sb*T%a~Jo^-A(lqf2#=0ZmYp{M+ z*~HAln)wl=Vu3E!xs&o^fId*teF*J-r1E&6u&h^h>R5K67$^=SGWN>Hz8HrS)=fz~_S+zcbbQNT{u&eVg!3Snh^BP{o< zSGm7EQ)Rtv+Ix#V09fA~ED7$tMz6_|l*xyf1BBph>>|vX`@V@?jK3#ybL#6@7p~V3 zgPiSJ)ZaM>d*ovs(Lyis`DuYqIo~xS&o@%3H4IFjvdSV{? zBwcOpdk5Ll*Hv(PdyPg$ZS{Q6RJVse#=U=xGjdh^IQ$j!U?J}_SKyFJ7m+5)@yvCG&P!2l9ydL*<>^xwvSlMKE&&SD_}~0L5Wz^ zN<7GbK8CRL$;hz1=i$M%p(|Eqo7-|R9@yC5PFc^?ANt-ZO>1D}~50)1Tzfj#3oK zQOWDoKxu3P!qK*d*^^sc7N2JDA{|p|Q?KnGpGu8Kbv6$+ig&IuxqA6qWuXC;xd+?! ztD@wF*eZTB_!QxEeuO;#Fw-+raS}7^V{O8-PAQwP41RjS=^-i;QA>k$Rz8})@+kF| z2_WXDa^fUIzcR^G%8C%EAA<$j&oTv7Dd{`3Od zs*^OtIk!|g1|;ZW#B(OPtTPl>u|Qredycop7~$D7e}t2FOEZeejfvDu%xH0;Sb zXKA5}h@W=OyG3Yn3vc7Lmu`5)!pYsP(9ZF%$sUUDZdVkH)+b{Xh^?r`sWJD4nMsBg zN3w>4bO)X6M={bKitmu_c*w6ZM(Qa=jt_rbYu{h(fSe31)i$8oVPXO_;Y^!IliV` zqqu~N&~PXVT|AcFm5e;K&{MUuW=vU&GYsMyT9s7<&W2Zh{<(p_I>A$NrFdC>Xq-vo z)@RL;%JQ#2JWOA##_I`(LbBrgFJAhk=61vg8@*rm;jq1=?UpER)I79of(uerPhgCt zusp|`ngi_Rh;lvQt0QE(S$f6u6%zwwF0Ml9Bk*!Aq4&UC(228d>XycaH+rsC@d@oi zw*=-{q|@es->oV#hAt4xg)BrmWz`+b$LSn|wgW8DeEhzAX~H)x-y z!$BX~!QD{@WAQP`v04Id7_2)Qn00vEIyA-ukHI+E@^JqNBqr^S-;?_P T0qQYqjy3@NeS*k!q)5)c0s_M` literal 0 HcmV?d00001 diff --git a/Application/src/main/res/drawable-hdpi/ic_launcher.png b/Application/src/main/res/drawable-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..06d85f166d15de96926e40375daae9747f7d3c69 GIT binary patch literal 3964 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 MUHx3vIVCg!0NYQPA^-pY literal 0 HcmV?d00001 diff --git a/Application/src/main/res/drawable-mdpi/ic_launcher.png b/Application/src/main/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4e1cc86b4e4521999ada6e85fe48645871e3138a GIT binary patch literal 2327 zcmV+y3F!8TP)DVXK5@^OE0PRcbe|bz2ERY3=q9~^{Ujsz(AtRD|K~sxjH&J&Y0JrY_5vqqT1TpOvwC7+5D=is!Dx*{Z3Nd zvL4W{sHk|-4v#V+jg5_UF)=ZYQ>RYNQ#MzX@uNqN4)FH&&JYTPTFU0X#v_qPOfj#L z=E@q-uDrawxPANfNT{g*Ed5I#fs)6BqWR&H*Q=C zg9e2nHEDn#KR|dXx+JU=RmJsy=JMpUZVyeBIF|?*h6`(svD4nz1{^+o zILpn=ZD8llojLmi6rwCFEGUww8jZvcA3luf+O_K>R@j3F4;n9Cym)Eav}rEL%p6^6 z8xR>8`CEq$9fpq|Kc3RK+yi($8a8a0Rc2;pwJKil^z@W~J``zdYn#Zg?IG;n4N1Mh!q@I0xn52L}i5Shj506mWNr{KUjWZ!a&e<1HAV z5I(@YAT%`e(E9c3SKt!IxVX5C)TjZtpqHGSoW|kw?UycHdZu5$e%h>p`}gl3Ha9n) z*#eBjB_$xpeBaIXOA04h{|jG-|-DTeoi7 z+S(2wp&K@A*ak2B020R0ar*S>DPzWriQ!Q$1Pp(4c6JV9$0+mS@`eFEt7#0y(v`k_ z`}WhQ0pL6ZxTFpcS_holty;C}5MTr5i+MOgi^9HJaFJZ>YO=q>{uARdGn?eA+RSR zO;gP(ec&-uV7yQ)7R!~a6n(C>krI6W%}eN9T% zty>qoXwjk|)X*F~X=!OQkf@?D(AYdE#Kl~Kiy6vJE-Nb&goT9#Z``;s1Y=eB7{F71 zK^KSQ(OR`LF*+8{KqaW~c!iI4|Ni|gkTtV$X*o@R;^N}?E?v4%CY8cS`}yOWgo6fLK-sM3e-$-kF6FC_&lm z*|RO9qN2)4@$TKbE#}Xke;d(9Pu2i}&yF2C&V!y%R<3CFm;^bY1iE;;BWfGa(9lrt z?(S{|Z2!}|2|ZloKo}4TcXMEbh!cRsx1Wr?e*OAddwcu!>?At$y?gi0hbJR3)|A1A z4jpQOL{=gai8y)Yy&y!VwR-hx>n&ThP^6$oY-D6)3YK~u?6M=fIp8?CIbn$azYFN) zII(k%9XnR+{I z{Q*W5_`N4Gwh5^54UEfikNWz0VxGrWu3R}C3!9o$vT zzTFG)oJvP&QFEW%Njs%1grfUy;aKWWm5RyUlF`A zcJboH2_MS<+Lr`wkANq9L6PMS8W+D7&=KQDxeACH1n_3mnl)>vA4+*e`m~Axy5R7x zIJG2n>3Aat3!mKF+}cf>Ho3*e$LC;7wzt|U2GH#_Mlq5ONc2(UdZ`fvAF$cHS+i!1 zz;7>P;7C(i#Q;*Q4=S(=_rssB(2?~3+L07}!ofW0V$1QR)-*t8(xgcPmoHzQiiFi7 zjIy$_szJvGgLeOc4c9U7YBdiKjEqo}ocH(l@2dz#1fTu;_g_O{^9|+`^OTakR=vbh z<@#W#A&5qS2%GG^ZTb$9CfK=iX9()*V0a>~SpV4g{Vfq_mej0is9{TD$m#$%q8d1}@JC|Zi~-b=!VVI(C1 zQa_uC*$wD{@GZtE2OAn13Z!yq^N>yWUkE-Gfkld1kWCQ6`UI9+ks^|VcXO2;J9gxM z$+vLf!Y3eMyd7u~U}9o25#jFy{#5jSSWJ}^UU=L@wv~esC`CCAz!qWjDb_1$0*fHu z6BHzl_Y&bp)D(5_GVyoLTS`)Bjt{*j=6i!rF`KYU?pI_0t)oJuJ3e%ir4*IslR{cA zOC2~6!VgrV(t5soL{W+i?}T`hTCeQw xKCPqmoc?RGF!CNjuu0Bm^?xN;cYYGz{{t`VIeg7&ckciI002ovPDHLkV1iZ%aiIVJ literal 0 HcmV?d00001 diff --git a/Application/src/main/res/drawable-mdpi/notification_icon.png b/Application/src/main/res/drawable-mdpi/notification_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d6069ebc9380ae973afe26530168fa06b540004d GIT binary patch literal 609 zcmV-n0-pVeP)t4qvBYVogUZ0+@-lDB<3i5SSp>qxo6$Oa;CGY{f3HEG1PSvMu)ryu+<){1Tso&8dh3 z!4f`$C5kmtXa-=r7K(p##6J`3*7!8o4q}U}8%#S`fm8>n9>TJcoR1EZ@to_fB~=S{ z6|5W=b*2JakV1M!xr>D;kdA%VLXr!D{R?)3d&wJ(XdhCsgS`8;$hji|U0Uc9xDSep z;2n<8u!PSb3b8p1f=z7;6ZB`;+OJ?SEY+{a?jD?dmHiG`|>%00000NkvXXu0mjf9}*3= literal 0 HcmV?d00001 diff --git a/Application/src/main/res/drawable-xhdpi/android_contact.png b/Application/src/main/res/drawable-xhdpi/android_contact.png new file mode 100644 index 0000000000000000000000000000000000000000..bdba57b6bc15f8e4b9d76c46fb60da7e39c2636e GIT binary patch literal 2451 zcmV;E32gR>P)Px#AY({UO#lFTB>(_`g8%^e{{R4h=>PzAFaQARU;qF* zm;eA5Z<1fdMgRZ+24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_000Px zNklm(uI?2lcsqUjb4RZ|}UW9!k9T84T2`Sa)Z`~A$! z?D2S*pJ%_-U-lfH;}M@@YsTl4oNSD`hI$k~K|$l7I8hwuzvIO5IktFwHqMX6@!xD7 zwk|U=>VwLgnHBahn@kDliZJ0&v8cS7gZ;fyE-HowXYfU&XiLk7nAoshz;o*DdV{j2ytAwa=I39meoCD5+x{v{x#9IkKMW@cuswG=@L zEodZF$?$s3Vp$m^DxLlId1|dzYqe4eB}=&Gwr#eq>uwZff?0hafjD` zzn_&-tnYj4x^7oID|b=?3*VVq?ueH`rtW-UZvSfPHJ8^xtD)^Yb?`<5% zRB1FgUi0h2Fj(LBwk(T%zu!}sF@!`}SrUzZD}&5kcE}W)=h?chlS*IZ5**{6ABMrY zuCveQbLvqTauqtz=p|lIj4<<9OfJvo(`v0LQvQZA#-*-9zw$w?)*t9--mp(jfzHcgX6ROX22go2Q{>f!yowPt5k3jcmT8-`)e z2aJufxR2KgD-()>Mnm;|f4Zlv{Wm<~DrvI%?y_XYQ};`ReN-?D4QFe2I>@_+3N?j* zLrYuhsWdXZSduSH&`b%h$8mwHTB|&+5W~WW%^hiXt@U(0)6LIICWML`UrdDvTMXyU z#^CPylim5THXHd)xp^of1B|E!cGib4g z)bC8lzujX{C}i@fJi^YIvx-_IUQ;9|699i_IfD_H%)m?`wppUu>_Z4-4C;5Y=UUfD}hxnj`y!8fO_+>*806$i6;j1xq*#T36v zV9a}LuB#lw)@!Y$T`9XJ%U}kjE6$%Cj0D{^SQhU%mg&H%Q)Ql4U77Q3?7Y;%Y+O`? z8Hb_Z&NXk*GlMc2P9cE8Fk`gVcG7|9$h^%Gn}RrNVvuq>Ct>TW{sGZKc>se;Txi?2 z1MBi}zIE+yeXi;|^I~?-WoWJKyTpE-ZJ8^&9sd@Luk7##*L9^z4a0C~OYbr|G^Dy0 zJwFV?Vcfc|)Oc4%K}#t%74Ns!Y}>Xot189DaXbhc=VC3iy2fPiW16Oe%rX0;@$mfA zLm;bDbsQC4mgTgl?-TZYFGEVL!S1t!Hw?pRGv@R89F#&NC{*o4=!yWba_H~va9nH6 zrfJ$Cs^(HOHm;A=$Bnyf+wKStM{m)y#*2nPv_?icSo^swi*4I>NP7O)lazXc6X#VZ zh~=&Cdz+@||31DH+qP}@K0}*gkB9D7L5&d*mayLM_u*|&e14iH8^`gaoML8ZWH;V8 zj{7_j5%2f=l=bhH#hnRe-Ijt9($ClHMHe;uw=zuAw3jUOJg(<+Zrf&k-`hOT`}TW$ z?)7?|h)<@lGW=mn><&RePT;Zkdc6+WIWF9Foz3%X>$=*yu6x#2sPGpap6u`)perBW zNHImT*qCmM*YDk_Z@!uvRm zb!wl_$JTY-%NFwjJ7)=TS(g2KA?0em)=je!o_0J$xO8 z#)xZg+qQR{-|u%Ayjp1#o3(6{sg15iv z@eeG0UF)splJWwDS~K#Y=UKcd)_B#9qOj<(3}MXpXe1U2@%=%(?#C$!`d_c#8MKvA7%~(RvR)+4 zo#mXXs^dFK%pr$QWOjZWHZGWTnYWoy(90Mis`+9{C_^(tqEjO?MTSc^MdLSj%;HQr z6pl4B@wX~v%A0q`sC)j_3Q=?TZ*$J4;|I_r> zp3YbuZ%zQ)0000bbVXQnWMOn=I%9HWVRU5xGB7bSEif`IF*Q^%G&(RhIy5&eFgQ9e zFef01GynhqC3HntbYx+4WjbwdWNBu305UK!Gc7POEipAzF*G_bH##&oEigDbFfdkq RF^B*F002ovPDHLkV1my!o6`UQ literal 0 HcmV?d00001 diff --git a/Application/src/main/res/drawable-xhdpi/ic_launcher.png b/Application/src/main/res/drawable-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..92f1e2ddd7387daa50162f895f33fd279696138a GIT binary patch literal 5488 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

Id}(c-OP!-lmaDI1Rz zB$)}#9Gd||Jy1iw&av4R#Q$sg8(-SeL>&b=gSW(66j!oxI%bQ+TW(LKI1kc+LCTk3 zQ%uomOJB@qY&J}E9-v8x7H?7UnoOObk?HYP?-`WniZ`@t^PRzQ(---Fj!e=d`f(nW zC=C!zO^`Izd;IaoXSq4v>dc%(R|vQ+<3;r$`F451kICkns14x6-x6G_Ye7nkb6S633{9^j3?7DI~0 zXb}u)8Izi<^QJ3Szo>^cHvG7W{k@G6JOgkrZZ9$TO?{Q2R1p;AUqF^J)n0u!^X|9k z!x4PPV;`cS-hv@twO>&WVm>iIf8J4{H@3K;9%6cgWdQ2cU14ZPnk;~r4-g#cO_B)7 zTz!>cIONrSDpNUp4LD|lT7gRcd3oy~SWT(UZsmpC7BxXaR*==a9`#&$)r;dI=+w4~ z^%`*h{{1VV{r{QIyP+OpH2`NBx}!T9uEQj5$w7s~$m)N^gY{*eM&BiAon}NcBVn!H zOkpJV@alP#C;%pEC}E^L;AWx^=W&i|BAi!-y~lG)G6C`S2O~tWXx6j(b&$iC>cM0W zNXwzZuAF^)$v#NpdOm36!k|HeVj!C8ksDs(okm`#N18SNl#d}KKRQUF z{%G=jexI;9qDD1Har5#9;h<@Q8mMkHs)^Tqt6yR6^hYF}?)duSEC3lnZL1${GT)en z(6}9fP;F~o^gB26q47KYG5SVr#|UazgEwu=>AYhEHLStk?CSHL4D~~|$zo7@PTRLK z`A+*9zjxa=Gas(LQ{H>vZX5IdtUo3`wiOxkcd`8(%(mm|U#xw)l?gVPh@`*qF#|~k m2=Wq1GC-06f;E0000@)!w1?+b0{1Y z6&v3$GHPi3BaRy7A0lNBC{dHii!1r$4jSs7?(Xn25tE@SGW+H0v)>SPqiXCB@`;P!i9?||tF?~O*R zE1*3S|6}T-+BzJ~jRN`1BVZ%AnI2dP=u{{Hf8gv%oZa#u4uueW2PQA+%6j-Ir~vT| zML?|waV`NPncVB?qu>I*M8I@UauY@dzGh;gr;maQxB_wa%suHDNE$})o#}qVx_GWD zxB&5vM1ao|q*;szc$2{$p1}*2h=3{tOvxjNCMW_FyhQl6LOk6ZIRmu0dKSDQ)8_j$B$#B*!M{Z7{V1kLJ(Ua z7;lj5V&2+bO;FaV_0x@<5$|0$NB&>qeVW!$hSF>4TU3UgAV(pCS z#*0(NTuo9Ls35rNpoae?NV&^31x!_lfOi=G#F&$>UaY%~?{R#tPD;QuNH)niL~H1* zH?jj@MuZ5^-hR=TTfv%zf#0e0X%3^s-a_*rS{o1zpx2q;wwnw*0q(EN2?RgI_n$HM zmyia=O2D5D{OTY}b0i^P5k$)aA_ejz_KZPP2`=kNgMjzJ=^5{~Q(*fy4uVrA(i}+$ zSPt2u46?<1{?H(*12;GWC$YN1&l=eIU{_~gK>LmOX-({ z1i1hKt6I8%rwQ;U%zbfD<=GPfx`{(u+zdqhOR4HHs}>4*lGHK&yfb%{wfZq2XA8=b vAt9jL|58RdZ;A7*|I`;dE3FwQb_VVNs<(GfQ+lig00000NkvXXu0mjf&m%n) literal 0 HcmV?d00001 diff --git a/Application/src/main/res/drawable-xxhdpi/android_contact.png b/Application/src/main/res/drawable-xxhdpi/android_contact.png new file mode 100644 index 0000000000000000000000000000000000000000..b36ec1730911c44934d55061a5f9b28a7cf5e528 GIT binary patch literal 3267 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 B4%h$y literal 0 HcmV?d00001 diff --git a/Application/src/main/res/drawable-xxhdpi/ic_launcher.png b/Application/src/main/res/drawable-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2476cbdddc9b707b25555898fd5c9137bfe87509 GIT binary patch literal 9578 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 literal 0 HcmV?d00001 diff --git a/Application/src/main/res/drawable-xxhdpi/notification_icon.png b/Application/src/main/res/drawable-xxhdpi/notification_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..005207cc0c2339f8a6405320a7b8d10e1e1d0511 GIT binary patch literal 1973 zcmV;m2TJ&fP)nq`}&5us&8RAxpSwo(~orI|*Hh9Z%s(PkMf zrVt?(Ef^J*EmUNCYCGAl&v%&jdfUu7Z|2Q=%#U~BGCFh5x!?1hbMM@H&V9d*ZtW7w zKu4ROcm~=886MIms7+A1Nu=#TNj<2uvvVh8lM=Y0qod>BbnmV{Y4C22#18dIm9<_E z=FUp_ngr0x}B%%C2$aM$vugxN8KAnwA2sV)z1T8{v zbRywy-I`9&dVuZ=NxvinT$dQ+?2f>v)a~jL{J(M22~yW*LC|9f0oNr4LFXYbr!JxL z#w{V}aR@py1!%V@1U*aR5pIF%hAkmzV>rxyN&(yyg`7QTw3eFmgQ7lKLXbKhhZoH^ ztxVAXf-XjURtgm@CFm&#IyEKuSaAq?i3TU6?4xBK^c%o?LDKgr4X7y&IX!vsF?Fky z`ddbja8H1sxhV~ZB4`p1rZ+%$O9@&EK_@l9h$(BE}NpNj1~K|RBPEmML7 zb|kgG0c14<4RnBwZ2~!(ls}M18oD$DwTQgY(PyRvO#^`TTemyj=m1F4&`4Y$XfVRB zIuu+=o4u);%&n3sL9^-oZmK@H){6E92$IJoE)X;W;mZsKTES}>pka84qq9s2nupQj z0scHdh8bYq<@uqtV!sX}H23HQd=h#_oXBGO7)|>}Xf)oTJ5z#!xKABHD-raL19Vjr z`WVX17ag)==wlJ>7t+=flggB!U@HNbT>g230e-AAp-4uWAD+lf4##j%(N)(+`}MfF1ja#cwXijU^7al1g!#4u%g8X ztvME3Xn1}kGH*KC6`P=2D{)UMX&Aa+2=RDV+nExy20+0Y2qQGSG|V*I;>vBvSPQ)} zd2~O_jleTv%9lLTiv8~pkLJ1oju(+BL2Ch2T(n`xg8;g~0HuZAA;`J1ujo`dN5t=D z=)DJ>R}|VHr(l}3pj7ir30eoJ;=BMTjd_iIs~nA-hJabn>CKuBMCa-fg0%NjP~R$< z5~L*IE(LE0w*p!;YM~ZarXk~5#yzq7?o)*dAGMUc`w zK>^&YT&5Vn99%oL_AONna0O(B#pN8y{5d?Wi)<>cjI&_|?)Pog!D#O%D4;l)38| zsKyxBo6AR3Yod?pTccdkqA7VAn0%4@qAX))iYmre9RCat0S*?igGOYWC=lVb> z_g49G6y{L4!&5RR=zKuVsf7eX^@*+;0u^l+B0skD9&(JhUl7flpeX>I8Ub`$?(2Y) z6~`Hij$lYY&^27FB!E`p{g9DywLHk9qiF<91!&~f0)y`Zi4{B#;>aOEZ*V=r@H(qc zPwuQ~1kJ#>%cBf}AbqN94uuk#;K-ha8ucw|+#z-)1rMjsw`2NLre(50a?=Q!3E0R~ zOt{0>-b`~#T+zhZmwK(yP9cq>=(Fl%d_j&rH78EY1wrAkQ3TP-iM>XfJ*nD9#g&PW zqhT9a@<@;teu@)q>3pkE&Gd5tt$n`hQUrxwq@0#=TWQJ?$QflR$ejm;1SwXnn01;G zBn2%6c_m0ecg1L|WuG z-m}aiCwvk4`pg%M;>~)KiN}xN@nCl@Hf>*9eyK(KiJVo0S9p7`Ms&h|JXn>-H#XP#f()Ey|WTd;~dWeMt z>Bx*HH!rWzK?fapaF?z?kfMbOS6Ih~S3=HUH#1?w+!GXf(Un|_`Sb`9BIDh0q;(a7 ztRKWFMy;(y-M@Ryl%VkK*7K(+{=$f=)Qe|WV2Dm{LO zmHt0XQ4f%=-ZtqUFX`&M6zyvhWW4G&L2ZK4%?51`GWh!s^)&K!uR|jr00000NkvXX Hu0mjfh?bI> literal 0 HcmV?d00001 diff --git a/Application/src/main/res/layout-land/fragment_message_me.xml b/Application/src/main/res/layout-land/fragment_message_me.xml new file mode 100644 index 0000000..6f4f88b --- /dev/null +++ b/Application/src/main/res/layout-land/fragment_message_me.xml @@ -0,0 +1,66 @@ + + + +