From 82f8215bc18ee2ab8f301a56dc75eb955d338702 Mon Sep 17 00:00:00 2001 From: Peter Li Date: Fri, 13 Aug 2021 13:57:04 -0700 Subject: Enable Direct Send support in config Bug: 188396041 Test: Manual Change-Id: Ia3afbbf6cfa652e5a153cb3453fc4e78bf5bafd6 --- Android.bp | 2 +- res/values/config.xml | 2 +- .../car/messenger/core/interfaces/DataModel.java | 22 +----------------- .../messenger/core/service/MessengerService.java | 5 ++-- .../android/car/messenger/core/util/VoiceUtil.java | 16 ------------- .../impl/datamodels/TelephonyDataModel.java | 27 ++-------------------- 6 files changed, 8 insertions(+), 66 deletions(-) diff --git a/Android.bp b/Android.bp index d671cef..750a871 100644 --- a/Android.bp +++ b/Android.bp @@ -48,7 +48,7 @@ android_app { "androidx.preference_preference", "androidx.recyclerview_recyclerview", "car-assist-lib", - "car-messaging-models", + "car-messenger-common", "car-telephony-common", "car-ui-lib", "androidx.annotation_annotation", diff --git a/res/values/config.xml b/res/values/config.xml index 644c7ff..db2d231 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -16,7 +16,7 @@ --> false - false + true false + + + + diff --git a/res/drawable/ic_play.xml b/res/drawable/ic_play.xml index 5e47e70..3c1e820 100644 --- a/res/drawable/ic_play.xml +++ b/res/drawable/ic_play.xml @@ -1,6 +1,6 @@ - + android:width="21dp" + android:height="26dp" + android:viewportWidth="21" + android:viewportHeight="26"> + diff --git a/res/drawable/ic_unmute.xml b/res/drawable/ic_unmute.xml new file mode 100644 index 0000000..af90346 --- /dev/null +++ b/res/drawable/ic_unmute.xml @@ -0,0 +1,28 @@ + + + + + + diff --git a/res/drawable/ui_icon_edit.xml b/res/drawable/ui_icon_edit.xml new file mode 100644 index 0000000..aee80ca --- /dev/null +++ b/res/drawable/ui_icon_edit.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/res/layout/conversation_list_item.xml b/res/layout/conversation_list_item.xml index 248184f..1240337 100644 --- a/res/layout/conversation_list_item.xml +++ b/res/layout/conversation_list_item.xml @@ -28,7 +28,7 @@ limitations under the License. android:layout_marginEnd="@dimen/unread_icon_marginEnd" android:contentDescription="@string/cd_unread" android:scaleType="centerCrop" - android:src="@color/unread_dot_color" + android:src="@color/unread_color" app:layout_constraintBottom_toBottomOf="@id/icon" app:layout_constraintEnd_toStartOf="@id/icon" app:layout_constraintTop_toTopOf="@id/icon" /> @@ -45,18 +45,6 @@ limitations under the License. app:layout_constraintTop_toTopOf="parent" tools:src="@color/car_red_500a" /> - - + + + app:layout_constraintBottom_toBottomOf="parent" /> + + + app:layout_constraintEnd_toStartOf="@id/preview_dot" + tools:visibility="gone" + android:ellipsize="end" + android:maxLength="20" + tools:text="Let this be the preview. Lots of preview with + a whole lot of various texts, one that is quite long in every way. + To verify that it still fits in the end" /> + app:layout_constraintEnd_toStartOf="@id/text_metadata" + app:layout_constraintBottom_toBottomOf="@id/preview" + app:layout_constraintStart_toEndOf="@id/preview" + app:layout_constraintTop_toTopOf="@id/preview" + tools:visibility="gone" /> + + + + + tools:text="6 min" /> + + diff --git a/res/values/colors.xml b/res/values/colors.xml index 17d5cb2..1d8527e 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -34,7 +34,7 @@ #38FFFFFF @color/icon_tint #cccccc - #66B5FF + #66B5FF #ffffff diff --git a/res/values/config.xml b/res/values/config.xml index db2d231..849ef92 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -17,6 +17,7 @@ false true + true false - + - New message - + New message + %d messages + + + No message + 1 message + + %d messages + + + + + One more message + + %d more messages + + Car Messenger @@ -32,7 +47,7 @@ Connect to Bluetooth - No new messages + No messages Replied @@ -67,4 +82,106 @@ Loading Info Icon Reply Action Button + + + Play Action Button + + + now + + + + %dm + %dm + + + + + %dh + %dh + + + + + %dd + %dd + + + + + %dy + %dy + + + + + in %dm + in %dm + + + + + in %dh + in %dh + + + + + in %dd + in %dd + + + + + in %dy + in %dy + + + + + %d minute ago + %d minutes ago + + + + + %d hour ago + %d hours ago + + + + + %d day ago + %d days ago + + + + + %d year ago + %d years ago + + + + + in %d minute + in %d minutes + + + + + in %d hour + in %d hours + + + + + in %d day + in %d days + + + + + in %d year + in %d years + diff --git a/res/values/styles.xml b/res/values/styles.xml index 2568a05..0e8c798 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -17,7 +17,7 @@ @@ -26,9 +26,10 @@ bold - + + @@ -103,4 +107,4 @@ center @dimen/hero_button_corner_radius - + \ No newline at end of file diff --git a/src/com/android/car/messenger/core/interfaces/DataModel.java b/src/com/android/car/messenger/core/interfaces/DataModel.java index 93a728f..2822ecf 100644 --- a/src/com/android/car/messenger/core/interfaces/DataModel.java +++ b/src/com/android/car/messenger/core/interfaces/DataModel.java @@ -18,8 +18,10 @@ package com.android.car.messenger.core.interfaces; import androidx.annotation.NonNull; import androidx.lifecycle.LiveData; + import com.android.car.messenger.common.Conversation; import com.android.car.messenger.core.models.UserAccount; + import java.util.Collection; /** diff --git a/src/com/android/car/messenger/core/shared/NotificationHandler.java b/src/com/android/car/messenger/core/shared/NotificationHandler.java index f9836ec..ddee570 100644 --- a/src/com/android/car/messenger/core/shared/NotificationHandler.java +++ b/src/com/android/car/messenger/core/shared/NotificationHandler.java @@ -73,21 +73,18 @@ public class NotificationHandler { Notification notification = ConversationPayloadHandler.createNotificationFromConversation( context, channelId, tapToReadConversation, R.drawable.ic_message, null); - notification.contentIntent = createServiceIntent(); - + notification.contentIntent = createContentIntent(); notificationManager.notify(tapToReadConversation.getId().hashCode(), notification); } - private static PendingIntent createServiceIntent() { + private static PendingIntent createContentIntent() { Context context = AppFactory.get().getContext(); - Intent intent = new Intent(context, MessageLauncherActivity.class) .addFlags( Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP - | Intent.FLAG_ACTIVITY_SINGLE_TOP) - .setClass(context, MessengerService.class); + | Intent.FLAG_ACTIVITY_SINGLE_TOP); return PendingIntent.getActivity( context, diff --git a/src/com/android/car/messenger/core/ui/conversationlist/ConversationItemViewHolder.java b/src/com/android/car/messenger/core/ui/conversationlist/ConversationItemViewHolder.java index cb7f324..4f4de71 100644 --- a/src/com/android/car/messenger/core/ui/conversationlist/ConversationItemViewHolder.java +++ b/src/com/android/car/messenger/core/ui/conversationlist/ConversationItemViewHolder.java @@ -16,12 +16,16 @@ package com.android.car.messenger.core.ui.conversationlist; +import android.content.Context; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import androidx.recyclerview.widget.RecyclerView; import android.view.View; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.ColorInt; import androidx.annotation.NonNull; import com.android.car.messenger.R; @@ -106,15 +110,19 @@ public class ConversationItemViewHolder extends RecyclerView.ViewHolder { } private void setUpTextAppearance(@NonNull UIConversationItem uiData) { + Context context = AppFactory.get().getContext(); if (uiData.shouldUseUnreadTheme()) { mTitleView.setTextAppearance(R.style.TextAppearance_MessageHistoryUnreadTitle); - mPreviewTextView.setTextAppearance(R.style.TextAppearance_MessageHistoryTextPreview); + mPreviewTextView.setTextAppearance( + R.style.TextAppearance_MessageHistoryTextPreviewUnread); mTextMetadataView.setTextAppearance( R.style.TextAppearance_MessageHistoryUnreadMetadata); mTextMetadataDotView.setTextAppearance( R.style.TextAppearance_MessageHistoryUnreadMetadata); mDateTimeView.setTextAppearance(R.style.TextAppearance_MessageHistoryUnreadMetadata); - mDotSeparatorView.setTextAppearance(R.style.TextAppearance_MessageHistoryTextPreview); + mDotSeparatorView.setTextAppearance( + R.style.TextAppearance_MessageHistoryTextPreviewUnread); + updateSubtitleIcon(context.getColor(R.color.unread_color)); ViewUtils.setVisible(mUnreadIconIndicator, /* visible= */ true); } else { mTitleView.setTextAppearance(R.style.TextAppearance_MessageHistoryTitle); @@ -124,14 +132,20 @@ public class ConversationItemViewHolder extends RecyclerView.ViewHolder { R.style.TextAppearance_MessageHistoryTextPreview); mDateTimeView.setTextAppearance(R.style.TextAppearance_MessageHistoryTextPreview); mDotSeparatorView.setTextAppearance(R.style.TextAppearance_MessageHistoryTextPreview); + updateSubtitleIcon(context.getColor(R.color.secondary_text_color)); ViewUtils.setVisible(mUnreadIconIndicator, /* visible= */ false); } } + private void updateSubtitleIcon(@ColorInt int color) { + PorterDuffColorFilter porterDuffColorFilter = + new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP); + mSubtitleIconView.getDrawable().setColorFilter(porterDuffColorFilter); + } + private void updateMuteButton(boolean isMuted) { int drawableRes = isMuted ? R.drawable.ic_unmute : R.drawable.ic_mute; Drawable drawable = AppFactory.get().getContext().getDrawable(drawableRes); - mMuteActionButton.setImageDrawable(drawable); } diff --git a/src/com/android/car/messenger/core/ui/conversationlist/ConversationListFragment.java b/src/com/android/car/messenger/core/ui/conversationlist/ConversationListFragment.java index b00fb5f..bc27889 100644 --- a/src/com/android/car/messenger/core/ui/conversationlist/ConversationListFragment.java +++ b/src/com/android/car/messenger/core/ui/conversationlist/ConversationListFragment.java @@ -16,13 +16,13 @@ package com.android.car.messenger.core.ui.conversationlist; import android.app.Activity; -import androidx.lifecycle.ViewModelProvider; import android.content.Intent; import android.os.Bundle; import android.view.View; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; import com.android.car.messenger.R; import com.android.car.messenger.common.Conversation; @@ -110,6 +110,15 @@ public class ConversationListFragment extends MessageListBaseFragment R.string.connect_bluetooth_button_text, v -> startActivity(launchIntent), true); + removeMenuItems(); + } + + private void removeMenuItems() { + Activity activity = getActivity(); + if (activity == null || mToolbar == null) { + return; + } + mToolbar.setMenuItems(new ArrayList<>()); } private void setMenuItems() { @@ -117,6 +126,9 @@ public class ConversationListFragment extends MessageListBaseFragment if (activity == null || mUserAccount == null || mToolbar == null) { return; } + if (!mToolbar.getMenuItems().isEmpty()) { + return; + } if (!getResources().getBoolean(R.bool.direct_send_supported)) { return; } diff --git a/src/com/android/car/messenger/core/ui/conversationlist/ConversationListViewModel.java b/src/com/android/car/messenger/core/ui/conversationlist/ConversationListViewModel.java index 6b5d199..e16bff5 100644 --- a/src/com/android/car/messenger/core/ui/conversationlist/ConversationListViewModel.java +++ b/src/com/android/car/messenger/core/ui/conversationlist/ConversationListViewModel.java @@ -18,19 +18,23 @@ package com.android.car.messenger.core.ui.conversationlist; import android.annotation.SuppressLint; import android.app.Application; -import androidx.lifecycle.AndroidViewModel; import android.car.drivingstate.CarUxRestrictions; +import android.util.Pair; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.lifecycle.MediatorLiveData; +import androidx.lifecycle.Transformations; +import com.android.car.messenger.common.Conversation; import com.android.car.messenger.core.interfaces.AppFactory; import com.android.car.messenger.core.interfaces.DataModel; import com.android.car.messenger.core.models.UserAccount; import com.android.car.messenger.core.util.L; +import java.util.Collection; import java.util.List; import java.util.stream.Collectors; @@ -77,20 +81,10 @@ public class ConversationListViewModel extends AndroidViewModel { MediatorLiveData mutableLiveData = new MediatorLiveData<>(); mutableLiveData.postValue(UIConversationLog.getLoadingState()); mutableLiveData.addSource( - AppFactory.get().getCarStateListener().getUxrRestrictions(), - uxrRestrictions -> - subscribeToConversations(userAccount, mutableLiveData, uxrRestrictions)); - return mutableLiveData; - } - - private void subscribeToConversations( - @NonNull UserAccount userAccount, - MediatorLiveData mutableLiveData, - CarUxRestrictions uxRestrictions) { - L.w("Got new ux restrictions: " + uxRestrictions); - mutableLiveData.addSource( - mDataModel.getConversations(userAccount), - list -> { + subscribeToConversations(userAccount), + pair -> { + CarUxRestrictions uxRestrictions = pair.first; + Collection list = pair.second; List data = list.stream() .map( @@ -102,5 +96,19 @@ public class ConversationListViewModel extends AndroidViewModel { UIConversationLog log = UIConversationLog.getLoadedState(data); mutableLiveData.postValue(log); }); + return mutableLiveData; + } + + private LiveData>> subscribeToConversations( + @NonNull UserAccount userAccount) { + final LiveData> liveData = + mDataModel.getConversations(userAccount); + return Transformations.switchMap( + AppFactory.get().getCarStateListener().getUxrRestrictions(), + uxRestrictions -> { + L.d("Got new ux restrictions: " + uxRestrictions); + return Transformations.map( + liveData, conversations -> new Pair<>(uxRestrictions, conversations)); + }); } } diff --git a/src/com/android/car/messenger/core/ui/conversationlist/UIConversationItemConverter.java b/src/com/android/car/messenger/core/ui/conversationlist/UIConversationItemConverter.java index 00f2a71..baa7056 100644 --- a/src/com/android/car/messenger/core/ui/conversationlist/UIConversationItemConverter.java +++ b/src/com/android/car/messenger/core/ui/conversationlist/UIConversationItemConverter.java @@ -42,12 +42,10 @@ public class UIConversationItemConverter { long timestamp = ConversationUtil.getConversationTimestamp(conversation); boolean isReplied = ConversationUtil.isReplied(conversation); - Drawable subtitleIcon = null; - - // show reply icon to the side when replied - if (isReplied) { - subtitleIcon = context.getDrawable(R.drawable.car_ui_icon_reply); - } + Drawable subtitleIcon = + isReplied + ? context.getDrawable(R.drawable.car_ui_icon_reply) + : context.getDrawable(R.drawable.ic_subtitle_play); boolean showTextPreview = (carUxRestrictions.getActiveRestrictions() @@ -64,6 +62,8 @@ public class UIConversationItemConverter { } } else { if (isUnread) { + // in place of text preview, we show "tap to read aloud" when unread + textPreview = context.getString(R.string.tap_to_read_aloud); textMetadata = getNumberOfUnreadMessages(context, conversation.getUnreadCount()); } else if (isReplied) { textMetadata = context.getString(R.string.replied); @@ -72,10 +72,6 @@ public class UIConversationItemConverter { } } - boolean showPlayIcon = isUnread; - boolean showReplyIcon = - !showPlayIcon && context.getResources().getBoolean(R.bool.direct_reply_supported); - return new UIConversationItem( conversation.getId(), Objects.requireNonNull(conversation.getConversationTitle()), @@ -84,9 +80,9 @@ public class UIConversationItemConverter { textMetadata, timestamp, getConversationAvatar(context, conversation), - /* showMuteIcon= */ true, - /* showReplyIcon= */ showReplyIcon, - /* showPlayIcon= */ showPlayIcon, + /* showMuteIcon= */ false, + /* showReplyIcon= */ true, + /* showPlayIcon= */ false, isUnread, conversation.isMuted(), conversation); diff --git a/src/com/android/car/messenger/core/ui/launcher/MessageLauncherActivity.java b/src/com/android/car/messenger/core/ui/launcher/MessageLauncherActivity.java index 14c1951..0c114cc 100644 --- a/src/com/android/car/messenger/core/ui/launcher/MessageLauncherActivity.java +++ b/src/com/android/car/messenger/core/ui/launcher/MessageLauncherActivity.java @@ -16,12 +16,12 @@ package com.android.car.messenger.core.ui.launcher; -import androidx.lifecycle.ViewModelProvider; import android.os.Bundle; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.annotation.NonNull; +import androidx.lifecycle.ViewModelProvider; import com.android.car.messenger.core.interfaces.AppFactory; import com.android.car.messenger.core.models.UserAccount; diff --git a/src/com/android/car/messenger/core/ui/launcher/MessageLauncherViewModel.java b/src/com/android/car/messenger/core/ui/launcher/MessageLauncherViewModel.java index 2df42c1..47503e6 100644 --- a/src/com/android/car/messenger/core/ui/launcher/MessageLauncherViewModel.java +++ b/src/com/android/car/messenger/core/ui/launcher/MessageLauncherViewModel.java @@ -17,14 +17,17 @@ package com.android.car.messenger.core.ui.launcher; import android.app.Application; -import androidx.lifecycle.AndroidViewModel; -import androidx.lifecycle.Transformations; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; +import androidx.lifecycle.Transformations; + import com.android.car.messenger.core.interfaces.AppFactory; import com.android.car.messenger.core.interfaces.DataModel; import com.android.car.messenger.core.models.UserAccount; + import java.util.List; import java.util.stream.Collectors; diff --git a/src/com/android/car/messenger/core/util/VoiceUtil.java b/src/com/android/car/messenger/core/util/VoiceUtil.java index bd7997b..7791b1b 100644 --- a/src/com/android/car/messenger/core/util/VoiceUtil.java +++ b/src/com/android/car/messenger/core/util/VoiceUtil.java @@ -29,7 +29,6 @@ import static com.android.car.assist.CarVoiceInteractionSession.VOICE_ACTION_REP import static com.android.car.assist.CarVoiceInteractionSession.VOICE_ACTION_SEND_SMS; import static com.android.car.messenger.core.shared.MessageConstants.ACTION_DIRECT_SEND; import static com.android.car.messenger.core.shared.MessageConstants.ACTION_MARK_AS_READ; -import static com.android.car.messenger.core.shared.MessageConstants.ACTION_MUTE; import static com.android.car.messenger.core.shared.MessageConstants.ACTION_REPLY; import static com.android.car.messenger.core.shared.MessageConstants.EXTRA_ACCOUNT_ID; import static com.android.car.messenger.core.shared.MessageConstants.EXTRA_CONVERSATION_KEY; @@ -189,23 +188,9 @@ public class VoiceUtil { markAsReadIntent), null); - final int muteIcon = R.drawable.car_ui_icon_toggle_mute; - final String muteString = context.getString(R.string.action_mute); - PendingIntent muteIntent = createServiceIntent(ACTION_MUTE, conversationKey, userAccountId); - ConversationAction muteAction = - new ConversationAction( - ActionType.ACTION_TYPE_MUTE, - new RemoteAction( - Icon.createWithResource(context, muteIcon), - muteString, - muteString, - muteIntent), - null); - List actions = new ArrayList<>(); actions.add(replyAction); actions.add(markAsReadAction); - actions.add(muteAction); builder.setActions(actions); return builder.build(); } diff --git a/src/com/android/car/messenger/impl/datamodels/ContentProviderLiveData.java b/src/com/android/car/messenger/impl/datamodels/ContentProviderLiveData.java index fbd6d14..bf3ebae 100644 --- a/src/com/android/car/messenger/impl/datamodels/ContentProviderLiveData.java +++ b/src/com/android/car/messenger/impl/datamodels/ContentProviderLiveData.java @@ -19,8 +19,10 @@ package com.android.car.messenger.impl.datamodels; import android.content.Context; import android.database.ContentObserver; import android.net.Uri; + import androidx.annotation.NonNull; import androidx.lifecycle.MediatorLiveData; + import com.android.car.messenger.core.interfaces.AppFactory; /** diff --git a/src/com/android/car/messenger/impl/datamodels/ConversationsPerDeviceFetchManager.java b/src/com/android/car/messenger/impl/datamodels/ConversationsPerDeviceFetchManager.java index 379e922..19689de 100644 --- a/src/com/android/car/messenger/impl/datamodels/ConversationsPerDeviceFetchManager.java +++ b/src/com/android/car/messenger/impl/datamodels/ConversationsPerDeviceFetchManager.java @@ -25,13 +25,16 @@ import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.telephony.SubscriptionInfo; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.LiveData; import androidx.lifecycle.MediatorLiveData; import androidx.lifecycle.Observer; + import com.android.car.messenger.core.interfaces.AppFactory; import com.android.car.messenger.core.models.UserAccount; + import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; diff --git a/src/com/android/car/messenger/impl/datamodels/NewMessageLiveData.java b/src/com/android/car/messenger/impl/datamodels/NewMessageLiveData.java index 05e5c57..2195bc5 100644 --- a/src/com/android/car/messenger/impl/datamodels/NewMessageLiveData.java +++ b/src/com/android/car/messenger/impl/datamodels/NewMessageLiveData.java @@ -125,6 +125,13 @@ public class NewMessageLiveData extends ContentProviderLiveData { Conversation conversation; try { conversation = fetchConversation(conversationId); + Instant offset = + Objects.requireNonNull( + mOffsetMap.getOrDefault( + userAccount.getId(), userAccount.getConnectionTime())); + conversation + .getMessages() + .removeIf(message -> message.getTimestamp() < offset.toEpochMilli()); conversation.getExtras().putInt(MessageConstants.EXTRA_ACCOUNT_ID, userAccount.getId()); } catch (CursorIndexOutOfBoundsException e) { L.w("Error occurred fetching conversation Id " + conversationId); diff --git a/src/com/android/car/messenger/impl/datamodels/TelephonyDataModel.java b/src/com/android/car/messenger/impl/datamodels/TelephonyDataModel.java index 40568cc..82a3d0a 100644 --- a/src/com/android/car/messenger/impl/datamodels/TelephonyDataModel.java +++ b/src/com/android/car/messenger/impl/datamodels/TelephonyDataModel.java @@ -18,15 +18,17 @@ package com.android.car.messenger.impl.datamodels; import static com.android.car.messenger.core.shared.MessageConstants.KEY_MUTED_CONVERSATIONS; -import androidx.lifecycle.Transformations; import android.content.ContentValues; import android.content.Context; import android.content.SharedPreferences; import android.net.Uri; import android.provider.Telephony; import android.telephony.SmsManager; + import androidx.annotation.NonNull; import androidx.lifecycle.LiveData; +import androidx.lifecycle.Transformations; + import com.android.car.messenger.common.Conversation; import com.android.car.messenger.core.interfaces.AppFactory; import com.android.car.messenger.core.interfaces.DataModel; @@ -34,6 +36,7 @@ import com.android.car.messenger.core.models.UserAccount; import com.android.car.messenger.core.util.L; import com.android.car.messenger.impl.datamodels.UserAccountLiveData.UserAccountChangeList; import com.android.car.messenger.impl.datamodels.util.CursorUtils; + import java.util.Collection; import java.util.HashSet; import java.util.Set; diff --git a/src/com/android/car/messenger/impl/datamodels/UserAccountLiveData.java b/src/com/android/car/messenger/impl/datamodels/UserAccountLiveData.java index feaecea..b5314dd 100644 --- a/src/com/android/car/messenger/impl/datamodels/UserAccountLiveData.java +++ b/src/com/android/car/messenger/impl/datamodels/UserAccountLiveData.java @@ -20,12 +20,15 @@ import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.TelephonyManager; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.LiveData; + import com.android.car.messenger.core.interfaces.AppFactory; import com.android.car.messenger.core.models.UserAccount; import com.android.car.messenger.impl.datamodels.UserAccountLiveData.UserAccountChangeList; + import java.time.Instant; import java.util.ArrayList; import java.util.Collection; diff --git a/src/com/android/car/messenger/impl/datamodels/util/MessageUtils.java b/src/com/android/car/messenger/impl/datamodels/util/MessageUtils.java index 8da6318..555d91c 100644 --- a/src/com/android/car/messenger/impl/datamodels/util/MessageUtils.java +++ b/src/com/android/car/messenger/impl/datamodels/util/MessageUtils.java @@ -130,6 +130,16 @@ public final class MessageUtils { L.d("Message was not able to be parsed. Skipping."); continue; } + if (message.getText().trim().isEmpty()) { + // There are occasions where a user may send + // a text message plus an image or audio and + // bluetooth will post two messages to the database (b/182834412), + // one with a text and one blank + // This leads to boomerang notifications, one with text and one that is empty. + // Validating or removing messages when blank is a mitigation on our end. + L.d("Message is blank. Skipped. "); + continue; + } if (message.getMessageType() == MessageType.MESSAGE_TYPE_SENT) { hasBeenRepliedTo = true; } @@ -137,25 +147,6 @@ public final class MessageUtils { } while (messageCursor.moveToNext() && moveToNext); } - /** - * Parses each message in the cursor and returns the item for further processing - * - * @param messageCursor The message cursor to be parsed for SMS and MMS messages and returns - * true for the method to continue parsing the cursor or false to return. - */ - @Nullable - public static Message parseCurrentMessage(@NonNull Cursor messageCursor) { - Message message = null; - Context context = AppFactory.get().getContext(); - try { - message = parseMessageAtPoint(context, messageCursor, false); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - L.d("Message was not able to be parsed. Skipping."); - } - return message; - } - /** * Parses message at the point in cursor. * diff --git a/src/com/android/car/messenger/impl/datamodels/util/MmsUtils.java b/src/com/android/car/messenger/impl/datamodels/util/MmsUtils.java index 808ce86..7f87e69 100644 --- a/src/com/android/car/messenger/impl/datamodels/util/MmsUtils.java +++ b/src/com/android/car/messenger/impl/datamodels/util/MmsUtils.java @@ -82,6 +82,7 @@ class MmsUtils { stringBuilder.append(cursor.getString(cursor.getColumnIndex(Part.TEXT))); stringBuilder.append(" "); } + return stringBuilder.toString().replace(REPLACE_CHARS, ""); } -- cgit v1.2.3 From d37836e7c7149620bbcb0b95b3a4441541c97200 Mon Sep 17 00:00:00 2001 From: Peter Li Date: Tue, 28 Sep 2021 19:19:29 -0700 Subject: Add gradle build Fix: 194512744 Test: gradle build Change-Id: I0642c648aa090dc9559908d5927fa001a69fc5d8 --- build.gradle | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 build.gradle diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..b0e8bc2 --- /dev/null +++ b/build.gradle @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2021 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. + */ + +apply plugin: 'com.android.application' + +android { + compileSdkVersion gradle.ext.aaosLatestSDK + defaultConfig { + applicationId "com.android.car.messenger" + minSdkVersion 30 + targetSdkVersion gradle.ext.aaosLatestSDK + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + lintOptions { + abortOnError false + } + buildTypes { + release { + minifyEnabled false + } + } + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + aidl.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + res.srcDirs = ['res'] + } + } +} + +dependencies { + implementation files(gradle.ext.lib_car_system_stubs) + + implementation "androidx.constraintlayout:constraintlayout:2.0.0-beta8" + + def lifecycle_version = "2.2.0" + implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" + // Not available in 2.3+ + implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version" + + implementation "androidx.legacy:legacy-support-v4:1.0.0" + implementation "androidx.preference:preference:1.1.1" + implementation "androidx.annotation:annotation:1.0.1" + + implementation project(":car-assist-lib") + implementation project(":car-messenger-common:model") + implementation project(":car-telephony-common") + implementation project(":car-ui-lib") +} -- cgit v1.2.3 From 42c3b8de497e27efc8c4c9304f75f04324945314 Mon Sep 17 00:00:00 2001 From: Peter Li Date: Tue, 5 Oct 2021 00:10:59 -0700 Subject: Fix activity backstack on HUD tap Fix: 197153503 Test: Manual Change-Id: Iff8b96fd308f9602b875b5bba828bfeaec0e2261 --- .../android/car/messenger/core/shared/NotificationHandler.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/com/android/car/messenger/core/shared/NotificationHandler.java b/src/com/android/car/messenger/core/shared/NotificationHandler.java index ddee570..167c283 100644 --- a/src/com/android/car/messenger/core/shared/NotificationHandler.java +++ b/src/com/android/car/messenger/core/shared/NotificationHandler.java @@ -79,12 +79,8 @@ public class NotificationHandler { private static PendingIntent createContentIntent() { Context context = AppFactory.get().getContext(); - Intent intent = - new Intent(context, MessageLauncherActivity.class) - .addFlags( - Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_CLEAR_TOP - | Intent.FLAG_ACTIVITY_SINGLE_TOP); + Intent intent = new Intent(context, MessageLauncherActivity.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); return PendingIntent.getActivity( context, -- cgit v1.2.3 From 667eed8c115b2a47fba18f05c2a9029cbfb40d6a Mon Sep 17 00:00:00 2001 From: Peter Li Date: Wed, 6 Oct 2021 16:20:13 -0700 Subject: Fix UI discrepencies Bug: 197674556 PiperOrigin-RevId: 401365789 Change-Id: I9a569ece4fc902ed4aca014c137bead4fba6dd39 --- res/drawable/ic_subtitle_play.xml | 4 ++-- res/layout/conversation_list_item.xml | 3 ++- res/values/dimens.xml | 8 +++++--- res/values/strings.xml | 3 +++ res/values/styles.xml | 16 ++++++++++++---- .../messenger/core/shared/NotificationHandler.java | 3 ++- .../conversationlist/ConversationItemViewHolder.java | 1 + .../ui/conversationlist/ConversationListFragment.java | 2 +- .../impl/datamodels/util/ConversationFetchUtil.java | 19 ++++++++++++++++++- 9 files changed, 46 insertions(+), 13 deletions(-) diff --git a/res/drawable/ic_subtitle_play.xml b/res/drawable/ic_subtitle_play.xml index 9eccfaf..b14bfb9 100644 --- a/res/drawable/ic_subtitle_play.xml +++ b/res/drawable/ic_subtitle_play.xml @@ -15,8 +15,8 @@ ~ limitations under the License. --> diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 42d721b..863fd2d 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -64,7 +64,9 @@ 0.0 - 0.0 - 0.0 - 0.0 + 0.03 + 0.045 + 0.06 + + 32sp diff --git a/res/values/strings.xml b/res/values/strings.xml index 3108071..17c90fe 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -93,6 +93,9 @@ now + + , and %d more + %dm diff --git a/res/values/styles.xml b/res/values/styles.xml index 8845c0a..f332ebb 100644 --- a/res/values/styles.xml +++ b/res/values/styles.xml @@ -15,15 +15,19 @@ --> - - - + @@ -107,4 +115,4 @@ center @dimen/hero_button_corner_radius - \ No newline at end of file + diff --git a/src/com/android/car/messenger/core/shared/NotificationHandler.java b/src/com/android/car/messenger/core/shared/NotificationHandler.java index 167c283..f63696c 100644 --- a/src/com/android/car/messenger/core/shared/NotificationHandler.java +++ b/src/com/android/car/messenger/core/shared/NotificationHandler.java @@ -79,7 +79,8 @@ public class NotificationHandler { private static PendingIntent createContentIntent() { Context context = AppFactory.get().getContext(); - Intent intent = new Intent(context, MessageLauncherActivity.class) + Intent intent = + new Intent(context, MessageLauncherActivity.class) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); return PendingIntent.getActivity( diff --git a/src/com/android/car/messenger/core/ui/conversationlist/ConversationItemViewHolder.java b/src/com/android/car/messenger/core/ui/conversationlist/ConversationItemViewHolder.java index 4f4de71..1ac5a50 100644 --- a/src/com/android/car/messenger/core/ui/conversationlist/ConversationItemViewHolder.java +++ b/src/com/android/car/messenger/core/ui/conversationlist/ConversationItemViewHolder.java @@ -135,6 +135,7 @@ public class ConversationItemViewHolder extends RecyclerView.ViewHolder { updateSubtitleIcon(context.getColor(R.color.secondary_text_color)); ViewUtils.setVisible(mUnreadIconIndicator, /* visible= */ false); } + mDotSeparatorView.setTextSize(context.getResources().getDimension(R.dimen.dot_size)); } private void updateSubtitleIcon(@ColorInt int color) { diff --git a/src/com/android/car/messenger/core/ui/conversationlist/ConversationListFragment.java b/src/com/android/car/messenger/core/ui/conversationlist/ConversationListFragment.java index bc27889..78e6608 100644 --- a/src/com/android/car/messenger/core/ui/conversationlist/ConversationListFragment.java +++ b/src/com/android/car/messenger/core/ui/conversationlist/ConversationListFragment.java @@ -135,7 +135,7 @@ public class ConversationListFragment extends MessageListBaseFragment MenuItem newMessageButton = new MenuItem.Builder(activity) .setIcon(R.drawable.ui_icon_edit) - .setTinted(true) + .setTinted(false) .setShowIconAndTitle(true) .setTitle(R.string.new_message) .setPrimary(true) diff --git a/src/com/android/car/messenger/impl/datamodels/util/ConversationFetchUtil.java b/src/com/android/car/messenger/impl/datamodels/util/ConversationFetchUtil.java index ddedbe2..5cea752 100644 --- a/src/com/android/car/messenger/impl/datamodels/util/ConversationFetchUtil.java +++ b/src/com/android/car/messenger/impl/datamodels/util/ConversationFetchUtil.java @@ -16,6 +16,8 @@ package com.android.car.messenger.impl.datamodels.util; +import static java.lang.Math.min; + import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; @@ -27,6 +29,7 @@ import android.util.Pair; import androidx.annotation.NonNull; import androidx.core.app.Person; +import com.android.car.messenger.R; import com.android.car.messenger.common.Conversation; import com.android.car.messenger.core.interfaces.AppFactory; import com.android.car.messenger.core.shared.MessageConstants; @@ -44,6 +47,7 @@ public class ConversationFetchUtil { private static final int MESSAGE_LIMIT = 10; private static final String COMMA_DELIMITER = ", "; + private static final int MAX_TITLE_NAMES = 3; private ConversationFetchUtil() {} @@ -82,7 +86,7 @@ public class ConversationFetchUtil { fetchParticipants( conversationId, (names, icons) -> { - builder.setConversationTitle(TextUtils.join(COMMA_DELIMITER, names)); + builder.setConversationTitle(formatConversationTitle(names)); Bitmap bitmap = AvatarUtil.createGroupAvatar(context, icons); if (bitmap != null) { builder.setConversationIcon(IconCompat.createWithBitmap(bitmap)); @@ -93,6 +97,19 @@ public class ConversationFetchUtil { return builder; } + private static String formatConversationTitle(List names) { + Context context = AppFactory.get().getContext(); + String title = + TextUtils.join( + COMMA_DELIMITER, names.subList(0, min(MAX_TITLE_NAMES, names.size()))); + if (names.size() > MAX_TITLE_NAMES) { + title += + context.getString( + R.string.participant_overflow_text, names.size() - MAX_TITLE_NAMES); + } + return title; + } + /** * Fetches participants and allows caller to process names and icons before returning. * -- cgit v1.2.3 From 53dcbec2a441db541fbb3932730ca16855a8410e Mon Sep 17 00:00:00 2001 From: Uchenna Okoye Date: Tue, 12 Oct 2021 13:08:43 -0700 Subject: Message list should update if a message is sent while the main activity is paused. Bug: 202322468, 197674787, 202427652 PiperOrigin-RevId: 402636807 Change-Id: I05e66762e9f9ed95be5e5d2dbf15aa5a5cbf4b6f --- .../car/messenger/core/interfaces/DataModel.java | 6 +-- .../core/ui/launcher/MessageLauncherActivity.java | 2 +- .../impl/datamodels/ConversationListLiveData.java | 2 + .../messenger/impl/datamodels/RefreshLiveData.java | 46 ++++++++++++++++++++++ .../impl/datamodels/TelephonyDataModel.java | 4 +- 5 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 src/com/android/car/messenger/impl/datamodels/RefreshLiveData.java diff --git a/src/com/android/car/messenger/core/interfaces/DataModel.java b/src/com/android/car/messenger/core/interfaces/DataModel.java index 2822ecf..b634d4c 100644 --- a/src/com/android/car/messenger/core/interfaces/DataModel.java +++ b/src/com/android/car/messenger/core/interfaces/DataModel.java @@ -41,10 +41,10 @@ public interface DataModel { LiveData> getAccounts(); /** - * Call this to reload user account live data. This is useful when resuming an activity, to - * ensure no account changes was missed. + * Call this to reload data. This is useful when resuming an activity, to ensure no account + * changes was missed or other changes were missed. */ - void refreshUserAccounts(); + void refresh(); /** * Get collection of conversations for the given account. diff --git a/src/com/android/car/messenger/core/ui/launcher/MessageLauncherActivity.java b/src/com/android/car/messenger/core/ui/launcher/MessageLauncherActivity.java index 0c114cc..beed82c 100644 --- a/src/com/android/car/messenger/core/ui/launcher/MessageLauncherActivity.java +++ b/src/com/android/car/messenger/core/ui/launcher/MessageLauncherActivity.java @@ -75,7 +75,7 @@ public class MessageLauncherActivity extends FragmentActivity implements InsetsC @Override protected void onResume() { L.d("On Resume of Message Activity."); - AppFactory.get().getDataModel().refreshUserAccounts(); + AppFactory.get().getDataModel().refresh(); super.onResume(); } diff --git a/src/com/android/car/messenger/impl/datamodels/ConversationListLiveData.java b/src/com/android/car/messenger/impl/datamodels/ConversationListLiveData.java index 5e71513..fa91f65 100644 --- a/src/com/android/car/messenger/impl/datamodels/ConversationListLiveData.java +++ b/src/com/android/car/messenger/impl/datamodels/ConversationListLiveData.java @@ -59,6 +59,8 @@ class ConversationListLiveData extends ContentProviderLiveData onDataChange()); } @Override diff --git a/src/com/android/car/messenger/impl/datamodels/RefreshLiveData.java b/src/com/android/car/messenger/impl/datamodels/RefreshLiveData.java new file mode 100644 index 0000000..0ca75bd --- /dev/null +++ b/src/com/android/car/messenger/impl/datamodels/RefreshLiveData.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2021 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.android.car.messenger.impl.datamodels; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.LiveData; + +/** + * Refresh live data for other live data to force refresh. When a live data listens for updates, it + * can refresh its data and repost as needed. This typically occurs when the user revisits the + * activity from the background. The background has a number of states that leads to live datas not + * being updated. The content observer from the telephony database does not always update when in + * the background if something changes. Same thing occurs with shared preferences. By checking the + * data again for any stale data when we resume, we can ensure the latest data is provided. + */ +public class RefreshLiveData extends LiveData { + + @Nullable private static RefreshLiveData sInstance; + + /** Gets the instance of {@link RefreshLiveData} */ + @NonNull + public static RefreshLiveData getInstance() { + if (sInstance == null) { + sInstance = new RefreshLiveData(); + } + return sInstance; + } + + public void refresh() { + postValue(true); + } +} diff --git a/src/com/android/car/messenger/impl/datamodels/TelephonyDataModel.java b/src/com/android/car/messenger/impl/datamodels/TelephonyDataModel.java index 82a3d0a..4de3433 100644 --- a/src/com/android/car/messenger/impl/datamodels/TelephonyDataModel.java +++ b/src/com/android/car/messenger/impl/datamodels/TelephonyDataModel.java @@ -43,7 +43,6 @@ import java.util.Set; /** Queries the telephony data model to retrieve the SMS/MMS messages */ public class TelephonyDataModel implements DataModel { - @NonNull @Override public LiveData> getAccounts() { @@ -52,8 +51,9 @@ public class TelephonyDataModel implements DataModel { } @Override - public void refreshUserAccounts() { + public void refresh() { UserAccountLiveData.getInstance().refresh(); + RefreshLiveData.getInstance().refresh(); } @NonNull -- cgit v1.2.3 From 56263a573e51ac5dc0dbe35d37edbcadfe4fe8b4 Mon Sep 17 00:00:00 2001 From: Uchenna Okoye Date: Mon, 8 Nov 2021 15:57:10 -0800 Subject: Fix Stabilization Bugs PiperOrigin-RevId: 408462735 Change-Id: Ia54550179ad88a213890529afa62d04e62346fd2 Bug: 203687523, 203700812, 203707755, 204487577 --- res/drawable/ic_launcher_icon.xml | 35 +++++++--------------- res/layout/conversation_list_item.xml | 2 +- res/values/config.xml | 3 +- .../messenger/core/service/MessengerService.java | 2 +- .../messenger/core/shared/NotificationHandler.java | 19 +++++------- .../ConversationItemViewHolder.java | 1 + .../impl/datamodels/NewMessageLiveData.java | 9 +----- .../messenger/impl/datamodels/RefreshLiveData.java | 1 + 8 files changed, 24 insertions(+), 48 deletions(-) diff --git a/res/drawable/ic_launcher_icon.xml b/res/drawable/ic_launcher_icon.xml index bf04507..caac05a 100644 --- a/res/drawable/ic_launcher_icon.xml +++ b/res/drawable/ic_launcher_icon.xml @@ -14,28 +14,15 @@ See the License for the specific language governing permissions and limitations under the License. --> - - - - - + android:width="80dp" + android:height="80dp" + android:viewportWidth="80" + android:viewportHeight="80"> + + + diff --git a/res/layout/conversation_list_item.xml b/res/layout/conversation_list_item.xml index b9455a3..09e106a 100644 --- a/res/layout/conversation_list_item.xml +++ b/res/layout/conversation_list_item.xml @@ -130,7 +130,7 @@ limitations under the License. app:layout_constraintEnd_toStartOf="@id/preview_dot" tools:visibility="visible" android:ellipsize="end" - android:maxEms="19" + android:maxLength="40" tools:text="Let this be the preview. Lots of preview with a whole lot of various texts, one that is quite long in every way. To verify that it still fits in the end" /> diff --git a/res/values/config.xml b/res/values/config.xml index c44885f..60283a4 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -18,10 +18,9 @@ false true true - true + false + package="com.android.car.messenger" + android:versionCode="10000" + android:versionName="1.0.0"> - diff --git a/build.gradle b/build.gradle index b0e8bc2..88e8ced 100644 --- a/build.gradle +++ b/build.gradle @@ -44,6 +44,29 @@ android { renderscript.srcDirs = ['src'] res.srcDirs = ['res'] } + + androidTest { + java.srcDirs = ['tests/src'] + setRoot('tests') + } + } + + testOptions { + animationsDisabled = true + } + + buildTypes { + debug { + testCoverageEnabled = true + } + } + + signingConfigs { + debug { + // The following signs the apk with platform key. + storeFile file('../../../../vendor/google/certs/devkeys/platform.keystore') + storePassword 'android' + } } } @@ -65,4 +88,11 @@ dependencies { implementation project(":car-messenger-common:model") implementation project(":car-telephony-common") implementation project(":car-ui-lib") + + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test:core:1.4.0' + androidTestImplementation 'androidx.test:rules:1.4.0' + androidTestImplementation 'androidx.test:runner:1.4.0' + androidTestImplementation 'com.google.truth:truth:1.1.3' + androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito-inline:2.28.1' } diff --git a/tests/Android.bp b/tests/Android.bp new file mode 100644 index 0000000..8dac782 --- /dev/null +++ b/tests/Android.bp @@ -0,0 +1,43 @@ +// +// Copyright (C) 2021 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 { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +android_test { + name: "CarMessengerUnitTests", + + min_sdk_version: "30", + + target_sdk_version: "31", + + srcs: ["src/**/*.java"], + + libs: ["android.car-system-stubs"], + + static_libs: [ + "androidx.test.core", + "androidx.test.rules", + "androidx.test.runner", + "androidx.test.ext.junit", + "androidx.test.ext.truth", + "mockito-target-extended-minus-junit4", + "truth-prebuilt", + ], + + instrumentation_for: "CarMessengerAppForTesting", +} diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml new file mode 100644 index 0000000..e59c7c4 --- /dev/null +++ b/tests/AndroidManifest.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + diff --git a/tests/src/com/android/car/messenger/BuildTest.java b/tests/src/com/android/car/messenger/BuildTest.java new file mode 100644 index 0000000..3d35ddb --- /dev/null +++ b/tests/src/com/android/car/messenger/BuildTest.java @@ -0,0 +1,33 @@ +/* + * Copyright 2021 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.android.car.messenger; + +import static com.google.common.truth.Truth.assertThat; + +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(AndroidJUnit4.class) +public class BuildTest { + + @Test + public void test() { + assertThat(true).isEqualTo(true); + } +} -- cgit v1.2.3