From 52447f5e9730c000d389880975e15917d0e67503 Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Tue, 3 Dec 2019 11:05:03 -0500 Subject: [PATCH] Add storage management features. --- AndroidManifest.xml | 3 +- res/drawable/ic_archive_outline_24dp.xml | 9 + res/drawable/ic_archive_solid_24dp.xml | 9 + res/drawable/ic_arrow_down_14.xml | 9 + res/drawable/ic_check_circle_solid_20.xml | 12 + res/drawable/ic_grid_outline_20.xml | 36 ++ res/drawable/ic_grid_solid_20.xml | 24 + res/drawable/ic_list_outline_20.xml | 36 ++ res/drawable/ic_list_solid_20.xml | 30 + .../media_overview_size_pill_background.xml | 13 + res/drawable/storage_legend_audio.xml | 11 + res/drawable/storage_legend_files.xml | 11 + res/drawable/storage_legend_photos.xml | 11 + res/drawable/storage_legend_videos.xml | 11 + res/layout/audio_view.xml | 106 ++-- res/layout/audio_view_circle.xml | 53 ++ res/layout/audio_view_small.xml | 24 + res/layout/media_overview_activity.xml | 138 ++++- .../media_overview_detail_item_audio.xml | 29 + .../media_overview_detail_item_document.xml | 56 ++ .../media_overview_detail_item_media.xml | 28 + res/layout/media_overview_detail_text.xml | 46 ++ res/layout/media_overview_document_item.xml | 32 -- .../media_overview_documents_fragment.xml | 22 - .../media_overview_gallery_fragment.xml | 22 - res/layout/media_overview_gallery_item.xml | 46 +- .../media_overview_gallery_item_header.xml | 18 - ...der.xml => media_overview_item_header.xml} | 0 res/layout/media_overview_page_fragment.xml | 22 + .../media_overview_selected_overlay.xml | 20 + res/layout/preference_storage_category.xml | 98 ++++ res/layout/thumbnail_view.xml | 13 +- res/menu/media_preview.xml | 8 +- res/values/arrays.xml | 6 + res/values/attrs.xml | 6 + res/values/colors.xml | 8 +- res/values/dimens.xml | 2 + res/values/strings.xml | 42 +- res/values/themes.xml | 8 + res/xml/preferences.xml | 4 + res/xml/preferences_chats.xml | 21 - res/xml/preferences_storage.xml | 35 ++ .../ApplicationPreferencesActivity.java | 7 + .../securesms/MediaDocumentsAdapter.java | 129 ----- .../securesms/MediaGalleryAdapter.java | 170 ------ .../securesms/MediaOverviewActivity.java | 515 ------------------ .../securesms/MediaPreviewActivity.java | 124 +++-- .../RecipientPreferenceActivity.java | 71 +-- .../securesms/components/AudioView.java | 105 ++-- .../securesms/components/DocumentView.java | 46 +- .../securesms/components/ThumbnailView.java | 32 +- .../conversation/ConversationActivity.java | 8 +- .../conversation/ConversationItem.java | 13 +- .../database/CursorRecyclerViewAdapter.java | 11 +- .../securesms/database/MediaDatabase.java | 150 ++++- .../securesms/database/ThreadDatabase.java | 59 +- .../loaders/BucketedThreadMediaLoader.java | 228 -------- .../loaders/GroupedThreadMediaLoader.java | 313 +++++++++++ .../database/loaders/MediaLoader.java | 19 + .../database/loaders/PagingMediaLoader.java | 26 +- .../loaders/RecipientMediaLoader.java | 44 ++ .../database/loaders/ThreadMediaLoader.java | 46 +- .../securesms/mediaoverview/MediaActions.java | 114 ++++ .../mediaoverview/MediaGalleryAllAdapter.java | 396 ++++++++++++++ .../mediaoverview/MediaOverviewActivity.java | 264 +++++++++ .../MediaOverviewPageFragment.java | 329 +++++++++++ .../mediaoverview/MediaOverviewViewModel.java | 45 ++ .../CameraContactSelectionAdapter.java | 3 +- .../securesms/mms/AttachmentManager.java | 2 - src/org/thoughtcrime/securesms/mms/Slide.java | 29 + .../ApplicationPreferencesViewModel.java | 48 ++ .../preferences/ChatsPreferenceFragment.java | 66 +-- .../StoragePreferenceFragment.java | 109 ++++ .../preferences/widgets/StorageGraphView.java | 125 +++++ .../widgets/StoragePreferenceCategory.java | 73 +++ .../securesms/util/CalendarDateOnly.java | 23 + .../securesms/util/DateUtils.java | 8 +- .../securesms/util/MediaUtil.java | 77 ++- 78 files changed, 3343 insertions(+), 1622 deletions(-) create mode 100644 res/drawable/ic_archive_outline_24dp.xml create mode 100644 res/drawable/ic_archive_solid_24dp.xml create mode 100644 res/drawable/ic_arrow_down_14.xml create mode 100644 res/drawable/ic_check_circle_solid_20.xml create mode 100644 res/drawable/ic_grid_outline_20.xml create mode 100644 res/drawable/ic_grid_solid_20.xml create mode 100644 res/drawable/ic_list_outline_20.xml create mode 100644 res/drawable/ic_list_solid_20.xml create mode 100644 res/drawable/media_overview_size_pill_background.xml create mode 100644 res/drawable/storage_legend_audio.xml create mode 100644 res/drawable/storage_legend_files.xml create mode 100644 res/drawable/storage_legend_photos.xml create mode 100644 res/drawable/storage_legend_videos.xml create mode 100644 res/layout/audio_view_circle.xml create mode 100644 res/layout/audio_view_small.xml create mode 100644 res/layout/media_overview_detail_item_audio.xml create mode 100644 res/layout/media_overview_detail_item_document.xml create mode 100644 res/layout/media_overview_detail_item_media.xml create mode 100644 res/layout/media_overview_detail_text.xml delete mode 100644 res/layout/media_overview_document_item.xml delete mode 100644 res/layout/media_overview_documents_fragment.xml delete mode 100644 res/layout/media_overview_gallery_fragment.xml delete mode 100644 res/layout/media_overview_gallery_item_header.xml rename res/layout/{media_overview_document_item_header.xml => media_overview_item_header.xml} (100%) create mode 100644 res/layout/media_overview_page_fragment.xml create mode 100644 res/layout/media_overview_selected_overlay.xml create mode 100644 res/layout/preference_storage_category.xml create mode 100644 res/xml/preferences_storage.xml delete mode 100644 src/org/thoughtcrime/securesms/MediaDocumentsAdapter.java delete mode 100644 src/org/thoughtcrime/securesms/MediaGalleryAdapter.java delete mode 100644 src/org/thoughtcrime/securesms/MediaOverviewActivity.java delete mode 100644 src/org/thoughtcrime/securesms/database/loaders/BucketedThreadMediaLoader.java create mode 100644 src/org/thoughtcrime/securesms/database/loaders/GroupedThreadMediaLoader.java create mode 100644 src/org/thoughtcrime/securesms/database/loaders/MediaLoader.java create mode 100644 src/org/thoughtcrime/securesms/database/loaders/RecipientMediaLoader.java create mode 100644 src/org/thoughtcrime/securesms/mediaoverview/MediaActions.java create mode 100644 src/org/thoughtcrime/securesms/mediaoverview/MediaGalleryAllAdapter.java create mode 100644 src/org/thoughtcrime/securesms/mediaoverview/MediaOverviewActivity.java create mode 100644 src/org/thoughtcrime/securesms/mediaoverview/MediaOverviewPageFragment.java create mode 100644 src/org/thoughtcrime/securesms/mediaoverview/MediaOverviewViewModel.java create mode 100644 src/org/thoughtcrime/securesms/preferences/ApplicationPreferencesViewModel.java create mode 100644 src/org/thoughtcrime/securesms/preferences/StoragePreferenceFragment.java create mode 100644 src/org/thoughtcrime/securesms/preferences/widgets/StorageGraphView.java create mode 100644 src/org/thoughtcrime/securesms/preferences/widgets/StoragePreferenceCategory.java create mode 100644 src/org/thoughtcrime/securesms/util/CalendarDateOnly.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 921daf8c9a..8dc861b936 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -334,10 +334,9 @@ android:launchMode="singleTask" android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/> - + + diff --git a/res/drawable/ic_archive_solid_24dp.xml b/res/drawable/ic_archive_solid_24dp.xml new file mode 100644 index 0000000000..81b018af42 --- /dev/null +++ b/res/drawable/ic_archive_solid_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/res/drawable/ic_arrow_down_14.xml b/res/drawable/ic_arrow_down_14.xml new file mode 100644 index 0000000000..e395ff178c --- /dev/null +++ b/res/drawable/ic_arrow_down_14.xml @@ -0,0 +1,9 @@ + + + diff --git a/res/drawable/ic_check_circle_solid_20.xml b/res/drawable/ic_check_circle_solid_20.xml new file mode 100644 index 0000000000..a0c85f7943 --- /dev/null +++ b/res/drawable/ic_check_circle_solid_20.xml @@ -0,0 +1,12 @@ + + + + diff --git a/res/drawable/ic_grid_outline_20.xml b/res/drawable/ic_grid_outline_20.xml new file mode 100644 index 0000000000..136b041f3a --- /dev/null +++ b/res/drawable/ic_grid_outline_20.xml @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/res/drawable/ic_grid_solid_20.xml b/res/drawable/ic_grid_solid_20.xml new file mode 100644 index 0000000000..158e745e65 --- /dev/null +++ b/res/drawable/ic_grid_solid_20.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/res/drawable/ic_list_outline_20.xml b/res/drawable/ic_list_outline_20.xml new file mode 100644 index 0000000000..08491aebf3 --- /dev/null +++ b/res/drawable/ic_list_outline_20.xml @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/res/drawable/ic_list_solid_20.xml b/res/drawable/ic_list_solid_20.xml new file mode 100644 index 0000000000..459afe225f --- /dev/null +++ b/res/drawable/ic_list_solid_20.xml @@ -0,0 +1,30 @@ + + + + + + + + diff --git a/res/drawable/media_overview_size_pill_background.xml b/res/drawable/media_overview_size_pill_background.xml new file mode 100644 index 0000000000..2aeeddc40b --- /dev/null +++ b/res/drawable/media_overview_size_pill_background.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/res/drawable/storage_legend_audio.xml b/res/drawable/storage_legend_audio.xml new file mode 100644 index 0000000000..4857e5015b --- /dev/null +++ b/res/drawable/storage_legend_audio.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/res/drawable/storage_legend_files.xml b/res/drawable/storage_legend_files.xml new file mode 100644 index 0000000000..b40e8481e3 --- /dev/null +++ b/res/drawable/storage_legend_files.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/res/drawable/storage_legend_photos.xml b/res/drawable/storage_legend_photos.xml new file mode 100644 index 0000000000..f9f87c08f3 --- /dev/null +++ b/res/drawable/storage_legend_photos.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/res/drawable/storage_legend_videos.xml b/res/drawable/storage_legend_videos.xml new file mode 100644 index 0000000000..b4d161204c --- /dev/null +++ b/res/drawable/storage_legend_videos.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/res/layout/audio_view.xml b/res/layout/audio_view.xml index be31665670..907d95c319 100644 --- a/res/layout/audio_view.xml +++ b/res/layout/audio_view.xml @@ -1,87 +1,43 @@ + xmlns:tools="http://schemas.android.com/tools" + tools:context="org.thoughtcrime.securesms.components.AudioView"> - + - + - + - - - - - - - - - - - - - + - + diff --git a/res/layout/audio_view_circle.xml b/res/layout/audio_view_circle.xml new file mode 100644 index 0000000000..9aa6da342d --- /dev/null +++ b/res/layout/audio_view_circle.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/audio_view_small.xml b/res/layout/audio_view_small.xml new file mode 100644 index 0000000000..9e958b31de --- /dev/null +++ b/res/layout/audio_view_small.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/media_overview_activity.xml b/res/layout/media_overview_activity.xml index dfb82fb86f..2e57534c1b 100644 --- a/res/layout/media_overview_activity.xml +++ b/res/layout/media_overview_activity.xml @@ -1,39 +1,121 @@ - + + android:id="@+id/appBarLayout" + android:layout_width="0dp" + android:layout_height="wrap_content" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:id="@+id/toolbar" + android:layout_width="match_parent" + android:layout_height="?android:attr/actionBarSize" + android:background="?attr/media_overview_toolbar_background" + android:titleTextColor="?attr/media_overview_toolbar_foreground" + app:layout_scrollFlags="scroll|enterAlways" /> + android:id="@+id/tab_layout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_gravity="top" + android:background="?attr/media_overview_toolbar_background" + app:tabBackground="?attr/media_overview_toolbar_background" + app:tabIndicatorColor="@color/textsecure_primary" + app:tabSelectedTextColor="@color/textsecure_primary" /> - + - + + + + + + + + + + + + + + + diff --git a/res/layout/media_overview_detail_item_audio.xml b/res/layout/media_overview_detail_item_audio.xml new file mode 100644 index 0000000000..f5bc716a3d --- /dev/null +++ b/res/layout/media_overview_detail_item_audio.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + diff --git a/res/layout/media_overview_detail_item_document.xml b/res/layout/media_overview_detail_item_document.xml new file mode 100644 index 0000000000..942f07fc60 --- /dev/null +++ b/res/layout/media_overview_detail_item_document.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + diff --git a/res/layout/media_overview_detail_item_media.xml b/res/layout/media_overview_detail_item_media.xml new file mode 100644 index 0000000000..30b90f8eff --- /dev/null +++ b/res/layout/media_overview_detail_item_media.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + diff --git a/res/layout/media_overview_detail_text.xml b/res/layout/media_overview_detail_text.xml new file mode 100644 index 0000000000..13de189849 --- /dev/null +++ b/res/layout/media_overview_detail_text.xml @@ -0,0 +1,46 @@ + + + + + + + + \ No newline at end of file diff --git a/res/layout/media_overview_document_item.xml b/res/layout/media_overview_document_item.xml deleted file mode 100644 index 400c88cf76..0000000000 --- a/res/layout/media_overview_document_item.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/res/layout/media_overview_documents_fragment.xml b/res/layout/media_overview_documents_fragment.xml deleted file mode 100644 index b109d705ba..0000000000 --- a/res/layout/media_overview_documents_fragment.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/res/layout/media_overview_gallery_fragment.xml b/res/layout/media_overview_gallery_fragment.xml deleted file mode 100644 index 44ccb7e9ee..0000000000 --- a/res/layout/media_overview_gallery_fragment.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - diff --git a/res/layout/media_overview_gallery_item.xml b/res/layout/media_overview_gallery_item.xml index 44112d8af9..d0b49f1145 100644 --- a/res/layout/media_overview_gallery_item.xml +++ b/res/layout/media_overview_gallery_item.xml @@ -1,28 +1,50 @@ - + + android:id="@+id/image" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:contentDescription="@string/media_preview_activity__media_content_description" + android:padding="2dp" /> + + + android:visibility="gone" + tools:showIn="@layout/media_overview_gallery_item" + tools:visibility="visible"> + android:layout_marginTop="8dp" + android:layout_marginStart="8dp" + android:contentDescription="@string/MediaOverviewActivity_Selected_description" + app:srcCompat="@drawable/ic_check_circle_solid_20" /> + diff --git a/res/layout/media_overview_gallery_item_header.xml b/res/layout/media_overview_gallery_item_header.xml deleted file mode 100644 index 6766df9c87..0000000000 --- a/res/layout/media_overview_gallery_item_header.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - \ No newline at end of file diff --git a/res/layout/media_overview_document_item_header.xml b/res/layout/media_overview_item_header.xml similarity index 100% rename from res/layout/media_overview_document_item_header.xml rename to res/layout/media_overview_item_header.xml diff --git a/res/layout/media_overview_page_fragment.xml b/res/layout/media_overview_page_fragment.xml new file mode 100644 index 0000000000..568934a931 --- /dev/null +++ b/res/layout/media_overview_page_fragment.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/res/layout/media_overview_selected_overlay.xml b/res/layout/media_overview_selected_overlay.xml new file mode 100644 index 0000000000..e987752f2c --- /dev/null +++ b/res/layout/media_overview_selected_overlay.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/res/layout/preference_storage_category.xml b/res/layout/preference_storage_category.xml new file mode 100644 index 0000000000..61fba6eb99 --- /dev/null +++ b/res/layout/preference_storage_category.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/thumbnail_view.xml b/res/layout/thumbnail_view.xml index 6b6119653c..c97ec38b5d 100644 --- a/res/layout/thumbnail_view.xml +++ b/res/layout/thumbnail_view.xml @@ -30,7 +30,9 @@ android:layout_height="wrap_content" android:padding="6dp" android:src="@drawable/ic_caption_28" - android:visibility="gone" /> + android:visibility="gone" + android:contentDescription="@string/ThumbnailView_Has_a_caption_description" + tools:visibility="visible" /> diff --git a/res/menu/media_preview.xml b/res/menu/media_preview.xml index 7143884f6d..806f1c6fbe 100644 --- a/res/menu/media_preview.xml +++ b/res/menu/media_preview.xml @@ -4,17 +4,17 @@ + app:showAsAction="never"/> + app:showAsAction="never"/> + app:showAsAction="never"/> + app:showAsAction="never"/> diff --git a/res/values/arrays.xml b/res/values/arrays.xml index 34b79563ea..693b2ba846 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -324,4 +324,10 @@ 2 + + @string/MediaOverviewActivity_Newest + @string/MediaOverviewActivity_Oldest + @string/MediaOverviewActivity_Storage_used + + diff --git a/res/values/attrs.xml b/res/values/attrs.xml index ab012af1ea..a579ed6e40 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -185,6 +185,7 @@ + @@ -212,9 +213,12 @@ + + + @@ -275,6 +279,8 @@ + + diff --git a/res/values/colors.xml b/res/values/colors.xml index 85651e8e2a..ec8b7f96a4 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -46,7 +46,7 @@ #00FFFFFF #00000000 - #88000000 + #99000000 #44ff2d00 @@ -55,4 +55,10 @@ #90010101 #88000000 + @color/core_grey_50 + #ff5951C8 + #ff9BCFBD + #ff2090EA + #ffA23474 + diff --git a/res/values/dimens.xml b/res/values/dimens.xml index ab7013380d..be8511ab2a 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -148,4 +148,6 @@ 20dp 16dp + 8dp + diff --git a/res/values/strings.xml b/res/values/strings.xml index a049335284..8f8d9d0e8c 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -88,6 +88,9 @@ Yesterday This week This month + Large + Medium + Small Incoming call @@ -351,6 +354,10 @@ Unknown file + Unnamed file + Audio file + Image file + Video file Optimize for missing Play Services @@ -480,18 +487,28 @@ Media - Delete selected message? - Delete selected messages? + Delete selected item? + Delete selected items? - This will permanently delete the selected message. - This will permanently delete all %1$d selected messages. + This will permanently delete the selected file. Any message text associated with this item will also be deleted. + This will permanently delete all %1$d selected files. Any message text associated with these items will also be deleted. Deleting Deleting messages… - Documents + Files Select all Collecting attachments… + Audio + All + Sort by + Newest + Oldest + Storage used + All storage use + Grid view + List view + Selected Signal call in progress @@ -872,6 +889,7 @@ Unable to save to external storage without permissions Delete message? This will permanently delete this message. + %1$s to %2$s %1$d new messages in %2$d conversations @@ -930,6 +948,10 @@ Signal New message + + Play video + Has a caption + %d Item @@ -1393,6 +1415,7 @@ Automatically delete older messages once a conversation exceeds a specified length Delete old messages Chats and media + Storage Conversation length limit Trim all conversations now Scan through all conversations and enforce conversation length limits @@ -1421,6 +1444,12 @@ When roaming Media auto-download Message trimming + Storage usage + Photos + Videos + Files + Audio + Review storage Use system emoji Disable Signal\'s built-in emoji support Relay all calls through the Signal server to avoid revealing your IP address to your contact. Enabling will reduce call quality. @@ -1576,9 +1605,6 @@ Forward All media - - No documents - Media preview diff --git a/res/values/themes.xml b/res/values/themes.xml index 7764035897..640bf789cf 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -23,10 +23,13 @@ @color/textsecure_primary_dark @color/white + @color/core_grey_02 @color/core_grey_70 @color/core_grey_50 @color/core_grey_90 @color/core_grey_60 + @drawable/ic_grid_outline_20 + @drawable/ic_list_outline_20