diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index 2d61b92266e11b17d2e7e1098d68f87dea64a207..e6f1b27cdcf365de36f466bb76db0381429da433 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -6,6 +6,8 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.text.TextUtils; +import com.google.common.collect.ComparisonChain; + import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -49,9 +51,9 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl public static final String ATTRIBUTE_MUTED_TILL = "muted_till"; public static final String ATTRIBUTE_ALWAYS_NOTIFY = "always_notify"; - public static final String ATTRIBUTE_PUSH_NODE = "push_node"; public static final String ATTRIBUTE_LAST_CLEAR_HISTORY = "last_clear_history"; public static final String ATTRIBUTE_FORMERLY_PRIVATE_NON_ANONYMOUS = "formerly_private_non_anonymous"; + public static final String ATTRIBUTE_PINNED_ON_TOP = "pinned_on_top"; static final String ATTRIBUTE_MUC_PASSWORD = "muc_password"; static final String ATTRIBUTE_MEMBERS_ONLY = "members_only"; static final String ATTRIBUTE_MODERATED = "moderated"; @@ -479,7 +481,10 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl @Override public int compareTo(@NonNull Conversation another) { - return Long.compare(another.getSortableTime(), getSortableTime()); + return ComparisonChain.start() + .compareFalseFirst(another.getBooleanAttribute(ATTRIBUTE_PINNED_ON_TOP, false), getBooleanAttribute(ATTRIBUTE_PINNED_ON_TOP,false)) + .compare(another.getSortableTime(), getSortableTime()) + .result(); } private long getSortableTime() { diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index b2e04b32dc5ae75defe89048cc1e1e7d07adb3d8..d0e97a9ac48c27f606f9eb3a5ab4eac09acc7ee6 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -962,6 +962,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke final MenuItem menuCall = menu.findItem(R.id.action_call); final MenuItem menuOngoingCall = menu.findItem(R.id.action_ongoing_call); final MenuItem menuVideoCall = menu.findItem(R.id.action_video_call); + final MenuItem menuTogglePinned = menu.findItem(R.id.action_toggle_pinned); if (conversation != null) { @@ -994,6 +995,11 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke } ConversationMenuConfigurator.configureAttachmentMenu(conversation, menu); ConversationMenuConfigurator.configureEncryptionMenu(conversation, menu); + if (conversation.getBooleanAttribute(Conversation.ATTRIBUTE_PINNED_ON_TOP, false)) { + menuTogglePinned.setTitle(R.string.remove_from_favorites); + } else { + menuTogglePinned.setTitle(R.string.add_to_favorites); + } } super.onCreateOptionsMenu(menu, menuInflater); } @@ -1261,6 +1267,9 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke case R.id.action_ongoing_call: returnToOngoingCall(); break; + case R.id.action_toggle_pinned: + togglePinned(); + break; default: break; } @@ -1289,6 +1298,12 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke } + private void togglePinned() { + final boolean pinned = conversation.getBooleanAttribute(Conversation.ATTRIBUTE_PINNED_ON_TOP, false); + conversation.setAttribute(Conversation.ATTRIBUTE_PINNED_ON_TOP, !pinned); + activity.xmppConnectionService.updateConversation(conversation); + } + private void checkPermissionAndTriggerAudioCall() { if (activity.mUseTor || conversation.getAccount().isOnion()) { Toast.makeText(activity, R.string.disable_tor_to_make_call, Toast.LENGTH_SHORT).show(); diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java index a4eb3af6c9ee6d3fa3bf5f3626c61d7f28f48368..8aaeceafd39a46cb234451612f65ba5106262e69 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java @@ -201,6 +201,7 @@ public class ConversationAdapter extends RecyclerView.Adapter listener.onConversationClick(v, conversation)); diff --git a/src/main/res/drawable-hdpi/ic_star_black_24dp.png b/src/main/res/drawable-hdpi/ic_star_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..92a0f586223099f0d3ba629fbfcc44ef4890dec3 Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_star_black_24dp.png differ diff --git a/src/main/res/drawable-hdpi/ic_star_white_24dp.png b/src/main/res/drawable-hdpi/ic_star_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..86eecdd4a0a40e1fe48095fd5262398828101f17 Binary files /dev/null and b/src/main/res/drawable-hdpi/ic_star_white_24dp.png differ diff --git a/src/main/res/drawable-mdpi/ic_star_black_24dp.png b/src/main/res/drawable-mdpi/ic_star_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..a728afe60047efd900e7d4213faa7b5c22e9c875 Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_star_black_24dp.png differ diff --git a/src/main/res/drawable-mdpi/ic_star_white_24dp.png b/src/main/res/drawable-mdpi/ic_star_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..d2cbe4c92baf6023c039159b6e01be017696fb6a Binary files /dev/null and b/src/main/res/drawable-mdpi/ic_star_white_24dp.png differ diff --git a/src/main/res/drawable-xhdpi/ic_star_black_24dp.png b/src/main/res/drawable-xhdpi/ic_star_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..c636ce8e81bedced667a12e42fae8037f7f932ae Binary files /dev/null and b/src/main/res/drawable-xhdpi/ic_star_black_24dp.png differ diff --git a/src/main/res/drawable-xhdpi/ic_star_white_24dp.png b/src/main/res/drawable-xhdpi/ic_star_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..91434068324a8bff74fb1c5da1e5c0e62c0cb613 Binary files /dev/null and b/src/main/res/drawable-xhdpi/ic_star_white_24dp.png differ diff --git a/src/main/res/drawable-xxhdpi/ic_star_black_24dp.png b/src/main/res/drawable-xxhdpi/ic_star_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..54d306599a5b5a269a3bd46a7636d5277ee37845 Binary files /dev/null and b/src/main/res/drawable-xxhdpi/ic_star_black_24dp.png differ diff --git a/src/main/res/drawable-xxhdpi/ic_star_white_24dp.png b/src/main/res/drawable-xxhdpi/ic_star_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..aa5879215e9206b90f3376a23652b31993078993 Binary files /dev/null and b/src/main/res/drawable-xxhdpi/ic_star_white_24dp.png differ diff --git a/src/main/res/drawable-xxxhdpi/ic_star_black_24dp.png b/src/main/res/drawable-xxxhdpi/ic_star_black_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..7be22806f0e1a339cea85fc7bc45ab72d99859fd Binary files /dev/null and b/src/main/res/drawable-xxxhdpi/ic_star_black_24dp.png differ diff --git a/src/main/res/drawable-xxxhdpi/ic_star_white_24dp.png b/src/main/res/drawable-xxxhdpi/ic_star_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..58d71b392cc2f161116134c32a23cdbb41a339b6 Binary files /dev/null and b/src/main/res/drawable-xxxhdpi/ic_star_white_24dp.png differ diff --git a/src/main/res/layout/conversation_list_row.xml b/src/main/res/layout/conversation_list_row.xml index 73cc3ec39961fc8b27154bb8ca5358a09c9bd1a6..892e279f14b42ca27bcd425d62978198b55cf580 100644 --- a/src/main/res/layout/conversation_list_row.xml +++ b/src/main/res/layout/conversation_list_row.xml @@ -98,13 +98,25 @@ android:id="@+id/notification_status" android:layout_width="?attr/IconSize" android:layout_height="?attr/IconSize" - android:layout_toLeftOf="@+id/unread_count" + android:layout_toLeftOf="@+id/pinned_on_top" android:layout_alignWithParentIfMissing="true" android:layout_centerVertical="true" android:layout_marginLeft="4dp" android:alpha="?attr/icon_alpha" android:src="?attr/icon_notifications" /> + + + + \ No newline at end of file diff --git a/src/main/res/values/attrs.xml b/src/main/res/values/attrs.xml index 5f5d848f7ef32bc673919917fda9009b81093741..48a4733b93d7773b9060a59f29c7eb91d553908e 100644 --- a/src/main/res/values/attrs.xml +++ b/src/main/res/values/attrs.xml @@ -1,127 +1,127 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + \ No newline at end of file diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 23d24d2cbc06e0e858c522d8f07f909fc9be8584..679e3700630d49cba526f32479360bdfa0f271c8 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -920,6 +920,8 @@ You can only have one call at a time. Return to ongoing call Could not switch camera + Add to favorites + Remove from favorites View %1$d Participant View %1$d Participants diff --git a/src/main/res/values/themes.xml b/src/main/res/values/themes.xml index b9e971cf180b518ecb42626940c7241d9ee9f006..3a19be555dfa684d7ee48f6856bdb77043db7643 100644 --- a/src/main/res/values/themes.xml +++ b/src/main/res/values/themes.xml @@ -19,7 +19,9 @@ @drawable/search_background_light @drawable/no_results_background_light - @drawable/no_results_primary_background_light + + @drawable/no_results_primary_background_light + @drawable/list_item_background_light @color/black @@ -39,87 +41,108 @@ @color/black12 - @drawable/ic_send_cancel_offline - @drawable/ic_send_location_offline - @drawable/ic_send_photo_offline - @drawable/ic_send_picture_offline - @drawable/ic_send_text_offline - @drawable/ic_send_videocam_offline - @drawable/ic_send_voice_offline - - @drawable/ic_attach_camera - @drawable/ic_attach_videocam - @drawable/ic_attach_document - @drawable/ic_attach_location - @drawable/ic_attach_photo - @drawable/ic_attach_record - - @drawable/ic_call_black54_24dp - @drawable/ic_videocam_black54_24dp - - @drawable/message_bubble_received_white - @drawable/message_bubble_sent - @drawable/message_bubble_received + @drawable/ic_send_cancel_offline + @drawable/ic_send_location_offline + + @drawable/ic_send_photo_offline + @drawable/ic_send_picture_offline + + @drawable/ic_send_text_offline + @drawable/ic_send_videocam_offline + + @drawable/ic_send_voice_offline + + @drawable/ic_attach_camera + @drawable/ic_attach_videocam + @drawable/ic_attach_document + @drawable/ic_attach_location + @drawable/ic_attach_photo + @drawable/ic_attach_record + + @drawable/ic_call_black54_24dp + @drawable/ic_videocam_black54_24dp + + + @drawable/message_bubble_received_white + + @drawable/message_bubble_sent + + @drawable/message_bubble_received + @color/green700_desaturated @color/green700 - 0.54 - 0.70 + 0.54 + 0.70 24dp 16dp - @drawable/ic_description_black_48dp - @drawable/ic_mic_black_48dp - @drawable/ic_headset_black_48dp - @drawable/ic_room_black_48dp - @drawable/ic_person_black_48dp - @drawable/ic_android_black_48dp - @drawable/ic_event_black_48dp - @drawable/ic_archive_black_48dp - @drawable/ic_book_black_48dp - @drawable/ic_backup_black_48dp - @drawable/ic_help_black_48dp - - @drawable/ic_group_add_white_24dp - @drawable/ic_person_add_white_24dp - @drawable/ic_cancel_black_24dp - @drawable/ic_content_copy_black_24dp - @drawable/ic_delete_white_24dp - @drawable/ic_file_download_white_24dp - @drawable/ic_edit_white_24dp - @drawable/ic_edit_black_24dp - @drawable/ic_save_black_24dp - @drawable/ic_group_white_24dp - @drawable/ic_add_white_24dp - @drawable/ic_reply_white_24dp - @drawable/ic_refresh_black_24dp - @drawable/ic_attach_file_white_24dp - @drawable/ic_lock_open_white_24dp - @drawable/ic_call_white_24dp - @drawable/ic_phone_in_talk_white_24dp - @drawable/ic_phone_in_talk_black_18dp - @drawable/ic_delete_black_24dp - @drawable/ic_search_white_24dp - @drawable/ic_lock_open_white_24dp - @drawable/ic_settings_black_24dp - @drawable/ic_share_white_24dp - @drawable/ic_cloud_download_white_24dp - @drawable/ic_qr_code_scan_white_24dp - @drawable/ic_scroll_to_end_black - - @drawable/ic_gps_not_fixed_black_24dp - @drawable/ic_gps_fixed_black_24dp - @drawable/ic_directions_black_24dp - @drawable/ic_content_copy_white_24dp - - @drawable/ic_notifications_black_24dp - @drawable/ic_notifications_off_black_24dp - @drawable/ic_notifications_paused_black_24dp - @drawable/ic_notifications_none_black_24dp - @drawable/ic_new_releases_black_24dp + @drawable/ic_description_black_48dp + + @drawable/ic_mic_black_48dp + @drawable/ic_headset_black_48dp + @drawable/ic_room_black_48dp + @drawable/ic_person_black_48dp + @drawable/ic_android_black_48dp + @drawable/ic_event_black_48dp + @drawable/ic_archive_black_48dp + @drawable/ic_book_black_48dp + @drawable/ic_backup_black_48dp + @drawable/ic_help_black_48dp + + @drawable/ic_group_add_white_24dp + @drawable/ic_person_add_white_24dp + @drawable/ic_cancel_black_24dp + @drawable/ic_content_copy_black_24dp + @drawable/ic_delete_white_24dp + @drawable/ic_file_download_white_24dp + @drawable/ic_edit_white_24dp + @drawable/ic_edit_black_24dp + @drawable/ic_save_black_24dp + @drawable/ic_group_white_24dp + @drawable/ic_add_white_24dp + @drawable/ic_reply_white_24dp + @drawable/ic_refresh_black_24dp + @drawable/ic_attach_file_white_24dp + @drawable/ic_lock_open_white_24dp + @drawable/ic_call_white_24dp + @drawable/ic_phone_in_talk_white_24dp + @drawable/ic_phone_in_talk_black_18dp + + @drawable/ic_delete_black_24dp + @drawable/ic_search_white_24dp + @drawable/ic_lock_open_white_24dp + @drawable/ic_settings_black_24dp + @drawable/ic_share_white_24dp + @drawable/ic_cloud_download_white_24dp + + @drawable/ic_qr_code_scan_white_24dp + @drawable/ic_scroll_to_end_black + + @drawable/ic_gps_not_fixed_black_24dp + + @drawable/ic_gps_fixed_black_24dp + @drawable/ic_directions_black_24dp + @drawable/ic_content_copy_white_24dp + + @drawable/ic_notifications_black_24dp + + + @drawable/ic_notifications_off_black_24dp + + + @drawable/ic_notifications_paused_black_24dp + + + @drawable/ic_notifications_none_black_24dp + + @drawable/ic_star_black_24dp + + @drawable/ic_new_releases_black_24dp +