From 349eeb7025bec9ee4b59902879608803cfa54005 Mon Sep 17 00:00:00 2001 From: "MINIPC\\frivaong" Date: Thu, 24 Sep 2026 18:19:48 +0900 Subject: [PATCH] Messaging: Looply home UI and Gradle app module layout Restructure the tree for Android Studio/Gradle builds and add the iOS-style home experience with pinned conversations, selection chrome, and scroll-aware search padding. Co-authored-by: Cursor --- .gitignore | 22 + app/build.gradle | 89 ++ .../src/main/AndroidManifest.xml | 4 - {assets => app/src/main/assets}/licenses.html | 0 .../android/support/v7/mms/ApnException.java | 0 .../support/v7/mms/ApnSettingsLoader.java | 0 .../android/support/v7/mms/ApnsXmlParser.java | 0 .../v7/mms/CarrierConfigValuesLoader.java | 0 .../v7/mms/CarrierConfigXmlParser.java | 0 .../v7/mms/DefaultApnSettingsLoader.java | 0 .../mms/DefaultCarrierConfigValuesLoader.java | 0 .../v7/mms/DefaultUserAgentInfoLoader.java | 0 .../support/v7/mms/DownloadRequest.java | 0 .../android/support/v7/mms/MmsHttpClient.java | 0 .../support/v7/mms/MmsHttpException.java | 0 .../android/support/v7/mms/MmsManager.java | 0 .../support/v7/mms/MmsNetworkException.java | 0 .../support/v7/mms/MmsNetworkManager.java | 0 .../android/support/v7/mms/MmsRequest.java | 0 .../android/support/v7/mms/MmsService.java | 0 .../support/v7/mms/MmsXmlResourceParser.java | 0 .../support/v7/mms/PhoneNumberHelper.java | 0 .../android/support/v7/mms/SendRequest.java | 0 .../support/v7/mms/UserAgentInfoLoader.java | 0 .../java}/android/support/v7/mms/Utils.java | 0 .../support/v7/mms/pdu/AcknowledgeInd.java | 0 .../android/support/v7/mms/pdu/Base64.java | 0 .../support/v7/mms/pdu/CharacterSets.java | 0 .../support/v7/mms/pdu/ContentType.java | 0 .../support/v7/mms/pdu/DeliveryInd.java | 0 .../v7/mms/pdu/EncodedStringValue.java | 0 .../support/v7/mms/pdu/GenericPdu.java | 0 .../mms/pdu/InvalidHeaderValueException.java | 0 .../support/v7/mms/pdu/MmsException.java | 0 .../v7/mms/pdu/MultimediaMessagePdu.java | 0 .../support/v7/mms/pdu/NotificationInd.java | 0 .../support/v7/mms/pdu/NotifyRespInd.java | 0 .../android/support/v7/mms/pdu/PduBody.java | 0 .../support/v7/mms/pdu/PduContentTypes.java | 0 .../support/v7/mms/pdu/PduHeaders.java | 0 .../android/support/v7/mms/pdu/PduParser.java | 0 .../android/support/v7/mms/pdu/PduPart.java | 0 .../support/v7/mms/pdu/QuotedPrintable.java | 0 .../support/v7/mms/pdu/ReadOrigInd.java | 0 .../support/v7/mms/pdu/ReadRecInd.java | 0 .../support/v7/mms/pdu/RetrieveConf.java | 0 .../android/support/v7/mms/pdu/SendConf.java | 0 .../android/support/v7/mms/pdu/SendReq.java | 0 .../android/messaging/BugleApplication.java | 0 .../java}/com/android/messaging/Factory.java | 0 .../com/android/messaging/FactoryImpl.java | 0 .../datamodel/BoundCursorLoader.java | 0 .../datamodel/BugleDatabaseOperations.java | 0 .../datamodel/BugleNotifications.java | 0 .../datamodel/BugleRecipientEntry.java | 0 .../datamodel/ConversationImagePartsView.java | 0 .../messaging/datamodel/CursorQueryData.java | 0 .../messaging/datamodel/DataModel.java | 0 .../messaging/datamodel/DataModelImpl.java | 0 .../messaging/datamodel/DatabaseHelper.java | 0 .../datamodel/DatabaseUpgradeHelper.java | 0 .../messaging/datamodel/DatabaseWrapper.java | 0 .../messaging/datamodel/FileProvider.java | 0 .../FrequentContactsCursorBuilder.java | 0 .../FrequentContactsCursorQueryData.java | 0 .../datamodel/MediaScratchFileProvider.java | 0 .../datamodel/MemoryCacheManager.java | 0 .../datamodel/MessageNotificationState.java | 0 .../messaging/datamodel/MessageTextStats.java | 0 .../datamodel/MessagingContentProvider.java | 0 .../messaging/datamodel/MmsFileProvider.java | 0 .../NoConfirmationSmsSendService.java | 0 .../datamodel/NotificationState.java | 0 .../datamodel/ParticipantRefresh.java | 0 .../messaging/datamodel/SyncManager.java | 0 .../messaging/datamodel/action/Action.java | 0 .../datamodel/action/ActionMonitor.java | 0 .../datamodel/action/ActionService.java | 0 .../datamodel/action/ActionServiceImpl.java | 0 .../datamodel/action/BackgroundWorker.java | 0 .../action/BackgroundWorkerService.java | 0 .../datamodel/action/BugleActionToasts.java | 0 .../action/DeleteConversationAction.java | 0 .../datamodel/action/DeleteMessageAction.java | 0 .../datamodel/action/DownloadMmsAction.java | 0 .../FixupMessageStatusOnStartupAction.java | 0 .../action/GetOrCreateConversationAction.java | 0 .../action/InsertNewMessageAction.java | 0 .../datamodel/action/MarkAsReadAction.java | 0 .../datamodel/action/MarkAsSeenAction.java | 0 .../action/ProcessDeliveryReportAction.java | 0 .../action/ProcessDownloadedMmsAction.java | 0 .../action/ProcessPendingMessagesAction.java | 0 .../action/ProcessSentMessageAction.java | 0 .../datamodel/action/ReadDraftDataAction.java | 0 .../action/ReceiveMmsMessageAction.java | 0 .../action/ReceiveSmsMessageAction.java | 0 .../datamodel/action/RedownloadMmsAction.java | 0 .../datamodel/action/ResendMessageAction.java | 0 .../datamodel/action/SendMessageAction.java | 0 .../datamodel/action/SyncCursorPair.java | 0 .../datamodel/action/SyncMessageBatch.java | 0 .../datamodel/action/SyncMessagesAction.java | 0 ...UpdateConversationArchiveStatusAction.java | 0 .../UpdateDestinationBlockedAction.java | 0 .../UpdateMessageNotificationAction.java | 0 .../action/UpdateMessagePartSizeAction.java | 0 .../action/WriteDraftMessageAction.java | 0 .../datamodel/binding/BindableData.java | 0 .../datamodel/binding/BindableOnceData.java | 0 .../messaging/datamodel/binding/Binding.java | 0 .../datamodel/binding/BindingBase.java | 0 .../datamodel/binding/DetachableBinding.java | 0 .../binding/ImmutableBindingRef.java | 0 .../data/BlockedParticipantsData.java | 0 .../datamodel/data/ContactListItemData.java | 0 .../datamodel/data/ContactPickerData.java | 0 .../datamodel/data/ConversationData.java | 0 .../datamodel/data/ConversationListData.java | 0 .../data/ConversationListItemData.java | 0 .../data/ConversationMessageBubbleData.java | 0 .../data/ConversationMessageData.java | 0 .../data/ConversationParticipantsData.java | 0 .../datamodel/data/DraftMessageData.java | 0 .../data/LaunchConversationData.java | 0 .../datamodel/data/MediaPickerData.java | 0 .../data/MediaPickerMessagePartData.java | 0 .../messaging/datamodel/data/MessageData.java | 0 .../datamodel/data/MessagePartData.java | 0 .../datamodel/data/ParticipantData.java | 0 .../data/ParticipantListItemData.java | 0 .../datamodel/data/PendingAttachmentData.java | 0 .../datamodel/data/PeopleAndOptionsData.java | 0 .../datamodel/data/PeopleOptionsItemData.java | 0 .../datamodel/data/PersonItemData.java | 0 .../datamodel/data/SelfParticipantsData.java | 0 .../datamodel/data/SettingsData.java | 0 .../datamodel/data/SubscriptionListData.java | 0 .../datamodel/data/VCardContactItemData.java | 0 .../media/AsyncMediaRequestWrapper.java | 0 .../media/AvatarGroupRequestDescriptor.java | 0 .../datamodel/media/AvatarRequest.java | 0 .../media/AvatarRequestDescriptor.java | 0 .../datamodel/media/BindableMediaRequest.java | 0 .../media/BugleMediaCacheManager.java | 0 .../media/CompositeImageRequest.java | 0 .../CompositeImageRequestDescriptor.java | 0 .../datamodel/media/CustomVCardEntry.java | 0 .../media/CustomVCardEntryConstructor.java | 0 .../datamodel/media/DecodedImageResource.java | 0 .../datamodel/media/EncodedImageResource.java | 0 .../datamodel/media/FileImageRequest.java | 0 .../media/FileImageRequestDescriptor.java | 0 .../datamodel/media/GifImageResource.java | 0 .../datamodel/media/ImageRequest.java | 0 .../media/ImageRequestDescriptor.java | 0 .../datamodel/media/ImageResource.java | 0 .../messaging/datamodel/media/MediaBytes.java | 0 .../messaging/datamodel/media/MediaCache.java | 0 .../datamodel/media/MediaCacheManager.java | 0 .../datamodel/media/MediaRequest.java | 0 .../media/MediaRequestDescriptor.java | 0 .../datamodel/media/MediaResourceManager.java | 0 .../MessagePartImageRequestDescriptor.java | 0 ...gePartVideoThumbnailRequestDescriptor.java | 0 .../media/NetworkUriImageRequest.java | 0 .../datamodel/media/PoolableImageCache.java | 0 .../media/RefCountedMediaResource.java | 0 .../media/SimSelectorAvatarRequest.java | 0 .../datamodel/media/UriImageRequest.java | 0 .../media/UriImageRequestDescriptor.java | 0 .../datamodel/media/VCardRequest.java | 0 .../media/VCardRequestDescriptor.java | 0 .../datamodel/media/VCardResource.java | 0 .../datamodel/media/VCardResourceEntry.java | 0 .../media/VideoThumbnailRequest.java | 0 .../android/messaging/mmslib/Downloads.java | 0 .../messaging/mmslib/SqliteWrapper.java | 0 .../messaging/mmslib/pdu/PduComposer.java | 0 .../messaging/mmslib/pdu/PduPersister.java | 0 .../messaging/mmslib/util/AbstractCache.java | 0 .../mmslib/util/DownloadDrmHelper.java | 0 .../mmslib/util/DrmConvertSession.java | 0 .../messaging/mmslib/util/PduCache.java | 0 .../messaging/mmslib/util/PduCacheEntry.java | 0 .../BootAndPackageReplacedReceiver.java | 0 .../DefaultSmsSubscriptionChangeReceiver.java | 0 .../receiver/MmsWapPushDeliverReceiver.java | 0 .../receiver/NotificationReceiver.java | 0 .../receiver/SendStatusReceiver.java | 0 .../receiver/SmsDeliverReceiver.java | 0 .../messaging/receiver/SmsReceiver.java | 0 .../messaging/sms/ApnsXmlProcessor.java | 0 .../messaging/sms/BugleApnSettingsLoader.java | 0 .../sms/BugleCarrierConfigValuesLoader.java | 0 .../sms/BugleUserAgentInfoLoader.java | 0 .../messaging/sms/DatabaseMessages.java | 0 .../com/android/messaging/sms/MmsConfig.java | 0 .../messaging/sms/MmsFailureException.java | 0 .../com/android/messaging/sms/MmsSender.java | 0 .../android/messaging/sms/MmsSmsUtils.java | 0 .../com/android/messaging/sms/MmsUtils.java | 0 .../com/android/messaging/sms/SmsSender.java | 0 .../android/messaging/ui/AsyncImageView.java | 0 .../messaging/ui/AttachmentPreview.java | 0 .../ui/AttachmentPreviewFactory.java | 0 .../ui/AudioAttachmentPlayPauseButton.java | 0 .../messaging/ui/AudioAttachmentView.java | 0 .../ui/AudioPlaybackProgressBar.java | 0 .../messaging/ui/BaseBugleActivity.java | 0 .../ui/BaseBugleFragmentActivity.java | 0 .../messaging/ui/BasePagerViewHolder.java | 0 .../ui/BlockedParticipantListItemView.java | 0 .../ui/BlockedParticipantsActivity.java | 0 .../ui/BlockedParticipantsFragment.java | 0 .../messaging/ui/BugleActionBarActivity.java | 9 + .../messaging/ui/ClassZeroActivity.java | 0 .../messaging/ui/CompositeAdapter.java | 0 .../android/messaging/ui/ContactIconView.java | 0 .../messaging/ui/ConversationDrawables.java | 11 +- .../messaging/ui/CursorRecyclerAdapter.java | 0 .../ui/CustomHeaderPagerListViewHolder.java | 0 .../ui/CustomHeaderPagerViewHolder.java | 0 .../messaging/ui/CustomHeaderViewPager.java | 0 .../ui/CustomHeaderViewPagerAdapter.java | 0 .../messaging/ui/FixedViewPagerAdapter.java | 0 .../messaging/ui/ImeDetectFrameLayout.java | 0 .../android/messaging/ui/LicenseActivity.java | 0 .../android/messaging/ui/LineWrapLayout.java | 0 .../android/messaging/ui/ListEmptyView.java | 0 .../messaging/ui/MaxHeightScrollView.java | 0 .../messaging/ui/MultiAttachmentLayout.java | 0 .../messaging/ui/OrientedBitmapDrawable.java | 0 .../android/messaging/ui/PagerViewHolder.java | 0 .../messaging/ui/PagingAwareViewPager.java | 0 .../messaging/ui/PermissionCheckActivity.java | 0 .../messaging/ui/PersistentInstanceState.java | 0 .../android/messaging/ui/PersonItemView.java | 0 .../ui/PlaceholderInsetDrawable.java | 0 .../messaging/ui/PlainTextEditText.java | 0 .../messaging/ui/PlaybackStateView.java | 0 .../ui/RemoteInputEntrypointActivity.java | 0 .../com/android/messaging/ui/SnackBar.java | 0 .../messaging/ui/SnackBarInteraction.java | 0 .../android/messaging/ui/SnackBarManager.java | 0 .../com/android/messaging/ui/UIIntents.java | 0 .../android/messaging/ui/UIIntentsImpl.java | 0 .../messaging/ui/VCardDetailActivity.java | 0 .../messaging/ui/VCardDetailAdapter.java | 0 .../messaging/ui/VCardDetailFragment.java | 0 .../messaging/ui/VideoThumbnailView.java | 0 .../messaging/ui/ViewPagerTabStrip.java | 0 .../android/messaging/ui/ViewPagerTabs.java | 0 .../ui/WidgetPickConversationActivity.java | 0 .../animation/PopupTransitionAnimation.java | 0 .../ui/animation/RectEvaluatorCompat.java | 0 ...ViewGroupItemVerticalExplodeAnimation.java | 0 .../ApplicationSettingsActivity.java | 0 .../ui/appsettings/GroupMmsSettingDialog.java | 0 .../PerSubscriptionSettingsActivity.java | 0 .../ui/appsettings/PhoneNumberPreference.java | 0 .../ui/appsettings/SettingsActivity.java | 0 .../AttachmentChooserActivity.java | 0 .../AttachmentChooserFragment.java | 0 .../AttachmentGridItemView.java | 0 .../attachmentchooser/AttachmentGridView.java | 0 .../AddContactsConfirmationDialog.java | 0 .../ui/contact/AllContactsListViewHolder.java | 0 .../ui/contact/ContactDropdownLayouter.java | 0 .../ui/contact/ContactListAdapter.java | 0 .../ui/contact/ContactListItemView.java | 0 .../ui/contact/ContactPickerFragment.java | 15 +- .../ui/contact/ContactRecipientAdapter.java | 0 .../ContactRecipientAutoCompleteView.java | 0 .../contact/ContactRecipientPhotoManager.java | 0 .../ui/contact/ContactSectionIndexer.java | 0 .../FrequentContactsListViewHolder.java | 0 .../ui/conversation/ComposeMessageView.java | 0 .../ui/conversation/ConversationActivity.java | 0 .../ConversationActivityUiState.java | 0 .../ConversationFastScroller.java | 0 .../ui/conversation/ConversationFragment.java | 0 .../ui/conversation/ConversationInput.java | 0 .../ConversationInputManager.java | 0 .../ConversationMessageAdapter.java | 0 .../ConversationMessageBubbleView.java | 0 .../conversation/ConversationMessageView.java | 0 .../conversation/ConversationSimSelector.java | 0 .../EnterSelfPhoneNumberDialog.java | 0 .../LaunchConversationActivity.java | 0 .../conversation/MessageBubbleBackground.java | 0 .../ui/conversation/MessageDetailsDialog.java | 0 .../ui/conversation/SimIconView.java | 0 .../ui/conversation/SimSelectorItemView.java | 0 .../ui/conversation/SimSelectorView.java | 0 .../AbstractConversationListActivity.java | 44 +- .../ArchivedConversationListActivity.java | 0 .../ConversationListActivity.java | 55 +- .../ConversationListAdapter.java | 442 ++++++ .../ConversationListFragment.java | 1239 +++++++++++++++++ .../ConversationListItemView.java | 227 ++- .../ConversationListSwipeHelper.java | 0 .../ForwardMessageActivity.java | 0 .../MultiSelectActionModeCallback.java | 28 +- .../conversationlist/ShareIntentActivity.java | 0 .../conversationlist/ShareIntentAdapter.java | 0 .../conversationlist/ShareIntentFragment.java | 0 .../CopyContactDetailDialog.java | 0 .../PeopleAndOptionsActivity.java | 0 .../PeopleAndOptionsFragment.java | 0 .../PeopleOptionsItemView.java | 0 .../ui/home/HomeContactListAdapter.java | 34 + .../ui/home/HomeContactsFragment.java | 148 ++ .../messaging/ui/home/HomePinnedStrip.java | 418 ++++++ .../ui/home/PinnedConversationStore.java | 130 ++ .../ui/mediapicker/AudioLevelSource.java | 0 .../ui/mediapicker/AudioMediaChooser.java | 0 .../ui/mediapicker/AudioRecordView.java | 0 .../ui/mediapicker/CameraMediaChooser.java | 0 .../ui/mediapicker/ContactMediaChooser.java | 0 .../ui/mediapicker/DocumentImagePicker.java | 0 .../ui/mediapicker/GalleryMediaChooser.java | 0 .../LevelTrackingMediaRecorder.java | 0 .../ui/mediapicker/MediaChooser.java | 0 .../messaging/ui/mediapicker/MediaPicker.java | 0 .../ui/mediapicker/MediaPickerGridView.java | 0 .../ui/mediapicker/MediaPickerPanel.java | 0 .../ui/mediapicker/PausableChronometer.java | 0 .../messaging/ui/mediapicker/SoundLevels.java | 0 .../photoviewer/BuglePhotoBitmapLoader.java | 0 .../ui/photoviewer/BuglePhotoPageAdapter.java | 0 .../photoviewer/BuglePhotoViewActivity.java | 0 .../photoviewer/BuglePhotoViewController.java | 0 .../photoviewer/BuglePhotoViewFragment.java | 0 .../messaging/util/AccessibilityUtil.java | 0 .../com/android/messaging/util/Assert.java | 0 .../android/messaging/util/AvatarUriUtil.java | 0 .../messaging/util/BugleActivityUtil.java | 0 .../messaging/util/BugleApplicationPrefs.java | 0 .../messaging/util/BugleGservicesKeys.java | 0 .../android/messaging/util/BuglePrefs.java | 0 .../messaging/util/BuglePrefsImpl.java | 0 .../messaging/util/BuglePrefsKeys.java | 0 .../util/BugleSubscriptionPrefs.java | 0 .../messaging/util/BugleWidgetPrefs.java | 0 .../util/ChangeDefaultSmsAppHelper.java | 0 .../messaging/util/ConnectivityUtil.java | 0 .../util/ContactRecipientEntryUtils.java | 0 .../android/messaging/util/ContactUtil.java | 0 .../messaging/util/ConversationIdSet.java | 0 .../util/CubicBezierInterpolator.java | 0 .../com/android/messaging/util/Dates.java | 0 .../android/messaging/util/DebugUtils.java | 0 .../android/messaging/util/EmailAddress.java | 0 .../messaging/util/FallbackStrategies.java | 0 .../com/android/messaging/util/FileUtil.java | 0 .../android/messaging/util/GifTranscoder.java | 13 +- .../android/messaging/util/ImageUtils.java | 0 .../com/android/messaging/util/ImeUtil.java | 0 .../android/messaging/util/LinkifyHelper.java | 0 .../com/android/messaging/util/LogUtil.java | 0 .../android/messaging/util/LoggingTimer.java | 0 .../util/MediaMetadataRetrieverWrapper.java | 0 .../com/android/messaging/util/MediaUtil.java | 0 .../android/messaging/util/MediaUtilImpl.java | 0 .../messaging/util/NotificationPlayer.java | 0 .../messaging/util/NotificationsUtil.java | 0 .../com/android/messaging/util/OsUtil.java | 0 .../util/PendingIntentConstants.java | 0 .../android/messaging/util/PhoneUtils.java | 0 .../com/android/messaging/util/TextUtil.java | 0 .../android/messaging/util/ThreadUtil.java | 0 .../com/android/messaging/util/Trace.java | 0 .../com/android/messaging/util/Typefaces.java | 0 .../com/android/messaging/util/UiUtils.java | 0 .../com/android/messaging/util/UriUtil.java | 0 .../android/messaging/util/VersionUtil.java | 0 .../android/messaging/util/YouTubeUtil.java | 0 .../messaging/util/exif/ExifInterface.java | 0 .../messaging/widget/BaseWidgetFactory.java | 0 .../messaging/widget/BaseWidgetProvider.java | 0 .../messaging/widget/BugleWidgetProvider.java | 0 .../widget/WidgetConversationListService.java | 0 .../widget/WidgetConversationProvider.java | 0 .../widget/WidgetConversationService.java | 0 .../lineageos/messaging/util/PrefsUtils.java | 0 app/src/main/jni/Android.bp | 40 + app/src/main/jni/GifTranscoder.cpp | 583 ++++++++ app/src/main/jni/GifTranscoder.h | 122 ++ .../src/main/res}/color/tab_text_color.xml | 6 +- .../contact_popup_background.9.png | Bin .../drawable-hdpi/ic_failed_status_red.png | Bin .../res}/drawable-hdpi/ic_oobe_conv_list.png | Bin .../res}/drawable-hdpi/ic_oobe_freq_list.png | Bin .../res}/drawable-hdpi/ic_preview_pause.png | Bin .../res}/drawable-hdpi/ic_preview_play.png | Bin .../res}/drawable-hdpi/ic_remove_light.png | Bin .../res}/drawable-hdpi/ic_sim_card_send.png | Bin .../res}/drawable-hdpi/ic_sms_delivery_ok.png | Bin .../main/res}/drawable-hdpi/ic_sms_light.png | Bin .../res}/drawable-hdpi/ic_sms_multi_light.png | Bin .../drawable-hdpi/ic_widget_avatar_shadow.png | Bin .../main/res}/drawable-hdpi/permissions.png | Bin .../res}/drawable-hdpi/swipe_shadow.9.png | Bin .../drawable-hdpi/swipe_shadow_drag.9.png | Bin .../main/res}/drawable-hdpi/widget_hr.9.png | Bin .../widget_msg_bubble_incoming.9.png | Bin .../widget_msg_bubble_outgoing.9.png | Bin .../contact_popup_background.9.png | Bin .../drawable-mdpi/ic_failed_status_red.png | Bin .../res}/drawable-mdpi/ic_oobe_conv_list.png | Bin .../res}/drawable-mdpi/ic_oobe_freq_list.png | Bin .../res}/drawable-mdpi/ic_preview_pause.png | Bin .../res}/drawable-mdpi/ic_preview_play.png | Bin .../res}/drawable-mdpi/ic_remove_light.png | Bin .../res}/drawable-mdpi/ic_sim_card_send.png | Bin .../res}/drawable-mdpi/ic_sms_delivery_ok.png | Bin .../main/res}/drawable-mdpi/ic_sms_light.png | Bin .../res}/drawable-mdpi/ic_sms_multi_light.png | Bin .../drawable-mdpi/ic_widget_avatar_shadow.png | Bin .../main/res}/drawable-mdpi/permissions.png | Bin .../res}/drawable-mdpi/swipe_shadow.9.png | Bin .../drawable-mdpi/swipe_shadow_drag.9.png | Bin .../main/res}/drawable-mdpi/widget_hr.9.png | Bin .../widget_msg_bubble_incoming.9.png | Bin .../widget_msg_bubble_outgoing.9.png | Bin .../messenger_widget_conversation_preview.png | Bin .../messenger_widget_preview.png | Bin .../contact_popup_background.9.png | Bin .../drawable-xhdpi/ic_failed_status_red.png | Bin .../res}/drawable-xhdpi/ic_oobe_conv_list.png | Bin .../res}/drawable-xhdpi/ic_oobe_freq_list.png | Bin .../res}/drawable-xhdpi/ic_preview_pause.png | Bin .../res}/drawable-xhdpi/ic_preview_play.png | Bin .../res}/drawable-xhdpi/ic_remove_light.png | Bin .../res}/drawable-xhdpi/ic_sim_card_send.png | Bin .../drawable-xhdpi/ic_sms_delivery_ok.png | Bin .../main/res}/drawable-xhdpi/ic_sms_light.png | Bin .../drawable-xhdpi/ic_sms_multi_light.png | Bin .../ic_widget_avatar_shadow.png | Bin .../main/res}/drawable-xhdpi/permissions.png | Bin .../res}/drawable-xhdpi/swipe_shadow.9.png | Bin .../drawable-xhdpi/swipe_shadow_drag.9.png | Bin .../main/res}/drawable-xhdpi/widget_hr.9.png | Bin .../widget_msg_bubble_incoming.9.png | Bin .../widget_msg_bubble_outgoing.9.png | Bin .../contact_popup_background.9.png | Bin .../drawable-xxhdpi/ic_failed_status_red.png | Bin .../drawable-xxhdpi/ic_oobe_conv_list.png | Bin .../drawable-xxhdpi/ic_oobe_freq_list.png | Bin .../res}/drawable-xxhdpi/ic_preview_pause.png | Bin .../res}/drawable-xxhdpi/ic_preview_play.png | Bin .../res}/drawable-xxhdpi/ic_remove_light.png | Bin .../res}/drawable-xxhdpi/ic_sim_card_send.png | Bin .../drawable-xxhdpi/ic_sms_delivery_ok.png | Bin .../res}/drawable-xxhdpi/ic_sms_light.png | Bin .../drawable-xxhdpi/ic_sms_multi_light.png | Bin .../ic_widget_avatar_shadow.png | Bin .../main/res}/drawable-xxhdpi/permissions.png | Bin .../res}/drawable-xxhdpi/swipe_shadow.9.png | Bin .../drawable-xxhdpi/swipe_shadow_drag.9.png | Bin .../main/res}/drawable-xxhdpi/widget_hr.9.png | Bin .../widget_msg_bubble_incoming.9.png | Bin .../widget_msg_bubble_outgoing.9.png | Bin .../contact_popup_background.9.png | Bin .../drawable-xxxhdpi/ic_failed_status_red.png | Bin .../drawable-xxxhdpi/ic_oobe_conv_list.png | Bin .../drawable-xxxhdpi/ic_oobe_freq_list.png | Bin .../drawable-xxxhdpi/ic_preview_pause.png | Bin .../res}/drawable-xxxhdpi/ic_preview_play.png | Bin .../res}/drawable-xxxhdpi/ic_remove_light.png | Bin .../drawable-xxxhdpi/ic_sim_card_send.png | Bin .../drawable-xxxhdpi/ic_sms_delivery_ok.png | Bin .../res}/drawable-xxxhdpi/ic_sms_light.png | Bin .../drawable-xxxhdpi/ic_sms_multi_light.png | Bin .../ic_widget_avatar_shadow.png | Bin .../res}/drawable-xxxhdpi/permissions.png | Bin .../res}/drawable-xxxhdpi/swipe_shadow.9.png | Bin .../drawable-xxxhdpi/swipe_shadow_drag.9.png | Bin .../res}/drawable-xxxhdpi/widget_hr.9.png | Bin .../widget_msg_bubble_incoming.9.png | Bin .../widget_msg_bubble_outgoing.9.png | Bin .../attachment_audio_preview_background.xml | 0 ...ttachment_image_placeholder_background.xml | 0 .../attachment_more_items_background.xml | 0 .../attachment_vcard_preview_background.xml | 0 ...audio_progress_bar_background_incoming.xml | 0 ...audio_progress_bar_background_outgoing.xml | 0 .../drawable/audio_progress_bar_progress.xml | 0 ...audio_record_control_button_background.xml | 0 .../drawable/chips_dropdown_background.xml | 0 .../drawable/chips_dropdown_text_color.xml | 0 .../compose_chips_divider_gradient.xml | 0 ...contact_picker_tab_background_selector.xml | 0 .../contacts_fastscroll_label_left.xml | 0 .../contacts_fastscroll_label_right.xml | 0 .../conversation_compose_divider_gradient.xml | 0 .../res}/drawable/fastscroll_preview_left.xml | 0 .../drawable/fastscroll_preview_right.xml | 0 .../main/res}/drawable/fastscroll_thumb.xml | 0 .../drawable/fastscroll_thumb_pressed.xml | 0 .../main/res}/drawable/fastscroll_track.xml | 0 .../drawable/gallery_checkbox_selector.xml | 0 app/src/main/res/drawable/home_bg_chip.xml | 6 + app/src/main/res/drawable/home_bg_circle.xml | 39 + .../res/drawable/home_bg_contacts_card.xml | 6 + .../main/res/drawable/home_bg_dock_fab.xml | 42 + .../main/res/drawable/home_bg_dock_pill.xml | 44 + app/src/main/res/drawable/home_bg_fab.xml | 6 + .../main/res/drawable/home_bg_main_nav.xml | 8 + .../main/res/drawable/home_bg_nav_active.xml | 9 + .../drawable/home_bg_nav_active_primary.xml | 6 + app/src/main/res/drawable/home_bg_pill.xml | 9 + .../main/res/drawable/home_bg_pin_active.xml | 5 + .../res/drawable/home_bg_pin_inactive.xml | 5 + .../home_bg_pinned_preview_bubble.xml | 9 + .../res/drawable/home_bg_pinned_remove.xml | 5 + app/src/main/res/drawable/home_bg_popover.xml | 9 + .../res/drawable/home_bg_popover_item.xml | 13 + .../res/drawable/home_bg_search_bar_outer.xml | 11 + .../res/drawable/home_bg_search_field.xml | 39 + .../drawable/home_bg_search_field_inner.xml | 6 + .../res/drawable/home_bg_selection_ring.xml | 16 + .../home_bg_selection_ring_checked.xml | 5 + .../main/res/drawable/home_bg_sim_badge.xml | 6 + .../main/res/drawable/home_bg_unread_dot.xml | 5 + .../res/drawable/home_pinned_preview_tail.xml | 17 + .../src/main/res}/drawable/ic_add_white.xml | 0 .../res}/drawable/ic_archive_small_dark.xml | 0 .../drawable/ic_archive_undo_small_dark.xml | 0 .../res}/drawable/ic_arrow_back_light.xml | 0 .../main/res}/drawable/ic_attachment_dark.xml | 0 .../src/main/res}/drawable/ic_audio_light.xml | 0 .../main/res}/drawable/ic_camera_light.xml | 0 .../res}/drawable/ic_cancel_small_light.xml | 0 .../res}/drawable/ic_checkbox_blank_light.xml | 0 .../main/res}/drawable/ic_checkbox_light.xml | 0 .../drawable/ic_checkmark_circle_blue.xml | 0 .../drawable/ic_checkmark_circle_primary.xml | 10 + .../main/res}/drawable/ic_checkmark_light.xml | 0 .../res}/drawable/ic_content_copy_light.xml | 0 .../res}/drawable/ic_delete_small_dark.xml | 0 .../main/res}/drawable/ic_dnd_on_light.xml | 0 .../main/res}/drawable/ic_failed_light.xml | 0 .../res}/drawable/ic_file_download_light.xml | 0 .../main/res}/drawable/ic_forward_light.xml | 0 app/src/main/res/drawable/ic_home_add.xml | 18 + app/src/main/res/drawable/ic_home_check.xml | 6 + app/src/main/res/drawable/ic_home_chevron.xml | 10 + app/src/main/res/drawable/ic_home_compose.xml | 7 + .../res/drawable/ic_home_compose_line.xml | 25 + app/src/main/res/drawable/ic_home_filter.xml | 7 + .../main/res/drawable/ic_home_menu_lines.xml | 11 + .../res/drawable/ic_home_menu_messages.xml | 6 + .../main/res/drawable/ic_home_menu_person.xml | 6 + .../main/res/drawable/ic_home_menu_pin.xml | 6 + .../main/res/drawable/ic_home_menu_select.xml | 6 + .../main/res/drawable/ic_home_menu_spam.xml | 7 + .../main/res/drawable/ic_home_menu_trash.xml | 6 + .../main/res/drawable/ic_home_menu_unread.xml | 8 + app/src/main/res/drawable/ic_home_mic.xml | 6 + .../res/drawable/ic_home_nav_automate.xml | 12 + .../main/res/drawable/ic_home_nav_calls.xml | 10 + .../main/res/drawable/ic_home_nav_chats.xml | 16 + .../main/res/drawable/ic_home_nav_compose.xml | 12 + .../res/drawable/ic_home_nav_contacts.xml | 11 + .../res/drawable/ic_home_nav_messages.xml | 11 + .../res/drawable/ic_home_nav_settings.xml | 10 + .../res/drawable/ic_home_pinned_remove.xml | 10 + .../main/res/drawable/ic_home_search_line.xml | 19 + .../src/main/res}/drawable/ic_image_light.xml | 0 .../src/main/res}/drawable/ic_ime_light.xml | 0 .../src/main/res}/drawable/ic_info_light.xml | 0 .../res}/drawable/ic_launcher_background.xml | 0 .../res}/drawable/ic_launcher_foreground.xml | 0 .../res}/drawable/ic_launcher_monochrome.xml | 0 .../main/res/drawable/ic_looply_automate.xml | 10 + app/src/main/res/drawable/ic_looply_back.xml | 14 + .../main/res/drawable/ic_looply_contacts.xml | 10 + app/src/main/res/drawable/ic_looply_more.xml | 10 + .../main/res/drawable/ic_looply_search.xml | 10 + .../src/main/res}/drawable/ic_message.xml | 0 .../main/res}/drawable/ic_mp_audio_mic.xml | 0 .../res}/drawable/ic_mp_video_small_light.xml | 0 .../main/res}/drawable/ic_numeric_dialpad.xml | 0 .../src/main/res}/drawable/ic_pause_light.xml | 0 .../res}/drawable/ic_people_add_light.xml | 0 .../res}/drawable/ic_person_add_light.xml | 0 .../main/res}/drawable/ic_person_light.xml | 0 .../res}/drawable/ic_phone_small_light.xml | 0 .../src/main/res}/drawable/ic_play_light.xml | 0 .../src/main/res}/drawable/ic_save_light.xml | 0 .../src/main/res}/drawable/ic_send_light.xml | 0 .../src/main/res}/drawable/ic_share_light.xml | 0 .../src/main/res}/drawable/ic_sms_light.xml | 0 .../src/main/res}/drawable/ic_wear_reply.xml | 0 .../src/main/res}/drawable/ic_widget_list.xml | 0 .../main/res}/drawable/ic_work_profile.xml | 0 .../drawable/looply_bg_avatar_placeholder.xml | 5 + app/src/main/res/drawable/looply_bg_badge.xml | 5 + .../drawable/looply_bg_bubble_incoming.xml | 10 + .../drawable/looply_bg_bubble_outgoing.xml | 10 + .../res/drawable/looply_bg_button_primary.xml | 6 + .../drawable/looply_bg_button_secondary.xml | 6 + app/src/main/res/drawable/looply_bg_card.xml | 6 + .../res/drawable/looply_bg_chip_active.xml | 6 + .../res/drawable/looply_bg_chip_inactive.xml | 6 + app/src/main/res/drawable/looply_bg_fab.xml | 5 + .../res/drawable/looply_bg_fab_square.xml | 6 + app/src/main/res/drawable/looply_bg_input.xml | 9 + .../main/res/drawable/looply_bg_list_card.xml | 6 + .../res/drawable/looply_bg_list_sheet.xml | 8 + .../drawable/looply_bg_nav_active_circle.xml | 5 + .../drawable/looply_bg_nav_active_pill.xml | 6 + .../drawable/looply_bg_nav_floating_pill.xml | 9 + .../res/drawable/looply_bg_online_dot.xml | 8 + .../main/res/drawable/looply_bg_search.xml | 6 + .../mediapicker_tab_button_background.xml | 0 .../message_bubble_incoming_no_arrow.xml | 6 +- .../message_bubble_outgoing_no_arrow.xml | 6 +- .../drawable/msg_bubble_input_rounded.xml | 0 .../res}/drawable/send_arrow_background.xml | 0 .../sim_selector_background_gradient.xml | 0 .../res}/drawable/subject_editor_bubble.xml | 0 .../transparent_button_background.xml | 0 .../drawable/widget_bottom_background.xml | 0 .../res}/drawable/widget_item_background.xml | 0 .../res}/drawable/widget_top_background.xml | 0 .../layout/action_bar_conversation_name.xml | 0 .../add_contacts_confirmation_dialog_body.xml | 0 .../res}/layout/all_contacts_list_view.xml | 0 .../layout/attachment_chooser_activity.xml | 0 .../res}/layout/attachment_chooser_audio.xml | 0 .../layout/attachment_chooser_fragment.xml | 0 .../res}/layout/attachment_chooser_image.xml | 0 .../res}/layout/attachment_chooser_vcard.xml | 0 .../res}/layout/attachment_chooser_video.xml | 0 .../res}/layout/attachment_grid_item_view.xml | 0 .../res}/layout/attachment_more_text_view.xml | 0 .../res}/layout/attachment_multiple_audio.xml | 0 .../res}/layout/attachment_multiple_image.xml | 0 .../res}/layout/attachment_multiple_vcard.xml | 0 .../res}/layout/attachment_multiple_video.xml | 0 .../res}/layout/attachment_pending_item.xml | 0 .../main/res}/layout/attachment_preview.xml | 0 .../res}/layout/attachment_single_audio.xml | 0 .../res}/layout/attachment_single_image.xml | 0 .../res}/layout/attachment_single_vcard.xml | 0 .../res}/layout/attachment_single_video.xml | 0 .../res}/layout/audio_attachment_view.xml | 0 .../blocked_participant_list_item_view.xml | 0 .../layout/blocked_participants_activity.xml | 0 .../layout/blocked_participants_fragment.xml | 0 .../layout/chips_alternates_dropdown_item.xml | 0 .../main/res}/layout/compose_message_view.xml | 0 .../res}/layout/contact_list_item_view.xml | 72 +- .../res/layout/contact_picker_fragment.xml | 108 ++ .../res}/layout/conversation_activity.xml | 0 .../res}/layout/conversation_fragment.xml | 0 .../res/layout/conversation_list_fragment.xml | 401 ++++++ .../layout/conversation_list_item_view.xml | 302 ++++ .../res}/layout/conversation_message_view.xml | 0 .../res}/layout/copy_contact_dialog_view.xml | 0 .../res}/layout/custom_header_view_pager.xml | 0 .../res}/layout/enter_phone_number_view.xml | 0 .../main/res}/layout/fastscroll_preview.xml | 0 .../src/main/res}/layout/fastscroll_thumb.xml | 0 .../src/main/res}/layout/fastscroll_track.xml | 0 .../layout/frequent_contacts_list_view.xml | 0 .../res}/layout/group_mms_setting_dialog.xml | 0 .../res/layout/home_bottom_nav_tab_item.xml | 39 + .../res/layout/home_contacts_fragment.xml | 180 +++ .../res/layout/home_contacts_list_item.xml | 74 + app/src/main/res/layout/home_pinned_item.xml | 130 ++ app/src/main/res/layout/home_pinned_strip.xml | 21 + app/src/main/res/layout/home_popover_edit.xml | 78 ++ .../main/res/layout/home_popover_filter.xml | 228 +++ .../src/main/res}/layout/license_activity.xml | 0 .../src/main/res}/layout/list_empty_view.xml | 0 app/src/main/res/layout/looply_bottom_nav.xml | 110 ++ .../main/res/layout/looply_button_primary.xml | 11 + .../main/res/layout/looply_chat_list_item.xml | 96 ++ .../res/layout/looply_components_preview.xml | 191 +++ .../main/res/layout/looply_compose_bar.xml | 33 + .../main/res/layout/looply_filter_chips.xml | 41 + .../res/layout/looply_message_bubbles.xml | 27 + app/src/main/res/layout/looply_search_bar.xml | 31 + .../res}/layout/mediapicker_audio_chooser.xml | 0 .../layout/mediapicker_camera_chooser.xml | 0 .../layout/mediapicker_contact_chooser.xml | 0 .../main/res}/layout/mediapicker_fragment.xml | 0 .../layout/mediapicker_gallery_chooser.xml | 0 .../res}/layout/mediapicker_tab_button.xml | 0 .../res}/layout/message_audio_attachment.xml | 0 .../res}/layout/message_vcard_attachment.xml | 0 .../res}/layout/message_video_attachment.xml | 0 .../layout/people_and_options_activity.xml | 0 .../layout/people_and_options_fragment.xml | 0 .../people_and_options_section_header.xml | 0 .../res}/layout/people_list_item_view.xml | 0 .../res}/layout/people_options_item_view.xml | 0 .../res}/layout/permission_check_activity.xml | 0 .../src/main/res}/layout/person_item_view.xml | 0 .../layout/preference_material_switch.xml | 0 .../main/res}/layout/settings_fragment.xml | 0 .../main/res}/layout/settings_item_view.xml | 0 .../share_intent_conversation_list_view.xml | 0 .../res}/layout/sim_selector_item_view.xml | 0 .../main/res}/layout/sim_selector_view.xml | 0 .../src/main/res}/layout/snack_bar.xml | 0 .../res}/layout/vcard_detail_activity.xml | 0 .../res}/layout/vcard_detail_fragment.xml | 0 .../main/res}/layout/video_thumbnail_view.xml | 0 .../main/res}/layout/widget_conversation.xml | 0 .../res}/layout/widget_conversation_list.xml | 0 .../layout/widget_conversation_list_item.xml | 0 .../src/main/res}/layout/widget_loading.xml | 0 .../layout/widget_message_item_incoming.xml | 0 .../layout/widget_message_item_outgoing.xml | 0 .../res}/layout/widget_missing_permission.xml | 0 .../res}/layout/work_directory_header.xml | 0 .../res}/menu/attachment_chooser_menu.xml | 0 .../src/main/res}/menu/compose_menu.xml | 0 .../conversation_fragment_select_menu.xml | 0 .../menu/conversation_list_fragment_menu.xml | 0 ...conversation_list_fragment_select_menu.xml | 0 .../src/main/res}/menu/conversation_menu.xml | 0 .../src/main/res}/menu/photo_view_menu.xml | 0 .../src/main/res}/menu/settings_menu.xml | 0 .../res}/menu/vcard_detail_fragment_menu.xml | 0 .../main/res}/mipmap-anydpi/ic_launcher.xml | 0 {res => app/src/main/res}/raw/audio_end.wav | Bin .../src/main/res}/raw/audio_initiate.wav | Bin .../src/main/res}/raw/message_failure.wav | Bin .../src/main/res}/raw/message_sent.wav | Bin .../src/main/res}/values-af/arrays.xml | 0 .../src/main/res}/values-af/cm_strings.xml | 0 .../src/main/res}/values-af/strings.xml | 0 .../src/main/res}/values-am/arrays.xml | 0 .../src/main/res}/values-am/strings.xml | 0 .../src/main/res}/values-ar/arrays.xml | 0 .../src/main/res}/values-ar/cm_strings.xml | 0 .../src/main/res}/values-ar/strings.xml | 0 .../src/main/res}/values-as/cm_strings.xml | 0 .../main/res}/values-ast-rES/cm_strings.xml | 0 .../src/main/res}/values-az/arrays.xml | 0 .../src/main/res}/values-az/cm_strings.xml | 0 .../src/main/res}/values-az/strings.xml | 0 .../src/main/res}/values-be/cm_strings.xml | 0 .../src/main/res}/values-bg/arrays.xml | 0 .../src/main/res}/values-bg/cm_strings.xml | 0 .../src/main/res}/values-bg/strings.xml | 0 .../src/main/res}/values-bn/arrays.xml | 0 .../src/main/res}/values-bn/strings.xml | 0 .../src/main/res}/values-bs/cm_strings.xml | 0 .../src/main/res}/values-ca/arrays.xml | 0 .../src/main/res}/values-ca/cm_strings.xml | 0 .../src/main/res}/values-ca/strings.xml | 0 .../src/main/res}/values-ckb/cm_strings.xml | 0 .../src/main/res}/values-cs/arrays.xml | 0 .../src/main/res}/values-cs/cm_strings.xml | 0 .../src/main/res}/values-cs/strings.xml | 0 .../src/main/res}/values-cy/cm_strings.xml | 0 .../src/main/res}/values-da/arrays.xml | 0 .../src/main/res}/values-da/cm_strings.xml | 0 .../src/main/res}/values-da/strings.xml | 0 .../src/main/res}/values-de/arrays.xml | 0 .../src/main/res}/values-de/cm_strings.xml | 0 .../src/main/res}/values-de/strings.xml | 0 .../src/main/res}/values-el/arrays.xml | 0 .../src/main/res}/values-el/cm_strings.xml | 0 .../src/main/res}/values-el/strings.xml | 0 .../src/main/res}/values-en-rAU/arrays.xml | 0 .../main/res}/values-en-rAU/cm_strings.xml | 0 .../src/main/res}/values-en-rAU/strings.xml | 0 .../main/res}/values-en-rCA/cm_strings.xml | 0 .../src/main/res}/values-en-rGB/arrays.xml | 0 .../main/res}/values-en-rGB/cm_strings.xml | 0 .../src/main/res}/values-en-rGB/strings.xml | 0 .../src/main/res}/values-en-rIN/arrays.xml | 0 .../main/res}/values-en-rIN/cm_strings.xml | 0 .../src/main/res}/values-en-rIN/strings.xml | 0 .../main/res}/values-es-rMX/cm_strings.xml | 0 .../src/main/res}/values-es-rUS/arrays.xml | 0 .../main/res}/values-es-rUS/cm_strings.xml | 0 .../src/main/res}/values-es-rUS/strings.xml | 0 .../src/main/res}/values-es/arrays.xml | 0 .../src/main/res}/values-es/cm_strings.xml | 0 .../src/main/res}/values-es/strings.xml | 0 .../src/main/res}/values-et/arrays.xml | 0 .../src/main/res}/values-et/cm_strings.xml | 0 .../src/main/res}/values-et/strings.xml | 0 .../src/main/res}/values-eu/arrays.xml | 0 .../src/main/res}/values-eu/cm_strings.xml | 0 .../src/main/res}/values-eu/strings.xml | 0 .../src/main/res}/values-fa/arrays.xml | 0 .../src/main/res}/values-fa/cm_strings.xml | 0 .../src/main/res}/values-fa/strings.xml | 0 .../src/main/res}/values-fi/arrays.xml | 0 .../src/main/res}/values-fi/cm_strings.xml | 0 .../src/main/res}/values-fi/strings.xml | 0 .../src/main/res}/values-fr-rCA/arrays.xml | 0 .../src/main/res}/values-fr-rCA/strings.xml | 0 .../src/main/res}/values-fr/arrays.xml | 0 .../src/main/res}/values-fr/cm_strings.xml | 0 .../src/main/res}/values-fr/strings.xml | 0 .../main/res}/values-fur-rIT/cm_strings.xml | 0 .../main/res}/values-fy-rNL/cm_strings.xml | 0 .../main/res}/values-ga-rIE/cm_strings.xml | 0 .../src/main/res}/values-gd/cm_strings.xml | 0 .../src/main/res}/values-gl/arrays.xml | 0 .../src/main/res}/values-gl/cm_strings.xml | 0 .../src/main/res}/values-gl/strings.xml | 0 .../src/main/res}/values-gu/arrays.xml | 0 .../src/main/res}/values-gu/cm_strings.xml | 0 .../src/main/res}/values-gu/strings.xml | 0 .../src/main/res}/values-hi/arrays.xml | 0 .../src/main/res}/values-hi/strings.xml | 0 .../src/main/res}/values-hr/arrays.xml | 0 .../src/main/res}/values-hr/cm_strings.xml | 0 .../src/main/res}/values-hr/strings.xml | 0 .../src/main/res}/values-hu/arrays.xml | 0 .../src/main/res}/values-hu/cm_strings.xml | 0 .../src/main/res}/values-hu/strings.xml | 0 .../src/main/res}/values-hy/arrays.xml | 0 .../src/main/res}/values-hy/strings.xml | 0 .../src/main/res}/values-in/arrays.xml | 0 .../src/main/res}/values-in/cm_strings.xml | 0 .../src/main/res}/values-in/strings.xml | 0 .../src/main/res}/values-is/arrays.xml | 0 .../src/main/res}/values-is/cm_strings.xml | 0 .../src/main/res}/values-is/strings.xml | 0 .../src/main/res}/values-it/arrays.xml | 0 .../src/main/res}/values-it/cm_strings.xml | 0 .../src/main/res}/values-it/strings.xml | 0 .../src/main/res}/values-iw/arrays.xml | 0 .../src/main/res}/values-iw/cm_strings.xml | 0 .../src/main/res}/values-iw/strings.xml | 0 .../src/main/res}/values-ja/arrays.xml | 0 .../src/main/res}/values-ja/cm_strings.xml | 0 .../src/main/res}/values-ja/strings.xml | 0 .../src/main/res}/values-ka/arrays.xml | 0 .../src/main/res}/values-ka/cm_strings.xml | 0 .../src/main/res}/values-ka/strings.xml | 0 .../main/res}/values-kab-rDZ/cm_strings.xml | 0 .../src/main/res}/values-kk/arrays.xml | 0 .../src/main/res}/values-kk/strings.xml | 0 .../src/main/res}/values-km/arrays.xml | 0 .../src/main/res}/values-km/strings.xml | 0 .../src/main/res}/values-kn/arrays.xml | 0 .../src/main/res}/values-kn/cm_strings.xml | 0 .../src/main/res}/values-kn/strings.xml | 0 .../src/main/res}/values-ko/arrays.xml | 0 .../src/main/res}/values-ko/cm_strings.xml | 0 .../src/main/res}/values-ko/strings.xml | 0 .../src/main/res}/values-ky/arrays.xml | 0 .../src/main/res}/values-ky/strings.xml | 0 .../src/main/res}/values-lb/cm_strings.xml | 0 .../src/main/res}/values-lo/arrays.xml | 0 .../src/main/res}/values-lo/strings.xml | 0 .../src/main/res}/values-lt/arrays.xml | 0 .../src/main/res}/values-lt/strings.xml | 0 .../src/main/res}/values-lv/arrays.xml | 0 .../src/main/res}/values-lv/strings.xml | 0 .../src/main/res}/values-mk/arrays.xml | 0 .../src/main/res}/values-mk/strings.xml | 0 .../src/main/res}/values-ml/arrays.xml | 0 .../src/main/res}/values-ml/cm_strings.xml | 0 .../src/main/res}/values-ml/strings.xml | 0 .../src/main/res}/values-mn/arrays.xml | 0 .../src/main/res}/values-mn/strings.xml | 0 .../src/main/res}/values-mr/arrays.xml | 0 .../src/main/res}/values-mr/cm_strings.xml | 0 .../src/main/res}/values-mr/strings.xml | 0 .../src/main/res}/values-ms/arrays.xml | 0 .../src/main/res}/values-ms/strings.xml | 0 .../src/main/res}/values-my/arrays.xml | 0 .../src/main/res}/values-my/strings.xml | 0 .../src/main/res}/values-nb/arrays.xml | 0 .../src/main/res}/values-nb/cm_strings.xml | 0 .../src/main/res}/values-nb/strings.xml | 0 .../src/main/res}/values-ne/arrays.xml | 0 .../src/main/res}/values-ne/strings.xml | 0 app/src/main/res/values-night/colors.xml | 23 + .../main/res/values-night/lineage_bools.xml | 5 + .../main/res}/values-night/lineage_colors.xml | 14 +- .../main/res/values-night/looply_colors.xml | 37 + .../main/res/values-night/looply_styles.xml | 12 + app/src/main/res/values-night/styles.xml | 12 + .../src/main/res}/values-nl/arrays.xml | 0 .../src/main/res}/values-nl/cm_strings.xml | 0 .../src/main/res}/values-nl/strings.xml | 0 .../main/res}/values-nn-rNO/cm_strings.xml | 0 .../src/main/res}/values-or/cm_strings.xml | 0 .../src/main/res}/values-pa/arrays.xml | 0 .../src/main/res}/values-pa/strings.xml | 0 .../src/main/res}/values-pl/arrays.xml | 0 .../src/main/res}/values-pl/cm_strings.xml | 0 .../src/main/res}/values-pl/strings.xml | 0 .../main/res}/values-pt-rBR/cm_strings.xml | 0 .../src/main/res}/values-pt-rPT/arrays.xml | 0 .../main/res}/values-pt-rPT/cm_strings.xml | 0 .../src/main/res}/values-pt-rPT/strings.xml | 0 .../src/main/res}/values-pt/arrays.xml | 0 .../src/main/res}/values-pt/strings.xml | 0 .../src/main/res}/values-ro/arrays.xml | 0 .../src/main/res}/values-ro/cm_strings.xml | 0 .../src/main/res}/values-ro/strings.xml | 0 .../src/main/res}/values-ru/arrays.xml | 0 .../src/main/res}/values-ru/cm_strings.xml | 0 .../src/main/res}/values-ru/strings.xml | 0 .../main/res}/values-sc-rIT/cm_strings.xml | 0 .../src/main/res}/values-si/arrays.xml | 0 .../src/main/res}/values-si/strings.xml | 0 .../src/main/res}/values-sk/arrays.xml | 0 .../src/main/res}/values-sk/cm_strings.xml | 0 .../src/main/res}/values-sk/strings.xml | 0 .../src/main/res}/values-sl/arrays.xml | 0 .../src/main/res}/values-sl/cm_strings.xml | 0 .../src/main/res}/values-sl/strings.xml | 0 .../src/main/res}/values-sq/arrays.xml | 0 .../src/main/res}/values-sq/cm_strings.xml | 0 .../src/main/res}/values-sq/strings.xml | 0 .../src/main/res}/values-sr/arrays.xml | 0 .../src/main/res}/values-sr/cm_strings.xml | 0 .../src/main/res}/values-sr/strings.xml | 0 .../src/main/res}/values-sv/arrays.xml | 0 .../src/main/res}/values-sv/cm_strings.xml | 0 .../src/main/res}/values-sv/strings.xml | 0 .../src/main/res}/values-sw/arrays.xml | 0 .../src/main/res}/values-sw/strings.xml | 0 .../src/main/res}/values-ta/arrays.xml | 0 .../src/main/res}/values-ta/cm_strings.xml | 0 .../src/main/res}/values-ta/strings.xml | 0 .../src/main/res}/values-te/arrays.xml | 0 .../src/main/res}/values-te/cm_strings.xml | 0 .../src/main/res}/values-te/strings.xml | 0 .../src/main/res}/values-th/arrays.xml | 0 .../src/main/res}/values-th/cm_strings.xml | 0 .../src/main/res}/values-th/strings.xml | 0 .../src/main/res}/values-tl/arrays.xml | 0 .../src/main/res}/values-tl/strings.xml | 0 .../src/main/res}/values-tr/arrays.xml | 0 .../src/main/res}/values-tr/cm_strings.xml | 0 .../src/main/res}/values-tr/strings.xml | 0 .../src/main/res}/values-ug/cm_strings.xml | 0 .../src/main/res}/values-uk/arrays.xml | 0 .../src/main/res}/values-uk/cm_strings.xml | 0 .../src/main/res}/values-uk/strings.xml | 0 .../src/main/res}/values-ur/arrays.xml | 0 .../src/main/res}/values-ur/strings.xml | 0 .../src/main/res}/values-uz/arrays.xml | 0 .../src/main/res}/values-uz/strings.xml | 0 .../src/main/res}/values-vi/arrays.xml | 0 .../src/main/res}/values-vi/cm_strings.xml | 0 .../src/main/res}/values-vi/strings.xml | 0 .../src/main/res}/values-zh-rCN/arrays.xml | 0 .../main/res}/values-zh-rCN/cm_strings.xml | 0 .../src/main/res}/values-zh-rCN/strings.xml | 0 .../src/main/res}/values-zh-rHK/arrays.xml | 0 .../src/main/res}/values-zh-rHK/strings.xml | 0 .../src/main/res}/values-zh-rTW/arrays.xml | 0 .../main/res}/values-zh-rTW/cm_strings.xml | 0 .../src/main/res}/values-zh-rTW/strings.xml | 0 .../src/main/res}/values-zu/arrays.xml | 0 .../src/main/res}/values-zu/strings.xml | 0 {res => app/src/main/res}/values/arrays.xml | 0 {res => app/src/main/res}/values/attrs.xml | 0 .../src/main/res}/values/cm_strings.xml | 0 {res => app/src/main/res}/values/colors.xml | 129 +- {res => app/src/main/res}/values/config.xml | 0 .../src/main/res}/values/constants.xml | 0 {res => app/src/main/res}/values/dimens.xml | 4 +- app/src/main/res/values/home_colors.xml | 35 + app/src/main/res/values/home_ids.xml | 4 + app/src/main/res/values/home_styles.xml | 39 + .../src/main/res}/values/lineage_bools.xml | 0 .../src/main/res}/values/lineage_colors.xml | 13 +- .../main/res}/values/lineage_constants.xml | 0 app/src/main/res/values/looply_colors.xml | 44 + app/src/main/res/values/looply_dimens.xml | 77 + app/src/main/res/values/looply_strings.xml | 74 + app/src/main/res/values/looply_styles.xml | 158 +++ {res => app/src/main/res}/values/strings.xml | 0 {res => app/src/main/res}/values/styles.xml | 23 +- {res => app/src/main/res}/values/versions.xml | 0 .../main/res}/xml-mcc204-mnc04/mms_config.xml | 0 .../main/res}/xml-mcc208-mnc01/mms_config.xml | 0 .../main/res}/xml-mcc208-mnc10/mms_config.xml | 0 .../main/res}/xml-mcc208-mnc15/mms_config.xml | 0 .../main/res}/xml-mcc208-mnc20/mms_config.xml | 0 .../main/res}/xml-mcc208-mnc26/mms_config.xml | 0 .../main/res}/xml-mcc214-mnc01/mms_config.xml | 0 .../main/res}/xml-mcc214-mnc03/mms_config.xml | 0 .../main/res}/xml-mcc214-mnc07/mms_config.xml | 0 .../main/res}/xml-mcc218-mnc05/mms_config.xml | 0 .../main/res}/xml-mcc222-mnc01/mms_config.xml | 0 .../main/res}/xml-mcc222-mnc08/mms_config.xml | 0 .../main/res}/xml-mcc234-mnc10/mms_config.xml | 0 app/src/main/res/xml-mcc234-mnc11 | 1 + .../main/res}/xml-mcc234-mnc15/mms_config.xml | 0 .../main/res}/xml-mcc238-mnc02/mms_config.xml | 0 .../main/res}/xml-mcc240-mnc01/mms_config.xml | 0 .../main/res}/xml-mcc240-mnc04/mms_config.xml | 0 .../main/res}/xml-mcc240-mnc08/mms_config.xml | 0 .../main/res}/xml-mcc240-mnc24/mms_config.xml | 0 .../main/res}/xml-mcc242-mnc01/mms_config.xml | 0 .../main/res}/xml-mcc242-mnc02/mms_config.xml | 0 .../main/res}/xml-mcc262-mnc07/mms_config.xml | 0 .../main/res}/xml-mcc274-mnc02/mms_config.xml | 0 .../main/res}/xml-mcc274-mnc03/mms_config.xml | 0 .../main/res}/xml-mcc286-mnc01/mms_config.xml | 0 .../main/res}/xml-mcc286-mnc03/mms_config.xml | 0 .../main/res}/xml-mcc294-mnc01/mms_config.xml | 0 .../main/res}/xml-mcc294-mnc02/mms_config.xml | 0 .../main/res}/xml-mcc294-mnc03/mms_config.xml | 0 .../res}/xml-mcc302-mnc220/mms_config.xml | 0 .../res}/xml-mcc302-mnc221/mms_config.xml | 0 .../res}/xml-mcc302-mnc270/mms_config.xml | 0 .../res}/xml-mcc302-mnc290/mms_config.xml | 0 .../res}/xml-mcc302-mnc320/mms_config.xml | 0 .../res}/xml-mcc302-mnc370/mms_config.xml | 0 .../res}/xml-mcc302-mnc490/mms_config.xml | 0 .../res}/xml-mcc302-mnc500/mms_config.xml | 0 .../res}/xml-mcc302-mnc510/mms_config.xml | 0 .../res}/xml-mcc302-mnc520/mms_config.xml | 0 .../res}/xml-mcc302-mnc610/mms_config.xml | 0 .../res}/xml-mcc302-mnc660/mms_config.xml | 0 .../res}/xml-mcc302-mnc720/mms_config.xml | 0 .../res}/xml-mcc302-mnc780/mms_config.xml | 0 .../res}/xml-mcc310-mnc004/mms_config.xml | 0 .../res}/xml-mcc310-mnc005/mms_config.xml | 0 .../res}/xml-mcc310-mnc010/mms_config.xml | 0 .../res}/xml-mcc310-mnc026/mms_config.xml | 0 .../res}/xml-mcc310-mnc040/mms_config.xml | 0 .../res}/xml-mcc310-mnc070/mms_config.xml | 0 .../res}/xml-mcc310-mnc090/mms_config.xml | 0 .../res}/xml-mcc310-mnc120/mms_config.xml | 0 .../res}/xml-mcc310-mnc130/mms_config.xml | 0 .../res}/xml-mcc310-mnc150/mms_config.xml | 0 .../res}/xml-mcc310-mnc170/mms_config.xml | 0 .../res}/xml-mcc310-mnc260/mms_config.xml | 0 .../res}/xml-mcc310-mnc360/mms_config.xml | 0 .../res}/xml-mcc310-mnc380/mms_config.xml | 0 .../res}/xml-mcc310-mnc410/mms_config.xml | 0 .../res}/xml-mcc310-mnc420/mms_config.xml | 0 .../res}/xml-mcc310-mnc450/mms_config.xml | 0 .../res}/xml-mcc310-mnc490/mms_config.xml | 0 .../res}/xml-mcc310-mnc560/mms_config.xml | 0 .../res}/xml-mcc310-mnc580/mms_config.xml | 0 .../res}/xml-mcc310-mnc600/mms_config.xml | 0 .../res}/xml-mcc310-mnc680/mms_config.xml | 0 .../res}/xml-mcc310-mnc750/mms_config.xml | 0 .../res}/xml-mcc310-mnc770/mms_config.xml | 0 .../res}/xml-mcc310-mnc920/mms_config.xml | 0 .../res}/xml-mcc310-mnc980/mms_config.xml | 0 .../res}/xml-mcc311-mnc012/mms_config.xml | 0 .../res}/xml-mcc311-mnc070/mms_config.xml | 0 .../res}/xml-mcc311-mnc100/mms_config.xml | 0 .../res}/xml-mcc311-mnc180/mms_config.xml | 0 .../res}/xml-mcc311-mnc220/mms_config.xml | 0 .../res}/xml-mcc311-mnc221/mms_config.xml | 0 .../res}/xml-mcc311-mnc222/mms_config.xml | 0 .../res}/xml-mcc311-mnc223/mms_config.xml | 0 .../res}/xml-mcc311-mnc224/mms_config.xml | 0 .../res}/xml-mcc311-mnc225/mms_config.xml | 0 .../res}/xml-mcc311-mnc226/mms_config.xml | 0 .../res}/xml-mcc311-mnc227/mms_config.xml | 0 .../res}/xml-mcc311-mnc228/mms_config.xml | 0 .../res}/xml-mcc311-mnc229/mms_config.xml | 0 .../res}/xml-mcc311-mnc230/mms_config.xml | 0 .../res}/xml-mcc311-mnc340/mms_config.xml | 0 .../res}/xml-mcc311-mnc370/mms_config.xml | 0 .../res}/xml-mcc311-mnc410/mms_config.xml | 0 .../res}/xml-mcc311-mnc430/mms_config.xml | 0 .../res}/xml-mcc311-mnc440/mms_config.xml | 0 .../res}/xml-mcc311-mnc480/mms_config.xml | 0 .../res}/xml-mcc311-mnc490/mms_config.xml | 0 .../res}/xml-mcc311-mnc580/mms_config.xml | 0 .../res}/xml-mcc311-mnc581/mms_config.xml | 0 .../res}/xml-mcc311-mnc582/mms_config.xml | 0 .../res}/xml-mcc311-mnc583/mms_config.xml | 0 .../res}/xml-mcc311-mnc584/mms_config.xml | 0 .../res}/xml-mcc311-mnc585/mms_config.xml | 0 .../res}/xml-mcc311-mnc586/mms_config.xml | 0 .../res}/xml-mcc311-mnc587/mms_config.xml | 0 .../res}/xml-mcc311-mnc588/mms_config.xml | 0 .../res}/xml-mcc311-mnc589/mms_config.xml | 0 .../res}/xml-mcc311-mnc590/mms_config.xml | 0 .../res}/xml-mcc311-mnc870/mms_config.xml | 0 .../res}/xml-mcc312-mnc160/mms_config.xml | 0 .../res}/xml-mcc312-mnc530/mms_config.xml | 0 .../res}/xml-mcc334-mnc020/mms_config.xml | 0 .../main/res}/xml-mcc418-mnc05/mms_config.xml | 0 .../main/res}/xml-mcc418-mnc20/mms_config.xml | 0 .../main/res}/xml-mcc418-mnc30/mms_config.xml | 0 .../main/res}/xml-mcc420-mnc04/mms_config.xml | 0 .../main/res}/xml-mcc440-mnc10/mms_config.xml | 0 .../main/res}/xml-mcc440-mnc11/mms_config.xml | 0 .../main/res}/xml-mcc440-mnc20/mms_config.xml | 0 .../main/res}/xml-mcc450-mnc00/mms_config.xml | 0 .../main/res}/xml-mcc450-mnc02/mms_config.xml | 0 .../main/res}/xml-mcc450-mnc05/mms_config.xml | 0 .../main/res}/xml-mcc450-mnc06/mms_config.xml | 0 .../main/res}/xml-mcc450-mnc08/mms_config.xml | 0 .../main/res}/xml-mcc505-mnc01/mms_config.xml | 0 .../main/res}/xml-mcc530-mnc05/mms_config.xml | 0 .../main/res}/xml-mcc604-mnc00/mms_config.xml | 0 .../main/res}/xml-mcc604-mnc02/mms_config.xml | 0 .../main/res}/xml-mcc647-mnc10/mms_config.xml | 0 {res => app/src/main/res}/xml/mms_config.xml | 0 .../main/res}/xml/preferences_application.xml | 0 .../res}/xml/preferences_per_subscription.xml | 0 .../src/main/res}/xml/widget_conversation.xml | 0 .../res}/xml/widget_conversation_list.xml | 0 build.gradle | 4 + design/home_nav/automatye.svg | 2 + design/home_nav/compose_fab.svg | 4 + design/home_nav/contact.svg | 12 + design/home_nav/messages.svg | 4 + gradle.properties | 8 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43504 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 249 ++++ gradlew.bat | 80 ++ modules/chips | 1 + modules/colorpicker | 1 + modules/photoviewer | 1 + modules/vcard | 1 + packages_apps_Messaging.code-workspace | 9 + res/layout/contact_picker_fragment.xml | 80 -- res/layout/conversation_list_fragment.xml | 55 - res/layout/conversation_list_item_view.xml | 194 --- res/values-night/colors.xml | 4 - res/values-night/lineage_bools.xml | 19 - res/xml-mcc234-mnc11 | 1 - settings.gradle | 23 + .../ConversationListAdapter.java | 77 - .../ConversationListFragment.java | 420 ------ tools/looply_applied.png | Bin 0 -> 55997 bytes tools/seed_contacts.sh | 54 + tools/seed_demo_data.ps1 | 85 ++ 1142 files changed, 7707 insertions(+), 1018 deletions(-) create mode 100644 .gitignore create mode 100644 app/build.gradle rename AndroidManifest.xml => app/src/main/AndroidManifest.xml (99%) rename {assets => app/src/main/assets}/licenses.html (100%) rename {src => app/src/main/java}/android/support/v7/mms/ApnException.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/ApnSettingsLoader.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/ApnsXmlParser.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/CarrierConfigValuesLoader.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/CarrierConfigXmlParser.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/DefaultApnSettingsLoader.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/DefaultCarrierConfigValuesLoader.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/DefaultUserAgentInfoLoader.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/DownloadRequest.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/MmsHttpClient.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/MmsHttpException.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/MmsManager.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/MmsNetworkException.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/MmsNetworkManager.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/MmsRequest.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/MmsService.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/MmsXmlResourceParser.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/PhoneNumberHelper.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/SendRequest.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/UserAgentInfoLoader.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/Utils.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/AcknowledgeInd.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/Base64.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/CharacterSets.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/ContentType.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/DeliveryInd.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/EncodedStringValue.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/GenericPdu.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/InvalidHeaderValueException.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/MmsException.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/MultimediaMessagePdu.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/NotificationInd.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/NotifyRespInd.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/PduBody.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/PduContentTypes.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/PduHeaders.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/PduParser.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/PduPart.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/QuotedPrintable.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/ReadOrigInd.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/ReadRecInd.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/RetrieveConf.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/SendConf.java (100%) rename {src => app/src/main/java}/android/support/v7/mms/pdu/SendReq.java (100%) rename {src => app/src/main/java}/com/android/messaging/BugleApplication.java (100%) rename {src => app/src/main/java}/com/android/messaging/Factory.java (100%) rename {src => app/src/main/java}/com/android/messaging/FactoryImpl.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/BoundCursorLoader.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/BugleDatabaseOperations.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/BugleNotifications.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/BugleRecipientEntry.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/ConversationImagePartsView.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/CursorQueryData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/DataModel.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/DataModelImpl.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/DatabaseHelper.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/DatabaseUpgradeHelper.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/DatabaseWrapper.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/FileProvider.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/FrequentContactsCursorBuilder.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/FrequentContactsCursorQueryData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/MediaScratchFileProvider.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/MemoryCacheManager.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/MessageNotificationState.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/MessageTextStats.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/MessagingContentProvider.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/MmsFileProvider.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/NoConfirmationSmsSendService.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/NotificationState.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/ParticipantRefresh.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/SyncManager.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/Action.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/ActionMonitor.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/ActionService.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/ActionServiceImpl.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/BackgroundWorker.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/BackgroundWorkerService.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/BugleActionToasts.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/DeleteConversationAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/DeleteMessageAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/DownloadMmsAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/FixupMessageStatusOnStartupAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/GetOrCreateConversationAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/InsertNewMessageAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/MarkAsReadAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/MarkAsSeenAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/ProcessDeliveryReportAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/ProcessDownloadedMmsAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/ProcessPendingMessagesAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/ProcessSentMessageAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/ReadDraftDataAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/ReceiveMmsMessageAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/ReceiveSmsMessageAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/RedownloadMmsAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/ResendMessageAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/SendMessageAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/SyncCursorPair.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/SyncMessageBatch.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/SyncMessagesAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/UpdateConversationArchiveStatusAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/UpdateDestinationBlockedAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/UpdateMessageNotificationAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/UpdateMessagePartSizeAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/action/WriteDraftMessageAction.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/binding/BindableData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/binding/BindableOnceData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/binding/Binding.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/binding/BindingBase.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/binding/DetachableBinding.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/binding/ImmutableBindingRef.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/BlockedParticipantsData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/ContactListItemData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/ContactPickerData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/ConversationData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/ConversationListData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/ConversationListItemData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/ConversationMessageBubbleData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/ConversationMessageData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/ConversationParticipantsData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/DraftMessageData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/LaunchConversationData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/MediaPickerData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/MediaPickerMessagePartData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/MessageData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/MessagePartData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/ParticipantData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/ParticipantListItemData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/PendingAttachmentData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/PeopleAndOptionsData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/PeopleOptionsItemData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/PersonItemData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/SelfParticipantsData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/SettingsData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/SubscriptionListData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/data/VCardContactItemData.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/AsyncMediaRequestWrapper.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/AvatarGroupRequestDescriptor.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/AvatarRequest.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/AvatarRequestDescriptor.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/BindableMediaRequest.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/BugleMediaCacheManager.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/CompositeImageRequest.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/CompositeImageRequestDescriptor.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/CustomVCardEntry.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/CustomVCardEntryConstructor.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/DecodedImageResource.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/EncodedImageResource.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/FileImageRequest.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/FileImageRequestDescriptor.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/GifImageResource.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/ImageRequest.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/ImageRequestDescriptor.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/ImageResource.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/MediaBytes.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/MediaCache.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/MediaCacheManager.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/MediaRequest.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/MediaRequestDescriptor.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/MediaResourceManager.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/MessagePartImageRequestDescriptor.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/MessagePartVideoThumbnailRequestDescriptor.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/NetworkUriImageRequest.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/PoolableImageCache.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/RefCountedMediaResource.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/SimSelectorAvatarRequest.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/UriImageRequest.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/UriImageRequestDescriptor.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/VCardRequest.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/VCardRequestDescriptor.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/VCardResource.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/VCardResourceEntry.java (100%) rename {src => app/src/main/java}/com/android/messaging/datamodel/media/VideoThumbnailRequest.java (100%) rename {src => app/src/main/java}/com/android/messaging/mmslib/Downloads.java (100%) rename {src => app/src/main/java}/com/android/messaging/mmslib/SqliteWrapper.java (100%) rename {src => app/src/main/java}/com/android/messaging/mmslib/pdu/PduComposer.java (100%) rename {src => app/src/main/java}/com/android/messaging/mmslib/pdu/PduPersister.java (100%) rename {src => app/src/main/java}/com/android/messaging/mmslib/util/AbstractCache.java (100%) rename {src => app/src/main/java}/com/android/messaging/mmslib/util/DownloadDrmHelper.java (100%) rename {src => app/src/main/java}/com/android/messaging/mmslib/util/DrmConvertSession.java (100%) rename {src => app/src/main/java}/com/android/messaging/mmslib/util/PduCache.java (100%) rename {src => app/src/main/java}/com/android/messaging/mmslib/util/PduCacheEntry.java (100%) rename {src => app/src/main/java}/com/android/messaging/receiver/BootAndPackageReplacedReceiver.java (100%) rename {src => app/src/main/java}/com/android/messaging/receiver/DefaultSmsSubscriptionChangeReceiver.java (100%) rename {src => app/src/main/java}/com/android/messaging/receiver/MmsWapPushDeliverReceiver.java (100%) rename {src => app/src/main/java}/com/android/messaging/receiver/NotificationReceiver.java (100%) rename {src => app/src/main/java}/com/android/messaging/receiver/SendStatusReceiver.java (100%) rename {src => app/src/main/java}/com/android/messaging/receiver/SmsDeliverReceiver.java (100%) rename {src => app/src/main/java}/com/android/messaging/receiver/SmsReceiver.java (100%) rename {src => app/src/main/java}/com/android/messaging/sms/ApnsXmlProcessor.java (100%) rename {src => app/src/main/java}/com/android/messaging/sms/BugleApnSettingsLoader.java (100%) rename {src => app/src/main/java}/com/android/messaging/sms/BugleCarrierConfigValuesLoader.java (100%) rename {src => app/src/main/java}/com/android/messaging/sms/BugleUserAgentInfoLoader.java (100%) rename {src => app/src/main/java}/com/android/messaging/sms/DatabaseMessages.java (100%) rename {src => app/src/main/java}/com/android/messaging/sms/MmsConfig.java (100%) rename {src => app/src/main/java}/com/android/messaging/sms/MmsFailureException.java (100%) rename {src => app/src/main/java}/com/android/messaging/sms/MmsSender.java (100%) rename {src => app/src/main/java}/com/android/messaging/sms/MmsSmsUtils.java (100%) rename {src => app/src/main/java}/com/android/messaging/sms/MmsUtils.java (100%) rename {src => app/src/main/java}/com/android/messaging/sms/SmsSender.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/AsyncImageView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/AttachmentPreview.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/AttachmentPreviewFactory.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/AudioAttachmentPlayPauseButton.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/AudioAttachmentView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/AudioPlaybackProgressBar.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/BaseBugleActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/BaseBugleFragmentActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/BasePagerViewHolder.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/BlockedParticipantListItemView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/BlockedParticipantsActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/BlockedParticipantsFragment.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/BugleActionBarActivity.java (96%) rename {src => app/src/main/java}/com/android/messaging/ui/ClassZeroActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/CompositeAdapter.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/ContactIconView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/ConversationDrawables.java (95%) rename {src => app/src/main/java}/com/android/messaging/ui/CursorRecyclerAdapter.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/CustomHeaderPagerListViewHolder.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/CustomHeaderPagerViewHolder.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/CustomHeaderViewPager.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/CustomHeaderViewPagerAdapter.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/FixedViewPagerAdapter.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/ImeDetectFrameLayout.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/LicenseActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/LineWrapLayout.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/ListEmptyView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/MaxHeightScrollView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/MultiAttachmentLayout.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/OrientedBitmapDrawable.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/PagerViewHolder.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/PagingAwareViewPager.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/PermissionCheckActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/PersistentInstanceState.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/PersonItemView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/PlaceholderInsetDrawable.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/PlainTextEditText.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/PlaybackStateView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/RemoteInputEntrypointActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/SnackBar.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/SnackBarInteraction.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/SnackBarManager.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/UIIntents.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/UIIntentsImpl.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/VCardDetailActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/VCardDetailAdapter.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/VCardDetailFragment.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/VideoThumbnailView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/ViewPagerTabStrip.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/ViewPagerTabs.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/WidgetPickConversationActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/animation/PopupTransitionAnimation.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/animation/RectEvaluatorCompat.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/animation/ViewGroupItemVerticalExplodeAnimation.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/appsettings/ApplicationSettingsActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/appsettings/GroupMmsSettingDialog.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/appsettings/PerSubscriptionSettingsActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/appsettings/PhoneNumberPreference.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/appsettings/SettingsActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/attachmentchooser/AttachmentChooserActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/attachmentchooser/AttachmentChooserFragment.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/attachmentchooser/AttachmentGridItemView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/attachmentchooser/AttachmentGridView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/contact/AddContactsConfirmationDialog.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/contact/AllContactsListViewHolder.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/contact/ContactDropdownLayouter.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/contact/ContactListAdapter.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/contact/ContactListItemView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/contact/ContactPickerFragment.java (97%) rename {src => app/src/main/java}/com/android/messaging/ui/contact/ContactRecipientAdapter.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/contact/ContactRecipientAutoCompleteView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/contact/ContactRecipientPhotoManager.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/contact/ContactSectionIndexer.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/contact/FrequentContactsListViewHolder.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/ComposeMessageView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/ConversationActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/ConversationActivityUiState.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/ConversationFastScroller.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/ConversationFragment.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/ConversationInput.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/ConversationInputManager.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/ConversationMessageAdapter.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/ConversationMessageBubbleView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/ConversationMessageView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/ConversationSimSelector.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/EnterSelfPhoneNumberDialog.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/LaunchConversationActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/MessageBubbleBackground.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/MessageDetailsDialog.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/SimIconView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/SimSelectorItemView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversation/SimSelectorView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversationlist/AbstractConversationListActivity.java (91%) rename {src => app/src/main/java}/com/android/messaging/ui/conversationlist/ArchivedConversationListActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversationlist/ConversationListActivity.java (73%) create mode 100644 app/src/main/java/com/android/messaging/ui/conversationlist/ConversationListAdapter.java create mode 100644 app/src/main/java/com/android/messaging/ui/conversationlist/ConversationListFragment.java rename {src => app/src/main/java}/com/android/messaging/ui/conversationlist/ConversationListItemView.java (73%) rename {src => app/src/main/java}/com/android/messaging/ui/conversationlist/ConversationListSwipeHelper.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversationlist/ForwardMessageActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversationlist/MultiSelectActionModeCallback.java (88%) rename {src => app/src/main/java}/com/android/messaging/ui/conversationlist/ShareIntentActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversationlist/ShareIntentAdapter.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversationlist/ShareIntentFragment.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversationsettings/CopyContactDetailDialog.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversationsettings/PeopleAndOptionsActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversationsettings/PeopleAndOptionsFragment.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/conversationsettings/PeopleOptionsItemView.java (100%) create mode 100644 app/src/main/java/com/android/messaging/ui/home/HomeContactListAdapter.java create mode 100644 app/src/main/java/com/android/messaging/ui/home/HomeContactsFragment.java create mode 100644 app/src/main/java/com/android/messaging/ui/home/HomePinnedStrip.java create mode 100644 app/src/main/java/com/android/messaging/ui/home/PinnedConversationStore.java rename {src => app/src/main/java}/com/android/messaging/ui/mediapicker/AudioLevelSource.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/mediapicker/AudioMediaChooser.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/mediapicker/AudioRecordView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/mediapicker/CameraMediaChooser.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/mediapicker/ContactMediaChooser.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/mediapicker/DocumentImagePicker.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/mediapicker/GalleryMediaChooser.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/mediapicker/LevelTrackingMediaRecorder.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/mediapicker/MediaChooser.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/mediapicker/MediaPicker.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/mediapicker/MediaPickerGridView.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/mediapicker/MediaPickerPanel.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/mediapicker/PausableChronometer.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/mediapicker/SoundLevels.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/photoviewer/BuglePhotoBitmapLoader.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/photoviewer/BuglePhotoPageAdapter.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/photoviewer/BuglePhotoViewActivity.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/photoviewer/BuglePhotoViewController.java (100%) rename {src => app/src/main/java}/com/android/messaging/ui/photoviewer/BuglePhotoViewFragment.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/AccessibilityUtil.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/Assert.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/AvatarUriUtil.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/BugleActivityUtil.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/BugleApplicationPrefs.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/BugleGservicesKeys.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/BuglePrefs.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/BuglePrefsImpl.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/BuglePrefsKeys.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/BugleSubscriptionPrefs.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/BugleWidgetPrefs.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/ChangeDefaultSmsAppHelper.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/ConnectivityUtil.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/ContactRecipientEntryUtils.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/ContactUtil.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/ConversationIdSet.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/CubicBezierInterpolator.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/Dates.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/DebugUtils.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/EmailAddress.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/FallbackStrategies.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/FileUtil.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/GifTranscoder.java (88%) rename {src => app/src/main/java}/com/android/messaging/util/ImageUtils.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/ImeUtil.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/LinkifyHelper.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/LogUtil.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/LoggingTimer.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/MediaMetadataRetrieverWrapper.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/MediaUtil.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/MediaUtilImpl.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/NotificationPlayer.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/NotificationsUtil.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/OsUtil.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/PendingIntentConstants.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/PhoneUtils.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/TextUtil.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/ThreadUtil.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/Trace.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/Typefaces.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/UiUtils.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/UriUtil.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/VersionUtil.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/YouTubeUtil.java (100%) rename {src => app/src/main/java}/com/android/messaging/util/exif/ExifInterface.java (100%) rename {src => app/src/main/java}/com/android/messaging/widget/BaseWidgetFactory.java (100%) rename {src => app/src/main/java}/com/android/messaging/widget/BaseWidgetProvider.java (100%) rename {src => app/src/main/java}/com/android/messaging/widget/BugleWidgetProvider.java (100%) rename {src => app/src/main/java}/com/android/messaging/widget/WidgetConversationListService.java (100%) rename {src => app/src/main/java}/com/android/messaging/widget/WidgetConversationProvider.java (100%) rename {src => app/src/main/java}/com/android/messaging/widget/WidgetConversationService.java (100%) rename {src => app/src/main/java}/org/lineageos/messaging/util/PrefsUtils.java (100%) create mode 100644 app/src/main/jni/Android.bp create mode 100644 app/src/main/jni/GifTranscoder.cpp create mode 100644 app/src/main/jni/GifTranscoder.h rename {res => app/src/main/res}/color/tab_text_color.xml (86%) rename {res => app/src/main/res}/drawable-hdpi/contact_popup_background.9.png (100%) rename {res => app/src/main/res}/drawable-hdpi/ic_failed_status_red.png (100%) rename {res => app/src/main/res}/drawable-hdpi/ic_oobe_conv_list.png (100%) rename {res => app/src/main/res}/drawable-hdpi/ic_oobe_freq_list.png (100%) rename {res => app/src/main/res}/drawable-hdpi/ic_preview_pause.png (100%) rename {res => app/src/main/res}/drawable-hdpi/ic_preview_play.png (100%) rename {res => app/src/main/res}/drawable-hdpi/ic_remove_light.png (100%) rename {res => app/src/main/res}/drawable-hdpi/ic_sim_card_send.png (100%) rename {res => app/src/main/res}/drawable-hdpi/ic_sms_delivery_ok.png (100%) rename {res => app/src/main/res}/drawable-hdpi/ic_sms_light.png (100%) rename {res => app/src/main/res}/drawable-hdpi/ic_sms_multi_light.png (100%) rename {res => app/src/main/res}/drawable-hdpi/ic_widget_avatar_shadow.png (100%) rename {res => app/src/main/res}/drawable-hdpi/permissions.png (100%) rename {res => app/src/main/res}/drawable-hdpi/swipe_shadow.9.png (100%) rename {res => app/src/main/res}/drawable-hdpi/swipe_shadow_drag.9.png (100%) rename {res => app/src/main/res}/drawable-hdpi/widget_hr.9.png (100%) rename {res => app/src/main/res}/drawable-hdpi/widget_msg_bubble_incoming.9.png (100%) rename {res => app/src/main/res}/drawable-hdpi/widget_msg_bubble_outgoing.9.png (100%) rename {res => app/src/main/res}/drawable-mdpi/contact_popup_background.9.png (100%) rename {res => app/src/main/res}/drawable-mdpi/ic_failed_status_red.png (100%) rename {res => app/src/main/res}/drawable-mdpi/ic_oobe_conv_list.png (100%) rename {res => app/src/main/res}/drawable-mdpi/ic_oobe_freq_list.png (100%) rename {res => app/src/main/res}/drawable-mdpi/ic_preview_pause.png (100%) rename {res => app/src/main/res}/drawable-mdpi/ic_preview_play.png (100%) rename {res => app/src/main/res}/drawable-mdpi/ic_remove_light.png (100%) rename {res => app/src/main/res}/drawable-mdpi/ic_sim_card_send.png (100%) rename {res => app/src/main/res}/drawable-mdpi/ic_sms_delivery_ok.png (100%) rename {res => app/src/main/res}/drawable-mdpi/ic_sms_light.png (100%) rename {res => app/src/main/res}/drawable-mdpi/ic_sms_multi_light.png (100%) rename {res => app/src/main/res}/drawable-mdpi/ic_widget_avatar_shadow.png (100%) rename {res => app/src/main/res}/drawable-mdpi/permissions.png (100%) rename {res => app/src/main/res}/drawable-mdpi/swipe_shadow.9.png (100%) rename {res => app/src/main/res}/drawable-mdpi/swipe_shadow_drag.9.png (100%) rename {res => app/src/main/res}/drawable-mdpi/widget_hr.9.png (100%) rename {res => app/src/main/res}/drawable-mdpi/widget_msg_bubble_incoming.9.png (100%) rename {res => app/src/main/res}/drawable-mdpi/widget_msg_bubble_outgoing.9.png (100%) rename {res => app/src/main/res}/drawable-nodpi/messenger_widget_conversation_preview.png (100%) rename {res => app/src/main/res}/drawable-nodpi/messenger_widget_preview.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/contact_popup_background.9.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/ic_failed_status_red.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/ic_oobe_conv_list.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/ic_oobe_freq_list.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/ic_preview_pause.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/ic_preview_play.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/ic_remove_light.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/ic_sim_card_send.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/ic_sms_delivery_ok.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/ic_sms_light.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/ic_sms_multi_light.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/ic_widget_avatar_shadow.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/permissions.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/swipe_shadow.9.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/swipe_shadow_drag.9.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/widget_hr.9.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/widget_msg_bubble_incoming.9.png (100%) rename {res => app/src/main/res}/drawable-xhdpi/widget_msg_bubble_outgoing.9.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/contact_popup_background.9.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/ic_failed_status_red.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/ic_oobe_conv_list.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/ic_oobe_freq_list.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/ic_preview_pause.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/ic_preview_play.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/ic_remove_light.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/ic_sim_card_send.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/ic_sms_delivery_ok.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/ic_sms_light.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/ic_sms_multi_light.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/ic_widget_avatar_shadow.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/permissions.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/swipe_shadow.9.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/swipe_shadow_drag.9.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/widget_hr.9.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/widget_msg_bubble_incoming.9.png (100%) rename {res => app/src/main/res}/drawable-xxhdpi/widget_msg_bubble_outgoing.9.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/contact_popup_background.9.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/ic_failed_status_red.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/ic_oobe_conv_list.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/ic_oobe_freq_list.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/ic_preview_pause.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/ic_preview_play.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/ic_remove_light.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/ic_sim_card_send.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/ic_sms_delivery_ok.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/ic_sms_light.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/ic_sms_multi_light.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/ic_widget_avatar_shadow.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/permissions.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/swipe_shadow.9.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/swipe_shadow_drag.9.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/widget_hr.9.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/widget_msg_bubble_incoming.9.png (100%) rename {res => app/src/main/res}/drawable-xxxhdpi/widget_msg_bubble_outgoing.9.png (100%) rename {res => app/src/main/res}/drawable/attachment_audio_preview_background.xml (100%) rename {res => app/src/main/res}/drawable/attachment_image_placeholder_background.xml (100%) rename {res => app/src/main/res}/drawable/attachment_more_items_background.xml (100%) rename {res => app/src/main/res}/drawable/attachment_vcard_preview_background.xml (100%) rename {res => app/src/main/res}/drawable/audio_progress_bar_background_incoming.xml (100%) rename {res => app/src/main/res}/drawable/audio_progress_bar_background_outgoing.xml (100%) rename {res => app/src/main/res}/drawable/audio_progress_bar_progress.xml (100%) rename {res => app/src/main/res}/drawable/audio_record_control_button_background.xml (100%) rename {res => app/src/main/res}/drawable/chips_dropdown_background.xml (100%) rename {res => app/src/main/res}/drawable/chips_dropdown_text_color.xml (100%) rename {res => app/src/main/res}/drawable/compose_chips_divider_gradient.xml (100%) rename {res => app/src/main/res}/drawable/contact_picker_tab_background_selector.xml (100%) rename {res => app/src/main/res}/drawable/contacts_fastscroll_label_left.xml (100%) rename {res => app/src/main/res}/drawable/contacts_fastscroll_label_right.xml (100%) rename {res => app/src/main/res}/drawable/conversation_compose_divider_gradient.xml (100%) rename {res => app/src/main/res}/drawable/fastscroll_preview_left.xml (100%) rename {res => app/src/main/res}/drawable/fastscroll_preview_right.xml (100%) rename {res => app/src/main/res}/drawable/fastscroll_thumb.xml (100%) rename {res => app/src/main/res}/drawable/fastscroll_thumb_pressed.xml (100%) rename {res => app/src/main/res}/drawable/fastscroll_track.xml (100%) rename {res => app/src/main/res}/drawable/gallery_checkbox_selector.xml (100%) create mode 100644 app/src/main/res/drawable/home_bg_chip.xml create mode 100644 app/src/main/res/drawable/home_bg_circle.xml create mode 100644 app/src/main/res/drawable/home_bg_contacts_card.xml create mode 100644 app/src/main/res/drawable/home_bg_dock_fab.xml create mode 100644 app/src/main/res/drawable/home_bg_dock_pill.xml create mode 100644 app/src/main/res/drawable/home_bg_fab.xml create mode 100644 app/src/main/res/drawable/home_bg_main_nav.xml create mode 100644 app/src/main/res/drawable/home_bg_nav_active.xml create mode 100644 app/src/main/res/drawable/home_bg_nav_active_primary.xml create mode 100644 app/src/main/res/drawable/home_bg_pill.xml create mode 100644 app/src/main/res/drawable/home_bg_pin_active.xml create mode 100644 app/src/main/res/drawable/home_bg_pin_inactive.xml create mode 100644 app/src/main/res/drawable/home_bg_pinned_preview_bubble.xml create mode 100644 app/src/main/res/drawable/home_bg_pinned_remove.xml create mode 100644 app/src/main/res/drawable/home_bg_popover.xml create mode 100644 app/src/main/res/drawable/home_bg_popover_item.xml create mode 100644 app/src/main/res/drawable/home_bg_search_bar_outer.xml create mode 100644 app/src/main/res/drawable/home_bg_search_field.xml create mode 100644 app/src/main/res/drawable/home_bg_search_field_inner.xml create mode 100644 app/src/main/res/drawable/home_bg_selection_ring.xml create mode 100644 app/src/main/res/drawable/home_bg_selection_ring_checked.xml create mode 100644 app/src/main/res/drawable/home_bg_sim_badge.xml create mode 100644 app/src/main/res/drawable/home_bg_unread_dot.xml create mode 100644 app/src/main/res/drawable/home_pinned_preview_tail.xml rename {res => app/src/main/res}/drawable/ic_add_white.xml (100%) rename {res => app/src/main/res}/drawable/ic_archive_small_dark.xml (100%) rename {res => app/src/main/res}/drawable/ic_archive_undo_small_dark.xml (100%) rename {res => app/src/main/res}/drawable/ic_arrow_back_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_attachment_dark.xml (100%) rename {res => app/src/main/res}/drawable/ic_audio_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_camera_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_cancel_small_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_checkbox_blank_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_checkbox_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_checkmark_circle_blue.xml (100%) create mode 100644 app/src/main/res/drawable/ic_checkmark_circle_primary.xml rename {res => app/src/main/res}/drawable/ic_checkmark_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_content_copy_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_delete_small_dark.xml (100%) rename {res => app/src/main/res}/drawable/ic_dnd_on_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_failed_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_file_download_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_forward_light.xml (100%) create mode 100644 app/src/main/res/drawable/ic_home_add.xml create mode 100644 app/src/main/res/drawable/ic_home_check.xml create mode 100644 app/src/main/res/drawable/ic_home_chevron.xml create mode 100644 app/src/main/res/drawable/ic_home_compose.xml create mode 100644 app/src/main/res/drawable/ic_home_compose_line.xml create mode 100644 app/src/main/res/drawable/ic_home_filter.xml create mode 100644 app/src/main/res/drawable/ic_home_menu_lines.xml create mode 100644 app/src/main/res/drawable/ic_home_menu_messages.xml create mode 100644 app/src/main/res/drawable/ic_home_menu_person.xml create mode 100644 app/src/main/res/drawable/ic_home_menu_pin.xml create mode 100644 app/src/main/res/drawable/ic_home_menu_select.xml create mode 100644 app/src/main/res/drawable/ic_home_menu_spam.xml create mode 100644 app/src/main/res/drawable/ic_home_menu_trash.xml create mode 100644 app/src/main/res/drawable/ic_home_menu_unread.xml create mode 100644 app/src/main/res/drawable/ic_home_mic.xml create mode 100644 app/src/main/res/drawable/ic_home_nav_automate.xml create mode 100644 app/src/main/res/drawable/ic_home_nav_calls.xml create mode 100644 app/src/main/res/drawable/ic_home_nav_chats.xml create mode 100644 app/src/main/res/drawable/ic_home_nav_compose.xml create mode 100644 app/src/main/res/drawable/ic_home_nav_contacts.xml create mode 100644 app/src/main/res/drawable/ic_home_nav_messages.xml create mode 100644 app/src/main/res/drawable/ic_home_nav_settings.xml create mode 100644 app/src/main/res/drawable/ic_home_pinned_remove.xml create mode 100644 app/src/main/res/drawable/ic_home_search_line.xml rename {res => app/src/main/res}/drawable/ic_image_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_ime_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_info_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_launcher_background.xml (100%) rename {res => app/src/main/res}/drawable/ic_launcher_foreground.xml (100%) rename {res => app/src/main/res}/drawable/ic_launcher_monochrome.xml (100%) create mode 100644 app/src/main/res/drawable/ic_looply_automate.xml create mode 100644 app/src/main/res/drawable/ic_looply_back.xml create mode 100644 app/src/main/res/drawable/ic_looply_contacts.xml create mode 100644 app/src/main/res/drawable/ic_looply_more.xml create mode 100644 app/src/main/res/drawable/ic_looply_search.xml rename {res => app/src/main/res}/drawable/ic_message.xml (100%) rename {res => app/src/main/res}/drawable/ic_mp_audio_mic.xml (100%) rename {res => app/src/main/res}/drawable/ic_mp_video_small_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_numeric_dialpad.xml (100%) rename {res => app/src/main/res}/drawable/ic_pause_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_people_add_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_person_add_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_person_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_phone_small_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_play_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_save_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_send_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_share_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_sms_light.xml (100%) rename {res => app/src/main/res}/drawable/ic_wear_reply.xml (100%) rename {res => app/src/main/res}/drawable/ic_widget_list.xml (100%) rename {res => app/src/main/res}/drawable/ic_work_profile.xml (100%) create mode 100644 app/src/main/res/drawable/looply_bg_avatar_placeholder.xml create mode 100644 app/src/main/res/drawable/looply_bg_badge.xml create mode 100644 app/src/main/res/drawable/looply_bg_bubble_incoming.xml create mode 100644 app/src/main/res/drawable/looply_bg_bubble_outgoing.xml create mode 100644 app/src/main/res/drawable/looply_bg_button_primary.xml create mode 100644 app/src/main/res/drawable/looply_bg_button_secondary.xml create mode 100644 app/src/main/res/drawable/looply_bg_card.xml create mode 100644 app/src/main/res/drawable/looply_bg_chip_active.xml create mode 100644 app/src/main/res/drawable/looply_bg_chip_inactive.xml create mode 100644 app/src/main/res/drawable/looply_bg_fab.xml create mode 100644 app/src/main/res/drawable/looply_bg_fab_square.xml create mode 100644 app/src/main/res/drawable/looply_bg_input.xml create mode 100644 app/src/main/res/drawable/looply_bg_list_card.xml create mode 100644 app/src/main/res/drawable/looply_bg_list_sheet.xml create mode 100644 app/src/main/res/drawable/looply_bg_nav_active_circle.xml create mode 100644 app/src/main/res/drawable/looply_bg_nav_active_pill.xml create mode 100644 app/src/main/res/drawable/looply_bg_nav_floating_pill.xml create mode 100644 app/src/main/res/drawable/looply_bg_online_dot.xml create mode 100644 app/src/main/res/drawable/looply_bg_search.xml rename {res => app/src/main/res}/drawable/mediapicker_tab_button_background.xml (100%) rename {res => app/src/main/res}/drawable/message_bubble_incoming_no_arrow.xml (82%) rename {res => app/src/main/res}/drawable/message_bubble_outgoing_no_arrow.xml (82%) rename {res => app/src/main/res}/drawable/msg_bubble_input_rounded.xml (100%) rename {res => app/src/main/res}/drawable/send_arrow_background.xml (100%) rename {res => app/src/main/res}/drawable/sim_selector_background_gradient.xml (100%) rename {res => app/src/main/res}/drawable/subject_editor_bubble.xml (100%) rename {res => app/src/main/res}/drawable/transparent_button_background.xml (100%) rename {res => app/src/main/res}/drawable/widget_bottom_background.xml (100%) rename {res => app/src/main/res}/drawable/widget_item_background.xml (100%) rename {res => app/src/main/res}/drawable/widget_top_background.xml (100%) rename {res => app/src/main/res}/layout/action_bar_conversation_name.xml (100%) rename {res => app/src/main/res}/layout/add_contacts_confirmation_dialog_body.xml (100%) rename {res => app/src/main/res}/layout/all_contacts_list_view.xml (100%) rename {res => app/src/main/res}/layout/attachment_chooser_activity.xml (100%) rename {res => app/src/main/res}/layout/attachment_chooser_audio.xml (100%) rename {res => app/src/main/res}/layout/attachment_chooser_fragment.xml (100%) rename {res => app/src/main/res}/layout/attachment_chooser_image.xml (100%) rename {res => app/src/main/res}/layout/attachment_chooser_vcard.xml (100%) rename {res => app/src/main/res}/layout/attachment_chooser_video.xml (100%) rename {res => app/src/main/res}/layout/attachment_grid_item_view.xml (100%) rename {res => app/src/main/res}/layout/attachment_more_text_view.xml (100%) rename {res => app/src/main/res}/layout/attachment_multiple_audio.xml (100%) rename {res => app/src/main/res}/layout/attachment_multiple_image.xml (100%) rename {res => app/src/main/res}/layout/attachment_multiple_vcard.xml (100%) rename {res => app/src/main/res}/layout/attachment_multiple_video.xml (100%) rename {res => app/src/main/res}/layout/attachment_pending_item.xml (100%) rename {res => app/src/main/res}/layout/attachment_preview.xml (100%) rename {res => app/src/main/res}/layout/attachment_single_audio.xml (100%) rename {res => app/src/main/res}/layout/attachment_single_image.xml (100%) rename {res => app/src/main/res}/layout/attachment_single_vcard.xml (100%) rename {res => app/src/main/res}/layout/attachment_single_video.xml (100%) rename {res => app/src/main/res}/layout/audio_attachment_view.xml (100%) rename {res => app/src/main/res}/layout/blocked_participant_list_item_view.xml (100%) rename {res => app/src/main/res}/layout/blocked_participants_activity.xml (100%) rename {res => app/src/main/res}/layout/blocked_participants_fragment.xml (100%) rename {res => app/src/main/res}/layout/chips_alternates_dropdown_item.xml (100%) rename {res => app/src/main/res}/layout/compose_message_view.xml (100%) rename {res => app/src/main/res}/layout/contact_list_item_view.xml (61%) create mode 100644 app/src/main/res/layout/contact_picker_fragment.xml rename {res => app/src/main/res}/layout/conversation_activity.xml (100%) rename {res => app/src/main/res}/layout/conversation_fragment.xml (100%) create mode 100644 app/src/main/res/layout/conversation_list_fragment.xml create mode 100644 app/src/main/res/layout/conversation_list_item_view.xml rename {res => app/src/main/res}/layout/conversation_message_view.xml (100%) rename {res => app/src/main/res}/layout/copy_contact_dialog_view.xml (100%) rename {res => app/src/main/res}/layout/custom_header_view_pager.xml (100%) rename {res => app/src/main/res}/layout/enter_phone_number_view.xml (100%) rename {res => app/src/main/res}/layout/fastscroll_preview.xml (100%) rename {res => app/src/main/res}/layout/fastscroll_thumb.xml (100%) rename {res => app/src/main/res}/layout/fastscroll_track.xml (100%) rename {res => app/src/main/res}/layout/frequent_contacts_list_view.xml (100%) rename {res => app/src/main/res}/layout/group_mms_setting_dialog.xml (100%) create mode 100644 app/src/main/res/layout/home_bottom_nav_tab_item.xml create mode 100644 app/src/main/res/layout/home_contacts_fragment.xml create mode 100644 app/src/main/res/layout/home_contacts_list_item.xml create mode 100644 app/src/main/res/layout/home_pinned_item.xml create mode 100644 app/src/main/res/layout/home_pinned_strip.xml create mode 100644 app/src/main/res/layout/home_popover_edit.xml create mode 100644 app/src/main/res/layout/home_popover_filter.xml rename {res => app/src/main/res}/layout/license_activity.xml (100%) rename {res => app/src/main/res}/layout/list_empty_view.xml (100%) create mode 100644 app/src/main/res/layout/looply_bottom_nav.xml create mode 100644 app/src/main/res/layout/looply_button_primary.xml create mode 100644 app/src/main/res/layout/looply_chat_list_item.xml create mode 100644 app/src/main/res/layout/looply_components_preview.xml create mode 100644 app/src/main/res/layout/looply_compose_bar.xml create mode 100644 app/src/main/res/layout/looply_filter_chips.xml create mode 100644 app/src/main/res/layout/looply_message_bubbles.xml create mode 100644 app/src/main/res/layout/looply_search_bar.xml rename {res => app/src/main/res}/layout/mediapicker_audio_chooser.xml (100%) rename {res => app/src/main/res}/layout/mediapicker_camera_chooser.xml (100%) rename {res => app/src/main/res}/layout/mediapicker_contact_chooser.xml (100%) rename {res => app/src/main/res}/layout/mediapicker_fragment.xml (100%) rename {res => app/src/main/res}/layout/mediapicker_gallery_chooser.xml (100%) rename {res => app/src/main/res}/layout/mediapicker_tab_button.xml (100%) rename {res => app/src/main/res}/layout/message_audio_attachment.xml (100%) rename {res => app/src/main/res}/layout/message_vcard_attachment.xml (100%) rename {res => app/src/main/res}/layout/message_video_attachment.xml (100%) rename {res => app/src/main/res}/layout/people_and_options_activity.xml (100%) rename {res => app/src/main/res}/layout/people_and_options_fragment.xml (100%) rename {res => app/src/main/res}/layout/people_and_options_section_header.xml (100%) rename {res => app/src/main/res}/layout/people_list_item_view.xml (100%) rename {res => app/src/main/res}/layout/people_options_item_view.xml (100%) rename {res => app/src/main/res}/layout/permission_check_activity.xml (100%) rename {res => app/src/main/res}/layout/person_item_view.xml (100%) rename {res => app/src/main/res}/layout/preference_material_switch.xml (100%) rename {res => app/src/main/res}/layout/settings_fragment.xml (100%) rename {res => app/src/main/res}/layout/settings_item_view.xml (100%) rename {res => app/src/main/res}/layout/share_intent_conversation_list_view.xml (100%) rename {res => app/src/main/res}/layout/sim_selector_item_view.xml (100%) rename {res => app/src/main/res}/layout/sim_selector_view.xml (100%) rename {res => app/src/main/res}/layout/snack_bar.xml (100%) rename {res => app/src/main/res}/layout/vcard_detail_activity.xml (100%) rename {res => app/src/main/res}/layout/vcard_detail_fragment.xml (100%) rename {res => app/src/main/res}/layout/video_thumbnail_view.xml (100%) rename {res => app/src/main/res}/layout/widget_conversation.xml (100%) rename {res => app/src/main/res}/layout/widget_conversation_list.xml (100%) rename {res => app/src/main/res}/layout/widget_conversation_list_item.xml (100%) rename {res => app/src/main/res}/layout/widget_loading.xml (100%) rename {res => app/src/main/res}/layout/widget_message_item_incoming.xml (100%) rename {res => app/src/main/res}/layout/widget_message_item_outgoing.xml (100%) rename {res => app/src/main/res}/layout/widget_missing_permission.xml (100%) rename {res => app/src/main/res}/layout/work_directory_header.xml (100%) rename {res => app/src/main/res}/menu/attachment_chooser_menu.xml (100%) rename {res => app/src/main/res}/menu/compose_menu.xml (100%) rename {res => app/src/main/res}/menu/conversation_fragment_select_menu.xml (100%) rename {res => app/src/main/res}/menu/conversation_list_fragment_menu.xml (100%) rename {res => app/src/main/res}/menu/conversation_list_fragment_select_menu.xml (100%) rename {res => app/src/main/res}/menu/conversation_menu.xml (100%) rename {res => app/src/main/res}/menu/photo_view_menu.xml (100%) rename {res => app/src/main/res}/menu/settings_menu.xml (100%) rename {res => app/src/main/res}/menu/vcard_detail_fragment_menu.xml (100%) rename {res => app/src/main/res}/mipmap-anydpi/ic_launcher.xml (100%) rename {res => app/src/main/res}/raw/audio_end.wav (100%) rename {res => app/src/main/res}/raw/audio_initiate.wav (100%) rename {res => app/src/main/res}/raw/message_failure.wav (100%) rename {res => app/src/main/res}/raw/message_sent.wav (100%) rename {res => app/src/main/res}/values-af/arrays.xml (100%) rename {res => app/src/main/res}/values-af/cm_strings.xml (100%) rename {res => app/src/main/res}/values-af/strings.xml (100%) rename {res => app/src/main/res}/values-am/arrays.xml (100%) rename {res => app/src/main/res}/values-am/strings.xml (100%) rename {res => app/src/main/res}/values-ar/arrays.xml (100%) rename {res => app/src/main/res}/values-ar/cm_strings.xml (100%) rename {res => app/src/main/res}/values-ar/strings.xml (100%) rename {res => app/src/main/res}/values-as/cm_strings.xml (100%) rename {res => app/src/main/res}/values-ast-rES/cm_strings.xml (100%) rename {res => app/src/main/res}/values-az/arrays.xml (100%) rename {res => app/src/main/res}/values-az/cm_strings.xml (100%) rename {res => app/src/main/res}/values-az/strings.xml (100%) rename {res => app/src/main/res}/values-be/cm_strings.xml (100%) rename {res => app/src/main/res}/values-bg/arrays.xml (100%) rename {res => app/src/main/res}/values-bg/cm_strings.xml (100%) rename {res => app/src/main/res}/values-bg/strings.xml (100%) rename {res => app/src/main/res}/values-bn/arrays.xml (100%) rename {res => app/src/main/res}/values-bn/strings.xml (100%) rename {res => app/src/main/res}/values-bs/cm_strings.xml (100%) rename {res => app/src/main/res}/values-ca/arrays.xml (100%) rename {res => app/src/main/res}/values-ca/cm_strings.xml (100%) rename {res => app/src/main/res}/values-ca/strings.xml (100%) rename {res => app/src/main/res}/values-ckb/cm_strings.xml (100%) rename {res => app/src/main/res}/values-cs/arrays.xml (100%) rename {res => app/src/main/res}/values-cs/cm_strings.xml (100%) rename {res => app/src/main/res}/values-cs/strings.xml (100%) rename {res => app/src/main/res}/values-cy/cm_strings.xml (100%) rename {res => app/src/main/res}/values-da/arrays.xml (100%) rename {res => app/src/main/res}/values-da/cm_strings.xml (100%) rename {res => app/src/main/res}/values-da/strings.xml (100%) rename {res => app/src/main/res}/values-de/arrays.xml (100%) rename {res => app/src/main/res}/values-de/cm_strings.xml (100%) rename {res => app/src/main/res}/values-de/strings.xml (100%) rename {res => app/src/main/res}/values-el/arrays.xml (100%) rename {res => app/src/main/res}/values-el/cm_strings.xml (100%) rename {res => app/src/main/res}/values-el/strings.xml (100%) rename {res => app/src/main/res}/values-en-rAU/arrays.xml (100%) rename {res => app/src/main/res}/values-en-rAU/cm_strings.xml (100%) rename {res => app/src/main/res}/values-en-rAU/strings.xml (100%) rename {res => app/src/main/res}/values-en-rCA/cm_strings.xml (100%) rename {res => app/src/main/res}/values-en-rGB/arrays.xml (100%) rename {res => app/src/main/res}/values-en-rGB/cm_strings.xml (100%) rename {res => app/src/main/res}/values-en-rGB/strings.xml (100%) rename {res => app/src/main/res}/values-en-rIN/arrays.xml (100%) rename {res => app/src/main/res}/values-en-rIN/cm_strings.xml (100%) rename {res => app/src/main/res}/values-en-rIN/strings.xml (100%) rename {res => app/src/main/res}/values-es-rMX/cm_strings.xml (100%) rename {res => app/src/main/res}/values-es-rUS/arrays.xml (100%) rename {res => app/src/main/res}/values-es-rUS/cm_strings.xml (100%) rename {res => app/src/main/res}/values-es-rUS/strings.xml (100%) rename {res => app/src/main/res}/values-es/arrays.xml (100%) rename {res => app/src/main/res}/values-es/cm_strings.xml (100%) rename {res => app/src/main/res}/values-es/strings.xml (100%) rename {res => app/src/main/res}/values-et/arrays.xml (100%) rename {res => app/src/main/res}/values-et/cm_strings.xml (100%) rename {res => app/src/main/res}/values-et/strings.xml (100%) rename {res => app/src/main/res}/values-eu/arrays.xml (100%) rename {res => app/src/main/res}/values-eu/cm_strings.xml (100%) rename {res => app/src/main/res}/values-eu/strings.xml (100%) rename {res => app/src/main/res}/values-fa/arrays.xml (100%) rename {res => app/src/main/res}/values-fa/cm_strings.xml (100%) rename {res => app/src/main/res}/values-fa/strings.xml (100%) rename {res => app/src/main/res}/values-fi/arrays.xml (100%) rename {res => app/src/main/res}/values-fi/cm_strings.xml (100%) rename {res => app/src/main/res}/values-fi/strings.xml (100%) rename {res => app/src/main/res}/values-fr-rCA/arrays.xml (100%) rename {res => app/src/main/res}/values-fr-rCA/strings.xml (100%) rename {res => app/src/main/res}/values-fr/arrays.xml (100%) rename {res => app/src/main/res}/values-fr/cm_strings.xml (100%) rename {res => app/src/main/res}/values-fr/strings.xml (100%) rename {res => app/src/main/res}/values-fur-rIT/cm_strings.xml (100%) rename {res => app/src/main/res}/values-fy-rNL/cm_strings.xml (100%) rename {res => app/src/main/res}/values-ga-rIE/cm_strings.xml (100%) rename {res => app/src/main/res}/values-gd/cm_strings.xml (100%) rename {res => app/src/main/res}/values-gl/arrays.xml (100%) rename {res => app/src/main/res}/values-gl/cm_strings.xml (100%) rename {res => app/src/main/res}/values-gl/strings.xml (100%) rename {res => app/src/main/res}/values-gu/arrays.xml (100%) rename {res => app/src/main/res}/values-gu/cm_strings.xml (100%) rename {res => app/src/main/res}/values-gu/strings.xml (100%) rename {res => app/src/main/res}/values-hi/arrays.xml (100%) rename {res => app/src/main/res}/values-hi/strings.xml (100%) rename {res => app/src/main/res}/values-hr/arrays.xml (100%) rename {res => app/src/main/res}/values-hr/cm_strings.xml (100%) rename {res => app/src/main/res}/values-hr/strings.xml (100%) rename {res => app/src/main/res}/values-hu/arrays.xml (100%) rename {res => app/src/main/res}/values-hu/cm_strings.xml (100%) rename {res => app/src/main/res}/values-hu/strings.xml (100%) rename {res => app/src/main/res}/values-hy/arrays.xml (100%) rename {res => app/src/main/res}/values-hy/strings.xml (100%) rename {res => app/src/main/res}/values-in/arrays.xml (100%) rename {res => app/src/main/res}/values-in/cm_strings.xml (100%) rename {res => app/src/main/res}/values-in/strings.xml (100%) rename {res => app/src/main/res}/values-is/arrays.xml (100%) rename {res => app/src/main/res}/values-is/cm_strings.xml (100%) rename {res => app/src/main/res}/values-is/strings.xml (100%) rename {res => app/src/main/res}/values-it/arrays.xml (100%) rename {res => app/src/main/res}/values-it/cm_strings.xml (100%) rename {res => app/src/main/res}/values-it/strings.xml (100%) rename {res => app/src/main/res}/values-iw/arrays.xml (100%) rename {res => app/src/main/res}/values-iw/cm_strings.xml (100%) rename {res => app/src/main/res}/values-iw/strings.xml (100%) rename {res => app/src/main/res}/values-ja/arrays.xml (100%) rename {res => app/src/main/res}/values-ja/cm_strings.xml (100%) rename {res => app/src/main/res}/values-ja/strings.xml (100%) rename {res => app/src/main/res}/values-ka/arrays.xml (100%) rename {res => app/src/main/res}/values-ka/cm_strings.xml (100%) rename {res => app/src/main/res}/values-ka/strings.xml (100%) rename {res => app/src/main/res}/values-kab-rDZ/cm_strings.xml (100%) rename {res => app/src/main/res}/values-kk/arrays.xml (100%) rename {res => app/src/main/res}/values-kk/strings.xml (100%) rename {res => app/src/main/res}/values-km/arrays.xml (100%) rename {res => app/src/main/res}/values-km/strings.xml (100%) rename {res => app/src/main/res}/values-kn/arrays.xml (100%) rename {res => app/src/main/res}/values-kn/cm_strings.xml (100%) rename {res => app/src/main/res}/values-kn/strings.xml (100%) rename {res => app/src/main/res}/values-ko/arrays.xml (100%) rename {res => app/src/main/res}/values-ko/cm_strings.xml (100%) rename {res => app/src/main/res}/values-ko/strings.xml (100%) rename {res => app/src/main/res}/values-ky/arrays.xml (100%) rename {res => app/src/main/res}/values-ky/strings.xml (100%) rename {res => app/src/main/res}/values-lb/cm_strings.xml (100%) rename {res => app/src/main/res}/values-lo/arrays.xml (100%) rename {res => app/src/main/res}/values-lo/strings.xml (100%) rename {res => app/src/main/res}/values-lt/arrays.xml (100%) rename {res => app/src/main/res}/values-lt/strings.xml (100%) rename {res => app/src/main/res}/values-lv/arrays.xml (100%) rename {res => app/src/main/res}/values-lv/strings.xml (100%) rename {res => app/src/main/res}/values-mk/arrays.xml (100%) rename {res => app/src/main/res}/values-mk/strings.xml (100%) rename {res => app/src/main/res}/values-ml/arrays.xml (100%) rename {res => app/src/main/res}/values-ml/cm_strings.xml (100%) rename {res => app/src/main/res}/values-ml/strings.xml (100%) rename {res => app/src/main/res}/values-mn/arrays.xml (100%) rename {res => app/src/main/res}/values-mn/strings.xml (100%) rename {res => app/src/main/res}/values-mr/arrays.xml (100%) rename {res => app/src/main/res}/values-mr/cm_strings.xml (100%) rename {res => app/src/main/res}/values-mr/strings.xml (100%) rename {res => app/src/main/res}/values-ms/arrays.xml (100%) rename {res => app/src/main/res}/values-ms/strings.xml (100%) rename {res => app/src/main/res}/values-my/arrays.xml (100%) rename {res => app/src/main/res}/values-my/strings.xml (100%) rename {res => app/src/main/res}/values-nb/arrays.xml (100%) rename {res => app/src/main/res}/values-nb/cm_strings.xml (100%) rename {res => app/src/main/res}/values-nb/strings.xml (100%) rename {res => app/src/main/res}/values-ne/arrays.xml (100%) rename {res => app/src/main/res}/values-ne/strings.xml (100%) create mode 100644 app/src/main/res/values-night/colors.xml create mode 100644 app/src/main/res/values-night/lineage_bools.xml rename {res => app/src/main/res}/values-night/lineage_colors.xml (60%) create mode 100644 app/src/main/res/values-night/looply_colors.xml create mode 100644 app/src/main/res/values-night/looply_styles.xml create mode 100644 app/src/main/res/values-night/styles.xml rename {res => app/src/main/res}/values-nl/arrays.xml (100%) rename {res => app/src/main/res}/values-nl/cm_strings.xml (100%) rename {res => app/src/main/res}/values-nl/strings.xml (100%) rename {res => app/src/main/res}/values-nn-rNO/cm_strings.xml (100%) rename {res => app/src/main/res}/values-or/cm_strings.xml (100%) rename {res => app/src/main/res}/values-pa/arrays.xml (100%) rename {res => app/src/main/res}/values-pa/strings.xml (100%) rename {res => app/src/main/res}/values-pl/arrays.xml (100%) rename {res => app/src/main/res}/values-pl/cm_strings.xml (100%) rename {res => app/src/main/res}/values-pl/strings.xml (100%) rename {res => app/src/main/res}/values-pt-rBR/cm_strings.xml (100%) rename {res => app/src/main/res}/values-pt-rPT/arrays.xml (100%) rename {res => app/src/main/res}/values-pt-rPT/cm_strings.xml (100%) rename {res => app/src/main/res}/values-pt-rPT/strings.xml (100%) rename {res => app/src/main/res}/values-pt/arrays.xml (100%) rename {res => app/src/main/res}/values-pt/strings.xml (100%) rename {res => app/src/main/res}/values-ro/arrays.xml (100%) rename {res => app/src/main/res}/values-ro/cm_strings.xml (100%) rename {res => app/src/main/res}/values-ro/strings.xml (100%) rename {res => app/src/main/res}/values-ru/arrays.xml (100%) rename {res => app/src/main/res}/values-ru/cm_strings.xml (100%) rename {res => app/src/main/res}/values-ru/strings.xml (100%) rename {res => app/src/main/res}/values-sc-rIT/cm_strings.xml (100%) rename {res => app/src/main/res}/values-si/arrays.xml (100%) rename {res => app/src/main/res}/values-si/strings.xml (100%) rename {res => app/src/main/res}/values-sk/arrays.xml (100%) rename {res => app/src/main/res}/values-sk/cm_strings.xml (100%) rename {res => app/src/main/res}/values-sk/strings.xml (100%) rename {res => app/src/main/res}/values-sl/arrays.xml (100%) rename {res => app/src/main/res}/values-sl/cm_strings.xml (100%) rename {res => app/src/main/res}/values-sl/strings.xml (100%) rename {res => app/src/main/res}/values-sq/arrays.xml (100%) rename {res => app/src/main/res}/values-sq/cm_strings.xml (100%) rename {res => app/src/main/res}/values-sq/strings.xml (100%) rename {res => app/src/main/res}/values-sr/arrays.xml (100%) rename {res => app/src/main/res}/values-sr/cm_strings.xml (100%) rename {res => app/src/main/res}/values-sr/strings.xml (100%) rename {res => app/src/main/res}/values-sv/arrays.xml (100%) rename {res => app/src/main/res}/values-sv/cm_strings.xml (100%) rename {res => app/src/main/res}/values-sv/strings.xml (100%) rename {res => app/src/main/res}/values-sw/arrays.xml (100%) rename {res => app/src/main/res}/values-sw/strings.xml (100%) rename {res => app/src/main/res}/values-ta/arrays.xml (100%) rename {res => app/src/main/res}/values-ta/cm_strings.xml (100%) rename {res => app/src/main/res}/values-ta/strings.xml (100%) rename {res => app/src/main/res}/values-te/arrays.xml (100%) rename {res => app/src/main/res}/values-te/cm_strings.xml (100%) rename {res => app/src/main/res}/values-te/strings.xml (100%) rename {res => app/src/main/res}/values-th/arrays.xml (100%) rename {res => app/src/main/res}/values-th/cm_strings.xml (100%) rename {res => app/src/main/res}/values-th/strings.xml (100%) rename {res => app/src/main/res}/values-tl/arrays.xml (100%) rename {res => app/src/main/res}/values-tl/strings.xml (100%) rename {res => app/src/main/res}/values-tr/arrays.xml (100%) rename {res => app/src/main/res}/values-tr/cm_strings.xml (100%) rename {res => app/src/main/res}/values-tr/strings.xml (100%) rename {res => app/src/main/res}/values-ug/cm_strings.xml (100%) rename {res => app/src/main/res}/values-uk/arrays.xml (100%) rename {res => app/src/main/res}/values-uk/cm_strings.xml (100%) rename {res => app/src/main/res}/values-uk/strings.xml (100%) rename {res => app/src/main/res}/values-ur/arrays.xml (100%) rename {res => app/src/main/res}/values-ur/strings.xml (100%) rename {res => app/src/main/res}/values-uz/arrays.xml (100%) rename {res => app/src/main/res}/values-uz/strings.xml (100%) rename {res => app/src/main/res}/values-vi/arrays.xml (100%) rename {res => app/src/main/res}/values-vi/cm_strings.xml (100%) rename {res => app/src/main/res}/values-vi/strings.xml (100%) rename {res => app/src/main/res}/values-zh-rCN/arrays.xml (100%) rename {res => app/src/main/res}/values-zh-rCN/cm_strings.xml (100%) rename {res => app/src/main/res}/values-zh-rCN/strings.xml (100%) rename {res => app/src/main/res}/values-zh-rHK/arrays.xml (100%) rename {res => app/src/main/res}/values-zh-rHK/strings.xml (100%) rename {res => app/src/main/res}/values-zh-rTW/arrays.xml (100%) rename {res => app/src/main/res}/values-zh-rTW/cm_strings.xml (100%) rename {res => app/src/main/res}/values-zh-rTW/strings.xml (100%) rename {res => app/src/main/res}/values-zu/arrays.xml (100%) rename {res => app/src/main/res}/values-zu/strings.xml (100%) rename {res => app/src/main/res}/values/arrays.xml (100%) rename {res => app/src/main/res}/values/attrs.xml (100%) rename {res => app/src/main/res}/values/cm_strings.xml (100%) rename {res => app/src/main/res}/values/colors.xml (50%) rename {res => app/src/main/res}/values/config.xml (100%) rename {res => app/src/main/res}/values/constants.xml (100%) rename {res => app/src/main/res}/values/dimens.xml (98%) create mode 100644 app/src/main/res/values/home_colors.xml create mode 100644 app/src/main/res/values/home_ids.xml create mode 100644 app/src/main/res/values/home_styles.xml rename {res => app/src/main/res}/values/lineage_bools.xml (100%) rename {res => app/src/main/res}/values/lineage_colors.xml (62%) rename {res => app/src/main/res}/values/lineage_constants.xml (100%) create mode 100644 app/src/main/res/values/looply_colors.xml create mode 100644 app/src/main/res/values/looply_dimens.xml create mode 100644 app/src/main/res/values/looply_strings.xml create mode 100644 app/src/main/res/values/looply_styles.xml rename {res => app/src/main/res}/values/strings.xml (100%) rename {res => app/src/main/res}/values/styles.xml (96%) rename {res => app/src/main/res}/values/versions.xml (100%) rename {res => app/src/main/res}/xml-mcc204-mnc04/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc208-mnc01/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc208-mnc10/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc208-mnc15/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc208-mnc20/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc208-mnc26/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc214-mnc01/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc214-mnc03/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc214-mnc07/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc218-mnc05/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc222-mnc01/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc222-mnc08/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc234-mnc10/mms_config.xml (100%) create mode 100644 app/src/main/res/xml-mcc234-mnc11 rename {res => app/src/main/res}/xml-mcc234-mnc15/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc238-mnc02/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc240-mnc01/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc240-mnc04/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc240-mnc08/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc240-mnc24/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc242-mnc01/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc242-mnc02/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc262-mnc07/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc274-mnc02/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc274-mnc03/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc286-mnc01/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc286-mnc03/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc294-mnc01/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc294-mnc02/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc294-mnc03/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc302-mnc220/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc302-mnc221/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc302-mnc270/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc302-mnc290/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc302-mnc320/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc302-mnc370/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc302-mnc490/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc302-mnc500/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc302-mnc510/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc302-mnc520/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc302-mnc610/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc302-mnc660/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc302-mnc720/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc302-mnc780/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc004/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc005/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc010/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc026/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc040/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc070/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc090/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc120/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc130/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc150/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc170/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc260/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc360/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc380/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc410/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc420/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc450/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc490/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc560/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc580/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc600/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc680/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc750/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc770/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc920/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc310-mnc980/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc012/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc070/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc100/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc180/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc220/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc221/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc222/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc223/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc224/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc225/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc226/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc227/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc228/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc229/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc230/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc340/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc370/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc410/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc430/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc440/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc480/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc490/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc580/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc581/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc582/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc583/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc584/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc585/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc586/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc587/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc588/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc589/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc590/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc311-mnc870/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc312-mnc160/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc312-mnc530/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc334-mnc020/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc418-mnc05/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc418-mnc20/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc418-mnc30/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc420-mnc04/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc440-mnc10/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc440-mnc11/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc440-mnc20/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc450-mnc00/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc450-mnc02/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc450-mnc05/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc450-mnc06/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc450-mnc08/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc505-mnc01/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc530-mnc05/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc604-mnc00/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc604-mnc02/mms_config.xml (100%) rename {res => app/src/main/res}/xml-mcc647-mnc10/mms_config.xml (100%) rename {res => app/src/main/res}/xml/mms_config.xml (100%) rename {res => app/src/main/res}/xml/preferences_application.xml (100%) rename {res => app/src/main/res}/xml/preferences_per_subscription.xml (100%) rename {res => app/src/main/res}/xml/widget_conversation.xml (100%) rename {res => app/src/main/res}/xml/widget_conversation_list.xml (100%) create mode 100644 build.gradle create mode 100644 design/home_nav/automatye.svg create mode 100644 design/home_nav/compose_fab.svg create mode 100644 design/home_nav/contact.svg create mode 100644 design/home_nav/messages.svg create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat create mode 160000 modules/chips create mode 160000 modules/colorpicker create mode 160000 modules/photoviewer create mode 160000 modules/vcard create mode 100644 packages_apps_Messaging.code-workspace delete mode 100644 res/layout/contact_picker_fragment.xml delete mode 100644 res/layout/conversation_list_fragment.xml delete mode 100644 res/layout/conversation_list_item_view.xml delete mode 100644 res/values-night/colors.xml delete mode 100644 res/values-night/lineage_bools.xml delete mode 120000 res/xml-mcc234-mnc11 create mode 100644 settings.gradle delete mode 100644 src/com/android/messaging/ui/conversationlist/ConversationListAdapter.java delete mode 100644 src/com/android/messaging/ui/conversationlist/ConversationListFragment.java create mode 100644 tools/looply_applied.png create mode 100644 tools/seed_contacts.sh create mode 100644 tools/seed_demo_data.ps1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d64626d --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +*.iml +.cursor/ +.gradle/ +/local.properties +/.idea/ +.DS_Store +/build/ +/captures/ +.externalNativeBuild/ +.cxx/ +app/build/ +modules/*/build/ +modules/*/.git/ +*.apk +*.ap_ +*.dex +*.class +bin/ +gen/ +out/ +tools/messaging_*.png +tools/stitch-*.txt diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..f117773 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,89 @@ +plugins { + id 'com.android.application' +} + +android { + namespace 'com.android.messaging' + compileSdk 35 + + defaultConfig { + applicationId 'com.android.messaging' + minSdk 33 + targetSdk 34 + versionCode 10001040 + versionName '1.0.001' + vectorDrawables.useSupportLibrary true + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + + buildTypes { + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), + rootProject.file('proguard-release.flags'), + rootProject.file('proguard.flags') + } + debug { + minifyEnabled false + } + } + + lint { + abortOnError false + } + + sourceSets { + main { + manifest.srcFile 'src/main/AndroidManifest.xml' + java.srcDirs = ['src/main/java'] + res.srcDirs = ['src/main/res'] + assets.srcDirs = ['src/main/assets'] + } + } +} + +dependencies { + implementation project(':modules:colorpicker') + implementation project(':modules:chips') + implementation project(':modules:photoviewer') + implementation project(':modules:vcard') + + implementation 'androidx.activity:activity:1.9.3' + implementation 'androidx.annotation:annotation:1.8.2' + implementation 'androidx.appcompat:appcompat:1.7.0' + implementation 'androidx.collection:collection:1.4.4' + implementation 'androidx.core:core:1.15.0' + implementation 'androidx.exifinterface:exifinterface:1.3.7' + implementation 'androidx.fragment:fragment:1.8.5' + implementation 'androidx.media:media:1.7.0' + implementation 'androidx.palette:palette:1.0.0' + implementation 'androidx.preference:preference:1.2.1' + implementation 'androidx.recyclerview:recyclerview:1.3.2' + implementation 'androidx.viewpager:viewpager:1.0.0' + implementation 'com.google.android.material:material:1.12.0' + implementation 'com.google.guava:guava:33.3.1-android' + implementation 'com.googlecode.libphonenumber:libphonenumber:8.13.50' +} + +def messagingAvdSerial = rootProject.findProperty('messaging.avd.serial') ?: 'emulator-5556' +def adbExecutable = new File(android.sdkDirectory, 'platform-tools/adb.exe') + +tasks.register('installMessaging', Exec) { + group = 'install' + description = "Install debug APK on ${messagingAvdSerial} only" + dependsOn 'assembleDebug' + def apk = layout.buildDirectory.file('outputs/apk/debug/app-debug.apk').get().asFile + commandLine adbExecutable.absolutePath, '-s', messagingAvdSerial, 'install', '-r', apk.absolutePath +} + +tasks.register('launchMessaging', Exec) { + group = 'install' + description = "Launch Messaging on ${messagingAvdSerial}" + dependsOn 'installMessaging' + commandLine adbExecutable.absolutePath, '-s', messagingAvdSerial, 'shell', 'am', 'start', + '-n', 'com.android.messaging/.ui.conversationlist.ConversationListActivity' +} diff --git a/AndroidManifest.xml b/app/src/main/AndroidManifest.xml similarity index 99% rename from AndroidManifest.xml rename to app/src/main/AndroidManifest.xml index c6ba856..a789ef2 100644 --- a/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,10 +19,6 @@ package="com.android.messaging" android:installLocation="internalOnly"> - - diff --git a/assets/licenses.html b/app/src/main/assets/licenses.html similarity index 100% rename from assets/licenses.html rename to app/src/main/assets/licenses.html diff --git a/src/android/support/v7/mms/ApnException.java b/app/src/main/java/android/support/v7/mms/ApnException.java similarity index 100% rename from src/android/support/v7/mms/ApnException.java rename to app/src/main/java/android/support/v7/mms/ApnException.java diff --git a/src/android/support/v7/mms/ApnSettingsLoader.java b/app/src/main/java/android/support/v7/mms/ApnSettingsLoader.java similarity index 100% rename from src/android/support/v7/mms/ApnSettingsLoader.java rename to app/src/main/java/android/support/v7/mms/ApnSettingsLoader.java diff --git a/src/android/support/v7/mms/ApnsXmlParser.java b/app/src/main/java/android/support/v7/mms/ApnsXmlParser.java similarity index 100% rename from src/android/support/v7/mms/ApnsXmlParser.java rename to app/src/main/java/android/support/v7/mms/ApnsXmlParser.java diff --git a/src/android/support/v7/mms/CarrierConfigValuesLoader.java b/app/src/main/java/android/support/v7/mms/CarrierConfigValuesLoader.java similarity index 100% rename from src/android/support/v7/mms/CarrierConfigValuesLoader.java rename to app/src/main/java/android/support/v7/mms/CarrierConfigValuesLoader.java diff --git a/src/android/support/v7/mms/CarrierConfigXmlParser.java b/app/src/main/java/android/support/v7/mms/CarrierConfigXmlParser.java similarity index 100% rename from src/android/support/v7/mms/CarrierConfigXmlParser.java rename to app/src/main/java/android/support/v7/mms/CarrierConfigXmlParser.java diff --git a/src/android/support/v7/mms/DefaultApnSettingsLoader.java b/app/src/main/java/android/support/v7/mms/DefaultApnSettingsLoader.java similarity index 100% rename from src/android/support/v7/mms/DefaultApnSettingsLoader.java rename to app/src/main/java/android/support/v7/mms/DefaultApnSettingsLoader.java diff --git a/src/android/support/v7/mms/DefaultCarrierConfigValuesLoader.java b/app/src/main/java/android/support/v7/mms/DefaultCarrierConfigValuesLoader.java similarity index 100% rename from src/android/support/v7/mms/DefaultCarrierConfigValuesLoader.java rename to app/src/main/java/android/support/v7/mms/DefaultCarrierConfigValuesLoader.java diff --git a/src/android/support/v7/mms/DefaultUserAgentInfoLoader.java b/app/src/main/java/android/support/v7/mms/DefaultUserAgentInfoLoader.java similarity index 100% rename from src/android/support/v7/mms/DefaultUserAgentInfoLoader.java rename to app/src/main/java/android/support/v7/mms/DefaultUserAgentInfoLoader.java diff --git a/src/android/support/v7/mms/DownloadRequest.java b/app/src/main/java/android/support/v7/mms/DownloadRequest.java similarity index 100% rename from src/android/support/v7/mms/DownloadRequest.java rename to app/src/main/java/android/support/v7/mms/DownloadRequest.java diff --git a/src/android/support/v7/mms/MmsHttpClient.java b/app/src/main/java/android/support/v7/mms/MmsHttpClient.java similarity index 100% rename from src/android/support/v7/mms/MmsHttpClient.java rename to app/src/main/java/android/support/v7/mms/MmsHttpClient.java diff --git a/src/android/support/v7/mms/MmsHttpException.java b/app/src/main/java/android/support/v7/mms/MmsHttpException.java similarity index 100% rename from src/android/support/v7/mms/MmsHttpException.java rename to app/src/main/java/android/support/v7/mms/MmsHttpException.java diff --git a/src/android/support/v7/mms/MmsManager.java b/app/src/main/java/android/support/v7/mms/MmsManager.java similarity index 100% rename from src/android/support/v7/mms/MmsManager.java rename to app/src/main/java/android/support/v7/mms/MmsManager.java diff --git a/src/android/support/v7/mms/MmsNetworkException.java b/app/src/main/java/android/support/v7/mms/MmsNetworkException.java similarity index 100% rename from src/android/support/v7/mms/MmsNetworkException.java rename to app/src/main/java/android/support/v7/mms/MmsNetworkException.java diff --git a/src/android/support/v7/mms/MmsNetworkManager.java b/app/src/main/java/android/support/v7/mms/MmsNetworkManager.java similarity index 100% rename from src/android/support/v7/mms/MmsNetworkManager.java rename to app/src/main/java/android/support/v7/mms/MmsNetworkManager.java diff --git a/src/android/support/v7/mms/MmsRequest.java b/app/src/main/java/android/support/v7/mms/MmsRequest.java similarity index 100% rename from src/android/support/v7/mms/MmsRequest.java rename to app/src/main/java/android/support/v7/mms/MmsRequest.java diff --git a/src/android/support/v7/mms/MmsService.java b/app/src/main/java/android/support/v7/mms/MmsService.java similarity index 100% rename from src/android/support/v7/mms/MmsService.java rename to app/src/main/java/android/support/v7/mms/MmsService.java diff --git a/src/android/support/v7/mms/MmsXmlResourceParser.java b/app/src/main/java/android/support/v7/mms/MmsXmlResourceParser.java similarity index 100% rename from src/android/support/v7/mms/MmsXmlResourceParser.java rename to app/src/main/java/android/support/v7/mms/MmsXmlResourceParser.java diff --git a/src/android/support/v7/mms/PhoneNumberHelper.java b/app/src/main/java/android/support/v7/mms/PhoneNumberHelper.java similarity index 100% rename from src/android/support/v7/mms/PhoneNumberHelper.java rename to app/src/main/java/android/support/v7/mms/PhoneNumberHelper.java diff --git a/src/android/support/v7/mms/SendRequest.java b/app/src/main/java/android/support/v7/mms/SendRequest.java similarity index 100% rename from src/android/support/v7/mms/SendRequest.java rename to app/src/main/java/android/support/v7/mms/SendRequest.java diff --git a/src/android/support/v7/mms/UserAgentInfoLoader.java b/app/src/main/java/android/support/v7/mms/UserAgentInfoLoader.java similarity index 100% rename from src/android/support/v7/mms/UserAgentInfoLoader.java rename to app/src/main/java/android/support/v7/mms/UserAgentInfoLoader.java diff --git a/src/android/support/v7/mms/Utils.java b/app/src/main/java/android/support/v7/mms/Utils.java similarity index 100% rename from src/android/support/v7/mms/Utils.java rename to app/src/main/java/android/support/v7/mms/Utils.java diff --git a/src/android/support/v7/mms/pdu/AcknowledgeInd.java b/app/src/main/java/android/support/v7/mms/pdu/AcknowledgeInd.java similarity index 100% rename from src/android/support/v7/mms/pdu/AcknowledgeInd.java rename to app/src/main/java/android/support/v7/mms/pdu/AcknowledgeInd.java diff --git a/src/android/support/v7/mms/pdu/Base64.java b/app/src/main/java/android/support/v7/mms/pdu/Base64.java similarity index 100% rename from src/android/support/v7/mms/pdu/Base64.java rename to app/src/main/java/android/support/v7/mms/pdu/Base64.java diff --git a/src/android/support/v7/mms/pdu/CharacterSets.java b/app/src/main/java/android/support/v7/mms/pdu/CharacterSets.java similarity index 100% rename from src/android/support/v7/mms/pdu/CharacterSets.java rename to app/src/main/java/android/support/v7/mms/pdu/CharacterSets.java diff --git a/src/android/support/v7/mms/pdu/ContentType.java b/app/src/main/java/android/support/v7/mms/pdu/ContentType.java similarity index 100% rename from src/android/support/v7/mms/pdu/ContentType.java rename to app/src/main/java/android/support/v7/mms/pdu/ContentType.java diff --git a/src/android/support/v7/mms/pdu/DeliveryInd.java b/app/src/main/java/android/support/v7/mms/pdu/DeliveryInd.java similarity index 100% rename from src/android/support/v7/mms/pdu/DeliveryInd.java rename to app/src/main/java/android/support/v7/mms/pdu/DeliveryInd.java diff --git a/src/android/support/v7/mms/pdu/EncodedStringValue.java b/app/src/main/java/android/support/v7/mms/pdu/EncodedStringValue.java similarity index 100% rename from src/android/support/v7/mms/pdu/EncodedStringValue.java rename to app/src/main/java/android/support/v7/mms/pdu/EncodedStringValue.java diff --git a/src/android/support/v7/mms/pdu/GenericPdu.java b/app/src/main/java/android/support/v7/mms/pdu/GenericPdu.java similarity index 100% rename from src/android/support/v7/mms/pdu/GenericPdu.java rename to app/src/main/java/android/support/v7/mms/pdu/GenericPdu.java diff --git a/src/android/support/v7/mms/pdu/InvalidHeaderValueException.java b/app/src/main/java/android/support/v7/mms/pdu/InvalidHeaderValueException.java similarity index 100% rename from src/android/support/v7/mms/pdu/InvalidHeaderValueException.java rename to app/src/main/java/android/support/v7/mms/pdu/InvalidHeaderValueException.java diff --git a/src/android/support/v7/mms/pdu/MmsException.java b/app/src/main/java/android/support/v7/mms/pdu/MmsException.java similarity index 100% rename from src/android/support/v7/mms/pdu/MmsException.java rename to app/src/main/java/android/support/v7/mms/pdu/MmsException.java diff --git a/src/android/support/v7/mms/pdu/MultimediaMessagePdu.java b/app/src/main/java/android/support/v7/mms/pdu/MultimediaMessagePdu.java similarity index 100% rename from src/android/support/v7/mms/pdu/MultimediaMessagePdu.java rename to app/src/main/java/android/support/v7/mms/pdu/MultimediaMessagePdu.java diff --git a/src/android/support/v7/mms/pdu/NotificationInd.java b/app/src/main/java/android/support/v7/mms/pdu/NotificationInd.java similarity index 100% rename from src/android/support/v7/mms/pdu/NotificationInd.java rename to app/src/main/java/android/support/v7/mms/pdu/NotificationInd.java diff --git a/src/android/support/v7/mms/pdu/NotifyRespInd.java b/app/src/main/java/android/support/v7/mms/pdu/NotifyRespInd.java similarity index 100% rename from src/android/support/v7/mms/pdu/NotifyRespInd.java rename to app/src/main/java/android/support/v7/mms/pdu/NotifyRespInd.java diff --git a/src/android/support/v7/mms/pdu/PduBody.java b/app/src/main/java/android/support/v7/mms/pdu/PduBody.java similarity index 100% rename from src/android/support/v7/mms/pdu/PduBody.java rename to app/src/main/java/android/support/v7/mms/pdu/PduBody.java diff --git a/src/android/support/v7/mms/pdu/PduContentTypes.java b/app/src/main/java/android/support/v7/mms/pdu/PduContentTypes.java similarity index 100% rename from src/android/support/v7/mms/pdu/PduContentTypes.java rename to app/src/main/java/android/support/v7/mms/pdu/PduContentTypes.java diff --git a/src/android/support/v7/mms/pdu/PduHeaders.java b/app/src/main/java/android/support/v7/mms/pdu/PduHeaders.java similarity index 100% rename from src/android/support/v7/mms/pdu/PduHeaders.java rename to app/src/main/java/android/support/v7/mms/pdu/PduHeaders.java diff --git a/src/android/support/v7/mms/pdu/PduParser.java b/app/src/main/java/android/support/v7/mms/pdu/PduParser.java similarity index 100% rename from src/android/support/v7/mms/pdu/PduParser.java rename to app/src/main/java/android/support/v7/mms/pdu/PduParser.java diff --git a/src/android/support/v7/mms/pdu/PduPart.java b/app/src/main/java/android/support/v7/mms/pdu/PduPart.java similarity index 100% rename from src/android/support/v7/mms/pdu/PduPart.java rename to app/src/main/java/android/support/v7/mms/pdu/PduPart.java diff --git a/src/android/support/v7/mms/pdu/QuotedPrintable.java b/app/src/main/java/android/support/v7/mms/pdu/QuotedPrintable.java similarity index 100% rename from src/android/support/v7/mms/pdu/QuotedPrintable.java rename to app/src/main/java/android/support/v7/mms/pdu/QuotedPrintable.java diff --git a/src/android/support/v7/mms/pdu/ReadOrigInd.java b/app/src/main/java/android/support/v7/mms/pdu/ReadOrigInd.java similarity index 100% rename from src/android/support/v7/mms/pdu/ReadOrigInd.java rename to app/src/main/java/android/support/v7/mms/pdu/ReadOrigInd.java diff --git a/src/android/support/v7/mms/pdu/ReadRecInd.java b/app/src/main/java/android/support/v7/mms/pdu/ReadRecInd.java similarity index 100% rename from src/android/support/v7/mms/pdu/ReadRecInd.java rename to app/src/main/java/android/support/v7/mms/pdu/ReadRecInd.java diff --git a/src/android/support/v7/mms/pdu/RetrieveConf.java b/app/src/main/java/android/support/v7/mms/pdu/RetrieveConf.java similarity index 100% rename from src/android/support/v7/mms/pdu/RetrieveConf.java rename to app/src/main/java/android/support/v7/mms/pdu/RetrieveConf.java diff --git a/src/android/support/v7/mms/pdu/SendConf.java b/app/src/main/java/android/support/v7/mms/pdu/SendConf.java similarity index 100% rename from src/android/support/v7/mms/pdu/SendConf.java rename to app/src/main/java/android/support/v7/mms/pdu/SendConf.java diff --git a/src/android/support/v7/mms/pdu/SendReq.java b/app/src/main/java/android/support/v7/mms/pdu/SendReq.java similarity index 100% rename from src/android/support/v7/mms/pdu/SendReq.java rename to app/src/main/java/android/support/v7/mms/pdu/SendReq.java diff --git a/src/com/android/messaging/BugleApplication.java b/app/src/main/java/com/android/messaging/BugleApplication.java similarity index 100% rename from src/com/android/messaging/BugleApplication.java rename to app/src/main/java/com/android/messaging/BugleApplication.java diff --git a/src/com/android/messaging/Factory.java b/app/src/main/java/com/android/messaging/Factory.java similarity index 100% rename from src/com/android/messaging/Factory.java rename to app/src/main/java/com/android/messaging/Factory.java diff --git a/src/com/android/messaging/FactoryImpl.java b/app/src/main/java/com/android/messaging/FactoryImpl.java similarity index 100% rename from src/com/android/messaging/FactoryImpl.java rename to app/src/main/java/com/android/messaging/FactoryImpl.java diff --git a/src/com/android/messaging/datamodel/BoundCursorLoader.java b/app/src/main/java/com/android/messaging/datamodel/BoundCursorLoader.java similarity index 100% rename from src/com/android/messaging/datamodel/BoundCursorLoader.java rename to app/src/main/java/com/android/messaging/datamodel/BoundCursorLoader.java diff --git a/src/com/android/messaging/datamodel/BugleDatabaseOperations.java b/app/src/main/java/com/android/messaging/datamodel/BugleDatabaseOperations.java similarity index 100% rename from src/com/android/messaging/datamodel/BugleDatabaseOperations.java rename to app/src/main/java/com/android/messaging/datamodel/BugleDatabaseOperations.java diff --git a/src/com/android/messaging/datamodel/BugleNotifications.java b/app/src/main/java/com/android/messaging/datamodel/BugleNotifications.java similarity index 100% rename from src/com/android/messaging/datamodel/BugleNotifications.java rename to app/src/main/java/com/android/messaging/datamodel/BugleNotifications.java diff --git a/src/com/android/messaging/datamodel/BugleRecipientEntry.java b/app/src/main/java/com/android/messaging/datamodel/BugleRecipientEntry.java similarity index 100% rename from src/com/android/messaging/datamodel/BugleRecipientEntry.java rename to app/src/main/java/com/android/messaging/datamodel/BugleRecipientEntry.java diff --git a/src/com/android/messaging/datamodel/ConversationImagePartsView.java b/app/src/main/java/com/android/messaging/datamodel/ConversationImagePartsView.java similarity index 100% rename from src/com/android/messaging/datamodel/ConversationImagePartsView.java rename to app/src/main/java/com/android/messaging/datamodel/ConversationImagePartsView.java diff --git a/src/com/android/messaging/datamodel/CursorQueryData.java b/app/src/main/java/com/android/messaging/datamodel/CursorQueryData.java similarity index 100% rename from src/com/android/messaging/datamodel/CursorQueryData.java rename to app/src/main/java/com/android/messaging/datamodel/CursorQueryData.java diff --git a/src/com/android/messaging/datamodel/DataModel.java b/app/src/main/java/com/android/messaging/datamodel/DataModel.java similarity index 100% rename from src/com/android/messaging/datamodel/DataModel.java rename to app/src/main/java/com/android/messaging/datamodel/DataModel.java diff --git a/src/com/android/messaging/datamodel/DataModelImpl.java b/app/src/main/java/com/android/messaging/datamodel/DataModelImpl.java similarity index 100% rename from src/com/android/messaging/datamodel/DataModelImpl.java rename to app/src/main/java/com/android/messaging/datamodel/DataModelImpl.java diff --git a/src/com/android/messaging/datamodel/DatabaseHelper.java b/app/src/main/java/com/android/messaging/datamodel/DatabaseHelper.java similarity index 100% rename from src/com/android/messaging/datamodel/DatabaseHelper.java rename to app/src/main/java/com/android/messaging/datamodel/DatabaseHelper.java diff --git a/src/com/android/messaging/datamodel/DatabaseUpgradeHelper.java b/app/src/main/java/com/android/messaging/datamodel/DatabaseUpgradeHelper.java similarity index 100% rename from src/com/android/messaging/datamodel/DatabaseUpgradeHelper.java rename to app/src/main/java/com/android/messaging/datamodel/DatabaseUpgradeHelper.java diff --git a/src/com/android/messaging/datamodel/DatabaseWrapper.java b/app/src/main/java/com/android/messaging/datamodel/DatabaseWrapper.java similarity index 100% rename from src/com/android/messaging/datamodel/DatabaseWrapper.java rename to app/src/main/java/com/android/messaging/datamodel/DatabaseWrapper.java diff --git a/src/com/android/messaging/datamodel/FileProvider.java b/app/src/main/java/com/android/messaging/datamodel/FileProvider.java similarity index 100% rename from src/com/android/messaging/datamodel/FileProvider.java rename to app/src/main/java/com/android/messaging/datamodel/FileProvider.java diff --git a/src/com/android/messaging/datamodel/FrequentContactsCursorBuilder.java b/app/src/main/java/com/android/messaging/datamodel/FrequentContactsCursorBuilder.java similarity index 100% rename from src/com/android/messaging/datamodel/FrequentContactsCursorBuilder.java rename to app/src/main/java/com/android/messaging/datamodel/FrequentContactsCursorBuilder.java diff --git a/src/com/android/messaging/datamodel/FrequentContactsCursorQueryData.java b/app/src/main/java/com/android/messaging/datamodel/FrequentContactsCursorQueryData.java similarity index 100% rename from src/com/android/messaging/datamodel/FrequentContactsCursorQueryData.java rename to app/src/main/java/com/android/messaging/datamodel/FrequentContactsCursorQueryData.java diff --git a/src/com/android/messaging/datamodel/MediaScratchFileProvider.java b/app/src/main/java/com/android/messaging/datamodel/MediaScratchFileProvider.java similarity index 100% rename from src/com/android/messaging/datamodel/MediaScratchFileProvider.java rename to app/src/main/java/com/android/messaging/datamodel/MediaScratchFileProvider.java diff --git a/src/com/android/messaging/datamodel/MemoryCacheManager.java b/app/src/main/java/com/android/messaging/datamodel/MemoryCacheManager.java similarity index 100% rename from src/com/android/messaging/datamodel/MemoryCacheManager.java rename to app/src/main/java/com/android/messaging/datamodel/MemoryCacheManager.java diff --git a/src/com/android/messaging/datamodel/MessageNotificationState.java b/app/src/main/java/com/android/messaging/datamodel/MessageNotificationState.java similarity index 100% rename from src/com/android/messaging/datamodel/MessageNotificationState.java rename to app/src/main/java/com/android/messaging/datamodel/MessageNotificationState.java diff --git a/src/com/android/messaging/datamodel/MessageTextStats.java b/app/src/main/java/com/android/messaging/datamodel/MessageTextStats.java similarity index 100% rename from src/com/android/messaging/datamodel/MessageTextStats.java rename to app/src/main/java/com/android/messaging/datamodel/MessageTextStats.java diff --git a/src/com/android/messaging/datamodel/MessagingContentProvider.java b/app/src/main/java/com/android/messaging/datamodel/MessagingContentProvider.java similarity index 100% rename from src/com/android/messaging/datamodel/MessagingContentProvider.java rename to app/src/main/java/com/android/messaging/datamodel/MessagingContentProvider.java diff --git a/src/com/android/messaging/datamodel/MmsFileProvider.java b/app/src/main/java/com/android/messaging/datamodel/MmsFileProvider.java similarity index 100% rename from src/com/android/messaging/datamodel/MmsFileProvider.java rename to app/src/main/java/com/android/messaging/datamodel/MmsFileProvider.java diff --git a/src/com/android/messaging/datamodel/NoConfirmationSmsSendService.java b/app/src/main/java/com/android/messaging/datamodel/NoConfirmationSmsSendService.java similarity index 100% rename from src/com/android/messaging/datamodel/NoConfirmationSmsSendService.java rename to app/src/main/java/com/android/messaging/datamodel/NoConfirmationSmsSendService.java diff --git a/src/com/android/messaging/datamodel/NotificationState.java b/app/src/main/java/com/android/messaging/datamodel/NotificationState.java similarity index 100% rename from src/com/android/messaging/datamodel/NotificationState.java rename to app/src/main/java/com/android/messaging/datamodel/NotificationState.java diff --git a/src/com/android/messaging/datamodel/ParticipantRefresh.java b/app/src/main/java/com/android/messaging/datamodel/ParticipantRefresh.java similarity index 100% rename from src/com/android/messaging/datamodel/ParticipantRefresh.java rename to app/src/main/java/com/android/messaging/datamodel/ParticipantRefresh.java diff --git a/src/com/android/messaging/datamodel/SyncManager.java b/app/src/main/java/com/android/messaging/datamodel/SyncManager.java similarity index 100% rename from src/com/android/messaging/datamodel/SyncManager.java rename to app/src/main/java/com/android/messaging/datamodel/SyncManager.java diff --git a/src/com/android/messaging/datamodel/action/Action.java b/app/src/main/java/com/android/messaging/datamodel/action/Action.java similarity index 100% rename from src/com/android/messaging/datamodel/action/Action.java rename to app/src/main/java/com/android/messaging/datamodel/action/Action.java diff --git a/src/com/android/messaging/datamodel/action/ActionMonitor.java b/app/src/main/java/com/android/messaging/datamodel/action/ActionMonitor.java similarity index 100% rename from src/com/android/messaging/datamodel/action/ActionMonitor.java rename to app/src/main/java/com/android/messaging/datamodel/action/ActionMonitor.java diff --git a/src/com/android/messaging/datamodel/action/ActionService.java b/app/src/main/java/com/android/messaging/datamodel/action/ActionService.java similarity index 100% rename from src/com/android/messaging/datamodel/action/ActionService.java rename to app/src/main/java/com/android/messaging/datamodel/action/ActionService.java diff --git a/src/com/android/messaging/datamodel/action/ActionServiceImpl.java b/app/src/main/java/com/android/messaging/datamodel/action/ActionServiceImpl.java similarity index 100% rename from src/com/android/messaging/datamodel/action/ActionServiceImpl.java rename to app/src/main/java/com/android/messaging/datamodel/action/ActionServiceImpl.java diff --git a/src/com/android/messaging/datamodel/action/BackgroundWorker.java b/app/src/main/java/com/android/messaging/datamodel/action/BackgroundWorker.java similarity index 100% rename from src/com/android/messaging/datamodel/action/BackgroundWorker.java rename to app/src/main/java/com/android/messaging/datamodel/action/BackgroundWorker.java diff --git a/src/com/android/messaging/datamodel/action/BackgroundWorkerService.java b/app/src/main/java/com/android/messaging/datamodel/action/BackgroundWorkerService.java similarity index 100% rename from src/com/android/messaging/datamodel/action/BackgroundWorkerService.java rename to app/src/main/java/com/android/messaging/datamodel/action/BackgroundWorkerService.java diff --git a/src/com/android/messaging/datamodel/action/BugleActionToasts.java b/app/src/main/java/com/android/messaging/datamodel/action/BugleActionToasts.java similarity index 100% rename from src/com/android/messaging/datamodel/action/BugleActionToasts.java rename to app/src/main/java/com/android/messaging/datamodel/action/BugleActionToasts.java diff --git a/src/com/android/messaging/datamodel/action/DeleteConversationAction.java b/app/src/main/java/com/android/messaging/datamodel/action/DeleteConversationAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/DeleteConversationAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/DeleteConversationAction.java diff --git a/src/com/android/messaging/datamodel/action/DeleteMessageAction.java b/app/src/main/java/com/android/messaging/datamodel/action/DeleteMessageAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/DeleteMessageAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/DeleteMessageAction.java diff --git a/src/com/android/messaging/datamodel/action/DownloadMmsAction.java b/app/src/main/java/com/android/messaging/datamodel/action/DownloadMmsAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/DownloadMmsAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/DownloadMmsAction.java diff --git a/src/com/android/messaging/datamodel/action/FixupMessageStatusOnStartupAction.java b/app/src/main/java/com/android/messaging/datamodel/action/FixupMessageStatusOnStartupAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/FixupMessageStatusOnStartupAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/FixupMessageStatusOnStartupAction.java diff --git a/src/com/android/messaging/datamodel/action/GetOrCreateConversationAction.java b/app/src/main/java/com/android/messaging/datamodel/action/GetOrCreateConversationAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/GetOrCreateConversationAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/GetOrCreateConversationAction.java diff --git a/src/com/android/messaging/datamodel/action/InsertNewMessageAction.java b/app/src/main/java/com/android/messaging/datamodel/action/InsertNewMessageAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/InsertNewMessageAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/InsertNewMessageAction.java diff --git a/src/com/android/messaging/datamodel/action/MarkAsReadAction.java b/app/src/main/java/com/android/messaging/datamodel/action/MarkAsReadAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/MarkAsReadAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/MarkAsReadAction.java diff --git a/src/com/android/messaging/datamodel/action/MarkAsSeenAction.java b/app/src/main/java/com/android/messaging/datamodel/action/MarkAsSeenAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/MarkAsSeenAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/MarkAsSeenAction.java diff --git a/src/com/android/messaging/datamodel/action/ProcessDeliveryReportAction.java b/app/src/main/java/com/android/messaging/datamodel/action/ProcessDeliveryReportAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/ProcessDeliveryReportAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/ProcessDeliveryReportAction.java diff --git a/src/com/android/messaging/datamodel/action/ProcessDownloadedMmsAction.java b/app/src/main/java/com/android/messaging/datamodel/action/ProcessDownloadedMmsAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/ProcessDownloadedMmsAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/ProcessDownloadedMmsAction.java diff --git a/src/com/android/messaging/datamodel/action/ProcessPendingMessagesAction.java b/app/src/main/java/com/android/messaging/datamodel/action/ProcessPendingMessagesAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/ProcessPendingMessagesAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/ProcessPendingMessagesAction.java diff --git a/src/com/android/messaging/datamodel/action/ProcessSentMessageAction.java b/app/src/main/java/com/android/messaging/datamodel/action/ProcessSentMessageAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/ProcessSentMessageAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/ProcessSentMessageAction.java diff --git a/src/com/android/messaging/datamodel/action/ReadDraftDataAction.java b/app/src/main/java/com/android/messaging/datamodel/action/ReadDraftDataAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/ReadDraftDataAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/ReadDraftDataAction.java diff --git a/src/com/android/messaging/datamodel/action/ReceiveMmsMessageAction.java b/app/src/main/java/com/android/messaging/datamodel/action/ReceiveMmsMessageAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/ReceiveMmsMessageAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/ReceiveMmsMessageAction.java diff --git a/src/com/android/messaging/datamodel/action/ReceiveSmsMessageAction.java b/app/src/main/java/com/android/messaging/datamodel/action/ReceiveSmsMessageAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/ReceiveSmsMessageAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/ReceiveSmsMessageAction.java diff --git a/src/com/android/messaging/datamodel/action/RedownloadMmsAction.java b/app/src/main/java/com/android/messaging/datamodel/action/RedownloadMmsAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/RedownloadMmsAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/RedownloadMmsAction.java diff --git a/src/com/android/messaging/datamodel/action/ResendMessageAction.java b/app/src/main/java/com/android/messaging/datamodel/action/ResendMessageAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/ResendMessageAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/ResendMessageAction.java diff --git a/src/com/android/messaging/datamodel/action/SendMessageAction.java b/app/src/main/java/com/android/messaging/datamodel/action/SendMessageAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/SendMessageAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/SendMessageAction.java diff --git a/src/com/android/messaging/datamodel/action/SyncCursorPair.java b/app/src/main/java/com/android/messaging/datamodel/action/SyncCursorPair.java similarity index 100% rename from src/com/android/messaging/datamodel/action/SyncCursorPair.java rename to app/src/main/java/com/android/messaging/datamodel/action/SyncCursorPair.java diff --git a/src/com/android/messaging/datamodel/action/SyncMessageBatch.java b/app/src/main/java/com/android/messaging/datamodel/action/SyncMessageBatch.java similarity index 100% rename from src/com/android/messaging/datamodel/action/SyncMessageBatch.java rename to app/src/main/java/com/android/messaging/datamodel/action/SyncMessageBatch.java diff --git a/src/com/android/messaging/datamodel/action/SyncMessagesAction.java b/app/src/main/java/com/android/messaging/datamodel/action/SyncMessagesAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/SyncMessagesAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/SyncMessagesAction.java diff --git a/src/com/android/messaging/datamodel/action/UpdateConversationArchiveStatusAction.java b/app/src/main/java/com/android/messaging/datamodel/action/UpdateConversationArchiveStatusAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/UpdateConversationArchiveStatusAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/UpdateConversationArchiveStatusAction.java diff --git a/src/com/android/messaging/datamodel/action/UpdateDestinationBlockedAction.java b/app/src/main/java/com/android/messaging/datamodel/action/UpdateDestinationBlockedAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/UpdateDestinationBlockedAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/UpdateDestinationBlockedAction.java diff --git a/src/com/android/messaging/datamodel/action/UpdateMessageNotificationAction.java b/app/src/main/java/com/android/messaging/datamodel/action/UpdateMessageNotificationAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/UpdateMessageNotificationAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/UpdateMessageNotificationAction.java diff --git a/src/com/android/messaging/datamodel/action/UpdateMessagePartSizeAction.java b/app/src/main/java/com/android/messaging/datamodel/action/UpdateMessagePartSizeAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/UpdateMessagePartSizeAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/UpdateMessagePartSizeAction.java diff --git a/src/com/android/messaging/datamodel/action/WriteDraftMessageAction.java b/app/src/main/java/com/android/messaging/datamodel/action/WriteDraftMessageAction.java similarity index 100% rename from src/com/android/messaging/datamodel/action/WriteDraftMessageAction.java rename to app/src/main/java/com/android/messaging/datamodel/action/WriteDraftMessageAction.java diff --git a/src/com/android/messaging/datamodel/binding/BindableData.java b/app/src/main/java/com/android/messaging/datamodel/binding/BindableData.java similarity index 100% rename from src/com/android/messaging/datamodel/binding/BindableData.java rename to app/src/main/java/com/android/messaging/datamodel/binding/BindableData.java diff --git a/src/com/android/messaging/datamodel/binding/BindableOnceData.java b/app/src/main/java/com/android/messaging/datamodel/binding/BindableOnceData.java similarity index 100% rename from src/com/android/messaging/datamodel/binding/BindableOnceData.java rename to app/src/main/java/com/android/messaging/datamodel/binding/BindableOnceData.java diff --git a/src/com/android/messaging/datamodel/binding/Binding.java b/app/src/main/java/com/android/messaging/datamodel/binding/Binding.java similarity index 100% rename from src/com/android/messaging/datamodel/binding/Binding.java rename to app/src/main/java/com/android/messaging/datamodel/binding/Binding.java diff --git a/src/com/android/messaging/datamodel/binding/BindingBase.java b/app/src/main/java/com/android/messaging/datamodel/binding/BindingBase.java similarity index 100% rename from src/com/android/messaging/datamodel/binding/BindingBase.java rename to app/src/main/java/com/android/messaging/datamodel/binding/BindingBase.java diff --git a/src/com/android/messaging/datamodel/binding/DetachableBinding.java b/app/src/main/java/com/android/messaging/datamodel/binding/DetachableBinding.java similarity index 100% rename from src/com/android/messaging/datamodel/binding/DetachableBinding.java rename to app/src/main/java/com/android/messaging/datamodel/binding/DetachableBinding.java diff --git a/src/com/android/messaging/datamodel/binding/ImmutableBindingRef.java b/app/src/main/java/com/android/messaging/datamodel/binding/ImmutableBindingRef.java similarity index 100% rename from src/com/android/messaging/datamodel/binding/ImmutableBindingRef.java rename to app/src/main/java/com/android/messaging/datamodel/binding/ImmutableBindingRef.java diff --git a/src/com/android/messaging/datamodel/data/BlockedParticipantsData.java b/app/src/main/java/com/android/messaging/datamodel/data/BlockedParticipantsData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/BlockedParticipantsData.java rename to app/src/main/java/com/android/messaging/datamodel/data/BlockedParticipantsData.java diff --git a/src/com/android/messaging/datamodel/data/ContactListItemData.java b/app/src/main/java/com/android/messaging/datamodel/data/ContactListItemData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/ContactListItemData.java rename to app/src/main/java/com/android/messaging/datamodel/data/ContactListItemData.java diff --git a/src/com/android/messaging/datamodel/data/ContactPickerData.java b/app/src/main/java/com/android/messaging/datamodel/data/ContactPickerData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/ContactPickerData.java rename to app/src/main/java/com/android/messaging/datamodel/data/ContactPickerData.java diff --git a/src/com/android/messaging/datamodel/data/ConversationData.java b/app/src/main/java/com/android/messaging/datamodel/data/ConversationData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/ConversationData.java rename to app/src/main/java/com/android/messaging/datamodel/data/ConversationData.java diff --git a/src/com/android/messaging/datamodel/data/ConversationListData.java b/app/src/main/java/com/android/messaging/datamodel/data/ConversationListData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/ConversationListData.java rename to app/src/main/java/com/android/messaging/datamodel/data/ConversationListData.java diff --git a/src/com/android/messaging/datamodel/data/ConversationListItemData.java b/app/src/main/java/com/android/messaging/datamodel/data/ConversationListItemData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/ConversationListItemData.java rename to app/src/main/java/com/android/messaging/datamodel/data/ConversationListItemData.java diff --git a/src/com/android/messaging/datamodel/data/ConversationMessageBubbleData.java b/app/src/main/java/com/android/messaging/datamodel/data/ConversationMessageBubbleData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/ConversationMessageBubbleData.java rename to app/src/main/java/com/android/messaging/datamodel/data/ConversationMessageBubbleData.java diff --git a/src/com/android/messaging/datamodel/data/ConversationMessageData.java b/app/src/main/java/com/android/messaging/datamodel/data/ConversationMessageData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/ConversationMessageData.java rename to app/src/main/java/com/android/messaging/datamodel/data/ConversationMessageData.java diff --git a/src/com/android/messaging/datamodel/data/ConversationParticipantsData.java b/app/src/main/java/com/android/messaging/datamodel/data/ConversationParticipantsData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/ConversationParticipantsData.java rename to app/src/main/java/com/android/messaging/datamodel/data/ConversationParticipantsData.java diff --git a/src/com/android/messaging/datamodel/data/DraftMessageData.java b/app/src/main/java/com/android/messaging/datamodel/data/DraftMessageData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/DraftMessageData.java rename to app/src/main/java/com/android/messaging/datamodel/data/DraftMessageData.java diff --git a/src/com/android/messaging/datamodel/data/LaunchConversationData.java b/app/src/main/java/com/android/messaging/datamodel/data/LaunchConversationData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/LaunchConversationData.java rename to app/src/main/java/com/android/messaging/datamodel/data/LaunchConversationData.java diff --git a/src/com/android/messaging/datamodel/data/MediaPickerData.java b/app/src/main/java/com/android/messaging/datamodel/data/MediaPickerData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/MediaPickerData.java rename to app/src/main/java/com/android/messaging/datamodel/data/MediaPickerData.java diff --git a/src/com/android/messaging/datamodel/data/MediaPickerMessagePartData.java b/app/src/main/java/com/android/messaging/datamodel/data/MediaPickerMessagePartData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/MediaPickerMessagePartData.java rename to app/src/main/java/com/android/messaging/datamodel/data/MediaPickerMessagePartData.java diff --git a/src/com/android/messaging/datamodel/data/MessageData.java b/app/src/main/java/com/android/messaging/datamodel/data/MessageData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/MessageData.java rename to app/src/main/java/com/android/messaging/datamodel/data/MessageData.java diff --git a/src/com/android/messaging/datamodel/data/MessagePartData.java b/app/src/main/java/com/android/messaging/datamodel/data/MessagePartData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/MessagePartData.java rename to app/src/main/java/com/android/messaging/datamodel/data/MessagePartData.java diff --git a/src/com/android/messaging/datamodel/data/ParticipantData.java b/app/src/main/java/com/android/messaging/datamodel/data/ParticipantData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/ParticipantData.java rename to app/src/main/java/com/android/messaging/datamodel/data/ParticipantData.java diff --git a/src/com/android/messaging/datamodel/data/ParticipantListItemData.java b/app/src/main/java/com/android/messaging/datamodel/data/ParticipantListItemData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/ParticipantListItemData.java rename to app/src/main/java/com/android/messaging/datamodel/data/ParticipantListItemData.java diff --git a/src/com/android/messaging/datamodel/data/PendingAttachmentData.java b/app/src/main/java/com/android/messaging/datamodel/data/PendingAttachmentData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/PendingAttachmentData.java rename to app/src/main/java/com/android/messaging/datamodel/data/PendingAttachmentData.java diff --git a/src/com/android/messaging/datamodel/data/PeopleAndOptionsData.java b/app/src/main/java/com/android/messaging/datamodel/data/PeopleAndOptionsData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/PeopleAndOptionsData.java rename to app/src/main/java/com/android/messaging/datamodel/data/PeopleAndOptionsData.java diff --git a/src/com/android/messaging/datamodel/data/PeopleOptionsItemData.java b/app/src/main/java/com/android/messaging/datamodel/data/PeopleOptionsItemData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/PeopleOptionsItemData.java rename to app/src/main/java/com/android/messaging/datamodel/data/PeopleOptionsItemData.java diff --git a/src/com/android/messaging/datamodel/data/PersonItemData.java b/app/src/main/java/com/android/messaging/datamodel/data/PersonItemData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/PersonItemData.java rename to app/src/main/java/com/android/messaging/datamodel/data/PersonItemData.java diff --git a/src/com/android/messaging/datamodel/data/SelfParticipantsData.java b/app/src/main/java/com/android/messaging/datamodel/data/SelfParticipantsData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/SelfParticipantsData.java rename to app/src/main/java/com/android/messaging/datamodel/data/SelfParticipantsData.java diff --git a/src/com/android/messaging/datamodel/data/SettingsData.java b/app/src/main/java/com/android/messaging/datamodel/data/SettingsData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/SettingsData.java rename to app/src/main/java/com/android/messaging/datamodel/data/SettingsData.java diff --git a/src/com/android/messaging/datamodel/data/SubscriptionListData.java b/app/src/main/java/com/android/messaging/datamodel/data/SubscriptionListData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/SubscriptionListData.java rename to app/src/main/java/com/android/messaging/datamodel/data/SubscriptionListData.java diff --git a/src/com/android/messaging/datamodel/data/VCardContactItemData.java b/app/src/main/java/com/android/messaging/datamodel/data/VCardContactItemData.java similarity index 100% rename from src/com/android/messaging/datamodel/data/VCardContactItemData.java rename to app/src/main/java/com/android/messaging/datamodel/data/VCardContactItemData.java diff --git a/src/com/android/messaging/datamodel/media/AsyncMediaRequestWrapper.java b/app/src/main/java/com/android/messaging/datamodel/media/AsyncMediaRequestWrapper.java similarity index 100% rename from src/com/android/messaging/datamodel/media/AsyncMediaRequestWrapper.java rename to app/src/main/java/com/android/messaging/datamodel/media/AsyncMediaRequestWrapper.java diff --git a/src/com/android/messaging/datamodel/media/AvatarGroupRequestDescriptor.java b/app/src/main/java/com/android/messaging/datamodel/media/AvatarGroupRequestDescriptor.java similarity index 100% rename from src/com/android/messaging/datamodel/media/AvatarGroupRequestDescriptor.java rename to app/src/main/java/com/android/messaging/datamodel/media/AvatarGroupRequestDescriptor.java diff --git a/src/com/android/messaging/datamodel/media/AvatarRequest.java b/app/src/main/java/com/android/messaging/datamodel/media/AvatarRequest.java similarity index 100% rename from src/com/android/messaging/datamodel/media/AvatarRequest.java rename to app/src/main/java/com/android/messaging/datamodel/media/AvatarRequest.java diff --git a/src/com/android/messaging/datamodel/media/AvatarRequestDescriptor.java b/app/src/main/java/com/android/messaging/datamodel/media/AvatarRequestDescriptor.java similarity index 100% rename from src/com/android/messaging/datamodel/media/AvatarRequestDescriptor.java rename to app/src/main/java/com/android/messaging/datamodel/media/AvatarRequestDescriptor.java diff --git a/src/com/android/messaging/datamodel/media/BindableMediaRequest.java b/app/src/main/java/com/android/messaging/datamodel/media/BindableMediaRequest.java similarity index 100% rename from src/com/android/messaging/datamodel/media/BindableMediaRequest.java rename to app/src/main/java/com/android/messaging/datamodel/media/BindableMediaRequest.java diff --git a/src/com/android/messaging/datamodel/media/BugleMediaCacheManager.java b/app/src/main/java/com/android/messaging/datamodel/media/BugleMediaCacheManager.java similarity index 100% rename from src/com/android/messaging/datamodel/media/BugleMediaCacheManager.java rename to app/src/main/java/com/android/messaging/datamodel/media/BugleMediaCacheManager.java diff --git a/src/com/android/messaging/datamodel/media/CompositeImageRequest.java b/app/src/main/java/com/android/messaging/datamodel/media/CompositeImageRequest.java similarity index 100% rename from src/com/android/messaging/datamodel/media/CompositeImageRequest.java rename to app/src/main/java/com/android/messaging/datamodel/media/CompositeImageRequest.java diff --git a/src/com/android/messaging/datamodel/media/CompositeImageRequestDescriptor.java b/app/src/main/java/com/android/messaging/datamodel/media/CompositeImageRequestDescriptor.java similarity index 100% rename from src/com/android/messaging/datamodel/media/CompositeImageRequestDescriptor.java rename to app/src/main/java/com/android/messaging/datamodel/media/CompositeImageRequestDescriptor.java diff --git a/src/com/android/messaging/datamodel/media/CustomVCardEntry.java b/app/src/main/java/com/android/messaging/datamodel/media/CustomVCardEntry.java similarity index 100% rename from src/com/android/messaging/datamodel/media/CustomVCardEntry.java rename to app/src/main/java/com/android/messaging/datamodel/media/CustomVCardEntry.java diff --git a/src/com/android/messaging/datamodel/media/CustomVCardEntryConstructor.java b/app/src/main/java/com/android/messaging/datamodel/media/CustomVCardEntryConstructor.java similarity index 100% rename from src/com/android/messaging/datamodel/media/CustomVCardEntryConstructor.java rename to app/src/main/java/com/android/messaging/datamodel/media/CustomVCardEntryConstructor.java diff --git a/src/com/android/messaging/datamodel/media/DecodedImageResource.java b/app/src/main/java/com/android/messaging/datamodel/media/DecodedImageResource.java similarity index 100% rename from src/com/android/messaging/datamodel/media/DecodedImageResource.java rename to app/src/main/java/com/android/messaging/datamodel/media/DecodedImageResource.java diff --git a/src/com/android/messaging/datamodel/media/EncodedImageResource.java b/app/src/main/java/com/android/messaging/datamodel/media/EncodedImageResource.java similarity index 100% rename from src/com/android/messaging/datamodel/media/EncodedImageResource.java rename to app/src/main/java/com/android/messaging/datamodel/media/EncodedImageResource.java diff --git a/src/com/android/messaging/datamodel/media/FileImageRequest.java b/app/src/main/java/com/android/messaging/datamodel/media/FileImageRequest.java similarity index 100% rename from src/com/android/messaging/datamodel/media/FileImageRequest.java rename to app/src/main/java/com/android/messaging/datamodel/media/FileImageRequest.java diff --git a/src/com/android/messaging/datamodel/media/FileImageRequestDescriptor.java b/app/src/main/java/com/android/messaging/datamodel/media/FileImageRequestDescriptor.java similarity index 100% rename from src/com/android/messaging/datamodel/media/FileImageRequestDescriptor.java rename to app/src/main/java/com/android/messaging/datamodel/media/FileImageRequestDescriptor.java diff --git a/src/com/android/messaging/datamodel/media/GifImageResource.java b/app/src/main/java/com/android/messaging/datamodel/media/GifImageResource.java similarity index 100% rename from src/com/android/messaging/datamodel/media/GifImageResource.java rename to app/src/main/java/com/android/messaging/datamodel/media/GifImageResource.java diff --git a/src/com/android/messaging/datamodel/media/ImageRequest.java b/app/src/main/java/com/android/messaging/datamodel/media/ImageRequest.java similarity index 100% rename from src/com/android/messaging/datamodel/media/ImageRequest.java rename to app/src/main/java/com/android/messaging/datamodel/media/ImageRequest.java diff --git a/src/com/android/messaging/datamodel/media/ImageRequestDescriptor.java b/app/src/main/java/com/android/messaging/datamodel/media/ImageRequestDescriptor.java similarity index 100% rename from src/com/android/messaging/datamodel/media/ImageRequestDescriptor.java rename to app/src/main/java/com/android/messaging/datamodel/media/ImageRequestDescriptor.java diff --git a/src/com/android/messaging/datamodel/media/ImageResource.java b/app/src/main/java/com/android/messaging/datamodel/media/ImageResource.java similarity index 100% rename from src/com/android/messaging/datamodel/media/ImageResource.java rename to app/src/main/java/com/android/messaging/datamodel/media/ImageResource.java diff --git a/src/com/android/messaging/datamodel/media/MediaBytes.java b/app/src/main/java/com/android/messaging/datamodel/media/MediaBytes.java similarity index 100% rename from src/com/android/messaging/datamodel/media/MediaBytes.java rename to app/src/main/java/com/android/messaging/datamodel/media/MediaBytes.java diff --git a/src/com/android/messaging/datamodel/media/MediaCache.java b/app/src/main/java/com/android/messaging/datamodel/media/MediaCache.java similarity index 100% rename from src/com/android/messaging/datamodel/media/MediaCache.java rename to app/src/main/java/com/android/messaging/datamodel/media/MediaCache.java diff --git a/src/com/android/messaging/datamodel/media/MediaCacheManager.java b/app/src/main/java/com/android/messaging/datamodel/media/MediaCacheManager.java similarity index 100% rename from src/com/android/messaging/datamodel/media/MediaCacheManager.java rename to app/src/main/java/com/android/messaging/datamodel/media/MediaCacheManager.java diff --git a/src/com/android/messaging/datamodel/media/MediaRequest.java b/app/src/main/java/com/android/messaging/datamodel/media/MediaRequest.java similarity index 100% rename from src/com/android/messaging/datamodel/media/MediaRequest.java rename to app/src/main/java/com/android/messaging/datamodel/media/MediaRequest.java diff --git a/src/com/android/messaging/datamodel/media/MediaRequestDescriptor.java b/app/src/main/java/com/android/messaging/datamodel/media/MediaRequestDescriptor.java similarity index 100% rename from src/com/android/messaging/datamodel/media/MediaRequestDescriptor.java rename to app/src/main/java/com/android/messaging/datamodel/media/MediaRequestDescriptor.java diff --git a/src/com/android/messaging/datamodel/media/MediaResourceManager.java b/app/src/main/java/com/android/messaging/datamodel/media/MediaResourceManager.java similarity index 100% rename from src/com/android/messaging/datamodel/media/MediaResourceManager.java rename to app/src/main/java/com/android/messaging/datamodel/media/MediaResourceManager.java diff --git a/src/com/android/messaging/datamodel/media/MessagePartImageRequestDescriptor.java b/app/src/main/java/com/android/messaging/datamodel/media/MessagePartImageRequestDescriptor.java similarity index 100% rename from src/com/android/messaging/datamodel/media/MessagePartImageRequestDescriptor.java rename to app/src/main/java/com/android/messaging/datamodel/media/MessagePartImageRequestDescriptor.java diff --git a/src/com/android/messaging/datamodel/media/MessagePartVideoThumbnailRequestDescriptor.java b/app/src/main/java/com/android/messaging/datamodel/media/MessagePartVideoThumbnailRequestDescriptor.java similarity index 100% rename from src/com/android/messaging/datamodel/media/MessagePartVideoThumbnailRequestDescriptor.java rename to app/src/main/java/com/android/messaging/datamodel/media/MessagePartVideoThumbnailRequestDescriptor.java diff --git a/src/com/android/messaging/datamodel/media/NetworkUriImageRequest.java b/app/src/main/java/com/android/messaging/datamodel/media/NetworkUriImageRequest.java similarity index 100% rename from src/com/android/messaging/datamodel/media/NetworkUriImageRequest.java rename to app/src/main/java/com/android/messaging/datamodel/media/NetworkUriImageRequest.java diff --git a/src/com/android/messaging/datamodel/media/PoolableImageCache.java b/app/src/main/java/com/android/messaging/datamodel/media/PoolableImageCache.java similarity index 100% rename from src/com/android/messaging/datamodel/media/PoolableImageCache.java rename to app/src/main/java/com/android/messaging/datamodel/media/PoolableImageCache.java diff --git a/src/com/android/messaging/datamodel/media/RefCountedMediaResource.java b/app/src/main/java/com/android/messaging/datamodel/media/RefCountedMediaResource.java similarity index 100% rename from src/com/android/messaging/datamodel/media/RefCountedMediaResource.java rename to app/src/main/java/com/android/messaging/datamodel/media/RefCountedMediaResource.java diff --git a/src/com/android/messaging/datamodel/media/SimSelectorAvatarRequest.java b/app/src/main/java/com/android/messaging/datamodel/media/SimSelectorAvatarRequest.java similarity index 100% rename from src/com/android/messaging/datamodel/media/SimSelectorAvatarRequest.java rename to app/src/main/java/com/android/messaging/datamodel/media/SimSelectorAvatarRequest.java diff --git a/src/com/android/messaging/datamodel/media/UriImageRequest.java b/app/src/main/java/com/android/messaging/datamodel/media/UriImageRequest.java similarity index 100% rename from src/com/android/messaging/datamodel/media/UriImageRequest.java rename to app/src/main/java/com/android/messaging/datamodel/media/UriImageRequest.java diff --git a/src/com/android/messaging/datamodel/media/UriImageRequestDescriptor.java b/app/src/main/java/com/android/messaging/datamodel/media/UriImageRequestDescriptor.java similarity index 100% rename from src/com/android/messaging/datamodel/media/UriImageRequestDescriptor.java rename to app/src/main/java/com/android/messaging/datamodel/media/UriImageRequestDescriptor.java diff --git a/src/com/android/messaging/datamodel/media/VCardRequest.java b/app/src/main/java/com/android/messaging/datamodel/media/VCardRequest.java similarity index 100% rename from src/com/android/messaging/datamodel/media/VCardRequest.java rename to app/src/main/java/com/android/messaging/datamodel/media/VCardRequest.java diff --git a/src/com/android/messaging/datamodel/media/VCardRequestDescriptor.java b/app/src/main/java/com/android/messaging/datamodel/media/VCardRequestDescriptor.java similarity index 100% rename from src/com/android/messaging/datamodel/media/VCardRequestDescriptor.java rename to app/src/main/java/com/android/messaging/datamodel/media/VCardRequestDescriptor.java diff --git a/src/com/android/messaging/datamodel/media/VCardResource.java b/app/src/main/java/com/android/messaging/datamodel/media/VCardResource.java similarity index 100% rename from src/com/android/messaging/datamodel/media/VCardResource.java rename to app/src/main/java/com/android/messaging/datamodel/media/VCardResource.java diff --git a/src/com/android/messaging/datamodel/media/VCardResourceEntry.java b/app/src/main/java/com/android/messaging/datamodel/media/VCardResourceEntry.java similarity index 100% rename from src/com/android/messaging/datamodel/media/VCardResourceEntry.java rename to app/src/main/java/com/android/messaging/datamodel/media/VCardResourceEntry.java diff --git a/src/com/android/messaging/datamodel/media/VideoThumbnailRequest.java b/app/src/main/java/com/android/messaging/datamodel/media/VideoThumbnailRequest.java similarity index 100% rename from src/com/android/messaging/datamodel/media/VideoThumbnailRequest.java rename to app/src/main/java/com/android/messaging/datamodel/media/VideoThumbnailRequest.java diff --git a/src/com/android/messaging/mmslib/Downloads.java b/app/src/main/java/com/android/messaging/mmslib/Downloads.java similarity index 100% rename from src/com/android/messaging/mmslib/Downloads.java rename to app/src/main/java/com/android/messaging/mmslib/Downloads.java diff --git a/src/com/android/messaging/mmslib/SqliteWrapper.java b/app/src/main/java/com/android/messaging/mmslib/SqliteWrapper.java similarity index 100% rename from src/com/android/messaging/mmslib/SqliteWrapper.java rename to app/src/main/java/com/android/messaging/mmslib/SqliteWrapper.java diff --git a/src/com/android/messaging/mmslib/pdu/PduComposer.java b/app/src/main/java/com/android/messaging/mmslib/pdu/PduComposer.java similarity index 100% rename from src/com/android/messaging/mmslib/pdu/PduComposer.java rename to app/src/main/java/com/android/messaging/mmslib/pdu/PduComposer.java diff --git a/src/com/android/messaging/mmslib/pdu/PduPersister.java b/app/src/main/java/com/android/messaging/mmslib/pdu/PduPersister.java similarity index 100% rename from src/com/android/messaging/mmslib/pdu/PduPersister.java rename to app/src/main/java/com/android/messaging/mmslib/pdu/PduPersister.java diff --git a/src/com/android/messaging/mmslib/util/AbstractCache.java b/app/src/main/java/com/android/messaging/mmslib/util/AbstractCache.java similarity index 100% rename from src/com/android/messaging/mmslib/util/AbstractCache.java rename to app/src/main/java/com/android/messaging/mmslib/util/AbstractCache.java diff --git a/src/com/android/messaging/mmslib/util/DownloadDrmHelper.java b/app/src/main/java/com/android/messaging/mmslib/util/DownloadDrmHelper.java similarity index 100% rename from src/com/android/messaging/mmslib/util/DownloadDrmHelper.java rename to app/src/main/java/com/android/messaging/mmslib/util/DownloadDrmHelper.java diff --git a/src/com/android/messaging/mmslib/util/DrmConvertSession.java b/app/src/main/java/com/android/messaging/mmslib/util/DrmConvertSession.java similarity index 100% rename from src/com/android/messaging/mmslib/util/DrmConvertSession.java rename to app/src/main/java/com/android/messaging/mmslib/util/DrmConvertSession.java diff --git a/src/com/android/messaging/mmslib/util/PduCache.java b/app/src/main/java/com/android/messaging/mmslib/util/PduCache.java similarity index 100% rename from src/com/android/messaging/mmslib/util/PduCache.java rename to app/src/main/java/com/android/messaging/mmslib/util/PduCache.java diff --git a/src/com/android/messaging/mmslib/util/PduCacheEntry.java b/app/src/main/java/com/android/messaging/mmslib/util/PduCacheEntry.java similarity index 100% rename from src/com/android/messaging/mmslib/util/PduCacheEntry.java rename to app/src/main/java/com/android/messaging/mmslib/util/PduCacheEntry.java diff --git a/src/com/android/messaging/receiver/BootAndPackageReplacedReceiver.java b/app/src/main/java/com/android/messaging/receiver/BootAndPackageReplacedReceiver.java similarity index 100% rename from src/com/android/messaging/receiver/BootAndPackageReplacedReceiver.java rename to app/src/main/java/com/android/messaging/receiver/BootAndPackageReplacedReceiver.java diff --git a/src/com/android/messaging/receiver/DefaultSmsSubscriptionChangeReceiver.java b/app/src/main/java/com/android/messaging/receiver/DefaultSmsSubscriptionChangeReceiver.java similarity index 100% rename from src/com/android/messaging/receiver/DefaultSmsSubscriptionChangeReceiver.java rename to app/src/main/java/com/android/messaging/receiver/DefaultSmsSubscriptionChangeReceiver.java diff --git a/src/com/android/messaging/receiver/MmsWapPushDeliverReceiver.java b/app/src/main/java/com/android/messaging/receiver/MmsWapPushDeliverReceiver.java similarity index 100% rename from src/com/android/messaging/receiver/MmsWapPushDeliverReceiver.java rename to app/src/main/java/com/android/messaging/receiver/MmsWapPushDeliverReceiver.java diff --git a/src/com/android/messaging/receiver/NotificationReceiver.java b/app/src/main/java/com/android/messaging/receiver/NotificationReceiver.java similarity index 100% rename from src/com/android/messaging/receiver/NotificationReceiver.java rename to app/src/main/java/com/android/messaging/receiver/NotificationReceiver.java diff --git a/src/com/android/messaging/receiver/SendStatusReceiver.java b/app/src/main/java/com/android/messaging/receiver/SendStatusReceiver.java similarity index 100% rename from src/com/android/messaging/receiver/SendStatusReceiver.java rename to app/src/main/java/com/android/messaging/receiver/SendStatusReceiver.java diff --git a/src/com/android/messaging/receiver/SmsDeliverReceiver.java b/app/src/main/java/com/android/messaging/receiver/SmsDeliverReceiver.java similarity index 100% rename from src/com/android/messaging/receiver/SmsDeliverReceiver.java rename to app/src/main/java/com/android/messaging/receiver/SmsDeliverReceiver.java diff --git a/src/com/android/messaging/receiver/SmsReceiver.java b/app/src/main/java/com/android/messaging/receiver/SmsReceiver.java similarity index 100% rename from src/com/android/messaging/receiver/SmsReceiver.java rename to app/src/main/java/com/android/messaging/receiver/SmsReceiver.java diff --git a/src/com/android/messaging/sms/ApnsXmlProcessor.java b/app/src/main/java/com/android/messaging/sms/ApnsXmlProcessor.java similarity index 100% rename from src/com/android/messaging/sms/ApnsXmlProcessor.java rename to app/src/main/java/com/android/messaging/sms/ApnsXmlProcessor.java diff --git a/src/com/android/messaging/sms/BugleApnSettingsLoader.java b/app/src/main/java/com/android/messaging/sms/BugleApnSettingsLoader.java similarity index 100% rename from src/com/android/messaging/sms/BugleApnSettingsLoader.java rename to app/src/main/java/com/android/messaging/sms/BugleApnSettingsLoader.java diff --git a/src/com/android/messaging/sms/BugleCarrierConfigValuesLoader.java b/app/src/main/java/com/android/messaging/sms/BugleCarrierConfigValuesLoader.java similarity index 100% rename from src/com/android/messaging/sms/BugleCarrierConfigValuesLoader.java rename to app/src/main/java/com/android/messaging/sms/BugleCarrierConfigValuesLoader.java diff --git a/src/com/android/messaging/sms/BugleUserAgentInfoLoader.java b/app/src/main/java/com/android/messaging/sms/BugleUserAgentInfoLoader.java similarity index 100% rename from src/com/android/messaging/sms/BugleUserAgentInfoLoader.java rename to app/src/main/java/com/android/messaging/sms/BugleUserAgentInfoLoader.java diff --git a/src/com/android/messaging/sms/DatabaseMessages.java b/app/src/main/java/com/android/messaging/sms/DatabaseMessages.java similarity index 100% rename from src/com/android/messaging/sms/DatabaseMessages.java rename to app/src/main/java/com/android/messaging/sms/DatabaseMessages.java diff --git a/src/com/android/messaging/sms/MmsConfig.java b/app/src/main/java/com/android/messaging/sms/MmsConfig.java similarity index 100% rename from src/com/android/messaging/sms/MmsConfig.java rename to app/src/main/java/com/android/messaging/sms/MmsConfig.java diff --git a/src/com/android/messaging/sms/MmsFailureException.java b/app/src/main/java/com/android/messaging/sms/MmsFailureException.java similarity index 100% rename from src/com/android/messaging/sms/MmsFailureException.java rename to app/src/main/java/com/android/messaging/sms/MmsFailureException.java diff --git a/src/com/android/messaging/sms/MmsSender.java b/app/src/main/java/com/android/messaging/sms/MmsSender.java similarity index 100% rename from src/com/android/messaging/sms/MmsSender.java rename to app/src/main/java/com/android/messaging/sms/MmsSender.java diff --git a/src/com/android/messaging/sms/MmsSmsUtils.java b/app/src/main/java/com/android/messaging/sms/MmsSmsUtils.java similarity index 100% rename from src/com/android/messaging/sms/MmsSmsUtils.java rename to app/src/main/java/com/android/messaging/sms/MmsSmsUtils.java diff --git a/src/com/android/messaging/sms/MmsUtils.java b/app/src/main/java/com/android/messaging/sms/MmsUtils.java similarity index 100% rename from src/com/android/messaging/sms/MmsUtils.java rename to app/src/main/java/com/android/messaging/sms/MmsUtils.java diff --git a/src/com/android/messaging/sms/SmsSender.java b/app/src/main/java/com/android/messaging/sms/SmsSender.java similarity index 100% rename from src/com/android/messaging/sms/SmsSender.java rename to app/src/main/java/com/android/messaging/sms/SmsSender.java diff --git a/src/com/android/messaging/ui/AsyncImageView.java b/app/src/main/java/com/android/messaging/ui/AsyncImageView.java similarity index 100% rename from src/com/android/messaging/ui/AsyncImageView.java rename to app/src/main/java/com/android/messaging/ui/AsyncImageView.java diff --git a/src/com/android/messaging/ui/AttachmentPreview.java b/app/src/main/java/com/android/messaging/ui/AttachmentPreview.java similarity index 100% rename from src/com/android/messaging/ui/AttachmentPreview.java rename to app/src/main/java/com/android/messaging/ui/AttachmentPreview.java diff --git a/src/com/android/messaging/ui/AttachmentPreviewFactory.java b/app/src/main/java/com/android/messaging/ui/AttachmentPreviewFactory.java similarity index 100% rename from src/com/android/messaging/ui/AttachmentPreviewFactory.java rename to app/src/main/java/com/android/messaging/ui/AttachmentPreviewFactory.java diff --git a/src/com/android/messaging/ui/AudioAttachmentPlayPauseButton.java b/app/src/main/java/com/android/messaging/ui/AudioAttachmentPlayPauseButton.java similarity index 100% rename from src/com/android/messaging/ui/AudioAttachmentPlayPauseButton.java rename to app/src/main/java/com/android/messaging/ui/AudioAttachmentPlayPauseButton.java diff --git a/src/com/android/messaging/ui/AudioAttachmentView.java b/app/src/main/java/com/android/messaging/ui/AudioAttachmentView.java similarity index 100% rename from src/com/android/messaging/ui/AudioAttachmentView.java rename to app/src/main/java/com/android/messaging/ui/AudioAttachmentView.java diff --git a/src/com/android/messaging/ui/AudioPlaybackProgressBar.java b/app/src/main/java/com/android/messaging/ui/AudioPlaybackProgressBar.java similarity index 100% rename from src/com/android/messaging/ui/AudioPlaybackProgressBar.java rename to app/src/main/java/com/android/messaging/ui/AudioPlaybackProgressBar.java diff --git a/src/com/android/messaging/ui/BaseBugleActivity.java b/app/src/main/java/com/android/messaging/ui/BaseBugleActivity.java similarity index 100% rename from src/com/android/messaging/ui/BaseBugleActivity.java rename to app/src/main/java/com/android/messaging/ui/BaseBugleActivity.java diff --git a/src/com/android/messaging/ui/BaseBugleFragmentActivity.java b/app/src/main/java/com/android/messaging/ui/BaseBugleFragmentActivity.java similarity index 100% rename from src/com/android/messaging/ui/BaseBugleFragmentActivity.java rename to app/src/main/java/com/android/messaging/ui/BaseBugleFragmentActivity.java diff --git a/src/com/android/messaging/ui/BasePagerViewHolder.java b/app/src/main/java/com/android/messaging/ui/BasePagerViewHolder.java similarity index 100% rename from src/com/android/messaging/ui/BasePagerViewHolder.java rename to app/src/main/java/com/android/messaging/ui/BasePagerViewHolder.java diff --git a/src/com/android/messaging/ui/BlockedParticipantListItemView.java b/app/src/main/java/com/android/messaging/ui/BlockedParticipantListItemView.java similarity index 100% rename from src/com/android/messaging/ui/BlockedParticipantListItemView.java rename to app/src/main/java/com/android/messaging/ui/BlockedParticipantListItemView.java diff --git a/src/com/android/messaging/ui/BlockedParticipantsActivity.java b/app/src/main/java/com/android/messaging/ui/BlockedParticipantsActivity.java similarity index 100% rename from src/com/android/messaging/ui/BlockedParticipantsActivity.java rename to app/src/main/java/com/android/messaging/ui/BlockedParticipantsActivity.java diff --git a/src/com/android/messaging/ui/BlockedParticipantsFragment.java b/app/src/main/java/com/android/messaging/ui/BlockedParticipantsFragment.java similarity index 100% rename from src/com/android/messaging/ui/BlockedParticipantsFragment.java rename to app/src/main/java/com/android/messaging/ui/BlockedParticipantsFragment.java diff --git a/src/com/android/messaging/ui/BugleActionBarActivity.java b/app/src/main/java/com/android/messaging/ui/BugleActionBarActivity.java similarity index 96% rename from src/com/android/messaging/ui/BugleActionBarActivity.java rename to app/src/main/java/com/android/messaging/ui/BugleActionBarActivity.java index 98d1ad5..0ee1c37 100644 --- a/src/com/android/messaging/ui/BugleActionBarActivity.java +++ b/app/src/main/java/com/android/messaging/ui/BugleActionBarActivity.java @@ -252,6 +252,11 @@ public class BugleActionBarActivity extends AppCompatActivity implements ImeUtil actionBar.setHomeAsUpIndicator(null); } + /** When false, {@link ActionMode} updates must not show the platform action bar. */ + protected boolean shouldShowContextualActionBar(final ActionMode.Callback callback) { + return true; + } + /** * Custom ActionMode implementation which allows us to just replace the contents of the main * action bar rather than overlay over it @@ -334,6 +339,10 @@ public class BugleActionBarActivity extends AppCompatActivity implements ImeUtil } public void updateActionBar(final ActionBar actionBar) { + if (!BugleActionBarActivity.this.shouldShowContextualActionBar(mCallback)) { + actionBar.hide(); + return; + } actionBar.setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP); actionBar.setDisplayShowTitleEnabled(false); actionBar.setDisplayShowCustomEnabled(false); diff --git a/src/com/android/messaging/ui/ClassZeroActivity.java b/app/src/main/java/com/android/messaging/ui/ClassZeroActivity.java similarity index 100% rename from src/com/android/messaging/ui/ClassZeroActivity.java rename to app/src/main/java/com/android/messaging/ui/ClassZeroActivity.java diff --git a/src/com/android/messaging/ui/CompositeAdapter.java b/app/src/main/java/com/android/messaging/ui/CompositeAdapter.java similarity index 100% rename from src/com/android/messaging/ui/CompositeAdapter.java rename to app/src/main/java/com/android/messaging/ui/CompositeAdapter.java diff --git a/src/com/android/messaging/ui/ContactIconView.java b/app/src/main/java/com/android/messaging/ui/ContactIconView.java similarity index 100% rename from src/com/android/messaging/ui/ContactIconView.java rename to app/src/main/java/com/android/messaging/ui/ContactIconView.java diff --git a/src/com/android/messaging/ui/ConversationDrawables.java b/app/src/main/java/com/android/messaging/ui/ConversationDrawables.java similarity index 95% rename from src/com/android/messaging/ui/ConversationDrawables.java rename to app/src/main/java/com/android/messaging/ui/ConversationDrawables.java index a9f30c4..3b1354c 100644 --- a/src/com/android/messaging/ui/ConversationDrawables.java +++ b/app/src/main/java/com/android/messaging/ui/ConversationDrawables.java @@ -49,6 +49,7 @@ public class ConversationDrawables { private Drawable mFastScrollPreviewDrawableRight; private final Context mContext; private int mOutgoingBubbleColor; + private int mIncomingBubbleColor; private int mIncomingErrorBubbleColor; private int mIncomingAudioButtonColor; private int mSelectedBubbleColor; @@ -99,6 +100,7 @@ public class ConversationDrawables { mFastScrollPreviewDrawableRight = ResourcesCompat.getDrawable(resources, R.drawable.fastscroll_preview_right, theme); mOutgoingBubbleColor = resources.getColor(R.color.message_bubble_color_outgoing, theme); + mIncomingBubbleColor = resources.getColor(R.color.message_bubble_color_incoming, theme); mIncomingErrorBubbleColor = resources.getColor(R.color.message_error_bubble_color_incoming, theme); mIncomingAudioButtonColor = @@ -124,13 +126,8 @@ public class ConversationDrawables { if (isError) { color = mIncomingErrorBubbleColor; } else { - if (identifier != null && - mContext.getResources().getBoolean(R.bool.contact_colors)) { - int idcolor = Math.abs(identifier.hashCode()) % mColors.length(); - color = mColors.getColor(idcolor, mThemeColor); - } else { - color = mThemeColor; - } + // Looply: fixed soft incoming bubble (not per-contact theme colors) + color = mIncomingBubbleColor; } } else { color = mOutgoingBubbleColor; diff --git a/src/com/android/messaging/ui/CursorRecyclerAdapter.java b/app/src/main/java/com/android/messaging/ui/CursorRecyclerAdapter.java similarity index 100% rename from src/com/android/messaging/ui/CursorRecyclerAdapter.java rename to app/src/main/java/com/android/messaging/ui/CursorRecyclerAdapter.java diff --git a/src/com/android/messaging/ui/CustomHeaderPagerListViewHolder.java b/app/src/main/java/com/android/messaging/ui/CustomHeaderPagerListViewHolder.java similarity index 100% rename from src/com/android/messaging/ui/CustomHeaderPagerListViewHolder.java rename to app/src/main/java/com/android/messaging/ui/CustomHeaderPagerListViewHolder.java diff --git a/src/com/android/messaging/ui/CustomHeaderPagerViewHolder.java b/app/src/main/java/com/android/messaging/ui/CustomHeaderPagerViewHolder.java similarity index 100% rename from src/com/android/messaging/ui/CustomHeaderPagerViewHolder.java rename to app/src/main/java/com/android/messaging/ui/CustomHeaderPagerViewHolder.java diff --git a/src/com/android/messaging/ui/CustomHeaderViewPager.java b/app/src/main/java/com/android/messaging/ui/CustomHeaderViewPager.java similarity index 100% rename from src/com/android/messaging/ui/CustomHeaderViewPager.java rename to app/src/main/java/com/android/messaging/ui/CustomHeaderViewPager.java diff --git a/src/com/android/messaging/ui/CustomHeaderViewPagerAdapter.java b/app/src/main/java/com/android/messaging/ui/CustomHeaderViewPagerAdapter.java similarity index 100% rename from src/com/android/messaging/ui/CustomHeaderViewPagerAdapter.java rename to app/src/main/java/com/android/messaging/ui/CustomHeaderViewPagerAdapter.java diff --git a/src/com/android/messaging/ui/FixedViewPagerAdapter.java b/app/src/main/java/com/android/messaging/ui/FixedViewPagerAdapter.java similarity index 100% rename from src/com/android/messaging/ui/FixedViewPagerAdapter.java rename to app/src/main/java/com/android/messaging/ui/FixedViewPagerAdapter.java diff --git a/src/com/android/messaging/ui/ImeDetectFrameLayout.java b/app/src/main/java/com/android/messaging/ui/ImeDetectFrameLayout.java similarity index 100% rename from src/com/android/messaging/ui/ImeDetectFrameLayout.java rename to app/src/main/java/com/android/messaging/ui/ImeDetectFrameLayout.java diff --git a/src/com/android/messaging/ui/LicenseActivity.java b/app/src/main/java/com/android/messaging/ui/LicenseActivity.java similarity index 100% rename from src/com/android/messaging/ui/LicenseActivity.java rename to app/src/main/java/com/android/messaging/ui/LicenseActivity.java diff --git a/src/com/android/messaging/ui/LineWrapLayout.java b/app/src/main/java/com/android/messaging/ui/LineWrapLayout.java similarity index 100% rename from src/com/android/messaging/ui/LineWrapLayout.java rename to app/src/main/java/com/android/messaging/ui/LineWrapLayout.java diff --git a/src/com/android/messaging/ui/ListEmptyView.java b/app/src/main/java/com/android/messaging/ui/ListEmptyView.java similarity index 100% rename from src/com/android/messaging/ui/ListEmptyView.java rename to app/src/main/java/com/android/messaging/ui/ListEmptyView.java diff --git a/src/com/android/messaging/ui/MaxHeightScrollView.java b/app/src/main/java/com/android/messaging/ui/MaxHeightScrollView.java similarity index 100% rename from src/com/android/messaging/ui/MaxHeightScrollView.java rename to app/src/main/java/com/android/messaging/ui/MaxHeightScrollView.java diff --git a/src/com/android/messaging/ui/MultiAttachmentLayout.java b/app/src/main/java/com/android/messaging/ui/MultiAttachmentLayout.java similarity index 100% rename from src/com/android/messaging/ui/MultiAttachmentLayout.java rename to app/src/main/java/com/android/messaging/ui/MultiAttachmentLayout.java diff --git a/src/com/android/messaging/ui/OrientedBitmapDrawable.java b/app/src/main/java/com/android/messaging/ui/OrientedBitmapDrawable.java similarity index 100% rename from src/com/android/messaging/ui/OrientedBitmapDrawable.java rename to app/src/main/java/com/android/messaging/ui/OrientedBitmapDrawable.java diff --git a/src/com/android/messaging/ui/PagerViewHolder.java b/app/src/main/java/com/android/messaging/ui/PagerViewHolder.java similarity index 100% rename from src/com/android/messaging/ui/PagerViewHolder.java rename to app/src/main/java/com/android/messaging/ui/PagerViewHolder.java diff --git a/src/com/android/messaging/ui/PagingAwareViewPager.java b/app/src/main/java/com/android/messaging/ui/PagingAwareViewPager.java similarity index 100% rename from src/com/android/messaging/ui/PagingAwareViewPager.java rename to app/src/main/java/com/android/messaging/ui/PagingAwareViewPager.java diff --git a/src/com/android/messaging/ui/PermissionCheckActivity.java b/app/src/main/java/com/android/messaging/ui/PermissionCheckActivity.java similarity index 100% rename from src/com/android/messaging/ui/PermissionCheckActivity.java rename to app/src/main/java/com/android/messaging/ui/PermissionCheckActivity.java diff --git a/src/com/android/messaging/ui/PersistentInstanceState.java b/app/src/main/java/com/android/messaging/ui/PersistentInstanceState.java similarity index 100% rename from src/com/android/messaging/ui/PersistentInstanceState.java rename to app/src/main/java/com/android/messaging/ui/PersistentInstanceState.java diff --git a/src/com/android/messaging/ui/PersonItemView.java b/app/src/main/java/com/android/messaging/ui/PersonItemView.java similarity index 100% rename from src/com/android/messaging/ui/PersonItemView.java rename to app/src/main/java/com/android/messaging/ui/PersonItemView.java diff --git a/src/com/android/messaging/ui/PlaceholderInsetDrawable.java b/app/src/main/java/com/android/messaging/ui/PlaceholderInsetDrawable.java similarity index 100% rename from src/com/android/messaging/ui/PlaceholderInsetDrawable.java rename to app/src/main/java/com/android/messaging/ui/PlaceholderInsetDrawable.java diff --git a/src/com/android/messaging/ui/PlainTextEditText.java b/app/src/main/java/com/android/messaging/ui/PlainTextEditText.java similarity index 100% rename from src/com/android/messaging/ui/PlainTextEditText.java rename to app/src/main/java/com/android/messaging/ui/PlainTextEditText.java diff --git a/src/com/android/messaging/ui/PlaybackStateView.java b/app/src/main/java/com/android/messaging/ui/PlaybackStateView.java similarity index 100% rename from src/com/android/messaging/ui/PlaybackStateView.java rename to app/src/main/java/com/android/messaging/ui/PlaybackStateView.java diff --git a/src/com/android/messaging/ui/RemoteInputEntrypointActivity.java b/app/src/main/java/com/android/messaging/ui/RemoteInputEntrypointActivity.java similarity index 100% rename from src/com/android/messaging/ui/RemoteInputEntrypointActivity.java rename to app/src/main/java/com/android/messaging/ui/RemoteInputEntrypointActivity.java diff --git a/src/com/android/messaging/ui/SnackBar.java b/app/src/main/java/com/android/messaging/ui/SnackBar.java similarity index 100% rename from src/com/android/messaging/ui/SnackBar.java rename to app/src/main/java/com/android/messaging/ui/SnackBar.java diff --git a/src/com/android/messaging/ui/SnackBarInteraction.java b/app/src/main/java/com/android/messaging/ui/SnackBarInteraction.java similarity index 100% rename from src/com/android/messaging/ui/SnackBarInteraction.java rename to app/src/main/java/com/android/messaging/ui/SnackBarInteraction.java diff --git a/src/com/android/messaging/ui/SnackBarManager.java b/app/src/main/java/com/android/messaging/ui/SnackBarManager.java similarity index 100% rename from src/com/android/messaging/ui/SnackBarManager.java rename to app/src/main/java/com/android/messaging/ui/SnackBarManager.java diff --git a/src/com/android/messaging/ui/UIIntents.java b/app/src/main/java/com/android/messaging/ui/UIIntents.java similarity index 100% rename from src/com/android/messaging/ui/UIIntents.java rename to app/src/main/java/com/android/messaging/ui/UIIntents.java diff --git a/src/com/android/messaging/ui/UIIntentsImpl.java b/app/src/main/java/com/android/messaging/ui/UIIntentsImpl.java similarity index 100% rename from src/com/android/messaging/ui/UIIntentsImpl.java rename to app/src/main/java/com/android/messaging/ui/UIIntentsImpl.java diff --git a/src/com/android/messaging/ui/VCardDetailActivity.java b/app/src/main/java/com/android/messaging/ui/VCardDetailActivity.java similarity index 100% rename from src/com/android/messaging/ui/VCardDetailActivity.java rename to app/src/main/java/com/android/messaging/ui/VCardDetailActivity.java diff --git a/src/com/android/messaging/ui/VCardDetailAdapter.java b/app/src/main/java/com/android/messaging/ui/VCardDetailAdapter.java similarity index 100% rename from src/com/android/messaging/ui/VCardDetailAdapter.java rename to app/src/main/java/com/android/messaging/ui/VCardDetailAdapter.java diff --git a/src/com/android/messaging/ui/VCardDetailFragment.java b/app/src/main/java/com/android/messaging/ui/VCardDetailFragment.java similarity index 100% rename from src/com/android/messaging/ui/VCardDetailFragment.java rename to app/src/main/java/com/android/messaging/ui/VCardDetailFragment.java diff --git a/src/com/android/messaging/ui/VideoThumbnailView.java b/app/src/main/java/com/android/messaging/ui/VideoThumbnailView.java similarity index 100% rename from src/com/android/messaging/ui/VideoThumbnailView.java rename to app/src/main/java/com/android/messaging/ui/VideoThumbnailView.java diff --git a/src/com/android/messaging/ui/ViewPagerTabStrip.java b/app/src/main/java/com/android/messaging/ui/ViewPagerTabStrip.java similarity index 100% rename from src/com/android/messaging/ui/ViewPagerTabStrip.java rename to app/src/main/java/com/android/messaging/ui/ViewPagerTabStrip.java diff --git a/src/com/android/messaging/ui/ViewPagerTabs.java b/app/src/main/java/com/android/messaging/ui/ViewPagerTabs.java similarity index 100% rename from src/com/android/messaging/ui/ViewPagerTabs.java rename to app/src/main/java/com/android/messaging/ui/ViewPagerTabs.java diff --git a/src/com/android/messaging/ui/WidgetPickConversationActivity.java b/app/src/main/java/com/android/messaging/ui/WidgetPickConversationActivity.java similarity index 100% rename from src/com/android/messaging/ui/WidgetPickConversationActivity.java rename to app/src/main/java/com/android/messaging/ui/WidgetPickConversationActivity.java diff --git a/src/com/android/messaging/ui/animation/PopupTransitionAnimation.java b/app/src/main/java/com/android/messaging/ui/animation/PopupTransitionAnimation.java similarity index 100% rename from src/com/android/messaging/ui/animation/PopupTransitionAnimation.java rename to app/src/main/java/com/android/messaging/ui/animation/PopupTransitionAnimation.java diff --git a/src/com/android/messaging/ui/animation/RectEvaluatorCompat.java b/app/src/main/java/com/android/messaging/ui/animation/RectEvaluatorCompat.java similarity index 100% rename from src/com/android/messaging/ui/animation/RectEvaluatorCompat.java rename to app/src/main/java/com/android/messaging/ui/animation/RectEvaluatorCompat.java diff --git a/src/com/android/messaging/ui/animation/ViewGroupItemVerticalExplodeAnimation.java b/app/src/main/java/com/android/messaging/ui/animation/ViewGroupItemVerticalExplodeAnimation.java similarity index 100% rename from src/com/android/messaging/ui/animation/ViewGroupItemVerticalExplodeAnimation.java rename to app/src/main/java/com/android/messaging/ui/animation/ViewGroupItemVerticalExplodeAnimation.java diff --git a/src/com/android/messaging/ui/appsettings/ApplicationSettingsActivity.java b/app/src/main/java/com/android/messaging/ui/appsettings/ApplicationSettingsActivity.java similarity index 100% rename from src/com/android/messaging/ui/appsettings/ApplicationSettingsActivity.java rename to app/src/main/java/com/android/messaging/ui/appsettings/ApplicationSettingsActivity.java diff --git a/src/com/android/messaging/ui/appsettings/GroupMmsSettingDialog.java b/app/src/main/java/com/android/messaging/ui/appsettings/GroupMmsSettingDialog.java similarity index 100% rename from src/com/android/messaging/ui/appsettings/GroupMmsSettingDialog.java rename to app/src/main/java/com/android/messaging/ui/appsettings/GroupMmsSettingDialog.java diff --git a/src/com/android/messaging/ui/appsettings/PerSubscriptionSettingsActivity.java b/app/src/main/java/com/android/messaging/ui/appsettings/PerSubscriptionSettingsActivity.java similarity index 100% rename from src/com/android/messaging/ui/appsettings/PerSubscriptionSettingsActivity.java rename to app/src/main/java/com/android/messaging/ui/appsettings/PerSubscriptionSettingsActivity.java diff --git a/src/com/android/messaging/ui/appsettings/PhoneNumberPreference.java b/app/src/main/java/com/android/messaging/ui/appsettings/PhoneNumberPreference.java similarity index 100% rename from src/com/android/messaging/ui/appsettings/PhoneNumberPreference.java rename to app/src/main/java/com/android/messaging/ui/appsettings/PhoneNumberPreference.java diff --git a/src/com/android/messaging/ui/appsettings/SettingsActivity.java b/app/src/main/java/com/android/messaging/ui/appsettings/SettingsActivity.java similarity index 100% rename from src/com/android/messaging/ui/appsettings/SettingsActivity.java rename to app/src/main/java/com/android/messaging/ui/appsettings/SettingsActivity.java diff --git a/src/com/android/messaging/ui/attachmentchooser/AttachmentChooserActivity.java b/app/src/main/java/com/android/messaging/ui/attachmentchooser/AttachmentChooserActivity.java similarity index 100% rename from src/com/android/messaging/ui/attachmentchooser/AttachmentChooserActivity.java rename to app/src/main/java/com/android/messaging/ui/attachmentchooser/AttachmentChooserActivity.java diff --git a/src/com/android/messaging/ui/attachmentchooser/AttachmentChooserFragment.java b/app/src/main/java/com/android/messaging/ui/attachmentchooser/AttachmentChooserFragment.java similarity index 100% rename from src/com/android/messaging/ui/attachmentchooser/AttachmentChooserFragment.java rename to app/src/main/java/com/android/messaging/ui/attachmentchooser/AttachmentChooserFragment.java diff --git a/src/com/android/messaging/ui/attachmentchooser/AttachmentGridItemView.java b/app/src/main/java/com/android/messaging/ui/attachmentchooser/AttachmentGridItemView.java similarity index 100% rename from src/com/android/messaging/ui/attachmentchooser/AttachmentGridItemView.java rename to app/src/main/java/com/android/messaging/ui/attachmentchooser/AttachmentGridItemView.java diff --git a/src/com/android/messaging/ui/attachmentchooser/AttachmentGridView.java b/app/src/main/java/com/android/messaging/ui/attachmentchooser/AttachmentGridView.java similarity index 100% rename from src/com/android/messaging/ui/attachmentchooser/AttachmentGridView.java rename to app/src/main/java/com/android/messaging/ui/attachmentchooser/AttachmentGridView.java diff --git a/src/com/android/messaging/ui/contact/AddContactsConfirmationDialog.java b/app/src/main/java/com/android/messaging/ui/contact/AddContactsConfirmationDialog.java similarity index 100% rename from src/com/android/messaging/ui/contact/AddContactsConfirmationDialog.java rename to app/src/main/java/com/android/messaging/ui/contact/AddContactsConfirmationDialog.java diff --git a/src/com/android/messaging/ui/contact/AllContactsListViewHolder.java b/app/src/main/java/com/android/messaging/ui/contact/AllContactsListViewHolder.java similarity index 100% rename from src/com/android/messaging/ui/contact/AllContactsListViewHolder.java rename to app/src/main/java/com/android/messaging/ui/contact/AllContactsListViewHolder.java diff --git a/src/com/android/messaging/ui/contact/ContactDropdownLayouter.java b/app/src/main/java/com/android/messaging/ui/contact/ContactDropdownLayouter.java similarity index 100% rename from src/com/android/messaging/ui/contact/ContactDropdownLayouter.java rename to app/src/main/java/com/android/messaging/ui/contact/ContactDropdownLayouter.java diff --git a/src/com/android/messaging/ui/contact/ContactListAdapter.java b/app/src/main/java/com/android/messaging/ui/contact/ContactListAdapter.java similarity index 100% rename from src/com/android/messaging/ui/contact/ContactListAdapter.java rename to app/src/main/java/com/android/messaging/ui/contact/ContactListAdapter.java diff --git a/src/com/android/messaging/ui/contact/ContactListItemView.java b/app/src/main/java/com/android/messaging/ui/contact/ContactListItemView.java similarity index 100% rename from src/com/android/messaging/ui/contact/ContactListItemView.java rename to app/src/main/java/com/android/messaging/ui/contact/ContactListItemView.java diff --git a/src/com/android/messaging/ui/contact/ContactPickerFragment.java b/app/src/main/java/com/android/messaging/ui/contact/ContactPickerFragment.java similarity index 97% rename from src/com/android/messaging/ui/contact/ContactPickerFragment.java rename to app/src/main/java/com/android/messaging/ui/contact/ContactPickerFragment.java index 66162bf..61b39a4 100644 --- a/src/com/android/messaging/ui/contact/ContactPickerFragment.java +++ b/app/src/main/java/com/android/messaging/ui/contact/ContactPickerFragment.java @@ -182,12 +182,22 @@ public class ContactPickerFragment extends Fragment implements ContactPickerData mCustomHeaderViewPager.setCurrentItem(0); mToolbar = view.findViewById(R.id.toolbar); - mToolbar.setNavigationIcon(R.drawable.ic_arrow_back_light); + mToolbar.setNavigationIcon(R.drawable.ic_looply_back); mToolbar.setNavigationContentDescription(R.string.back); mToolbar.setNavigationOnClickListener(v -> mHost.onBackButtonPressed()); + mToolbar.setTitle(null); mToolbar.inflateMenu(R.menu.compose_menu); mToolbar.setOnMenuItemClickListener(this); + final int iconTint = getResources().getColor(R.color.looply_primary, + requireActivity().getTheme()); + final Menu toolbarMenu = mToolbar.getMenu(); + for (int i = 0; i < toolbarMenu.size(); i++) { + final android.graphics.drawable.Drawable icon = toolbarMenu.getItem(i).getIcon(); + if (icon != null) { + icon.mutate().setTint(iconTint); + } + } mComposeDivider = view.findViewById(R.id.compose_contact_divider); mRootView = view; @@ -547,8 +557,7 @@ public class ContactPickerFragment extends Fragment implements ContactPickerData // etc. will take the spot of the action bar. actionBar.hide(); UiUtils.setStatusBarColor(getActivity(), - getResources().getColor(R.color.compose_notification_bar_background, - getActivity().getTheme())); + getResources().getColor(R.color.looply_bg, getActivity().getTheme())); } private GetOrCreateConversationActionMonitor mMonitor; diff --git a/src/com/android/messaging/ui/contact/ContactRecipientAdapter.java b/app/src/main/java/com/android/messaging/ui/contact/ContactRecipientAdapter.java similarity index 100% rename from src/com/android/messaging/ui/contact/ContactRecipientAdapter.java rename to app/src/main/java/com/android/messaging/ui/contact/ContactRecipientAdapter.java diff --git a/src/com/android/messaging/ui/contact/ContactRecipientAutoCompleteView.java b/app/src/main/java/com/android/messaging/ui/contact/ContactRecipientAutoCompleteView.java similarity index 100% rename from src/com/android/messaging/ui/contact/ContactRecipientAutoCompleteView.java rename to app/src/main/java/com/android/messaging/ui/contact/ContactRecipientAutoCompleteView.java diff --git a/src/com/android/messaging/ui/contact/ContactRecipientPhotoManager.java b/app/src/main/java/com/android/messaging/ui/contact/ContactRecipientPhotoManager.java similarity index 100% rename from src/com/android/messaging/ui/contact/ContactRecipientPhotoManager.java rename to app/src/main/java/com/android/messaging/ui/contact/ContactRecipientPhotoManager.java diff --git a/src/com/android/messaging/ui/contact/ContactSectionIndexer.java b/app/src/main/java/com/android/messaging/ui/contact/ContactSectionIndexer.java similarity index 100% rename from src/com/android/messaging/ui/contact/ContactSectionIndexer.java rename to app/src/main/java/com/android/messaging/ui/contact/ContactSectionIndexer.java diff --git a/src/com/android/messaging/ui/contact/FrequentContactsListViewHolder.java b/app/src/main/java/com/android/messaging/ui/contact/FrequentContactsListViewHolder.java similarity index 100% rename from src/com/android/messaging/ui/contact/FrequentContactsListViewHolder.java rename to app/src/main/java/com/android/messaging/ui/contact/FrequentContactsListViewHolder.java diff --git a/src/com/android/messaging/ui/conversation/ComposeMessageView.java b/app/src/main/java/com/android/messaging/ui/conversation/ComposeMessageView.java similarity index 100% rename from src/com/android/messaging/ui/conversation/ComposeMessageView.java rename to app/src/main/java/com/android/messaging/ui/conversation/ComposeMessageView.java diff --git a/src/com/android/messaging/ui/conversation/ConversationActivity.java b/app/src/main/java/com/android/messaging/ui/conversation/ConversationActivity.java similarity index 100% rename from src/com/android/messaging/ui/conversation/ConversationActivity.java rename to app/src/main/java/com/android/messaging/ui/conversation/ConversationActivity.java diff --git a/src/com/android/messaging/ui/conversation/ConversationActivityUiState.java b/app/src/main/java/com/android/messaging/ui/conversation/ConversationActivityUiState.java similarity index 100% rename from src/com/android/messaging/ui/conversation/ConversationActivityUiState.java rename to app/src/main/java/com/android/messaging/ui/conversation/ConversationActivityUiState.java diff --git a/src/com/android/messaging/ui/conversation/ConversationFastScroller.java b/app/src/main/java/com/android/messaging/ui/conversation/ConversationFastScroller.java similarity index 100% rename from src/com/android/messaging/ui/conversation/ConversationFastScroller.java rename to app/src/main/java/com/android/messaging/ui/conversation/ConversationFastScroller.java diff --git a/src/com/android/messaging/ui/conversation/ConversationFragment.java b/app/src/main/java/com/android/messaging/ui/conversation/ConversationFragment.java similarity index 100% rename from src/com/android/messaging/ui/conversation/ConversationFragment.java rename to app/src/main/java/com/android/messaging/ui/conversation/ConversationFragment.java diff --git a/src/com/android/messaging/ui/conversation/ConversationInput.java b/app/src/main/java/com/android/messaging/ui/conversation/ConversationInput.java similarity index 100% rename from src/com/android/messaging/ui/conversation/ConversationInput.java rename to app/src/main/java/com/android/messaging/ui/conversation/ConversationInput.java diff --git a/src/com/android/messaging/ui/conversation/ConversationInputManager.java b/app/src/main/java/com/android/messaging/ui/conversation/ConversationInputManager.java similarity index 100% rename from src/com/android/messaging/ui/conversation/ConversationInputManager.java rename to app/src/main/java/com/android/messaging/ui/conversation/ConversationInputManager.java diff --git a/src/com/android/messaging/ui/conversation/ConversationMessageAdapter.java b/app/src/main/java/com/android/messaging/ui/conversation/ConversationMessageAdapter.java similarity index 100% rename from src/com/android/messaging/ui/conversation/ConversationMessageAdapter.java rename to app/src/main/java/com/android/messaging/ui/conversation/ConversationMessageAdapter.java diff --git a/src/com/android/messaging/ui/conversation/ConversationMessageBubbleView.java b/app/src/main/java/com/android/messaging/ui/conversation/ConversationMessageBubbleView.java similarity index 100% rename from src/com/android/messaging/ui/conversation/ConversationMessageBubbleView.java rename to app/src/main/java/com/android/messaging/ui/conversation/ConversationMessageBubbleView.java diff --git a/src/com/android/messaging/ui/conversation/ConversationMessageView.java b/app/src/main/java/com/android/messaging/ui/conversation/ConversationMessageView.java similarity index 100% rename from src/com/android/messaging/ui/conversation/ConversationMessageView.java rename to app/src/main/java/com/android/messaging/ui/conversation/ConversationMessageView.java diff --git a/src/com/android/messaging/ui/conversation/ConversationSimSelector.java b/app/src/main/java/com/android/messaging/ui/conversation/ConversationSimSelector.java similarity index 100% rename from src/com/android/messaging/ui/conversation/ConversationSimSelector.java rename to app/src/main/java/com/android/messaging/ui/conversation/ConversationSimSelector.java diff --git a/src/com/android/messaging/ui/conversation/EnterSelfPhoneNumberDialog.java b/app/src/main/java/com/android/messaging/ui/conversation/EnterSelfPhoneNumberDialog.java similarity index 100% rename from src/com/android/messaging/ui/conversation/EnterSelfPhoneNumberDialog.java rename to app/src/main/java/com/android/messaging/ui/conversation/EnterSelfPhoneNumberDialog.java diff --git a/src/com/android/messaging/ui/conversation/LaunchConversationActivity.java b/app/src/main/java/com/android/messaging/ui/conversation/LaunchConversationActivity.java similarity index 100% rename from src/com/android/messaging/ui/conversation/LaunchConversationActivity.java rename to app/src/main/java/com/android/messaging/ui/conversation/LaunchConversationActivity.java diff --git a/src/com/android/messaging/ui/conversation/MessageBubbleBackground.java b/app/src/main/java/com/android/messaging/ui/conversation/MessageBubbleBackground.java similarity index 100% rename from src/com/android/messaging/ui/conversation/MessageBubbleBackground.java rename to app/src/main/java/com/android/messaging/ui/conversation/MessageBubbleBackground.java diff --git a/src/com/android/messaging/ui/conversation/MessageDetailsDialog.java b/app/src/main/java/com/android/messaging/ui/conversation/MessageDetailsDialog.java similarity index 100% rename from src/com/android/messaging/ui/conversation/MessageDetailsDialog.java rename to app/src/main/java/com/android/messaging/ui/conversation/MessageDetailsDialog.java diff --git a/src/com/android/messaging/ui/conversation/SimIconView.java b/app/src/main/java/com/android/messaging/ui/conversation/SimIconView.java similarity index 100% rename from src/com/android/messaging/ui/conversation/SimIconView.java rename to app/src/main/java/com/android/messaging/ui/conversation/SimIconView.java diff --git a/src/com/android/messaging/ui/conversation/SimSelectorItemView.java b/app/src/main/java/com/android/messaging/ui/conversation/SimSelectorItemView.java similarity index 100% rename from src/com/android/messaging/ui/conversation/SimSelectorItemView.java rename to app/src/main/java/com/android/messaging/ui/conversation/SimSelectorItemView.java diff --git a/src/com/android/messaging/ui/conversation/SimSelectorView.java b/app/src/main/java/com/android/messaging/ui/conversation/SimSelectorView.java similarity index 100% rename from src/com/android/messaging/ui/conversation/SimSelectorView.java rename to app/src/main/java/com/android/messaging/ui/conversation/SimSelectorView.java diff --git a/src/com/android/messaging/ui/conversationlist/AbstractConversationListActivity.java b/app/src/main/java/com/android/messaging/ui/conversationlist/AbstractConversationListActivity.java similarity index 91% rename from src/com/android/messaging/ui/conversationlist/AbstractConversationListActivity.java rename to app/src/main/java/com/android/messaging/ui/conversationlist/AbstractConversationListActivity.java index 809a364..ecc97f7 100644 --- a/src/com/android/messaging/ui/conversationlist/AbstractConversationListActivity.java +++ b/app/src/main/java/com/android/messaging/ui/conversationlist/AbstractConversationListActivity.java @@ -31,6 +31,7 @@ import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.appcompat.app.ActionBar; import com.android.messaging.R; import com.android.messaging.datamodel.action.DeleteConversationAction; @@ -85,17 +86,44 @@ public abstract class AbstractConversationListActivity extends BugleActionBarAct super.onBackPressed(); } - protected void startMultiSelectActionMode() { - startActionMode(new MultiSelectActionModeCallback(this)); - mConversationListFragment.dismissFab(); + protected boolean useHomeSelectionChrome() { + return false; } - protected void exitMultiSelectState() { + protected void startMultiSelectActionMode() { + startActionMode(new MultiSelectActionModeCallback(this, useHomeSelectionChrome())); + mConversationListFragment.dismissFab(); + if (useHomeSelectionChrome()) { + mConversationListFragment.setHomeSelectionMode(true); + hideHomeContextualActionBar(); + } + } + + public void exitMultiSelectState() { + if (useHomeSelectionChrome()) { + mConversationListFragment.setHomeSelectionMode(false); + } mConversationListFragment.showFab(); dismissActionMode(); mConversationListFragment.updateUi(); } + protected void hideHomeContextualActionBar() { + final ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.hide(); + } + } + + public void deleteSelectedConversations() { + if (!isInConversationListSelectMode()) { + return; + } + final MultiSelectActionModeCallback callback = + (MultiSelectActionModeCallback) getActionModeCallback(); + onActionBarDelete(callback.getSelectedConversations()); + } + protected boolean isInConversationListSelectMode() { return getActionModeCallback() instanceof MultiSelectActionModeCallback; } @@ -225,6 +253,14 @@ public abstract class AbstractConversationListActivity extends BugleActionBarAct .show(); } + @Override + public void onSelectionCountChanged(final int count) { + if (useHomeSelectionChrome()) { + mConversationListFragment.updateHomeSelectionDeleteEnabled(count); + hideHomeContextualActionBar(); + } + } + @Override public void onConversationClick(final ConversationListData listData, final ConversationListItemData conversationListItemData, diff --git a/src/com/android/messaging/ui/conversationlist/ArchivedConversationListActivity.java b/app/src/main/java/com/android/messaging/ui/conversationlist/ArchivedConversationListActivity.java similarity index 100% rename from src/com/android/messaging/ui/conversationlist/ArchivedConversationListActivity.java rename to app/src/main/java/com/android/messaging/ui/conversationlist/ArchivedConversationListActivity.java diff --git a/src/com/android/messaging/ui/conversationlist/ConversationListActivity.java b/app/src/main/java/com/android/messaging/ui/conversationlist/ConversationListActivity.java similarity index 73% rename from src/com/android/messaging/ui/conversationlist/ConversationListActivity.java rename to app/src/main/java/com/android/messaging/ui/conversationlist/ConversationListActivity.java index d20173c..799abc3 100644 --- a/src/com/android/messaging/ui/conversationlist/ConversationListActivity.java +++ b/app/src/main/java/com/android/messaging/ui/conversationlist/ConversationListActivity.java @@ -17,13 +17,15 @@ package com.android.messaging.ui.conversationlist; -import android.graphics.drawable.ColorDrawable; import android.os.Bundle; +import android.view.ActionMode; import android.view.Menu; import android.view.MenuItem; +import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; +import androidx.appcompat.widget.PopupMenu; import com.android.messaging.R; import com.android.messaging.ui.UIIntents; @@ -45,24 +47,32 @@ public class ConversationListActivity extends AbstractConversationListActivity { invalidateActionBar(); } + @Override + protected boolean useHomeSelectionChrome() { + return true; + } + + @Override + protected boolean shouldShowContextualActionBar(final ActionMode.Callback callback) { + if (callback instanceof MultiSelectActionModeCallback) { + return !((MultiSelectActionModeCallback) callback).useHomeSelectionChrome(); + } + return true; + } + @Override protected void updateActionBar(final ActionBar actionBar) { - actionBar.setTitle(getString(R.string.app_name)); - actionBar.setDisplayShowTitleEnabled(true); - actionBar.setDisplayHomeAsUpEnabled(false); - actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); - actionBar.setBackgroundDrawable(new ColorDrawable( - getResources().getColor(R.color.action_bar_background_color))); - actionBar.show(); + if (actionBar == null) { + return; + } + // Custom Message+ chrome replaces the ActionBar on the home screen. + actionBar.hide(); super.updateActionBar(actionBar); } @Override public void onResume() { super.onResume(); - // Invalidate the menu as items that are based on settings may have changed - // while not in the app (e.g. Talkback enabled/disable affects new conversation - // button) supportInvalidateOptionsMenu(); } @@ -124,6 +134,27 @@ public class ConversationListActivity extends AbstractConversationListActivity { UIIntents.get().launchArchivedConversationsActivity(this); } + public void showHomeOverflowMenu(final android.view.View anchor) { + final PopupMenu popup = new PopupMenu(this, anchor); + popup.getMenuInflater().inflate(R.menu.conversation_list_fragment_menu, popup.getMenu()); + final MenuItem startNew = popup.getMenu().findItem(R.id.action_start_new_conversation); + if (startNew != null) { + startNew.setVisible(false); + } + popup.setOnMenuItemClickListener(this::onOptionsItemSelected); + popup.show(); + } + + public void showAutomateComingSoon() { + Toast.makeText(this, R.string.home_automate_coming_soon, Toast.LENGTH_SHORT).show(); + } + + public void enterHomeEditMode() { + if (!isInConversationListSelectMode()) { + startMultiSelectActionMode(); + } + } + @Override public boolean isSwipeAnimatable() { return !isInConversationListSelectMode(); @@ -132,8 +163,6 @@ public class ConversationListActivity extends AbstractConversationListActivity { @Override public void onWindowFocusChanged(final boolean hasFocus) { super.onWindowFocusChanged(hasFocus); - // When the screen is turned on, the last used activity gets resumed, but it gets - // window focus only after the lock screen is unlocked. if (hasFocus && mConversationListFragment != null) { mConversationListFragment.setScrolledToNewestConversationIfNeeded(); } diff --git a/app/src/main/java/com/android/messaging/ui/conversationlist/ConversationListAdapter.java b/app/src/main/java/com/android/messaging/ui/conversationlist/ConversationListAdapter.java new file mode 100644 index 0000000..10d9ba6 --- /dev/null +++ b/app/src/main/java/com/android/messaging/ui/conversationlist/ConversationListAdapter.java @@ -0,0 +1,442 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * Copyright (C) 2024 The LineageOS 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.messaging.ui.conversationlist; + +import android.content.Context; +import android.database.Cursor; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.ListUpdateCallback; +import androidx.recyclerview.widget.RecyclerView; + +import com.android.messaging.R; +import com.android.messaging.datamodel.data.ConversationListItemData; +import com.android.messaging.ui.CursorRecyclerAdapter; +import com.android.messaging.ui.home.PinnedConversationStore; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.function.Consumer; + +/** + * Provides an interface to expose Conversation List Cursor data to a UI widget like a ListView. + */ +public class ConversationListAdapter + extends CursorRecyclerAdapter { + + public static final int FILTER_ALL = 0; + public static final int FILTER_UNREAD = 1; + public static final int FILTER_GROUPS = 2; + + private static final int VIEW_TYPE_PINNED_HEADER = 1; + private static final int VIEW_TYPE_CONVERSATION = 2; + private static final long PINNED_HEADER_ITEM_ID = -9001L; + + private final ConversationListItemView.HostInterface mClivHostInterface; + private final ConversationListItemData mFilterProbe = new ConversationListItemData(); + private int mFilterMode = FILTER_ALL; + private int[] mDisplayPositions = new int[0]; + private View mPinnedStripRoot; + private boolean mPinnedHeaderVisible; + + public ConversationListAdapter(final Context context, final Cursor cursor, + final ConversationListItemView.HostInterface clivHostInterface) { + super(context, cursor, 0); + mClivHostInterface = clivHostInterface; + setHasStableIds(true); + } + + public void setPinnedStripRoot(final View pinnedStripRoot) { + mPinnedStripRoot = pinnedStripRoot; + } + + public void setPinnedHeaderVisible(final boolean visible) { + if (mPinnedHeaderVisible == visible) { + return; + } + mPinnedHeaderVisible = visible; + notifyDataSetChanged(); + } + + public boolean hasPinnedHeader() { + return mPinnedHeaderVisible && mPinnedStripRoot != null; + } + + public int getPinnedHeaderOffset() { + return hasPinnedHeader() ? 1 : 0; + } + + public int getFirstConversationAdapterPosition() { + return getPinnedHeaderOffset(); + } + + public int getConversationItemCount() { + if (getCursor() == null) { + return 0; + } + return mDisplayPositions.length; + } + + public void setFilterMode(final int filterMode) { + if (mFilterMode == filterMode) { + return; + } + mFilterMode = filterMode; + rebuildFilterIndex(); + notifyDataSetChanged(); + } + + public int getFilterMode() { + return mFilterMode; + } + + public void refreshPinOrdering() { + refreshPinOrderingAnimated(); + } + + /** Re-sorts pinned rows and animates list moves when order changes. */ + public void refreshPinOrderingAnimated() { + final List oldIds = getDisplayConversationIds(); + rebuildFilterIndex(); + final List newIds = getDisplayConversationIds(); + if (oldIds.equals(newIds)) { + if (!newIds.isEmpty()) { + notifyItemRangeChanged(getPinnedHeaderOffset(), newIds.size()); + } + return; + } + final int offset = getPinnedHeaderOffset(); + DiffUtil.calculateDiff(new DiffUtil.Callback() { + @Override + public int getOldListSize() { + return oldIds.size(); + } + + @Override + public int getNewListSize() { + return newIds.size(); + } + + @Override + public boolean areItemsTheSame(final int oldItemPosition, + final int newItemPosition) { + return oldIds.get(oldItemPosition).equals(newIds.get(newItemPosition)); + } + + @Override + public boolean areContentsTheSame(final int oldItemPosition, + final int newItemPosition) { + return areItemsTheSame(oldItemPosition, newItemPosition); + } + }).dispatchUpdatesTo(new OffsetListUpdateCallback(this, offset)); + } + + public int getDisplayIndexForConversationId(final String conversationId) { + if (conversationId == null) { + return -1; + } + final List ids = getDisplayConversationIds(); + return ids.indexOf(conversationId); + } + + public int getAdapterPositionForConversationId(final String conversationId) { + final int displayIndex = getDisplayIndexForConversationId(conversationId); + if (displayIndex < 0) { + return -1; + } + return displayIndex + getPinnedHeaderOffset(); + } + + private List getDisplayConversationIds() { + final Cursor cursor = getCursor(); + if (cursor == null || mDisplayPositions.length == 0) { + return Collections.emptyList(); + } + final List ids = new ArrayList<>(mDisplayPositions.length); + final int saved = cursor.getPosition(); + for (final int position : mDisplayPositions) { + if (cursor.moveToPosition(position)) { + mFilterProbe.bind(cursor); + ids.add(mFilterProbe.getConversationId()); + } + } + if (saved >= 0 && saved < cursor.getCount()) { + cursor.moveToPosition(saved); + } + return ids; + } + + /** Invokes {@code action} for each conversation row shown in the current filter. */ + public void forEachVisibleConversationId(final Consumer action) { + final Cursor cursor = getCursor(); + if (cursor == null || action == null) { + return; + } + for (final int position : mDisplayPositions) { + if (cursor.moveToPosition(position)) { + mFilterProbe.bind(cursor); + action.accept(mFilterProbe.getConversationId()); + } + } + } + + @Override + public Cursor swapCursor(final Cursor newCursor) { + final Cursor old = super.swapCursor(newCursor); + rebuildFilterIndex(); + return old; + } + + private void rebuildFilterIndex() { + final Cursor cursor = getCursor(); + if (cursor == null || cursor.getCount() == 0) { + mDisplayPositions = new int[0]; + return; + } + final ArrayList positions = new ArrayList<>(); + final int savedPosition = cursor.getPosition(); + for (int i = 0; i < cursor.getCount(); i++) { + if (!cursor.moveToPosition(i)) { + continue; + } + mFilterProbe.bind(cursor); + if (passesFilter()) { + positions.add(i); + } + } + if (savedPosition >= 0 && savedPosition < cursor.getCount()) { + cursor.moveToPosition(savedPosition); + } + sortPinnedFirst(positions, cursor); + mDisplayPositions = new int[positions.size()]; + for (int i = 0; i < positions.size(); i++) { + mDisplayPositions[i] = positions.get(i); + } + } + + private boolean passesFilter() { + if (mFilterMode == FILTER_ALL) { + return true; + } + if (mFilterMode == FILTER_UNREAD) { + return !mFilterProbe.getIsRead(); + } + if (mFilterMode == FILTER_GROUPS) { + return mFilterProbe.getParticipantCount() > 1; + } + return true; + } + + private void sortPinnedFirst(final ArrayList positions, final Cursor cursor) { + final List pinOrder = PinnedConversationStore.getPinnedIds(mContext); + if (pinOrder.isEmpty() || positions.isEmpty()) { + return; + } + final android.util.ArrayMap idToPosition = + new android.util.ArrayMap<>(positions.size()); + final int saved = cursor.getPosition(); + for (final int pos : positions) { + if (!cursor.moveToPosition(pos)) { + continue; + } + mFilterProbe.bind(cursor); + idToPosition.put(mFilterProbe.getConversationId(), pos); + } + if (saved >= 0 && saved < cursor.getCount()) { + cursor.moveToPosition(saved); + } + final LinkedHashSet ordered = new LinkedHashSet<>(positions.size()); + for (final String id : pinOrder) { + final Integer mapped = idToPosition.get(id); + if (mapped != null) { + ordered.add(mapped); + } + } + for (final int pos : positions) { + ordered.add(pos); + } + positions.clear(); + positions.addAll(ordered); + } + + private int mapPosition(final int displayIndex) { + return mDisplayPositions[displayIndex]; + } + + private int toDisplayIndex(final int adapterPosition) { + return adapterPosition - getPinnedHeaderOffset(); + } + + @Override + public int getItemViewType(final int position) { + if (hasPinnedHeader() && position == 0) { + return VIEW_TYPE_PINNED_HEADER; + } + return VIEW_TYPE_CONVERSATION; + } + + @Override + public int getItemCount() { + if (getCursor() == null) { + return hasPinnedHeader() ? 1 : 0; + } + return mDisplayPositions.length + getPinnedHeaderOffset(); + } + + @Override + public long getItemId(final int position) { + if (hasPinnedHeader() && position == 0) { + return PINNED_HEADER_ITEM_ID; + } + return super.getItemId(mapPosition(toDisplayIndex(position))); + } + + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, + final int viewType) { + if (viewType == VIEW_TYPE_PINNED_HEADER) { + return createPinnedHeaderViewHolder(parent); + } + return createConversationViewHolder(parent); + } + + @Override + public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, + final int position) { + if (holder instanceof PinnedHeaderViewHolder) { + attachPinnedStripToHeader((PinnedHeaderViewHolder) holder); + return; + } + if (!(holder instanceof ConversationListViewHolder)) { + return; + } + if (!mDataValid) { + throw new IllegalStateException("this should only be called when the cursor is valid"); + } + final int cursorPosition = mapPosition(toDisplayIndex(position)); + if (!mCursor.moveToPosition(cursorPosition)) { + throw new IllegalStateException("couldn't move cursor to position " + cursorPosition); + } + bindViewHolder((ConversationListViewHolder) holder, mContext, mCursor); + } + + private PinnedHeaderViewHolder createPinnedHeaderViewHolder(final ViewGroup parent) { + final FrameLayout container = new FrameLayout(parent.getContext()); + container.setLayoutParams(new RecyclerView.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT)); + container.setClipChildren(true); + container.setClipToPadding(true); + return new PinnedHeaderViewHolder(container); + } + + private void attachPinnedStripToHeader(final PinnedHeaderViewHolder holder) { + if (mPinnedStripRoot == null) { + return; + } + final ViewGroup container = (ViewGroup) holder.itemView; + if (mPinnedStripRoot.getParent() instanceof ViewGroup) { + ((ViewGroup) mPinnedStripRoot.getParent()).removeView(mPinnedStripRoot); + } + if (mPinnedStripRoot.getParent() != container) { + container.removeAllViews(); + container.addView(mPinnedStripRoot, new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT)); + } + holder.setIsRecyclable(false); + } + + private ConversationListViewHolder createConversationViewHolder(final ViewGroup parent) { + final LayoutInflater layoutInflater = LayoutInflater.from(mContext); + final ConversationListItemView itemView = + (ConversationListItemView) layoutInflater.inflate( + R.layout.conversation_list_item_view, parent, false); + return new ConversationListViewHolder(itemView); + } + + @Override + public RecyclerView.ViewHolder createViewHolder(final Context context, + final ViewGroup parent, final int viewType) { + return onCreateViewHolder(parent, viewType); + } + + @Override + public void bindViewHolder(final RecyclerView.ViewHolder holder, final Context context, + final Cursor cursor) { + if (holder instanceof ConversationListViewHolder) { + ((ConversationListViewHolder) holder).mView.bind(cursor, mClivHostInterface); + } + } + + /** + * ViewHolder that holds a ConversationListItemView. + */ + public static class ConversationListViewHolder extends RecyclerView.ViewHolder { + final ConversationListItemView mView; + + public ConversationListViewHolder(final ConversationListItemView itemView) { + super(itemView); + mView = itemView; + } + } + + static final class PinnedHeaderViewHolder extends RecyclerView.ViewHolder { + PinnedHeaderViewHolder(final View itemView) { + super(itemView); + } + } + + private static final class OffsetListUpdateCallback implements ListUpdateCallback { + private final RecyclerView.Adapter mAdapter; + private final int mOffset; + + OffsetListUpdateCallback(final RecyclerView.Adapter adapter, final int offset) { + mAdapter = adapter; + mOffset = offset; + } + + @Override + public void onInserted(final int position, final int count) { + mAdapter.notifyItemRangeInserted(position + mOffset, count); + } + + @Override + public void onRemoved(final int position, final int count) { + mAdapter.notifyItemRangeRemoved(position + mOffset, count); + } + + @Override + public void onMoved(final int fromPosition, final int toPosition) { + mAdapter.notifyItemMoved(fromPosition + mOffset, toPosition + mOffset); + } + + @Override + public void onChanged(final int position, final int count, final Object payload) { + mAdapter.notifyItemRangeChanged(position + mOffset, count, payload); + } + } +} diff --git a/app/src/main/java/com/android/messaging/ui/conversationlist/ConversationListFragment.java b/app/src/main/java/com/android/messaging/ui/conversationlist/ConversationListFragment.java new file mode 100644 index 0000000..1ee1c18 --- /dev/null +++ b/app/src/main/java/com/android/messaging/ui/conversationlist/ConversationListFragment.java @@ -0,0 +1,1239 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * Copyright (C) 2024-2025 The LineageOS 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.messaging.ui.conversationlist; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.database.Cursor; +import android.graphics.Rect; +import android.net.Uri; +import android.os.Bundle; +import android.os.Parcelable; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewGroup.MarginLayoutParams; +import android.view.ViewPropertyAnimator; +import android.view.accessibility.AccessibilityManager; +import android.widget.AbsListView; +import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.PopupWindow; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.core.view.ViewGroupCompat; +import androidx.fragment.app.Fragment; +import androidx.loader.app.LoaderManager; +import androidx.recyclerview.widget.DefaultItemAnimator; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.android.messaging.R; +import com.android.messaging.datamodel.DataModel; +import com.android.messaging.datamodel.action.MarkAsReadAction; +import com.android.messaging.datamodel.binding.Binding; +import com.android.messaging.datamodel.binding.BindingBase; +import com.android.messaging.datamodel.data.ConversationListData; +import com.android.messaging.datamodel.data.ConversationListData.ConversationListDataListener; +import com.android.messaging.datamodel.data.ConversationListItemData; +import com.android.messaging.ui.ListEmptyView; +import com.android.messaging.ui.SnackBarInteraction; +import com.android.messaging.ui.UIIntents; +import com.android.messaging.ui.home.HomeContactsFragment; +import com.android.messaging.ui.home.HomePinnedStrip; +import com.android.messaging.ui.home.PinnedConversationStore; +import com.android.messaging.util.AccessibilityUtil; +import com.android.messaging.util.ImeUtil; +import com.android.messaging.util.LogUtil; +import com.android.messaging.util.UiUtils; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * Shows a list of conversations. + */ +public class ConversationListFragment extends Fragment implements ConversationListDataListener, + ConversationListItemView.HostInterface { + private static final String BUNDLE_ARCHIVED_MODE = "archived_mode"; + private static final String BUNDLE_FORWARD_MESSAGE_MODE = "forward_message_mode"; + + private MenuItem mShowBlockedMenuItem; + private boolean mArchiveMode; + private boolean mBlockedAvailable; + private boolean mForwardMessageMode; + + public interface ConversationListFragmentHost { + void onConversationClick(final ConversationListData listData, + final ConversationListItemData conversationListItemData, + final boolean isLongClick, + final ConversationListItemView conversationView); + void onCreateConversationClick(); + boolean isConversationSelected(final String conversationId); + boolean isSwipeAnimatable(); + boolean isSelectionMode(); + boolean hasWindowFocus(); + } + + private ConversationListFragmentHost mHost; + private View mRootView; + private View mHomeHeader; + private View mHomeSelectionHeader; + private View mHomeBottomNav; + private View mHomeSelectionBar; + private ImageButton mHomeSelectionDelete; + private View mHomeMessagesTop; + private View mHomePinnedStrip; + private TextView mHomeEditButton; + private ImageButton mHomePinnedDoneButton; + private boolean mHomePinnedEditMode; + private ViewGroup mHomeContactsHost; + private View mHomeNavMessages; + private View mHomeNavContacts; + private ImageView mHomeNavMessagesIcon; + private ImageView mHomeNavContactsIcon; + private TextView mHomeNavMessagesLabel; + private TextView mHomeNavContactsLabel; + private int mHomeTab = HOME_TAB_MESSAGES; + private RecyclerView mRecyclerView; + private View mHomeComposeContainer; + private ImageButton mStartNewConversationButton; + private ListEmptyView mEmptyListMessageView; + private ConversationListAdapter mAdapter; + + // Saved Instance State Data - only for temporal data which is nice to maintain but not + // critical for correctness. + private static final String SAVED_INSTANCE_STATE_LIST_VIEW_STATE_KEY = + "conversationListViewState"; + private static final String SAVED_INSTANCE_STATE_SEARCH_BAR_EXPANDED = + "homeSearchBarExpanded"; + private static final String SAVED_INSTANCE_STATE_HOME_TAB = "homeTab"; + private static final String SAVED_INSTANCE_STATE_PINNED_EDIT = "homePinnedEdit"; + private static final String HOME_CONTACTS_FRAGMENT_TAG = "home_contacts"; + private static final int HOME_TAB_MESSAGES = 0; + private static final int HOME_TAB_CONTACTS = 1; + private static final int SEARCH_NEWEST_EDGE_SLOP_DP = 48; + private static final int SEARCH_BAR_ANIM_MS = 280; + private static final int SEARCH_BAR_SLIDE_FALLBACK_DP = 72; + + private Parcelable mListState; + private View mSearchBar; + private boolean mSearchBarShown; + + final Binding mListBinding = BindingBase.createBinding(this); + private final ConversationListItemData mPinnedRowProbe = new ConversationListItemData(); + private final HomePinnedStrip.Listener mPinnedStripListener = new HomePinnedStrip.Listener() { + @Override + public void onPinnedConversationClicked(final String conversationId) { + openConversationById(conversationId); + } + + @Override + public void onPinnedConversationUnpin(final String conversationId) { + PinnedConversationStore.unpin(requireContext(), conversationId); + mAdapter.refreshPinOrdering(); + refreshPinnedStrip(); + } + }; + + public static ConversationListFragment createArchivedConversationListFragment() { + return createConversationListFragment(BUNDLE_ARCHIVED_MODE); + } + + public static ConversationListFragment createForwardMessageConversationListFragment() { + return createConversationListFragment(BUNDLE_FORWARD_MESSAGE_MODE); + } + + public static ConversationListFragment createConversationListFragment(String modeKeyName) { + final ConversationListFragment fragment = new ConversationListFragment(); + if (modeKeyName != null) { + final Bundle bundle = new Bundle(); + bundle.putBoolean(modeKeyName, true); + fragment.setArguments(bundle); + } + return fragment; + } + + /** + * {@inheritDoc} from Fragment + */ + @Override + public void onCreate(final Bundle bundle) { + super.onCreate(bundle); + mListBinding.getData().init(LoaderManager.getInstance(this), mListBinding); + mAdapter = new ConversationListAdapter(getActivity(), null, this); + } + + @Override + public void onResume() { + super.onResume(); + + mHost = (ConversationListFragmentHost) getActivity(); + setScrolledToNewestConversationIfNeeded(); + applySearchBarVisibility(); + resetSearchBarScrollTracking(); + updateHomeMainNavVisibility(); + refreshPinnedStrip(); + updateUi(); + } + + public void setScrolledToNewestConversationIfNeeded() { + if (!mArchiveMode + && !mForwardMessageMode + && isScrolledToFirstConversation() + && mHost.hasWindowFocus()) { + mListBinding.getData().setScrolledToNewestConversation(true); + } + } + + private boolean isScrolledToFirstConversation() { + int firstItemPosition = ((LinearLayoutManager) mRecyclerView.getLayoutManager()) + .findFirstCompletelyVisibleItemPosition(); + if (firstItemPosition == RecyclerView.NO_POSITION) { + return false; + } + return firstItemPosition <= mAdapter.getFirstConversationAdapterPosition(); + } + + /** + * {@inheritDoc} from Fragment + */ + @Override + public void onDestroy() { + super.onDestroy(); + mListBinding.unbind(); + mHost = null; + } + + /** + * {@inheritDoc} from Fragment + */ + @Override + public View onCreateView(final LayoutInflater inflater, final ViewGroup container, + final Bundle savedInstanceState) { + final ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.conversation_list_fragment, + container, false); + mRecyclerView = rootView.findViewById(android.R.id.list); + mEmptyListMessageView = rootView.findViewById(R.id.no_conversations_view); + mEmptyListMessageView.setImageHint(R.drawable.ic_oobe_conv_list); + // The default behavior for default layout param generation by LinearLayoutManager is to + // provide width and height of WRAP_CONTENT, but this is not desirable for + // ConversationListFragment; the view in each row should be a width of MATCH_PARENT so that + // the entire row is tappable. + final Activity activity = getActivity(); + final LinearLayoutManager manager = new LinearLayoutManager(activity) { + @Override + public RecyclerView.LayoutParams generateDefaultLayoutParams() { + return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + } + }; + mRecyclerView.setLayoutManager(manager); + mRecyclerView.setHasFixedSize(false); + final DefaultItemAnimator itemAnimator = new DefaultItemAnimator(); + itemAnimator.setMoveDuration(220); + itemAnimator.setChangeDuration(180); + mRecyclerView.setItemAnimator(itemAnimator); + mHomePinnedStrip = inflater.inflate(R.layout.home_pinned_strip, rootView, false); + mAdapter.setPinnedStripRoot(mHomePinnedStrip); + mRecyclerView.setAdapter(mAdapter); + mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { + int mCurrentState = AbsListView.OnScrollListener.SCROLL_STATE_IDLE; + + @Override + public void onScrolled(@NonNull final RecyclerView recyclerView, final int dx, + final int dy) { + if (mCurrentState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL + || mCurrentState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) { + ImeUtil.get().hideImeKeyboard(getActivity(), mRecyclerView); + } + + if (isScrolledToFirstConversation()) { + setScrolledToNewestConversationIfNeeded(); + } else { + mListBinding.getData().setScrolledToNewestConversation(false); + } + + if (!mArchiveMode && !mForwardMessageMode) { + handleSearchBarByScrollOffset(dy); + } + } + + @Override + public void onScrollStateChanged(@NonNull final RecyclerView recyclerView, + final int newState) { + mCurrentState = newState; + } + }); + mRecyclerView.addOnItemTouchListener(new ConversationListSwipeHelper(mRecyclerView)); + + if (savedInstanceState != null) { + mListState = savedInstanceState.getParcelable(SAVED_INSTANCE_STATE_LIST_VIEW_STATE_KEY, + Parcelable.class); + mSearchBarShown = savedInstanceState.getBoolean( + SAVED_INSTANCE_STATE_SEARCH_BAR_EXPANDED, false); + } + + mRootView = rootView; + mHomeHeader = rootView.findViewById(R.id.home_header); + mHomeSelectionHeader = rootView.findViewById(R.id.home_selection_header); + mHomeBottomNav = rootView.findViewById(R.id.home_bottom_nav); + mHomeSelectionBar = rootView.findViewById(R.id.home_selection_bar); + mHomeSelectionDelete = rootView.findViewById(R.id.home_selection_delete); + + mHomeComposeContainer = rootView.findViewById(R.id.home_compose_container); + mStartNewConversationButton = rootView.findViewById(R.id.home_nav_search); + if (mArchiveMode || mForwardMessageMode) { + if (mHomeComposeContainer != null) { + mHomeComposeContainer.setVisibility(View.GONE); + } + hideHomeChrome(rootView); + } else { + if (mStartNewConversationButton != null) { + mStartNewConversationButton.setOnClickListener(v -> { + if (mHost != null) { + mHost.onCreateConversationClick(); + } + }); + } + setupHomeChrome(rootView); + mHomeMessagesTop = rootView.findViewById(R.id.home_messages_top); + mHomeContactsHost = rootView.findViewById(R.id.home_contacts_host); + mHomeNavMessages = rootView.findViewById(R.id.home_nav_messages); + mHomeNavContacts = rootView.findViewById(R.id.home_nav_contacts); + bindHomeNavTab(mHomeNavMessages, R.drawable.ic_home_nav_messages, + R.string.home_nav_messages); + bindHomeNavTab(mHomeNavContacts, R.drawable.ic_home_nav_contacts, + R.string.home_nav_contacts); + bindHomeNavTab(rootView.findViewById(R.id.home_nav_automate), + R.drawable.ic_home_nav_automate, R.string.home_nav_automate); + mHomeNavMessagesIcon = mHomeNavMessages.findViewById(R.id.home_nav_tab_icon); + mHomeNavContactsIcon = mHomeNavContacts.findViewById(R.id.home_nav_tab_icon); + mHomeNavMessagesLabel = mHomeNavMessages.findViewById(R.id.home_nav_tab_label); + mHomeNavContactsLabel = mHomeNavContacts.findViewById(R.id.home_nav_tab_label); + if (savedInstanceState != null) { + mHomeTab = savedInstanceState.getInt(SAVED_INSTANCE_STATE_HOME_TAB, + HOME_TAB_MESSAGES); + mHomePinnedEditMode = savedInstanceState.getBoolean( + SAVED_INSTANCE_STATE_PINNED_EDIT, false); + } + selectHomeTab(mHomeTab); + updateHomeEditButtonForPinnedMode(); + } + + // The root view has a non-null background, which by default is deemed by the framework + // to be a "transition group," where all child views are animated together during an + // activity transition. However, we want each individual items in the recycler view to + // show explode animation themselves, so we explicitly tag the root view to be a non-group. + ViewGroupCompat.setTransitionGroup(rootView, false); + + setHasOptionsMenu(true); + return rootView; + } + + private void bindHomeNavTab(final View tabRoot, final int iconRes, final int labelRes) { + if (tabRoot == null) { + return; + } + final ImageView icon = tabRoot.findViewById(R.id.home_nav_tab_icon); + final TextView label = tabRoot.findViewById(R.id.home_nav_tab_label); + if (icon != null) { + icon.setImageResource(iconRes); + } + if (label != null) { + label.setText(labelRes); + } + } + + private void hideHomeChrome(final View rootView) { + setGone(rootView, R.id.home_messages_top); + setGone(rootView, R.id.home_contacts_host); + setGone(rootView, R.id.home_search_bar_container); + setGone(rootView, R.id.home_bottom_nav); + setGone(rootView, R.id.home_selection_bar); + } + + private static void setGone(final View root, final int id) { + final View view = root.findViewById(id); + if (view != null) { + view.setVisibility(View.GONE); + } + } + + private int dpToPx(final int dp) { + final float density = getResources().getDisplayMetrics().density; + return (int) (dp * density + 0.5f); + } + + private void setupSearchBarScroll(final View searchBar) { + searchBar.addOnLayoutChangeListener( + (v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom) -> { + if (bottom - top != oldBottom - oldTop && mSearchBarShown) { + updateListPaddingForSearchBar(); + } + }); + searchBar.post(() -> { + applySearchBarVisibility(); + resetSearchBarScrollTracking(); + }); + } + + private void resetSearchBarScrollTracking() { + // No scroll state is kept; visibility is derived from the live scroll position. + } + + /** Toward older rows → keep search visible. Toward recent rows → hide. */ + private void handleSearchBarByScrollOffset(final int dy) { + if (mHomeTab != HOME_TAB_MESSAGES || isSelectionMode() || mHomePinnedEditMode + || mSearchBar == null || mRecyclerView == null || dy == 0) { + return; + } + if (dy > 0) { + showSearchBar(); + } else { + hideSearchBar(); + } + } + + private void cancelSearchBarAnimation() { + if (mSearchBar != null) { + mSearchBar.animate().cancel(); + } + } + + private float getSearchBarSlideDistancePx() { + if (mSearchBar == null) { + return dpToPx(SEARCH_BAR_SLIDE_FALLBACK_DP); + } + final int height = mSearchBar.getHeight(); + return height > 0 ? height : dpToPx(SEARCH_BAR_SLIDE_FALLBACK_DP); + } + + private void updateListPaddingForSearchBar() { + if (mRecyclerView == null) { + return; + } + int top = 0; + if (mSearchBarShown && mSearchBar != null + && mSearchBar.getVisibility() != View.GONE) { + top = mSearchBar.getHeight(); + if (top == 0) { + top = dpToPx(SEARCH_BAR_SLIDE_FALLBACK_DP); + } + } + mRecyclerView.setPadding( + mRecyclerView.getPaddingLeft(), + top, + mRecyclerView.getPaddingRight(), + mRecyclerView.getPaddingBottom()); + } + + private void applySearchBarVisibility() { + if (mSearchBar == null || mHomeTab != HOME_TAB_MESSAGES) { + return; + } + if (mHomePinnedEditMode) { + cancelSearchBarAnimation(); + mSearchBar.setVisibility(View.GONE); + mSearchBar.setAlpha(1f); + mSearchBar.setTranslationY(0f); + updateListPaddingForSearchBar(); + return; + } + cancelSearchBarAnimation(); + if (mSearchBarShown) { + mSearchBar.setVisibility(View.VISIBLE); + mSearchBar.setAlpha(1f); + mSearchBar.setTranslationY(0f); + updateListPaddingForSearchBar(); + mSearchBar.post(this::updateListPaddingForSearchBar); + } else { + mSearchBar.setVisibility(View.GONE); + mSearchBar.setAlpha(1f); + mSearchBar.setTranslationY(0f); + updateListPaddingForSearchBar(); + } + } + + private void runSearchBarShowAnimation() { + updateListPaddingForSearchBar(); + final float slide = getSearchBarSlideDistancePx(); + mSearchBar.setTranslationY(-slide); + mSearchBar.setAlpha(0f); + mSearchBar.animate() + .translationY(0f) + .alpha(1f) + .setDuration(SEARCH_BAR_ANIM_MS) + .setInterpolator(UiUtils.DEFAULT_INTERPOLATOR) + .withEndAction(this::updateListPaddingForSearchBar); + } + + private void showSearchBar() { + if (mHomeTab != HOME_TAB_MESSAGES || isSelectionMode() || mHomePinnedEditMode + || mSearchBar == null || mSearchBarShown) { + return; + } + mSearchBarShown = true; + cancelSearchBarAnimation(); + mSearchBar.setVisibility(View.VISIBLE); + updateListPaddingForSearchBar(); + if (mSearchBar.getHeight() == 0) { + mSearchBar.post(() -> { + updateListPaddingForSearchBar(); + runSearchBarShowAnimation(); + }); + } else { + runSearchBarShowAnimation(); + } + } + + private void hideSearchBar() { + if (mSearchBar == null || !mSearchBarShown) { + return; + } + mSearchBarShown = false; + cancelSearchBarAnimation(); + final float slide = getSearchBarSlideDistancePx(); + mSearchBar.animate() + .translationY(-slide) + .alpha(0f) + .setDuration(SEARCH_BAR_ANIM_MS) + .setInterpolator(UiUtils.DEFAULT_INTERPOLATOR) + .withEndAction(() -> { + if (!mSearchBarShown && mSearchBar != null) { + mSearchBar.setVisibility(View.GONE); + mSearchBar.setTranslationY(0f); + mSearchBar.setAlpha(1f); + updateListPaddingForSearchBar(); + } + }); + } + + private void setupHomeChrome(final View rootView) { + final View editButton = rootView.findViewById(R.id.home_edit_button); + final View filterButton = rootView.findViewById(R.id.home_filter_button); + final View searchBarContainer = rootView.findViewById(R.id.home_search_bar_container); + final View searchBar = rootView.findViewById(R.id.home_search_bar); + final View navMessages = rootView.findViewById(R.id.home_nav_messages); + final View navContacts = rootView.findViewById(R.id.home_nav_contacts); + final View navAutomate = rootView.findViewById(R.id.home_nav_automate); + + if (editButton instanceof TextView) { + mHomeEditButton = (TextView) editButton; + } + mHomePinnedDoneButton = rootView.findViewById(R.id.home_pinned_done); + updateHomeEditButtonForPinnedMode(); + if (filterButton != null) { + filterButton.setOnClickListener(this::showHomeFilterPopover); + } + final View.OnClickListener openCompose = v -> + UIIntents.get().launchCreateNewConversationActivity(requireActivity(), null); + mSearchBar = searchBarContainer != null ? searchBarContainer : searchBar; + if (searchBar != null) { + searchBar.setOnClickListener(openCompose); + } + if (mSearchBar != null) { + setupSearchBarScroll(mSearchBar); + } + updateSearchBarForPinnedEditMode(); + if (navMessages != null) { + navMessages.setOnClickListener(v -> selectHomeTab(HOME_TAB_MESSAGES)); + } + if (navContacts != null) { + navContacts.setOnClickListener(v -> selectHomeTab(HOME_TAB_CONTACTS)); + } + if (navAutomate != null) { + navAutomate.setOnClickListener(v -> + Toast.makeText(requireContext(), R.string.home_automate_coming_soon, + Toast.LENGTH_SHORT).show()); + } + + final View selectionDone = rootView.findViewById(R.id.home_selection_done); + if (selectionDone != null) { + selectionDone.setOnClickListener(v -> { + if (getActivity() instanceof AbstractConversationListActivity) { + ((AbstractConversationListActivity) getActivity()).exitMultiSelectState(); + } + }); + } + final View readAll = rootView.findViewById(R.id.home_read_all_button); + if (readAll != null) { + readAll.setOnClickListener(v -> markAllVisibleConversationsRead()); + } + if (mHomeSelectionDelete != null) { + mHomeSelectionDelete.setOnClickListener(v -> { + if (getActivity() instanceof AbstractConversationListActivity) { + ((AbstractConversationListActivity) getActivity()) + .deleteSelectedConversations(); + } + }); + } + } + + public void setHomeSelectionMode(final boolean enabled) { + if (mArchiveMode || mForwardMessageMode || mRootView == null) { + return; + } + if (mHomeHeader != null) { + mHomeHeader.setVisibility(enabled ? View.GONE : View.VISIBLE); + } + if (mHomeSelectionHeader != null) { + mHomeSelectionHeader.setVisibility(enabled ? View.VISIBLE : View.GONE); + } + if (enabled && mHomeBottomNav != null) { + mHomeBottomNav.setVisibility(View.GONE); + } + if (mHomeSelectionBar != null) { + mHomeSelectionBar.setVisibility(enabled ? View.VISIBLE : View.GONE); + } + if (enabled) { + setPinnedEditMode(false); + updateHomeComposeButtonVisibility(); + refreshPinnedStrip(); + if (mHomeMessagesTop != null) { + mHomeMessagesTop.bringToFront(); + } + } else { + updateHomeMainNavVisibility(); + refreshPinnedStrip(); + } + if (enabled) { + mSearchBarShown = false; + cancelSearchBarAnimation(); + if (mSearchBar != null) { + mSearchBar.setVisibility(View.GONE); + mSearchBar.setAlpha(1f); + mSearchBar.setTranslationY(0f); + } + updateListPaddingForSearchBar(); + } + updateHomeSelectionDeleteEnabled(0); + updateUi(); + } + + private void selectHomeTab(final int tab) { + if (mArchiveMode || mForwardMessageMode || mRootView == null) { + return; + } + if (isSelectionMode() && tab != HOME_TAB_MESSAGES) { + return; + } + mHomeTab = tab; + final boolean showMessages = tab == HOME_TAB_MESSAGES; + if (mHomeMessagesTop != null) { + mHomeMessagesTop.setVisibility(showMessages ? View.VISIBLE : View.GONE); + } + if (mHomeContactsHost != null) { + mHomeContactsHost.setVisibility(showMessages ? View.GONE : View.VISIBLE); + if (!showMessages) { + ensureHomeContactsFragment(); + } + } + if (!showMessages) { + mSearchBarShown = false; + cancelSearchBarAnimation(); + if (mSearchBar != null) { + mSearchBar.setVisibility(View.GONE); + mSearchBar.setAlpha(1f); + mSearchBar.setTranslationY(0f); + } + updateListPaddingForSearchBar(); + if (mEmptyListMessageView != null) { + mEmptyListMessageView.setVisibility(View.GONE); + } + } else { + applySearchBarVisibility(); + updateEmptyListUi(mAdapter.getConversationItemCount() == 0); + } + updateHomeComposeButtonVisibility(); + updateHomeNavHighlight(); + updateHomeMainNavVisibility(); + refreshPinnedStrip(); + } + + /** Main tabs show nav; selection mode and other activities hide it ({@link #onPause}). */ + private void updateHomeMainNavVisibility() { + if (mHomeBottomNav == null || mArchiveMode || mForwardMessageMode) { + return; + } + if (isSelectionMode()) { + mHomeBottomNav.setVisibility(View.GONE); + } else { + mHomeBottomNav.setVisibility(isResumed() ? View.VISIBLE : View.GONE); + } + updateHomeComposeButtonVisibility(); + } + + private void updateHomeComposeButtonVisibility() { + if (mArchiveMode || mForwardMessageMode) { + return; + } + final boolean showCompose = isResumed() && mHomeTab == HOME_TAB_MESSAGES + && !isSelectionMode(); + if (mHomeComposeContainer != null) { + mHomeComposeContainer.setVisibility(showCompose ? View.VISIBLE : View.GONE); + } + if (mStartNewConversationButton != null && showCompose) { + mStartNewConversationButton.animate().cancel(); + mStartNewConversationButton.setTranslationX(0f); + mStartNewConversationButton.setVisibility(View.VISIBLE); + mStartNewConversationButton.setEnabled(true); + } + } + + private void launchHomeSubScreen(final Runnable action) { + if (mHomeBottomNav != null) { + mHomeBottomNav.setVisibility(View.GONE); + } + if (mHomeComposeContainer != null) { + mHomeComposeContainer.setVisibility(View.GONE); + } + action.run(); + } + + private void ensureHomeContactsFragment() { + if (mHomeContactsHost == null + || getChildFragmentManager().findFragmentById(R.id.home_contacts_host) != null) { + return; + } + getChildFragmentManager().beginTransaction() + .replace(R.id.home_contacts_host, new HomeContactsFragment(), + HOME_CONTACTS_FRAGMENT_TAG) + .commit(); + } + + private void updateHomeNavHighlight() { + final boolean messagesActive = mHomeTab == HOME_TAB_MESSAGES; + applyHomeNavTabStyle(mHomeNavMessages, mHomeNavMessagesIcon, mHomeNavMessagesLabel, + messagesActive); + applyHomeNavTabStyle(mHomeNavContacts, mHomeNavContactsIcon, mHomeNavContactsLabel, + !messagesActive); + } + + private void applyHomeNavTabStyle(final View tab, final ImageView icon, final TextView label, + final boolean active) { + if (tab == null) { + return; + } + if (active) { + tab.setBackgroundResource(R.drawable.home_bg_nav_active_primary); + } else { + tab.setBackgroundResource(android.R.color.transparent); + } + final int color = ContextCompat.getColor(requireContext(), + active ? R.color.home_nav_active_content : R.color.home_nav_inactive); + if (icon != null) { + icon.setImageTintList(android.content.res.ColorStateList.valueOf(color)); + } + if (label != null) { + label.setTextColor(color); + label.setTypeface(null, active ? android.graphics.Typeface.BOLD + : android.graphics.Typeface.NORMAL); + } + } + + public void updateHomeSelectionDeleteEnabled(final int selectedCount) { + if (mHomeSelectionDelete == null) { + return; + } + final boolean enabled = selectedCount > 0; + mHomeSelectionDelete.setEnabled(enabled); + mHomeSelectionDelete.setAlpha(1f); + mHomeSelectionDelete.setImageAlpha(enabled ? 255 : 102); + } + + private void markAllVisibleConversationsRead() { + mAdapter.forEachVisibleConversationId(MarkAsReadAction::markAsRead); + } + + private PopupWindow mHomePopover; + + private void dismissHomePopover() { + if (mHomePopover != null && mHomePopover.isShowing()) { + mHomePopover.dismiss(); + } + mHomePopover = null; + } + + private PopupWindow showHomePopover(final View anchor, final int layoutResId, + final boolean alignEnd) { + dismissHomePopover(); + final View content = LayoutInflater.from(requireContext()) + .inflate(layoutResId, null, false); + content.measure( + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); + final PopupWindow popup = new PopupWindow(content, + content.getMeasuredWidth(), + ViewGroup.LayoutParams.WRAP_CONTENT, + true); + popup.setOutsideTouchable(true); + popup.setFocusable(true); + popup.setElevation(16f); + popup.setBackgroundDrawable(new android.graphics.drawable.ColorDrawable( + android.graphics.Color.TRANSPARENT)); + popup.setOnDismissListener(() -> { + if (mHomePopover == popup) { + mHomePopover = null; + } + }); + final int xOff = alignEnd + ? Math.max(0, anchor.getWidth() - content.getMeasuredWidth()) + : 0; + popup.showAsDropDown(anchor, xOff, 8); + mHomePopover = popup; + return popup; + } + + private void showHomeFilterPopover(final View anchor) { + final PopupWindow popup = showHomePopover(anchor, R.layout.home_popover_filter, true); + final View content = popup.getContentView(); + content.findViewById(R.id.popover_messages).setOnClickListener(v -> { + selectHomeChip(ConversationListAdapter.FILTER_ALL); + dismissHomePopover(); + }); + content.findViewById(R.id.popover_spam).setOnClickListener(v -> { + dismissHomePopover(); + launchHomeSubScreen(() -> UIIntents.get().launchBlockedParticipantsActivity( + requireActivity())); + }); + content.findViewById(R.id.popover_recently_deleted).setOnClickListener(v -> { + dismissHomePopover(); + launchHomeSubScreen(() -> UIIntents.get().launchArchivedConversationsActivity( + requireActivity())); + }); + content.findViewById(R.id.popover_unread).setOnClickListener(v -> { + selectHomeChip(ConversationListAdapter.FILTER_UNREAD); + dismissHomePopover(); + }); + content.findViewById(R.id.popover_work).setOnClickListener(v -> { + dismissHomePopover(); + Toast.makeText(requireContext(), R.string.home_popover_coming_soon, + Toast.LENGTH_SHORT).show(); + }); + content.findViewById(R.id.popover_personal).setOnClickListener(v -> { + selectHomeChip(ConversationListAdapter.FILTER_ALL); + dismissHomePopover(); + }); + content.findViewById(R.id.popover_settings).setOnClickListener(v -> { + dismissHomePopover(); + launchHomeSubScreen(() -> { + if (getActivity() instanceof ConversationListActivity) { + ((ConversationListActivity) getActivity()).onActionBarSettings(); + } + }); + }); + } + + private void showHomeEditPopover(final View anchor) { + final PopupWindow popup = showHomePopover(anchor, R.layout.home_popover_edit, false); + final View content = popup.getContentView(); + content.findViewById(R.id.popover_select_messages).setOnClickListener(v -> { + dismissHomePopover(); + if (getActivity() instanceof ConversationListActivity) { + ((ConversationListActivity) getActivity()).enterHomeEditMode(); + } + }); + content.findViewById(R.id.popover_edit_pinned).setOnClickListener(v -> { + dismissHomePopover(); + setPinnedEditMode(true); + }); + content.findViewById(R.id.popover_name_photo).setOnClickListener(v -> { + dismissHomePopover(); + launchHomeSubScreen(() -> { + if (getActivity() instanceof ConversationListActivity) { + ((ConversationListActivity) getActivity()).onActionBarSettings(); + } + }); + }); + } + + private void selectHomeChip(final int filterMode) { + mAdapter.setFilterMode(filterMode); + updateEmptyListUi(mAdapter.getConversationItemCount() == 0); + } + + @Override + public void onAttach(@NonNull final Context context) { + super.onAttach(context); + LogUtil.v(LogUtil.BUGLE_TAG, "Attaching List"); + final Bundle arguments = getArguments(); + if (arguments != null) { + mArchiveMode = arguments.getBoolean(BUNDLE_ARCHIVED_MODE, false); + mForwardMessageMode = arguments.getBoolean(BUNDLE_FORWARD_MESSAGE_MODE, false); + } + mListBinding.bind(DataModel.get().createConversationListData(context, this, mArchiveMode)); + } + + + @Override + public void onSaveInstanceState(@NonNull final Bundle outState) { + super.onSaveInstanceState(outState); + if (mListState != null) { + outState.putParcelable(SAVED_INSTANCE_STATE_LIST_VIEW_STATE_KEY, mListState); + } + outState.putBoolean(SAVED_INSTANCE_STATE_SEARCH_BAR_EXPANDED, mSearchBarShown); + outState.putInt(SAVED_INSTANCE_STATE_HOME_TAB, mHomeTab); + outState.putBoolean(SAVED_INSTANCE_STATE_PINNED_EDIT, mHomePinnedEditMode); + } + + @Override + public void onPause() { + super.onPause(); + dismissHomePopover(); + if (mHomeBottomNav != null && !mArchiveMode && !mForwardMessageMode) { + mHomeBottomNav.setVisibility(View.GONE); + } + mListState = mRecyclerView.getLayoutManager().onSaveInstanceState(); + mListBinding.getData().setScrolledToNewestConversation(false); + } + + @Override + public void onConversationListCursorUpdated(final ConversationListData data, + final Cursor cursor) { + mListBinding.ensureBound(data); + final Cursor oldCursor = mAdapter.swapCursor(cursor); + prunePinnedConversations(cursor); + refreshPinnedStrip(); + updateEmptyListUi(mAdapter.getConversationItemCount() == 0); + if (mListState != null && cursor != null && oldCursor == null) { + mRecyclerView.getLayoutManager().onRestoreInstanceState(mListState); + } + } + + @Override + public void setBlockedParticipantsAvailable(final boolean blockedAvailable) { + mBlockedAvailable = blockedAvailable; + if (mShowBlockedMenuItem != null) { + mShowBlockedMenuItem.setVisible(blockedAvailable); + } + } + + public void updateUi() { + mAdapter.notifyDataSetChanged(); + } + + @Override + public void onPrepareOptionsMenu(@NonNull final Menu menu) { + super.onPrepareOptionsMenu(menu); + final MenuItem startNewConversationMenuItem = + menu.findItem(R.id.action_start_new_conversation); + if (startNewConversationMenuItem != null) { + // It is recommended for the Floating Action button functionality to be duplicated as a + // menu + AccessibilityManager accessibilityManager = (AccessibilityManager) + requireActivity().getSystemService(Context.ACCESSIBILITY_SERVICE); + startNewConversationMenuItem.setVisible(accessibilityManager + .isTouchExplorationEnabled()); + } + + final MenuItem archive = menu.findItem(R.id.action_show_archived); + if (archive != null) { + archive.setVisible(true); + } + } + + @Override + public void onCreateOptionsMenu(@NonNull final Menu menu, + @NonNull final MenuInflater inflater) { + if (!isAdded()) { + // Guard against being called before we're added to the activity + return; + } + + mShowBlockedMenuItem = menu.findItem(R.id.action_show_blocked_contacts); + if (mShowBlockedMenuItem != null) { + mShowBlockedMenuItem.setVisible(mBlockedAvailable); + } + } + + /** + * {@inheritDoc} from ConversationListItemView.HostInterface + */ + @Override + public void onConversationClicked(final ConversationListItemData conversationListItemData, + final boolean isLongClick, final ConversationListItemView conversationView) { + final ConversationListData listData = mListBinding.getData(); + mHost.onConversationClick(listData, conversationListItemData, isLongClick, + conversationView); + } + + /** + * {@inheritDoc} from ConversationListItemView.HostInterface + */ + @Override + public boolean isConversationSelected(final String conversationId) { + return mHost.isConversationSelected(conversationId); + } + + @Override + public boolean shouldShowConversationPinButton() { + return mHomePinnedEditMode && !mArchiveMode && !mForwardMessageMode + && mHomeTab == HOME_TAB_MESSAGES; + } + + @Override + public boolean isConversationPinned(final String conversationId) { + return PinnedConversationStore.isPinned(requireContext(), conversationId); + } + + @Override + public void onConversationPinButtonClicked(final String conversationId) { + final boolean wasPinned = PinnedConversationStore.isPinned(requireContext(), + conversationId); + if (wasPinned) { + PinnedConversationStore.unpin(requireContext(), conversationId); + } else if (!PinnedConversationStore.pin(requireContext(), conversationId)) { + showPinnedLimitDialog(); + return; + } + mAdapter.refreshPinOrderingAnimated(); + final int adapterPosition = mAdapter.getAdapterPositionForConversationId(conversationId); + if (adapterPosition >= 0) { + mAdapter.notifyItemChanged(adapterPosition); + } + refreshPinnedStrip(); + if (!wasPinned && mRecyclerView != null) { + mRecyclerView.smoothScrollToPosition(mAdapter.getFirstConversationAdapterPosition()); + } + } + + @Override + public boolean isSwipeAnimatable() { + return mHost.isSwipeAnimatable(); + } + + // Show and hide empty list UI as needed with appropriate text based on view specifics + private void updateEmptyListUi(final boolean isEmpty) { + if (isEmpty) { + int emptyListText; + if (!mListBinding.getData().getHasFirstSyncCompleted()) { + emptyListText = R.string.conversation_list_first_sync_text; + } else if (mArchiveMode) { + emptyListText = R.string.archived_conversation_list_empty_text; + } else { + emptyListText = R.string.conversation_list_empty_text; + } + mEmptyListMessageView.setTextHint(emptyListText); + mEmptyListMessageView.setVisibility(View.VISIBLE); + mEmptyListMessageView.setIsImageVisible(true); + mEmptyListMessageView.setIsVerticallyCentered(true); + } else { + mEmptyListMessageView.setVisibility(View.GONE); + } + } + + @Override + public List getSnackBarInteractions() { + final List interactions = new ArrayList<>(1); + final SnackBarInteraction fabInteraction = + new SnackBarInteraction.BasicSnackBarInteraction(mStartNewConversationButton); + interactions.add(fabInteraction); + return interactions; + } + + private ViewPropertyAnimator getNormalizedFabAnimator() { + return mStartNewConversationButton.animate() + .setInterpolator(UiUtils.DEFAULT_INTERPOLATOR) + .setDuration(getActivity().getResources().getInteger( + R.integer.fab_animation_duration_ms)); + } + + public void dismissFab() { + // To prevent clicking while animating. + mStartNewConversationButton.setEnabled(false); + final MarginLayoutParams lp = + (MarginLayoutParams) mStartNewConversationButton.getLayoutParams(); + final float fabWidthWithLeftRightMargin = mStartNewConversationButton.getWidth() + + lp.leftMargin + lp.rightMargin; + final int direction = AccessibilityUtil.isLayoutRtl(mStartNewConversationButton) ? -1 : 1; + getNormalizedFabAnimator().translationX(direction * fabWidthWithLeftRightMargin); + } + + public void showFab() { + if (mStartNewConversationButton == null) { + return; + } + updateHomeComposeButtonVisibility(); + getNormalizedFabAnimator().translationX(0).withEndAction(() -> { + mStartNewConversationButton.setEnabled(true); + }); + } + + @Override + public void startFullScreenPhotoViewer( + final Uri initialPhoto, final Rect initialPhotoBounds, final Uri photosUri) { + UIIntents.get().launchFullScreenPhotoViewer( + getActivity(), initialPhoto, initialPhotoBounds, photosUri); + } + + @Override + public void startFullScreenVideoViewer(final Uri videoUri) { + UIIntents.get().launchFullScreenVideoViewer(getActivity(), videoUri); + } + + @Override + public boolean isSelectionMode() { + return mHost != null && mHost.isSelectionMode(); + } + + private void setPinnedEditMode(final boolean enabled) { + if (mArchiveMode || mForwardMessageMode) { + return; + } + if (enabled) { + if (isSelectionMode() + && getActivity() instanceof AbstractConversationListActivity) { + ((AbstractConversationListActivity) getActivity()).exitMultiSelectState(); + } + if (mHomeSelectionHeader != null) { + mHomeSelectionHeader.setVisibility(View.GONE); + } + if (mHomeHeader != null) { + mHomeHeader.setVisibility(View.VISIBLE); + } + if (mHomeSelectionBar != null) { + mHomeSelectionBar.setVisibility(View.GONE); + } + } + mHomePinnedEditMode = enabled; + updateHomeEditButtonForPinnedMode(); + updateSearchBarForPinnedEditMode(); + refreshPinnedStrip(); + updateUi(); + } + + private void updateSearchBarForPinnedEditMode() { + if (mSearchBar == null) { + return; + } + cancelSearchBarAnimation(); + if (mHomePinnedEditMode) { + mSearchBarShown = false; + mSearchBar.setVisibility(View.GONE); + mSearchBar.setAlpha(1f); + mSearchBar.setTranslationY(0f); + updateListPaddingForSearchBar(); + } else { + applySearchBarVisibility(); + } + } + + private void updateHomeEditButtonForPinnedMode() { + if (mHomeEditButton == null) { + return; + } + if (mHomePinnedEditMode) { + mHomeEditButton.setVisibility(View.GONE); + if (mHomePinnedDoneButton != null) { + mHomePinnedDoneButton.setVisibility(View.VISIBLE); + mHomePinnedDoneButton.setOnClickListener(v -> setPinnedEditMode(false)); + } + } else { + mHomeEditButton.setVisibility(View.VISIBLE); + mHomeEditButton.setText(R.string.home_edit); + mHomeEditButton.setOnClickListener(this::showHomeEditPopover); + if (mHomePinnedDoneButton != null) { + mHomePinnedDoneButton.setVisibility(View.GONE); + } + } + } + + private void refreshPinnedStrip() { + if (mHomePinnedStrip == null || mArchiveMode || mForwardMessageMode + || mHomeTab != HOME_TAB_MESSAGES) { + mAdapter.setPinnedHeaderVisible(false); + return; + } + final Cursor cursor = mAdapter.getCursor(); + final boolean editMode = mHomePinnedEditMode && !isSelectionMode(); + final List pinnedIds = PinnedConversationStore.getPinnedIds(requireContext()); + HomePinnedStrip.bind(mHomePinnedStrip, cursor, pinnedIds, + editMode, isSelectionMode(), mPinnedStripListener); + final boolean showHeader = pinnedIds != null && !pinnedIds.isEmpty() + && cursor != null + && mHomePinnedStrip.getVisibility() == View.VISIBLE; + if (showHeader) { + if (!mAdapter.hasPinnedHeader()) { + mAdapter.setPinnedHeaderVisible(true); + } else { + mAdapter.notifyItemChanged(0); + } + } else { + mAdapter.setPinnedHeaderVisible(false); + } + } + + private void prunePinnedConversations(final Cursor cursor) { + if (cursor == null) { + return; + } + final Set validIds = new HashSet<>(); + final int saved = cursor.getPosition(); + for (int i = 0; i < cursor.getCount(); i++) { + if (cursor.moveToPosition(i)) { + mPinnedRowProbe.bind(cursor); + validIds.add(mPinnedRowProbe.getConversationId()); + } + } + if (saved >= 0 && saved < cursor.getCount()) { + cursor.moveToPosition(saved); + } + PinnedConversationStore.pruneMissing(requireContext(), validIds); + } + + private void showPinnedLimitDialog() { + new AlertDialog.Builder(requireContext()) + .setTitle(R.string.home_pinned_dialog_title) + .setMessage(R.string.home_pinned_dialog_message) + .setPositiveButton(R.string.home_pinned_dialog_ok, null) + .show(); + } + + private void openConversationById(final String conversationId) { + if (mHost == null) { + return; + } + final Cursor cursor = mAdapter.getCursor(); + if (cursor == null) { + return; + } + final int saved = cursor.getPosition(); + for (int i = 0; i < cursor.getCount(); i++) { + if (!cursor.moveToPosition(i)) { + continue; + } + mPinnedRowProbe.bind(cursor); + if (conversationId.equals(mPinnedRowProbe.getConversationId())) { + mHost.onConversationClick(mListBinding.getData(), mPinnedRowProbe, false, null); + break; + } + } + if (saved >= 0 && saved < cursor.getCount()) { + cursor.moveToPosition(saved); + } + } +} diff --git a/src/com/android/messaging/ui/conversationlist/ConversationListItemView.java b/app/src/main/java/com/android/messaging/ui/conversationlist/ConversationListItemView.java similarity index 73% rename from src/com/android/messaging/ui/conversationlist/ConversationListItemView.java rename to app/src/main/java/com/android/messaging/ui/conversationlist/ConversationListItemView.java index e36f782..a7c9377 100644 --- a/src/com/android/messaging/ui/conversationlist/ConversationListItemView.java +++ b/app/src/main/java/com/android/messaging/ui/conversationlist/ConversationListItemView.java @@ -33,7 +33,9 @@ import android.view.View.OnClickListener; import android.view.View.OnLayoutChangeListener; import android.view.View.OnLongClickListener; import android.view.ViewGroup; +import android.view.animation.OvershootInterpolator; import android.widget.FrameLayout; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; @@ -70,8 +72,10 @@ import java.util.List; */ public class ConversationListItemView extends FrameLayout implements OnClickListener, OnLongClickListener, OnLayoutChangeListener { - static final int UNREAD_SNIPPET_LINE_COUNT = 3; - static final int NO_UNREAD_SNIPPET_LINE_COUNT = 1; + static final int UNREAD_SNIPPET_LINE_COUNT = 2; + static final int NO_UNREAD_SNIPPET_LINE_COUNT = 2; + private static final int LIST_DIVIDER_INSET_DEFAULT_DP = 74; + private static final int LIST_DIVIDER_INSET_SELECTION_DP = 104; private int mListItemReadColor; private int mListItemUnreadColor; private Typeface mListItemReadTypeface; @@ -89,6 +93,9 @@ public class ConversationListItemView extends FrameLayout implements OnClickList final Uri photosUri); void startFullScreenVideoViewer(final Uri videoUri); boolean isSelectionMode(); + boolean shouldShowConversationPinButton(); + boolean isConversationPinned(final String conversationId); + void onConversationPinButtonClicked(final String conversationId); } private final OnClickListener fullScreenPreviewClickListener = new OnClickListener() { @@ -122,10 +129,16 @@ public class ConversationListItemView extends FrameLayout implements OnClickList private ViewGroup mCrossSwipeBackground; private ViewGroup mSwipeableContent; private TextView mConversationNameView; + private View mUnreadDotSlotView; + private View mUnreadDotView; + private TextView mCategoryChipView; private ImageView mWorkProfileIconView; private TextView mSnippetTextView; private TextView mSubjectTextView; private TextView mTimestampTextView; + private View mSelectionIndicatorView; + private View mSelectionRingView; + private ImageView mSelectionCheckView; private ContactIconView mContactIconView; private ImageView mContactCheckmarkView; private ImageView mFailedStatusIconView; @@ -133,8 +146,15 @@ public class ConversationListItemView extends FrameLayout implements OnClickList private ImageView mCrossSwipeArchiveRightImageView; private AsyncImageView mImagePreviewView; private AudioAttachmentView mAudioAttachmentView; + private ImageView mChevronView; + private ImageButton mPinButton; + private View mListDividerView; private HostInterface mHostInterface; + private static final int SELECTION_TOGGLE_ANIM_MS = 180; + private String mSelectionStateConversationId; + private Boolean mSelectionStateChecked; + public ConversationListItemView(final Context context, final AttributeSet attrs) { super(context, attrs); mData = new ConversationListItemData(); @@ -152,6 +172,12 @@ public class ConversationListItemView extends FrameLayout implements OnClickList mSubjectTextView = findViewById(R.id.conversation_subject); mWorkProfileIconView = findViewById(R.id.work_profile_icon); mTimestampTextView = findViewById(R.id.conversation_timestamp); + mUnreadDotSlotView = findViewById(R.id.conversation_unread_dot_slot); + mUnreadDotView = findViewById(R.id.conversation_unread_dot); + mCategoryChipView = findViewById(R.id.conversation_category_chip); + mSelectionIndicatorView = findViewById(R.id.conversation_selection_indicator); + mSelectionRingView = findViewById(R.id.conversation_selection_ring); + mSelectionCheckView = findViewById(R.id.conversation_selection_check); mContactIconView = findViewById(R.id.conversation_icon); mContactCheckmarkView = findViewById(R.id.conversation_checkmark); mFailedStatusIconView = findViewById(R.id.conversation_failed_status_icon); @@ -159,13 +185,16 @@ public class ConversationListItemView extends FrameLayout implements OnClickList mCrossSwipeArchiveRightImageView = findViewById(R.id.crossSwipeArchiveIconRight); mImagePreviewView = findViewById(R.id.conversation_image_preview); mAudioAttachmentView = findViewById(R.id.audio_attachment_view); + mChevronView = findViewById(R.id.conversation_chevron); + mPinButton = findViewById(R.id.conversation_pin_button); + mListDividerView = findViewById(R.id.conversation_list_divider); mConversationNameView.addOnLayoutChangeListener(this); mSnippetTextView.addOnLayoutChangeListener(this); final Resources resources = getContext().getResources(); final Resources.Theme theme = getContext().getTheme(); - mListItemReadColor = resources.getColor(R.color.conversation_list_item_read, theme); - mListItemUnreadColor = resources.getColor(R.color.conversation_list_item_unread, theme); + mListItemReadColor = resources.getColor(R.color.home_text_primary, theme); + mListItemUnreadColor = resources.getColor(R.color.home_text_primary, theme); mListItemReadTypeface = Typefaces.getRobotoNormal(); mListItemUnreadTypeface = Typefaces.getRobotoBold(); @@ -188,10 +217,34 @@ public class ConversationListItemView extends FrameLayout implements OnClickList private void setWorkProfileIcon() { mWorkProfileIconView.setVisibility(mData.isEnterprise() ? View.VISIBLE : View.GONE); + if (mCategoryChipView != null) { + final boolean selectionMode = + mHostInterface != null && mHostInterface.isSelectionMode(); + if (selectionMode) { + mCategoryChipView.setVisibility(View.GONE); + } else { + mCategoryChipView.setVisibility(View.VISIBLE); + mCategoryChipView.setText(mData.isEnterprise() + ? R.string.home_chip_work + : R.string.home_chip_personal); + } + } } private void setConversationName() { - if (mData.getIsRead() || mData.getShowDraft()) { + final boolean selectionMode = + mHostInterface != null && mHostInterface.isSelectionMode(); + final boolean showUnreadDot = !mData.getIsRead() && !mData.getShowDraft(); + if (mUnreadDotSlotView != null) { + mUnreadDotSlotView.setVisibility(View.VISIBLE); + } + if (mUnreadDotView != null) { + mUnreadDotView.setVisibility(showUnreadDot ? View.VISIBLE : View.INVISIBLE); + } + if (selectionMode) { + mConversationNameView.setTextColor(mListItemReadColor); + mConversationNameView.setTypeface(mListItemUnreadTypeface); + } else if (mData.getIsRead() || mData.getShowDraft()) { mConversationNameView.setTextColor(mListItemReadColor); mConversationNameView.setTypeface(mListItemReadTypeface); } else { @@ -250,6 +303,134 @@ public class ConversationListItemView extends FrameLayout implements OnClickList mSnippetTextView.setText(getSnippetText()); } + private void updateSelectionIndicator(final boolean selectionMode, final boolean isSelected, + final Resources resources) { + if (mSelectionIndicatorView == null || mSelectionRingView == null + || mSelectionCheckView == null) { + return; + } + if (!selectionMode) { + mSelectionIndicatorView.animate().cancel(); + mSelectionCheckView.animate().cancel(); + mSelectionIndicatorView.setScaleX(1f); + mSelectionIndicatorView.setScaleY(1f); + mSelectionCheckView.setAlpha(1f); + mSelectionCheckView.setScaleX(1f); + mSelectionCheckView.setScaleY(1f); + mSelectionIndicatorView.setVisibility(GONE); + mSelectionStateConversationId = null; + mSelectionStateChecked = null; + return; + } + mSelectionIndicatorView.setVisibility(VISIBLE); + final String conversationId = mData.getConversationId(); + final boolean sameConversation = conversationId != null + && conversationId.equals(mSelectionStateConversationId); + final boolean animateToggle = sameConversation && mSelectionStateChecked != null + && mSelectionStateChecked.booleanValue() != isSelected; + mSelectionStateConversationId = conversationId; + mSelectionStateChecked = isSelected; + + mSelectionIndicatorView.animate().cancel(); + mSelectionCheckView.animate().cancel(); + + if (isSelected) { + mSelectionRingView.setBackground(resources.getDrawable( + R.drawable.home_bg_selection_ring_checked, getContext().getTheme())); + mSelectionCheckView.setVisibility(VISIBLE); + if (animateToggle) { + mSelectionIndicatorView.setScaleX(0.88f); + mSelectionIndicatorView.setScaleY(0.88f); + mSelectionIndicatorView.animate() + .scaleX(1f) + .scaleY(1f) + .setDuration(SELECTION_TOGGLE_ANIM_MS) + .setInterpolator(new OvershootInterpolator(1.6f)); + mSelectionCheckView.setAlpha(0f); + mSelectionCheckView.setScaleX(0.4f); + mSelectionCheckView.setScaleY(0.4f); + mSelectionCheckView.animate() + .alpha(1f) + .scaleX(1f) + .scaleY(1f) + .setDuration(SELECTION_TOGGLE_ANIM_MS) + .setInterpolator(UiUtils.DEFAULT_INTERPOLATOR); + } else { + mSelectionIndicatorView.setScaleX(1f); + mSelectionIndicatorView.setScaleY(1f); + mSelectionCheckView.setAlpha(1f); + mSelectionCheckView.setScaleX(1f); + mSelectionCheckView.setScaleY(1f); + } + } else { + mSelectionRingView.setBackground(resources.getDrawable( + R.drawable.home_bg_selection_ring, getContext().getTheme())); + mSelectionCheckView.setVisibility(GONE); + mSelectionCheckView.setAlpha(1f); + mSelectionCheckView.setScaleX(1f); + mSelectionCheckView.setScaleY(1f); + if (animateToggle) { + mSelectionIndicatorView.setScaleX(0.92f); + mSelectionIndicatorView.setScaleY(0.92f); + mSelectionIndicatorView.animate() + .scaleX(1f) + .scaleY(1f) + .setDuration(SELECTION_TOGGLE_ANIM_MS) + .setInterpolator(UiUtils.DEFAULT_INTERPOLATOR); + } else { + mSelectionIndicatorView.setScaleX(1f); + mSelectionIndicatorView.setScaleY(1f); + } + } + } + + private void updatePinButton(final boolean selectionMode, final Resources resources) { + if (mPinButton == null || mHostInterface == null) { + return; + } + final boolean showPin = mHostInterface.shouldShowConversationPinButton() + && !selectionMode; + if (!showPin) { + mPinButton.setVisibility(GONE); + if (mChevronView != null) { + mChevronView.setVisibility(selectionMode ? GONE : VISIBLE); + } + return; + } + mPinButton.setVisibility(VISIBLE); + if (mChevronView != null) { + mChevronView.setVisibility(GONE); + } + final boolean pinned = mHostInterface.isConversationPinned(mData.getConversationId()); + mPinButton.setBackground(resources.getDrawable( + pinned ? R.drawable.home_bg_pin_active : R.drawable.home_bg_pin_inactive, + getContext().getTheme())); + mPinButton.setColorFilter(resources.getColor( + pinned ? android.R.color.white : R.color.home_text_secondary, + getContext().getTheme())); + mPinButton.setContentDescription(resources.getString( + pinned ? R.string.home_unpin_content_description + : R.string.home_pin_content_description)); + mPinButton.setOnClickListener(v -> mHostInterface.onConversationPinButtonClicked( + mData.getConversationId())); + } + + private void updateListDividerInset(final boolean selectionMode) { + if (mListDividerView == null) { + return; + } + final ViewGroup.MarginLayoutParams layoutParams = + (ViewGroup.MarginLayoutParams) mListDividerView.getLayoutParams(); + final int insetDp = selectionMode ? LIST_DIVIDER_INSET_SELECTION_DP + : LIST_DIVIDER_INSET_DEFAULT_DP; + final float density = getResources().getDisplayMetrics().density; + final int insetPx = (int) (insetDp * density + 0.5f); + if (layoutParams.leftMargin != insetPx) { + layoutParams.leftMargin = insetPx; + mListDividerView.setLayoutParams(layoutParams); + } + } + // Resource Ids of content descriptions prefixes for different message status. private static final int [][][] sPrimaryContentDescriptions = { // 1:1 conversation @@ -379,15 +560,18 @@ public class ConversationListItemView extends FrameLayout implements OnClickList final int typefaceStyle = mData.getShowDraft() ? Typeface.ITALIC : Typeface.NORMAL; final String snippetText = getSnippetText(); - if (mData.getIsRead() || mData.getShowDraft()) { + final boolean selectionMode = mHostInterface.isSelectionMode(); + if (selectionMode) { + maxLines = 0; + typeface = mListItemReadTypeface; + } else if (mData.getIsRead() || mData.getShowDraft()) { maxLines = TextUtils.isEmpty(snippetText) ? 0 : NO_UNREAD_SNIPPET_LINE_COUNT; - color = mListItemReadColor; typeface = mListItemReadTypeface; } else { maxLines = TextUtils.isEmpty(snippetText) ? 0 : UNREAD_SNIPPET_LINE_COUNT; - color = mListItemUnreadColor; typeface = mListItemUnreadTypeface; } + color = getResources().getColor(R.color.home_text_secondary, getContext().getTheme()); mSnippetTextView.setMaxLines(maxLines); mSnippetTextView.setTextColor(color); @@ -395,9 +579,15 @@ public class ConversationListItemView extends FrameLayout implements OnClickList mSubjectTextView.setTextColor(color); mSubjectTextView.setTypeface(typeface, typefaceStyle); - setSnippet(); + if (selectionMode) { + mSnippetTextView.setVisibility(GONE); + mSubjectTextView.setVisibility(GONE); + } else { + mSnippetTextView.setVisibility(VISIBLE); + setSnippet(); + setSubject(); + } setConversationName(); - setSubject(); setWorkProfileIcon(); setContentDescription(buildContentDescription(resources, mData, mConversationNameView.getPaint())); @@ -420,12 +610,14 @@ public class ConversationListItemView extends FrameLayout implements OnClickList // row is left with a latest_message_id of a no longer existing message and // therefore the join values come back as null (or in this case zero). || mData.getMessageStatus() == MessageData.BUGLE_STATUS_UNKNOWN) { - mTimestampTextView.setTextColor(mListItemReadColor); + mTimestampTextView.setTextColor(resources.getColor(R.color.home_text_secondary, + getContext().getTheme())); mTimestampTextView.setTypeface(mListItemReadTypeface, typefaceStyle); mTimestampTextView.setText(resources.getString( R.string.conversation_list_item_view_draft_message)); } else { - mTimestampTextView.setTextColor(mListItemReadColor); + mTimestampTextView.setTextColor(resources.getColor(R.color.home_text_secondary, + getContext().getTheme())); mTimestampTextView.setTypeface(mListItemReadTypeface, typefaceStyle); final String formattedTimestamp = mData.getFormattedTimestamp(); if (mData.getIsSendRequested()) { @@ -438,19 +630,17 @@ public class ConversationListItemView extends FrameLayout implements OnClickList final boolean isSelected = mHostInterface.isConversationSelected(mData.getConversationId()); setSelected(isSelected); Uri iconUri = null; - int contactIconVisibility = GONE; + int contactIconVisibility = VISIBLE; int checkmarkVisiblity = GONE; int failStatusVisiblity = GONE; - if (isSelected) { - checkmarkVisiblity = VISIBLE; - } else { - contactIconVisibility = VISIBLE; + if (!isSelected) { // Only show the fail icon if it is not a group conversation. // And also require that we be the default sms app. if (mData.getIsFailedStatus() && !mData.getIsGroup() && isDefaultSmsApp) { failStatusVisiblity = VISIBLE; } } + updateSelectionIndicator(selectionMode, isSelected, resources); if (mData.getIcon() != null) { iconUri = Uri.parse(mData.getIcon()); } @@ -464,6 +654,9 @@ public class ConversationListItemView extends FrameLayout implements OnClickList mContactCheckmarkView.setVisibility(checkmarkVisiblity); mFailedStatusIconView.setVisibility(failStatusVisiblity); + updatePinButton(selectionMode, resources); + updateListDividerInset(selectionMode); + final Uri previewUri = mData.getShowDraft() ? mData.getDraftPreviewUri() : mData.getPreviewUri(); final String previewContentType = mData.getShowDraft() ? diff --git a/src/com/android/messaging/ui/conversationlist/ConversationListSwipeHelper.java b/app/src/main/java/com/android/messaging/ui/conversationlist/ConversationListSwipeHelper.java similarity index 100% rename from src/com/android/messaging/ui/conversationlist/ConversationListSwipeHelper.java rename to app/src/main/java/com/android/messaging/ui/conversationlist/ConversationListSwipeHelper.java diff --git a/src/com/android/messaging/ui/conversationlist/ForwardMessageActivity.java b/app/src/main/java/com/android/messaging/ui/conversationlist/ForwardMessageActivity.java similarity index 100% rename from src/com/android/messaging/ui/conversationlist/ForwardMessageActivity.java rename to app/src/main/java/com/android/messaging/ui/conversationlist/ForwardMessageActivity.java diff --git a/src/com/android/messaging/ui/conversationlist/MultiSelectActionModeCallback.java b/app/src/main/java/com/android/messaging/ui/conversationlist/MultiSelectActionModeCallback.java similarity index 88% rename from src/com/android/messaging/ui/conversationlist/MultiSelectActionModeCallback.java rename to app/src/main/java/com/android/messaging/ui/conversationlist/MultiSelectActionModeCallback.java index fde8c59..2939cdb 100644 --- a/src/com/android/messaging/ui/conversationlist/MultiSelectActionModeCallback.java +++ b/app/src/main/java/com/android/messaging/ui/conversationlist/MultiSelectActionModeCallback.java @@ -41,6 +41,7 @@ public class MultiSelectActionModeCallback implements Callback { void onActionBarAddContact(final SelectedConversation conversation); void onActionBarBlock(final SelectedConversation conversation); void onActionBarHome(); + void onSelectionCountChanged(int count); } static class SelectedConversation { @@ -63,6 +64,7 @@ public class MultiSelectActionModeCallback implements Callback { } private final ArrayMap mSelectedConversations; + private final boolean mUseHomeSelectionChrome; private Listener mListener; private MenuItem mArchiveMenuItem; @@ -72,13 +74,30 @@ public class MultiSelectActionModeCallback implements Callback { private boolean mHasInflated; public MultiSelectActionModeCallback(final Listener listener) { + this(listener, false); + } + + public MultiSelectActionModeCallback(final Listener listener, + final boolean useHomeSelectionChrome) { mListener = listener; + mUseHomeSelectionChrome = useHomeSelectionChrome; mSelectedConversations = new ArrayMap<>(); } + public boolean useHomeSelectionChrome() { + return mUseHomeSelectionChrome; + } + @Override public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { + if (mUseHomeSelectionChrome) { + mHasInflated = false; + if (mListener != null) { + mListener.onSelectionCountChanged(mSelectedConversations.size()); + } + return true; + } actionMode.getMenuInflater().inflate(R.menu.conversation_list_fragment_select_menu, menu); mArchiveMenuItem = menu.findItem(R.id.action_archive); mUnarchiveMenuItem = menu.findItem(R.id.action_unarchive); @@ -139,10 +158,13 @@ public class MultiSelectActionModeCallback implements Callback { mSelectedConversations.put(id, new SelectedConversation(conversationListItemData)); } - if (mSelectedConversations.isEmpty()) { + if (mSelectedConversations.isEmpty() && !mUseHomeSelectionChrome) { mListener.onActionBarHome(); } else { updateActionIconsVisiblity(); + if (mListener != null) { + mListener.onSelectionCountChanged(mSelectedConversations.size()); + } } } @@ -150,6 +172,10 @@ public class MultiSelectActionModeCallback implements Callback { return mSelectedConversations.containsKey(selectedId); } + public Collection getSelectedConversations() { + return mSelectedConversations.values(); + } + private void updateActionIconsVisiblity() { if (!mHasInflated) { return; diff --git a/src/com/android/messaging/ui/conversationlist/ShareIntentActivity.java b/app/src/main/java/com/android/messaging/ui/conversationlist/ShareIntentActivity.java similarity index 100% rename from src/com/android/messaging/ui/conversationlist/ShareIntentActivity.java rename to app/src/main/java/com/android/messaging/ui/conversationlist/ShareIntentActivity.java diff --git a/src/com/android/messaging/ui/conversationlist/ShareIntentAdapter.java b/app/src/main/java/com/android/messaging/ui/conversationlist/ShareIntentAdapter.java similarity index 100% rename from src/com/android/messaging/ui/conversationlist/ShareIntentAdapter.java rename to app/src/main/java/com/android/messaging/ui/conversationlist/ShareIntentAdapter.java diff --git a/src/com/android/messaging/ui/conversationlist/ShareIntentFragment.java b/app/src/main/java/com/android/messaging/ui/conversationlist/ShareIntentFragment.java similarity index 100% rename from src/com/android/messaging/ui/conversationlist/ShareIntentFragment.java rename to app/src/main/java/com/android/messaging/ui/conversationlist/ShareIntentFragment.java diff --git a/src/com/android/messaging/ui/conversationsettings/CopyContactDetailDialog.java b/app/src/main/java/com/android/messaging/ui/conversationsettings/CopyContactDetailDialog.java similarity index 100% rename from src/com/android/messaging/ui/conversationsettings/CopyContactDetailDialog.java rename to app/src/main/java/com/android/messaging/ui/conversationsettings/CopyContactDetailDialog.java diff --git a/src/com/android/messaging/ui/conversationsettings/PeopleAndOptionsActivity.java b/app/src/main/java/com/android/messaging/ui/conversationsettings/PeopleAndOptionsActivity.java similarity index 100% rename from src/com/android/messaging/ui/conversationsettings/PeopleAndOptionsActivity.java rename to app/src/main/java/com/android/messaging/ui/conversationsettings/PeopleAndOptionsActivity.java diff --git a/src/com/android/messaging/ui/conversationsettings/PeopleAndOptionsFragment.java b/app/src/main/java/com/android/messaging/ui/conversationsettings/PeopleAndOptionsFragment.java similarity index 100% rename from src/com/android/messaging/ui/conversationsettings/PeopleAndOptionsFragment.java rename to app/src/main/java/com/android/messaging/ui/conversationsettings/PeopleAndOptionsFragment.java diff --git a/src/com/android/messaging/ui/conversationsettings/PeopleOptionsItemView.java b/app/src/main/java/com/android/messaging/ui/conversationsettings/PeopleOptionsItemView.java similarity index 100% rename from src/com/android/messaging/ui/conversationsettings/PeopleOptionsItemView.java rename to app/src/main/java/com/android/messaging/ui/conversationsettings/PeopleOptionsItemView.java diff --git a/app/src/main/java/com/android/messaging/ui/home/HomeContactListAdapter.java b/app/src/main/java/com/android/messaging/ui/home/HomeContactListAdapter.java new file mode 100644 index 0000000..fbeb9ea --- /dev/null +++ b/app/src/main/java/com/android/messaging/ui/home/HomeContactListAdapter.java @@ -0,0 +1,34 @@ +package com.android.messaging.ui.home; + +import android.content.Context; +import android.database.Cursor; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CursorAdapter; + +import com.android.messaging.R; +import com.android.messaging.ui.contact.ContactListItemView; +import com.android.messaging.util.Assert; + +public class HomeContactListAdapter extends CursorAdapter { + private final ContactListItemView.HostInterface mHost; + + public HomeContactListAdapter(final Context context, final Cursor cursor, + final ContactListItemView.HostInterface host) { + super(context, cursor, 0); + mHost = host; + } + + @Override + public void bindView(final View view, final Context context, final Cursor cursor) { + Assert.isTrue(view instanceof ContactListItemView); + ((ContactListItemView) view).bind(cursor, mHost, false, null); + } + + @Override + public View newView(final Context context, final Cursor cursor, final ViewGroup parent) { + return LayoutInflater.from(context).inflate(R.layout.home_contacts_list_item, parent, + false); + } +} diff --git a/app/src/main/java/com/android/messaging/ui/home/HomeContactsFragment.java b/app/src/main/java/com/android/messaging/ui/home/HomeContactsFragment.java new file mode 100644 index 0000000..1181dce --- /dev/null +++ b/app/src/main/java/com/android/messaging/ui/home/HomeContactsFragment.java @@ -0,0 +1,148 @@ +package com.android.messaging.ui.home; + +import android.database.Cursor; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ListView; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.loader.app.LoaderManager; + +import com.android.messaging.R; +import com.android.messaging.datamodel.DataModel; +import com.android.messaging.datamodel.action.GetOrCreateConversationAction; +import com.android.messaging.datamodel.action.ActionMonitor; +import com.android.messaging.datamodel.action.GetOrCreateConversationAction.GetOrCreateConversationActionListener; +import com.android.messaging.datamodel.action.GetOrCreateConversationAction.GetOrCreateConversationActionMonitor; +import com.android.messaging.util.Assert; +import com.android.messaging.util.Assert.RunsOnMainThread; +import com.android.messaging.datamodel.binding.Binding; +import com.android.messaging.datamodel.binding.BindingBase; +import com.android.messaging.datamodel.data.ContactListItemData; +import com.android.messaging.datamodel.data.ContactPickerData; +import com.android.messaging.datamodel.data.ContactPickerData.ContactPickerDataListener; +import com.android.messaging.datamodel.data.ParticipantData; +import com.android.messaging.ui.UIIntents; +import com.android.messaging.ui.contact.ContactListItemView; +import com.android.messaging.util.ContactUtil; +import com.android.messaging.util.LogUtil; + +import java.util.ArrayList; + +public class HomeContactsFragment extends Fragment implements ContactPickerDataListener, + ContactListItemView.HostInterface, GetOrCreateConversationActionListener { + + private final Binding mBinding = BindingBase.createBinding(this); + private HomeContactListAdapter mAdapter; + private GetOrCreateConversationActionMonitor mMonitor; + + @Override + public void onCreate(@Nullable final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (ContactUtil.hasReadContactsPermission()) { + mBinding.bind(DataModel.get().createContactPickerData(requireContext(), this)); + mBinding.getData().init(LoaderManager.getInstance(this), mBinding); + } + } + + @Nullable + @Override + public View onCreateView(@NonNull final LayoutInflater inflater, + @Nullable final ViewGroup container, @Nullable final Bundle savedInstanceState) { + return inflater.inflate(R.layout.home_contacts_fragment, container, false); + } + + @Override + public void onViewCreated(@NonNull final View view, @Nullable final Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + final ListView listView = view.findViewById(R.id.home_contacts_list); + mAdapter = new HomeContactListAdapter(requireContext(), null, this); + listView.setAdapter(mAdapter); + + view.findViewById(R.id.home_contacts_search).setOnClickListener(v -> + Toast.makeText(requireContext(), R.string.home_popover_coming_soon, + Toast.LENGTH_SHORT).show()); + view.findViewById(R.id.home_contacts_invite).setOnClickListener(v -> + Toast.makeText(requireContext(), R.string.home_popover_coming_soon, + Toast.LENGTH_SHORT).show()); + view.findViewById(R.id.home_contacts_recent_calls).setOnClickListener(v -> + Toast.makeText(requireContext(), R.string.home_popover_coming_soon, + Toast.LENGTH_SHORT).show()); + view.findViewById(R.id.home_contacts_sort).setOnClickListener(v -> + Toast.makeText(requireContext(), R.string.home_popover_coming_soon, + Toast.LENGTH_SHORT).show()); + view.findViewById(R.id.home_contacts_add).setOnClickListener(v -> + UIIntents.get().launchCreateNewConversationActivity(requireActivity(), null)); + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (mBinding.isBound()) { + mBinding.unbind(); + } + if (mMonitor != null) { + mMonitor.unregister(); + mMonitor = null; + } + } + + @Override + public void onAllContactsCursorUpdated(final Cursor data) { + mBinding.ensureBound(); + mAdapter.changeCursor(data); + } + + @Override + public void onFrequentContactsCursorUpdated(final Cursor data) { + // All contacts list only. + } + + @Override + public void onContactCustomColorLoaded(final ContactPickerData data) { + mBinding.ensureBound(data); + mAdapter.notifyDataSetChanged(); + } + + @Override + public void onContactListItemClicked(final ContactListItemData item, + final ContactListItemView view) { + if (mMonitor != null) { + return; + } + final ArrayList participants = new ArrayList<>(1); + participants.add(ParticipantData.getFromRecipientEntry(item.getRecipientEntry())); + mMonitor = GetOrCreateConversationAction.getOrCreateConversation(participants, null, + this); + } + + @Override + public boolean isContactSelected(final ContactListItemData item) { + return false; + } + + @Override + @RunsOnMainThread + public void onGetOrCreateConversationSucceeded(final ActionMonitor monitor, + final Object data, final String conversationId) { + Assert.isTrue(monitor == mMonitor); + mMonitor = null; + if (conversationId != null) { + UIIntents.get().launchConversationActivity(requireActivity(), conversationId, null, + null, false); + } + } + + @Override + @RunsOnMainThread + public void onGetOrCreateConversationFailed(final ActionMonitor monitor, final Object data) { + Assert.isTrue(monitor == mMonitor); + LogUtil.e(LogUtil.BUGLE_TAG, "HomeContactsFragment onGetOrCreateConversationFailed"); + mMonitor = null; + } +} diff --git a/app/src/main/java/com/android/messaging/ui/home/HomePinnedStrip.java b/app/src/main/java/com/android/messaging/ui/home/HomePinnedStrip.java new file mode 100644 index 0000000..bb1285a --- /dev/null +++ b/app/src/main/java/com/android/messaging/ui/home/HomePinnedStrip.java @@ -0,0 +1,418 @@ +/* + * Copyright (C) 2025 The LineageOS 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.messaging.ui.home; + +import android.content.Context; +import android.content.res.Resources; +import android.database.Cursor; +import android.net.Uri; +import android.text.TextUtils; +import android.animation.LayoutTransition; +import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.LinearInterpolator; +import android.widget.FrameLayout; +import android.widget.ImageButton; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.android.messaging.R; +import com.android.messaging.datamodel.data.ConversationListItemData; +import com.android.messaging.ui.ContactIconView; +import com.android.messaging.util.PhoneUtils; + +import android.support.v7.mms.pdu.ContentType; + +import java.util.ArrayList; +import java.util.List; + +/** Renders the pinned-conversation grid above the message list. */ +public final class HomePinnedStrip { + + private static final float JIGGLE_DEGREES = 2.5f; + private static final float PINNED_AVATAR_SCALE = 0.76f; + private static final int COLUMN_COUNT = 3; + + public interface Listener { + void onPinnedConversationClicked(String conversationId); + + void onPinnedConversationUnpin(String conversationId); + } + + private HomePinnedStrip() { + } + + public static void bind(final View stripRoot, final Cursor cursor, + final List pinnedIds, final boolean editMode, final boolean selectionMode, + final Listener listener) { + if (stripRoot == null) { + return; + } + final LinearLayout rows = stripRoot.findViewById(R.id.home_pinned_rows); + if (rows == null) { + return; + } + if (rows.getLayoutTransition() == null) { + final LayoutTransition transition = new LayoutTransition(); + transition.setDuration(200); + transition.enableTransitionType(LayoutTransition.APPEARING); + transition.enableTransitionType(LayoutTransition.DISAPPEARING); + transition.enableTransitionType(LayoutTransition.CHANGE_APPEARING); + transition.enableTransitionType(LayoutTransition.CHANGE_DISAPPEARING); + rows.setLayoutTransition(transition); + } + rows.removeAllViews(); + if (pinnedIds == null || pinnedIds.isEmpty() || cursor == null) { + stripRoot.setVisibility(View.GONE); + return; + } + final ConversationListItemData row = new ConversationListItemData(); + boolean hasAny = false; + final Context context = stripRoot.getContext(); + final LayoutInflater inflater = LayoutInflater.from(context); + final int avatarSizePx = computePinnedAvatarSizePx(context); + LinearLayout currentRow = null; + int column = 0; + int itemIndex = 0; + final List jiggleTargets = new ArrayList<>(); + for (final String id : pinnedIds) { + if (!bindRow(cursor, id, row)) { + continue; + } + hasAny = true; + if (column == 0) { + currentRow = newRow(context, rows.getChildCount() > 0); + rows.addView(currentRow); + } + final View item = inflater.inflate(R.layout.home_pinned_item, currentRow, false); + final LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( + 0, LinearLayout.LayoutParams.WRAP_CONTENT, 1f); + lp.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL; + item.setLayoutParams(lp); + + final View pinnedCell = item.findViewById(R.id.home_pinned_cell); + final View avatarStack = item.findViewById(R.id.home_pinned_avatar_stack); + final ContactIconView icon = item.findViewById(R.id.home_pinned_icon); + final TextView label = item.findViewById(R.id.home_pinned_label); + final View previewContainer = item.findViewById(R.id.home_pinned_preview_container); + final TextView preview = item.findViewById(R.id.home_pinned_preview); + final View unreadDot = item.findViewById(R.id.home_pinned_unread_dot); + final ImageButton remove = item.findViewById(R.id.home_pinned_remove); + applyPinnedItemInsets(context, item, pinnedCell, editMode); + applyPinnedCellLayout(pinnedCell, avatarSizePx, context.getResources()); + applyPinnedAvatarSize(avatarStack, icon, avatarSizePx); + applyPinnedPreviewPosition(previewContainer, avatarSizePx, context.getResources()); + applyPinnedPreviewMaxWidth(preview, context, item); + Uri iconUri = null; + if (row.getIcon() != null) { + iconUri = Uri.parse(row.getIcon()); + } + icon.setImageResourceUri(iconUri, row.getParticipantContactId(), + row.getParticipantLookupKey(), row.getOtherParticipantNormalizedDestination()); + label.setText(labelForPinnedRow(row, editMode)); + bindUnreadPreview(context, row, editMode, selectionMode, previewContainer, preview, + unreadDot); + if (editMode) { + remove.setVisibility(View.VISIBLE); + remove.bringToFront(); + remove.setElevation(4f); + remove.setOnClickListener(v -> { + if (listener != null) { + listener.onPinnedConversationUnpin(id); + } + }); + item.setOnClickListener(null); + jiggleTargets.add(avatarStack); + } else { + stopEditJiggle(avatarStack); + remove.setVisibility(View.GONE); + item.setOnClickListener(v -> { + if (listener != null) { + listener.onPinnedConversationClicked(id); + } + }); + } + currentRow.addView(item); + itemIndex++; + column++; + if (column >= COLUMN_COUNT) { + column = 0; + } + } + padRow(currentRow, column); + if (hasAny) { + stripRoot.setVisibility(View.VISIBLE); + } else { + stripRoot.setVisibility(View.GONE); + stripRoot.setMinimumHeight(0); + } + if (editMode && !jiggleTargets.isEmpty()) { + stripRoot.post(() -> { + for (int i = 0; i < jiggleTargets.size(); i++) { + startEditJiggle(jiggleTargets.get(i), i); + } + }); + } + } + + private static CharSequence labelForPinnedRow(final ConversationListItemData row, + final boolean editMode) { + if (editMode) { + return row.getName(); + } + if (!row.getIsGroup()) { + final String destination = row.getOtherParticipantNormalizedDestination(); + if (!TextUtils.isEmpty(destination)) { + return PhoneUtils.getDefault().formatForDisplay(destination); + } + } + return row.getName(); + } + + /** Avatar keeps a square box centered in the grid cell, on the shared bottom baseline. */ + private static void applyPinnedAvatarSize(final View avatarStack, final ContactIconView icon, + final int avatarSizePx) { + if (avatarStack != null) { + final FrameLayout.LayoutParams stackLp = + new FrameLayout.LayoutParams(avatarSizePx, avatarSizePx); + stackLp.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL; + avatarStack.setLayoutParams(stackLp); + } + if (icon != null) { + icon.setLayoutParams(new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT)); + } + } + + /** Same cell height and avatar baseline for every column (preview does not shift avatar). */ + private static void applyPinnedCellLayout(final View pinnedCell, final int avatarSizePx, + final Resources res) { + if (pinnedCell == null) { + return; + } + final int previewBandPx = res.getDimensionPixelSize(R.dimen.home_pinned_preview_top_inset); + final ViewGroup.LayoutParams cellLp = pinnedCell.getLayoutParams(); + if (cellLp != null) { + cellLp.height = avatarSizePx + previewBandPx; + pinnedCell.setLayoutParams(cellLp); + } + pinnedCell.setMinimumHeight(avatarSizePx + previewBandPx); + pinnedCell.setPadding(0, 0, 0, 0); + } + + /** Preview shares the avatar center and its tail sinks into the avatar's top edge. */ + private static void applyPinnedPreviewPosition(final View previewContainer, + final int avatarSizePx, final Resources res) { + if (previewContainer == null) { + return; + } + final ViewGroup.LayoutParams raw = previewContainer.getLayoutParams(); + if (!(raw instanceof FrameLayout.LayoutParams)) { + return; + } + final FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) raw; + lp.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL; + final int overlapPx = res.getDimensionPixelSize( + R.dimen.home_pinned_preview_avatar_overlap); + lp.bottomMargin = Math.max(0, avatarSizePx - overlapPx); + lp.setMarginStart(0); + lp.setMarginEnd(0); + lp.topMargin = 0; + previewContainer.setLayoutParams(lp); + } + + private static void applyPinnedPreviewMaxWidth(final TextView preview, final Context context, + final View item) { + if (preview == null) { + return; + } + final Resources res = context.getResources(); + final float density = res.getDisplayMetrics().density; + final int maxDimen = res.getDimensionPixelSize(R.dimen.home_pinned_preview_max_width); + final int columnPx = computePinnedColumnWidthPx(context); + final int itemPad = res.getDimensionPixelSize(R.dimen.looply_space_xs); + final int inset = res.getDimensionPixelSize(R.dimen.home_pinned_preview_column_inset); + final int fromColumn = columnPx - item.getPaddingLeft() - item.getPaddingRight() - inset; + final int maxPx = Math.min(maxDimen, Math.max(0, fromColumn)); + preview.setMaxWidth(Math.max((int) (56 * density), maxPx)); + } + + public static int computePinnedColumnWidthPx(final Context context) { + final Resources res = context.getResources(); + final float density = res.getDisplayMetrics().density; + final int screenPx = res.getDisplayMetrics().widthPixels; + final int stripPadPx = (int) (24 * density); + return Math.max(0, (screenPx - stripPadPx) / COLUMN_COUNT); + } + + public static int computePinnedAvatarSizePx(final Context context) { + final float density = context.getResources().getDisplayMetrics().density; + final int columnPx = computePinnedColumnWidthPx(context); + int avatarPx = (int) (columnPx * PINNED_AVATAR_SCALE); + final int minPx = (int) (64 * density); + final int maxPx = (int) (104 * density); + return Math.max(minPx, Math.min(maxPx, avatarPx)); + } + + private static void applyPinnedItemInsets(final Context context, final View item, + final View pinnedCell, final boolean editMode) { + final Resources res = context.getResources(); + final int tight = res.getDimensionPixelSize(R.dimen.looply_space_xs); + if (editMode) { + final int jiggle = res.getDimensionPixelSize(R.dimen.home_pinned_jiggle_inset); + item.setPadding(jiggle, jiggle, jiggle, tight); + } else { + item.setPadding(tight, tight, tight, + res.getDimensionPixelSize(R.dimen.looply_space_sm)); + } + } + + private static void bindUnreadPreview(final Context context, + final ConversationListItemData row, final boolean editMode, + final boolean selectionMode, final View previewContainer, final TextView preview, + final View unreadDot) { + final boolean unread = !row.getIsRead() && !row.getShowDraft(); + if (unreadDot != null) { + unreadDot.setVisibility(unread && !editMode ? View.VISIBLE : View.INVISIBLE); + } + if (previewContainer != null) { + previewContainer.setTranslationX(0f); + } + if (editMode || selectionMode || previewContainer == null || preview == null) { + if (previewContainer != null) { + previewContainer.setVisibility(View.GONE); + } + return; + } + final String snippet = unreadPreviewText(context, row); + if (TextUtils.isEmpty(snippet)) { + previewContainer.setVisibility(View.GONE); + return; + } + preview.setText(snippet); + previewContainer.setVisibility(View.VISIBLE); + } + + private static String unreadPreviewText(final Context context, + final ConversationListItemData row) { + if (row.getIsRead() || row.getShowDraft()) { + return null; + } + String snippet = row.getSnippetText(); + final String previewContentType = row.getPreviewContentType(); + if (TextUtils.isEmpty(snippet)) { + final Resources resources = context.getResources(); + if (ContentType.isAudioType(previewContentType)) { + snippet = resources.getString(R.string.conversation_list_snippet_audio_clip); + } else if (ContentType.isImageType(previewContentType)) { + snippet = resources.getString(R.string.conversation_list_snippet_picture); + } else if (ContentType.isVideoType(previewContentType)) { + snippet = resources.getString(R.string.conversation_list_snippet_video); + } else if (ContentType.isVCardType(previewContentType)) { + snippet = resources.getString(R.string.conversation_list_snippet_vcard); + } + } + return snippet; + } + + private static LinearLayout newRow(final Context context, final boolean addTopSpacing) { + final LinearLayout row = new LinearLayout(context); + row.setOrientation(LinearLayout.HORIZONTAL); + row.setClipChildren(false); + row.setClipToPadding(false); + final LinearLayout.LayoutParams rowLp = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT); + if (addTopSpacing) { + rowLp.topMargin = context.getResources().getDimensionPixelSize( + R.dimen.home_pinned_row_spacing); + } + row.setLayoutParams(rowLp); + return row; + } + + /** Keeps three-column alignment when the last row is not full. */ + private static void padRow(final LinearLayout row, final int filledColumns) { + if (row == null || filledColumns == 0 || filledColumns >= COLUMN_COUNT) { + return; + } + for (int i = filledColumns; i < COLUMN_COUNT; i++) { + final View spacer = new View(row.getContext()); + spacer.setLayoutParams(new LinearLayout.LayoutParams( + 0, LinearLayout.LayoutParams.WRAP_CONTENT, 1f)); + row.addView(spacer); + } + } + + private static void startEditJiggle(final View avatarStack, final int itemIndex) { + if (avatarStack == null || avatarStack.getWidth() == 0) { + if (avatarStack != null) { + avatarStack.post(() -> startEditJiggle(avatarStack, itemIndex)); + } + return; + } + stopEditJiggle(avatarStack); + avatarStack.setPivotX(avatarStack.getWidth() * 0.5f); + avatarStack.setPivotY(avatarStack.getHeight() * 0.5f); + final float from = (itemIndex & 1) == 0 ? -JIGGLE_DEGREES : JIGGLE_DEGREES; + final float to = (itemIndex & 1) == 0 ? JIGGLE_DEGREES : -JIGGLE_DEGREES; + final ObjectAnimator anim = ObjectAnimator.ofFloat( + avatarStack, View.ROTATION, from, to); + anim.setDuration(150L + (itemIndex % 4) * 18L); + anim.setRepeatCount(ValueAnimator.INFINITE); + anim.setRepeatMode(ValueAnimator.REVERSE); + anim.setInterpolator(new LinearInterpolator()); + anim.setStartDelay((itemIndex % 6) * 40L); + avatarStack.setTag(R.id.tag_home_pinned_jiggle, anim); + anim.start(); + } + + private static void stopEditJiggle(final View avatarStack) { + if (avatarStack == null) { + return; + } + final Object tag = avatarStack.getTag(R.id.tag_home_pinned_jiggle); + if (tag instanceof ObjectAnimator) { + ((ObjectAnimator) tag).cancel(); + } + avatarStack.setTag(R.id.tag_home_pinned_jiggle, null); + avatarStack.setRotation(0f); + } + + private static boolean bindRow(final Cursor cursor, final String conversationId, + final ConversationListItemData out) { + final int saved = cursor.getPosition(); + for (int i = 0; i < cursor.getCount(); i++) { + if (!cursor.moveToPosition(i)) { + continue; + } + out.bind(cursor); + if (conversationId.equals(out.getConversationId())) { + return true; + } + } + if (saved >= 0 && saved < cursor.getCount()) { + cursor.moveToPosition(saved); + } + return false; + } +} diff --git a/app/src/main/java/com/android/messaging/ui/home/PinnedConversationStore.java b/app/src/main/java/com/android/messaging/ui/home/PinnedConversationStore.java new file mode 100644 index 0000000..0bc3421 --- /dev/null +++ b/app/src/main/java/com/android/messaging/ui/home/PinnedConversationStore.java @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2025 The LineageOS 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.messaging.ui.home; + +import android.content.Context; +import android.content.SharedPreferences; +import android.text.TextUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +/** Persists pinned conversation ids (order preserved, max {@link #MAX_PINS}). */ +public final class PinnedConversationStore { + + public static final int MAX_PINS = 9; + + private static final String PREFS_NAME = "home_pinned_conversations"; + private static final String KEY_ORDER = "pinned_order"; + + private PinnedConversationStore() { + } + + public static boolean isPinned(final Context context, final String conversationId) { + if (TextUtils.isEmpty(conversationId)) { + return false; + } + return getPinnedIds(context).contains(conversationId); + } + + public static List getPinnedIds(final Context context) { + final SharedPreferences prefs = prefs(context); + final Set stored = prefs.getStringSet(KEY_ORDER, null); + if (stored == null || stored.isEmpty()) { + return Collections.emptyList(); + } + final ArrayList ordered = new ArrayList<>(stored.size()); + final String serialized = prefs.getString(KEY_ORDER + "_seq", null); + if (!TextUtils.isEmpty(serialized)) { + final String[] parts = serialized.split(","); + for (final String part : parts) { + if (!TextUtils.isEmpty(part) && stored.contains(part)) { + ordered.add(part); + } + } + } + for (final String id : stored) { + if (!ordered.contains(id)) { + ordered.add(id); + } + } + return ordered; + } + + /** @return true if pinned; false if already pinned or limit reached. */ + public static boolean pin(final Context context, final String conversationId) { + if (TextUtils.isEmpty(conversationId)) { + return false; + } + final List ids = new ArrayList<>(getPinnedIds(context)); + if (ids.contains(conversationId)) { + return true; + } + if (ids.size() >= MAX_PINS) { + return false; + } + ids.add(conversationId); + save(context, ids); + return true; + } + + public static void unpin(final Context context, final String conversationId) { + if (TextUtils.isEmpty(conversationId)) { + return; + } + final List ids = new ArrayList<>(getPinnedIds(context)); + if (ids.remove(conversationId)) { + save(context, ids); + } + } + + public static void pruneMissing(final Context context, final Set validIds) { + final List ids = new ArrayList<>(getPinnedIds(context)); + boolean changed = false; + for (int i = ids.size() - 1; i >= 0; i--) { + if (!validIds.contains(ids.get(i))) { + ids.remove(i); + changed = true; + } + } + if (changed) { + save(context, ids); + } + } + + private static void save(final Context context, final List ids) { + final LinkedHashSet set = new LinkedHashSet<>(ids); + final StringBuilder seq = new StringBuilder(); + for (int i = 0; i < ids.size(); i++) { + if (i > 0) { + seq.append(','); + } + seq.append(ids.get(i)); + } + prefs(context).edit() + .putStringSet(KEY_ORDER, set) + .putString(KEY_ORDER + "_seq", seq.toString()) + .apply(); + } + + private static SharedPreferences prefs(final Context context) { + return context.getApplicationContext().getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); + } +} diff --git a/src/com/android/messaging/ui/mediapicker/AudioLevelSource.java b/app/src/main/java/com/android/messaging/ui/mediapicker/AudioLevelSource.java similarity index 100% rename from src/com/android/messaging/ui/mediapicker/AudioLevelSource.java rename to app/src/main/java/com/android/messaging/ui/mediapicker/AudioLevelSource.java diff --git a/src/com/android/messaging/ui/mediapicker/AudioMediaChooser.java b/app/src/main/java/com/android/messaging/ui/mediapicker/AudioMediaChooser.java similarity index 100% rename from src/com/android/messaging/ui/mediapicker/AudioMediaChooser.java rename to app/src/main/java/com/android/messaging/ui/mediapicker/AudioMediaChooser.java diff --git a/src/com/android/messaging/ui/mediapicker/AudioRecordView.java b/app/src/main/java/com/android/messaging/ui/mediapicker/AudioRecordView.java similarity index 100% rename from src/com/android/messaging/ui/mediapicker/AudioRecordView.java rename to app/src/main/java/com/android/messaging/ui/mediapicker/AudioRecordView.java diff --git a/src/com/android/messaging/ui/mediapicker/CameraMediaChooser.java b/app/src/main/java/com/android/messaging/ui/mediapicker/CameraMediaChooser.java similarity index 100% rename from src/com/android/messaging/ui/mediapicker/CameraMediaChooser.java rename to app/src/main/java/com/android/messaging/ui/mediapicker/CameraMediaChooser.java diff --git a/src/com/android/messaging/ui/mediapicker/ContactMediaChooser.java b/app/src/main/java/com/android/messaging/ui/mediapicker/ContactMediaChooser.java similarity index 100% rename from src/com/android/messaging/ui/mediapicker/ContactMediaChooser.java rename to app/src/main/java/com/android/messaging/ui/mediapicker/ContactMediaChooser.java diff --git a/src/com/android/messaging/ui/mediapicker/DocumentImagePicker.java b/app/src/main/java/com/android/messaging/ui/mediapicker/DocumentImagePicker.java similarity index 100% rename from src/com/android/messaging/ui/mediapicker/DocumentImagePicker.java rename to app/src/main/java/com/android/messaging/ui/mediapicker/DocumentImagePicker.java diff --git a/src/com/android/messaging/ui/mediapicker/GalleryMediaChooser.java b/app/src/main/java/com/android/messaging/ui/mediapicker/GalleryMediaChooser.java similarity index 100% rename from src/com/android/messaging/ui/mediapicker/GalleryMediaChooser.java rename to app/src/main/java/com/android/messaging/ui/mediapicker/GalleryMediaChooser.java diff --git a/src/com/android/messaging/ui/mediapicker/LevelTrackingMediaRecorder.java b/app/src/main/java/com/android/messaging/ui/mediapicker/LevelTrackingMediaRecorder.java similarity index 100% rename from src/com/android/messaging/ui/mediapicker/LevelTrackingMediaRecorder.java rename to app/src/main/java/com/android/messaging/ui/mediapicker/LevelTrackingMediaRecorder.java diff --git a/src/com/android/messaging/ui/mediapicker/MediaChooser.java b/app/src/main/java/com/android/messaging/ui/mediapicker/MediaChooser.java similarity index 100% rename from src/com/android/messaging/ui/mediapicker/MediaChooser.java rename to app/src/main/java/com/android/messaging/ui/mediapicker/MediaChooser.java diff --git a/src/com/android/messaging/ui/mediapicker/MediaPicker.java b/app/src/main/java/com/android/messaging/ui/mediapicker/MediaPicker.java similarity index 100% rename from src/com/android/messaging/ui/mediapicker/MediaPicker.java rename to app/src/main/java/com/android/messaging/ui/mediapicker/MediaPicker.java diff --git a/src/com/android/messaging/ui/mediapicker/MediaPickerGridView.java b/app/src/main/java/com/android/messaging/ui/mediapicker/MediaPickerGridView.java similarity index 100% rename from src/com/android/messaging/ui/mediapicker/MediaPickerGridView.java rename to app/src/main/java/com/android/messaging/ui/mediapicker/MediaPickerGridView.java diff --git a/src/com/android/messaging/ui/mediapicker/MediaPickerPanel.java b/app/src/main/java/com/android/messaging/ui/mediapicker/MediaPickerPanel.java similarity index 100% rename from src/com/android/messaging/ui/mediapicker/MediaPickerPanel.java rename to app/src/main/java/com/android/messaging/ui/mediapicker/MediaPickerPanel.java diff --git a/src/com/android/messaging/ui/mediapicker/PausableChronometer.java b/app/src/main/java/com/android/messaging/ui/mediapicker/PausableChronometer.java similarity index 100% rename from src/com/android/messaging/ui/mediapicker/PausableChronometer.java rename to app/src/main/java/com/android/messaging/ui/mediapicker/PausableChronometer.java diff --git a/src/com/android/messaging/ui/mediapicker/SoundLevels.java b/app/src/main/java/com/android/messaging/ui/mediapicker/SoundLevels.java similarity index 100% rename from src/com/android/messaging/ui/mediapicker/SoundLevels.java rename to app/src/main/java/com/android/messaging/ui/mediapicker/SoundLevels.java diff --git a/src/com/android/messaging/ui/photoviewer/BuglePhotoBitmapLoader.java b/app/src/main/java/com/android/messaging/ui/photoviewer/BuglePhotoBitmapLoader.java similarity index 100% rename from src/com/android/messaging/ui/photoviewer/BuglePhotoBitmapLoader.java rename to app/src/main/java/com/android/messaging/ui/photoviewer/BuglePhotoBitmapLoader.java diff --git a/src/com/android/messaging/ui/photoviewer/BuglePhotoPageAdapter.java b/app/src/main/java/com/android/messaging/ui/photoviewer/BuglePhotoPageAdapter.java similarity index 100% rename from src/com/android/messaging/ui/photoviewer/BuglePhotoPageAdapter.java rename to app/src/main/java/com/android/messaging/ui/photoviewer/BuglePhotoPageAdapter.java diff --git a/src/com/android/messaging/ui/photoviewer/BuglePhotoViewActivity.java b/app/src/main/java/com/android/messaging/ui/photoviewer/BuglePhotoViewActivity.java similarity index 100% rename from src/com/android/messaging/ui/photoviewer/BuglePhotoViewActivity.java rename to app/src/main/java/com/android/messaging/ui/photoviewer/BuglePhotoViewActivity.java diff --git a/src/com/android/messaging/ui/photoviewer/BuglePhotoViewController.java b/app/src/main/java/com/android/messaging/ui/photoviewer/BuglePhotoViewController.java similarity index 100% rename from src/com/android/messaging/ui/photoviewer/BuglePhotoViewController.java rename to app/src/main/java/com/android/messaging/ui/photoviewer/BuglePhotoViewController.java diff --git a/src/com/android/messaging/ui/photoviewer/BuglePhotoViewFragment.java b/app/src/main/java/com/android/messaging/ui/photoviewer/BuglePhotoViewFragment.java similarity index 100% rename from src/com/android/messaging/ui/photoviewer/BuglePhotoViewFragment.java rename to app/src/main/java/com/android/messaging/ui/photoviewer/BuglePhotoViewFragment.java diff --git a/src/com/android/messaging/util/AccessibilityUtil.java b/app/src/main/java/com/android/messaging/util/AccessibilityUtil.java similarity index 100% rename from src/com/android/messaging/util/AccessibilityUtil.java rename to app/src/main/java/com/android/messaging/util/AccessibilityUtil.java diff --git a/src/com/android/messaging/util/Assert.java b/app/src/main/java/com/android/messaging/util/Assert.java similarity index 100% rename from src/com/android/messaging/util/Assert.java rename to app/src/main/java/com/android/messaging/util/Assert.java diff --git a/src/com/android/messaging/util/AvatarUriUtil.java b/app/src/main/java/com/android/messaging/util/AvatarUriUtil.java similarity index 100% rename from src/com/android/messaging/util/AvatarUriUtil.java rename to app/src/main/java/com/android/messaging/util/AvatarUriUtil.java diff --git a/src/com/android/messaging/util/BugleActivityUtil.java b/app/src/main/java/com/android/messaging/util/BugleActivityUtil.java similarity index 100% rename from src/com/android/messaging/util/BugleActivityUtil.java rename to app/src/main/java/com/android/messaging/util/BugleActivityUtil.java diff --git a/src/com/android/messaging/util/BugleApplicationPrefs.java b/app/src/main/java/com/android/messaging/util/BugleApplicationPrefs.java similarity index 100% rename from src/com/android/messaging/util/BugleApplicationPrefs.java rename to app/src/main/java/com/android/messaging/util/BugleApplicationPrefs.java diff --git a/src/com/android/messaging/util/BugleGservicesKeys.java b/app/src/main/java/com/android/messaging/util/BugleGservicesKeys.java similarity index 100% rename from src/com/android/messaging/util/BugleGservicesKeys.java rename to app/src/main/java/com/android/messaging/util/BugleGservicesKeys.java diff --git a/src/com/android/messaging/util/BuglePrefs.java b/app/src/main/java/com/android/messaging/util/BuglePrefs.java similarity index 100% rename from src/com/android/messaging/util/BuglePrefs.java rename to app/src/main/java/com/android/messaging/util/BuglePrefs.java diff --git a/src/com/android/messaging/util/BuglePrefsImpl.java b/app/src/main/java/com/android/messaging/util/BuglePrefsImpl.java similarity index 100% rename from src/com/android/messaging/util/BuglePrefsImpl.java rename to app/src/main/java/com/android/messaging/util/BuglePrefsImpl.java diff --git a/src/com/android/messaging/util/BuglePrefsKeys.java b/app/src/main/java/com/android/messaging/util/BuglePrefsKeys.java similarity index 100% rename from src/com/android/messaging/util/BuglePrefsKeys.java rename to app/src/main/java/com/android/messaging/util/BuglePrefsKeys.java diff --git a/src/com/android/messaging/util/BugleSubscriptionPrefs.java b/app/src/main/java/com/android/messaging/util/BugleSubscriptionPrefs.java similarity index 100% rename from src/com/android/messaging/util/BugleSubscriptionPrefs.java rename to app/src/main/java/com/android/messaging/util/BugleSubscriptionPrefs.java diff --git a/src/com/android/messaging/util/BugleWidgetPrefs.java b/app/src/main/java/com/android/messaging/util/BugleWidgetPrefs.java similarity index 100% rename from src/com/android/messaging/util/BugleWidgetPrefs.java rename to app/src/main/java/com/android/messaging/util/BugleWidgetPrefs.java diff --git a/src/com/android/messaging/util/ChangeDefaultSmsAppHelper.java b/app/src/main/java/com/android/messaging/util/ChangeDefaultSmsAppHelper.java similarity index 100% rename from src/com/android/messaging/util/ChangeDefaultSmsAppHelper.java rename to app/src/main/java/com/android/messaging/util/ChangeDefaultSmsAppHelper.java diff --git a/src/com/android/messaging/util/ConnectivityUtil.java b/app/src/main/java/com/android/messaging/util/ConnectivityUtil.java similarity index 100% rename from src/com/android/messaging/util/ConnectivityUtil.java rename to app/src/main/java/com/android/messaging/util/ConnectivityUtil.java diff --git a/src/com/android/messaging/util/ContactRecipientEntryUtils.java b/app/src/main/java/com/android/messaging/util/ContactRecipientEntryUtils.java similarity index 100% rename from src/com/android/messaging/util/ContactRecipientEntryUtils.java rename to app/src/main/java/com/android/messaging/util/ContactRecipientEntryUtils.java diff --git a/src/com/android/messaging/util/ContactUtil.java b/app/src/main/java/com/android/messaging/util/ContactUtil.java similarity index 100% rename from src/com/android/messaging/util/ContactUtil.java rename to app/src/main/java/com/android/messaging/util/ContactUtil.java diff --git a/src/com/android/messaging/util/ConversationIdSet.java b/app/src/main/java/com/android/messaging/util/ConversationIdSet.java similarity index 100% rename from src/com/android/messaging/util/ConversationIdSet.java rename to app/src/main/java/com/android/messaging/util/ConversationIdSet.java diff --git a/src/com/android/messaging/util/CubicBezierInterpolator.java b/app/src/main/java/com/android/messaging/util/CubicBezierInterpolator.java similarity index 100% rename from src/com/android/messaging/util/CubicBezierInterpolator.java rename to app/src/main/java/com/android/messaging/util/CubicBezierInterpolator.java diff --git a/src/com/android/messaging/util/Dates.java b/app/src/main/java/com/android/messaging/util/Dates.java similarity index 100% rename from src/com/android/messaging/util/Dates.java rename to app/src/main/java/com/android/messaging/util/Dates.java diff --git a/src/com/android/messaging/util/DebugUtils.java b/app/src/main/java/com/android/messaging/util/DebugUtils.java similarity index 100% rename from src/com/android/messaging/util/DebugUtils.java rename to app/src/main/java/com/android/messaging/util/DebugUtils.java diff --git a/src/com/android/messaging/util/EmailAddress.java b/app/src/main/java/com/android/messaging/util/EmailAddress.java similarity index 100% rename from src/com/android/messaging/util/EmailAddress.java rename to app/src/main/java/com/android/messaging/util/EmailAddress.java diff --git a/src/com/android/messaging/util/FallbackStrategies.java b/app/src/main/java/com/android/messaging/util/FallbackStrategies.java similarity index 100% rename from src/com/android/messaging/util/FallbackStrategies.java rename to app/src/main/java/com/android/messaging/util/FallbackStrategies.java diff --git a/src/com/android/messaging/util/FileUtil.java b/app/src/main/java/com/android/messaging/util/FileUtil.java similarity index 100% rename from src/com/android/messaging/util/FileUtil.java rename to app/src/main/java/com/android/messaging/util/FileUtil.java diff --git a/src/com/android/messaging/util/GifTranscoder.java b/app/src/main/java/com/android/messaging/util/GifTranscoder.java similarity index 88% rename from src/com/android/messaging/util/GifTranscoder.java rename to app/src/main/java/com/android/messaging/util/GifTranscoder.java index 168da5f..9fca6fd 100644 --- a/src/com/android/messaging/util/GifTranscoder.java +++ b/app/src/main/java/com/android/messaging/util/GifTranscoder.java @@ -38,11 +38,22 @@ public class GifTranscoder { private static final int MIN_HEIGHT = 100; private static final int MIN_WIDTH = 100; + private static final boolean sNativeLoaded; static { - System.loadLibrary("giftranscode"); + boolean loaded = false; + try { + System.loadLibrary("giftranscode"); + loaded = true; + } catch (UnsatisfiedLinkError e) { + // Native lib optional in standalone Gradle builds. + } + sNativeLoaded = loaded; } public static boolean transcode(Context context, String filePath, String outFilePath) { + if (!sNativeLoaded) { + return false; + } final long inputSize = new File(filePath).length(); Stopwatch stopwatch = Stopwatch.createStarted(); final boolean success = transcodeInternal(filePath, outFilePath); diff --git a/src/com/android/messaging/util/ImageUtils.java b/app/src/main/java/com/android/messaging/util/ImageUtils.java similarity index 100% rename from src/com/android/messaging/util/ImageUtils.java rename to app/src/main/java/com/android/messaging/util/ImageUtils.java diff --git a/src/com/android/messaging/util/ImeUtil.java b/app/src/main/java/com/android/messaging/util/ImeUtil.java similarity index 100% rename from src/com/android/messaging/util/ImeUtil.java rename to app/src/main/java/com/android/messaging/util/ImeUtil.java diff --git a/src/com/android/messaging/util/LinkifyHelper.java b/app/src/main/java/com/android/messaging/util/LinkifyHelper.java similarity index 100% rename from src/com/android/messaging/util/LinkifyHelper.java rename to app/src/main/java/com/android/messaging/util/LinkifyHelper.java diff --git a/src/com/android/messaging/util/LogUtil.java b/app/src/main/java/com/android/messaging/util/LogUtil.java similarity index 100% rename from src/com/android/messaging/util/LogUtil.java rename to app/src/main/java/com/android/messaging/util/LogUtil.java diff --git a/src/com/android/messaging/util/LoggingTimer.java b/app/src/main/java/com/android/messaging/util/LoggingTimer.java similarity index 100% rename from src/com/android/messaging/util/LoggingTimer.java rename to app/src/main/java/com/android/messaging/util/LoggingTimer.java diff --git a/src/com/android/messaging/util/MediaMetadataRetrieverWrapper.java b/app/src/main/java/com/android/messaging/util/MediaMetadataRetrieverWrapper.java similarity index 100% rename from src/com/android/messaging/util/MediaMetadataRetrieverWrapper.java rename to app/src/main/java/com/android/messaging/util/MediaMetadataRetrieverWrapper.java diff --git a/src/com/android/messaging/util/MediaUtil.java b/app/src/main/java/com/android/messaging/util/MediaUtil.java similarity index 100% rename from src/com/android/messaging/util/MediaUtil.java rename to app/src/main/java/com/android/messaging/util/MediaUtil.java diff --git a/src/com/android/messaging/util/MediaUtilImpl.java b/app/src/main/java/com/android/messaging/util/MediaUtilImpl.java similarity index 100% rename from src/com/android/messaging/util/MediaUtilImpl.java rename to app/src/main/java/com/android/messaging/util/MediaUtilImpl.java diff --git a/src/com/android/messaging/util/NotificationPlayer.java b/app/src/main/java/com/android/messaging/util/NotificationPlayer.java similarity index 100% rename from src/com/android/messaging/util/NotificationPlayer.java rename to app/src/main/java/com/android/messaging/util/NotificationPlayer.java diff --git a/src/com/android/messaging/util/NotificationsUtil.java b/app/src/main/java/com/android/messaging/util/NotificationsUtil.java similarity index 100% rename from src/com/android/messaging/util/NotificationsUtil.java rename to app/src/main/java/com/android/messaging/util/NotificationsUtil.java diff --git a/src/com/android/messaging/util/OsUtil.java b/app/src/main/java/com/android/messaging/util/OsUtil.java similarity index 100% rename from src/com/android/messaging/util/OsUtil.java rename to app/src/main/java/com/android/messaging/util/OsUtil.java diff --git a/src/com/android/messaging/util/PendingIntentConstants.java b/app/src/main/java/com/android/messaging/util/PendingIntentConstants.java similarity index 100% rename from src/com/android/messaging/util/PendingIntentConstants.java rename to app/src/main/java/com/android/messaging/util/PendingIntentConstants.java diff --git a/src/com/android/messaging/util/PhoneUtils.java b/app/src/main/java/com/android/messaging/util/PhoneUtils.java similarity index 100% rename from src/com/android/messaging/util/PhoneUtils.java rename to app/src/main/java/com/android/messaging/util/PhoneUtils.java diff --git a/src/com/android/messaging/util/TextUtil.java b/app/src/main/java/com/android/messaging/util/TextUtil.java similarity index 100% rename from src/com/android/messaging/util/TextUtil.java rename to app/src/main/java/com/android/messaging/util/TextUtil.java diff --git a/src/com/android/messaging/util/ThreadUtil.java b/app/src/main/java/com/android/messaging/util/ThreadUtil.java similarity index 100% rename from src/com/android/messaging/util/ThreadUtil.java rename to app/src/main/java/com/android/messaging/util/ThreadUtil.java diff --git a/src/com/android/messaging/util/Trace.java b/app/src/main/java/com/android/messaging/util/Trace.java similarity index 100% rename from src/com/android/messaging/util/Trace.java rename to app/src/main/java/com/android/messaging/util/Trace.java diff --git a/src/com/android/messaging/util/Typefaces.java b/app/src/main/java/com/android/messaging/util/Typefaces.java similarity index 100% rename from src/com/android/messaging/util/Typefaces.java rename to app/src/main/java/com/android/messaging/util/Typefaces.java diff --git a/src/com/android/messaging/util/UiUtils.java b/app/src/main/java/com/android/messaging/util/UiUtils.java similarity index 100% rename from src/com/android/messaging/util/UiUtils.java rename to app/src/main/java/com/android/messaging/util/UiUtils.java diff --git a/src/com/android/messaging/util/UriUtil.java b/app/src/main/java/com/android/messaging/util/UriUtil.java similarity index 100% rename from src/com/android/messaging/util/UriUtil.java rename to app/src/main/java/com/android/messaging/util/UriUtil.java diff --git a/src/com/android/messaging/util/VersionUtil.java b/app/src/main/java/com/android/messaging/util/VersionUtil.java similarity index 100% rename from src/com/android/messaging/util/VersionUtil.java rename to app/src/main/java/com/android/messaging/util/VersionUtil.java diff --git a/src/com/android/messaging/util/YouTubeUtil.java b/app/src/main/java/com/android/messaging/util/YouTubeUtil.java similarity index 100% rename from src/com/android/messaging/util/YouTubeUtil.java rename to app/src/main/java/com/android/messaging/util/YouTubeUtil.java diff --git a/src/com/android/messaging/util/exif/ExifInterface.java b/app/src/main/java/com/android/messaging/util/exif/ExifInterface.java similarity index 100% rename from src/com/android/messaging/util/exif/ExifInterface.java rename to app/src/main/java/com/android/messaging/util/exif/ExifInterface.java diff --git a/src/com/android/messaging/widget/BaseWidgetFactory.java b/app/src/main/java/com/android/messaging/widget/BaseWidgetFactory.java similarity index 100% rename from src/com/android/messaging/widget/BaseWidgetFactory.java rename to app/src/main/java/com/android/messaging/widget/BaseWidgetFactory.java diff --git a/src/com/android/messaging/widget/BaseWidgetProvider.java b/app/src/main/java/com/android/messaging/widget/BaseWidgetProvider.java similarity index 100% rename from src/com/android/messaging/widget/BaseWidgetProvider.java rename to app/src/main/java/com/android/messaging/widget/BaseWidgetProvider.java diff --git a/src/com/android/messaging/widget/BugleWidgetProvider.java b/app/src/main/java/com/android/messaging/widget/BugleWidgetProvider.java similarity index 100% rename from src/com/android/messaging/widget/BugleWidgetProvider.java rename to app/src/main/java/com/android/messaging/widget/BugleWidgetProvider.java diff --git a/src/com/android/messaging/widget/WidgetConversationListService.java b/app/src/main/java/com/android/messaging/widget/WidgetConversationListService.java similarity index 100% rename from src/com/android/messaging/widget/WidgetConversationListService.java rename to app/src/main/java/com/android/messaging/widget/WidgetConversationListService.java diff --git a/src/com/android/messaging/widget/WidgetConversationProvider.java b/app/src/main/java/com/android/messaging/widget/WidgetConversationProvider.java similarity index 100% rename from src/com/android/messaging/widget/WidgetConversationProvider.java rename to app/src/main/java/com/android/messaging/widget/WidgetConversationProvider.java diff --git a/src/com/android/messaging/widget/WidgetConversationService.java b/app/src/main/java/com/android/messaging/widget/WidgetConversationService.java similarity index 100% rename from src/com/android/messaging/widget/WidgetConversationService.java rename to app/src/main/java/com/android/messaging/widget/WidgetConversationService.java diff --git a/src/org/lineageos/messaging/util/PrefsUtils.java b/app/src/main/java/org/lineageos/messaging/util/PrefsUtils.java similarity index 100% rename from src/org/lineageos/messaging/util/PrefsUtils.java rename to app/src/main/java/org/lineageos/messaging/util/PrefsUtils.java diff --git a/app/src/main/jni/Android.bp b/app/src/main/jni/Android.bp new file mode 100644 index 0000000..22840ea --- /dev/null +++ b/app/src/main/jni/Android.bp @@ -0,0 +1,40 @@ +// Copyright (C) 2015 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 { + // See: http://go/android-license-faq + default_applicable_licenses: ["Android-Apache-2.0"], +} + +cc_library_shared { + name: "libgiftranscode", + static_libs: ["libgif"], + // Link to Android logging (liblog.so) and dynamic linker (libdl.so) libraries + shared_libs: [ + "liblog", + "libdl", + ], + // for including the jni.h file + header_libs: ["jni_headers"], + include_dirs: ["external/giflib"], + srcs: ["GifTranscoder.cpp"], + cflags: [ + "-Wno-unused-parameter", + "-Wno-switch", + ], + sdk_version: "19", + // LLVM libc++ + stl: "c++_static", + product_specific: true, +} diff --git a/app/src/main/jni/GifTranscoder.cpp b/app/src/main/jni/GifTranscoder.cpp new file mode 100644 index 0000000..324d315 --- /dev/null +++ b/app/src/main/jni/GifTranscoder.cpp @@ -0,0 +1,583 @@ +/* + * Copyright (C) 2015 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. + */ + +#include +#include +#include +#include +#include + +#include + +#include "GifTranscoder.h" + +#define SQUARE(a) ((a)*(a)) + +// GIF does not support partial transparency, so our alpha channels are always 0x0 or 0xff. +static const ColorARGB TRANSPARENT = 0x0; + +#define ALPHA(color) (((color) >> 24) & 0xff) +#define RED(color) (((color) >> 16) & 0xff) +#define GREEN(color) (((color) >> 8) & 0xff) +#define BLUE(color) (((color) >> 0) & 0xff) + +#define MAKE_COLOR_ARGB(a, r, g, b) \ + ((a) << 24 | (r) << 16 | (g) << 8 | (b)) + +#define MAX_COLOR_DISTANCE (255 * 255 * 255) + +#define TAG "GifTranscoder.cpp" +#define LOGD_ENABLED 0 +#if LOGD_ENABLED +#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)) +#else +#define LOGD(...) ((void)0) +#endif +#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)) +#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)) +#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)) + +// This macro expects the assertion to pass, but logs a FATAL if not. +#define ASSERT(cond, ...) \ + ( (__builtin_expect((cond) == 0, 0)) \ + ? ((void)__android_log_assert(#cond, TAG, ## __VA_ARGS__)) \ + : (void) 0 ) +#define ASSERT_ENABLED 1 + +namespace { + +// Current time in milliseconds since Unix epoch. +double now(void) { + struct timespec res; + clock_gettime(CLOCK_REALTIME, &res); + return 1000.0 * res.tv_sec + (double) res.tv_nsec / 1e6; +} + +// Gets the pixel at position (x,y) from a buffer that uses row-major order to store an image with +// the specified width. +template +T* getPixel(T* buffer, int width, int x, int y) { + return buffer + (y * width + x); +} + +} // namespace + +int GifTranscoder::transcode(const char* pathIn, const char* pathOut) { + int error; + double t0; + GifFileType* gifIn; + GifFileType* gifOut; + + // Automatically closes the GIF files when this method returns + GifFilesCloser closer; + + gifIn = DGifOpenFileName(pathIn, &error); + if (gifIn) { + closer.setGifIn(gifIn); + LOGD("Opened input GIF: %s", pathIn); + } else { + LOGE("Could not open input GIF: %s, error = %d", pathIn, error); + return GIF_ERROR; + } + + gifOut = EGifOpenFileName(pathOut, false, &error); + if (gifOut) { + closer.setGifOut(gifOut); + LOGD("Opened output GIF: %s", pathOut); + } else { + LOGE("Could not open output GIF: %s, error = %d", pathOut, error); + return GIF_ERROR; + } + + t0 = now(); + if (resizeBoxFilter(gifIn, gifOut)) { + LOGD("Resized GIF in %.2f ms", now() - t0); + } else { + LOGE("Could not resize GIF"); + return GIF_ERROR; + } + + return GIF_OK; +} + +bool GifTranscoder::resizeBoxFilter(GifFileType* gifIn, GifFileType* gifOut) { + ASSERT(gifIn != NULL, "gifIn cannot be NULL"); + ASSERT(gifOut != NULL, "gifOut cannot be NULL"); + + if (gifIn->SWidth < 0 || gifIn->SHeight < 0) { + LOGE("Input GIF has invalid size: %d x %d", gifIn->SWidth, gifIn->SHeight); + return false; + } + + // Output GIF will be 50% the size of the original. + if (EGifPutScreenDesc(gifOut, + gifIn->SWidth / 2, + gifIn->SHeight / 2, + gifIn->SColorResolution, + gifIn->SBackGroundColor, + gifIn->SColorMap) == GIF_ERROR) { + LOGE("Could not write screen descriptor"); + return false; + } + LOGD("Wrote screen descriptor"); + + // Index of the current image. + int imageIndex = 0; + + // Transparent color of the current image. + int transparentColor = NO_TRANSPARENT_COLOR; + + // Buffer for reading raw images from the input GIF. + std::vector srcBuffer(gifIn->SWidth * gifIn->SHeight); + + // Buffer for rendering images from the input GIF. + std::unique_ptr renderBuffer(new ColorARGB[gifIn->SWidth * gifIn->SHeight]); + + // Buffer for writing new images to output GIF (one row at a time). + std::unique_ptr dstRowBuffer(new GifByteType[gifOut->SWidth]); + + // Many GIFs use DISPOSE_DO_NOT to make images draw on top of previous images. They can also + // use DISPOSE_BACKGROUND to clear the last image region before drawing the next one. We need + // to keep track of the disposal mode as we go along to properly render the GIF. + int disposalMode = DISPOSAL_UNSPECIFIED; + int prevImageDisposalMode = DISPOSAL_UNSPECIFIED; + GifImageDesc prevImageDimens; + + // Background color (applies to entire GIF). + ColorARGB bgColor = TRANSPARENT; + + GifRecordType recordType; + do { + if (DGifGetRecordType(gifIn, &recordType) == GIF_ERROR) { + LOGE("Could not get record type"); + return false; + } + LOGD("Read record type: %d", recordType); + switch (recordType) { + case IMAGE_DESC_RECORD_TYPE: { + if (DGifGetImageDesc(gifIn) == GIF_ERROR) { + LOGE("Could not read image descriptor (%d)", imageIndex); + return false; + } + + // Check the current image position. + if (gifIn->Image.Left < 0 || + gifIn->Image.Top < 0 || + gifIn->Image.Left + gifIn->Image.Width > gifIn->SWidth || + gifIn->Image.Top + gifIn->Image.Height > gifIn->SHeight) { + LOGE("GIF image extends beyond logical screen"); + return false; + } + + // Write the new image descriptor. + if (EGifPutImageDesc(gifOut, + 0, // Left + 0, // Top + gifOut->SWidth, + gifOut->SHeight, + false, // Interlace + gifIn->Image.ColorMap) == GIF_ERROR) { + LOGE("Could not write image descriptor (%d)", imageIndex); + return false; + } + + // Read the image from the input GIF. The buffer is already initialized to the + // size of the GIF, which is usually equal to the size of all the images inside it. + // If not, the call to resize below ensures that the buffer is the right size. + srcBuffer.resize(gifIn->Image.Width * gifIn->Image.Height); + if (readImage(gifIn, srcBuffer.data()) == false) { + LOGE("Could not read image data (%d)", imageIndex); + return false; + } + LOGD("Read image data (%d)", imageIndex); + // Render the image from the input GIF. + if (renderImage(gifIn, + srcBuffer.data(), + imageIndex, + transparentColor, + renderBuffer.get(), + bgColor, + prevImageDimens, + prevImageDisposalMode) == false) { + LOGE("Could not render %d", imageIndex); + return false; + } + LOGD("Rendered image (%d)", imageIndex); + + // Generate the image in the output GIF. + for (int y = 0; y < gifOut->SHeight; y++) { + for (int x = 0; x < gifOut->SWidth; x++) { + const GifByteType dstColorIndex = computeNewColorIndex( + gifIn, transparentColor, renderBuffer.get(), x, y); + *(dstRowBuffer.get() + x) = dstColorIndex; + } + if (EGifPutLine(gifOut, dstRowBuffer.get(), gifOut->SWidth) == GIF_ERROR) { + LOGE("Could not write raster data (%d)", imageIndex); + return false; + } + } + LOGD("Wrote raster data (%d)", imageIndex); + + // Save the disposal mode for rendering the next image. + // We only support DISPOSE_DO_NOT and DISPOSE_BACKGROUND. + prevImageDisposalMode = disposalMode; + if (prevImageDisposalMode == DISPOSAL_UNSPECIFIED) { + prevImageDisposalMode = DISPOSE_DO_NOT; + } else if (prevImageDisposalMode == DISPOSE_PREVIOUS) { + prevImageDisposalMode = DISPOSE_BACKGROUND; + } + if (prevImageDisposalMode == DISPOSE_BACKGROUND) { + prevImageDimens.Left = gifIn->Image.Left; + prevImageDimens.Top = gifIn->Image.Top; + prevImageDimens.Width = gifIn->Image.Width; + prevImageDimens.Height = gifIn->Image.Height; + } + + if (gifOut->Image.ColorMap) { + GifFreeMapObject(gifOut->Image.ColorMap); + gifOut->Image.ColorMap = NULL; + } + + imageIndex++; + } break; + case EXTENSION_RECORD_TYPE: { + int extCode; + GifByteType* ext; + if (DGifGetExtension(gifIn, &extCode, &ext) == GIF_ERROR) { + LOGE("Could not read extension block"); + return false; + } + LOGD("Read extension block, code: %d", extCode); + if (extCode == GRAPHICS_EXT_FUNC_CODE) { + GraphicsControlBlock gcb; + if (DGifExtensionToGCB(ext[0], ext + 1, &gcb) == GIF_ERROR) { + LOGE("Could not interpret GCB extension"); + return false; + } + transparentColor = gcb.TransparentColor; + + // This logic for setting the background color based on the first GCB + // doesn't quite match the GIF spec, but empirically it seems to work and it + // matches what libframesequence (Rastermill) does. + if (imageIndex == 0 && gifIn->SColorMap) { + if (gcb.TransparentColor == NO_TRANSPARENT_COLOR) { + if (gifIn->SBackGroundColor < 0 || + gifIn->SBackGroundColor >= gifIn->SColorMap->ColorCount) { + LOGE("SBackGroundColor overflow"); + return false; + } + GifColorType bgColorIndex = + gifIn->SColorMap->Colors[gifIn->SBackGroundColor]; + bgColor = gifColorToColorARGB(bgColorIndex); + LOGD("Set background color based on first GCB"); + } + } + + // Record the original disposal mode and then update it. + disposalMode = gcb.DisposalMode; + gcb.DisposalMode = DISPOSE_BACKGROUND; + EGifGCBToExtension(&gcb, ext + 1); + } + if (EGifPutExtensionLeader(gifOut, extCode) == GIF_ERROR) { + LOGE("Could not write extension leader"); + return false; + } + if (EGifPutExtensionBlock(gifOut, ext[0], ext + 1) == GIF_ERROR) { + LOGE("Could not write extension block"); + return false; + } + LOGD("Wrote extension block"); + while (ext != NULL) { + if (DGifGetExtensionNext(gifIn, &ext) == GIF_ERROR) { + LOGE("Could not read extension continuation"); + return false; + } + if (ext != NULL) { + LOGD("Read extension continuation"); + if (EGifPutExtensionBlock(gifOut, ext[0], ext + 1) == GIF_ERROR) { + LOGE("Could not write extension continuation"); + return false; + } + LOGD("Wrote extension continuation"); + } + } + if (EGifPutExtensionTrailer(gifOut) == GIF_ERROR) { + LOGE("Could not write extension trailer"); + return false; + } + } break; + } + + } while (recordType != TERMINATE_RECORD_TYPE); + LOGD("No more records"); + + return true; +} + +bool GifTranscoder::readImage(GifFileType* gifIn, GifByteType* rasterBits) { + if (gifIn->Image.Interlace) { + int interlacedOffset[] = { 0, 4, 2, 1 }; + int interlacedJumps[] = { 8, 8, 4, 2 }; + + // Need to perform 4 passes on the image + for (int i = 0; i < 4; i++) { + for (int j = interlacedOffset[i]; j < gifIn->Image.Height; j += interlacedJumps[i]) { + if (DGifGetLine(gifIn, + rasterBits + j * gifIn->Image.Width, + gifIn->Image.Width) == GIF_ERROR) { + LOGE("Could not read interlaced raster data"); + return false; + } + } + } + } else { + if (DGifGetLine(gifIn, rasterBits, gifIn->Image.Width * gifIn->Image.Height) == GIF_ERROR) { + LOGE("Could not read raster data"); + return false; + } + } + return true; +} + +bool GifTranscoder::renderImage(GifFileType* gifIn, + GifByteType* rasterBits, + int imageIndex, + int transparentColorIndex, + ColorARGB* renderBuffer, + ColorARGB bgColor, + GifImageDesc prevImageDimens, + int prevImageDisposalMode) { + ASSERT(imageIndex < gifIn->ImageCount, + "Image index %d is out of bounds (count=%d)", imageIndex, gifIn->ImageCount); + + ColorMapObject* colorMap = getColorMap(gifIn); + if (colorMap == NULL) { + LOGE("No GIF color map found"); + return false; + } + + // Clear all or part of the background, before drawing the first image and maybe before drawing + // subsequent images (depending on the DisposalMode). + if (imageIndex == 0) { + fillRect(renderBuffer, gifIn->SWidth, gifIn->SHeight, + 0, 0, gifIn->SWidth, gifIn->SHeight, bgColor); + } else if (prevImageDisposalMode == DISPOSE_BACKGROUND) { + fillRect(renderBuffer, gifIn->SWidth, gifIn->SHeight, + prevImageDimens.Left, prevImageDimens.Top, + prevImageDimens.Width, prevImageDimens.Height, TRANSPARENT); + } + + // Paint this image onto the canvas + for (int y = 0; y < gifIn->Image.Height; y++) { + for (int x = 0; x < gifIn->Image.Width; x++) { + GifByteType colorIndex = *getPixel(rasterBits, gifIn->Image.Width, x, y); + if (colorIndex >= colorMap->ColorCount) { + LOGE("Color Index %d is out of bounds (count=%d)", colorIndex, + colorMap->ColorCount); + return false; + } + + // This image may be smaller than the GIF's "logical screen" + int renderX = x + gifIn->Image.Left; + int renderY = y + gifIn->Image.Top; + + // Skip drawing transparent pixels if this image renders on top of the last one + if (imageIndex > 0 && prevImageDisposalMode == DISPOSE_DO_NOT && + colorIndex == transparentColorIndex) { + continue; + } + + ColorARGB* renderPixel = getPixel(renderBuffer, gifIn->SWidth, renderX, renderY); + *renderPixel = getColorARGB(colorMap, transparentColorIndex, colorIndex); + } + } + return true; +} + +void GifTranscoder::fillRect(ColorARGB* renderBuffer, + int imageWidth, + int imageHeight, + int left, + int top, + int width, + int height, + ColorARGB color) { + ASSERT(left + width <= imageWidth, "Rectangle is outside image bounds"); + ASSERT(top + height <= imageHeight, "Rectangle is outside image bounds"); + + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + ColorARGB* renderPixel = getPixel(renderBuffer, imageWidth, x + left, y + top); + *renderPixel = color; + } + } +} + +GifByteType GifTranscoder::computeNewColorIndex(GifFileType* gifIn, + int transparentColorIndex, + ColorARGB* renderBuffer, + int x, + int y) { + ColorMapObject* colorMap = getColorMap(gifIn); + + // Compute the average color of 4 adjacent pixels from the input image. + ColorARGB c1 = *getPixel(renderBuffer, gifIn->SWidth, x * 2, y * 2); + ColorARGB c2 = *getPixel(renderBuffer, gifIn->SWidth, x * 2 + 1, y * 2); + ColorARGB c3 = *getPixel(renderBuffer, gifIn->SWidth, x * 2, y * 2 + 1); + ColorARGB c4 = *getPixel(renderBuffer, gifIn->SWidth, x * 2 + 1, y * 2 + 1); + ColorARGB avgColor = computeAverage(c1, c2, c3, c4); + + // Search the color map for the best match. + return findBestColor(colorMap, transparentColorIndex, avgColor); +} + +ColorARGB GifTranscoder::computeAverage(ColorARGB c1, ColorARGB c2, ColorARGB c3, ColorARGB c4) { + char avgAlpha = (char)(((int) ALPHA(c1) + (int) ALPHA(c2) + + (int) ALPHA(c3) + (int) ALPHA(c4)) / 4); + char avgRed = (char)(((int) RED(c1) + (int) RED(c2) + + (int) RED(c3) + (int) RED(c4)) / 4); + char avgGreen = (char)(((int) GREEN(c1) + (int) GREEN(c2) + + (int) GREEN(c3) + (int) GREEN(c4)) / 4); + char avgBlue = (char)(((int) BLUE(c1) + (int) BLUE(c2) + + (int) BLUE(c3) + (int) BLUE(c4)) / 4); + return MAKE_COLOR_ARGB(avgAlpha, avgRed, avgGreen, avgBlue); +} + +GifByteType GifTranscoder::findBestColor(ColorMapObject* colorMap, int transparentColorIndex, + ColorARGB targetColor) { + // Return the transparent color if the average alpha is zero. + char alpha = ALPHA(targetColor); + if (alpha == 0 && transparentColorIndex != NO_TRANSPARENT_COLOR) { + return transparentColorIndex; + } + + GifByteType closestColorIndex = 0; + int closestColorDistance = MAX_COLOR_DISTANCE; + for (int i = 0; i < colorMap->ColorCount; i++) { + // Skip the transparent color (we've already eliminated that option). + if (i == transparentColorIndex) { + continue; + } + ColorARGB indexedColor = gifColorToColorARGB(colorMap->Colors[i]); + int distance = computeDistance(targetColor, indexedColor); + if (distance < closestColorDistance) { + closestColorIndex = i; + closestColorDistance = distance; + } + } + return closestColorIndex; +} + +int GifTranscoder::computeDistance(ColorARGB c1, ColorARGB c2) { + return SQUARE(RED(c1) - RED(c2)) + + SQUARE(GREEN(c1) - GREEN(c2)) + + SQUARE(BLUE(c1) - BLUE(c2)); +} + +ColorMapObject* GifTranscoder::getColorMap(GifFileType* gifIn) { + if (gifIn->Image.ColorMap) { + return gifIn->Image.ColorMap; + } + return gifIn->SColorMap; +} + +ColorARGB GifTranscoder::getColorARGB(ColorMapObject* colorMap, int transparentColorIndex, + GifByteType colorIndex) { + if (colorIndex == transparentColorIndex) { + return TRANSPARENT; + } + return gifColorToColorARGB(colorMap->Colors[colorIndex]); +} + +ColorARGB GifTranscoder::gifColorToColorARGB(const GifColorType& color) { + return MAKE_COLOR_ARGB(0xff, color.Red, color.Green, color.Blue); +} + +GifFilesCloser::~GifFilesCloser() { + if (mGifIn) { + DGifCloseFile(mGifIn, NULL); + mGifIn = NULL; + } + if (mGifOut) { + EGifCloseFile(mGifOut, NULL); + mGifOut = NULL; + } +} + +void GifFilesCloser::setGifIn(GifFileType* gifIn) { + ASSERT(mGifIn == NULL, "mGifIn is already set"); + mGifIn = gifIn; +} + +void GifFilesCloser::releaseGifIn() { + ASSERT(mGifIn != NULL, "mGifIn is already NULL"); + mGifIn = NULL; +} + +void GifFilesCloser::setGifOut(GifFileType* gifOut) { + ASSERT(mGifOut == NULL, "mGifOut is already set"); + mGifOut = gifOut; +} + +void GifFilesCloser::releaseGifOut() { + ASSERT(mGifOut != NULL, "mGifOut is already NULL"); + mGifOut = NULL; +} + +// JNI stuff + +jboolean transcode(JNIEnv* env, jobject clazz, jstring filePath, jstring outFilePath) { + const char* pathIn = env->GetStringUTFChars(filePath, JNI_FALSE); + const char* pathOut = env->GetStringUTFChars(outFilePath, JNI_FALSE); + + GifTranscoder transcoder; + int gifCode = transcoder.transcode(pathIn, pathOut); + + env->ReleaseStringUTFChars(filePath, pathIn); + env->ReleaseStringUTFChars(outFilePath, pathOut); + + return (gifCode == GIF_OK); +} + +const char *kClassPathName = "com/android/messaging/util/GifTranscoder"; + +JNINativeMethod kMethods[] = { + { "transcodeInternal", "(Ljava/lang/String;Ljava/lang/String;)Z", (void*)transcode }, +}; + +int registerNativeMethods(JNIEnv* env, const char* className, + JNINativeMethod* gMethods, int numMethods) { + jclass clazz = env->FindClass(className); + if (clazz == NULL) { + return JNI_FALSE; + } + if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) { + return JNI_FALSE; + } + return JNI_TRUE; +} + +jint JNI_OnLoad(JavaVM* vm, void* reserved) { + JNIEnv* env; + if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_6) != JNI_OK) { + return -1; + } + if (!registerNativeMethods(env, kClassPathName, + kMethods, sizeof(kMethods) / sizeof(kMethods[0]))) { + return -1; + } + return JNI_VERSION_1_6; +} diff --git a/app/src/main/jni/GifTranscoder.h b/app/src/main/jni/GifTranscoder.h new file mode 100644 index 0000000..39ecc24 --- /dev/null +++ b/app/src/main/jni/GifTranscoder.h @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2015 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. + */ + +#ifndef GIF_TRANSCODER_H +#define GIF_TRANSCODER_H + +#include + +#include "gif_lib.h" + +// 24-bit color with alpha, stored in order: A, R, G, B. +// The internal GIF render buffer stores pixels using this format. +typedef uint32_t ColorARGB; + +// Compresses a GIF (probably animated) so it can be sent via MMS, which generally has a 1 MB limit +// on attachments. GIF image data is already compressed (LZW), so to achieve further reduction in +// file size, we reduce the image dimensions. +// +// Helpful GIF references: +// GIF89A spec: http://www.w3.org/Graphics/GIF/spec-gif89a.txt +// What's in a GIF: http://giflib.sourceforge.net/whatsinagif/index.html +// +class GifTranscoder { +public: + GifTranscoder() {} + ~GifTranscoder() {} + + // Resizes a GIF's width and height to 50% of their original dimensions. The new file is + // written to pathOut. + // + // The image is resized using a box filter, which averages the colors in each 2x2 box of pixels + // in the source to generate the color of the pixel in the destination. + // + // Returns GIF_OK (1) on success, or GIF_ERROR (0) on failure. + int transcode(const char* pathIn, const char* pathOut); + +private: + // Implementation of the box filter algorithm. + static bool resizeBoxFilter(GifFileType* gifIn, GifFileType* gifOut); + + // Reads the raster data for the current image of the GIF. + static bool readImage(GifFileType* gifIn, GifByteType* rasterBits); + + // Renders the current image of the GIF into the supplied render buffer. + static bool renderImage(GifFileType* gifIn, + GifByteType* rasterBits, + int imageIndex, + int transparentColorIndex, + ColorARGB* renderBuffer, + ColorARGB bgColor, + GifImageDesc prevImageDimens, + int prevImageDisposalMode); + + // Fills a rectangle in the buffer with a solid color. + static void fillRect(ColorARGB* renderBuffer, + int imageWidth, + int imageHeight, + int left, + int top, + int width, + int height, + ColorARGB color); + + // Computes the color for the pixel (x,y) in the current image in the output GIF. + static GifByteType computeNewColorIndex(GifFileType* gifIn, + int transparentColorIndex, + ColorARGB* renderBuffer, + int x, + int y); + + // Computes the average color (by averaging the per-channel (ARGB) values). + static ColorARGB computeAverage(ColorARGB c1, ColorARGB c2, ColorARGB c3, ColorARGB c4); + + // Searches a color map for the color closest (Euclidean distance) to the target color. + static GifByteType findBestColor(ColorMapObject* colorMap, int transparentColorIndex, + ColorARGB targetColor); + + // Computes distance (squared) between 2 colors, considering each channel a separate dimension. + static int computeDistance(ColorARGB c1, ColorARGB c2); + + // Returns the local color map of the current image (if any), or else the global color map. + static ColorMapObject* getColorMap(GifFileType* gifIn); + + // Returns an indexed color from the color map. + static ColorARGB getColorARGB(ColorMapObject* colorMap, int transparentColorIndex, + GifByteType colorIndex); + + // Converts a 24-bit GIF color (RGB) to a 32-bit ARGB color. + static ColorARGB gifColorToColorARGB(const GifColorType& color); +}; + +// Wrapper class that automatically closes the GIF files when the wrapper goes out of scope. +class GifFilesCloser { +public: + GifFilesCloser() {} + ~GifFilesCloser(); + + void setGifIn(GifFileType* gifIn); + void releaseGifIn(); + + void setGifOut(GifFileType* gifOut); + void releaseGifOut(); + +private: + GifFileType* mGifIn = NULL; + GifFileType* mGifOut = NULL; +}; + +#endif // GIF_TRANSCODER_H diff --git a/res/color/tab_text_color.xml b/app/src/main/res/color/tab_text_color.xml similarity index 86% rename from res/color/tab_text_color.xml rename to app/src/main/res/color/tab_text_color.xml index 498d1e4..ab3dae9 100644 --- a/res/color/tab_text_color.xml +++ b/app/src/main/res/color/tab_text_color.xml @@ -16,8 +16,8 @@ --> - \ No newline at end of file + android:color="@color/looply_nav_inactive" /> + diff --git a/res/drawable-hdpi/contact_popup_background.9.png b/app/src/main/res/drawable-hdpi/contact_popup_background.9.png similarity index 100% rename from res/drawable-hdpi/contact_popup_background.9.png rename to app/src/main/res/drawable-hdpi/contact_popup_background.9.png diff --git a/res/drawable-hdpi/ic_failed_status_red.png b/app/src/main/res/drawable-hdpi/ic_failed_status_red.png similarity index 100% rename from res/drawable-hdpi/ic_failed_status_red.png rename to app/src/main/res/drawable-hdpi/ic_failed_status_red.png diff --git a/res/drawable-hdpi/ic_oobe_conv_list.png b/app/src/main/res/drawable-hdpi/ic_oobe_conv_list.png similarity index 100% rename from res/drawable-hdpi/ic_oobe_conv_list.png rename to app/src/main/res/drawable-hdpi/ic_oobe_conv_list.png diff --git a/res/drawable-hdpi/ic_oobe_freq_list.png b/app/src/main/res/drawable-hdpi/ic_oobe_freq_list.png similarity index 100% rename from res/drawable-hdpi/ic_oobe_freq_list.png rename to app/src/main/res/drawable-hdpi/ic_oobe_freq_list.png diff --git a/res/drawable-hdpi/ic_preview_pause.png b/app/src/main/res/drawable-hdpi/ic_preview_pause.png similarity index 100% rename from res/drawable-hdpi/ic_preview_pause.png rename to app/src/main/res/drawable-hdpi/ic_preview_pause.png diff --git a/res/drawable-hdpi/ic_preview_play.png b/app/src/main/res/drawable-hdpi/ic_preview_play.png similarity index 100% rename from res/drawable-hdpi/ic_preview_play.png rename to app/src/main/res/drawable-hdpi/ic_preview_play.png diff --git a/res/drawable-hdpi/ic_remove_light.png b/app/src/main/res/drawable-hdpi/ic_remove_light.png similarity index 100% rename from res/drawable-hdpi/ic_remove_light.png rename to app/src/main/res/drawable-hdpi/ic_remove_light.png diff --git a/res/drawable-hdpi/ic_sim_card_send.png b/app/src/main/res/drawable-hdpi/ic_sim_card_send.png similarity index 100% rename from res/drawable-hdpi/ic_sim_card_send.png rename to app/src/main/res/drawable-hdpi/ic_sim_card_send.png diff --git a/res/drawable-hdpi/ic_sms_delivery_ok.png b/app/src/main/res/drawable-hdpi/ic_sms_delivery_ok.png similarity index 100% rename from res/drawable-hdpi/ic_sms_delivery_ok.png rename to app/src/main/res/drawable-hdpi/ic_sms_delivery_ok.png diff --git a/res/drawable-hdpi/ic_sms_light.png b/app/src/main/res/drawable-hdpi/ic_sms_light.png similarity index 100% rename from res/drawable-hdpi/ic_sms_light.png rename to app/src/main/res/drawable-hdpi/ic_sms_light.png diff --git a/res/drawable-hdpi/ic_sms_multi_light.png b/app/src/main/res/drawable-hdpi/ic_sms_multi_light.png similarity index 100% rename from res/drawable-hdpi/ic_sms_multi_light.png rename to app/src/main/res/drawable-hdpi/ic_sms_multi_light.png diff --git a/res/drawable-hdpi/ic_widget_avatar_shadow.png b/app/src/main/res/drawable-hdpi/ic_widget_avatar_shadow.png similarity index 100% rename from res/drawable-hdpi/ic_widget_avatar_shadow.png rename to app/src/main/res/drawable-hdpi/ic_widget_avatar_shadow.png diff --git a/res/drawable-hdpi/permissions.png b/app/src/main/res/drawable-hdpi/permissions.png similarity index 100% rename from res/drawable-hdpi/permissions.png rename to app/src/main/res/drawable-hdpi/permissions.png diff --git a/res/drawable-hdpi/swipe_shadow.9.png b/app/src/main/res/drawable-hdpi/swipe_shadow.9.png similarity index 100% rename from res/drawable-hdpi/swipe_shadow.9.png rename to app/src/main/res/drawable-hdpi/swipe_shadow.9.png diff --git a/res/drawable-hdpi/swipe_shadow_drag.9.png b/app/src/main/res/drawable-hdpi/swipe_shadow_drag.9.png similarity index 100% rename from res/drawable-hdpi/swipe_shadow_drag.9.png rename to app/src/main/res/drawable-hdpi/swipe_shadow_drag.9.png diff --git a/res/drawable-hdpi/widget_hr.9.png b/app/src/main/res/drawable-hdpi/widget_hr.9.png similarity index 100% rename from res/drawable-hdpi/widget_hr.9.png rename to app/src/main/res/drawable-hdpi/widget_hr.9.png diff --git a/res/drawable-hdpi/widget_msg_bubble_incoming.9.png b/app/src/main/res/drawable-hdpi/widget_msg_bubble_incoming.9.png similarity index 100% rename from res/drawable-hdpi/widget_msg_bubble_incoming.9.png rename to app/src/main/res/drawable-hdpi/widget_msg_bubble_incoming.9.png diff --git a/res/drawable-hdpi/widget_msg_bubble_outgoing.9.png b/app/src/main/res/drawable-hdpi/widget_msg_bubble_outgoing.9.png similarity index 100% rename from res/drawable-hdpi/widget_msg_bubble_outgoing.9.png rename to app/src/main/res/drawable-hdpi/widget_msg_bubble_outgoing.9.png diff --git a/res/drawable-mdpi/contact_popup_background.9.png b/app/src/main/res/drawable-mdpi/contact_popup_background.9.png similarity index 100% rename from res/drawable-mdpi/contact_popup_background.9.png rename to app/src/main/res/drawable-mdpi/contact_popup_background.9.png diff --git a/res/drawable-mdpi/ic_failed_status_red.png b/app/src/main/res/drawable-mdpi/ic_failed_status_red.png similarity index 100% rename from res/drawable-mdpi/ic_failed_status_red.png rename to app/src/main/res/drawable-mdpi/ic_failed_status_red.png diff --git a/res/drawable-mdpi/ic_oobe_conv_list.png b/app/src/main/res/drawable-mdpi/ic_oobe_conv_list.png similarity index 100% rename from res/drawable-mdpi/ic_oobe_conv_list.png rename to app/src/main/res/drawable-mdpi/ic_oobe_conv_list.png diff --git a/res/drawable-mdpi/ic_oobe_freq_list.png b/app/src/main/res/drawable-mdpi/ic_oobe_freq_list.png similarity index 100% rename from res/drawable-mdpi/ic_oobe_freq_list.png rename to app/src/main/res/drawable-mdpi/ic_oobe_freq_list.png diff --git a/res/drawable-mdpi/ic_preview_pause.png b/app/src/main/res/drawable-mdpi/ic_preview_pause.png similarity index 100% rename from res/drawable-mdpi/ic_preview_pause.png rename to app/src/main/res/drawable-mdpi/ic_preview_pause.png diff --git a/res/drawable-mdpi/ic_preview_play.png b/app/src/main/res/drawable-mdpi/ic_preview_play.png similarity index 100% rename from res/drawable-mdpi/ic_preview_play.png rename to app/src/main/res/drawable-mdpi/ic_preview_play.png diff --git a/res/drawable-mdpi/ic_remove_light.png b/app/src/main/res/drawable-mdpi/ic_remove_light.png similarity index 100% rename from res/drawable-mdpi/ic_remove_light.png rename to app/src/main/res/drawable-mdpi/ic_remove_light.png diff --git a/res/drawable-mdpi/ic_sim_card_send.png b/app/src/main/res/drawable-mdpi/ic_sim_card_send.png similarity index 100% rename from res/drawable-mdpi/ic_sim_card_send.png rename to app/src/main/res/drawable-mdpi/ic_sim_card_send.png diff --git a/res/drawable-mdpi/ic_sms_delivery_ok.png b/app/src/main/res/drawable-mdpi/ic_sms_delivery_ok.png similarity index 100% rename from res/drawable-mdpi/ic_sms_delivery_ok.png rename to app/src/main/res/drawable-mdpi/ic_sms_delivery_ok.png diff --git a/res/drawable-mdpi/ic_sms_light.png b/app/src/main/res/drawable-mdpi/ic_sms_light.png similarity index 100% rename from res/drawable-mdpi/ic_sms_light.png rename to app/src/main/res/drawable-mdpi/ic_sms_light.png diff --git a/res/drawable-mdpi/ic_sms_multi_light.png b/app/src/main/res/drawable-mdpi/ic_sms_multi_light.png similarity index 100% rename from res/drawable-mdpi/ic_sms_multi_light.png rename to app/src/main/res/drawable-mdpi/ic_sms_multi_light.png diff --git a/res/drawable-mdpi/ic_widget_avatar_shadow.png b/app/src/main/res/drawable-mdpi/ic_widget_avatar_shadow.png similarity index 100% rename from res/drawable-mdpi/ic_widget_avatar_shadow.png rename to app/src/main/res/drawable-mdpi/ic_widget_avatar_shadow.png diff --git a/res/drawable-mdpi/permissions.png b/app/src/main/res/drawable-mdpi/permissions.png similarity index 100% rename from res/drawable-mdpi/permissions.png rename to app/src/main/res/drawable-mdpi/permissions.png diff --git a/res/drawable-mdpi/swipe_shadow.9.png b/app/src/main/res/drawable-mdpi/swipe_shadow.9.png similarity index 100% rename from res/drawable-mdpi/swipe_shadow.9.png rename to app/src/main/res/drawable-mdpi/swipe_shadow.9.png diff --git a/res/drawable-mdpi/swipe_shadow_drag.9.png b/app/src/main/res/drawable-mdpi/swipe_shadow_drag.9.png similarity index 100% rename from res/drawable-mdpi/swipe_shadow_drag.9.png rename to app/src/main/res/drawable-mdpi/swipe_shadow_drag.9.png diff --git a/res/drawable-mdpi/widget_hr.9.png b/app/src/main/res/drawable-mdpi/widget_hr.9.png similarity index 100% rename from res/drawable-mdpi/widget_hr.9.png rename to app/src/main/res/drawable-mdpi/widget_hr.9.png diff --git a/res/drawable-mdpi/widget_msg_bubble_incoming.9.png b/app/src/main/res/drawable-mdpi/widget_msg_bubble_incoming.9.png similarity index 100% rename from res/drawable-mdpi/widget_msg_bubble_incoming.9.png rename to app/src/main/res/drawable-mdpi/widget_msg_bubble_incoming.9.png diff --git a/res/drawable-mdpi/widget_msg_bubble_outgoing.9.png b/app/src/main/res/drawable-mdpi/widget_msg_bubble_outgoing.9.png similarity index 100% rename from res/drawable-mdpi/widget_msg_bubble_outgoing.9.png rename to app/src/main/res/drawable-mdpi/widget_msg_bubble_outgoing.9.png diff --git a/res/drawable-nodpi/messenger_widget_conversation_preview.png b/app/src/main/res/drawable-nodpi/messenger_widget_conversation_preview.png similarity index 100% rename from res/drawable-nodpi/messenger_widget_conversation_preview.png rename to app/src/main/res/drawable-nodpi/messenger_widget_conversation_preview.png diff --git a/res/drawable-nodpi/messenger_widget_preview.png b/app/src/main/res/drawable-nodpi/messenger_widget_preview.png similarity index 100% rename from res/drawable-nodpi/messenger_widget_preview.png rename to app/src/main/res/drawable-nodpi/messenger_widget_preview.png diff --git a/res/drawable-xhdpi/contact_popup_background.9.png b/app/src/main/res/drawable-xhdpi/contact_popup_background.9.png similarity index 100% rename from res/drawable-xhdpi/contact_popup_background.9.png rename to app/src/main/res/drawable-xhdpi/contact_popup_background.9.png diff --git a/res/drawable-xhdpi/ic_failed_status_red.png b/app/src/main/res/drawable-xhdpi/ic_failed_status_red.png similarity index 100% rename from res/drawable-xhdpi/ic_failed_status_red.png rename to app/src/main/res/drawable-xhdpi/ic_failed_status_red.png diff --git a/res/drawable-xhdpi/ic_oobe_conv_list.png b/app/src/main/res/drawable-xhdpi/ic_oobe_conv_list.png similarity index 100% rename from res/drawable-xhdpi/ic_oobe_conv_list.png rename to app/src/main/res/drawable-xhdpi/ic_oobe_conv_list.png diff --git a/res/drawable-xhdpi/ic_oobe_freq_list.png b/app/src/main/res/drawable-xhdpi/ic_oobe_freq_list.png similarity index 100% rename from res/drawable-xhdpi/ic_oobe_freq_list.png rename to app/src/main/res/drawable-xhdpi/ic_oobe_freq_list.png diff --git a/res/drawable-xhdpi/ic_preview_pause.png b/app/src/main/res/drawable-xhdpi/ic_preview_pause.png similarity index 100% rename from res/drawable-xhdpi/ic_preview_pause.png rename to app/src/main/res/drawable-xhdpi/ic_preview_pause.png diff --git a/res/drawable-xhdpi/ic_preview_play.png b/app/src/main/res/drawable-xhdpi/ic_preview_play.png similarity index 100% rename from res/drawable-xhdpi/ic_preview_play.png rename to app/src/main/res/drawable-xhdpi/ic_preview_play.png diff --git a/res/drawable-xhdpi/ic_remove_light.png b/app/src/main/res/drawable-xhdpi/ic_remove_light.png similarity index 100% rename from res/drawable-xhdpi/ic_remove_light.png rename to app/src/main/res/drawable-xhdpi/ic_remove_light.png diff --git a/res/drawable-xhdpi/ic_sim_card_send.png b/app/src/main/res/drawable-xhdpi/ic_sim_card_send.png similarity index 100% rename from res/drawable-xhdpi/ic_sim_card_send.png rename to app/src/main/res/drawable-xhdpi/ic_sim_card_send.png diff --git a/res/drawable-xhdpi/ic_sms_delivery_ok.png b/app/src/main/res/drawable-xhdpi/ic_sms_delivery_ok.png similarity index 100% rename from res/drawable-xhdpi/ic_sms_delivery_ok.png rename to app/src/main/res/drawable-xhdpi/ic_sms_delivery_ok.png diff --git a/res/drawable-xhdpi/ic_sms_light.png b/app/src/main/res/drawable-xhdpi/ic_sms_light.png similarity index 100% rename from res/drawable-xhdpi/ic_sms_light.png rename to app/src/main/res/drawable-xhdpi/ic_sms_light.png diff --git a/res/drawable-xhdpi/ic_sms_multi_light.png b/app/src/main/res/drawable-xhdpi/ic_sms_multi_light.png similarity index 100% rename from res/drawable-xhdpi/ic_sms_multi_light.png rename to app/src/main/res/drawable-xhdpi/ic_sms_multi_light.png diff --git a/res/drawable-xhdpi/ic_widget_avatar_shadow.png b/app/src/main/res/drawable-xhdpi/ic_widget_avatar_shadow.png similarity index 100% rename from res/drawable-xhdpi/ic_widget_avatar_shadow.png rename to app/src/main/res/drawable-xhdpi/ic_widget_avatar_shadow.png diff --git a/res/drawable-xhdpi/permissions.png b/app/src/main/res/drawable-xhdpi/permissions.png similarity index 100% rename from res/drawable-xhdpi/permissions.png rename to app/src/main/res/drawable-xhdpi/permissions.png diff --git a/res/drawable-xhdpi/swipe_shadow.9.png b/app/src/main/res/drawable-xhdpi/swipe_shadow.9.png similarity index 100% rename from res/drawable-xhdpi/swipe_shadow.9.png rename to app/src/main/res/drawable-xhdpi/swipe_shadow.9.png diff --git a/res/drawable-xhdpi/swipe_shadow_drag.9.png b/app/src/main/res/drawable-xhdpi/swipe_shadow_drag.9.png similarity index 100% rename from res/drawable-xhdpi/swipe_shadow_drag.9.png rename to app/src/main/res/drawable-xhdpi/swipe_shadow_drag.9.png diff --git a/res/drawable-xhdpi/widget_hr.9.png b/app/src/main/res/drawable-xhdpi/widget_hr.9.png similarity index 100% rename from res/drawable-xhdpi/widget_hr.9.png rename to app/src/main/res/drawable-xhdpi/widget_hr.9.png diff --git a/res/drawable-xhdpi/widget_msg_bubble_incoming.9.png b/app/src/main/res/drawable-xhdpi/widget_msg_bubble_incoming.9.png similarity index 100% rename from res/drawable-xhdpi/widget_msg_bubble_incoming.9.png rename to app/src/main/res/drawable-xhdpi/widget_msg_bubble_incoming.9.png diff --git a/res/drawable-xhdpi/widget_msg_bubble_outgoing.9.png b/app/src/main/res/drawable-xhdpi/widget_msg_bubble_outgoing.9.png similarity index 100% rename from res/drawable-xhdpi/widget_msg_bubble_outgoing.9.png rename to app/src/main/res/drawable-xhdpi/widget_msg_bubble_outgoing.9.png diff --git a/res/drawable-xxhdpi/contact_popup_background.9.png b/app/src/main/res/drawable-xxhdpi/contact_popup_background.9.png similarity index 100% rename from res/drawable-xxhdpi/contact_popup_background.9.png rename to app/src/main/res/drawable-xxhdpi/contact_popup_background.9.png diff --git a/res/drawable-xxhdpi/ic_failed_status_red.png b/app/src/main/res/drawable-xxhdpi/ic_failed_status_red.png similarity index 100% rename from res/drawable-xxhdpi/ic_failed_status_red.png rename to app/src/main/res/drawable-xxhdpi/ic_failed_status_red.png diff --git a/res/drawable-xxhdpi/ic_oobe_conv_list.png b/app/src/main/res/drawable-xxhdpi/ic_oobe_conv_list.png similarity index 100% rename from res/drawable-xxhdpi/ic_oobe_conv_list.png rename to app/src/main/res/drawable-xxhdpi/ic_oobe_conv_list.png diff --git a/res/drawable-xxhdpi/ic_oobe_freq_list.png b/app/src/main/res/drawable-xxhdpi/ic_oobe_freq_list.png similarity index 100% rename from res/drawable-xxhdpi/ic_oobe_freq_list.png rename to app/src/main/res/drawable-xxhdpi/ic_oobe_freq_list.png diff --git a/res/drawable-xxhdpi/ic_preview_pause.png b/app/src/main/res/drawable-xxhdpi/ic_preview_pause.png similarity index 100% rename from res/drawable-xxhdpi/ic_preview_pause.png rename to app/src/main/res/drawable-xxhdpi/ic_preview_pause.png diff --git a/res/drawable-xxhdpi/ic_preview_play.png b/app/src/main/res/drawable-xxhdpi/ic_preview_play.png similarity index 100% rename from res/drawable-xxhdpi/ic_preview_play.png rename to app/src/main/res/drawable-xxhdpi/ic_preview_play.png diff --git a/res/drawable-xxhdpi/ic_remove_light.png b/app/src/main/res/drawable-xxhdpi/ic_remove_light.png similarity index 100% rename from res/drawable-xxhdpi/ic_remove_light.png rename to app/src/main/res/drawable-xxhdpi/ic_remove_light.png diff --git a/res/drawable-xxhdpi/ic_sim_card_send.png b/app/src/main/res/drawable-xxhdpi/ic_sim_card_send.png similarity index 100% rename from res/drawable-xxhdpi/ic_sim_card_send.png rename to app/src/main/res/drawable-xxhdpi/ic_sim_card_send.png diff --git a/res/drawable-xxhdpi/ic_sms_delivery_ok.png b/app/src/main/res/drawable-xxhdpi/ic_sms_delivery_ok.png similarity index 100% rename from res/drawable-xxhdpi/ic_sms_delivery_ok.png rename to app/src/main/res/drawable-xxhdpi/ic_sms_delivery_ok.png diff --git a/res/drawable-xxhdpi/ic_sms_light.png b/app/src/main/res/drawable-xxhdpi/ic_sms_light.png similarity index 100% rename from res/drawable-xxhdpi/ic_sms_light.png rename to app/src/main/res/drawable-xxhdpi/ic_sms_light.png diff --git a/res/drawable-xxhdpi/ic_sms_multi_light.png b/app/src/main/res/drawable-xxhdpi/ic_sms_multi_light.png similarity index 100% rename from res/drawable-xxhdpi/ic_sms_multi_light.png rename to app/src/main/res/drawable-xxhdpi/ic_sms_multi_light.png diff --git a/res/drawable-xxhdpi/ic_widget_avatar_shadow.png b/app/src/main/res/drawable-xxhdpi/ic_widget_avatar_shadow.png similarity index 100% rename from res/drawable-xxhdpi/ic_widget_avatar_shadow.png rename to app/src/main/res/drawable-xxhdpi/ic_widget_avatar_shadow.png diff --git a/res/drawable-xxhdpi/permissions.png b/app/src/main/res/drawable-xxhdpi/permissions.png similarity index 100% rename from res/drawable-xxhdpi/permissions.png rename to app/src/main/res/drawable-xxhdpi/permissions.png diff --git a/res/drawable-xxhdpi/swipe_shadow.9.png b/app/src/main/res/drawable-xxhdpi/swipe_shadow.9.png similarity index 100% rename from res/drawable-xxhdpi/swipe_shadow.9.png rename to app/src/main/res/drawable-xxhdpi/swipe_shadow.9.png diff --git a/res/drawable-xxhdpi/swipe_shadow_drag.9.png b/app/src/main/res/drawable-xxhdpi/swipe_shadow_drag.9.png similarity index 100% rename from res/drawable-xxhdpi/swipe_shadow_drag.9.png rename to app/src/main/res/drawable-xxhdpi/swipe_shadow_drag.9.png diff --git a/res/drawable-xxhdpi/widget_hr.9.png b/app/src/main/res/drawable-xxhdpi/widget_hr.9.png similarity index 100% rename from res/drawable-xxhdpi/widget_hr.9.png rename to app/src/main/res/drawable-xxhdpi/widget_hr.9.png diff --git a/res/drawable-xxhdpi/widget_msg_bubble_incoming.9.png b/app/src/main/res/drawable-xxhdpi/widget_msg_bubble_incoming.9.png similarity index 100% rename from res/drawable-xxhdpi/widget_msg_bubble_incoming.9.png rename to app/src/main/res/drawable-xxhdpi/widget_msg_bubble_incoming.9.png diff --git a/res/drawable-xxhdpi/widget_msg_bubble_outgoing.9.png b/app/src/main/res/drawable-xxhdpi/widget_msg_bubble_outgoing.9.png similarity index 100% rename from res/drawable-xxhdpi/widget_msg_bubble_outgoing.9.png rename to app/src/main/res/drawable-xxhdpi/widget_msg_bubble_outgoing.9.png diff --git a/res/drawable-xxxhdpi/contact_popup_background.9.png b/app/src/main/res/drawable-xxxhdpi/contact_popup_background.9.png similarity index 100% rename from res/drawable-xxxhdpi/contact_popup_background.9.png rename to app/src/main/res/drawable-xxxhdpi/contact_popup_background.9.png diff --git a/res/drawable-xxxhdpi/ic_failed_status_red.png b/app/src/main/res/drawable-xxxhdpi/ic_failed_status_red.png similarity index 100% rename from res/drawable-xxxhdpi/ic_failed_status_red.png rename to app/src/main/res/drawable-xxxhdpi/ic_failed_status_red.png diff --git a/res/drawable-xxxhdpi/ic_oobe_conv_list.png b/app/src/main/res/drawable-xxxhdpi/ic_oobe_conv_list.png similarity index 100% rename from res/drawable-xxxhdpi/ic_oobe_conv_list.png rename to app/src/main/res/drawable-xxxhdpi/ic_oobe_conv_list.png diff --git a/res/drawable-xxxhdpi/ic_oobe_freq_list.png b/app/src/main/res/drawable-xxxhdpi/ic_oobe_freq_list.png similarity index 100% rename from res/drawable-xxxhdpi/ic_oobe_freq_list.png rename to app/src/main/res/drawable-xxxhdpi/ic_oobe_freq_list.png diff --git a/res/drawable-xxxhdpi/ic_preview_pause.png b/app/src/main/res/drawable-xxxhdpi/ic_preview_pause.png similarity index 100% rename from res/drawable-xxxhdpi/ic_preview_pause.png rename to app/src/main/res/drawable-xxxhdpi/ic_preview_pause.png diff --git a/res/drawable-xxxhdpi/ic_preview_play.png b/app/src/main/res/drawable-xxxhdpi/ic_preview_play.png similarity index 100% rename from res/drawable-xxxhdpi/ic_preview_play.png rename to app/src/main/res/drawable-xxxhdpi/ic_preview_play.png diff --git a/res/drawable-xxxhdpi/ic_remove_light.png b/app/src/main/res/drawable-xxxhdpi/ic_remove_light.png similarity index 100% rename from res/drawable-xxxhdpi/ic_remove_light.png rename to app/src/main/res/drawable-xxxhdpi/ic_remove_light.png diff --git a/res/drawable-xxxhdpi/ic_sim_card_send.png b/app/src/main/res/drawable-xxxhdpi/ic_sim_card_send.png similarity index 100% rename from res/drawable-xxxhdpi/ic_sim_card_send.png rename to app/src/main/res/drawable-xxxhdpi/ic_sim_card_send.png diff --git a/res/drawable-xxxhdpi/ic_sms_delivery_ok.png b/app/src/main/res/drawable-xxxhdpi/ic_sms_delivery_ok.png similarity index 100% rename from res/drawable-xxxhdpi/ic_sms_delivery_ok.png rename to app/src/main/res/drawable-xxxhdpi/ic_sms_delivery_ok.png diff --git a/res/drawable-xxxhdpi/ic_sms_light.png b/app/src/main/res/drawable-xxxhdpi/ic_sms_light.png similarity index 100% rename from res/drawable-xxxhdpi/ic_sms_light.png rename to app/src/main/res/drawable-xxxhdpi/ic_sms_light.png diff --git a/res/drawable-xxxhdpi/ic_sms_multi_light.png b/app/src/main/res/drawable-xxxhdpi/ic_sms_multi_light.png similarity index 100% rename from res/drawable-xxxhdpi/ic_sms_multi_light.png rename to app/src/main/res/drawable-xxxhdpi/ic_sms_multi_light.png diff --git a/res/drawable-xxxhdpi/ic_widget_avatar_shadow.png b/app/src/main/res/drawable-xxxhdpi/ic_widget_avatar_shadow.png similarity index 100% rename from res/drawable-xxxhdpi/ic_widget_avatar_shadow.png rename to app/src/main/res/drawable-xxxhdpi/ic_widget_avatar_shadow.png diff --git a/res/drawable-xxxhdpi/permissions.png b/app/src/main/res/drawable-xxxhdpi/permissions.png similarity index 100% rename from res/drawable-xxxhdpi/permissions.png rename to app/src/main/res/drawable-xxxhdpi/permissions.png diff --git a/res/drawable-xxxhdpi/swipe_shadow.9.png b/app/src/main/res/drawable-xxxhdpi/swipe_shadow.9.png similarity index 100% rename from res/drawable-xxxhdpi/swipe_shadow.9.png rename to app/src/main/res/drawable-xxxhdpi/swipe_shadow.9.png diff --git a/res/drawable-xxxhdpi/swipe_shadow_drag.9.png b/app/src/main/res/drawable-xxxhdpi/swipe_shadow_drag.9.png similarity index 100% rename from res/drawable-xxxhdpi/swipe_shadow_drag.9.png rename to app/src/main/res/drawable-xxxhdpi/swipe_shadow_drag.9.png diff --git a/res/drawable-xxxhdpi/widget_hr.9.png b/app/src/main/res/drawable-xxxhdpi/widget_hr.9.png similarity index 100% rename from res/drawable-xxxhdpi/widget_hr.9.png rename to app/src/main/res/drawable-xxxhdpi/widget_hr.9.png diff --git a/res/drawable-xxxhdpi/widget_msg_bubble_incoming.9.png b/app/src/main/res/drawable-xxxhdpi/widget_msg_bubble_incoming.9.png similarity index 100% rename from res/drawable-xxxhdpi/widget_msg_bubble_incoming.9.png rename to app/src/main/res/drawable-xxxhdpi/widget_msg_bubble_incoming.9.png diff --git a/res/drawable-xxxhdpi/widget_msg_bubble_outgoing.9.png b/app/src/main/res/drawable-xxxhdpi/widget_msg_bubble_outgoing.9.png similarity index 100% rename from res/drawable-xxxhdpi/widget_msg_bubble_outgoing.9.png rename to app/src/main/res/drawable-xxxhdpi/widget_msg_bubble_outgoing.9.png diff --git a/res/drawable/attachment_audio_preview_background.xml b/app/src/main/res/drawable/attachment_audio_preview_background.xml similarity index 100% rename from res/drawable/attachment_audio_preview_background.xml rename to app/src/main/res/drawable/attachment_audio_preview_background.xml diff --git a/res/drawable/attachment_image_placeholder_background.xml b/app/src/main/res/drawable/attachment_image_placeholder_background.xml similarity index 100% rename from res/drawable/attachment_image_placeholder_background.xml rename to app/src/main/res/drawable/attachment_image_placeholder_background.xml diff --git a/res/drawable/attachment_more_items_background.xml b/app/src/main/res/drawable/attachment_more_items_background.xml similarity index 100% rename from res/drawable/attachment_more_items_background.xml rename to app/src/main/res/drawable/attachment_more_items_background.xml diff --git a/res/drawable/attachment_vcard_preview_background.xml b/app/src/main/res/drawable/attachment_vcard_preview_background.xml similarity index 100% rename from res/drawable/attachment_vcard_preview_background.xml rename to app/src/main/res/drawable/attachment_vcard_preview_background.xml diff --git a/res/drawable/audio_progress_bar_background_incoming.xml b/app/src/main/res/drawable/audio_progress_bar_background_incoming.xml similarity index 100% rename from res/drawable/audio_progress_bar_background_incoming.xml rename to app/src/main/res/drawable/audio_progress_bar_background_incoming.xml diff --git a/res/drawable/audio_progress_bar_background_outgoing.xml b/app/src/main/res/drawable/audio_progress_bar_background_outgoing.xml similarity index 100% rename from res/drawable/audio_progress_bar_background_outgoing.xml rename to app/src/main/res/drawable/audio_progress_bar_background_outgoing.xml diff --git a/res/drawable/audio_progress_bar_progress.xml b/app/src/main/res/drawable/audio_progress_bar_progress.xml similarity index 100% rename from res/drawable/audio_progress_bar_progress.xml rename to app/src/main/res/drawable/audio_progress_bar_progress.xml diff --git a/res/drawable/audio_record_control_button_background.xml b/app/src/main/res/drawable/audio_record_control_button_background.xml similarity index 100% rename from res/drawable/audio_record_control_button_background.xml rename to app/src/main/res/drawable/audio_record_control_button_background.xml diff --git a/res/drawable/chips_dropdown_background.xml b/app/src/main/res/drawable/chips_dropdown_background.xml similarity index 100% rename from res/drawable/chips_dropdown_background.xml rename to app/src/main/res/drawable/chips_dropdown_background.xml diff --git a/res/drawable/chips_dropdown_text_color.xml b/app/src/main/res/drawable/chips_dropdown_text_color.xml similarity index 100% rename from res/drawable/chips_dropdown_text_color.xml rename to app/src/main/res/drawable/chips_dropdown_text_color.xml diff --git a/res/drawable/compose_chips_divider_gradient.xml b/app/src/main/res/drawable/compose_chips_divider_gradient.xml similarity index 100% rename from res/drawable/compose_chips_divider_gradient.xml rename to app/src/main/res/drawable/compose_chips_divider_gradient.xml diff --git a/res/drawable/contact_picker_tab_background_selector.xml b/app/src/main/res/drawable/contact_picker_tab_background_selector.xml similarity index 100% rename from res/drawable/contact_picker_tab_background_selector.xml rename to app/src/main/res/drawable/contact_picker_tab_background_selector.xml diff --git a/res/drawable/contacts_fastscroll_label_left.xml b/app/src/main/res/drawable/contacts_fastscroll_label_left.xml similarity index 100% rename from res/drawable/contacts_fastscroll_label_left.xml rename to app/src/main/res/drawable/contacts_fastscroll_label_left.xml diff --git a/res/drawable/contacts_fastscroll_label_right.xml b/app/src/main/res/drawable/contacts_fastscroll_label_right.xml similarity index 100% rename from res/drawable/contacts_fastscroll_label_right.xml rename to app/src/main/res/drawable/contacts_fastscroll_label_right.xml diff --git a/res/drawable/conversation_compose_divider_gradient.xml b/app/src/main/res/drawable/conversation_compose_divider_gradient.xml similarity index 100% rename from res/drawable/conversation_compose_divider_gradient.xml rename to app/src/main/res/drawable/conversation_compose_divider_gradient.xml diff --git a/res/drawable/fastscroll_preview_left.xml b/app/src/main/res/drawable/fastscroll_preview_left.xml similarity index 100% rename from res/drawable/fastscroll_preview_left.xml rename to app/src/main/res/drawable/fastscroll_preview_left.xml diff --git a/res/drawable/fastscroll_preview_right.xml b/app/src/main/res/drawable/fastscroll_preview_right.xml similarity index 100% rename from res/drawable/fastscroll_preview_right.xml rename to app/src/main/res/drawable/fastscroll_preview_right.xml diff --git a/res/drawable/fastscroll_thumb.xml b/app/src/main/res/drawable/fastscroll_thumb.xml similarity index 100% rename from res/drawable/fastscroll_thumb.xml rename to app/src/main/res/drawable/fastscroll_thumb.xml diff --git a/res/drawable/fastscroll_thumb_pressed.xml b/app/src/main/res/drawable/fastscroll_thumb_pressed.xml similarity index 100% rename from res/drawable/fastscroll_thumb_pressed.xml rename to app/src/main/res/drawable/fastscroll_thumb_pressed.xml diff --git a/res/drawable/fastscroll_track.xml b/app/src/main/res/drawable/fastscroll_track.xml similarity index 100% rename from res/drawable/fastscroll_track.xml rename to app/src/main/res/drawable/fastscroll_track.xml diff --git a/res/drawable/gallery_checkbox_selector.xml b/app/src/main/res/drawable/gallery_checkbox_selector.xml similarity index 100% rename from res/drawable/gallery_checkbox_selector.xml rename to app/src/main/res/drawable/gallery_checkbox_selector.xml diff --git a/app/src/main/res/drawable/home_bg_chip.xml b/app/src/main/res/drawable/home_bg_chip.xml new file mode 100644 index 0000000..d1dc60a --- /dev/null +++ b/app/src/main/res/drawable/home_bg_chip.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/home_bg_circle.xml b/app/src/main/res/drawable/home_bg_circle.xml new file mode 100644 index 0000000..9823f31 --- /dev/null +++ b/app/src/main/res/drawable/home_bg_circle.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/home_bg_contacts_card.xml b/app/src/main/res/drawable/home_bg_contacts_card.xml new file mode 100644 index 0000000..0d7d0ba --- /dev/null +++ b/app/src/main/res/drawable/home_bg_contacts_card.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/home_bg_dock_fab.xml b/app/src/main/res/drawable/home_bg_dock_fab.xml new file mode 100644 index 0000000..10c0629 --- /dev/null +++ b/app/src/main/res/drawable/home_bg_dock_fab.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/home_bg_dock_pill.xml b/app/src/main/res/drawable/home_bg_dock_pill.xml new file mode 100644 index 0000000..e2687aa --- /dev/null +++ b/app/src/main/res/drawable/home_bg_dock_pill.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/home_bg_fab.xml b/app/src/main/res/drawable/home_bg_fab.xml new file mode 100644 index 0000000..d7021b7 --- /dev/null +++ b/app/src/main/res/drawable/home_bg_fab.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/home_bg_main_nav.xml b/app/src/main/res/drawable/home_bg_main_nav.xml new file mode 100644 index 0000000..42b288b --- /dev/null +++ b/app/src/main/res/drawable/home_bg_main_nav.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/app/src/main/res/drawable/home_bg_nav_active.xml b/app/src/main/res/drawable/home_bg_nav_active.xml new file mode 100644 index 0000000..dab197c --- /dev/null +++ b/app/src/main/res/drawable/home_bg_nav_active.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/app/src/main/res/drawable/home_bg_nav_active_primary.xml b/app/src/main/res/drawable/home_bg_nav_active_primary.xml new file mode 100644 index 0000000..aadc84e --- /dev/null +++ b/app/src/main/res/drawable/home_bg_nav_active_primary.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/home_bg_pill.xml b/app/src/main/res/drawable/home_bg_pill.xml new file mode 100644 index 0000000..519f83f --- /dev/null +++ b/app/src/main/res/drawable/home_bg_pill.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/app/src/main/res/drawable/home_bg_pin_active.xml b/app/src/main/res/drawable/home_bg_pin_active.xml new file mode 100644 index 0000000..6af3439 --- /dev/null +++ b/app/src/main/res/drawable/home_bg_pin_active.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/home_bg_pin_inactive.xml b/app/src/main/res/drawable/home_bg_pin_inactive.xml new file mode 100644 index 0000000..aa96a19 --- /dev/null +++ b/app/src/main/res/drawable/home_bg_pin_inactive.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/home_bg_pinned_preview_bubble.xml b/app/src/main/res/drawable/home_bg_pinned_preview_bubble.xml new file mode 100644 index 0000000..317c357 --- /dev/null +++ b/app/src/main/res/drawable/home_bg_pinned_preview_bubble.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/app/src/main/res/drawable/home_bg_pinned_remove.xml b/app/src/main/res/drawable/home_bg_pinned_remove.xml new file mode 100644 index 0000000..9210db9 --- /dev/null +++ b/app/src/main/res/drawable/home_bg_pinned_remove.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/home_bg_popover.xml b/app/src/main/res/drawable/home_bg_popover.xml new file mode 100644 index 0000000..18913cb --- /dev/null +++ b/app/src/main/res/drawable/home_bg_popover.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/app/src/main/res/drawable/home_bg_popover_item.xml b/app/src/main/res/drawable/home_bg_popover_item.xml new file mode 100644 index 0000000..b34543c --- /dev/null +++ b/app/src/main/res/drawable/home_bg_popover_item.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/home_bg_search_bar_outer.xml b/app/src/main/res/drawable/home_bg_search_bar_outer.xml new file mode 100644 index 0000000..4b23ace --- /dev/null +++ b/app/src/main/res/drawable/home_bg_search_bar_outer.xml @@ -0,0 +1,11 @@ + + + + diff --git a/app/src/main/res/drawable/home_bg_search_field.xml b/app/src/main/res/drawable/home_bg_search_field.xml new file mode 100644 index 0000000..ba0d60a --- /dev/null +++ b/app/src/main/res/drawable/home_bg_search_field.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/home_bg_search_field_inner.xml b/app/src/main/res/drawable/home_bg_search_field_inner.xml new file mode 100644 index 0000000..7d68f05 --- /dev/null +++ b/app/src/main/res/drawable/home_bg_search_field_inner.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/home_bg_selection_ring.xml b/app/src/main/res/drawable/home_bg_selection_ring.xml new file mode 100644 index 0000000..7c4d680 --- /dev/null +++ b/app/src/main/res/drawable/home_bg_selection_ring.xml @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/home_bg_selection_ring_checked.xml b/app/src/main/res/drawable/home_bg_selection_ring_checked.xml new file mode 100644 index 0000000..a7b2532 --- /dev/null +++ b/app/src/main/res/drawable/home_bg_selection_ring_checked.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/home_bg_sim_badge.xml b/app/src/main/res/drawable/home_bg_sim_badge.xml new file mode 100644 index 0000000..c119efb --- /dev/null +++ b/app/src/main/res/drawable/home_bg_sim_badge.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/home_bg_unread_dot.xml b/app/src/main/res/drawable/home_bg_unread_dot.xml new file mode 100644 index 0000000..a7b2532 --- /dev/null +++ b/app/src/main/res/drawable/home_bg_unread_dot.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/home_pinned_preview_tail.xml b/app/src/main/res/drawable/home_pinned_preview_tail.xml new file mode 100644 index 0000000..793c89c --- /dev/null +++ b/app/src/main/res/drawable/home_pinned_preview_tail.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/res/drawable/ic_add_white.xml b/app/src/main/res/drawable/ic_add_white.xml similarity index 100% rename from res/drawable/ic_add_white.xml rename to app/src/main/res/drawable/ic_add_white.xml diff --git a/res/drawable/ic_archive_small_dark.xml b/app/src/main/res/drawable/ic_archive_small_dark.xml similarity index 100% rename from res/drawable/ic_archive_small_dark.xml rename to app/src/main/res/drawable/ic_archive_small_dark.xml diff --git a/res/drawable/ic_archive_undo_small_dark.xml b/app/src/main/res/drawable/ic_archive_undo_small_dark.xml similarity index 100% rename from res/drawable/ic_archive_undo_small_dark.xml rename to app/src/main/res/drawable/ic_archive_undo_small_dark.xml diff --git a/res/drawable/ic_arrow_back_light.xml b/app/src/main/res/drawable/ic_arrow_back_light.xml similarity index 100% rename from res/drawable/ic_arrow_back_light.xml rename to app/src/main/res/drawable/ic_arrow_back_light.xml diff --git a/res/drawable/ic_attachment_dark.xml b/app/src/main/res/drawable/ic_attachment_dark.xml similarity index 100% rename from res/drawable/ic_attachment_dark.xml rename to app/src/main/res/drawable/ic_attachment_dark.xml diff --git a/res/drawable/ic_audio_light.xml b/app/src/main/res/drawable/ic_audio_light.xml similarity index 100% rename from res/drawable/ic_audio_light.xml rename to app/src/main/res/drawable/ic_audio_light.xml diff --git a/res/drawable/ic_camera_light.xml b/app/src/main/res/drawable/ic_camera_light.xml similarity index 100% rename from res/drawable/ic_camera_light.xml rename to app/src/main/res/drawable/ic_camera_light.xml diff --git a/res/drawable/ic_cancel_small_light.xml b/app/src/main/res/drawable/ic_cancel_small_light.xml similarity index 100% rename from res/drawable/ic_cancel_small_light.xml rename to app/src/main/res/drawable/ic_cancel_small_light.xml diff --git a/res/drawable/ic_checkbox_blank_light.xml b/app/src/main/res/drawable/ic_checkbox_blank_light.xml similarity index 100% rename from res/drawable/ic_checkbox_blank_light.xml rename to app/src/main/res/drawable/ic_checkbox_blank_light.xml diff --git a/res/drawable/ic_checkbox_light.xml b/app/src/main/res/drawable/ic_checkbox_light.xml similarity index 100% rename from res/drawable/ic_checkbox_light.xml rename to app/src/main/res/drawable/ic_checkbox_light.xml diff --git a/res/drawable/ic_checkmark_circle_blue.xml b/app/src/main/res/drawable/ic_checkmark_circle_blue.xml similarity index 100% rename from res/drawable/ic_checkmark_circle_blue.xml rename to app/src/main/res/drawable/ic_checkmark_circle_blue.xml diff --git a/app/src/main/res/drawable/ic_checkmark_circle_primary.xml b/app/src/main/res/drawable/ic_checkmark_circle_primary.xml new file mode 100644 index 0000000..3118d86 --- /dev/null +++ b/app/src/main/res/drawable/ic_checkmark_circle_primary.xml @@ -0,0 +1,10 @@ + + + diff --git a/res/drawable/ic_checkmark_light.xml b/app/src/main/res/drawable/ic_checkmark_light.xml similarity index 100% rename from res/drawable/ic_checkmark_light.xml rename to app/src/main/res/drawable/ic_checkmark_light.xml diff --git a/res/drawable/ic_content_copy_light.xml b/app/src/main/res/drawable/ic_content_copy_light.xml similarity index 100% rename from res/drawable/ic_content_copy_light.xml rename to app/src/main/res/drawable/ic_content_copy_light.xml diff --git a/res/drawable/ic_delete_small_dark.xml b/app/src/main/res/drawable/ic_delete_small_dark.xml similarity index 100% rename from res/drawable/ic_delete_small_dark.xml rename to app/src/main/res/drawable/ic_delete_small_dark.xml diff --git a/res/drawable/ic_dnd_on_light.xml b/app/src/main/res/drawable/ic_dnd_on_light.xml similarity index 100% rename from res/drawable/ic_dnd_on_light.xml rename to app/src/main/res/drawable/ic_dnd_on_light.xml diff --git a/res/drawable/ic_failed_light.xml b/app/src/main/res/drawable/ic_failed_light.xml similarity index 100% rename from res/drawable/ic_failed_light.xml rename to app/src/main/res/drawable/ic_failed_light.xml diff --git a/res/drawable/ic_file_download_light.xml b/app/src/main/res/drawable/ic_file_download_light.xml similarity index 100% rename from res/drawable/ic_file_download_light.xml rename to app/src/main/res/drawable/ic_file_download_light.xml diff --git a/res/drawable/ic_forward_light.xml b/app/src/main/res/drawable/ic_forward_light.xml similarity index 100% rename from res/drawable/ic_forward_light.xml rename to app/src/main/res/drawable/ic_forward_light.xml diff --git a/app/src/main/res/drawable/ic_home_add.xml b/app/src/main/res/drawable/ic_home_add.xml new file mode 100644 index 0000000..1986445 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_add.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_home_check.xml b/app/src/main/res/drawable/ic_home_check.xml new file mode 100644 index 0000000..fa72afb --- /dev/null +++ b/app/src/main/res/drawable/ic_home_check.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/drawable/ic_home_chevron.xml b/app/src/main/res/drawable/ic_home_chevron.xml new file mode 100644 index 0000000..ae9ac87 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_chevron.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_home_compose.xml b/app/src/main/res/drawable/ic_home_compose.xml new file mode 100644 index 0000000..6ac77a2 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_compose.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_home_compose_line.xml b/app/src/main/res/drawable/ic_home_compose_line.xml new file mode 100644 index 0000000..9e39506 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_compose_line.xml @@ -0,0 +1,25 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_home_filter.xml b/app/src/main/res/drawable/ic_home_filter.xml new file mode 100644 index 0000000..6249bae --- /dev/null +++ b/app/src/main/res/drawable/ic_home_filter.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_home_menu_lines.xml b/app/src/main/res/drawable/ic_home_menu_lines.xml new file mode 100644 index 0000000..3589032 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_menu_lines.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_home_menu_messages.xml b/app/src/main/res/drawable/ic_home_menu_messages.xml new file mode 100644 index 0000000..8b83f5a --- /dev/null +++ b/app/src/main/res/drawable/ic_home_menu_messages.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/drawable/ic_home_menu_person.xml b/app/src/main/res/drawable/ic_home_menu_person.xml new file mode 100644 index 0000000..18ae2ba --- /dev/null +++ b/app/src/main/res/drawable/ic_home_menu_person.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/drawable/ic_home_menu_pin.xml b/app/src/main/res/drawable/ic_home_menu_pin.xml new file mode 100644 index 0000000..3957615 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_menu_pin.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/drawable/ic_home_menu_select.xml b/app/src/main/res/drawable/ic_home_menu_select.xml new file mode 100644 index 0000000..f678d8a --- /dev/null +++ b/app/src/main/res/drawable/ic_home_menu_select.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/drawable/ic_home_menu_spam.xml b/app/src/main/res/drawable/ic_home_menu_spam.xml new file mode 100644 index 0000000..b2cdc85 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_menu_spam.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_home_menu_trash.xml b/app/src/main/res/drawable/ic_home_menu_trash.xml new file mode 100644 index 0000000..4b82fd1 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_menu_trash.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/drawable/ic_home_menu_unread.xml b/app/src/main/res/drawable/ic_home_menu_unread.xml new file mode 100644 index 0000000..305d68a --- /dev/null +++ b/app/src/main/res/drawable/ic_home_menu_unread.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_home_mic.xml b/app/src/main/res/drawable/ic_home_mic.xml new file mode 100644 index 0000000..1fc686f --- /dev/null +++ b/app/src/main/res/drawable/ic_home_mic.xml @@ -0,0 +1,6 @@ + + + + diff --git a/app/src/main/res/drawable/ic_home_nav_automate.xml b/app/src/main/res/drawable/ic_home_nav_automate.xml new file mode 100644 index 0000000..0895157 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_nav_automate.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_home_nav_calls.xml b/app/src/main/res/drawable/ic_home_nav_calls.xml new file mode 100644 index 0000000..d158834 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_nav_calls.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_home_nav_chats.xml b/app/src/main/res/drawable/ic_home_nav_chats.xml new file mode 100644 index 0000000..7a83135 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_nav_chats.xml @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/ic_home_nav_compose.xml b/app/src/main/res/drawable/ic_home_nav_compose.xml new file mode 100644 index 0000000..c0a1dec --- /dev/null +++ b/app/src/main/res/drawable/ic_home_nav_compose.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_home_nav_contacts.xml b/app/src/main/res/drawable/ic_home_nav_contacts.xml new file mode 100644 index 0000000..6f5f46f --- /dev/null +++ b/app/src/main/res/drawable/ic_home_nav_contacts.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_home_nav_messages.xml b/app/src/main/res/drawable/ic_home_nav_messages.xml new file mode 100644 index 0000000..9393ec2 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_nav_messages.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_home_nav_settings.xml b/app/src/main/res/drawable/ic_home_nav_settings.xml new file mode 100644 index 0000000..c615326 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_nav_settings.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_home_pinned_remove.xml b/app/src/main/res/drawable/ic_home_pinned_remove.xml new file mode 100644 index 0000000..4d528d5 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_pinned_remove.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_home_search_line.xml b/app/src/main/res/drawable/ic_home_search_line.xml new file mode 100644 index 0000000..42b3ec6 --- /dev/null +++ b/app/src/main/res/drawable/ic_home_search_line.xml @@ -0,0 +1,19 @@ + + + + + diff --git a/res/drawable/ic_image_light.xml b/app/src/main/res/drawable/ic_image_light.xml similarity index 100% rename from res/drawable/ic_image_light.xml rename to app/src/main/res/drawable/ic_image_light.xml diff --git a/res/drawable/ic_ime_light.xml b/app/src/main/res/drawable/ic_ime_light.xml similarity index 100% rename from res/drawable/ic_ime_light.xml rename to app/src/main/res/drawable/ic_ime_light.xml diff --git a/res/drawable/ic_info_light.xml b/app/src/main/res/drawable/ic_info_light.xml similarity index 100% rename from res/drawable/ic_info_light.xml rename to app/src/main/res/drawable/ic_info_light.xml diff --git a/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from res/drawable/ic_launcher_background.xml rename to app/src/main/res/drawable/ic_launcher_background.xml diff --git a/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml similarity index 100% rename from res/drawable/ic_launcher_foreground.xml rename to app/src/main/res/drawable/ic_launcher_foreground.xml diff --git a/res/drawable/ic_launcher_monochrome.xml b/app/src/main/res/drawable/ic_launcher_monochrome.xml similarity index 100% rename from res/drawable/ic_launcher_monochrome.xml rename to app/src/main/res/drawable/ic_launcher_monochrome.xml diff --git a/app/src/main/res/drawable/ic_looply_automate.xml b/app/src/main/res/drawable/ic_looply_automate.xml new file mode 100644 index 0000000..7e78e2c --- /dev/null +++ b/app/src/main/res/drawable/ic_looply_automate.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_looply_back.xml b/app/src/main/res/drawable/ic_looply_back.xml new file mode 100644 index 0000000..75c185a --- /dev/null +++ b/app/src/main/res/drawable/ic_looply_back.xml @@ -0,0 +1,14 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_looply_contacts.xml b/app/src/main/res/drawable/ic_looply_contacts.xml new file mode 100644 index 0000000..7f3d591 --- /dev/null +++ b/app/src/main/res/drawable/ic_looply_contacts.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_looply_more.xml b/app/src/main/res/drawable/ic_looply_more.xml new file mode 100644 index 0000000..d647977 --- /dev/null +++ b/app/src/main/res/drawable/ic_looply_more.xml @@ -0,0 +1,10 @@ + + + + diff --git a/app/src/main/res/drawable/ic_looply_search.xml b/app/src/main/res/drawable/ic_looply_search.xml new file mode 100644 index 0000000..8846a59 --- /dev/null +++ b/app/src/main/res/drawable/ic_looply_search.xml @@ -0,0 +1,10 @@ + + + + diff --git a/res/drawable/ic_message.xml b/app/src/main/res/drawable/ic_message.xml similarity index 100% rename from res/drawable/ic_message.xml rename to app/src/main/res/drawable/ic_message.xml diff --git a/res/drawable/ic_mp_audio_mic.xml b/app/src/main/res/drawable/ic_mp_audio_mic.xml similarity index 100% rename from res/drawable/ic_mp_audio_mic.xml rename to app/src/main/res/drawable/ic_mp_audio_mic.xml diff --git a/res/drawable/ic_mp_video_small_light.xml b/app/src/main/res/drawable/ic_mp_video_small_light.xml similarity index 100% rename from res/drawable/ic_mp_video_small_light.xml rename to app/src/main/res/drawable/ic_mp_video_small_light.xml diff --git a/res/drawable/ic_numeric_dialpad.xml b/app/src/main/res/drawable/ic_numeric_dialpad.xml similarity index 100% rename from res/drawable/ic_numeric_dialpad.xml rename to app/src/main/res/drawable/ic_numeric_dialpad.xml diff --git a/res/drawable/ic_pause_light.xml b/app/src/main/res/drawable/ic_pause_light.xml similarity index 100% rename from res/drawable/ic_pause_light.xml rename to app/src/main/res/drawable/ic_pause_light.xml diff --git a/res/drawable/ic_people_add_light.xml b/app/src/main/res/drawable/ic_people_add_light.xml similarity index 100% rename from res/drawable/ic_people_add_light.xml rename to app/src/main/res/drawable/ic_people_add_light.xml diff --git a/res/drawable/ic_person_add_light.xml b/app/src/main/res/drawable/ic_person_add_light.xml similarity index 100% rename from res/drawable/ic_person_add_light.xml rename to app/src/main/res/drawable/ic_person_add_light.xml diff --git a/res/drawable/ic_person_light.xml b/app/src/main/res/drawable/ic_person_light.xml similarity index 100% rename from res/drawable/ic_person_light.xml rename to app/src/main/res/drawable/ic_person_light.xml diff --git a/res/drawable/ic_phone_small_light.xml b/app/src/main/res/drawable/ic_phone_small_light.xml similarity index 100% rename from res/drawable/ic_phone_small_light.xml rename to app/src/main/res/drawable/ic_phone_small_light.xml diff --git a/res/drawable/ic_play_light.xml b/app/src/main/res/drawable/ic_play_light.xml similarity index 100% rename from res/drawable/ic_play_light.xml rename to app/src/main/res/drawable/ic_play_light.xml diff --git a/res/drawable/ic_save_light.xml b/app/src/main/res/drawable/ic_save_light.xml similarity index 100% rename from res/drawable/ic_save_light.xml rename to app/src/main/res/drawable/ic_save_light.xml diff --git a/res/drawable/ic_send_light.xml b/app/src/main/res/drawable/ic_send_light.xml similarity index 100% rename from res/drawable/ic_send_light.xml rename to app/src/main/res/drawable/ic_send_light.xml diff --git a/res/drawable/ic_share_light.xml b/app/src/main/res/drawable/ic_share_light.xml similarity index 100% rename from res/drawable/ic_share_light.xml rename to app/src/main/res/drawable/ic_share_light.xml diff --git a/res/drawable/ic_sms_light.xml b/app/src/main/res/drawable/ic_sms_light.xml similarity index 100% rename from res/drawable/ic_sms_light.xml rename to app/src/main/res/drawable/ic_sms_light.xml diff --git a/res/drawable/ic_wear_reply.xml b/app/src/main/res/drawable/ic_wear_reply.xml similarity index 100% rename from res/drawable/ic_wear_reply.xml rename to app/src/main/res/drawable/ic_wear_reply.xml diff --git a/res/drawable/ic_widget_list.xml b/app/src/main/res/drawable/ic_widget_list.xml similarity index 100% rename from res/drawable/ic_widget_list.xml rename to app/src/main/res/drawable/ic_widget_list.xml diff --git a/res/drawable/ic_work_profile.xml b/app/src/main/res/drawable/ic_work_profile.xml similarity index 100% rename from res/drawable/ic_work_profile.xml rename to app/src/main/res/drawable/ic_work_profile.xml diff --git a/app/src/main/res/drawable/looply_bg_avatar_placeholder.xml b/app/src/main/res/drawable/looply_bg_avatar_placeholder.xml new file mode 100644 index 0000000..69409ba --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_avatar_placeholder.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/looply_bg_badge.xml b/app/src/main/res/drawable/looply_bg_badge.xml new file mode 100644 index 0000000..2a878ed --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_badge.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/looply_bg_bubble_incoming.xml b/app/src/main/res/drawable/looply_bg_bubble_incoming.xml new file mode 100644 index 0000000..ab79f15 --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_bubble_incoming.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/app/src/main/res/drawable/looply_bg_bubble_outgoing.xml b/app/src/main/res/drawable/looply_bg_bubble_outgoing.xml new file mode 100644 index 0000000..9a0afc1 --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_bubble_outgoing.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/app/src/main/res/drawable/looply_bg_button_primary.xml b/app/src/main/res/drawable/looply_bg_button_primary.xml new file mode 100644 index 0000000..cc09bc8 --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_button_primary.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/looply_bg_button_secondary.xml b/app/src/main/res/drawable/looply_bg_button_secondary.xml new file mode 100644 index 0000000..e4e6617 --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_button_secondary.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/looply_bg_card.xml b/app/src/main/res/drawable/looply_bg_card.xml new file mode 100644 index 0000000..e1a202c --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_card.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/looply_bg_chip_active.xml b/app/src/main/res/drawable/looply_bg_chip_active.xml new file mode 100644 index 0000000..cc09bc8 --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_chip_active.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/looply_bg_chip_inactive.xml b/app/src/main/res/drawable/looply_bg_chip_inactive.xml new file mode 100644 index 0000000..42e7158 --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_chip_inactive.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/looply_bg_fab.xml b/app/src/main/res/drawable/looply_bg_fab.xml new file mode 100644 index 0000000..adc4f00 --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_fab.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/looply_bg_fab_square.xml b/app/src/main/res/drawable/looply_bg_fab_square.xml new file mode 100644 index 0000000..9fcd66b --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_fab_square.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/looply_bg_input.xml b/app/src/main/res/drawable/looply_bg_input.xml new file mode 100644 index 0000000..cdb43e8 --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_input.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/app/src/main/res/drawable/looply_bg_list_card.xml b/app/src/main/res/drawable/looply_bg_list_card.xml new file mode 100644 index 0000000..e1a202c --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_list_card.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/looply_bg_list_sheet.xml b/app/src/main/res/drawable/looply_bg_list_sheet.xml new file mode 100644 index 0000000..3846574 --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_list_sheet.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/app/src/main/res/drawable/looply_bg_nav_active_circle.xml b/app/src/main/res/drawable/looply_bg_nav_active_circle.xml new file mode 100644 index 0000000..adc4f00 --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_nav_active_circle.xml @@ -0,0 +1,5 @@ + + + + diff --git a/app/src/main/res/drawable/looply_bg_nav_active_pill.xml b/app/src/main/res/drawable/looply_bg_nav_active_pill.xml new file mode 100644 index 0000000..cc09bc8 --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_nav_active_pill.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/app/src/main/res/drawable/looply_bg_nav_floating_pill.xml b/app/src/main/res/drawable/looply_bg_nav_floating_pill.xml new file mode 100644 index 0000000..8c37cc6 --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_nav_floating_pill.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/app/src/main/res/drawable/looply_bg_online_dot.xml b/app/src/main/res/drawable/looply_bg_online_dot.xml new file mode 100644 index 0000000..57affc7 --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_online_dot.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/app/src/main/res/drawable/looply_bg_search.xml b/app/src/main/res/drawable/looply_bg_search.xml new file mode 100644 index 0000000..a2cf68a --- /dev/null +++ b/app/src/main/res/drawable/looply_bg_search.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/res/drawable/mediapicker_tab_button_background.xml b/app/src/main/res/drawable/mediapicker_tab_button_background.xml similarity index 100% rename from res/drawable/mediapicker_tab_button_background.xml rename to app/src/main/res/drawable/mediapicker_tab_button_background.xml diff --git a/res/drawable/message_bubble_incoming_no_arrow.xml b/app/src/main/res/drawable/message_bubble_incoming_no_arrow.xml similarity index 82% rename from res/drawable/message_bubble_incoming_no_arrow.xml rename to app/src/main/res/drawable/message_bubble_incoming_no_arrow.xml index 050da48..496743d 100644 --- a/res/drawable/message_bubble_incoming_no_arrow.xml +++ b/app/src/main/res/drawable/message_bubble_incoming_no_arrow.xml @@ -16,5 +16,9 @@ --> - + diff --git a/res/drawable/message_bubble_outgoing_no_arrow.xml b/app/src/main/res/drawable/message_bubble_outgoing_no_arrow.xml similarity index 82% rename from res/drawable/message_bubble_outgoing_no_arrow.xml rename to app/src/main/res/drawable/message_bubble_outgoing_no_arrow.xml index 050da48..0be7049 100644 --- a/res/drawable/message_bubble_outgoing_no_arrow.xml +++ b/app/src/main/res/drawable/message_bubble_outgoing_no_arrow.xml @@ -16,5 +16,9 @@ --> - + diff --git a/res/drawable/msg_bubble_input_rounded.xml b/app/src/main/res/drawable/msg_bubble_input_rounded.xml similarity index 100% rename from res/drawable/msg_bubble_input_rounded.xml rename to app/src/main/res/drawable/msg_bubble_input_rounded.xml diff --git a/res/drawable/send_arrow_background.xml b/app/src/main/res/drawable/send_arrow_background.xml similarity index 100% rename from res/drawable/send_arrow_background.xml rename to app/src/main/res/drawable/send_arrow_background.xml diff --git a/res/drawable/sim_selector_background_gradient.xml b/app/src/main/res/drawable/sim_selector_background_gradient.xml similarity index 100% rename from res/drawable/sim_selector_background_gradient.xml rename to app/src/main/res/drawable/sim_selector_background_gradient.xml diff --git a/res/drawable/subject_editor_bubble.xml b/app/src/main/res/drawable/subject_editor_bubble.xml similarity index 100% rename from res/drawable/subject_editor_bubble.xml rename to app/src/main/res/drawable/subject_editor_bubble.xml diff --git a/res/drawable/transparent_button_background.xml b/app/src/main/res/drawable/transparent_button_background.xml similarity index 100% rename from res/drawable/transparent_button_background.xml rename to app/src/main/res/drawable/transparent_button_background.xml diff --git a/res/drawable/widget_bottom_background.xml b/app/src/main/res/drawable/widget_bottom_background.xml similarity index 100% rename from res/drawable/widget_bottom_background.xml rename to app/src/main/res/drawable/widget_bottom_background.xml diff --git a/res/drawable/widget_item_background.xml b/app/src/main/res/drawable/widget_item_background.xml similarity index 100% rename from res/drawable/widget_item_background.xml rename to app/src/main/res/drawable/widget_item_background.xml diff --git a/res/drawable/widget_top_background.xml b/app/src/main/res/drawable/widget_top_background.xml similarity index 100% rename from res/drawable/widget_top_background.xml rename to app/src/main/res/drawable/widget_top_background.xml diff --git a/res/layout/action_bar_conversation_name.xml b/app/src/main/res/layout/action_bar_conversation_name.xml similarity index 100% rename from res/layout/action_bar_conversation_name.xml rename to app/src/main/res/layout/action_bar_conversation_name.xml diff --git a/res/layout/add_contacts_confirmation_dialog_body.xml b/app/src/main/res/layout/add_contacts_confirmation_dialog_body.xml similarity index 100% rename from res/layout/add_contacts_confirmation_dialog_body.xml rename to app/src/main/res/layout/add_contacts_confirmation_dialog_body.xml diff --git a/res/layout/all_contacts_list_view.xml b/app/src/main/res/layout/all_contacts_list_view.xml similarity index 100% rename from res/layout/all_contacts_list_view.xml rename to app/src/main/res/layout/all_contacts_list_view.xml diff --git a/res/layout/attachment_chooser_activity.xml b/app/src/main/res/layout/attachment_chooser_activity.xml similarity index 100% rename from res/layout/attachment_chooser_activity.xml rename to app/src/main/res/layout/attachment_chooser_activity.xml diff --git a/res/layout/attachment_chooser_audio.xml b/app/src/main/res/layout/attachment_chooser_audio.xml similarity index 100% rename from res/layout/attachment_chooser_audio.xml rename to app/src/main/res/layout/attachment_chooser_audio.xml diff --git a/res/layout/attachment_chooser_fragment.xml b/app/src/main/res/layout/attachment_chooser_fragment.xml similarity index 100% rename from res/layout/attachment_chooser_fragment.xml rename to app/src/main/res/layout/attachment_chooser_fragment.xml diff --git a/res/layout/attachment_chooser_image.xml b/app/src/main/res/layout/attachment_chooser_image.xml similarity index 100% rename from res/layout/attachment_chooser_image.xml rename to app/src/main/res/layout/attachment_chooser_image.xml diff --git a/res/layout/attachment_chooser_vcard.xml b/app/src/main/res/layout/attachment_chooser_vcard.xml similarity index 100% rename from res/layout/attachment_chooser_vcard.xml rename to app/src/main/res/layout/attachment_chooser_vcard.xml diff --git a/res/layout/attachment_chooser_video.xml b/app/src/main/res/layout/attachment_chooser_video.xml similarity index 100% rename from res/layout/attachment_chooser_video.xml rename to app/src/main/res/layout/attachment_chooser_video.xml diff --git a/res/layout/attachment_grid_item_view.xml b/app/src/main/res/layout/attachment_grid_item_view.xml similarity index 100% rename from res/layout/attachment_grid_item_view.xml rename to app/src/main/res/layout/attachment_grid_item_view.xml diff --git a/res/layout/attachment_more_text_view.xml b/app/src/main/res/layout/attachment_more_text_view.xml similarity index 100% rename from res/layout/attachment_more_text_view.xml rename to app/src/main/res/layout/attachment_more_text_view.xml diff --git a/res/layout/attachment_multiple_audio.xml b/app/src/main/res/layout/attachment_multiple_audio.xml similarity index 100% rename from res/layout/attachment_multiple_audio.xml rename to app/src/main/res/layout/attachment_multiple_audio.xml diff --git a/res/layout/attachment_multiple_image.xml b/app/src/main/res/layout/attachment_multiple_image.xml similarity index 100% rename from res/layout/attachment_multiple_image.xml rename to app/src/main/res/layout/attachment_multiple_image.xml diff --git a/res/layout/attachment_multiple_vcard.xml b/app/src/main/res/layout/attachment_multiple_vcard.xml similarity index 100% rename from res/layout/attachment_multiple_vcard.xml rename to app/src/main/res/layout/attachment_multiple_vcard.xml diff --git a/res/layout/attachment_multiple_video.xml b/app/src/main/res/layout/attachment_multiple_video.xml similarity index 100% rename from res/layout/attachment_multiple_video.xml rename to app/src/main/res/layout/attachment_multiple_video.xml diff --git a/res/layout/attachment_pending_item.xml b/app/src/main/res/layout/attachment_pending_item.xml similarity index 100% rename from res/layout/attachment_pending_item.xml rename to app/src/main/res/layout/attachment_pending_item.xml diff --git a/res/layout/attachment_preview.xml b/app/src/main/res/layout/attachment_preview.xml similarity index 100% rename from res/layout/attachment_preview.xml rename to app/src/main/res/layout/attachment_preview.xml diff --git a/res/layout/attachment_single_audio.xml b/app/src/main/res/layout/attachment_single_audio.xml similarity index 100% rename from res/layout/attachment_single_audio.xml rename to app/src/main/res/layout/attachment_single_audio.xml diff --git a/res/layout/attachment_single_image.xml b/app/src/main/res/layout/attachment_single_image.xml similarity index 100% rename from res/layout/attachment_single_image.xml rename to app/src/main/res/layout/attachment_single_image.xml diff --git a/res/layout/attachment_single_vcard.xml b/app/src/main/res/layout/attachment_single_vcard.xml similarity index 100% rename from res/layout/attachment_single_vcard.xml rename to app/src/main/res/layout/attachment_single_vcard.xml diff --git a/res/layout/attachment_single_video.xml b/app/src/main/res/layout/attachment_single_video.xml similarity index 100% rename from res/layout/attachment_single_video.xml rename to app/src/main/res/layout/attachment_single_video.xml diff --git a/res/layout/audio_attachment_view.xml b/app/src/main/res/layout/audio_attachment_view.xml similarity index 100% rename from res/layout/audio_attachment_view.xml rename to app/src/main/res/layout/audio_attachment_view.xml diff --git a/res/layout/blocked_participant_list_item_view.xml b/app/src/main/res/layout/blocked_participant_list_item_view.xml similarity index 100% rename from res/layout/blocked_participant_list_item_view.xml rename to app/src/main/res/layout/blocked_participant_list_item_view.xml diff --git a/res/layout/blocked_participants_activity.xml b/app/src/main/res/layout/blocked_participants_activity.xml similarity index 100% rename from res/layout/blocked_participants_activity.xml rename to app/src/main/res/layout/blocked_participants_activity.xml diff --git a/res/layout/blocked_participants_fragment.xml b/app/src/main/res/layout/blocked_participants_fragment.xml similarity index 100% rename from res/layout/blocked_participants_fragment.xml rename to app/src/main/res/layout/blocked_participants_fragment.xml diff --git a/res/layout/chips_alternates_dropdown_item.xml b/app/src/main/res/layout/chips_alternates_dropdown_item.xml similarity index 100% rename from res/layout/chips_alternates_dropdown_item.xml rename to app/src/main/res/layout/chips_alternates_dropdown_item.xml diff --git a/res/layout/compose_message_view.xml b/app/src/main/res/layout/compose_message_view.xml similarity index 100% rename from res/layout/compose_message_view.xml rename to app/src/main/res/layout/compose_message_view.xml diff --git a/res/layout/contact_list_item_view.xml b/app/src/main/res/layout/contact_list_item_view.xml similarity index 61% rename from res/layout/contact_list_item_view.xml rename to app/src/main/res/layout/contact_list_item_view.xml index b321a9a..db2009b 100644 --- a/res/layout/contact_list_item_view.xml +++ b/app/src/main/res/layout/contact_list_item_view.xml @@ -18,20 +18,29 @@ + android:layout_marginStart="@dimen/looply_space_md" + android:layout_marginEnd="@dimen/looply_space_md" + android:layout_marginBottom="@dimen/looply_space_sm" + android:background="@drawable/looply_bg_list_card" + android:elevation="2dp" + android:gravity="center_vertical" + android:minHeight="@dimen/looply_list_item_min_height" + android:paddingStart="@dimen/looply_space_md" + android:paddingEnd="@dimen/looply_space_md" + android:paddingTop="@dimen/looply_space_md" + android:paddingBottom="@dimen/looply_space_md" + android:foreground="?android:attr/selectableItemBackground"> + android:contentDescription="@null"/> + android:layout_weight="1" + android:layout_gravity="center_vertical" + android:layout_marginStart="@dimen/looply_space_md" + android:layout_marginEnd="@dimen/looply_space_sm"> - + + android:maxLines="1" + android:singleLine="true" + android:textSize="@dimen/looply_text_body" + android:textStyle="bold" /> - + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/looply_space_xs" + android:gravity="center_vertical"> + android:maxLines="1" + android:singleLine="true" /> + android:layout_marginStart="@dimen/looply_space_sm" + android:textColor="@color/looply_primary" /> diff --git a/app/src/main/res/layout/contact_picker_fragment.xml b/app/src/main/res/layout/contact_picker_fragment.xml new file mode 100644 index 0000000..114e09a --- /dev/null +++ b/app/src/main/res/layout/contact_picker_fragment.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/layout/conversation_activity.xml b/app/src/main/res/layout/conversation_activity.xml similarity index 100% rename from res/layout/conversation_activity.xml rename to app/src/main/res/layout/conversation_activity.xml diff --git a/res/layout/conversation_fragment.xml b/app/src/main/res/layout/conversation_fragment.xml similarity index 100% rename from res/layout/conversation_fragment.xml rename to app/src/main/res/layout/conversation_fragment.xml diff --git a/app/src/main/res/layout/conversation_list_fragment.xml b/app/src/main/res/layout/conversation_list_fragment.xml new file mode 100644 index 0000000..bc36ab2 --- /dev/null +++ b/app/src/main/res/layout/conversation_list_fragment.xml @@ -0,0 +1,401 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/conversation_list_item_view.xml b/app/src/main/res/layout/conversation_list_item_view.xml new file mode 100644 index 0000000..3f48c67 --- /dev/null +++ b/app/src/main/res/layout/conversation_list_item_view.xml @@ -0,0 +1,302 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/layout/conversation_message_view.xml b/app/src/main/res/layout/conversation_message_view.xml similarity index 100% rename from res/layout/conversation_message_view.xml rename to app/src/main/res/layout/conversation_message_view.xml diff --git a/res/layout/copy_contact_dialog_view.xml b/app/src/main/res/layout/copy_contact_dialog_view.xml similarity index 100% rename from res/layout/copy_contact_dialog_view.xml rename to app/src/main/res/layout/copy_contact_dialog_view.xml diff --git a/res/layout/custom_header_view_pager.xml b/app/src/main/res/layout/custom_header_view_pager.xml similarity index 100% rename from res/layout/custom_header_view_pager.xml rename to app/src/main/res/layout/custom_header_view_pager.xml diff --git a/res/layout/enter_phone_number_view.xml b/app/src/main/res/layout/enter_phone_number_view.xml similarity index 100% rename from res/layout/enter_phone_number_view.xml rename to app/src/main/res/layout/enter_phone_number_view.xml diff --git a/res/layout/fastscroll_preview.xml b/app/src/main/res/layout/fastscroll_preview.xml similarity index 100% rename from res/layout/fastscroll_preview.xml rename to app/src/main/res/layout/fastscroll_preview.xml diff --git a/res/layout/fastscroll_thumb.xml b/app/src/main/res/layout/fastscroll_thumb.xml similarity index 100% rename from res/layout/fastscroll_thumb.xml rename to app/src/main/res/layout/fastscroll_thumb.xml diff --git a/res/layout/fastscroll_track.xml b/app/src/main/res/layout/fastscroll_track.xml similarity index 100% rename from res/layout/fastscroll_track.xml rename to app/src/main/res/layout/fastscroll_track.xml diff --git a/res/layout/frequent_contacts_list_view.xml b/app/src/main/res/layout/frequent_contacts_list_view.xml similarity index 100% rename from res/layout/frequent_contacts_list_view.xml rename to app/src/main/res/layout/frequent_contacts_list_view.xml diff --git a/res/layout/group_mms_setting_dialog.xml b/app/src/main/res/layout/group_mms_setting_dialog.xml similarity index 100% rename from res/layout/group_mms_setting_dialog.xml rename to app/src/main/res/layout/group_mms_setting_dialog.xml diff --git a/app/src/main/res/layout/home_bottom_nav_tab_item.xml b/app/src/main/res/layout/home_bottom_nav_tab_item.xml new file mode 100644 index 0000000..2723f1f --- /dev/null +++ b/app/src/main/res/layout/home_bottom_nav_tab_item.xml @@ -0,0 +1,39 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/home_contacts_fragment.xml b/app/src/main/res/layout/home_contacts_fragment.xml new file mode 100644 index 0000000..80b9170 --- /dev/null +++ b/app/src/main/res/layout/home_contacts_fragment.xml @@ -0,0 +1,180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/home_contacts_list_item.xml b/app/src/main/res/layout/home_contacts_list_item.xml new file mode 100644 index 0000000..4d86ea8 --- /dev/null +++ b/app/src/main/res/layout/home_contacts_list_item.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/home_pinned_item.xml b/app/src/main/res/layout/home_pinned_item.xml new file mode 100644 index 0000000..f4b032a --- /dev/null +++ b/app/src/main/res/layout/home_pinned_item.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/home_pinned_strip.xml b/app/src/main/res/layout/home_pinned_strip.xml new file mode 100644 index 0000000..67af1d0 --- /dev/null +++ b/app/src/main/res/layout/home_pinned_strip.xml @@ -0,0 +1,21 @@ + + + + + diff --git a/app/src/main/res/layout/home_popover_edit.xml b/app/src/main/res/layout/home_popover_edit.xml new file mode 100644 index 0000000..9565907 --- /dev/null +++ b/app/src/main/res/layout/home_popover_edit.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/home_popover_filter.xml b/app/src/main/res/layout/home_popover_filter.xml new file mode 100644 index 0000000..c29238b --- /dev/null +++ b/app/src/main/res/layout/home_popover_filter.xml @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/layout/license_activity.xml b/app/src/main/res/layout/license_activity.xml similarity index 100% rename from res/layout/license_activity.xml rename to app/src/main/res/layout/license_activity.xml diff --git a/res/layout/list_empty_view.xml b/app/src/main/res/layout/list_empty_view.xml similarity index 100% rename from res/layout/list_empty_view.xml rename to app/src/main/res/layout/list_empty_view.xml diff --git a/app/src/main/res/layout/looply_bottom_nav.xml b/app/src/main/res/layout/looply_bottom_nav.xml new file mode 100644 index 0000000..069f33a --- /dev/null +++ b/app/src/main/res/layout/looply_bottom_nav.xml @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/looply_button_primary.xml b/app/src/main/res/layout/looply_button_primary.xml new file mode 100644 index 0000000..f96869b --- /dev/null +++ b/app/src/main/res/layout/looply_button_primary.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/layout/looply_chat_list_item.xml b/app/src/main/res/layout/looply_chat_list_item.xml new file mode 100644 index 0000000..0ce79cb --- /dev/null +++ b/app/src/main/res/layout/looply_chat_list_item.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/looply_components_preview.xml b/app/src/main/res/layout/looply_components_preview.xml new file mode 100644 index 0000000..2b1f139 --- /dev/null +++ b/app/src/main/res/layout/looply_components_preview.xml @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/looply_compose_bar.xml b/app/src/main/res/layout/looply_compose_bar.xml new file mode 100644 index 0000000..7b54aa9 --- /dev/null +++ b/app/src/main/res/layout/looply_compose_bar.xml @@ -0,0 +1,33 @@ + + + + + + + + diff --git a/app/src/main/res/layout/looply_filter_chips.xml b/app/src/main/res/layout/looply_filter_chips.xml new file mode 100644 index 0000000..5f467e1 --- /dev/null +++ b/app/src/main/res/layout/looply_filter_chips.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/looply_message_bubbles.xml b/app/src/main/res/layout/looply_message_bubbles.xml new file mode 100644 index 0000000..e0e58bb --- /dev/null +++ b/app/src/main/res/layout/looply_message_bubbles.xml @@ -0,0 +1,27 @@ + + + + + + + + diff --git a/app/src/main/res/layout/looply_search_bar.xml b/app/src/main/res/layout/looply_search_bar.xml new file mode 100644 index 0000000..a759d78 --- /dev/null +++ b/app/src/main/res/layout/looply_search_bar.xml @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/res/layout/mediapicker_audio_chooser.xml b/app/src/main/res/layout/mediapicker_audio_chooser.xml similarity index 100% rename from res/layout/mediapicker_audio_chooser.xml rename to app/src/main/res/layout/mediapicker_audio_chooser.xml diff --git a/res/layout/mediapicker_camera_chooser.xml b/app/src/main/res/layout/mediapicker_camera_chooser.xml similarity index 100% rename from res/layout/mediapicker_camera_chooser.xml rename to app/src/main/res/layout/mediapicker_camera_chooser.xml diff --git a/res/layout/mediapicker_contact_chooser.xml b/app/src/main/res/layout/mediapicker_contact_chooser.xml similarity index 100% rename from res/layout/mediapicker_contact_chooser.xml rename to app/src/main/res/layout/mediapicker_contact_chooser.xml diff --git a/res/layout/mediapicker_fragment.xml b/app/src/main/res/layout/mediapicker_fragment.xml similarity index 100% rename from res/layout/mediapicker_fragment.xml rename to app/src/main/res/layout/mediapicker_fragment.xml diff --git a/res/layout/mediapicker_gallery_chooser.xml b/app/src/main/res/layout/mediapicker_gallery_chooser.xml similarity index 100% rename from res/layout/mediapicker_gallery_chooser.xml rename to app/src/main/res/layout/mediapicker_gallery_chooser.xml diff --git a/res/layout/mediapicker_tab_button.xml b/app/src/main/res/layout/mediapicker_tab_button.xml similarity index 100% rename from res/layout/mediapicker_tab_button.xml rename to app/src/main/res/layout/mediapicker_tab_button.xml diff --git a/res/layout/message_audio_attachment.xml b/app/src/main/res/layout/message_audio_attachment.xml similarity index 100% rename from res/layout/message_audio_attachment.xml rename to app/src/main/res/layout/message_audio_attachment.xml diff --git a/res/layout/message_vcard_attachment.xml b/app/src/main/res/layout/message_vcard_attachment.xml similarity index 100% rename from res/layout/message_vcard_attachment.xml rename to app/src/main/res/layout/message_vcard_attachment.xml diff --git a/res/layout/message_video_attachment.xml b/app/src/main/res/layout/message_video_attachment.xml similarity index 100% rename from res/layout/message_video_attachment.xml rename to app/src/main/res/layout/message_video_attachment.xml diff --git a/res/layout/people_and_options_activity.xml b/app/src/main/res/layout/people_and_options_activity.xml similarity index 100% rename from res/layout/people_and_options_activity.xml rename to app/src/main/res/layout/people_and_options_activity.xml diff --git a/res/layout/people_and_options_fragment.xml b/app/src/main/res/layout/people_and_options_fragment.xml similarity index 100% rename from res/layout/people_and_options_fragment.xml rename to app/src/main/res/layout/people_and_options_fragment.xml diff --git a/res/layout/people_and_options_section_header.xml b/app/src/main/res/layout/people_and_options_section_header.xml similarity index 100% rename from res/layout/people_and_options_section_header.xml rename to app/src/main/res/layout/people_and_options_section_header.xml diff --git a/res/layout/people_list_item_view.xml b/app/src/main/res/layout/people_list_item_view.xml similarity index 100% rename from res/layout/people_list_item_view.xml rename to app/src/main/res/layout/people_list_item_view.xml diff --git a/res/layout/people_options_item_view.xml b/app/src/main/res/layout/people_options_item_view.xml similarity index 100% rename from res/layout/people_options_item_view.xml rename to app/src/main/res/layout/people_options_item_view.xml diff --git a/res/layout/permission_check_activity.xml b/app/src/main/res/layout/permission_check_activity.xml similarity index 100% rename from res/layout/permission_check_activity.xml rename to app/src/main/res/layout/permission_check_activity.xml diff --git a/res/layout/person_item_view.xml b/app/src/main/res/layout/person_item_view.xml similarity index 100% rename from res/layout/person_item_view.xml rename to app/src/main/res/layout/person_item_view.xml diff --git a/res/layout/preference_material_switch.xml b/app/src/main/res/layout/preference_material_switch.xml similarity index 100% rename from res/layout/preference_material_switch.xml rename to app/src/main/res/layout/preference_material_switch.xml diff --git a/res/layout/settings_fragment.xml b/app/src/main/res/layout/settings_fragment.xml similarity index 100% rename from res/layout/settings_fragment.xml rename to app/src/main/res/layout/settings_fragment.xml diff --git a/res/layout/settings_item_view.xml b/app/src/main/res/layout/settings_item_view.xml similarity index 100% rename from res/layout/settings_item_view.xml rename to app/src/main/res/layout/settings_item_view.xml diff --git a/res/layout/share_intent_conversation_list_view.xml b/app/src/main/res/layout/share_intent_conversation_list_view.xml similarity index 100% rename from res/layout/share_intent_conversation_list_view.xml rename to app/src/main/res/layout/share_intent_conversation_list_view.xml diff --git a/res/layout/sim_selector_item_view.xml b/app/src/main/res/layout/sim_selector_item_view.xml similarity index 100% rename from res/layout/sim_selector_item_view.xml rename to app/src/main/res/layout/sim_selector_item_view.xml diff --git a/res/layout/sim_selector_view.xml b/app/src/main/res/layout/sim_selector_view.xml similarity index 100% rename from res/layout/sim_selector_view.xml rename to app/src/main/res/layout/sim_selector_view.xml diff --git a/res/layout/snack_bar.xml b/app/src/main/res/layout/snack_bar.xml similarity index 100% rename from res/layout/snack_bar.xml rename to app/src/main/res/layout/snack_bar.xml diff --git a/res/layout/vcard_detail_activity.xml b/app/src/main/res/layout/vcard_detail_activity.xml similarity index 100% rename from res/layout/vcard_detail_activity.xml rename to app/src/main/res/layout/vcard_detail_activity.xml diff --git a/res/layout/vcard_detail_fragment.xml b/app/src/main/res/layout/vcard_detail_fragment.xml similarity index 100% rename from res/layout/vcard_detail_fragment.xml rename to app/src/main/res/layout/vcard_detail_fragment.xml diff --git a/res/layout/video_thumbnail_view.xml b/app/src/main/res/layout/video_thumbnail_view.xml similarity index 100% rename from res/layout/video_thumbnail_view.xml rename to app/src/main/res/layout/video_thumbnail_view.xml diff --git a/res/layout/widget_conversation.xml b/app/src/main/res/layout/widget_conversation.xml similarity index 100% rename from res/layout/widget_conversation.xml rename to app/src/main/res/layout/widget_conversation.xml diff --git a/res/layout/widget_conversation_list.xml b/app/src/main/res/layout/widget_conversation_list.xml similarity index 100% rename from res/layout/widget_conversation_list.xml rename to app/src/main/res/layout/widget_conversation_list.xml diff --git a/res/layout/widget_conversation_list_item.xml b/app/src/main/res/layout/widget_conversation_list_item.xml similarity index 100% rename from res/layout/widget_conversation_list_item.xml rename to app/src/main/res/layout/widget_conversation_list_item.xml diff --git a/res/layout/widget_loading.xml b/app/src/main/res/layout/widget_loading.xml similarity index 100% rename from res/layout/widget_loading.xml rename to app/src/main/res/layout/widget_loading.xml diff --git a/res/layout/widget_message_item_incoming.xml b/app/src/main/res/layout/widget_message_item_incoming.xml similarity index 100% rename from res/layout/widget_message_item_incoming.xml rename to app/src/main/res/layout/widget_message_item_incoming.xml diff --git a/res/layout/widget_message_item_outgoing.xml b/app/src/main/res/layout/widget_message_item_outgoing.xml similarity index 100% rename from res/layout/widget_message_item_outgoing.xml rename to app/src/main/res/layout/widget_message_item_outgoing.xml diff --git a/res/layout/widget_missing_permission.xml b/app/src/main/res/layout/widget_missing_permission.xml similarity index 100% rename from res/layout/widget_missing_permission.xml rename to app/src/main/res/layout/widget_missing_permission.xml diff --git a/res/layout/work_directory_header.xml b/app/src/main/res/layout/work_directory_header.xml similarity index 100% rename from res/layout/work_directory_header.xml rename to app/src/main/res/layout/work_directory_header.xml diff --git a/res/menu/attachment_chooser_menu.xml b/app/src/main/res/menu/attachment_chooser_menu.xml similarity index 100% rename from res/menu/attachment_chooser_menu.xml rename to app/src/main/res/menu/attachment_chooser_menu.xml diff --git a/res/menu/compose_menu.xml b/app/src/main/res/menu/compose_menu.xml similarity index 100% rename from res/menu/compose_menu.xml rename to app/src/main/res/menu/compose_menu.xml diff --git a/res/menu/conversation_fragment_select_menu.xml b/app/src/main/res/menu/conversation_fragment_select_menu.xml similarity index 100% rename from res/menu/conversation_fragment_select_menu.xml rename to app/src/main/res/menu/conversation_fragment_select_menu.xml diff --git a/res/menu/conversation_list_fragment_menu.xml b/app/src/main/res/menu/conversation_list_fragment_menu.xml similarity index 100% rename from res/menu/conversation_list_fragment_menu.xml rename to app/src/main/res/menu/conversation_list_fragment_menu.xml diff --git a/res/menu/conversation_list_fragment_select_menu.xml b/app/src/main/res/menu/conversation_list_fragment_select_menu.xml similarity index 100% rename from res/menu/conversation_list_fragment_select_menu.xml rename to app/src/main/res/menu/conversation_list_fragment_select_menu.xml diff --git a/res/menu/conversation_menu.xml b/app/src/main/res/menu/conversation_menu.xml similarity index 100% rename from res/menu/conversation_menu.xml rename to app/src/main/res/menu/conversation_menu.xml diff --git a/res/menu/photo_view_menu.xml b/app/src/main/res/menu/photo_view_menu.xml similarity index 100% rename from res/menu/photo_view_menu.xml rename to app/src/main/res/menu/photo_view_menu.xml diff --git a/res/menu/settings_menu.xml b/app/src/main/res/menu/settings_menu.xml similarity index 100% rename from res/menu/settings_menu.xml rename to app/src/main/res/menu/settings_menu.xml diff --git a/res/menu/vcard_detail_fragment_menu.xml b/app/src/main/res/menu/vcard_detail_fragment_menu.xml similarity index 100% rename from res/menu/vcard_detail_fragment_menu.xml rename to app/src/main/res/menu/vcard_detail_fragment_menu.xml diff --git a/res/mipmap-anydpi/ic_launcher.xml b/app/src/main/res/mipmap-anydpi/ic_launcher.xml similarity index 100% rename from res/mipmap-anydpi/ic_launcher.xml rename to app/src/main/res/mipmap-anydpi/ic_launcher.xml diff --git a/res/raw/audio_end.wav b/app/src/main/res/raw/audio_end.wav similarity index 100% rename from res/raw/audio_end.wav rename to app/src/main/res/raw/audio_end.wav diff --git a/res/raw/audio_initiate.wav b/app/src/main/res/raw/audio_initiate.wav similarity index 100% rename from res/raw/audio_initiate.wav rename to app/src/main/res/raw/audio_initiate.wav diff --git a/res/raw/message_failure.wav b/app/src/main/res/raw/message_failure.wav similarity index 100% rename from res/raw/message_failure.wav rename to app/src/main/res/raw/message_failure.wav diff --git a/res/raw/message_sent.wav b/app/src/main/res/raw/message_sent.wav similarity index 100% rename from res/raw/message_sent.wav rename to app/src/main/res/raw/message_sent.wav diff --git a/res/values-af/arrays.xml b/app/src/main/res/values-af/arrays.xml similarity index 100% rename from res/values-af/arrays.xml rename to app/src/main/res/values-af/arrays.xml diff --git a/res/values-af/cm_strings.xml b/app/src/main/res/values-af/cm_strings.xml similarity index 100% rename from res/values-af/cm_strings.xml rename to app/src/main/res/values-af/cm_strings.xml diff --git a/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml similarity index 100% rename from res/values-af/strings.xml rename to app/src/main/res/values-af/strings.xml diff --git a/res/values-am/arrays.xml b/app/src/main/res/values-am/arrays.xml similarity index 100% rename from res/values-am/arrays.xml rename to app/src/main/res/values-am/arrays.xml diff --git a/res/values-am/strings.xml b/app/src/main/res/values-am/strings.xml similarity index 100% rename from res/values-am/strings.xml rename to app/src/main/res/values-am/strings.xml diff --git a/res/values-ar/arrays.xml b/app/src/main/res/values-ar/arrays.xml similarity index 100% rename from res/values-ar/arrays.xml rename to app/src/main/res/values-ar/arrays.xml diff --git a/res/values-ar/cm_strings.xml b/app/src/main/res/values-ar/cm_strings.xml similarity index 100% rename from res/values-ar/cm_strings.xml rename to app/src/main/res/values-ar/cm_strings.xml diff --git a/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml similarity index 100% rename from res/values-ar/strings.xml rename to app/src/main/res/values-ar/strings.xml diff --git a/res/values-as/cm_strings.xml b/app/src/main/res/values-as/cm_strings.xml similarity index 100% rename from res/values-as/cm_strings.xml rename to app/src/main/res/values-as/cm_strings.xml diff --git a/res/values-ast-rES/cm_strings.xml b/app/src/main/res/values-ast-rES/cm_strings.xml similarity index 100% rename from res/values-ast-rES/cm_strings.xml rename to app/src/main/res/values-ast-rES/cm_strings.xml diff --git a/res/values-az/arrays.xml b/app/src/main/res/values-az/arrays.xml similarity index 100% rename from res/values-az/arrays.xml rename to app/src/main/res/values-az/arrays.xml diff --git a/res/values-az/cm_strings.xml b/app/src/main/res/values-az/cm_strings.xml similarity index 100% rename from res/values-az/cm_strings.xml rename to app/src/main/res/values-az/cm_strings.xml diff --git a/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml similarity index 100% rename from res/values-az/strings.xml rename to app/src/main/res/values-az/strings.xml diff --git a/res/values-be/cm_strings.xml b/app/src/main/res/values-be/cm_strings.xml similarity index 100% rename from res/values-be/cm_strings.xml rename to app/src/main/res/values-be/cm_strings.xml diff --git a/res/values-bg/arrays.xml b/app/src/main/res/values-bg/arrays.xml similarity index 100% rename from res/values-bg/arrays.xml rename to app/src/main/res/values-bg/arrays.xml diff --git a/res/values-bg/cm_strings.xml b/app/src/main/res/values-bg/cm_strings.xml similarity index 100% rename from res/values-bg/cm_strings.xml rename to app/src/main/res/values-bg/cm_strings.xml diff --git a/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml similarity index 100% rename from res/values-bg/strings.xml rename to app/src/main/res/values-bg/strings.xml diff --git a/res/values-bn/arrays.xml b/app/src/main/res/values-bn/arrays.xml similarity index 100% rename from res/values-bn/arrays.xml rename to app/src/main/res/values-bn/arrays.xml diff --git a/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml similarity index 100% rename from res/values-bn/strings.xml rename to app/src/main/res/values-bn/strings.xml diff --git a/res/values-bs/cm_strings.xml b/app/src/main/res/values-bs/cm_strings.xml similarity index 100% rename from res/values-bs/cm_strings.xml rename to app/src/main/res/values-bs/cm_strings.xml diff --git a/res/values-ca/arrays.xml b/app/src/main/res/values-ca/arrays.xml similarity index 100% rename from res/values-ca/arrays.xml rename to app/src/main/res/values-ca/arrays.xml diff --git a/res/values-ca/cm_strings.xml b/app/src/main/res/values-ca/cm_strings.xml similarity index 100% rename from res/values-ca/cm_strings.xml rename to app/src/main/res/values-ca/cm_strings.xml diff --git a/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml similarity index 100% rename from res/values-ca/strings.xml rename to app/src/main/res/values-ca/strings.xml diff --git a/res/values-ckb/cm_strings.xml b/app/src/main/res/values-ckb/cm_strings.xml similarity index 100% rename from res/values-ckb/cm_strings.xml rename to app/src/main/res/values-ckb/cm_strings.xml diff --git a/res/values-cs/arrays.xml b/app/src/main/res/values-cs/arrays.xml similarity index 100% rename from res/values-cs/arrays.xml rename to app/src/main/res/values-cs/arrays.xml diff --git a/res/values-cs/cm_strings.xml b/app/src/main/res/values-cs/cm_strings.xml similarity index 100% rename from res/values-cs/cm_strings.xml rename to app/src/main/res/values-cs/cm_strings.xml diff --git a/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml similarity index 100% rename from res/values-cs/strings.xml rename to app/src/main/res/values-cs/strings.xml diff --git a/res/values-cy/cm_strings.xml b/app/src/main/res/values-cy/cm_strings.xml similarity index 100% rename from res/values-cy/cm_strings.xml rename to app/src/main/res/values-cy/cm_strings.xml diff --git a/res/values-da/arrays.xml b/app/src/main/res/values-da/arrays.xml similarity index 100% rename from res/values-da/arrays.xml rename to app/src/main/res/values-da/arrays.xml diff --git a/res/values-da/cm_strings.xml b/app/src/main/res/values-da/cm_strings.xml similarity index 100% rename from res/values-da/cm_strings.xml rename to app/src/main/res/values-da/cm_strings.xml diff --git a/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml similarity index 100% rename from res/values-da/strings.xml rename to app/src/main/res/values-da/strings.xml diff --git a/res/values-de/arrays.xml b/app/src/main/res/values-de/arrays.xml similarity index 100% rename from res/values-de/arrays.xml rename to app/src/main/res/values-de/arrays.xml diff --git a/res/values-de/cm_strings.xml b/app/src/main/res/values-de/cm_strings.xml similarity index 100% rename from res/values-de/cm_strings.xml rename to app/src/main/res/values-de/cm_strings.xml diff --git a/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml similarity index 100% rename from res/values-de/strings.xml rename to app/src/main/res/values-de/strings.xml diff --git a/res/values-el/arrays.xml b/app/src/main/res/values-el/arrays.xml similarity index 100% rename from res/values-el/arrays.xml rename to app/src/main/res/values-el/arrays.xml diff --git a/res/values-el/cm_strings.xml b/app/src/main/res/values-el/cm_strings.xml similarity index 100% rename from res/values-el/cm_strings.xml rename to app/src/main/res/values-el/cm_strings.xml diff --git a/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml similarity index 100% rename from res/values-el/strings.xml rename to app/src/main/res/values-el/strings.xml diff --git a/res/values-en-rAU/arrays.xml b/app/src/main/res/values-en-rAU/arrays.xml similarity index 100% rename from res/values-en-rAU/arrays.xml rename to app/src/main/res/values-en-rAU/arrays.xml diff --git a/res/values-en-rAU/cm_strings.xml b/app/src/main/res/values-en-rAU/cm_strings.xml similarity index 100% rename from res/values-en-rAU/cm_strings.xml rename to app/src/main/res/values-en-rAU/cm_strings.xml diff --git a/res/values-en-rAU/strings.xml b/app/src/main/res/values-en-rAU/strings.xml similarity index 100% rename from res/values-en-rAU/strings.xml rename to app/src/main/res/values-en-rAU/strings.xml diff --git a/res/values-en-rCA/cm_strings.xml b/app/src/main/res/values-en-rCA/cm_strings.xml similarity index 100% rename from res/values-en-rCA/cm_strings.xml rename to app/src/main/res/values-en-rCA/cm_strings.xml diff --git a/res/values-en-rGB/arrays.xml b/app/src/main/res/values-en-rGB/arrays.xml similarity index 100% rename from res/values-en-rGB/arrays.xml rename to app/src/main/res/values-en-rGB/arrays.xml diff --git a/res/values-en-rGB/cm_strings.xml b/app/src/main/res/values-en-rGB/cm_strings.xml similarity index 100% rename from res/values-en-rGB/cm_strings.xml rename to app/src/main/res/values-en-rGB/cm_strings.xml diff --git a/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml similarity index 100% rename from res/values-en-rGB/strings.xml rename to app/src/main/res/values-en-rGB/strings.xml diff --git a/res/values-en-rIN/arrays.xml b/app/src/main/res/values-en-rIN/arrays.xml similarity index 100% rename from res/values-en-rIN/arrays.xml rename to app/src/main/res/values-en-rIN/arrays.xml diff --git a/res/values-en-rIN/cm_strings.xml b/app/src/main/res/values-en-rIN/cm_strings.xml similarity index 100% rename from res/values-en-rIN/cm_strings.xml rename to app/src/main/res/values-en-rIN/cm_strings.xml diff --git a/res/values-en-rIN/strings.xml b/app/src/main/res/values-en-rIN/strings.xml similarity index 100% rename from res/values-en-rIN/strings.xml rename to app/src/main/res/values-en-rIN/strings.xml diff --git a/res/values-es-rMX/cm_strings.xml b/app/src/main/res/values-es-rMX/cm_strings.xml similarity index 100% rename from res/values-es-rMX/cm_strings.xml rename to app/src/main/res/values-es-rMX/cm_strings.xml diff --git a/res/values-es-rUS/arrays.xml b/app/src/main/res/values-es-rUS/arrays.xml similarity index 100% rename from res/values-es-rUS/arrays.xml rename to app/src/main/res/values-es-rUS/arrays.xml diff --git a/res/values-es-rUS/cm_strings.xml b/app/src/main/res/values-es-rUS/cm_strings.xml similarity index 100% rename from res/values-es-rUS/cm_strings.xml rename to app/src/main/res/values-es-rUS/cm_strings.xml diff --git a/res/values-es-rUS/strings.xml b/app/src/main/res/values-es-rUS/strings.xml similarity index 100% rename from res/values-es-rUS/strings.xml rename to app/src/main/res/values-es-rUS/strings.xml diff --git a/res/values-es/arrays.xml b/app/src/main/res/values-es/arrays.xml similarity index 100% rename from res/values-es/arrays.xml rename to app/src/main/res/values-es/arrays.xml diff --git a/res/values-es/cm_strings.xml b/app/src/main/res/values-es/cm_strings.xml similarity index 100% rename from res/values-es/cm_strings.xml rename to app/src/main/res/values-es/cm_strings.xml diff --git a/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml similarity index 100% rename from res/values-es/strings.xml rename to app/src/main/res/values-es/strings.xml diff --git a/res/values-et/arrays.xml b/app/src/main/res/values-et/arrays.xml similarity index 100% rename from res/values-et/arrays.xml rename to app/src/main/res/values-et/arrays.xml diff --git a/res/values-et/cm_strings.xml b/app/src/main/res/values-et/cm_strings.xml similarity index 100% rename from res/values-et/cm_strings.xml rename to app/src/main/res/values-et/cm_strings.xml diff --git a/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml similarity index 100% rename from res/values-et/strings.xml rename to app/src/main/res/values-et/strings.xml diff --git a/res/values-eu/arrays.xml b/app/src/main/res/values-eu/arrays.xml similarity index 100% rename from res/values-eu/arrays.xml rename to app/src/main/res/values-eu/arrays.xml diff --git a/res/values-eu/cm_strings.xml b/app/src/main/res/values-eu/cm_strings.xml similarity index 100% rename from res/values-eu/cm_strings.xml rename to app/src/main/res/values-eu/cm_strings.xml diff --git a/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml similarity index 100% rename from res/values-eu/strings.xml rename to app/src/main/res/values-eu/strings.xml diff --git a/res/values-fa/arrays.xml b/app/src/main/res/values-fa/arrays.xml similarity index 100% rename from res/values-fa/arrays.xml rename to app/src/main/res/values-fa/arrays.xml diff --git a/res/values-fa/cm_strings.xml b/app/src/main/res/values-fa/cm_strings.xml similarity index 100% rename from res/values-fa/cm_strings.xml rename to app/src/main/res/values-fa/cm_strings.xml diff --git a/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml similarity index 100% rename from res/values-fa/strings.xml rename to app/src/main/res/values-fa/strings.xml diff --git a/res/values-fi/arrays.xml b/app/src/main/res/values-fi/arrays.xml similarity index 100% rename from res/values-fi/arrays.xml rename to app/src/main/res/values-fi/arrays.xml diff --git a/res/values-fi/cm_strings.xml b/app/src/main/res/values-fi/cm_strings.xml similarity index 100% rename from res/values-fi/cm_strings.xml rename to app/src/main/res/values-fi/cm_strings.xml diff --git a/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml similarity index 100% rename from res/values-fi/strings.xml rename to app/src/main/res/values-fi/strings.xml diff --git a/res/values-fr-rCA/arrays.xml b/app/src/main/res/values-fr-rCA/arrays.xml similarity index 100% rename from res/values-fr-rCA/arrays.xml rename to app/src/main/res/values-fr-rCA/arrays.xml diff --git a/res/values-fr-rCA/strings.xml b/app/src/main/res/values-fr-rCA/strings.xml similarity index 100% rename from res/values-fr-rCA/strings.xml rename to app/src/main/res/values-fr-rCA/strings.xml diff --git a/res/values-fr/arrays.xml b/app/src/main/res/values-fr/arrays.xml similarity index 100% rename from res/values-fr/arrays.xml rename to app/src/main/res/values-fr/arrays.xml diff --git a/res/values-fr/cm_strings.xml b/app/src/main/res/values-fr/cm_strings.xml similarity index 100% rename from res/values-fr/cm_strings.xml rename to app/src/main/res/values-fr/cm_strings.xml diff --git a/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml similarity index 100% rename from res/values-fr/strings.xml rename to app/src/main/res/values-fr/strings.xml diff --git a/res/values-fur-rIT/cm_strings.xml b/app/src/main/res/values-fur-rIT/cm_strings.xml similarity index 100% rename from res/values-fur-rIT/cm_strings.xml rename to app/src/main/res/values-fur-rIT/cm_strings.xml diff --git a/res/values-fy-rNL/cm_strings.xml b/app/src/main/res/values-fy-rNL/cm_strings.xml similarity index 100% rename from res/values-fy-rNL/cm_strings.xml rename to app/src/main/res/values-fy-rNL/cm_strings.xml diff --git a/res/values-ga-rIE/cm_strings.xml b/app/src/main/res/values-ga-rIE/cm_strings.xml similarity index 100% rename from res/values-ga-rIE/cm_strings.xml rename to app/src/main/res/values-ga-rIE/cm_strings.xml diff --git a/res/values-gd/cm_strings.xml b/app/src/main/res/values-gd/cm_strings.xml similarity index 100% rename from res/values-gd/cm_strings.xml rename to app/src/main/res/values-gd/cm_strings.xml diff --git a/res/values-gl/arrays.xml b/app/src/main/res/values-gl/arrays.xml similarity index 100% rename from res/values-gl/arrays.xml rename to app/src/main/res/values-gl/arrays.xml diff --git a/res/values-gl/cm_strings.xml b/app/src/main/res/values-gl/cm_strings.xml similarity index 100% rename from res/values-gl/cm_strings.xml rename to app/src/main/res/values-gl/cm_strings.xml diff --git a/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml similarity index 100% rename from res/values-gl/strings.xml rename to app/src/main/res/values-gl/strings.xml diff --git a/res/values-gu/arrays.xml b/app/src/main/res/values-gu/arrays.xml similarity index 100% rename from res/values-gu/arrays.xml rename to app/src/main/res/values-gu/arrays.xml diff --git a/res/values-gu/cm_strings.xml b/app/src/main/res/values-gu/cm_strings.xml similarity index 100% rename from res/values-gu/cm_strings.xml rename to app/src/main/res/values-gu/cm_strings.xml diff --git a/res/values-gu/strings.xml b/app/src/main/res/values-gu/strings.xml similarity index 100% rename from res/values-gu/strings.xml rename to app/src/main/res/values-gu/strings.xml diff --git a/res/values-hi/arrays.xml b/app/src/main/res/values-hi/arrays.xml similarity index 100% rename from res/values-hi/arrays.xml rename to app/src/main/res/values-hi/arrays.xml diff --git a/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml similarity index 100% rename from res/values-hi/strings.xml rename to app/src/main/res/values-hi/strings.xml diff --git a/res/values-hr/arrays.xml b/app/src/main/res/values-hr/arrays.xml similarity index 100% rename from res/values-hr/arrays.xml rename to app/src/main/res/values-hr/arrays.xml diff --git a/res/values-hr/cm_strings.xml b/app/src/main/res/values-hr/cm_strings.xml similarity index 100% rename from res/values-hr/cm_strings.xml rename to app/src/main/res/values-hr/cm_strings.xml diff --git a/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml similarity index 100% rename from res/values-hr/strings.xml rename to app/src/main/res/values-hr/strings.xml diff --git a/res/values-hu/arrays.xml b/app/src/main/res/values-hu/arrays.xml similarity index 100% rename from res/values-hu/arrays.xml rename to app/src/main/res/values-hu/arrays.xml diff --git a/res/values-hu/cm_strings.xml b/app/src/main/res/values-hu/cm_strings.xml similarity index 100% rename from res/values-hu/cm_strings.xml rename to app/src/main/res/values-hu/cm_strings.xml diff --git a/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml similarity index 100% rename from res/values-hu/strings.xml rename to app/src/main/res/values-hu/strings.xml diff --git a/res/values-hy/arrays.xml b/app/src/main/res/values-hy/arrays.xml similarity index 100% rename from res/values-hy/arrays.xml rename to app/src/main/res/values-hy/arrays.xml diff --git a/res/values-hy/strings.xml b/app/src/main/res/values-hy/strings.xml similarity index 100% rename from res/values-hy/strings.xml rename to app/src/main/res/values-hy/strings.xml diff --git a/res/values-in/arrays.xml b/app/src/main/res/values-in/arrays.xml similarity index 100% rename from res/values-in/arrays.xml rename to app/src/main/res/values-in/arrays.xml diff --git a/res/values-in/cm_strings.xml b/app/src/main/res/values-in/cm_strings.xml similarity index 100% rename from res/values-in/cm_strings.xml rename to app/src/main/res/values-in/cm_strings.xml diff --git a/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml similarity index 100% rename from res/values-in/strings.xml rename to app/src/main/res/values-in/strings.xml diff --git a/res/values-is/arrays.xml b/app/src/main/res/values-is/arrays.xml similarity index 100% rename from res/values-is/arrays.xml rename to app/src/main/res/values-is/arrays.xml diff --git a/res/values-is/cm_strings.xml b/app/src/main/res/values-is/cm_strings.xml similarity index 100% rename from res/values-is/cm_strings.xml rename to app/src/main/res/values-is/cm_strings.xml diff --git a/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml similarity index 100% rename from res/values-is/strings.xml rename to app/src/main/res/values-is/strings.xml diff --git a/res/values-it/arrays.xml b/app/src/main/res/values-it/arrays.xml similarity index 100% rename from res/values-it/arrays.xml rename to app/src/main/res/values-it/arrays.xml diff --git a/res/values-it/cm_strings.xml b/app/src/main/res/values-it/cm_strings.xml similarity index 100% rename from res/values-it/cm_strings.xml rename to app/src/main/res/values-it/cm_strings.xml diff --git a/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml similarity index 100% rename from res/values-it/strings.xml rename to app/src/main/res/values-it/strings.xml diff --git a/res/values-iw/arrays.xml b/app/src/main/res/values-iw/arrays.xml similarity index 100% rename from res/values-iw/arrays.xml rename to app/src/main/res/values-iw/arrays.xml diff --git a/res/values-iw/cm_strings.xml b/app/src/main/res/values-iw/cm_strings.xml similarity index 100% rename from res/values-iw/cm_strings.xml rename to app/src/main/res/values-iw/cm_strings.xml diff --git a/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml similarity index 100% rename from res/values-iw/strings.xml rename to app/src/main/res/values-iw/strings.xml diff --git a/res/values-ja/arrays.xml b/app/src/main/res/values-ja/arrays.xml similarity index 100% rename from res/values-ja/arrays.xml rename to app/src/main/res/values-ja/arrays.xml diff --git a/res/values-ja/cm_strings.xml b/app/src/main/res/values-ja/cm_strings.xml similarity index 100% rename from res/values-ja/cm_strings.xml rename to app/src/main/res/values-ja/cm_strings.xml diff --git a/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml similarity index 100% rename from res/values-ja/strings.xml rename to app/src/main/res/values-ja/strings.xml diff --git a/res/values-ka/arrays.xml b/app/src/main/res/values-ka/arrays.xml similarity index 100% rename from res/values-ka/arrays.xml rename to app/src/main/res/values-ka/arrays.xml diff --git a/res/values-ka/cm_strings.xml b/app/src/main/res/values-ka/cm_strings.xml similarity index 100% rename from res/values-ka/cm_strings.xml rename to app/src/main/res/values-ka/cm_strings.xml diff --git a/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml similarity index 100% rename from res/values-ka/strings.xml rename to app/src/main/res/values-ka/strings.xml diff --git a/res/values-kab-rDZ/cm_strings.xml b/app/src/main/res/values-kab-rDZ/cm_strings.xml similarity index 100% rename from res/values-kab-rDZ/cm_strings.xml rename to app/src/main/res/values-kab-rDZ/cm_strings.xml diff --git a/res/values-kk/arrays.xml b/app/src/main/res/values-kk/arrays.xml similarity index 100% rename from res/values-kk/arrays.xml rename to app/src/main/res/values-kk/arrays.xml diff --git a/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml similarity index 100% rename from res/values-kk/strings.xml rename to app/src/main/res/values-kk/strings.xml diff --git a/res/values-km/arrays.xml b/app/src/main/res/values-km/arrays.xml similarity index 100% rename from res/values-km/arrays.xml rename to app/src/main/res/values-km/arrays.xml diff --git a/res/values-km/strings.xml b/app/src/main/res/values-km/strings.xml similarity index 100% rename from res/values-km/strings.xml rename to app/src/main/res/values-km/strings.xml diff --git a/res/values-kn/arrays.xml b/app/src/main/res/values-kn/arrays.xml similarity index 100% rename from res/values-kn/arrays.xml rename to app/src/main/res/values-kn/arrays.xml diff --git a/res/values-kn/cm_strings.xml b/app/src/main/res/values-kn/cm_strings.xml similarity index 100% rename from res/values-kn/cm_strings.xml rename to app/src/main/res/values-kn/cm_strings.xml diff --git a/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml similarity index 100% rename from res/values-kn/strings.xml rename to app/src/main/res/values-kn/strings.xml diff --git a/res/values-ko/arrays.xml b/app/src/main/res/values-ko/arrays.xml similarity index 100% rename from res/values-ko/arrays.xml rename to app/src/main/res/values-ko/arrays.xml diff --git a/res/values-ko/cm_strings.xml b/app/src/main/res/values-ko/cm_strings.xml similarity index 100% rename from res/values-ko/cm_strings.xml rename to app/src/main/res/values-ko/cm_strings.xml diff --git a/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml similarity index 100% rename from res/values-ko/strings.xml rename to app/src/main/res/values-ko/strings.xml diff --git a/res/values-ky/arrays.xml b/app/src/main/res/values-ky/arrays.xml similarity index 100% rename from res/values-ky/arrays.xml rename to app/src/main/res/values-ky/arrays.xml diff --git a/res/values-ky/strings.xml b/app/src/main/res/values-ky/strings.xml similarity index 100% rename from res/values-ky/strings.xml rename to app/src/main/res/values-ky/strings.xml diff --git a/res/values-lb/cm_strings.xml b/app/src/main/res/values-lb/cm_strings.xml similarity index 100% rename from res/values-lb/cm_strings.xml rename to app/src/main/res/values-lb/cm_strings.xml diff --git a/res/values-lo/arrays.xml b/app/src/main/res/values-lo/arrays.xml similarity index 100% rename from res/values-lo/arrays.xml rename to app/src/main/res/values-lo/arrays.xml diff --git a/res/values-lo/strings.xml b/app/src/main/res/values-lo/strings.xml similarity index 100% rename from res/values-lo/strings.xml rename to app/src/main/res/values-lo/strings.xml diff --git a/res/values-lt/arrays.xml b/app/src/main/res/values-lt/arrays.xml similarity index 100% rename from res/values-lt/arrays.xml rename to app/src/main/res/values-lt/arrays.xml diff --git a/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml similarity index 100% rename from res/values-lt/strings.xml rename to app/src/main/res/values-lt/strings.xml diff --git a/res/values-lv/arrays.xml b/app/src/main/res/values-lv/arrays.xml similarity index 100% rename from res/values-lv/arrays.xml rename to app/src/main/res/values-lv/arrays.xml diff --git a/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml similarity index 100% rename from res/values-lv/strings.xml rename to app/src/main/res/values-lv/strings.xml diff --git a/res/values-mk/arrays.xml b/app/src/main/res/values-mk/arrays.xml similarity index 100% rename from res/values-mk/arrays.xml rename to app/src/main/res/values-mk/arrays.xml diff --git a/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml similarity index 100% rename from res/values-mk/strings.xml rename to app/src/main/res/values-mk/strings.xml diff --git a/res/values-ml/arrays.xml b/app/src/main/res/values-ml/arrays.xml similarity index 100% rename from res/values-ml/arrays.xml rename to app/src/main/res/values-ml/arrays.xml diff --git a/res/values-ml/cm_strings.xml b/app/src/main/res/values-ml/cm_strings.xml similarity index 100% rename from res/values-ml/cm_strings.xml rename to app/src/main/res/values-ml/cm_strings.xml diff --git a/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml similarity index 100% rename from res/values-ml/strings.xml rename to app/src/main/res/values-ml/strings.xml diff --git a/res/values-mn/arrays.xml b/app/src/main/res/values-mn/arrays.xml similarity index 100% rename from res/values-mn/arrays.xml rename to app/src/main/res/values-mn/arrays.xml diff --git a/res/values-mn/strings.xml b/app/src/main/res/values-mn/strings.xml similarity index 100% rename from res/values-mn/strings.xml rename to app/src/main/res/values-mn/strings.xml diff --git a/res/values-mr/arrays.xml b/app/src/main/res/values-mr/arrays.xml similarity index 100% rename from res/values-mr/arrays.xml rename to app/src/main/res/values-mr/arrays.xml diff --git a/res/values-mr/cm_strings.xml b/app/src/main/res/values-mr/cm_strings.xml similarity index 100% rename from res/values-mr/cm_strings.xml rename to app/src/main/res/values-mr/cm_strings.xml diff --git a/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml similarity index 100% rename from res/values-mr/strings.xml rename to app/src/main/res/values-mr/strings.xml diff --git a/res/values-ms/arrays.xml b/app/src/main/res/values-ms/arrays.xml similarity index 100% rename from res/values-ms/arrays.xml rename to app/src/main/res/values-ms/arrays.xml diff --git a/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml similarity index 100% rename from res/values-ms/strings.xml rename to app/src/main/res/values-ms/strings.xml diff --git a/res/values-my/arrays.xml b/app/src/main/res/values-my/arrays.xml similarity index 100% rename from res/values-my/arrays.xml rename to app/src/main/res/values-my/arrays.xml diff --git a/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml similarity index 100% rename from res/values-my/strings.xml rename to app/src/main/res/values-my/strings.xml diff --git a/res/values-nb/arrays.xml b/app/src/main/res/values-nb/arrays.xml similarity index 100% rename from res/values-nb/arrays.xml rename to app/src/main/res/values-nb/arrays.xml diff --git a/res/values-nb/cm_strings.xml b/app/src/main/res/values-nb/cm_strings.xml similarity index 100% rename from res/values-nb/cm_strings.xml rename to app/src/main/res/values-nb/cm_strings.xml diff --git a/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml similarity index 100% rename from res/values-nb/strings.xml rename to app/src/main/res/values-nb/strings.xml diff --git a/res/values-ne/arrays.xml b/app/src/main/res/values-ne/arrays.xml similarity index 100% rename from res/values-ne/arrays.xml rename to app/src/main/res/values-ne/arrays.xml diff --git a/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml similarity index 100% rename from res/values-ne/strings.xml rename to app/src/main/res/values-ne/strings.xml diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml new file mode 100644 index 0000000..56ce971 --- /dev/null +++ b/app/src/main/res/values-night/colors.xml @@ -0,0 +1,23 @@ + + + @color/looply_surface_alt + + @color/looply_text_primary + @color/looply_surface + @color/looply_primary_dark + + @color/looply_text_primary + @color/looply_text_secondary + @color/looply_text_secondary + @color/looply_text_primary + + @color/looply_bubble_incoming_text + @color/looply_bubble_outgoing_text + @color/looply_bubble_outgoing + @color/looply_bubble_incoming + #B3FFFFFF + #99A0A0C0 + + @color/looply_text_secondary + @color/looply_bg + diff --git a/app/src/main/res/values-night/lineage_bools.xml b/app/src/main/res/values-night/lineage_bools.xml new file mode 100644 index 0000000..ec5aee2 --- /dev/null +++ b/app/src/main/res/values-night/lineage_bools.xml @@ -0,0 +1,5 @@ + + + false + false + diff --git a/res/values-night/lineage_colors.xml b/app/src/main/res/values-night/lineage_colors.xml similarity index 60% rename from res/values-night/lineage_colors.xml rename to app/src/main/res/values-night/lineage_colors.xml index 1958fb2..9f7824a 100644 --- a/res/values-night/lineage_colors.xml +++ b/app/src/main/res/values-night/lineage_colors.xml @@ -16,14 +16,16 @@ limitations under the License. --> - @android:color/system_accent1_100 + @color/looply_primary - @android:color/system_neutral1_900 + @color/looply_bg - @android:color/system_neutral1_600 + @color/looply_surface - @android:color/black + @color/looply_surface_alt - @android:color/system_neutral1_800 - @android:color/system_accent1_800 + @color/looply_text_on_primary + + @color/looply_surface_alt + @color/looply_surface_alt diff --git a/app/src/main/res/values-night/looply_colors.xml b/app/src/main/res/values-night/looply_colors.xml new file mode 100644 index 0000000..be9d41f --- /dev/null +++ b/app/src/main/res/values-night/looply_colors.xml @@ -0,0 +1,37 @@ + + + + #706CFF + #5D5FEF + #2A2A4A + #1E1E30 + + #0A0A1B + #181829 + #262647 + #2E2E48 + + #FFFFFF + #A0A0C0 + #6B6B8A + #FFFFFF + + #5D5FEF + #FFFFFF + #262647 + #FFFFFF + + #22C55E + #706CFF + #EF4444 + #F97316 + + #262647 + #3A3A5C + #262647 + #E5E5F0 + #6B6B8A + #CC000000 + diff --git a/app/src/main/res/values-night/looply_styles.xml b/app/src/main/res/values-night/looply_styles.xml new file mode 100644 index 0000000..c1a3d16 --- /dev/null +++ b/app/src/main/res/values-night/looply_styles.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/values-night/styles.xml b/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..a983777 --- /dev/null +++ b/app/src/main/res/values-night/styles.xml @@ -0,0 +1,12 @@ + + + + + diff --git a/res/values-nl/arrays.xml b/app/src/main/res/values-nl/arrays.xml similarity index 100% rename from res/values-nl/arrays.xml rename to app/src/main/res/values-nl/arrays.xml diff --git a/res/values-nl/cm_strings.xml b/app/src/main/res/values-nl/cm_strings.xml similarity index 100% rename from res/values-nl/cm_strings.xml rename to app/src/main/res/values-nl/cm_strings.xml diff --git a/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml similarity index 100% rename from res/values-nl/strings.xml rename to app/src/main/res/values-nl/strings.xml diff --git a/res/values-nn-rNO/cm_strings.xml b/app/src/main/res/values-nn-rNO/cm_strings.xml similarity index 100% rename from res/values-nn-rNO/cm_strings.xml rename to app/src/main/res/values-nn-rNO/cm_strings.xml diff --git a/res/values-or/cm_strings.xml b/app/src/main/res/values-or/cm_strings.xml similarity index 100% rename from res/values-or/cm_strings.xml rename to app/src/main/res/values-or/cm_strings.xml diff --git a/res/values-pa/arrays.xml b/app/src/main/res/values-pa/arrays.xml similarity index 100% rename from res/values-pa/arrays.xml rename to app/src/main/res/values-pa/arrays.xml diff --git a/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml similarity index 100% rename from res/values-pa/strings.xml rename to app/src/main/res/values-pa/strings.xml diff --git a/res/values-pl/arrays.xml b/app/src/main/res/values-pl/arrays.xml similarity index 100% rename from res/values-pl/arrays.xml rename to app/src/main/res/values-pl/arrays.xml diff --git a/res/values-pl/cm_strings.xml b/app/src/main/res/values-pl/cm_strings.xml similarity index 100% rename from res/values-pl/cm_strings.xml rename to app/src/main/res/values-pl/cm_strings.xml diff --git a/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml similarity index 100% rename from res/values-pl/strings.xml rename to app/src/main/res/values-pl/strings.xml diff --git a/res/values-pt-rBR/cm_strings.xml b/app/src/main/res/values-pt-rBR/cm_strings.xml similarity index 100% rename from res/values-pt-rBR/cm_strings.xml rename to app/src/main/res/values-pt-rBR/cm_strings.xml diff --git a/res/values-pt-rPT/arrays.xml b/app/src/main/res/values-pt-rPT/arrays.xml similarity index 100% rename from res/values-pt-rPT/arrays.xml rename to app/src/main/res/values-pt-rPT/arrays.xml diff --git a/res/values-pt-rPT/cm_strings.xml b/app/src/main/res/values-pt-rPT/cm_strings.xml similarity index 100% rename from res/values-pt-rPT/cm_strings.xml rename to app/src/main/res/values-pt-rPT/cm_strings.xml diff --git a/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml similarity index 100% rename from res/values-pt-rPT/strings.xml rename to app/src/main/res/values-pt-rPT/strings.xml diff --git a/res/values-pt/arrays.xml b/app/src/main/res/values-pt/arrays.xml similarity index 100% rename from res/values-pt/arrays.xml rename to app/src/main/res/values-pt/arrays.xml diff --git a/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml similarity index 100% rename from res/values-pt/strings.xml rename to app/src/main/res/values-pt/strings.xml diff --git a/res/values-ro/arrays.xml b/app/src/main/res/values-ro/arrays.xml similarity index 100% rename from res/values-ro/arrays.xml rename to app/src/main/res/values-ro/arrays.xml diff --git a/res/values-ro/cm_strings.xml b/app/src/main/res/values-ro/cm_strings.xml similarity index 100% rename from res/values-ro/cm_strings.xml rename to app/src/main/res/values-ro/cm_strings.xml diff --git a/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml similarity index 100% rename from res/values-ro/strings.xml rename to app/src/main/res/values-ro/strings.xml diff --git a/res/values-ru/arrays.xml b/app/src/main/res/values-ru/arrays.xml similarity index 100% rename from res/values-ru/arrays.xml rename to app/src/main/res/values-ru/arrays.xml diff --git a/res/values-ru/cm_strings.xml b/app/src/main/res/values-ru/cm_strings.xml similarity index 100% rename from res/values-ru/cm_strings.xml rename to app/src/main/res/values-ru/cm_strings.xml diff --git a/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml similarity index 100% rename from res/values-ru/strings.xml rename to app/src/main/res/values-ru/strings.xml diff --git a/res/values-sc-rIT/cm_strings.xml b/app/src/main/res/values-sc-rIT/cm_strings.xml similarity index 100% rename from res/values-sc-rIT/cm_strings.xml rename to app/src/main/res/values-sc-rIT/cm_strings.xml diff --git a/res/values-si/arrays.xml b/app/src/main/res/values-si/arrays.xml similarity index 100% rename from res/values-si/arrays.xml rename to app/src/main/res/values-si/arrays.xml diff --git a/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml similarity index 100% rename from res/values-si/strings.xml rename to app/src/main/res/values-si/strings.xml diff --git a/res/values-sk/arrays.xml b/app/src/main/res/values-sk/arrays.xml similarity index 100% rename from res/values-sk/arrays.xml rename to app/src/main/res/values-sk/arrays.xml diff --git a/res/values-sk/cm_strings.xml b/app/src/main/res/values-sk/cm_strings.xml similarity index 100% rename from res/values-sk/cm_strings.xml rename to app/src/main/res/values-sk/cm_strings.xml diff --git a/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml similarity index 100% rename from res/values-sk/strings.xml rename to app/src/main/res/values-sk/strings.xml diff --git a/res/values-sl/arrays.xml b/app/src/main/res/values-sl/arrays.xml similarity index 100% rename from res/values-sl/arrays.xml rename to app/src/main/res/values-sl/arrays.xml diff --git a/res/values-sl/cm_strings.xml b/app/src/main/res/values-sl/cm_strings.xml similarity index 100% rename from res/values-sl/cm_strings.xml rename to app/src/main/res/values-sl/cm_strings.xml diff --git a/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml similarity index 100% rename from res/values-sl/strings.xml rename to app/src/main/res/values-sl/strings.xml diff --git a/res/values-sq/arrays.xml b/app/src/main/res/values-sq/arrays.xml similarity index 100% rename from res/values-sq/arrays.xml rename to app/src/main/res/values-sq/arrays.xml diff --git a/res/values-sq/cm_strings.xml b/app/src/main/res/values-sq/cm_strings.xml similarity index 100% rename from res/values-sq/cm_strings.xml rename to app/src/main/res/values-sq/cm_strings.xml diff --git a/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml similarity index 100% rename from res/values-sq/strings.xml rename to app/src/main/res/values-sq/strings.xml diff --git a/res/values-sr/arrays.xml b/app/src/main/res/values-sr/arrays.xml similarity index 100% rename from res/values-sr/arrays.xml rename to app/src/main/res/values-sr/arrays.xml diff --git a/res/values-sr/cm_strings.xml b/app/src/main/res/values-sr/cm_strings.xml similarity index 100% rename from res/values-sr/cm_strings.xml rename to app/src/main/res/values-sr/cm_strings.xml diff --git a/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml similarity index 100% rename from res/values-sr/strings.xml rename to app/src/main/res/values-sr/strings.xml diff --git a/res/values-sv/arrays.xml b/app/src/main/res/values-sv/arrays.xml similarity index 100% rename from res/values-sv/arrays.xml rename to app/src/main/res/values-sv/arrays.xml diff --git a/res/values-sv/cm_strings.xml b/app/src/main/res/values-sv/cm_strings.xml similarity index 100% rename from res/values-sv/cm_strings.xml rename to app/src/main/res/values-sv/cm_strings.xml diff --git a/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml similarity index 100% rename from res/values-sv/strings.xml rename to app/src/main/res/values-sv/strings.xml diff --git a/res/values-sw/arrays.xml b/app/src/main/res/values-sw/arrays.xml similarity index 100% rename from res/values-sw/arrays.xml rename to app/src/main/res/values-sw/arrays.xml diff --git a/res/values-sw/strings.xml b/app/src/main/res/values-sw/strings.xml similarity index 100% rename from res/values-sw/strings.xml rename to app/src/main/res/values-sw/strings.xml diff --git a/res/values-ta/arrays.xml b/app/src/main/res/values-ta/arrays.xml similarity index 100% rename from res/values-ta/arrays.xml rename to app/src/main/res/values-ta/arrays.xml diff --git a/res/values-ta/cm_strings.xml b/app/src/main/res/values-ta/cm_strings.xml similarity index 100% rename from res/values-ta/cm_strings.xml rename to app/src/main/res/values-ta/cm_strings.xml diff --git a/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml similarity index 100% rename from res/values-ta/strings.xml rename to app/src/main/res/values-ta/strings.xml diff --git a/res/values-te/arrays.xml b/app/src/main/res/values-te/arrays.xml similarity index 100% rename from res/values-te/arrays.xml rename to app/src/main/res/values-te/arrays.xml diff --git a/res/values-te/cm_strings.xml b/app/src/main/res/values-te/cm_strings.xml similarity index 100% rename from res/values-te/cm_strings.xml rename to app/src/main/res/values-te/cm_strings.xml diff --git a/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml similarity index 100% rename from res/values-te/strings.xml rename to app/src/main/res/values-te/strings.xml diff --git a/res/values-th/arrays.xml b/app/src/main/res/values-th/arrays.xml similarity index 100% rename from res/values-th/arrays.xml rename to app/src/main/res/values-th/arrays.xml diff --git a/res/values-th/cm_strings.xml b/app/src/main/res/values-th/cm_strings.xml similarity index 100% rename from res/values-th/cm_strings.xml rename to app/src/main/res/values-th/cm_strings.xml diff --git a/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml similarity index 100% rename from res/values-th/strings.xml rename to app/src/main/res/values-th/strings.xml diff --git a/res/values-tl/arrays.xml b/app/src/main/res/values-tl/arrays.xml similarity index 100% rename from res/values-tl/arrays.xml rename to app/src/main/res/values-tl/arrays.xml diff --git a/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml similarity index 100% rename from res/values-tl/strings.xml rename to app/src/main/res/values-tl/strings.xml diff --git a/res/values-tr/arrays.xml b/app/src/main/res/values-tr/arrays.xml similarity index 100% rename from res/values-tr/arrays.xml rename to app/src/main/res/values-tr/arrays.xml diff --git a/res/values-tr/cm_strings.xml b/app/src/main/res/values-tr/cm_strings.xml similarity index 100% rename from res/values-tr/cm_strings.xml rename to app/src/main/res/values-tr/cm_strings.xml diff --git a/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml similarity index 100% rename from res/values-tr/strings.xml rename to app/src/main/res/values-tr/strings.xml diff --git a/res/values-ug/cm_strings.xml b/app/src/main/res/values-ug/cm_strings.xml similarity index 100% rename from res/values-ug/cm_strings.xml rename to app/src/main/res/values-ug/cm_strings.xml diff --git a/res/values-uk/arrays.xml b/app/src/main/res/values-uk/arrays.xml similarity index 100% rename from res/values-uk/arrays.xml rename to app/src/main/res/values-uk/arrays.xml diff --git a/res/values-uk/cm_strings.xml b/app/src/main/res/values-uk/cm_strings.xml similarity index 100% rename from res/values-uk/cm_strings.xml rename to app/src/main/res/values-uk/cm_strings.xml diff --git a/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml similarity index 100% rename from res/values-uk/strings.xml rename to app/src/main/res/values-uk/strings.xml diff --git a/res/values-ur/arrays.xml b/app/src/main/res/values-ur/arrays.xml similarity index 100% rename from res/values-ur/arrays.xml rename to app/src/main/res/values-ur/arrays.xml diff --git a/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml similarity index 100% rename from res/values-ur/strings.xml rename to app/src/main/res/values-ur/strings.xml diff --git a/res/values-uz/arrays.xml b/app/src/main/res/values-uz/arrays.xml similarity index 100% rename from res/values-uz/arrays.xml rename to app/src/main/res/values-uz/arrays.xml diff --git a/res/values-uz/strings.xml b/app/src/main/res/values-uz/strings.xml similarity index 100% rename from res/values-uz/strings.xml rename to app/src/main/res/values-uz/strings.xml diff --git a/res/values-vi/arrays.xml b/app/src/main/res/values-vi/arrays.xml similarity index 100% rename from res/values-vi/arrays.xml rename to app/src/main/res/values-vi/arrays.xml diff --git a/res/values-vi/cm_strings.xml b/app/src/main/res/values-vi/cm_strings.xml similarity index 100% rename from res/values-vi/cm_strings.xml rename to app/src/main/res/values-vi/cm_strings.xml diff --git a/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml similarity index 100% rename from res/values-vi/strings.xml rename to app/src/main/res/values-vi/strings.xml diff --git a/res/values-zh-rCN/arrays.xml b/app/src/main/res/values-zh-rCN/arrays.xml similarity index 100% rename from res/values-zh-rCN/arrays.xml rename to app/src/main/res/values-zh-rCN/arrays.xml diff --git a/res/values-zh-rCN/cm_strings.xml b/app/src/main/res/values-zh-rCN/cm_strings.xml similarity index 100% rename from res/values-zh-rCN/cm_strings.xml rename to app/src/main/res/values-zh-rCN/cm_strings.xml diff --git a/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml similarity index 100% rename from res/values-zh-rCN/strings.xml rename to app/src/main/res/values-zh-rCN/strings.xml diff --git a/res/values-zh-rHK/arrays.xml b/app/src/main/res/values-zh-rHK/arrays.xml similarity index 100% rename from res/values-zh-rHK/arrays.xml rename to app/src/main/res/values-zh-rHK/arrays.xml diff --git a/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml similarity index 100% rename from res/values-zh-rHK/strings.xml rename to app/src/main/res/values-zh-rHK/strings.xml diff --git a/res/values-zh-rTW/arrays.xml b/app/src/main/res/values-zh-rTW/arrays.xml similarity index 100% rename from res/values-zh-rTW/arrays.xml rename to app/src/main/res/values-zh-rTW/arrays.xml diff --git a/res/values-zh-rTW/cm_strings.xml b/app/src/main/res/values-zh-rTW/cm_strings.xml similarity index 100% rename from res/values-zh-rTW/cm_strings.xml rename to app/src/main/res/values-zh-rTW/cm_strings.xml diff --git a/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml similarity index 100% rename from res/values-zh-rTW/strings.xml rename to app/src/main/res/values-zh-rTW/strings.xml diff --git a/res/values-zu/arrays.xml b/app/src/main/res/values-zu/arrays.xml similarity index 100% rename from res/values-zu/arrays.xml rename to app/src/main/res/values-zu/arrays.xml diff --git a/res/values-zu/strings.xml b/app/src/main/res/values-zu/strings.xml similarity index 100% rename from res/values-zu/strings.xml rename to app/src/main/res/values-zu/strings.xml diff --git a/res/values/arrays.xml b/app/src/main/res/values/arrays.xml similarity index 100% rename from res/values/arrays.xml rename to app/src/main/res/values/arrays.xml diff --git a/res/values/attrs.xml b/app/src/main/res/values/attrs.xml similarity index 100% rename from res/values/attrs.xml rename to app/src/main/res/values/attrs.xml diff --git a/res/values/cm_strings.xml b/app/src/main/res/values/cm_strings.xml similarity index 100% rename from res/values/cm_strings.xml rename to app/src/main/res/values/cm_strings.xml diff --git a/res/values/colors.xml b/app/src/main/res/values/colors.xml similarity index 50% rename from res/values/colors.xml rename to app/src/main/res/values/colors.xml index 1b48f34..67cc7af 100644 --- a/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -16,94 +16,95 @@ limitations under the License. --> - @android:color/system_accent1_600 + @color/looply_primary @color/primary_color - - @android:color/system_neutral1_0 - @android:color/system_accent1_600 - @android:color/system_accent1_700 - @android:color/system_accent1_600 - @android:color/system_accent1_700 - @android:color/system_accent1_600 + + @color/looply_text_primary + @color/looply_surface + @color/looply_primary_dark + @color/looply_primary + @color/looply_primary_dark + @color/looply_primary - #636363 - #323232 - #F05A24 - #DE000000 - #8A000000 + @color/looply_text_secondary + @color/looply_text_primary + @color/looply_warning + @color/looply_text_primary + @color/looply_text_secondary #44000000 - #000000 - #99323232 - #99ffffff + @color/looply_text_primary + #B3FFFFFF + #991A0D3F #99ff0000 - #000000 + @color/looply_text_primary - #ff323232 - #000000 + @color/looply_text_primary + @color/looply_text_primary #99ffffff - #6a6a6a - #007fce + @color/looply_text_secondary + @color/looply_primary #99ff0000 #ffffffff #99ffffff #ffffffff - #6733b5e5 + #335A31F4 - #ffffffff - #ffffffff - #6a6a6a - #ff323232 + @color/looply_surface + @color/looply_bubble_incoming_text + @color/looply_text_secondary + @color/looply_bubble_outgoing_text @color/window_background - #9d9d9d + @color/looply_primary_soft @color/lineage_accent - #999999 - #ffffffff + @color/looply_primary_dark + @color/looply_bubble_outgoing + @color/looply_bubble_incoming #e2e2e2 - #ffffffff - @android:color/system_accent3_300 + @color/looply_primary + @color/looply_primary_soft #7f040000 #ff0000 #40000000 - #4d4d4d - #999999 + @color/looply_text_primary + @color/looply_text_secondary - @android:color/white - #a0ffffff - #44000000 - #ddffffff - @android:color/white - @color/lineage_accent - #ffffff - #4285f4 - #ededed - #33000000 - @android:color/white + @color/looply_text_primary + @color/looply_text_hint + @color/looply_divider + @color/looply_primary_soft + @color/looply_primary + @color/looply_primary + @color/looply_bg + @color/looply_primary + @color/looply_primary_muted + @color/looply_primary + @color/looply_text_on_primary #80ffffff #44000000 - @android:color/system_accent1_300 - @android:color/system_accent2_300 - @android:color/system_accent3_300 - @android:color/system_accent1_400 - @android:color/system_accent2_400 - @android:color/system_accent3_400 - @android:color/system_accent1_500 - @android:color/system_accent2_500 - @android:color/system_accent3_500 - @android:color/system_accent1_600 - @android:color/system_accent2_600 - @android:color/system_accent3_600 + #5A31F4 + #706CFF + #4B00D1 + #7C4DFF + #651FFF + #536DFE + #3D5AFE + #8B5CF6 + #6D28D9 + #5B21B6 + #4C1D95 + #4338CA #ffffff @@ -115,7 +116,7 @@ #323232 @color/lineage_accent - #40000000 + @color/looply_text_hint #DE000000 #8A000000 @@ -129,22 +130,22 @@ #6d6d6d #cccccc - @color/lineage_accent + @color/looply_primary - #555555 - #681faf - #6d6d6d + @color/looply_text_secondary + @color/looply_primary + @color/looply_text_secondary @color/lineage_accent #40000000 - @color/primary_color + @color/looply_bg #4d4d4d #999999 #cceeeeee #ffeeeeee - @android:color/system_accent1_100 - #b0dddddd + @color/looply_primary_soft + @color/looply_primary #4d4d4d #6d6d6d diff --git a/res/values/config.xml b/app/src/main/res/values/config.xml similarity index 100% rename from res/values/config.xml rename to app/src/main/res/values/config.xml diff --git a/res/values/constants.xml b/app/src/main/res/values/constants.xml similarity index 100% rename from res/values/constants.xml rename to app/src/main/res/values/constants.xml diff --git a/res/values/dimens.xml b/app/src/main/res/values/dimens.xml similarity index 98% rename from res/values/dimens.xml rename to app/src/main/res/values/dimens.xml index 72c1c86..a9e5c81 100644 --- a/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -24,8 +24,8 @@ 12sp 12sp 16sp - 42dp - 56dp + 34dp + 45dp 12dp 16dp 8dp diff --git a/app/src/main/res/values/home_colors.xml b/app/src/main/res/values/home_colors.xml new file mode 100644 index 0000000..a138635 --- /dev/null +++ b/app/src/main/res/values/home_colors.xml @@ -0,0 +1,35 @@ + + + + #FFFFFF + #F2F2F7 + #E5E5EA + #E8FFFFFF + #F2FFFFFF + #14000000 + + #12000000 + #0C000000 + #05000000 + #08000000 + #0E000000 + #F2F2F7 + #F5FFFFFF + #CCFFFFFF + #00FFFFFF + #E5E5EA + #000000 + #8E8E93 + #AEAEB2 + + #1C1C1E + @color/looply_primary_soft + #48484A + #3A3A3C + #FFFFFF + @color/looply_primary + @color/looply_primary_soft + #E8E8ED + #6C6C70 + #FFD60A + diff --git a/app/src/main/res/values/home_ids.xml b/app/src/main/res/values/home_ids.xml new file mode 100644 index 0000000..e5fd354 --- /dev/null +++ b/app/src/main/res/values/home_ids.xml @@ -0,0 +1,4 @@ + + + + diff --git a/app/src/main/res/values/home_styles.xml b/app/src/main/res/values/home_styles.xml new file mode 100644 index 0000000..87581fc --- /dev/null +++ b/app/src/main/res/values/home_styles.xml @@ -0,0 +1,39 @@ + + + + + + + diff --git a/res/values/lineage_bools.xml b/app/src/main/res/values/lineage_bools.xml similarity index 100% rename from res/values/lineage_bools.xml rename to app/src/main/res/values/lineage_bools.xml diff --git a/res/values/lineage_colors.xml b/app/src/main/res/values/lineage_colors.xml similarity index 62% rename from res/values/lineage_colors.xml rename to app/src/main/res/values/lineage_colors.xml index 77ee55a..14b69dd 100644 --- a/res/values/lineage_colors.xml +++ b/app/src/main/res/values/lineage_colors.xml @@ -16,15 +16,16 @@ limitations under the License. --> - @android:color/system_accent1_600 + + @color/looply_primary - @android:color/system_neutral1_50 + @color/looply_bg - @color/window_background + @color/looply_surface - @android:color/white + @color/looply_surface - @android:color/white + @color/looply_text_on_primary - @android:color/system_neutral1_0 + @color/looply_surface diff --git a/res/values/lineage_constants.xml b/app/src/main/res/values/lineage_constants.xml similarity index 100% rename from res/values/lineage_constants.xml rename to app/src/main/res/values/lineage_constants.xml diff --git a/app/src/main/res/values/looply_colors.xml b/app/src/main/res/values/looply_colors.xml new file mode 100644 index 0000000..4ef44bb --- /dev/null +++ b/app/src/main/res/values/looply_colors.xml @@ -0,0 +1,44 @@ + + + + + #5A31F4 + #4B00D1 + #E8E6FF + #F3F1FF + + + #F3F4FB + #FFFFFF + #F9F9F9 + #E8E8F0 + + + #1A0D3F + #757575 + #9E9EAE + #FFFFFF + + + #5A31F4 + #FFFFFF + #F0EFF8 + #1A0D3F + + + #22C55E + #5A31F4 + #EF4444 + #F97316 + + + #FFFFFF + #E5E5EF + #EEEAF8 + #1A0D3F + #9CA3AF + #99000000 + diff --git a/app/src/main/res/values/looply_dimens.xml b/app/src/main/res/values/looply_dimens.xml new file mode 100644 index 0000000..0f001e7 --- /dev/null +++ b/app/src/main/res/values/looply_dimens.xml @@ -0,0 +1,77 @@ + + + + 8dp + 12dp + 16dp + 20dp + 24dp + 999dp + + + 4dp + 8dp + 12dp + 16dp + 20dp + 24dp + 20dp + + + 52dp + 52dp + 48dp + 36dp + + 38dp + 74dp + 104dp + 45dp + + 96dp + 132dp + + 18dp + + 46dp + 8dp + 12dp + 120dp + 16dp + 14dp + 10dp + 6dp + + 12dp + 22dp + -4dp + 20dp + 8dp + + 12dp + 22dp + 12dp + 56dp + 10dp + 72dp + 64dp + 24dp + 55dp + 5dp + + 6dp + 3dp + 3dp + 70dp + 6dp + 280dp + 14dp + 10dp + + + 22sp + 18sp + 15sp + 13sp + 12sp + diff --git a/app/src/main/res/values/looply_strings.xml b/app/src/main/res/values/looply_strings.xml new file mode 100644 index 0000000..6e62a47 --- /dev/null +++ b/app/src/main/res/values/looply_strings.xml @@ -0,0 +1,74 @@ + + + Looply Components + Search by name or number + All + Unread + Groups + Type a message + Chats + Calls + Contacts + Settings + + + Messages + Edit + Search + Personal + Work + All + Unread + Groups + Archived + Search + Filter + New message + Voice input + Automate is coming soon + Start chat + + All Messages + Unread + Groups + Archived + Messages + Contacts + Calls + Settings + Automate + Contacts + Search contacts + Invite friends + Recent call history + Sorted by last seen + Sort contacts + Add contact + Read All + Done + Delete selected messages + Add + Calls coming soon + More options + + + Messages + Spam + Recently Deleted + Filter By + Unread + Work + Personal + Settings + Select Messages + Edit Pinned + Name and Photo Settings + Coming soon + + Pinned Conversations + You can pin up to 9 conversations. To pin this conversation, unpin another one first. + OK + Pin conversation + Unpin conversation + Remove pin + diff --git a/app/src/main/res/values/looply_styles.xml b/app/src/main/res/values/looply_styles.xml new file mode 100644 index 0000000..fd9864c --- /dev/null +++ b/app/src/main/res/values/looply_styles.xml @@ -0,0 +1,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/res/values/strings.xml b/app/src/main/res/values/strings.xml similarity index 100% rename from res/values/strings.xml rename to app/src/main/res/values/strings.xml diff --git a/res/values/styles.xml b/app/src/main/res/values/styles.xml similarity index 96% rename from res/values/styles.xml rename to app/src/main/res/values/styles.xml index cb035b9..2457908 100644 --- a/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -24,6 +24,8 @@ @color/navigation_bar_bg @bool/light_navigation_bar true + @color/action_bar_background_color + true @@ -66,7 +68,10 @@ @@ -597,7 +604,7 @@ diff --git a/res/values/versions.xml b/app/src/main/res/values/versions.xml similarity index 100% rename from res/values/versions.xml rename to app/src/main/res/values/versions.xml diff --git a/res/xml-mcc204-mnc04/mms_config.xml b/app/src/main/res/xml-mcc204-mnc04/mms_config.xml similarity index 100% rename from res/xml-mcc204-mnc04/mms_config.xml rename to app/src/main/res/xml-mcc204-mnc04/mms_config.xml diff --git a/res/xml-mcc208-mnc01/mms_config.xml b/app/src/main/res/xml-mcc208-mnc01/mms_config.xml similarity index 100% rename from res/xml-mcc208-mnc01/mms_config.xml rename to app/src/main/res/xml-mcc208-mnc01/mms_config.xml diff --git a/res/xml-mcc208-mnc10/mms_config.xml b/app/src/main/res/xml-mcc208-mnc10/mms_config.xml similarity index 100% rename from res/xml-mcc208-mnc10/mms_config.xml rename to app/src/main/res/xml-mcc208-mnc10/mms_config.xml diff --git a/res/xml-mcc208-mnc15/mms_config.xml b/app/src/main/res/xml-mcc208-mnc15/mms_config.xml similarity index 100% rename from res/xml-mcc208-mnc15/mms_config.xml rename to app/src/main/res/xml-mcc208-mnc15/mms_config.xml diff --git a/res/xml-mcc208-mnc20/mms_config.xml b/app/src/main/res/xml-mcc208-mnc20/mms_config.xml similarity index 100% rename from res/xml-mcc208-mnc20/mms_config.xml rename to app/src/main/res/xml-mcc208-mnc20/mms_config.xml diff --git a/res/xml-mcc208-mnc26/mms_config.xml b/app/src/main/res/xml-mcc208-mnc26/mms_config.xml similarity index 100% rename from res/xml-mcc208-mnc26/mms_config.xml rename to app/src/main/res/xml-mcc208-mnc26/mms_config.xml diff --git a/res/xml-mcc214-mnc01/mms_config.xml b/app/src/main/res/xml-mcc214-mnc01/mms_config.xml similarity index 100% rename from res/xml-mcc214-mnc01/mms_config.xml rename to app/src/main/res/xml-mcc214-mnc01/mms_config.xml diff --git a/res/xml-mcc214-mnc03/mms_config.xml b/app/src/main/res/xml-mcc214-mnc03/mms_config.xml similarity index 100% rename from res/xml-mcc214-mnc03/mms_config.xml rename to app/src/main/res/xml-mcc214-mnc03/mms_config.xml diff --git a/res/xml-mcc214-mnc07/mms_config.xml b/app/src/main/res/xml-mcc214-mnc07/mms_config.xml similarity index 100% rename from res/xml-mcc214-mnc07/mms_config.xml rename to app/src/main/res/xml-mcc214-mnc07/mms_config.xml diff --git a/res/xml-mcc218-mnc05/mms_config.xml b/app/src/main/res/xml-mcc218-mnc05/mms_config.xml similarity index 100% rename from res/xml-mcc218-mnc05/mms_config.xml rename to app/src/main/res/xml-mcc218-mnc05/mms_config.xml diff --git a/res/xml-mcc222-mnc01/mms_config.xml b/app/src/main/res/xml-mcc222-mnc01/mms_config.xml similarity index 100% rename from res/xml-mcc222-mnc01/mms_config.xml rename to app/src/main/res/xml-mcc222-mnc01/mms_config.xml diff --git a/res/xml-mcc222-mnc08/mms_config.xml b/app/src/main/res/xml-mcc222-mnc08/mms_config.xml similarity index 100% rename from res/xml-mcc222-mnc08/mms_config.xml rename to app/src/main/res/xml-mcc222-mnc08/mms_config.xml diff --git a/res/xml-mcc234-mnc10/mms_config.xml b/app/src/main/res/xml-mcc234-mnc10/mms_config.xml similarity index 100% rename from res/xml-mcc234-mnc10/mms_config.xml rename to app/src/main/res/xml-mcc234-mnc10/mms_config.xml diff --git a/app/src/main/res/xml-mcc234-mnc11 b/app/src/main/res/xml-mcc234-mnc11 new file mode 100644 index 0000000..e29c9d3 --- /dev/null +++ b/app/src/main/res/xml-mcc234-mnc11 @@ -0,0 +1 @@ +xml-mcc234-mnc10 \ No newline at end of file diff --git a/res/xml-mcc234-mnc15/mms_config.xml b/app/src/main/res/xml-mcc234-mnc15/mms_config.xml similarity index 100% rename from res/xml-mcc234-mnc15/mms_config.xml rename to app/src/main/res/xml-mcc234-mnc15/mms_config.xml diff --git a/res/xml-mcc238-mnc02/mms_config.xml b/app/src/main/res/xml-mcc238-mnc02/mms_config.xml similarity index 100% rename from res/xml-mcc238-mnc02/mms_config.xml rename to app/src/main/res/xml-mcc238-mnc02/mms_config.xml diff --git a/res/xml-mcc240-mnc01/mms_config.xml b/app/src/main/res/xml-mcc240-mnc01/mms_config.xml similarity index 100% rename from res/xml-mcc240-mnc01/mms_config.xml rename to app/src/main/res/xml-mcc240-mnc01/mms_config.xml diff --git a/res/xml-mcc240-mnc04/mms_config.xml b/app/src/main/res/xml-mcc240-mnc04/mms_config.xml similarity index 100% rename from res/xml-mcc240-mnc04/mms_config.xml rename to app/src/main/res/xml-mcc240-mnc04/mms_config.xml diff --git a/res/xml-mcc240-mnc08/mms_config.xml b/app/src/main/res/xml-mcc240-mnc08/mms_config.xml similarity index 100% rename from res/xml-mcc240-mnc08/mms_config.xml rename to app/src/main/res/xml-mcc240-mnc08/mms_config.xml diff --git a/res/xml-mcc240-mnc24/mms_config.xml b/app/src/main/res/xml-mcc240-mnc24/mms_config.xml similarity index 100% rename from res/xml-mcc240-mnc24/mms_config.xml rename to app/src/main/res/xml-mcc240-mnc24/mms_config.xml diff --git a/res/xml-mcc242-mnc01/mms_config.xml b/app/src/main/res/xml-mcc242-mnc01/mms_config.xml similarity index 100% rename from res/xml-mcc242-mnc01/mms_config.xml rename to app/src/main/res/xml-mcc242-mnc01/mms_config.xml diff --git a/res/xml-mcc242-mnc02/mms_config.xml b/app/src/main/res/xml-mcc242-mnc02/mms_config.xml similarity index 100% rename from res/xml-mcc242-mnc02/mms_config.xml rename to app/src/main/res/xml-mcc242-mnc02/mms_config.xml diff --git a/res/xml-mcc262-mnc07/mms_config.xml b/app/src/main/res/xml-mcc262-mnc07/mms_config.xml similarity index 100% rename from res/xml-mcc262-mnc07/mms_config.xml rename to app/src/main/res/xml-mcc262-mnc07/mms_config.xml diff --git a/res/xml-mcc274-mnc02/mms_config.xml b/app/src/main/res/xml-mcc274-mnc02/mms_config.xml similarity index 100% rename from res/xml-mcc274-mnc02/mms_config.xml rename to app/src/main/res/xml-mcc274-mnc02/mms_config.xml diff --git a/res/xml-mcc274-mnc03/mms_config.xml b/app/src/main/res/xml-mcc274-mnc03/mms_config.xml similarity index 100% rename from res/xml-mcc274-mnc03/mms_config.xml rename to app/src/main/res/xml-mcc274-mnc03/mms_config.xml diff --git a/res/xml-mcc286-mnc01/mms_config.xml b/app/src/main/res/xml-mcc286-mnc01/mms_config.xml similarity index 100% rename from res/xml-mcc286-mnc01/mms_config.xml rename to app/src/main/res/xml-mcc286-mnc01/mms_config.xml diff --git a/res/xml-mcc286-mnc03/mms_config.xml b/app/src/main/res/xml-mcc286-mnc03/mms_config.xml similarity index 100% rename from res/xml-mcc286-mnc03/mms_config.xml rename to app/src/main/res/xml-mcc286-mnc03/mms_config.xml diff --git a/res/xml-mcc294-mnc01/mms_config.xml b/app/src/main/res/xml-mcc294-mnc01/mms_config.xml similarity index 100% rename from res/xml-mcc294-mnc01/mms_config.xml rename to app/src/main/res/xml-mcc294-mnc01/mms_config.xml diff --git a/res/xml-mcc294-mnc02/mms_config.xml b/app/src/main/res/xml-mcc294-mnc02/mms_config.xml similarity index 100% rename from res/xml-mcc294-mnc02/mms_config.xml rename to app/src/main/res/xml-mcc294-mnc02/mms_config.xml diff --git a/res/xml-mcc294-mnc03/mms_config.xml b/app/src/main/res/xml-mcc294-mnc03/mms_config.xml similarity index 100% rename from res/xml-mcc294-mnc03/mms_config.xml rename to app/src/main/res/xml-mcc294-mnc03/mms_config.xml diff --git a/res/xml-mcc302-mnc220/mms_config.xml b/app/src/main/res/xml-mcc302-mnc220/mms_config.xml similarity index 100% rename from res/xml-mcc302-mnc220/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc220/mms_config.xml diff --git a/res/xml-mcc302-mnc221/mms_config.xml b/app/src/main/res/xml-mcc302-mnc221/mms_config.xml similarity index 100% rename from res/xml-mcc302-mnc221/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc221/mms_config.xml diff --git a/res/xml-mcc302-mnc270/mms_config.xml b/app/src/main/res/xml-mcc302-mnc270/mms_config.xml similarity index 100% rename from res/xml-mcc302-mnc270/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc270/mms_config.xml diff --git a/res/xml-mcc302-mnc290/mms_config.xml b/app/src/main/res/xml-mcc302-mnc290/mms_config.xml similarity index 100% rename from res/xml-mcc302-mnc290/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc290/mms_config.xml diff --git a/res/xml-mcc302-mnc320/mms_config.xml b/app/src/main/res/xml-mcc302-mnc320/mms_config.xml similarity index 100% rename from res/xml-mcc302-mnc320/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc320/mms_config.xml diff --git a/res/xml-mcc302-mnc370/mms_config.xml b/app/src/main/res/xml-mcc302-mnc370/mms_config.xml similarity index 100% rename from res/xml-mcc302-mnc370/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc370/mms_config.xml diff --git a/res/xml-mcc302-mnc490/mms_config.xml b/app/src/main/res/xml-mcc302-mnc490/mms_config.xml similarity index 100% rename from res/xml-mcc302-mnc490/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc490/mms_config.xml diff --git a/res/xml-mcc302-mnc500/mms_config.xml b/app/src/main/res/xml-mcc302-mnc500/mms_config.xml similarity index 100% rename from res/xml-mcc302-mnc500/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc500/mms_config.xml diff --git a/res/xml-mcc302-mnc510/mms_config.xml b/app/src/main/res/xml-mcc302-mnc510/mms_config.xml similarity index 100% rename from res/xml-mcc302-mnc510/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc510/mms_config.xml diff --git a/res/xml-mcc302-mnc520/mms_config.xml b/app/src/main/res/xml-mcc302-mnc520/mms_config.xml similarity index 100% rename from res/xml-mcc302-mnc520/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc520/mms_config.xml diff --git a/res/xml-mcc302-mnc610/mms_config.xml b/app/src/main/res/xml-mcc302-mnc610/mms_config.xml similarity index 100% rename from res/xml-mcc302-mnc610/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc610/mms_config.xml diff --git a/res/xml-mcc302-mnc660/mms_config.xml b/app/src/main/res/xml-mcc302-mnc660/mms_config.xml similarity index 100% rename from res/xml-mcc302-mnc660/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc660/mms_config.xml diff --git a/res/xml-mcc302-mnc720/mms_config.xml b/app/src/main/res/xml-mcc302-mnc720/mms_config.xml similarity index 100% rename from res/xml-mcc302-mnc720/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc720/mms_config.xml diff --git a/res/xml-mcc302-mnc780/mms_config.xml b/app/src/main/res/xml-mcc302-mnc780/mms_config.xml similarity index 100% rename from res/xml-mcc302-mnc780/mms_config.xml rename to app/src/main/res/xml-mcc302-mnc780/mms_config.xml diff --git a/res/xml-mcc310-mnc004/mms_config.xml b/app/src/main/res/xml-mcc310-mnc004/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc004/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc004/mms_config.xml diff --git a/res/xml-mcc310-mnc005/mms_config.xml b/app/src/main/res/xml-mcc310-mnc005/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc005/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc005/mms_config.xml diff --git a/res/xml-mcc310-mnc010/mms_config.xml b/app/src/main/res/xml-mcc310-mnc010/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc010/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc010/mms_config.xml diff --git a/res/xml-mcc310-mnc026/mms_config.xml b/app/src/main/res/xml-mcc310-mnc026/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc026/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc026/mms_config.xml diff --git a/res/xml-mcc310-mnc040/mms_config.xml b/app/src/main/res/xml-mcc310-mnc040/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc040/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc040/mms_config.xml diff --git a/res/xml-mcc310-mnc070/mms_config.xml b/app/src/main/res/xml-mcc310-mnc070/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc070/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc070/mms_config.xml diff --git a/res/xml-mcc310-mnc090/mms_config.xml b/app/src/main/res/xml-mcc310-mnc090/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc090/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc090/mms_config.xml diff --git a/res/xml-mcc310-mnc120/mms_config.xml b/app/src/main/res/xml-mcc310-mnc120/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc120/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc120/mms_config.xml diff --git a/res/xml-mcc310-mnc130/mms_config.xml b/app/src/main/res/xml-mcc310-mnc130/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc130/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc130/mms_config.xml diff --git a/res/xml-mcc310-mnc150/mms_config.xml b/app/src/main/res/xml-mcc310-mnc150/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc150/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc150/mms_config.xml diff --git a/res/xml-mcc310-mnc170/mms_config.xml b/app/src/main/res/xml-mcc310-mnc170/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc170/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc170/mms_config.xml diff --git a/res/xml-mcc310-mnc260/mms_config.xml b/app/src/main/res/xml-mcc310-mnc260/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc260/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc260/mms_config.xml diff --git a/res/xml-mcc310-mnc360/mms_config.xml b/app/src/main/res/xml-mcc310-mnc360/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc360/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc360/mms_config.xml diff --git a/res/xml-mcc310-mnc380/mms_config.xml b/app/src/main/res/xml-mcc310-mnc380/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc380/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc380/mms_config.xml diff --git a/res/xml-mcc310-mnc410/mms_config.xml b/app/src/main/res/xml-mcc310-mnc410/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc410/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc410/mms_config.xml diff --git a/res/xml-mcc310-mnc420/mms_config.xml b/app/src/main/res/xml-mcc310-mnc420/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc420/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc420/mms_config.xml diff --git a/res/xml-mcc310-mnc450/mms_config.xml b/app/src/main/res/xml-mcc310-mnc450/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc450/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc450/mms_config.xml diff --git a/res/xml-mcc310-mnc490/mms_config.xml b/app/src/main/res/xml-mcc310-mnc490/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc490/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc490/mms_config.xml diff --git a/res/xml-mcc310-mnc560/mms_config.xml b/app/src/main/res/xml-mcc310-mnc560/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc560/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc560/mms_config.xml diff --git a/res/xml-mcc310-mnc580/mms_config.xml b/app/src/main/res/xml-mcc310-mnc580/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc580/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc580/mms_config.xml diff --git a/res/xml-mcc310-mnc600/mms_config.xml b/app/src/main/res/xml-mcc310-mnc600/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc600/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc600/mms_config.xml diff --git a/res/xml-mcc310-mnc680/mms_config.xml b/app/src/main/res/xml-mcc310-mnc680/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc680/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc680/mms_config.xml diff --git a/res/xml-mcc310-mnc750/mms_config.xml b/app/src/main/res/xml-mcc310-mnc750/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc750/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc750/mms_config.xml diff --git a/res/xml-mcc310-mnc770/mms_config.xml b/app/src/main/res/xml-mcc310-mnc770/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc770/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc770/mms_config.xml diff --git a/res/xml-mcc310-mnc920/mms_config.xml b/app/src/main/res/xml-mcc310-mnc920/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc920/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc920/mms_config.xml diff --git a/res/xml-mcc310-mnc980/mms_config.xml b/app/src/main/res/xml-mcc310-mnc980/mms_config.xml similarity index 100% rename from res/xml-mcc310-mnc980/mms_config.xml rename to app/src/main/res/xml-mcc310-mnc980/mms_config.xml diff --git a/res/xml-mcc311-mnc012/mms_config.xml b/app/src/main/res/xml-mcc311-mnc012/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc012/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc012/mms_config.xml diff --git a/res/xml-mcc311-mnc070/mms_config.xml b/app/src/main/res/xml-mcc311-mnc070/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc070/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc070/mms_config.xml diff --git a/res/xml-mcc311-mnc100/mms_config.xml b/app/src/main/res/xml-mcc311-mnc100/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc100/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc100/mms_config.xml diff --git a/res/xml-mcc311-mnc180/mms_config.xml b/app/src/main/res/xml-mcc311-mnc180/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc180/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc180/mms_config.xml diff --git a/res/xml-mcc311-mnc220/mms_config.xml b/app/src/main/res/xml-mcc311-mnc220/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc220/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc220/mms_config.xml diff --git a/res/xml-mcc311-mnc221/mms_config.xml b/app/src/main/res/xml-mcc311-mnc221/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc221/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc221/mms_config.xml diff --git a/res/xml-mcc311-mnc222/mms_config.xml b/app/src/main/res/xml-mcc311-mnc222/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc222/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc222/mms_config.xml diff --git a/res/xml-mcc311-mnc223/mms_config.xml b/app/src/main/res/xml-mcc311-mnc223/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc223/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc223/mms_config.xml diff --git a/res/xml-mcc311-mnc224/mms_config.xml b/app/src/main/res/xml-mcc311-mnc224/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc224/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc224/mms_config.xml diff --git a/res/xml-mcc311-mnc225/mms_config.xml b/app/src/main/res/xml-mcc311-mnc225/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc225/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc225/mms_config.xml diff --git a/res/xml-mcc311-mnc226/mms_config.xml b/app/src/main/res/xml-mcc311-mnc226/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc226/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc226/mms_config.xml diff --git a/res/xml-mcc311-mnc227/mms_config.xml b/app/src/main/res/xml-mcc311-mnc227/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc227/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc227/mms_config.xml diff --git a/res/xml-mcc311-mnc228/mms_config.xml b/app/src/main/res/xml-mcc311-mnc228/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc228/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc228/mms_config.xml diff --git a/res/xml-mcc311-mnc229/mms_config.xml b/app/src/main/res/xml-mcc311-mnc229/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc229/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc229/mms_config.xml diff --git a/res/xml-mcc311-mnc230/mms_config.xml b/app/src/main/res/xml-mcc311-mnc230/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc230/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc230/mms_config.xml diff --git a/res/xml-mcc311-mnc340/mms_config.xml b/app/src/main/res/xml-mcc311-mnc340/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc340/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc340/mms_config.xml diff --git a/res/xml-mcc311-mnc370/mms_config.xml b/app/src/main/res/xml-mcc311-mnc370/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc370/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc370/mms_config.xml diff --git a/res/xml-mcc311-mnc410/mms_config.xml b/app/src/main/res/xml-mcc311-mnc410/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc410/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc410/mms_config.xml diff --git a/res/xml-mcc311-mnc430/mms_config.xml b/app/src/main/res/xml-mcc311-mnc430/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc430/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc430/mms_config.xml diff --git a/res/xml-mcc311-mnc440/mms_config.xml b/app/src/main/res/xml-mcc311-mnc440/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc440/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc440/mms_config.xml diff --git a/res/xml-mcc311-mnc480/mms_config.xml b/app/src/main/res/xml-mcc311-mnc480/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc480/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc480/mms_config.xml diff --git a/res/xml-mcc311-mnc490/mms_config.xml b/app/src/main/res/xml-mcc311-mnc490/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc490/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc490/mms_config.xml diff --git a/res/xml-mcc311-mnc580/mms_config.xml b/app/src/main/res/xml-mcc311-mnc580/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc580/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc580/mms_config.xml diff --git a/res/xml-mcc311-mnc581/mms_config.xml b/app/src/main/res/xml-mcc311-mnc581/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc581/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc581/mms_config.xml diff --git a/res/xml-mcc311-mnc582/mms_config.xml b/app/src/main/res/xml-mcc311-mnc582/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc582/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc582/mms_config.xml diff --git a/res/xml-mcc311-mnc583/mms_config.xml b/app/src/main/res/xml-mcc311-mnc583/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc583/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc583/mms_config.xml diff --git a/res/xml-mcc311-mnc584/mms_config.xml b/app/src/main/res/xml-mcc311-mnc584/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc584/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc584/mms_config.xml diff --git a/res/xml-mcc311-mnc585/mms_config.xml b/app/src/main/res/xml-mcc311-mnc585/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc585/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc585/mms_config.xml diff --git a/res/xml-mcc311-mnc586/mms_config.xml b/app/src/main/res/xml-mcc311-mnc586/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc586/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc586/mms_config.xml diff --git a/res/xml-mcc311-mnc587/mms_config.xml b/app/src/main/res/xml-mcc311-mnc587/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc587/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc587/mms_config.xml diff --git a/res/xml-mcc311-mnc588/mms_config.xml b/app/src/main/res/xml-mcc311-mnc588/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc588/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc588/mms_config.xml diff --git a/res/xml-mcc311-mnc589/mms_config.xml b/app/src/main/res/xml-mcc311-mnc589/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc589/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc589/mms_config.xml diff --git a/res/xml-mcc311-mnc590/mms_config.xml b/app/src/main/res/xml-mcc311-mnc590/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc590/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc590/mms_config.xml diff --git a/res/xml-mcc311-mnc870/mms_config.xml b/app/src/main/res/xml-mcc311-mnc870/mms_config.xml similarity index 100% rename from res/xml-mcc311-mnc870/mms_config.xml rename to app/src/main/res/xml-mcc311-mnc870/mms_config.xml diff --git a/res/xml-mcc312-mnc160/mms_config.xml b/app/src/main/res/xml-mcc312-mnc160/mms_config.xml similarity index 100% rename from res/xml-mcc312-mnc160/mms_config.xml rename to app/src/main/res/xml-mcc312-mnc160/mms_config.xml diff --git a/res/xml-mcc312-mnc530/mms_config.xml b/app/src/main/res/xml-mcc312-mnc530/mms_config.xml similarity index 100% rename from res/xml-mcc312-mnc530/mms_config.xml rename to app/src/main/res/xml-mcc312-mnc530/mms_config.xml diff --git a/res/xml-mcc334-mnc020/mms_config.xml b/app/src/main/res/xml-mcc334-mnc020/mms_config.xml similarity index 100% rename from res/xml-mcc334-mnc020/mms_config.xml rename to app/src/main/res/xml-mcc334-mnc020/mms_config.xml diff --git a/res/xml-mcc418-mnc05/mms_config.xml b/app/src/main/res/xml-mcc418-mnc05/mms_config.xml similarity index 100% rename from res/xml-mcc418-mnc05/mms_config.xml rename to app/src/main/res/xml-mcc418-mnc05/mms_config.xml diff --git a/res/xml-mcc418-mnc20/mms_config.xml b/app/src/main/res/xml-mcc418-mnc20/mms_config.xml similarity index 100% rename from res/xml-mcc418-mnc20/mms_config.xml rename to app/src/main/res/xml-mcc418-mnc20/mms_config.xml diff --git a/res/xml-mcc418-mnc30/mms_config.xml b/app/src/main/res/xml-mcc418-mnc30/mms_config.xml similarity index 100% rename from res/xml-mcc418-mnc30/mms_config.xml rename to app/src/main/res/xml-mcc418-mnc30/mms_config.xml diff --git a/res/xml-mcc420-mnc04/mms_config.xml b/app/src/main/res/xml-mcc420-mnc04/mms_config.xml similarity index 100% rename from res/xml-mcc420-mnc04/mms_config.xml rename to app/src/main/res/xml-mcc420-mnc04/mms_config.xml diff --git a/res/xml-mcc440-mnc10/mms_config.xml b/app/src/main/res/xml-mcc440-mnc10/mms_config.xml similarity index 100% rename from res/xml-mcc440-mnc10/mms_config.xml rename to app/src/main/res/xml-mcc440-mnc10/mms_config.xml diff --git a/res/xml-mcc440-mnc11/mms_config.xml b/app/src/main/res/xml-mcc440-mnc11/mms_config.xml similarity index 100% rename from res/xml-mcc440-mnc11/mms_config.xml rename to app/src/main/res/xml-mcc440-mnc11/mms_config.xml diff --git a/res/xml-mcc440-mnc20/mms_config.xml b/app/src/main/res/xml-mcc440-mnc20/mms_config.xml similarity index 100% rename from res/xml-mcc440-mnc20/mms_config.xml rename to app/src/main/res/xml-mcc440-mnc20/mms_config.xml diff --git a/res/xml-mcc450-mnc00/mms_config.xml b/app/src/main/res/xml-mcc450-mnc00/mms_config.xml similarity index 100% rename from res/xml-mcc450-mnc00/mms_config.xml rename to app/src/main/res/xml-mcc450-mnc00/mms_config.xml diff --git a/res/xml-mcc450-mnc02/mms_config.xml b/app/src/main/res/xml-mcc450-mnc02/mms_config.xml similarity index 100% rename from res/xml-mcc450-mnc02/mms_config.xml rename to app/src/main/res/xml-mcc450-mnc02/mms_config.xml diff --git a/res/xml-mcc450-mnc05/mms_config.xml b/app/src/main/res/xml-mcc450-mnc05/mms_config.xml similarity index 100% rename from res/xml-mcc450-mnc05/mms_config.xml rename to app/src/main/res/xml-mcc450-mnc05/mms_config.xml diff --git a/res/xml-mcc450-mnc06/mms_config.xml b/app/src/main/res/xml-mcc450-mnc06/mms_config.xml similarity index 100% rename from res/xml-mcc450-mnc06/mms_config.xml rename to app/src/main/res/xml-mcc450-mnc06/mms_config.xml diff --git a/res/xml-mcc450-mnc08/mms_config.xml b/app/src/main/res/xml-mcc450-mnc08/mms_config.xml similarity index 100% rename from res/xml-mcc450-mnc08/mms_config.xml rename to app/src/main/res/xml-mcc450-mnc08/mms_config.xml diff --git a/res/xml-mcc505-mnc01/mms_config.xml b/app/src/main/res/xml-mcc505-mnc01/mms_config.xml similarity index 100% rename from res/xml-mcc505-mnc01/mms_config.xml rename to app/src/main/res/xml-mcc505-mnc01/mms_config.xml diff --git a/res/xml-mcc530-mnc05/mms_config.xml b/app/src/main/res/xml-mcc530-mnc05/mms_config.xml similarity index 100% rename from res/xml-mcc530-mnc05/mms_config.xml rename to app/src/main/res/xml-mcc530-mnc05/mms_config.xml diff --git a/res/xml-mcc604-mnc00/mms_config.xml b/app/src/main/res/xml-mcc604-mnc00/mms_config.xml similarity index 100% rename from res/xml-mcc604-mnc00/mms_config.xml rename to app/src/main/res/xml-mcc604-mnc00/mms_config.xml diff --git a/res/xml-mcc604-mnc02/mms_config.xml b/app/src/main/res/xml-mcc604-mnc02/mms_config.xml similarity index 100% rename from res/xml-mcc604-mnc02/mms_config.xml rename to app/src/main/res/xml-mcc604-mnc02/mms_config.xml diff --git a/res/xml-mcc647-mnc10/mms_config.xml b/app/src/main/res/xml-mcc647-mnc10/mms_config.xml similarity index 100% rename from res/xml-mcc647-mnc10/mms_config.xml rename to app/src/main/res/xml-mcc647-mnc10/mms_config.xml diff --git a/res/xml/mms_config.xml b/app/src/main/res/xml/mms_config.xml similarity index 100% rename from res/xml/mms_config.xml rename to app/src/main/res/xml/mms_config.xml diff --git a/res/xml/preferences_application.xml b/app/src/main/res/xml/preferences_application.xml similarity index 100% rename from res/xml/preferences_application.xml rename to app/src/main/res/xml/preferences_application.xml diff --git a/res/xml/preferences_per_subscription.xml b/app/src/main/res/xml/preferences_per_subscription.xml similarity index 100% rename from res/xml/preferences_per_subscription.xml rename to app/src/main/res/xml/preferences_per_subscription.xml diff --git a/res/xml/widget_conversation.xml b/app/src/main/res/xml/widget_conversation.xml similarity index 100% rename from res/xml/widget_conversation.xml rename to app/src/main/res/xml/widget_conversation.xml diff --git a/res/xml/widget_conversation_list.xml b/app/src/main/res/xml/widget_conversation_list.xml similarity index 100% rename from res/xml/widget_conversation_list.xml rename to app/src/main/res/xml/widget_conversation_list.xml diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..586a2bb --- /dev/null +++ b/build.gradle @@ -0,0 +1,4 @@ +plugins { + id 'com.android.application' version '8.7.0' apply false + id 'com.android.library' version '8.7.0' apply false +} diff --git a/design/home_nav/automatye.svg b/design/home_nav/automatye.svg new file mode 100644 index 0000000..e236928 --- /dev/null +++ b/design/home_nav/automatye.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/design/home_nav/compose_fab.svg b/design/home_nav/compose_fab.svg new file mode 100644 index 0000000..b26a9ed --- /dev/null +++ b/design/home_nav/compose_fab.svg @@ -0,0 +1,4 @@ + + + + diff --git a/design/home_nav/contact.svg b/design/home_nav/contact.svg new file mode 100644 index 0000000..c815261 --- /dev/null +++ b/design/home_nav/contact.svg @@ -0,0 +1,12 @@ + + + + ic_fluent_contact_card_group_24_filled + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/design/home_nav/messages.svg b/design/home_nav/messages.svg new file mode 100644 index 0000000..b2cdd8e --- /dev/null +++ b/design/home_nav/messages.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..14f7eb7 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,8 @@ +org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8 +android.useAndroidX=true +android.nonFinalResIds=false + +# This project's dedicated emulator (do not use other AVDs for install/run tasks) +messaging.avd.name=Messaging_Test_API_36.1 +messaging.avd.serial=emulator-5556 +messaging.avd.port=5556 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2c3521197d7c4586c843d1d3e9090525f1898cde GIT binary patch literal 43504 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 yu?e%!_ptzGB|8GrCfu%p?(_ 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 TZiJi*F`$tkWLn) literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..19cfad9 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..4568d2c --- /dev/null +++ b/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015 the original authors. +# +# 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 +# +# https://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. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# gradlew start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh gradlew +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..6543977 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,80 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %OS%==Windows_NT endlocal + +:omega diff --git a/modules/chips b/modules/chips new file mode 160000 index 0000000..7ccb8ba --- /dev/null +++ b/modules/chips @@ -0,0 +1 @@ +Subproject commit 7ccb8ba59b168d748edfce5030ab6b01226ef393 diff --git a/modules/colorpicker b/modules/colorpicker new file mode 160000 index 0000000..34d5137 --- /dev/null +++ b/modules/colorpicker @@ -0,0 +1 @@ +Subproject commit 34d5137f881a0ffc9f6bb93c5d2e5bbe99265b00 diff --git a/modules/photoviewer b/modules/photoviewer new file mode 160000 index 0000000..fb5c100 --- /dev/null +++ b/modules/photoviewer @@ -0,0 +1 @@ +Subproject commit fb5c100b4a415e69e507962dd6c32660d71dfc66 diff --git a/modules/vcard b/modules/vcard new file mode 160000 index 0000000..f049d8c --- /dev/null +++ b/modules/vcard @@ -0,0 +1 @@ +Subproject commit f049d8cd3a6579d140d22fcdcbdbdfd5f7c020e3 diff --git a/packages_apps_Messaging.code-workspace b/packages_apps_Messaging.code-workspace new file mode 100644 index 0000000..b99677e --- /dev/null +++ b/packages_apps_Messaging.code-workspace @@ -0,0 +1,9 @@ +{ + "folders": [ + { + "name": "packages_apps_Messaging", + "path": "." + } + ], + "settings": {} +} diff --git a/res/layout/contact_picker_fragment.xml b/res/layout/contact_picker_fragment.xml deleted file mode 100644 index ce32a64..0000000 --- a/res/layout/contact_picker_fragment.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/res/layout/conversation_list_fragment.xml b/res/layout/conversation_list_fragment.xml deleted file mode 100644 index d26b55b..0000000 --- a/res/layout/conversation_list_fragment.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - diff --git a/res/layout/conversation_list_item_view.xml b/res/layout/conversation_list_item_view.xml deleted file mode 100644 index 382796a..0000000 --- a/res/layout/conversation_list_item_view.xml +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml deleted file mode 100644 index 7056b13..0000000 --- a/res/values-night/colors.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - @android:color/system_neutral1_800 - diff --git a/res/values-night/lineage_bools.xml b/res/values-night/lineage_bools.xml deleted file mode 100644 index 0116948..0000000 --- a/res/values-night/lineage_bools.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - false - diff --git a/res/xml-mcc234-mnc11 b/res/xml-mcc234-mnc11 deleted file mode 120000 index e29c9d3..0000000 --- a/res/xml-mcc234-mnc11 +++ /dev/null @@ -1 +0,0 @@ -xml-mcc234-mnc10 \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..78cb07c --- /dev/null +++ b/settings.gradle @@ -0,0 +1,23 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) + repositories { + google() + mavenCentral() + } +} + +rootProject.name = 'Messaging' + +include ':app' +include ':modules:colorpicker' +include ':modules:chips' +include ':modules:photoviewer' +include ':modules:vcard' diff --git a/src/com/android/messaging/ui/conversationlist/ConversationListAdapter.java b/src/com/android/messaging/ui/conversationlist/ConversationListAdapter.java deleted file mode 100644 index b001925..0000000 --- a/src/com/android/messaging/ui/conversationlist/ConversationListAdapter.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * Copyright (C) 2024 The LineageOS 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.messaging.ui.conversationlist; - -import android.content.Context; -import android.database.Cursor; -import androidx.recyclerview.widget.RecyclerView; -import android.view.LayoutInflater; -import android.view.ViewGroup; - -import com.android.messaging.R; -import com.android.messaging.ui.CursorRecyclerAdapter; - -/** - * Provides an interface to expose Conversation List Cursor data to a UI widget like a ListView. - */ -public class ConversationListAdapter - extends CursorRecyclerAdapter { - - private final ConversationListItemView.HostInterface mClivHostInterface; - - public ConversationListAdapter(final Context context, final Cursor cursor, - final ConversationListItemView.HostInterface clivHostInterface) { - super(context, cursor, 0); - mClivHostInterface = clivHostInterface; - setHasStableIds(true); - } - - /** - * @see com.android.messaging.ui.CursorRecyclerAdapter#bindViewHolder( - * androidx.recyclerview.widget.RecyclerView.ViewHolder, android.content.Context, - * android.database.Cursor) - */ - @Override - public void bindViewHolder(final ConversationListViewHolder holder, final Context context, - final Cursor cursor) { - final ConversationListItemView conversationListItemView = holder.mView; - conversationListItemView.bind(cursor, mClivHostInterface); - } - - @Override - public ConversationListViewHolder createViewHolder(final Context context, - final ViewGroup parent, final int viewType) { - final LayoutInflater layoutInflater = LayoutInflater.from(context); - final ConversationListItemView itemView = - (ConversationListItemView) layoutInflater.inflate( - R.layout.conversation_list_item_view, null); - return new ConversationListViewHolder(itemView); - } - - /** - * ViewHolder that holds a ConversationListItemView. - */ - public static class ConversationListViewHolder extends RecyclerView.ViewHolder { - final ConversationListItemView mView; - - public ConversationListViewHolder(final ConversationListItemView itemView) { - super(itemView); - mView = itemView; - } - } -} diff --git a/src/com/android/messaging/ui/conversationlist/ConversationListFragment.java b/src/com/android/messaging/ui/conversationlist/ConversationListFragment.java deleted file mode 100644 index bfafae0..0000000 --- a/src/com/android/messaging/ui/conversationlist/ConversationListFragment.java +++ /dev/null @@ -1,420 +0,0 @@ -/* - * Copyright (C) 2015 The Android Open Source Project - * Copyright (C) 2024-2025 The LineageOS 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.messaging.ui.conversationlist; - -import android.app.Activity; -import android.content.Context; -import android.database.Cursor; -import android.graphics.Rect; -import android.net.Uri; -import android.os.Bundle; -import android.os.Parcelable; -import android.view.LayoutInflater; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewGroup.MarginLayoutParams; -import android.view.ViewPropertyAnimator; -import android.view.accessibility.AccessibilityManager; -import android.widget.AbsListView; - -import androidx.annotation.NonNull; -import androidx.core.view.ViewGroupCompat; -import androidx.fragment.app.Fragment; -import androidx.loader.app.LoaderManager; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; - -import com.android.messaging.R; -import com.android.messaging.datamodel.DataModel; -import com.android.messaging.datamodel.binding.Binding; -import com.android.messaging.datamodel.binding.BindingBase; -import com.android.messaging.datamodel.data.ConversationListData; -import com.android.messaging.datamodel.data.ConversationListData.ConversationListDataListener; -import com.android.messaging.datamodel.data.ConversationListItemData; -import com.android.messaging.ui.ListEmptyView; -import com.android.messaging.ui.SnackBarInteraction; -import com.android.messaging.ui.UIIntents; -import com.android.messaging.util.AccessibilityUtil; -import com.android.messaging.util.ImeUtil; -import com.android.messaging.util.LogUtil; -import com.android.messaging.util.UiUtils; -import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton; - -import java.util.ArrayList; -import java.util.List; - -/** - * Shows a list of conversations. - */ -public class ConversationListFragment extends Fragment implements ConversationListDataListener, - ConversationListItemView.HostInterface { - private static final String BUNDLE_ARCHIVED_MODE = "archived_mode"; - private static final String BUNDLE_FORWARD_MESSAGE_MODE = "forward_message_mode"; - - private MenuItem mShowBlockedMenuItem; - private boolean mArchiveMode; - private boolean mBlockedAvailable; - private boolean mForwardMessageMode; - - public interface ConversationListFragmentHost { - void onConversationClick(final ConversationListData listData, - final ConversationListItemData conversationListItemData, - final boolean isLongClick, - final ConversationListItemView conversationView); - void onCreateConversationClick(); - boolean isConversationSelected(final String conversationId); - boolean isSwipeAnimatable(); - boolean isSelectionMode(); - boolean hasWindowFocus(); - } - - private ConversationListFragmentHost mHost; - private RecyclerView mRecyclerView; - private ExtendedFloatingActionButton mStartNewConversationButton; - private ListEmptyView mEmptyListMessageView; - private ConversationListAdapter mAdapter; - - // Saved Instance State Data - only for temporal data which is nice to maintain but not - // critical for correctness. - private static final String SAVED_INSTANCE_STATE_LIST_VIEW_STATE_KEY = - "conversationListViewState"; - private Parcelable mListState; - - final Binding mListBinding = BindingBase.createBinding(this); - - public static ConversationListFragment createArchivedConversationListFragment() { - return createConversationListFragment(BUNDLE_ARCHIVED_MODE); - } - - public static ConversationListFragment createForwardMessageConversationListFragment() { - return createConversationListFragment(BUNDLE_FORWARD_MESSAGE_MODE); - } - - public static ConversationListFragment createConversationListFragment(String modeKeyName) { - final ConversationListFragment fragment = new ConversationListFragment(); - if (modeKeyName != null) { - final Bundle bundle = new Bundle(); - bundle.putBoolean(modeKeyName, true); - fragment.setArguments(bundle); - } - return fragment; - } - - /** - * {@inheritDoc} from Fragment - */ - @Override - public void onCreate(final Bundle bundle) { - super.onCreate(bundle); - mListBinding.getData().init(LoaderManager.getInstance(this), mListBinding); - mAdapter = new ConversationListAdapter(getActivity(), null, this); - } - - @Override - public void onResume() { - super.onResume(); - - mHost = (ConversationListFragmentHost) getActivity(); - setScrolledToNewestConversationIfNeeded(); - - updateUi(); - } - - public void setScrolledToNewestConversationIfNeeded() { - if (!mArchiveMode - && !mForwardMessageMode - && isScrolledToFirstConversation() - && mHost.hasWindowFocus()) { - mListBinding.getData().setScrolledToNewestConversation(true); - } - } - - private boolean isScrolledToFirstConversation() { - int firstItemPosition = ((LinearLayoutManager) mRecyclerView.getLayoutManager()) - .findFirstCompletelyVisibleItemPosition(); - return firstItemPosition == 0; - } - - /** - * {@inheritDoc} from Fragment - */ - @Override - public void onDestroy() { - super.onDestroy(); - mListBinding.unbind(); - mHost = null; - } - - /** - * {@inheritDoc} from Fragment - */ - @Override - public View onCreateView(final LayoutInflater inflater, final ViewGroup container, - final Bundle savedInstanceState) { - final ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.conversation_list_fragment, - container, false); - mRecyclerView = rootView.findViewById(android.R.id.list); - mEmptyListMessageView = rootView.findViewById(R.id.no_conversations_view); - mEmptyListMessageView.setImageHint(R.drawable.ic_oobe_conv_list); - // The default behavior for default layout param generation by LinearLayoutManager is to - // provide width and height of WRAP_CONTENT, but this is not desirable for - // ConversationListFragment; the view in each row should be a width of MATCH_PARENT so that - // the entire row is tappable. - final Activity activity = getActivity(); - final LinearLayoutManager manager = new LinearLayoutManager(activity) { - @Override - public RecyclerView.LayoutParams generateDefaultLayoutParams() { - return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.WRAP_CONTENT); - } - }; - mRecyclerView.setLayoutManager(manager); - mRecyclerView.setHasFixedSize(true); - mRecyclerView.setAdapter(mAdapter); - mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { - int mCurrentState = AbsListView.OnScrollListener.SCROLL_STATE_IDLE; - - @Override - public void onScrolled(@NonNull final RecyclerView recyclerView, final int dx, - final int dy) { - if (mCurrentState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL - || mCurrentState == AbsListView.OnScrollListener.SCROLL_STATE_FLING) { - ImeUtil.get().hideImeKeyboard(getActivity(), mRecyclerView); - } - - if (isScrolledToFirstConversation()) { - setScrolledToNewestConversationIfNeeded(); - } else { - mListBinding.getData().setScrolledToNewestConversation(false); - } - } - - @Override - public void onScrollStateChanged(@NonNull final RecyclerView recyclerView, - final int newState) { - mCurrentState = newState; - } - }); - mRecyclerView.addOnItemTouchListener(new ConversationListSwipeHelper(mRecyclerView)); - - if (savedInstanceState != null) { - mListState = savedInstanceState.getParcelable(SAVED_INSTANCE_STATE_LIST_VIEW_STATE_KEY, - Parcelable.class); - } - - mStartNewConversationButton = rootView.findViewById(R.id.start_new_conversation_button); - if (mArchiveMode || mForwardMessageMode) { - mStartNewConversationButton.setVisibility(View.GONE); - } else { - mStartNewConversationButton.setVisibility(View.VISIBLE); - mStartNewConversationButton.setOnClickListener(clickView -> - mHost.onCreateConversationClick()); - } - - // The root view has a non-null background, which by default is deemed by the framework - // to be a "transition group," where all child views are animated together during an - // activity transition. However, we want each individual items in the recycler view to - // show explode animation themselves, so we explicitly tag the root view to be a non-group. - ViewGroupCompat.setTransitionGroup(rootView, false); - - setHasOptionsMenu(true); - return rootView; - } - - @Override - public void onAttach(@NonNull final Context context) { - super.onAttach(context); - LogUtil.v(LogUtil.BUGLE_TAG, "Attaching List"); - final Bundle arguments = getArguments(); - if (arguments != null) { - mArchiveMode = arguments.getBoolean(BUNDLE_ARCHIVED_MODE, false); - mForwardMessageMode = arguments.getBoolean(BUNDLE_FORWARD_MESSAGE_MODE, false); - } - mListBinding.bind(DataModel.get().createConversationListData(context, this, mArchiveMode)); - } - - - @Override - public void onSaveInstanceState(@NonNull final Bundle outState) { - super.onSaveInstanceState(outState); - if (mListState != null) { - outState.putParcelable(SAVED_INSTANCE_STATE_LIST_VIEW_STATE_KEY, mListState); - } - } - - @Override - public void onPause() { - super.onPause(); - mListState = mRecyclerView.getLayoutManager().onSaveInstanceState(); - mListBinding.getData().setScrolledToNewestConversation(false); - } - - @Override - public void onConversationListCursorUpdated(final ConversationListData data, - final Cursor cursor) { - mListBinding.ensureBound(data); - final Cursor oldCursor = mAdapter.swapCursor(cursor); - updateEmptyListUi(cursor == null || cursor.getCount() == 0); - if (mListState != null && cursor != null && oldCursor == null) { - mRecyclerView.getLayoutManager().onRestoreInstanceState(mListState); - } - } - - @Override - public void setBlockedParticipantsAvailable(final boolean blockedAvailable) { - mBlockedAvailable = blockedAvailable; - if (mShowBlockedMenuItem != null) { - mShowBlockedMenuItem.setVisible(blockedAvailable); - } - } - - public void updateUi() { - mAdapter.notifyDataSetChanged(); - } - - @Override - public void onPrepareOptionsMenu(@NonNull final Menu menu) { - super.onPrepareOptionsMenu(menu); - final MenuItem startNewConversationMenuItem = - menu.findItem(R.id.action_start_new_conversation); - if (startNewConversationMenuItem != null) { - // It is recommended for the Floating Action button functionality to be duplicated as a - // menu - AccessibilityManager accessibilityManager = (AccessibilityManager) - requireActivity().getSystemService(Context.ACCESSIBILITY_SERVICE); - startNewConversationMenuItem.setVisible(accessibilityManager - .isTouchExplorationEnabled()); - } - - final MenuItem archive = menu.findItem(R.id.action_show_archived); - if (archive != null) { - archive.setVisible(true); - } - } - - @Override - public void onCreateOptionsMenu(@NonNull final Menu menu, - @NonNull final MenuInflater inflater) { - if (!isAdded()) { - // Guard against being called before we're added to the activity - return; - } - - mShowBlockedMenuItem = menu.findItem(R.id.action_show_blocked_contacts); - if (mShowBlockedMenuItem != null) { - mShowBlockedMenuItem.setVisible(mBlockedAvailable); - } - } - - /** - * {@inheritDoc} from ConversationListItemView.HostInterface - */ - @Override - public void onConversationClicked(final ConversationListItemData conversationListItemData, - final boolean isLongClick, final ConversationListItemView conversationView) { - final ConversationListData listData = mListBinding.getData(); - mHost.onConversationClick(listData, conversationListItemData, isLongClick, - conversationView); - } - - /** - * {@inheritDoc} from ConversationListItemView.HostInterface - */ - @Override - public boolean isConversationSelected(final String conversationId) { - return mHost.isConversationSelected(conversationId); - } - - @Override - public boolean isSwipeAnimatable() { - return mHost.isSwipeAnimatable(); - } - - // Show and hide empty list UI as needed with appropriate text based on view specifics - private void updateEmptyListUi(final boolean isEmpty) { - if (isEmpty) { - int emptyListText; - if (!mListBinding.getData().getHasFirstSyncCompleted()) { - emptyListText = R.string.conversation_list_first_sync_text; - } else if (mArchiveMode) { - emptyListText = R.string.archived_conversation_list_empty_text; - } else { - emptyListText = R.string.conversation_list_empty_text; - } - mEmptyListMessageView.setTextHint(emptyListText); - mEmptyListMessageView.setVisibility(View.VISIBLE); - mEmptyListMessageView.setIsImageVisible(true); - mEmptyListMessageView.setIsVerticallyCentered(true); - } else { - mEmptyListMessageView.setVisibility(View.GONE); - } - } - - @Override - public List getSnackBarInteractions() { - final List interactions = new ArrayList<>(1); - final SnackBarInteraction fabInteraction = - new SnackBarInteraction.BasicSnackBarInteraction(mStartNewConversationButton); - interactions.add(fabInteraction); - return interactions; - } - - private ViewPropertyAnimator getNormalizedFabAnimator() { - return mStartNewConversationButton.animate() - .setInterpolator(UiUtils.DEFAULT_INTERPOLATOR) - .setDuration(getActivity().getResources().getInteger( - R.integer.fab_animation_duration_ms)); - } - - public void dismissFab() { - // To prevent clicking while animating. - mStartNewConversationButton.setEnabled(false); - final MarginLayoutParams lp = - (MarginLayoutParams) mStartNewConversationButton.getLayoutParams(); - final float fabWidthWithLeftRightMargin = mStartNewConversationButton.getWidth() - + lp.leftMargin + lp.rightMargin; - final int direction = AccessibilityUtil.isLayoutRtl(mStartNewConversationButton) ? -1 : 1; - getNormalizedFabAnimator().translationX(direction * fabWidthWithLeftRightMargin); - } - - public void showFab() { - getNormalizedFabAnimator().translationX(0).withEndAction(() -> { - // Re-enable clicks after the animation. - mStartNewConversationButton.setEnabled(true); - }); - } - - @Override - public void startFullScreenPhotoViewer( - final Uri initialPhoto, final Rect initialPhotoBounds, final Uri photosUri) { - UIIntents.get().launchFullScreenPhotoViewer( - getActivity(), initialPhoto, initialPhotoBounds, photosUri); - } - - @Override - public void startFullScreenVideoViewer(final Uri videoUri) { - UIIntents.get().launchFullScreenVideoViewer(getActivity(), videoUri); - } - - @Override - public boolean isSelectionMode() { - return mHost != null && mHost.isSelectionMode(); - } -} diff --git a/tools/looply_applied.png b/tools/looply_applied.png new file mode 100644 index 0000000000000000000000000000000000000000..33c2c6b5b9197c476f40e82c9ae1ce958f676251 GIT binary patch literal 55997 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 IjeAf32LKnDdjJ3c literal 0 HcmV?d00001 diff --git a/tools/seed_contacts.sh b/tools/seed_contacts.sh new file mode 100644 index 0000000..be31409 --- /dev/null +++ b/tools/seed_contacts.sh @@ -0,0 +1,54 @@ +#!/system/bin/sh +# Seed contacts for Messaging demo (run on device via adb shell) + +add_contact() { + name="$1" + phone="$2" + content insert --uri content://com.android.contacts/raw_contacts \ + --bind account_type:s:com.android.local \ + --bind account_name:s:Phone >/dev/null + raw=$(content query --uri content://com.android.contacts/raw_contacts \ + --projection _id --sort '_id DESC' | head -n1 | sed 's/.*_id=//') + if [ -z "$raw" ]; then + echo "FAIL $name" + return 1 + fi + content insert --uri content://com.android.contacts/data \ + --bind raw_contact_id:i:$raw \ + --bind mimetype:s:vnd.android.cursor.item/name \ + --bind data1:s:"$name" >/dev/null + content insert --uri content://com.android.contacts/data \ + --bind raw_contact_id:i:$raw \ + --bind mimetype:s:vnd.android.cursor.item/phone_v2 \ + --bind data1:s:"$phone" \ + --bind data2:i:2 >/dev/null + echo "OK $name raw=$raw" +} + +add_contact "Sarah Jenkins" "+15551230001" +add_contact "Product Design" "+15551230002" +add_contact "David Chen" "+15551230003" +add_contact "Marcus Knight" "+15551230004" +add_contact "Priya Patel" "+15551230005" +add_contact "Alex Rivera" "+15551230006" +add_contact "Jordan Lee" "+15551230007" +add_contact "Mom" "+15551230008" +add_contact "Cafe Nova" "+15551230009" +add_contact "Bank Alerts" "+15551230010" +add_contact "Nina Okonkwo" "+15551230011" +add_contact "Chris Park" "+15551230012" +add_contact "Emily Watson" "+15551230013" +add_contact "Support Desk" "+15551230014" +add_contact "Leo Martinez" "+15551230015" +add_contact "Hannah Kim" "+15551230016" +add_contact "Delivery" "+15551230017" +add_contact "Sam Torres" "+15551230018" +add_contact "Auto Bot" "+15551230019" +add_contact "Riley Quinn" "+15551230020" +add_contact "Dr Patel" "+15551230021" +add_contact "Gym Club" "+15551230022" +add_contact "Mia Chen" "+15551230023" +add_contact "Owen Brooks" "+15551230024" + +echo "CONTACTS:" +content query --uri content://com.android.contacts/contacts --projection display_name diff --git a/tools/seed_demo_data.ps1 b/tools/seed_demo_data.ps1 new file mode 100644 index 0000000..129cfbf --- /dev/null +++ b/tools/seed_demo_data.ps1 @@ -0,0 +1,85 @@ +# Seed demo contacts + SMS for Messaging UI preview (emulator-5556) +# Usage: powershell -ExecutionPolicy Bypass -File tools/seed_demo_data.ps1 +$ErrorActionPreference = "Continue" +$sdk = "$env:LOCALAPPDATA\Android\Sdk" +$adb = Join-Path $sdk "platform-tools\adb.exe" +$serial = "emulator-5556" + +function Invoke-Adb { + param([Parameter(ValueFromRemainingArguments = $true)][string[]]$CmdArgs) + & $adb -s $serial @CmdArgs +} + +Write-Host "== Default SMS + permissions ==" +Invoke-Adb shell cmd role add-role-holder android.app.role.SMS com.android.messaging | Out-Null +Invoke-Adb shell settings put secure sms_default_application com.android.messaging | Out-Null +foreach ($p in @( + "READ_SMS","RECEIVE_SMS","SEND_SMS","RECEIVE_MMS", + "READ_CONTACTS","WRITE_CONTACTS","READ_PHONE_STATE", + "READ_PHONE_NUMBERS","POST_NOTIFICATIONS" +)) { + Invoke-Adb shell pm grant com.android.messaging "android.permission.$p" 2>$null | Out-Null +} + +$demo = @( + @{ Name = "Sarah Jenkins"; Phone = "+15551230001"; Msgs = @("Can you review the Looply mock before standup?","Also dropped the Figma link.","Morning! Coffee run in 10?") } + @{ Name = "Product Design"; Phone = "+15551230002"; Msgs = @("Team sync moved to 3pm.","New icon set is ready for QA.") } + @{ Name = "David Chen"; Phone = "+15551230003"; Msgs = @("On my way - traffic near Market St.","Got the package. Thanks!") } + @{ Name = "Marcus Knight"; Phone = "+15551230004"; Msgs = @("Ship checklist looks good. Ship it.","Need one more screenshot.") } + @{ Name = "Priya Patel"; Phone = "+15551230005"; Msgs = @("Unread reminder: invoice 4821 waiting.","Ping me when you are free.") } + @{ Name = "Alex Rivera"; Phone = "+15551230006"; Msgs = @("Weekend hike still on?","Bring extra water.") } + @{ Name = "Jordan Lee"; Phone = "+15551230007"; Msgs = @("Draft PR for home chips is up.","Can you take a look before EOD?") } + @{ Name = "Mom"; Phone = "+15551230008"; Msgs = @("Call me when you land.","Love you!") } + @{ Name = "Cafe Nova"; Phone = "+15551230009"; Msgs = @("Your order is ready for pickup.","Table for 2 confirmed at 7:30.") } + @{ Name = "Bank Alerts"; Phone = "+15551230010"; Msgs = @("Purchase of 42.18 at LOOPLY MARKET.","Your statement is available.") } + @{ Name = "Nina Okonkwo"; Phone = "+15551230011"; Msgs = @("Shared the brand tokens doc.","Purple 5A31F4 is locked.") } + @{ Name = "Chris Park"; Phone = "+15551230012"; Msgs = @("Gym at 6?","Bring the resistance bands.") } + @{ Name = "Emily Watson"; Phone = "+15551230013"; Msgs = @("Flight delayed 40 min.","See you at baggage claim.") } + @{ Name = "Support Desk"; Phone = "+15551230014"; Msgs = @("Ticket 9021 resolved. Reply STOP to opt out.","We received your request.") } + @{ Name = "Leo Martinez"; Phone = "+15551230015"; Msgs = @("Game night Friday?","I will bring snacks.") } + @{ Name = "Hannah Kim"; Phone = "+15551230016"; Msgs = @("Updated the contacts card layout.","Looks much closer to Message+.") } + @{ Name = "Delivery"; Phone = "+15551230017"; Msgs = @("Driver is 3 stops away.","Pin: leave at door.") } + @{ Name = "Sam Torres"; Phone = "+15551230018"; Msgs = @("Lunch tomorrow?","That new ramen place.") } + @{ Name = "Auto Bot"; Phone = "+15551230019"; Msgs = @("Automation rule ran successfully.","3 messages routed to Archives.") } + @{ Name = "Riley Quinn"; Phone = "+15551230020"; Msgs = @("Photo from the rooftop attached concept.","Cant wait for launch week!") } + @{ Name = "Dr Patel"; Phone = "+15551230021"; Msgs = @("Appointment confirmed for Tue 10:30am.","Reply C to confirm.") } + @{ Name = "Gym Club"; Phone = "+15551230022"; Msgs = @("Class starts in 20 minutes.","Membership renews next month.") } + @{ Name = "Mia Chen"; Phone = "+15551230023"; Msgs = @("Sent the locale strings.","KO EN both look good.") } + @{ Name = "Owen Brooks"; Phone = "+15551230024"; Msgs = @("Parking is full - use lot B.","See you inside.") } +) + +Write-Host "== Contacts ($($demo.Count)) ==" +foreach ($c in $demo) { + Invoke-Adb shell "content insert --uri content://com.android.contacts/raw_contacts --bind account_type:s:com.android.local --bind account_name:s:Phone" | Out-Null + $row = (Invoke-Adb shell "content query --uri content://com.android.contacts/raw_contacts --projection _id --sort '_id DESC'") | Select-Object -First 1 + if ($row -match "_id=(\d+)") { + $id = $Matches[1] + Invoke-Adb shell "content insert --uri content://com.android.contacts/data --bind raw_contact_id:i:$id --bind mimetype:s:vnd.android.cursor.item/name --bind data1:s:'$($c.Name)'" | Out-Null + Invoke-Adb shell "content insert --uri content://com.android.contacts/data --bind raw_contact_id:i:$id --bind mimetype:s:vnd.android.cursor.item/phone_v2 --bind data1:s:$($c.Phone) --bind data2:i:2" | Out-Null + Write-Host " + $($c.Name)" + } +} + +Write-Host "== SMS threads ==" +$sends = 0 +foreach ($c in $demo) { + for ($i = $c.Msgs.Count - 1; $i -ge 0; $i--) { + Invoke-Adb emu sms send $c.Phone $c.Msgs[$i] | Out-Null + $sends++ + Start-Sleep -Milliseconds 120 + } + Write-Host " thread $($c.Name)" +} +Write-Host " sends=$sends" + +Write-Host "== Mark half read ==" +for ($i = 0; $i -lt $demo.Count; $i += 2) { + $phone = $demo[$i].Phone + Invoke-Adb shell "content update --uri content://sms --bind read:i:1 --bind seen:i:1 --where `"address='$phone'`"" | Out-Null +} + +Write-Host "== Relaunch ==" +Invoke-Adb shell am force-stop com.android.messaging | Out-Null +Start-Sleep -Seconds 1 +Invoke-Adb shell am start -n com.android.messaging/.ui.conversationlist.ConversationListActivity | Out-Null +Write-Host "Done."