diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index 2d61b9226..e6f1b27cd 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 b2e04b32d..d0e97a9ac 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 a4eb3af6c..8aaeceafd 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 000000000..92a0f5862 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 000000000..86eecdd4a 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 000000000..a728afe60 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 000000000..d2cbe4c92 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 000000000..c636ce8e8 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 000000000..914340683 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 000000000..54d306599 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 000000000..aa5879215 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 000000000..7be22806f 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 000000000..58d71b392 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 73cc3ec39..892e279f1 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 5f5d848f7..48a4733b9 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 23d24d2cb..679e37006 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 b9e971cf1..3a19be555 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_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_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/ic_call_black54_24dp + @drawable/ic_videocam_black54_24dp - @drawable/message_bubble_received_white - @drawable/message_bubble_sent - @drawable/message_bubble_received + + @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_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_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_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_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 +