Commit 70556309 authored by Grigory Fedorov's avatar Grigory Fedorov

Chats: toolbar moved from ChatViewer activity to fragments. Same for options menu.

 Toolbar implemented as standalone, up button uses icon from drawable (not system one).
New class StatusBarPainter excluded from ActionBarPainter.
parent cb05547c
...@@ -22,38 +22,27 @@ import android.content.DialogInterface; ...@@ -22,38 +22,27 @@ import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import com.xabber.android.data.ActivityManager; import com.xabber.android.data.ActivityManager;
import com.xabber.android.data.Application; import com.xabber.android.data.Application;
import com.xabber.android.data.NetworkException;
import com.xabber.android.data.account.OnAccountChangedListener; import com.xabber.android.data.account.OnAccountChangedListener;
import com.xabber.android.data.entity.BaseEntity; import com.xabber.android.data.entity.BaseEntity;
import com.xabber.android.data.extension.archive.MessageArchiveManager; import com.xabber.android.data.extension.archive.MessageArchiveManager;
import com.xabber.android.data.extension.attention.AttentionManager; import com.xabber.android.data.extension.attention.AttentionManager;
import com.xabber.android.data.extension.muc.MUCManager; import com.xabber.android.data.extension.muc.MUCManager;
import com.xabber.android.data.extension.muc.RoomChat;
import com.xabber.android.data.extension.muc.RoomState;
import com.xabber.android.data.intent.EntityIntentBuilder; import com.xabber.android.data.intent.EntityIntentBuilder;
import com.xabber.android.data.message.AbstractChat; import com.xabber.android.data.message.AbstractChat;
import com.xabber.android.data.message.MessageManager; import com.xabber.android.data.message.MessageManager;
import com.xabber.android.data.message.OnChatChangedListener; import com.xabber.android.data.message.OnChatChangedListener;
import com.xabber.android.data.message.RegularChat;
import com.xabber.android.data.notification.NotificationManager; import com.xabber.android.data.notification.NotificationManager;
import com.xabber.android.data.roster.AbstractContact;
import com.xabber.android.data.roster.OnContactChangedListener; import com.xabber.android.data.roster.OnContactChangedListener;
import com.xabber.android.data.roster.RosterManager;
import com.xabber.android.ui.adapter.ChatScrollIndicatorAdapter; import com.xabber.android.ui.adapter.ChatScrollIndicatorAdapter;
import com.xabber.android.ui.adapter.ChatViewerAdapter; import com.xabber.android.ui.adapter.ChatViewerAdapter;
import com.xabber.android.ui.dialog.ChatExportDialogFragment;
import com.xabber.android.ui.helper.ContactTitleActionBarInflater;
import com.xabber.android.ui.helper.ManagedActivity; import com.xabber.android.ui.helper.ManagedActivity;
import com.xabber.android.ui.preferences.ChatEditor; import com.xabber.android.ui.helper.StatusBarPainter;
import com.xabber.androiddev.R; import com.xabber.androiddev.R;
import java.util.Collection; import java.util.Collection;
...@@ -67,7 +56,10 @@ import java.util.HashSet; ...@@ -67,7 +56,10 @@ import java.util.HashSet;
*/ */
public class ChatViewer extends ManagedActivity implements OnChatChangedListener, public class ChatViewer extends ManagedActivity implements OnChatChangedListener,
OnContactChangedListener, OnAccountChangedListener, ViewPager.OnPageChangeListener, OnContactChangedListener, OnAccountChangedListener, ViewPager.OnPageChangeListener,
ChatViewerAdapter.FinishUpdateListener, RecentChatFragment.RecentChatFragmentInteractionListener, View.OnClickListener { ChatViewerAdapter.FinishUpdateListener, RecentChatFragment.RecentChatFragmentInteractionListener, View.OnClickListener,
ChatViewerFragment.ChatViewerFragmentListener
{
/** /**
* Attention request. * Attention request.
...@@ -78,8 +70,6 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener ...@@ -78,8 +70,6 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener
private static final String SAVED_USER = "com.xabber.android.ui.ChatViewer.SAVED_USER"; private static final String SAVED_USER = "com.xabber.android.ui.ChatViewer.SAVED_USER";
private static final String SAVED_EXIT_ON_SEND = "com.xabber.android.ui.ChatViewer.EXIT_ON_SEND"; private static final String SAVED_EXIT_ON_SEND = "com.xabber.android.ui.ChatViewer.EXIT_ON_SEND";
private static final int MINIMUM_MESSAGES_TO_LOAD = 10;
private boolean exitOnSend; private boolean exitOnSend;
private String extraText = null; private String extraText = null;
...@@ -95,10 +85,9 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener ...@@ -95,10 +85,9 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener
private String actionWithAccount = null; private String actionWithAccount = null;
private String actionWithUser = null; private String actionWithUser = null;
private ContactTitleActionBarInflater contactTitleActionBarInflater; private StatusBarPainter statusBarPainter;
private boolean isChatSelected; private boolean isChatSelected;
private Menu menu = null;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
...@@ -125,19 +114,8 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener ...@@ -125,19 +114,8 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener
} }
setContentView(R.layout.activity_chat_viewer); setContentView(R.layout.activity_chat_viewer);
setSupportActionBar((Toolbar) findViewById(R.id.toolbar_default));
contactTitleActionBarInflater = new ContactTitleActionBarInflater(this);
contactTitleActionBarInflater.setUpActionBarView();
contactTitleActionBarInflater.setOnClickListener(new View.OnClickListener() { statusBarPainter = new StatusBarPainter(this);
@Override
public void onClick(View v) {
scrollChat();
}
});
contactTitleActionBarInflater.setOnAvatarClickListener(this);
if (account != null && user != null) { if (account != null && user != null) {
chatViewerAdapter = new ChatViewerAdapter(getFragmentManager(), account, user, this); chatViewerAdapter = new ChatViewerAdapter(getFragmentManager(), account, user, this);
...@@ -158,77 +136,6 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener ...@@ -158,77 +136,6 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener
selectPage(account, user, false); selectPage(account, user, false);
} }
private void scrollChat() {
if (!isChatSelected) {
return;
}
for (ChatViewerFragment chat : registeredChats) {
if (chat.isEqual(actionWithAccount, actionWithUser)) {
chat.scrollChat();
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
this.menu = menu;
createOptionsMenu();
return true;
}
private void createOptionsMenu() {
if (menu == null) {
return;
}
menu.clear();
if (!isChatSelected) {
return;
}
getMenuInflater().inflate(R.menu.chat, menu);
final String account = actionWithAccount;
final String user = actionWithUser;
AbstractChat abstractChat = MessageManager.getInstance().getChat(account, user);
if (abstractChat instanceof RoomChat) {
RoomState chatState = ((RoomChat) abstractChat).getState();
if (chatState == RoomState.available) {
menu.findItem(R.id.action_list_of_occupants).setVisible(true);
}
if (chatState == RoomState.unavailable) {
menu.findItem(R.id.action_join_conference).setVisible(true);
} else {
menu.findItem(R.id.action_invite_to_chat).setVisible(true);
if (chatState == RoomState.error) {
menu.findItem(R.id.action_authorization_settings).setVisible(true);
} else {
menu.findItem(R.id.action_leave_conference).setVisible(true);
}
}
}
if (abstractChat instanceof RegularChat) {
menu.findItem(R.id.action_view_contact).setVisible(true);
menu.findItem(R.id.action_close_chat).setVisible(true);
}
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
createOptionsMenu();
return true;
}
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
...@@ -287,113 +194,6 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener ...@@ -287,113 +194,6 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener
} }
@Override
public boolean onOptionsItemSelected(MenuItem item) {
final String account = actionWithAccount;
final String user = actionWithUser;
switch (item.getItemId()) {
case R.id.action_view_contact:
showContactInfo();
return true;
case R.id.action_chat_list:
selectRecentChatsPage();
return true;
case R.id.action_chat_settings:
startActivity(ChatEditor.createIntent(this, account, user));
return true;
case R.id.action_show_history:
showHistory(account, user);
return true;
case R.id.action_authorization_settings:
startActivity(MUCEditor.createIntent(this, account, user));
return true;
case R.id.action_close_chat:
closeChat(account, user);
return true;
case R.id.action_clear_text:
cleatInputText(account, user);
return true;
case R.id.action_clear_history:
clearHistory(account, user);
return true;
case R.id.action_export_chat:
ChatExportDialogFragment.newInstance(account, user).show(getFragmentManager(), "CHAT_EXPORT");
return true;
case R.id.action_call_attention:
callAttention(account, user);
return true;
/* conferences */
case R.id.action_join_conference:
MUCManager.getInstance().joinRoom(account, user, true);
return true;
case R.id.action_invite_to_chat:
startActivity(ContactList.createRoomInviteIntent(this, account, user));
return true;
case R.id.action_leave_conference:
leaveConference(account, user);
return true;
case R.id.action_list_of_occupants:
startActivity(OccupantList.createIntent(this, account, user));
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void cleatInputText(String account, String user) {
for (ChatViewerFragment chat : registeredChats) {
if (chat.isEqual(account, user)) {
chat.clearInputText();
}
}
}
private void callAttention(String account, String user) {
try {
AttentionManager.getInstance().sendAttention(account, user);
} catch (NetworkException e) {
Application.getInstance().onError(e);
}
}
private void clearHistory(String account, String user) {
MessageManager.getInstance().clearHistory(account, user);
updateRegisteredChats();
}
private void closeChat(String account, String user) {
MessageManager.getInstance().closeChat(account, user);
NotificationManager.getInstance().removeMessageNotification(account, user);
close();
}
private void leaveConference(String account, String user) {
MUCManager.getInstance().leaveRoom(account, user);
closeChat(account, user);
}
private void showHistory(String account, String user) {
MessageManager.getInstance().requestToLoadLocalHistory(account, user);
MessageArchiveManager.getInstance().requestHistory(account, user, MINIMUM_MESSAGES_TO_LOAD, 0);
updateRegisteredChats();
}
private void selectPage(String account, String user, boolean smoothScroll) { private void selectPage(String account, String user, boolean smoothScroll) {
int position = chatViewerAdapter.getPageNumber(account, user); int position = chatViewerAdapter.getPageNumber(account, user);
selectPage(position, smoothScroll); selectPage(position, smoothScroll);
...@@ -494,7 +294,7 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener ...@@ -494,7 +294,7 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener
&& actionWithUser != null && actionWithUser.equals(user)) { && actionWithUser != null && actionWithUser.equals(user)) {
updateActionBar(account, user); updateActionBar(account, user);
if (incoming) { if (incoming) {
contactTitleActionBarInflater.playIncomingAnimation(); // contactTitleActionBarInflater.playIncomingAnimation();
} }
} }
} }
...@@ -557,10 +357,8 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener ...@@ -557,10 +357,8 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener
actionWithUser = null; actionWithUser = null;
} }
createOptionsMenu();
if (!isChatSelected) { if (!isChatSelected) {
contactTitleActionBarInflater.restoreDefaultTitleView(getString(R.string.chat_list)); statusBarPainter.restore();
MessageManager.getInstance().removeVisibleChat(); MessageManager.getInstance().removeVisibleChat();
return; return;
} }
...@@ -577,9 +375,7 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener ...@@ -577,9 +375,7 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener
} }
private void updateActionBar(String account, String user) { private void updateActionBar(String account, String user) {
final AbstractContact abstractContact = RosterManager.getInstance().getBestContact(account, user); statusBarPainter.updateWithAccountName(account);
contactTitleActionBarInflater.update(abstractContact);
} }
private void updateRegisteredChats() { private void updateRegisteredChats() {
...@@ -690,11 +486,6 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener ...@@ -690,11 +486,6 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener
public void onChatSelected(AbstractChat chat) { public void onChatSelected(AbstractChat chat) {
selectPage(chat.getAccount(), chat.getUser(), true); selectPage(chat.getAccount(), chat.getUser(), true);
} }
public void selectRecentChatsPage() {
selectPage(null, null, false);
}
public ChatViewerAdapter getChatViewerAdapter() { public ChatViewerAdapter getChatViewerAdapter() {
return chatViewerAdapter; return chatViewerAdapter;
} }
...@@ -722,4 +513,9 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener ...@@ -722,4 +513,9 @@ public class ChatViewer extends ManagedActivity implements OnChatChangedListener
startActivity(ContactEditor.createIntent(this, actionWithAccount, actionWithUser)); startActivity(ContactEditor.createIntent(this, actionWithAccount, actionWithUser));
} }
} }
@Override
public void onCloseChat() {
close();
}
} }
package com.xabber.android.ui; package com.xabber.android.ui;
import android.app.Activity;
import android.app.Fragment; import android.app.Fragment;
import android.content.ClipData; import android.content.ClipData;
import android.content.ClipboardManager; import android.content.ClipboardManager;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.text.Editable; import android.text.Editable;
import android.text.TextWatcher; import android.text.TextWatcher;
import android.view.ContextMenu; import android.view.ContextMenu;
...@@ -26,7 +30,12 @@ import com.xabber.android.data.LogManager; ...@@ -26,7 +30,12 @@ import com.xabber.android.data.LogManager;
import com.xabber.android.data.NetworkException; import com.xabber.android.data.NetworkException;
import com.xabber.android.data.SettingsManager; import com.xabber.android.data.SettingsManager;
import com.xabber.android.data.account.AccountManager; import com.xabber.android.data.account.AccountManager;
import com.xabber.android.data.extension.archive.MessageArchiveManager;
import com.xabber.android.data.extension.attention.AttentionManager;
import com.xabber.android.data.extension.cs.ChatStateManager; import com.xabber.android.data.extension.cs.ChatStateManager;
import com.xabber.android.data.extension.muc.MUCManager;
import com.xabber.android.data.extension.muc.RoomChat;
import com.xabber.android.data.extension.muc.RoomState;
import com.xabber.android.data.extension.otr.OTRManager; import com.xabber.android.data.extension.otr.OTRManager;
import com.xabber.android.data.extension.otr.SecurityLevel; import com.xabber.android.data.extension.otr.SecurityLevel;
import com.xabber.android.data.message.AbstractChat; import com.xabber.android.data.message.AbstractChat;
...@@ -34,14 +43,23 @@ import com.xabber.android.data.message.MessageItem; ...@@ -34,14 +43,23 @@ import com.xabber.android.data.message.MessageItem;
import com.xabber.android.data.message.MessageManager; import com.xabber.android.data.message.MessageManager;
import com.xabber.android.data.message.RegularChat; import com.xabber.android.data.message.RegularChat;
import com.xabber.android.data.message.chat.ChatManager; import com.xabber.android.data.message.chat.ChatManager;
import com.xabber.android.data.notification.NotificationManager;
import com.xabber.android.data.roster.AbstractContact;
import com.xabber.android.data.roster.RosterManager;
import com.xabber.android.ui.adapter.ChatMessageAdapter; import com.xabber.android.ui.adapter.ChatMessageAdapter;
import com.xabber.android.ui.dialog.ChatExportDialogFragment;
import com.xabber.android.ui.helper.ActionBarPainter;
import com.xabber.android.ui.helper.ContactTitleInflater;
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 { public class ChatViewerFragment extends Fragment implements AdapterView.OnItemClickListener, PopupMenu.OnMenuItemClickListener, View.OnClickListener, Toolbar.OnMenuItemClickListener {
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";
private static final int MINIMUM_MESSAGES_TO_LOAD = 10;
private EditText inputView; private EditText inputView;
private ListView listView; private ListView listView;
private ChatMessageAdapter chatMessageAdapter; private ChatMessageAdapter chatMessageAdapter;
...@@ -54,6 +72,9 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl ...@@ -54,6 +72,9 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl
boolean isInputEmpty = true; boolean isInputEmpty = true;
private ImageButton sendButton; private ImageButton sendButton;
private ImageButton securityButton; private ImageButton securityButton;
private Toolbar toolbar;
private ChatViewerFragmentListener listener;
public static ChatViewerFragment newInstance(String account, String user) { public static ChatViewerFragment newInstance(String account, String user) {
ChatViewerFragment fragment = new ChatViewerFragment(); ChatViewerFragment fragment = new ChatViewerFragment();
...@@ -80,6 +101,27 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl ...@@ -80,6 +101,27 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl
View view = inflater.inflate(R.layout.chat_viewer_item, container, false); View view = inflater.inflate(R.layout.chat_viewer_item, container, false);
View contactTitle = view.findViewById(R.id.contact_title);
final AbstractContact abstractContact = RosterManager.getInstance().getBestContact(account, user);
ContactTitleInflater.updateTitle(contactTitle, getActivity(), abstractContact);
contactTitle.findViewById(R.id.avatar).setOnClickListener(this);
ActionBarPainter actionBarPainter = new ActionBarPainter((ActionBarActivity) getActivity());
toolbar = (Toolbar) view.findViewById(R.id.toolbar_default);
toolbar.setBackgroundColor(actionBarPainter.getAccountColor(account));
toolbar.inflateMenu(R.menu.chat);
toolbar.setOnMenuItemClickListener(this);
toolbar.setNavigationIcon(R.drawable.ic_arrow_left_white_24dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NavUtils.navigateUpFromSameTask(getActivity());
}
});
view.getBackground().setAlpha(40); view.getBackground().setAlpha(40);
sendButton = (ImageButton) view.findViewById(R.id.button_send_message); sendButton = (ImageButton) view.findViewById(R.id.button_send_message);
...@@ -165,7 +207,24 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl ...@@ -165,7 +207,24 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl
updateChat(); updateChat();
return view; return view;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
listener = (ChatViewerFragmentListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement ChatViewerFragmentListener");
}
}
@Override
public void onDetach() {
super.onDetach();
listener = null;
} }
private void showSecurityMenu() { private void showSecurityMenu() {
...@@ -272,6 +331,36 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl ...@@ -272,6 +331,36 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl
updateChat(); updateChat();
} }
private void setUpOptionsMenu(Menu menu) {
AbstractChat abstractChat = MessageManager.getInstance().getChat(account, user);
if (abstractChat instanceof RoomChat) {
RoomState chatState = ((RoomChat) abstractChat).getState();
if (chatState == RoomState.available) {
menu.findItem(R.id.action_list_of_occupants).setVisible(true);
}
if (chatState == RoomState.unavailable) {
menu.findItem(R.id.action_join_conference).setVisible(true);
} else {
menu.findItem(R.id.action_invite_to_chat).setVisible(true);
if (chatState == RoomState.error) {
menu.findItem(R.id.action_authorization_settings).setVisible(true);
} else {
menu.findItem(R.id.action_leave_conference).setVisible(true);
}
}
}
if (abstractChat instanceof RegularChat) {
menu.findItem(R.id.action_view_contact).setVisible(true);
menu.findItem(R.id.action_close_chat).setVisible(true);
}
}
@Override @Override
public void onCreateContextMenu(ContextMenu menu, View view, public void onCreateContextMenu(ContextMenu menu, View view,
ContextMenu.ContextMenuInfo menuInfo) { ContextMenu.ContextMenuInfo menuInfo) {
...@@ -326,6 +415,7 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl ...@@ -326,6 +415,7 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl
public void updateChat() { public void updateChat() {
chatMessageAdapter.onChange(); chatMessageAdapter.onChange();
setUpOptionsMenu(toolbar.getMenu());
updateSecurityButton(); updateSecurityButton();
} }
...@@ -353,7 +443,7 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl ...@@ -353,7 +443,7 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl
return user; return user;
} }
public void clearInputText() { private void clearInputText() {
skipOnTextChanges = true; skipOnTextChanges = true;
inputView.getText().clear(); inputView.getText().clear();
skipOnTextChanges = false; skipOnTextChanges = false;
...@@ -376,6 +466,8 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl ...@@ -376,6 +466,8 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl
@Override @Override
public boolean onMenuItemClick(MenuItem item) { public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
/* security menu */
case R.id.action_start_encryption: case R.id.action_start_encryption:
startEncryption(account, user); startEncryption(account, user);
return true; return true;
...@@ -400,11 +492,69 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl ...@@ -400,11 +492,69 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl
startActivity(QuestionViewer.createIntent(getActivity(), account, user, false, false, null)); startActivity(QuestionViewer.createIntent(getActivity(), account, user, false, false, null));
return true; return true;
/* regular chat options menu */
case R.id.action_view_contact:
showContactInfo();
return true;
case R.id.action_chat_settings:
startActivity(ChatEditor.createIntent(getActivity(), account, user));
return true;
case R.id.action_show_history:
showHistory(account, user);
return true;
case R.id.action_authorization_settings:
startActivity(MUCEditor.createIntent(getActivity(), account, user));
return true;
case R.id.action_close_chat:
closeChat(account, user);
return true;
case R.id.action_clear_history:
clearHistory(account, user);
return true;
case R.id.action_export_chat:
ChatExportDialogFragment.newInstance(account, user).show(getFragmentManager(), "CHAT_EXPORT");
return true;
case R.id.action_call_attention:
callAttention();
return true;
/* conference specific options menu */
case R.id.action_join_conference:
MUCManager.getInstance().joinRoom(account, user, true);
return true;
case R.id.action_invite_to_chat:
startActivity(ContactList.createRoomInviteIntent(getActivity(), account, user));
return true;
case R.id.action_leave_conference:
leaveConference(account, user);
return true;
case R.id.action_list_of_occupants:
startActivity(OccupantList.createIntent(getActivity(), account, user));
return true;
default: default:
return false; return false;
} }
} }
private void showHistory(String account, String user) {
MessageManager.getInstance().requestToLoadLocalHistory(account, user);
MessageArchiveManager.getInstance().requestHistory(account, user, MINIMUM_MESSAGES_TO_LOAD, 0);
}
private void stopEncryption(String account, String user) { private void stopEncryption(String account, String user) {
try { try {
OTRManager.getInstance().endSession(account, user); OTRManager.getInstance().endSession(account, user);
...@@ -428,4 +578,46 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl ...@@ -428,4 +578,46 @@ public class ChatViewerFragment extends Fragment implements AdapterView.OnItemCl
Application.getInstance().onError(e); Application.getInstance().onError(e);
} }
} }
@Override
public void onClick(View v) {
if (v.getId() == R.id.avatar) {
showContactInfo();
}
}
private void showContactInfo() {
if (MUCManager.getInstance().hasRoom(account, user)) {
startActivity(ContactViewer.createIntent(getActivity(), account, user));
} else {
startActivity(ContactEditor.createIntent(getActivity(), account, user));
}
}
private void closeChat(String account, String user) {
MessageManager.getInstance().closeChat(account, user);
NotificationManager.getInstance().removeMessageNotification(account, user);
listener.onCloseChat();
}
private void clearHistory(String account, String user) {
MessageManager.getInstance().clearHistory(account, user);
}
private void leaveConference(String account, String user) {
MUCManager.getInstance().leaveRoom(account, user);
closeChat(account, user);
}
private void callAttention() {
try {
AttentionManager.getInstance().sendAttention(account, user);
} catch (NetworkException e) {
Application.getInstance().onError(e);
}
}
public interface ChatViewerFragmentListener {
void onCloseChat();
}
} }
...@@ -3,6 +3,8 @@ package com.xabber.android.ui; ...@@ -3,6 +3,8 @@ package com.xabber.android.ui;
import android.app.Activity; import android.app.Activity;
import android.app.ListFragment; import android.app.ListFragment;
import android.os.Bundle; import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
...@@ -53,6 +55,7 @@ public class RecentChatFragment extends ListFragment { ...@@ -53,6 +55,7 @@ public class RecentChatFragment extends ListFragment {
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState); super.onCreateView(inflater, container, savedInstanceState);
View rootView = inflater.inflate(R.layout.recent_chats, container, false);
ArrayList<AbstractChat> activeChats = ((ChatViewer) getActivity()).getChatViewerAdapter().getActiveChats(); ArrayList<AbstractChat> activeChats = ((ChatViewer) getActivity()).getChatViewerAdapter().getActiveChats();
((ChatListAdapter) getListAdapter()).updateChats(activeChats); ((ChatListAdapter) getListAdapter()).updateChats(activeChats);
...@@ -63,7 +66,17 @@ public class RecentChatFragment extends ListFragment { ...@@ -63,7 +66,17 @@ public class RecentChatFragment extends ListFragment {
activity.finish(); activity.finish();
} }
return inflater.inflate(R.layout.recent_chats, container, false); Toolbar toolbar = (Toolbar) rootView.findViewById(R.id.toolbar_default);
toolbar.setTitle(R.string.group_active_chat);
toolbar.setNavigationIcon(R.drawable.ic_arrow_left_white_24dp);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
NavUtils.navigateUpFromSameTask(getActivity());
}
});
return rootView;
} }
@Override @Override
...@@ -97,7 +110,7 @@ public class RecentChatFragment extends ListFragment { ...@@ -97,7 +110,7 @@ public class RecentChatFragment extends ListFragment {
} }
public interface RecentChatFragmentInteractionListener { public interface RecentChatFragmentInteractionListener {
public void onChatSelected(AbstractChat chat); void onChatSelected(AbstractChat chat);
} }
public void updateChats(List<AbstractChat> chats) { public void updateChats(List<AbstractChat> chats) {
......
...@@ -2,10 +2,7 @@ package com.xabber.android.ui.helper; ...@@ -2,10 +2,7 @@ package com.xabber.android.ui.helper;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBarActivity;
import android.view.Window;
import android.view.WindowManager;
import com.xabber.android.data.account.AccountManager; import com.xabber.android.data.account.AccountManager;
import com.xabber.androiddev.R; import com.xabber.androiddev.R;
...@@ -13,28 +10,24 @@ import com.xabber.androiddev.R; ...@@ -13,28 +10,24 @@ import com.xabber.androiddev.R;
public class ActionBarPainter { public class ActionBarPainter {
private int[] accountActionBarColors; private int[] accountActionBarColors;
private int[] accountStatusBarColors;
private String[] accountColorNames; private String[] accountColorNames;
private Window window;
private int defaultStatusBarColor;
private ColorDrawable defaultActionBarBackground; private ColorDrawable defaultActionBarBackground;
private final ActionBarActivity activity; private final ActionBarActivity activity;
private StatusBarPainter statusBarPainter;
public ActionBarPainter(ActionBarActivity activity) { public ActionBarPainter(ActionBarActivity activity) {
this.activity = activity; this.activity = activity;
statusBarPainter = new StatusBarPainter(activity);
accountActionBarColors = activity.getResources().getIntArray(R.array.account_action_bar); accountActionBarColors = activity.getResources().getIntArray(R.array.account_action_bar);
accountStatusBarColors = activity.getResources().getIntArray(R.array.account_status_bar);
accountColorNames = activity.getResources().getStringArray(R.array.account_color_names); accountColorNames = activity.getResources().getStringArray(R.array.account_color_names);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window = this.activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
defaultStatusBarColor = window.getStatusBarColor();
}
TypedArray a = activity.getTheme().obtainStyledAttributes(R.style.Theme, new int[] {R.attr.colorPrimary}); TypedArray a = activity.getTheme().obtainStyledAttributes(R.style.Theme, new int[] {R.attr.colorPrimary});
int attributeResourceId = a.getResourceId(0, 0); int attributeResourceId = a.getResourceId(0, 0);
...@@ -46,18 +39,13 @@ public class ActionBarPainter { ...@@ -46,18 +39,13 @@ public class ActionBarPainter {
} }
public void updateWithColorLevel(int colorLevel) { public void updateWithColorLevel(int colorLevel) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.setStatusBarColor(accountStatusBarColors[colorLevel]);
}
activity.getSupportActionBar().setBackgroundDrawable(new ColorDrawable(accountActionBarColors[colorLevel])); activity.getSupportActionBar().setBackgroundDrawable(new ColorDrawable(accountActionBarColors[colorLevel]));
statusBarPainter.updateWithColorLevel(colorLevel);
} }
public void restore() { public void restore() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.setStatusBarColor(defaultStatusBarColor);
}
activity.getSupportActionBar().setBackgroundDrawable(defaultActionBarBackground); activity.getSupportActionBar().setBackgroundDrawable(defaultActionBarBackground);
statusBarPainter.restore();
} }
public void updateWithColorName(String targetColorName) { public void updateWithColorName(String targetColorName) {
......
...@@ -3,6 +3,7 @@ package com.xabber.android.ui.helper; ...@@ -3,6 +3,7 @@ package com.xabber.android.ui.helper;
import android.content.res.Resources; import android.content.res.Resources;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.graphics.drawable.ColorDrawable;
import android.os.Build; import android.os.Build;
import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar; import android.support.v7.widget.Toolbar;
...@@ -35,7 +36,6 @@ public class ContactTitleExpandableToolbarInflater implements ObservableScrollVi ...@@ -35,7 +36,6 @@ public class ContactTitleExpandableToolbarInflater implements ObservableScrollVi
private int toolbarHeight; private int toolbarHeight;
private int paddingLeftMin; private int paddingLeftMin;
private int paddingRight;
private int actionBarSize; private int actionBarSize;
private int toolbarHeightDelta; private int toolbarHeightDelta;
private int avatarLargeSize; private int avatarLargeSize;
...@@ -58,6 +58,12 @@ public class ContactTitleExpandableToolbarInflater implements ObservableScrollVi ...@@ -58,6 +58,12 @@ public class ContactTitleExpandableToolbarInflater implements ObservableScrollVi
contactNamePanel = activity.findViewById(R.id.contact_name_panel); contactNamePanel = activity.findViewById(R.id.contact_name_panel);
titleView = activity.findViewById(R.id.expandable_contact_title); titleView = activity.findViewById(R.id.expandable_contact_title);
int[] accountActionBarColors = activity.getResources().getIntArray(R.array.account_action_bar);
titleView.setBackgroundDrawable(new ColorDrawable(accountActionBarColors[
AccountManager.getInstance().getColorLevel(abstractContact.getAccount())]));
ContactTitleInflater.updateTitle(titleView, activity, abstractContact); ContactTitleInflater.updateTitle(titleView, activity, abstractContact);
int[] accountStatusBarColors = activity.getResources().getIntArray(R.array.account_status_bar); int[] accountStatusBarColors = activity.getResources().getIntArray(R.array.account_status_bar);
...@@ -73,7 +79,6 @@ public class ContactTitleExpandableToolbarInflater implements ObservableScrollVi ...@@ -73,7 +79,6 @@ public class ContactTitleExpandableToolbarInflater implements ObservableScrollVi
public void onResume() { public void onResume() {
Resources resources = activity.getResources(); Resources resources = activity.getResources();
paddingLeftMin = resources.getDimensionPixelSize(R.dimen.contact_title_padding_left); paddingLeftMin = resources.getDimensionPixelSize(R.dimen.contact_title_padding_left);
paddingRight = resources.getDimensionPixelSize(R.dimen.contact_title_padding_right);
avatarLargeSize = resources.getDimensionPixelSize(R.dimen.avatar_large_size); avatarLargeSize = resources.getDimensionPixelSize(R.dimen.avatar_large_size);
avatarNormalSize = resources.getDimensionPixelSize(R.dimen.avatar_normal_size); avatarNormalSize = resources.getDimensionPixelSize(R.dimen.avatar_normal_size);
avatarRadius = resources.getDimensionPixelSize(R.dimen.avatar_radius); avatarRadius = resources.getDimensionPixelSize(R.dimen.avatar_radius);
......
...@@ -14,53 +14,29 @@ ...@@ -14,53 +14,29 @@
*/ */
package com.xabber.android.ui.helper; package com.xabber.android.ui.helper;
import android.app.Activity; import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.view.View; import android.view.View;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import com.xabber.android.data.account.AccountManager;
import com.xabber.android.data.extension.cs.ChatStateManager; import com.xabber.android.data.extension.cs.ChatStateManager;
import com.xabber.android.data.roster.AbstractContact; import com.xabber.android.data.roster.AbstractContact;
import com.xabber.androiddev.R; import com.xabber.androiddev.R;
import org.jivesoftware.smackx.ChatState; import org.jivesoftware.smackx.ChatState;
/**
* Helper class to update <code>contact_title.xml</code>.
*
* @author alexander.ivanov
*/
public class ContactTitleInflater { public class ContactTitleInflater {
/** public static void updateTitle(View titleView, final Context context, AbstractContact abstractContact) {
* Fill title with information about {@link AbstractContact} and provides
* back button callback.
*
* @param titleView
* @param activity
* @param abstractContact
*/
public static void updateTitle(View titleView, final Activity activity,
AbstractContact abstractContact) {
final TextView nameView = (TextView) titleView.findViewById(R.id.name); final TextView nameView = (TextView) titleView.findViewById(R.id.name);
final ImageView avatarView = (ImageView) titleView.findViewById(R.id.avatar); final ImageView avatarView = (ImageView) titleView.findViewById(R.id.avatar);
int[] accountActionBarColors = activity.getResources().getIntArray(R.array.account_action_bar);
titleView.setBackgroundDrawable(new ColorDrawable(accountActionBarColors[
AccountManager.getInstance().getColorLevel(abstractContact.getAccount())]));
nameView.setTextColor(activity.getResources().getColor(R.color.primary_text_default_material_dark));
nameView.setText(abstractContact.getName()); nameView.setText(abstractContact.getName());
avatarView.setImageDrawable(abstractContact.getAvatar()); avatarView.setImageDrawable(abstractContact.getAvatar());
setStatus(context, titleView, abstractContact);
setStatus(activity, titleView, abstractContact);
} }
private static void setStatus(Activity activity, View titleView, AbstractContact abstractContact) { private static void setStatus(Context context, View titleView, AbstractContact abstractContact) {
final ImageView statusModeView = (ImageView) titleView.findViewById(R.id.status_icon); final ImageView statusModeView = (ImageView) titleView.findViewById(R.id.status_icon);
int statusLevel = abstractContact.getStatusMode().getStatusLevel(); int statusLevel = abstractContact.getStatusMode().getStatusLevel();
...@@ -79,13 +55,13 @@ public class ContactTitleInflater { ...@@ -79,13 +55,13 @@ public class ContactTitleInflater {
CharSequence statusText; CharSequence statusText;
if (chatState == ChatState.composing) { if (chatState == ChatState.composing) {
statusText = activity.getString(R.string.chat_state_composing); statusText = context.getString(R.string.chat_state_composing);
} else if (chatState == ChatState.paused) { } else if (chatState == ChatState.paused) {
statusText = activity.getString(R.string.chat_state_paused); statusText = context.getString(R.string.chat_state_paused);
} else { } else {
statusText = abstractContact.getStatusText().trim(); statusText = abstractContact.getStatusText().trim();
if (statusText.toString().isEmpty()) { if (statusText.toString().isEmpty()) {
statusText = activity.getString(abstractContact.getStatusMode().getStringID()); statusText = context.getString(abstractContact.getStatusMode().getStringID());
} }
} }
statusTextView.setText(statusText); statusTextView.setText(statusText);
......
package com.xabber.android.ui.helper;
import android.os.Build;
import android.support.v4.app.FragmentActivity;
import android.view.Window;
import android.view.WindowManager;
import com.xabber.android.data.account.AccountManager;
import com.xabber.androiddev.R;
public class StatusBarPainter {
private Window window;
private int defaultStatusBarColor;
private int[] accountStatusBarColors;
public StatusBarPainter(FragmentActivity activity) {
accountStatusBarColors = activity.getResources().getIntArray(R.array.account_status_bar);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
defaultStatusBarColor = window.getStatusBarColor();
}
}
public void updateWithAccountName(String account) {
updateWithColorLevel(AccountManager.getInstance().getColorLevel(account));
}
public void updateWithColorLevel(int colorLevel) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.setStatusBarColor(accountStatusBarColors[colorLevel]);
}
}
public void restore() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
window.setStatusBarColor(defaultStatusBarColor);
}
}
}
...@@ -4,15 +4,13 @@ ...@@ -4,15 +4,13 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<include layout="@layout/toolbar_default"
android:id="@+id/toolbar_default"
/>
<android.support.v4.view.ViewPager <android.support.v4.view.ViewPager
android:id="@+id/pager" android:id="@+id/pager"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_below="@+id/toolbar_default"
/> />
<LinearLayout <LinearLayout
...@@ -20,9 +18,8 @@ ...@@ -20,9 +18,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
android:layout_centerHorizontal="true" android:layout_centerHorizontal="true"
android:layout_marginTop="10dp" android:layout_marginTop="62dp"
android:id="@+id/chat_scroll_indicator" android:id="@+id/chat_scroll_indicator"
android:layout_below="@+id/toolbar_default"
> >
</LinearLayout> </LinearLayout>
......
...@@ -19,6 +19,26 @@ ...@@ -19,6 +19,26 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@drawable/chat_background_repeat" android:background="@drawable/chat_background_repeat"
> >
<android.support.v7.widget.Toolbar xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/toolbar_default"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:minHeight="52dp"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
android:background="?attr/colorPrimary"
android:elevation="8dp"
>
<include layout="@layout/contact_title"
android:id="@+id/contact_title"
/>
</android.support.v7.widget.Toolbar>
<ListView <ListView
android:id="@android:id/list" android:id="@android:id/list"
android:layout_width="match_parent" android:layout_width="match_parent"
...@@ -32,6 +52,7 @@ ...@@ -32,6 +52,7 @@
android:layout_above="@+id/input_layout" android:layout_above="@+id/input_layout"
tools:listitem="@layout/chat_viewer_outgoing_message" tools:listitem="@layout/chat_viewer_outgoing_message"
android:listSelector="@android:color/transparent" android:listSelector="@android:color/transparent"
android:layout_below="@+id/toolbar_default"
/> />
<LinearLayout <LinearLayout
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:minHeight="?android:attr/actionBarSize" android:minHeight="?android:attr/actionBarSize"
android:orientation="horizontal" android:orientation="horizontal"
android:background="@color/green_500"
android:gravity="center_vertical" android:gravity="center_vertical"
> >
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent" android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:background="@drawable/chat_background_repeat"
>
<include layout="@layout/toolbar_default" />
<ListView <ListView
android:layout_width="match_parent" android:layout_width="match_parent"
......
...@@ -59,12 +59,6 @@ ...@@ -59,12 +59,6 @@
android:visible="false" android:visible="false"
/> />
<item android:id="@+id/action_clear_text"
android:title="@string/clear_message"
app:showAsAction="never"
android:orderInCategory="150"
/>
<item android:id="@+id/action_clear_history" <item android:id="@+id/action_clear_history"
android:title="@string/clear_history" android:title="@string/clear_history"
app:showAsAction="never" app:showAsAction="never"
......
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