Commit 237894da authored by Grigory Fedorov's avatar Grigory Fedorov

Chat messages onclick context menu returned. Link click not supported.

parent 4598fab9
...@@ -23,7 +23,6 @@ import android.view.View; ...@@ -23,7 +23,6 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.animation.Animation; import android.view.animation.Animation;
import android.view.animation.AnimationUtils; import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.PopupMenu; import android.widget.PopupMenu;
...@@ -56,7 +55,8 @@ import com.xabber.android.ui.helper.ContactTitleInflater; ...@@ -56,7 +55,8 @@ import com.xabber.android.ui.helper.ContactTitleInflater;
import com.xabber.android.ui.preferences.ChatEditor; import com.xabber.android.ui.preferences.ChatEditor;
import com.xabber.androiddev.R; import com.xabber.androiddev.R;
public class ChatViewerFragment extends Fragment implements AdapterView.OnItemClickListener, PopupMenu.OnMenuItemClickListener, View.OnClickListener, Toolbar.OnMenuItemClickListener { public class ChatViewerFragment extends Fragment implements PopupMenu.OnMenuItemClickListener,
View.OnClickListener, Toolbar.OnMenuItemClickListener, ChatMessageAdapter.Message.MessageClickListener {
public static final String ARGUMENT_ACCOUNT = "ARGUMENT_ACCOUNT"; public static final String ARGUMENT_ACCOUNT = "ARGUMENT_ACCOUNT";
public static final String ARGUMENT_USER = "ARGUMENT_USER"; public static final String ARGUMENT_USER = "ARGUMENT_USER";
...@@ -65,7 +65,6 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl ...@@ -65,7 +65,6 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl
private EditText inputView; private EditText inputView;
private RecyclerView recyclerView;
private ChatMessageAdapter chatMessageAdapter; private ChatMessageAdapter chatMessageAdapter;
private boolean skipOnTextChanges; private boolean skipOnTextChanges;
...@@ -80,6 +79,7 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl ...@@ -80,6 +79,7 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl
private ChatViewerFragmentListener listener; private ChatViewerFragmentListener listener;
private Animation shakeAnimation = null; private Animation shakeAnimation = null;
private int contextMenuItemPosition;
public static ChatViewerFragment newInstance(String account, String user) { public static ChatViewerFragment newInstance(String account, String user) {
ChatViewerFragment fragment = new ChatViewerFragment(); ChatViewerFragment fragment = new ChatViewerFragment();
...@@ -156,9 +156,9 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl ...@@ -156,9 +156,9 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl
securityButton.setVisibility(View.GONE); securityButton.setVisibility(View.GONE);
} }
chatMessageAdapter = new ChatMessageAdapter(getActivity(), account, user); chatMessageAdapter = new ChatMessageAdapter(getActivity(), account, user, this);
recyclerView = (RecyclerView) view.findViewById(R.id.chat_messages_recycler_view); RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.chat_messages_recycler_view);
recyclerView.setAdapter(chatMessageAdapter); recyclerView.setAdapter(chatMessageAdapter);
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
...@@ -271,7 +271,6 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl ...@@ -271,7 +271,6 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl
sendButton.setImageResource(R.drawable.ic_button_send); sendButton.setImageResource(R.drawable.ic_button_send);
sendButton.setImageLevel(AccountManager.getInstance().getColorLevel(account)); sendButton.setImageLevel(AccountManager.getInstance().getColorLevel(account));
} }
} }
} }
...@@ -368,14 +367,9 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl ...@@ -368,14 +367,9 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl
} }
@Override @Override
public void onCreateContextMenu(ContextMenu menu, View view, public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo) {
ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, view, menuInfo); super.onCreateContextMenu(menu, view, menuInfo);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo; int itemViewType = chatMessageAdapter.getItemViewType(contextMenuItemPosition);
ChatMessageAdapter chatMessageAdapter = (ChatMessageAdapter) recyclerView.getAdapter();
int itemViewType = chatMessageAdapter.getItemViewType(info.position);
if (itemViewType == ChatMessageAdapter.VIEW_TYPE_INCOMING_MESSAGE if (itemViewType == ChatMessageAdapter.VIEW_TYPE_INCOMING_MESSAGE
|| itemViewType == ChatMessageAdapter.VIEW_TYPE_OUTGOING_MESSAGE) { || itemViewType == ChatMessageAdapter.VIEW_TYPE_OUTGOING_MESSAGE) {
...@@ -383,16 +377,16 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl ...@@ -383,16 +377,16 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl
MenuInflater inflater = getActivity().getMenuInflater(); MenuInflater inflater = getActivity().getMenuInflater();
inflater.inflate(R.menu.chat_context_menu, menu); inflater.inflate(R.menu.chat_context_menu, menu);
if (((MessageItem) chatMessageAdapter.getItem(info.position)).isError()) { if (chatMessageAdapter.getMessageItem(contextMenuItemPosition).isError()) {
menu.findItem(R.id.action_message_repeat).setVisible(true); menu.findItem(R.id.action_message_repeat).setVisible(true);
} }
} }
} }
@Override @Override
public boolean onContextItemSelected(MenuItem item) { public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); final MessageItem message = chatMessageAdapter.getMessageItem(contextMenuItemPosition);
final MessageItem message = (MessageItem) chatMessageAdapter.getItem(info.position);
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.action_message_repeat: case R.id.action_message_repeat:
...@@ -455,13 +449,6 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl ...@@ -455,13 +449,6 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl
skipOnTextChanges = false; skipOnTextChanges = false;
} }
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
registerForContextMenu(recyclerView);
recyclerView.showContextMenuForChild(view);
unregisterForContextMenu(recyclerView);
}
@Override @Override
public boolean onMenuItemClick(MenuItem item) { public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
...@@ -616,6 +603,15 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl ...@@ -616,6 +603,15 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl
} }
} }
@Override
public void onMessageClick(View caller, int position) {
registerForContextMenu(caller);
this.contextMenuItemPosition = position;
caller.setOnCreateContextMenuListener(this);
caller.showContextMenu();
unregisterForContextMenu(caller);
}
public interface ChatViewerFragmentListener { public interface ChatViewerFragmentListener {
void onCloseChat(); void onCloseChat();
void onMessageSent(); void onMessageSent();
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
*/ */
package com.xabber.android.ui.adapter; package com.xabber.android.ui.adapter;
import android.app.Activity; import android.content.Context;
import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView;
import android.text.Spannable; import android.text.Spannable;
import android.text.SpannableStringBuilder; import android.text.SpannableStringBuilder;
...@@ -53,7 +53,8 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo ...@@ -53,7 +53,8 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
public static final int VIEW_TYPE_OUTGOING_MESSAGE = 3; public static final int VIEW_TYPE_OUTGOING_MESSAGE = 3;
private static final int VIEW_TYPE_ACTION_MESSAGE = 4; private static final int VIEW_TYPE_ACTION_MESSAGE = 4;
private final Activity activity; private final Context context;
private final Message.MessageClickListener messageClickListener;
private String account; private String account;
private String user; private String user;
private boolean isMUC; private boolean isMUC;
...@@ -94,24 +95,40 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo ...@@ -94,24 +95,40 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
} }
} }
public static abstract class Message extends RecyclerView.ViewHolder { public static abstract class Message extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView messageText; public TextView messageText;
public TextView messageTime; public TextView messageTime;
public Message(View itemView) { MessageClickListener onClickListener;
public Message(View itemView, MessageClickListener onClickListener) {
super(itemView); super(itemView);
this.onClickListener = onClickListener;
messageText = (TextView) itemView.findViewById(R.id.message_text); messageText = (TextView) itemView.findViewById(R.id.message_text);
messageTime = (TextView) itemView.findViewById(R.id.message_time); messageTime = (TextView) itemView.findViewById(R.id.message_time);
itemView.setOnClickListener(this);
} }
@Override
public void onClick(View v) {
onClickListener.onMessageClick(v, getPosition());
}
public interface MessageClickListener {
void onMessageClick(View caller, int position);
}
} }
public static class IncomingMessage extends Message { public static class IncomingMessage extends Message {
public ImageView avatar; public ImageView avatar;
public IncomingMessage(View itemView) { public IncomingMessage(View itemView, MessageClickListener listener) {
super(itemView); super(itemView, listener);
avatar = (ImageView) itemView.findViewById(R.id.avatar); avatar = (ImageView) itemView.findViewById(R.id.avatar);
} }
} }
...@@ -120,23 +137,25 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo ...@@ -120,23 +137,25 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
public ImageView statusIcon; public ImageView statusIcon;
public OutgoingMessage(View itemView) { public OutgoingMessage(View itemView, MessageClickListener listener) {
super(itemView); super(itemView, listener);
statusIcon = (ImageView) itemView.findViewById(R.id.message_status_icon); statusIcon = (ImageView) itemView.findViewById(R.id.message_status_icon);
} }
} }
public ChatMessageAdapter(Activity activity, String account, String user) { public ChatMessageAdapter(Context context, String account, String user, Message.MessageClickListener messageClickListener) {
this.activity = activity; this.context = context;
messages = Collections.emptyList(); messages = Collections.emptyList();
this.account = account; this.account = account;
this.user = user; this.user = user;
this.messageClickListener = messageClickListener;
isMUC = MUCManager.getInstance().hasRoom(account, user); isMUC = MUCManager.getInstance().hasRoom(account, user);
hint = null; hint = null;
appearanceStyle = SettingsManager.chatsAppearanceStyle(); appearanceStyle = SettingsManager.chatsAppearanceStyle();
ChatsDivide chatsDivide = SettingsManager.chatsDivide(); ChatsDivide chatsDivide = SettingsManager.chatsDivide();
if (chatsDivide == ChatsDivide.always || (chatsDivide == ChatsDivide.portial if (chatsDivide == ChatsDivide.always || (chatsDivide == ChatsDivide.portial
&& !activity.getResources().getBoolean(R.bool.landscape))) { && !context.getResources().getBoolean(R.bool.landscape))) {
divider = "\n"; divider = "\n";
} else { } else {
divider = " "; divider = " ";
...@@ -156,11 +175,11 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo ...@@ -156,11 +175,11 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
case VIEW_TYPE_INCOMING_MESSAGE: case VIEW_TYPE_INCOMING_MESSAGE:
return new IncomingMessage(LayoutInflater.from(parent.getContext()) return new IncomingMessage(LayoutInflater.from(parent.getContext())
.inflate(R.layout.chat_viewer_incoming_message, parent, false)); .inflate(R.layout.chat_viewer_incoming_message, parent, false), messageClickListener);
case VIEW_TYPE_OUTGOING_MESSAGE: case VIEW_TYPE_OUTGOING_MESSAGE:
return new OutgoingMessage(LayoutInflater.from(parent.getContext()) return new OutgoingMessage(LayoutInflater.from(parent.getContext())
.inflate(R.layout.chat_viewer_outgoing_message, parent, false)); .inflate(R.layout.chat_viewer_outgoing_message, parent, false), messageClickListener);
default: default:
return null; return null;
} }
...@@ -171,7 +190,7 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo ...@@ -171,7 +190,7 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
final int viewType = getItemViewType(position); final int viewType = getItemViewType(position);
MessageItem messageItem = (MessageItem) getItem(position); MessageItem messageItem = getMessageItem(position);
switch (viewType) { switch (viewType) {
case VIEW_TYPE_HINT: case VIEW_TYPE_HINT:
...@@ -180,9 +199,9 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo ...@@ -180,9 +199,9 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
case VIEW_TYPE_ACTION_MESSAGE: case VIEW_TYPE_ACTION_MESSAGE:
ChatAction action = messageItem.getAction(); ChatAction action = messageItem.getAction();
String time = StringUtils.getSmartTimeText(activity, messageItem.getTimestamp()); String time = StringUtils.getSmartTimeText(context, messageItem.getTimestamp());
((ActionMessage)holder).actionMessage.setText(time + ": " ((ActionMessage)holder).actionMessage.setText(time + ": "
+ action.getText(activity, messageItem.getResource(), messageItem.getSpannable().toString())); + action.getText(context, messageItem.getResource(), messageItem.getSpannable().toString()));
break; break;
case VIEW_TYPE_INCOMING_MESSAGE: case VIEW_TYPE_INCOMING_MESSAGE:
...@@ -202,7 +221,7 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo ...@@ -202,7 +221,7 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
return messages.size() + 1; return messages.size() + 1;
} }
public Object getItem(int position) { public MessageItem getMessageItem(int position) {
if (position < messages.size()) { if (position < messages.size()) {
return messages.get(position); return messages.get(position);
} else { } else {
...@@ -221,7 +240,7 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo ...@@ -221,7 +240,7 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
return VIEW_TYPE_HINT; return VIEW_TYPE_HINT;
} }
MessageItem messageItem = (MessageItem) getItem(position); MessageItem messageItem = getMessageItem(position);
if (messageItem.getAction() != null) { if (messageItem.getAction() != null) {
return VIEW_TYPE_ACTION_MESSAGE; return VIEW_TYPE_ACTION_MESSAGE;
} }
...@@ -234,35 +253,34 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo ...@@ -234,35 +253,34 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
final String resource = messageItem.getResource(); final String resource = messageItem.getResource();
if (isMUC) { if (isMUC) {
append(builder, resource, new TextAppearanceSpan(activity, R.style.ChatHeader_Time)); append(builder, resource, new TextAppearanceSpan(context, R.style.ChatHeader_Time));
append(builder, divider, new TextAppearanceSpan(activity, R.style.ChatHeader)); append(builder, divider, new TextAppearanceSpan(context, R.style.ChatHeader));
} }
Date delayTimestamp = messageItem.getDelayTimestamp(); Date delayTimestamp = messageItem.getDelayTimestamp();
if (messageItem.isUnencypted()) { if (messageItem.isUnencypted()) {
append(builder, activity.getString(R.string.otr_unencrypted_message), append(builder, context.getString(R.string.otr_unencrypted_message),
new TextAppearanceSpan(activity, R.style.ChatHeader_Delay)); new TextAppearanceSpan(context, R.style.ChatHeader_Delay));
append(builder, divider, new TextAppearanceSpan(activity, R.style.ChatHeader)); append(builder, divider, new TextAppearanceSpan(context, R.style.ChatHeader));
} }
Spannable text = messageItem.getSpannable(); Spannable text = messageItem.getSpannable();
if (messageItem.getTag() == null) { if (messageItem.getTag() == null) {
builder.append(text); builder.append(text);
} else { } else {
append(builder, text, new TextAppearanceSpan(activity, R.style.ChatRead)); append(builder, text, new TextAppearanceSpan(context, R.style.ChatRead));
} }
message.messageText.setTextAppearance(activity, appearanceStyle); message.messageText.setTextAppearance(context, appearanceStyle);
message.messageText.setText(builder); message.messageText.setText(builder);
message.messageText.getBackground().setLevel(AccountManager.getInstance().getColorLevel(account)); message.messageText.getBackground().setLevel(AccountManager.getInstance().getColorLevel(account));
String time = StringUtils.getSmartTimeText(activity, messageItem.getTimestamp()); String time = StringUtils.getSmartTimeText(context, messageItem.getTimestamp());
if (delayTimestamp != null) { if (delayTimestamp != null) {
String delay = activity.getString(messageItem.isIncoming() ? R.string.chat_delay : R.string.chat_typed, String delay = context.getString(messageItem.isIncoming() ? R.string.chat_delay : R.string.chat_typed,
StringUtils.getSmartTimeText(activity, delayTimestamp)); StringUtils.getSmartTimeText(context, delayTimestamp));
time += " (" + delay + ")"; time += " (" + delay + ")";
} }
...@@ -331,15 +349,15 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo ...@@ -331,15 +349,15 @@ public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHo
final AbstractContact abstractContact = RosterManager.getInstance().getBestContact(account, user); final AbstractContact abstractContact = RosterManager.getInstance().getBestContact(account, user);
if (!online) { if (!online) {
if (abstractContact instanceof RoomContact) { if (abstractContact instanceof RoomContact) {
return activity.getString(R.string.muc_is_unavailable); return context.getString(R.string.muc_is_unavailable);
} else { } else {
return activity.getString(R.string.account_is_offline); return context.getString(R.string.account_is_offline);
} }
} else if (!abstractContact.getStatusMode().isOnline()) { } else if (!abstractContact.getStatusMode().isOnline()) {
if (abstractContact instanceof RoomContact) { if (abstractContact instanceof RoomContact) {
return activity.getString(R.string.muc_is_unavailable); return context.getString(R.string.muc_is_unavailable);
} else { } else {
return activity.getString(R.string.contact_is_offline, abstractContact.getName()); return context.getString(R.string.contact_is_offline, abstractContact.getName());
} }
} }
return null; return null;
......
...@@ -14,10 +14,8 @@ ...@@ -14,10 +14,8 @@
--> -->
<RelativeLayout <RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/chat_message_incoming"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
> >
<ImageView <ImageView
android:id="@+id/avatar" android:id="@+id/avatar"
...@@ -42,8 +40,6 @@ ...@@ -42,8 +40,6 @@
android:layout_toRightOf="@id/avatar" android:layout_toRightOf="@id/avatar"
android:layout_toEndOf="@id/avatar" android:layout_toEndOf="@id/avatar"
android:autoLink="all"
android:minWidth="142dp" android:minWidth="142dp"
android:paddingLeft="16dp" android:paddingLeft="16dp"
......
...@@ -14,10 +14,9 @@ ...@@ -14,10 +14,9 @@
--> -->
<RelativeLayout <RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/chat_message_incoming" android:id="@+id/chat_message_outgoing"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:descendantFocusability="blocksDescendants"
> >
<TextView <TextView
...@@ -37,7 +36,6 @@ ...@@ -37,7 +36,6 @@
android:layout_marginRight="6dp" android:layout_marginRight="6dp"
android:layout_marginEnd="6dp" android:layout_marginEnd="6dp"
android:autoLink="all"
android:minWidth="160dp" android:minWidth="160dp"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment