Start implementing conversation screen redesign

This commit is contained in:
Niels Andriesse 2020-01-10 11:35:16 +11:00
parent 7424684c75
commit 4f9b5f06f0
14 changed files with 280 additions and 215 deletions

12
res/drawable/ic_gear.xml Normal file
View file

@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="25dp"
android:height="25dp"
android:viewportWidth="25"
android:viewportHeight="25">
<path
android:pathData="M12.5,7.48c-2.77,0 -5.02,2.25 -5.02,5.02c0,2.77 2.25,5.02 5.02,5.02s5.02,-2.25 5.02,-5.02C17.52,9.73 15.27,7.48 12.5,7.48zM12.5,15.82c-1.83,0 -3.32,-1.49 -3.32,-3.32c0,-1.83 1.49,-3.32 3.32,-3.32s3.32,1.49 3.32,3.32C15.82,14.33 14.33,15.82 12.5,15.82z"
android:fillColor="#FFFFFF"/>
<path
android:pathData="M23.57,9.88l-2.25,-0.24c-0.15,-0.47 -0.34,-0.92 -0.56,-1.36l1.42,-1.76c0.41,-0.51 0.37,-1.24 -0.09,-1.7l-1.91,-1.91c-0.46,-0.46 -1.2,-0.5 -1.7,-0.09l-1.76,1.42c-0.44,-0.22 -0.89,-0.41 -1.36,-0.56l-0.24,-2.25c-0.07,-0.65 -0.62,-1.14 -1.27,-1.14h-2.7c-0.65,0 -1.2,0.49 -1.27,1.14L9.64,3.67C9.17,3.83 8.72,4.01 8.28,4.24L6.52,2.82c-0.51,-0.41 -1.24,-0.37 -1.7,0.09L2.91,4.82c-0.46,0.46 -0.5,1.19 -0.09,1.7l1.42,1.76C4.01,8.72 3.83,9.17 3.67,9.64L1.42,9.88c-0.65,0.07 -1.14,0.62 -1.14,1.27v2.7c0,0.65 0.49,1.2 1.14,1.27l2.25,0.24c0.15,0.46 0.34,0.92 0.56,1.36l-1.42,1.76c-0.41,0.51 -0.37,1.24 0.09,1.7l1.91,1.91c0.46,0.46 1.19,0.5 1.7,0.09l1.76,-1.42c0.44,0.22 0.89,0.41 1.36,0.56l0.24,2.25c0.07,0.65 0.61,1.14 1.27,1.14h2.7c0.65,0 1.2,-0.49 1.27,-1.14l0.24,-2.25c0.46,-0.15 0.92,-0.34 1.36,-0.56l1.76,1.42c0.51,0.41 1.24,0.37 1.7,-0.09l1.91,-1.91c0.46,-0.46 0.5,-1.19 0.09,-1.7l-1.42,-1.76c0.22,-0.44 0.41,-0.89 0.56,-1.36l2.25,-0.24c0.65,-0.07 1.14,-0.62 1.14,-1.27v-2.7C24.71,10.5 24.22,9.95 23.57,9.88zM23.01,13.47l-2.15,0.23c-0.51,0.06 -0.94,0.41 -1.08,0.91c-0.16,0.53 -0.37,1.05 -0.64,1.53c-0.25,0.46 -0.21,1.01 0.12,1.41l1.36,1.69l-1.37,1.37l-1.69,-1.36c-0.4,-0.32 -0.96,-0.37 -1.41,-0.12c-0.49,0.27 -1,0.48 -1.53,0.64c-0.5,0.14 -0.86,0.57 -0.91,1.08l-0.23,2.15h-1.94l-0.23,-2.15c-0.06,-0.51 -0.41,-0.94 -0.91,-1.08c-0.53,-0.15 -1.05,-0.37 -1.53,-0.64c-0.46,-0.25 -1.01,-0.21 -1.41,0.12l-1.69,1.36l-1.37,-1.37l1.36,-1.69c0.33,-0.4 0.37,-0.96 0.12,-1.42c-0.27,-0.49 -0.48,-1 -0.64,-1.53c-0.14,-0.5 -0.57,-0.86 -1.08,-0.91l-2.15,-0.23v-1.94l2.15,-0.23c0.51,-0.05 0.94,-0.41 1.08,-0.91c0.15,-0.53 0.37,-1.05 0.64,-1.54c0.25,-0.46 0.2,-1.01 -0.12,-1.41L4.38,5.75l1.37,-1.37l1.69,1.36c0.4,0.32 0.96,0.37 1.41,0.12c0.49,-0.27 1,-0.48 1.53,-0.64c0.5,-0.15 0.86,-0.57 0.91,-1.08l0.23,-2.15h1.94l0.23,2.15c0.06,0.51 0.41,0.94 0.91,1.08c0.53,0.15 1.05,0.37 1.53,0.64c0.45,0.25 1.01,0.21 1.41,-0.12l1.69,-1.36l1.37,1.37l-1.36,1.69c-0.32,0.4 -0.37,0.96 -0.12,1.41c0.27,0.48 0.48,1 0.64,1.53c0.14,0.5 0.57,0.86 1.08,0.92l2.15,0.23V13.47z"
android:fillColor="#FFFFFF"/>
</vector>

View file

@ -1,24 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:background="@drawable/default_session_background">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/conversation_list_toolbar_background"
android:theme="?attr/actionBarStyle"
app:contentInsetStartWithNavigation="0dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navigationIcon="?homeAsUpIndicator"
tools:background="#ff007f00">
android:minHeight="?attr/actionBarSize"
app:contentInsetLeft="24dp"
app:contentInsetRight="20dp"
android:background="@color/action_bar_background"
android:theme="@style/Session.DarkActionBar">
<include layout="@layout/conversation_title_view" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/titleTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Conversation"
android:textColor="@color/text"
android:textSize="@dimen/large_font_size"
android:fontFamily="sans-serif-medium" />
<TextView
android:id="@+id/subtitleTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="26 members"
android:textColor="@color/text"
android:textSize="@dimen/small_font_size" />
</LinearLayout>
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<ImageView
android:id="@+id/settingsButton"
android:layout_width="24dp"
android:layout_height="24dp"
android:src="@drawable/ic_gear" />
</LinearLayout>
</android.support.v7.widget.Toolbar>

View file

@ -216,7 +216,7 @@
</LinearLayout>
<org.thoughtcrime.securesms.loki.FriendRequestView
<org.thoughtcrime.securesms.loki.redesign.views.FriendRequestView
android:id="@+id/friend_request_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View file

@ -164,7 +164,7 @@
</LinearLayout>
<org.thoughtcrime.securesms.loki.FriendRequestView
<org.thoughtcrime.securesms.loki.redesign.views.FriendRequestView
android:id="@+id/friend_request_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View file

@ -2,11 +2,11 @@
<resources>
<style name="TextSecure.DarkTheme" parent="@style/TextSecure.BaseDarkTheme">
<item name="android:navigationBarColor">@color/core_grey_90</item>
<item name="android:navigationBarColor">@color/navigation_bar_background</item>
</style>
<style name="TextSecure.DarkNoActionBar" parent="@style/TextSecure.BaseDarkNoActionBar">
<item name="android:navigationBarColor">@color/core_grey_90</item>
<item name="android:navigationBarColor">@color/navigation_bar_background</item>
<item name="android:colorControlActivated">@color/signal_primary_dark</item>
</style>

View file

@ -1611,14 +1611,14 @@
<string name="fragment_add_public_chat_connection_failed_message">Couldn\'t Connect</string>
<!-- Friend request view -->
<string name="view_friend_request_accept_button_title">Accept</string>
<string name="view_friend_request_reject_button_title">Reject</string>
<string name="view_friend_request_incoming_pending_message">%1$s sent you a friend request</string>
<string name="view_friend_request_incoming_accepted_message">You\'ve accepted %1$s\'s friend request</string>
<string name="view_friend_request_incoming_declined_message">You\'ve declined %1$s\'s friend request</string>
<string name="view_friend_request_incoming_expired_message">%1$s\'s friend request has expired</string>
<string name="view_friend_request_outgoing_pending_message">You\'ve sent %1$s a friend request</string>
<string name="view_friend_request_outgoing_accepted_message">%1$s accepted your friend request</string>
<string name="view_friend_request_outgoing_expired_message">Your friend request to %1$s has expired</string>
<string name="view_friend_request_reject_button_title">Decline</string>
<string name="view_friend_request_incoming_pending_message">%1$s sent you a message request</string>
<string name="view_friend_request_incoming_accepted_message">You\'ve accepted %1$s\'s message request</string>
<string name="view_friend_request_incoming_declined_message">You\'ve declined %1$s\'s message request</string>
<string name="view_friend_request_incoming_expired_message">%1$s\'s message request has expired</string>
<string name="view_friend_request_outgoing_pending_message">You\'ve sent %1$s a message request</string>
<string name="view_friend_request_outgoing_accepted_message">%1$s accepted your message request</string>
<string name="view_friend_request_outgoing_expired_message">Your message request to %1$s has expired</string>
<!-- Conversation activity -->
<string name="activity_conversation_pending_friend_request_hint">Pending Friend Request…</string>
<string name="activity_conversation_default_hint">New Message</string>

View file

@ -32,9 +32,10 @@
<item name="windowActionModeOverlay">true</item>
<item name="theme_type">light</item>
<item name="colorPrimary">@color/textsecure_primary</item>
<item name="colorPrimaryDark">@color/textsecure_primary_dark</item>
<item name="colorPrimary">@color/action_bar_background</item>
<item name="colorPrimaryDark">@color/action_bar_background</item>
<item name="colorAccent">@color/textsecure_primary_dark</item>
<item name="android:navigationBarColor">@color/navigation_bar_background</item>
<item name="recipient_preference_blocked">#d00000</item>
<item name="contact_selection_label_text">#66000000</item>
@ -60,8 +61,10 @@
<item name="theme_type">dark</item>
<item name="actionBarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
<item name="colorPrimary">@color/gray95</item>
<item name="colorPrimary">@color/action_bar_background</item>
<item name="colorPrimaryDark">@color/action_bar_background</item>
<item name="colorAccent">@color/signal_primary_dark</item>
<item name="android:navigationBarColor">@color/navigation_bar_background</item>
<item name="recipient_preference_blocked">#d00000</item>
<item name="contact_selection_label_text">#66eeeeee</item>
@ -145,12 +148,12 @@
<style name="TextSecure.LightTheme" parent="@style/Theme.AppCompat.Light.DarkActionBar">
<item name="theme_type">light</item>
<item name="actionBarStyle">@style/TextSecure.LightActionBar</item>
<item name="actionBarStyle">@style/Session.DarkActionBar</item>
<item name="actionBarTabBarStyle">@style/TextSecure.LightActionBar.TabBar</item>
<item name="actionModeBackground">@color/gray50</item>
<item name="actionModeCloseDrawable">@drawable/ic_close_white_24dp</item>
<item name="colorPrimary">@color/textsecure_primary</item>
<item name="colorPrimaryDark">@color/textsecure_primary_dark</item>
<item name="colorPrimary">@color/action_bar_background</item>
<item name="colorPrimaryDark">@color/action_bar_background</item>
<item name="colorAccent">@color/textsecure_primary_dark</item>
<item name="colorControlActivated">@color/signal_primary</item>
<item name="colorControlHighlight">@color/signal_primary</item>
@ -158,6 +161,7 @@
<item name="alertDialogTheme">@style/AppCompatAlertDialogStyleLight</item>
<item name="android:alertDialogTheme">@style/AppCompatDialogStyleLight</item>
<item name="bottomSheetDialogTheme">@style/Theme.MaterialComponents.Light.BottomSheetDialog</item>
<item name="android:navigationBarColor">@color/navigation_bar_background</item>
<!--<item name="android:windowContentOverlay">@drawable/compat_actionbar_shadow_background</item>-->
<item name="attachment_type_selector_background">@color/white</item>
@ -320,7 +324,7 @@
<item name="shared_contact_details_header_background">@color/grey_100</item>
<item name="shared_contact_details_titlebar">@color/grey_400</item>
<item name="shared_contact_item_button_color">@color/core_grey_02</item>
<item name="android:statusBarColor">@color/black</item>
<item name="android:statusBarColor">@color/action_bar_background</item>
</style>
<style name="TextSecure.DarkTheme" parent="@style/TextSecure.BaseDarkTheme">
@ -329,7 +333,7 @@
<style name="TextSecure.BaseDarkTheme" parent="@style/Theme.AppCompat">
<item name="theme_type">dark</item>
<item name="actionBarStyle">@style/TextSecure.DarkActionBar</item>
<item name="actionBarStyle">@style/Session.DarkActionBar</item>
<item name="actionBarTabBarStyle">@style/TextSecure.DarkActionBar.TabBar</item>
<item name="actionBarPopupTheme">@style/ThemeOverlay.AppCompat.Dark</item>
<item name="actionModeBackground">@color/gray50</item>
@ -343,6 +347,7 @@
<item name="alertDialogTheme">@style/AppCompatAlertDialogStyleDark</item>
<item name="android:alertDialogTheme">@style/AppCompatDialogStyleDark</item>
<item name="bottomSheetDialogTheme">@style/Theme.MaterialComponents.BottomSheetDialog</item>
<item name="android:navigationBarColor">@color/navigation_bar_background</item>
<item name="attachment_type_selector_background">@color/gray95</item>
<item name="attachment_document_icon_small">@drawable/ic_document_small_dark</item>

View file

@ -40,25 +40,20 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Vibrator;
import android.provider.Browser;
import android.provider.ContactsContract;
import android.provider.Telephony;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.content.pm.ShortcutInfoCompat;
import android.support.v4.content.pm.ShortcutManagerCompat;
import android.support.v4.graphics.drawable.IconCompat;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Pair;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
@ -152,7 +147,6 @@ import org.thoughtcrime.securesms.linkpreview.LinkPreviewRepository;
import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil;
import org.thoughtcrime.securesms.linkpreview.LinkPreviewViewModel;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.loki.FriendRequestViewDelegate;
import org.thoughtcrime.securesms.loki.LokiAPIUtilities;
import org.thoughtcrime.securesms.loki.LokiMessageDatabase;
import org.thoughtcrime.securesms.loki.LokiThreadDatabase;
@ -161,6 +155,7 @@ import org.thoughtcrime.securesms.loki.LokiUserDatabase;
import org.thoughtcrime.securesms.loki.MentionCandidateSelectionView;
import org.thoughtcrime.securesms.loki.MultiDeviceUtilities;
import org.thoughtcrime.securesms.loki.redesign.activities.HomeActivity;
import org.thoughtcrime.securesms.loki.redesign.views.FriendRequestViewDelegate;
import org.thoughtcrime.securesms.mediasend.Media;
import org.thoughtcrime.securesms.mediasend.MediaSendActivity;
import org.thoughtcrime.securesms.mms.AttachmentManager;
@ -210,7 +205,6 @@ import org.thoughtcrime.securesms.util.Dialogs;
import org.thoughtcrime.securesms.util.DirectoryHelper;
import org.thoughtcrime.securesms.util.DynamicLanguage;
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
import org.thoughtcrime.securesms.util.ExpirationUtil;
import org.thoughtcrime.securesms.util.GroupUtil;
import org.thoughtcrime.securesms.util.IdentityUtil;
import org.thoughtcrime.securesms.util.MediaUtil;
@ -303,7 +297,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
private AnimatingToggle buttonToggle;
private SendButton sendButton;
private ImageButton attachButton;
protected ConversationTitleView titleView;
private TextView titleTextView;
private TextView charactersLeft;
private ConversationFragment fragment;
private Button unblockButton;
@ -477,7 +471,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
initializeIdentityRecords();
composeText.setTransport(sendButton.getSelectedTransport());
titleView.setTitle(glideRequests, recipient);
updateTitleTextView(glideRequests, recipient);
setActionBarColor(recipient.getColor());
setBlockedUserState(recipient, isSecureText, isDefaultSms);
setGroupShareProfileReminder(recipient);
@ -564,7 +558,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
case GROUP_EDIT:
recipient = Recipient.from(this, data.getParcelableExtra(GroupCreateActivity.GROUP_ADDRESS_EXTRA), true);
recipient.addListener(this);
titleView.setTitle(glideRequests, recipient);
updateTitleTextView(glideRequests, recipient);
NotificationChannels.updateContactChannelName(this, recipient);
setBlockedUserState(recipient, isSecureText, isDefaultSms);
supportInvalidateOptionsMenu();
@ -662,130 +656,130 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuInflater inflater = this.getMenuInflater();
menu.clear();
boolean isLokiPublicChat = isGroupConversation(); // TODO: Figure out a better way of determining this
if (isSecureText && !isLokiPublicChat) { // TODO:
if (recipient.getExpireMessages() > 0) {
inflater.inflate(R.menu.conversation_expiring_on, menu);
final MenuItem item = menu.findItem(R.id.menu_expiring_messages);
final View actionView = MenuItemCompat.getActionView(item);
final TextView badgeView = actionView.findViewById(R.id.expiration_badge);
badgeView.setText(ExpirationUtil.getExpirationAbbreviatedDisplayValue(this, recipient.getExpireMessages()));
actionView.setOnClickListener(v -> onOptionsItemSelected(item));
} else {
inflater.inflate(R.menu.conversation_expiring_off, menu);
}
}
if (isSingleConversation()) {
/*
if (isSecureText) inflater.inflate(R.menu.conversation_callable_secure, menu);
else inflater.inflate(R.menu.conversation_callable_insecure, menu);
*/
} else if (isGroupConversation() && !isLokiPublicChat) {
inflater.inflate(R.menu.conversation_group_options, menu);
if (!isPushGroupConversation()) {
inflater.inflate(R.menu.conversation_mms_group_options, menu);
if (distributionType == ThreadDatabase.DistributionTypes.BROADCAST) {
menu.findItem(R.id.menu_distribution_broadcast).setChecked(true);
} else {
menu.findItem(R.id.menu_distribution_conversation).setChecked(true);
}
} else if (isActiveGroup()) {
inflater.inflate(R.menu.conversation_push_group_options, menu);
}
}
inflater.inflate(R.menu.conversation, menu);
if (isSingleConversation() && isSecureText) {
inflater.inflate(R.menu.conversation_secure, menu);
} else if (isSingleConversation()) {
inflater.inflate(R.menu.conversation_insecure, menu);
}
if (recipient != null && recipient.isMuted()) inflater.inflate(R.menu.conversation_muted, menu);
else inflater.inflate(R.menu.conversation_unmuted, menu);
/*
if (isSingleConversation() && getRecipient().getContactUri() == null) {
inflater.inflate(R.menu.conversation_add_to_contacts, menu);
}
if (recipient != null && recipient.isLocalNumber()) {
if (isSecureText) menu.findItem(R.id.menu_call_secure).setVisible(false);
else menu.findItem(R.id.menu_call_insecure).setVisible(false);
MenuItem muteItem = menu.findItem(R.id.menu_mute_notifications);
if (muteItem != null) {
muteItem.setVisible(false);
}
}
*/
searchViewItem = menu.findItem(R.id.menu_search);
SearchView searchView = (SearchView) searchViewItem.getActionView();
SearchView.OnQueryTextListener queryListener = new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
searchViewModel.onQueryUpdated(query, threadId);
searchNav.showLoading();
fragment.onSearchQueryUpdated(query);
return true;
}
@Override
public boolean onQueryTextChange(String query) {
searchViewModel.onQueryUpdated(query, threadId);
searchNav.showLoading();
fragment.onSearchQueryUpdated(query);
return true;
}
};
searchViewItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
searchView.setOnQueryTextListener(queryListener);
searchViewModel.onSearchOpened();
searchNav.setVisibility(View.VISIBLE);
searchNav.setData(0, 0);
inputPanel.setVisibility(View.GONE);
for (int i = 0; i < menu.size(); i++) {
if (!menu.getItem(i).equals(searchViewItem)) {
menu.getItem(i).setVisible(false);
}
}
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
searchView.setOnQueryTextListener(null);
searchViewModel.onSearchClosed();
searchNav.setVisibility(View.GONE);
inputPanel.setVisibility(View.VISIBLE);
fragment.onSearchQueryUpdated(null);
invalidateOptionsMenu();
return true;
}
});
super.onPrepareOptionsMenu(menu);
return true;
}
// @Override
// public boolean onPrepareOptionsMenu(Menu menu) {
// MenuInflater inflater = this.getMenuInflater();
// menu.clear();
//
// boolean isLokiPublicChat = isGroupConversation(); // TODO: Figure out a better way of determining this
//
// if (isSecureText && !isLokiPublicChat) { // TODO:
// if (recipient.getExpireMessages() > 0) {
// inflater.inflate(R.menu.conversation_expiring_on, menu);
//
// final MenuItem item = menu.findItem(R.id.menu_expiring_messages);
// final View actionView = MenuItemCompat.getActionView(item);
// final TextView badgeView = actionView.findViewById(R.id.expiration_badge);
//
// badgeView.setText(ExpirationUtil.getExpirationAbbreviatedDisplayValue(this, recipient.getExpireMessages()));
// actionView.setOnClickListener(v -> onOptionsItemSelected(item));
// } else {
// inflater.inflate(R.menu.conversation_expiring_off, menu);
// }
// }
//
// if (isSingleConversation()) {
// /*
// if (isSecureText) inflater.inflate(R.menu.conversation_callable_secure, menu);
// else inflater.inflate(R.menu.conversation_callable_insecure, menu);
// */
// } else if (isGroupConversation() && !isLokiPublicChat) {
// inflater.inflate(R.menu.conversation_group_options, menu);
//
// if (!isPushGroupConversation()) {
// inflater.inflate(R.menu.conversation_mms_group_options, menu);
// if (distributionType == ThreadDatabase.DistributionTypes.BROADCAST) {
// menu.findItem(R.id.menu_distribution_broadcast).setChecked(true);
// } else {
// menu.findItem(R.id.menu_distribution_conversation).setChecked(true);
// }
// } else if (isActiveGroup()) {
// inflater.inflate(R.menu.conversation_push_group_options, menu);
// }
// }
//
// inflater.inflate(R.menu.conversation, menu);
//
// if (isSingleConversation() && isSecureText) {
// inflater.inflate(R.menu.conversation_secure, menu);
// } else if (isSingleConversation()) {
// inflater.inflate(R.menu.conversation_insecure, menu);
// }
//
// if (recipient != null && recipient.isMuted()) inflater.inflate(R.menu.conversation_muted, menu);
// else inflater.inflate(R.menu.conversation_unmuted, menu);
//
// /*
// if (isSingleConversation() && getRecipient().getContactUri() == null) {
// inflater.inflate(R.menu.conversation_add_to_contacts, menu);
// }
//
//
// if (recipient != null && recipient.isLocalNumber()) {
// if (isSecureText) menu.findItem(R.id.menu_call_secure).setVisible(false);
// else menu.findItem(R.id.menu_call_insecure).setVisible(false);
//
// MenuItem muteItem = menu.findItem(R.id.menu_mute_notifications);
//
// if (muteItem != null) {
// muteItem.setVisible(false);
// }
// }
// */
//
// searchViewItem = menu.findItem(R.id.menu_search);
//
// SearchView searchView = (SearchView) searchViewItem.getActionView();
// SearchView.OnQueryTextListener queryListener = new SearchView.OnQueryTextListener() {
// @Override
// public boolean onQueryTextSubmit(String query) {
// searchViewModel.onQueryUpdated(query, threadId);
// searchNav.showLoading();
// fragment.onSearchQueryUpdated(query);
// return true;
// }
//
// @Override
// public boolean onQueryTextChange(String query) {
// searchViewModel.onQueryUpdated(query, threadId);
// searchNav.showLoading();
// fragment.onSearchQueryUpdated(query);
// return true;
// }
// };
//
// searchViewItem.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {
// @Override
// public boolean onMenuItemActionExpand(MenuItem item) {
// searchView.setOnQueryTextListener(queryListener);
// searchViewModel.onSearchOpened();
// searchNav.setVisibility(View.VISIBLE);
// searchNav.setData(0, 0);
// inputPanel.setVisibility(View.GONE);
//
// for (int i = 0; i < menu.size(); i++) {
// if (!menu.getItem(i).equals(searchViewItem)) {
// menu.getItem(i).setVisible(false);
// }
// }
// return true;
// }
//
// @Override
// public boolean onMenuItemActionCollapse(MenuItem item) {
// searchView.setOnQueryTextListener(null);
// searchViewModel.onSearchClosed();
// searchNav.setVisibility(View.GONE);
// inputPanel.setVisibility(View.VISIBLE);
// fragment.onSearchQueryUpdated(null);
// invalidateOptionsMenu();
// return true;
// }
// });
//
// super.onPrepareOptionsMenu(menu);
// return true;
// }
@Override
public boolean onOptionsItemSelected(MenuItem item) {
@ -1168,11 +1162,11 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
private boolean handleDisplayQuickContact() {
if (recipient.getAddress().isGroup()) return false;
if (recipient.getContactUri() != null) {
ContactsContract.QuickContact.showQuickContact(ConversationActivity.this, titleView, recipient.getContactUri(), ContactsContract.QuickContact.MODE_LARGE, null);
} else {
handleAddToContacts();
}
// if (recipient.getContactUri() != null) {
// ContactsContract.QuickContact.showQuickContact(ConversationActivity.this, titleView, recipient.getContactUri(), ContactsContract.QuickContact.MODE_LARGE, null);
// } else {
// handleAddToContacts();
// }
return true;
}
@ -1552,7 +1546,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
unverifiedBannerView.get().hide();
}
titleView.setVerified(isSecureText && identityRecords.isVerified());
// titleView.setVerified(isSecureText && identityRecords.isVerified());
future.set(true);
}
@ -1563,7 +1557,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
private void initializeViews() {
titleView = findViewById(R.id.conversation_title_view);
titleTextView = findViewById(R.id.titleTextView);
buttonToggle = ViewUtil.findById(this, R.id.button_toggle);
sendButton = ViewUtil.findById(this, R.id.send_button);
attachButton = ViewUtil.findById(this, R.id.attach_button);
@ -1648,7 +1642,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar == null) throw new AssertionError();
supportActionBar.setDisplayHomeAsUpEnabled(true);
// supportActionBar.setDisplayHomeAsUpEnabled(true);
supportActionBar.setDisplayShowTitleEnabled(false);
}
@ -1774,8 +1768,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
Log.i(TAG, "onModified(" + recipient.getAddress().serialize() + ")");
Util.runOnMain(() -> {
Log.i(TAG, "onModifiedRun(): " + recipient.getRegistered());
titleView.setTitle(glideRequests, recipient);
titleView.setVerified(identityRecords.isVerified());
updateTitleTextView(glideRequests, recipient);
// titleView.setVerified(identityRecords.isVerified());
setBlockedUserState(recipient, isSecureText, isDefaultSms);
setActionBarColor(recipient.getColor());
setGroupShareProfileReminder(recipient);
@ -1971,8 +1965,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
private void setActionBarColor(MaterialColor color) {
ActionBar supportActionBar = getSupportActionBar();
if (supportActionBar == null) throw new AssertionError();
supportActionBar.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.core_grey_90)));
setStatusBarColor(getResources().getColor(R.color.black));
supportActionBar.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.action_bar_background)));
setStatusBarColor(getResources().getColor(R.color.action_bar_background));
}
private void setBlockedUserState(Recipient recipient, boolean isSecureText, boolean isDefaultSms) {
@ -3042,6 +3036,10 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
}
}
private void updateTitleTextView(GlideRequests glide, Recipient recipient) {
}
// region Loki
@Override
public void acceptFriendRequest(@NotNull MessageRecord friendRequest) {

View file

@ -31,7 +31,6 @@ import android.widget.TextView;
import com.annimon.stream.Stream;
import org.thoughtcrime.securesms.BindableConversationItem;
import network.loki.messenger.R;
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
import org.thoughtcrime.securesms.conversation.ConversationAdapter.HeaderViewHolder;
import org.thoughtcrime.securesms.database.DatabaseFactory;
@ -41,7 +40,7 @@ import org.thoughtcrime.securesms.database.MmsSmsDatabase;
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.loki.FriendRequestViewDelegate;
import org.thoughtcrime.securesms.loki.redesign.views.FriendRequestViewDelegate;
import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.mms.SlideDeck;
import org.thoughtcrime.securesms.recipients.Recipient;
@ -65,6 +64,8 @@ import java.util.Locale;
import java.util.Map;
import java.util.Set;
import network.loki.messenger.R;
/**
* A cursor adapter for a conversation thread. Ultimately
* used by ComposeMessageActivity to display a conversation

View file

@ -79,7 +79,7 @@ import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob;
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.loki.FriendRequestViewDelegate;
import org.thoughtcrime.securesms.loki.redesign.views.FriendRequestViewDelegate;
import org.thoughtcrime.securesms.longmessage.LongMessageActivity;
import org.thoughtcrime.securesms.mediasend.Media;
import org.thoughtcrime.securesms.mms.GlideApp;

View file

@ -87,8 +87,8 @@ import org.thoughtcrime.securesms.jobs.SmsSendJob;
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
import org.thoughtcrime.securesms.linkpreview.LinkPreviewUtil;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.loki.FriendRequestView;
import org.thoughtcrime.securesms.loki.FriendRequestViewDelegate;
import org.thoughtcrime.securesms.loki.redesign.views.FriendRequestView;
import org.thoughtcrime.securesms.loki.redesign.views.FriendRequestViewDelegate;
import org.thoughtcrime.securesms.loki.LokiMessageDatabase;
import org.thoughtcrime.securesms.loki.MentionUtilities;
import org.thoughtcrime.securesms.mms.GlideRequests;

View file

@ -5,9 +5,6 @@ import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.os.Bundle;
import android.support.v4.app.ActivityOptionsCompat;
import network.loki.messenger.R;
import org.thoughtcrime.securesms.logging.Log;
import android.view.Display;
import android.view.Gravity;
import android.view.Menu;
@ -16,10 +13,13 @@ import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.util.concurrent.ListenableFuture;
import java.util.concurrent.ExecutionException;
import network.loki.messenger.R;
public class ConversationPopupActivity extends ConversationActivity {
private static final String TAG = ConversationPopupActivity.class.getSimpleName();
@ -50,7 +50,7 @@ public class ConversationPopupActivity extends ConversationActivity {
super.onCreate(bundle, ready);
titleView.setOnClickListener(null);
// titleView.setOnClickListener(null);
}
@Override

View file

@ -1,16 +0,0 @@
package org.thoughtcrime.securesms.loki
import org.thoughtcrime.securesms.database.model.MessageRecord
interface FriendRequestViewDelegate {
/**
* Implementations of this method should update the thread's friend request status
* and send a friend request accepted message.
*/
fun acceptFriendRequest(friendRequest: MessageRecord)
/**
* Implementations of this method should update the thread's friend request status
* and remove the pre keys associated with the contact.
*/
fun rejectFriendRequest(friendRequest: MessageRecord)
}

View file

@ -1,17 +1,21 @@
package org.thoughtcrime.securesms.loki
package org.thoughtcrime.securesms.loki.redesign.views
import android.content.Context
import android.os.Build
import android.util.AttributeSet
import android.util.TypedValue
import android.view.Gravity
import android.view.View
import android.widget.Button
import android.widget.LinearLayout
import android.widget.ProgressBar
import android.widget.TextView
import com.github.ybq.android.spinkit.style.DoubleBounce
import network.loki.messenger.R
import org.thoughtcrime.securesms.database.DatabaseFactory
import org.thoughtcrime.securesms.database.model.MessageRecord
import org.thoughtcrime.securesms.loki.getColorWithID
import org.thoughtcrime.securesms.loki.toPx
import org.whispersystems.signalservice.loki.messaging.LokiMessageFriendRequestStatus
class FriendRequestView(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : LinearLayout(context, attrs, defStyleAttr) {
@ -28,14 +32,16 @@ class FriendRequestView(context: Context, attrs: AttributeSet?, defStyleAttr: In
private val label by lazy {
val result = TextView(context)
result.setTextColor(resources.getColorWithID(R.color.white, context.theme))
result.setTextColor(resources.getColorWithID(R.color.text, context.theme))
result.textAlignment = TextView.TEXT_ALIGNMENT_CENTER
result.setTextSize(TypedValue.COMPLEX_UNIT_PX, resources.getDimension(R.dimen.small_font_size))
result
}
private val buttonLinearLayout by lazy {
val result = LinearLayout(context)
result.orientation = HORIZONTAL
result.setPadding(0, resources.getDimension(R.dimen.medium_spacing).toInt(), 0, 0)
result
}
@ -64,39 +70,45 @@ class FriendRequestView(context: Context, attrs: AttributeSet?, defStyleAttr: In
if (isUISetUp) { return }
isUISetUp = true
orientation = VERTICAL
setPadding(resources.getDimension(R.dimen.large_spacing).toInt(), 0, resources.getDimension(R.dimen.large_spacing).toInt(), 0)
addView(topSpacer)
addView(label)
if (!message!!.isOutgoing) {
val loader = ProgressBar(context)
loader.isIndeterminate = true
val color = resources.getColorWithID(R.color.white, context.theme)
loader.indeterminateDrawable.setColorFilter(color, android.graphics.PorterDuff.Mode.SRC_IN)
loader.indeterminateDrawable = DoubleBounce()
val loaderLayoutParams = LayoutParams(LayoutParams.MATCH_PARENT, toPx(24, resources))
loader.layoutParams = loaderLayoutParams
loaderContainer.addView(loader)
addView(loaderContainer)
fun button(): Button {
val result = Button(context)
result.setBackgroundColor(resources.getColorWithID(R.color.transparent, context.theme))
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
result.elevation = 0f
result.stateListAnimator = null
}
val buttonLayoutParams = LayoutParams(0, toPx(50, resources))
result.setTextColor(resources.getColorWithID(R.color.text, context.theme))
result.setTextSize(TypedValue.COMPLEX_UNIT_PX, resources.getDimension(R.dimen.small_font_size))
result.isAllCaps = false
result.setPadding(0, 0, 0, 0)
val buttonLayoutParams = LayoutParams(0, resources.getDimension(R.dimen.small_button_height).toInt())
buttonLayoutParams.weight = 1f
result.layoutParams = buttonLayoutParams
return result
}
val acceptButton = button()
acceptButton.text = resources.getString(R.string.view_friend_request_accept_button_title)
acceptButton.setTextColor(resources.getColorWithID(R.color.signal_primary, context.theme))
acceptButton.setOnClickListener { accept() }
buttonLinearLayout.addView(acceptButton)
val rejectButton = button()
rejectButton.text = resources.getString(R.string.view_friend_request_reject_button_title)
rejectButton.setTextColor(resources.getColorWithID(R.color.red, context.theme))
rejectButton.setBackgroundResource(R.drawable.unimportant_dialog_button_background)
rejectButton.setOnClickListener { reject() }
buttonLinearLayout.addView(rejectButton)
val acceptButton = button()
acceptButton.text = resources.getString(R.string.view_friend_request_accept_button_title)
acceptButton.setBackgroundResource(R.drawable.prominent_dialog_button_background)
val acceptButtonLayoutParams = acceptButton.layoutParams as LayoutParams
acceptButtonLayoutParams.setMargins(resources.getDimension(R.dimen.medium_spacing).toInt(), 0, 0, 0)
acceptButton.layoutParams = acceptButtonLayoutParams
acceptButton.setOnClickListener { accept() }
buttonLinearLayout.addView(acceptButton)
buttonLinearLayout.layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, toPx(50, resources))
addView(buttonLinearLayout)
}
@ -155,4 +167,19 @@ class FriendRequestView(context: Context, attrs: AttributeSet?, defStyleAttr: In
delegate?.rejectFriendRequest(message!!)
}
// endregion
}
}
// region Delegate
interface FriendRequestViewDelegate {
/**
* Implementations of this method should update the thread's friend request status
* and send a friend request accepted message.
*/
fun acceptFriendRequest(friendRequest: MessageRecord)
/**
* Implementations of this method should update the thread's friend request status
* and remove the pre keys associated with the contact.
*/
fun rejectFriendRequest(friendRequest: MessageRecord)
}
// endregion