/**
* Wire
* Copyright (C) 2016 Wire Swiss GmbH
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.waz.zclient.pages.main.conversation.controller;
import android.view.View;
import com.waz.api.IConversation;
import com.waz.api.Message;
import com.waz.api.OtrClient;
import com.waz.api.User;
import com.waz.zclient.pages.main.participants.dialog.DialogLaunchMode;
import java.util.HashSet;
import java.util.Set;
public class ConversationScreenController implements IConversationScreenController {
private Set<ConversationScreenControllerObserver> conversationScreenControllerObservers = new HashSet<>();
private boolean isShowingParticipant;
private boolean isSingleConversation;
private boolean isMemberOfConversation;
private boolean isShowingUser;
private boolean conversationStreamUiReady;
private DialogLaunchMode launchMode;
private User showDevicesTabForUser;
private Message messageBeingEdited;
@Override
public void addConversationControllerObservers(ConversationScreenControllerObserver conversationScreenControllerObserver) {
// Prevent concurrent modification (if this add was executed by one of current observers during notify* callback)
Set<ConversationScreenControllerObserver> observers = new HashSet<>(conversationScreenControllerObservers);
observers.add(conversationScreenControllerObserver);
conversationScreenControllerObservers = observers;
}
@Override
public void removeConversationControllerObservers(ConversationScreenControllerObserver conversationScreenControllerObserver) {
// Prevent concurrent modification
if (conversationScreenControllerObservers.contains(conversationScreenControllerObserver)) {
Set<ConversationScreenControllerObserver> observers = new HashSet<>(conversationScreenControllerObservers);
observers.remove(conversationScreenControllerObserver);
conversationScreenControllerObservers = observers;
}
}
@Override
public void showParticipants(View anchorView, boolean showDeviceTabIfSingle) {
isShowingParticipant = true;
for (ConversationScreenControllerObserver conversationScreenControllerObserver : conversationScreenControllerObservers) {
conversationScreenControllerObserver.onShowParticipants(anchorView, isSingleConversation, isMemberOfConversation, showDeviceTabIfSingle);
}
}
@Override
public void hideParticipants(boolean backOrButtonPressed, boolean hideByConversationChange) {
if (!isShowingParticipant &&
launchMode == null) {
return;
}
for (ConversationScreenControllerObserver conversationScreenControllerObserver : conversationScreenControllerObservers) {
conversationScreenControllerObserver.onHideParticipants(backOrButtonPressed,
hideByConversationChange,
isSingleConversation);
}
resetToMessageStream();
}
@Override
public void editConversationName(boolean edit) {
for (ConversationScreenControllerObserver conversationManagerScreenControllerObserver : conversationScreenControllerObservers) {
conversationManagerScreenControllerObserver.onShowEditConversationName(edit);
}
}
@Override
public void setShowDevicesTab(User user) {
this.showDevicesTabForUser = user;
}
@Override
public boolean shouldShowDevicesTab() {
return showDevicesTabForUser != null;
}
@Override
public User getRequestedDeviceTabUser() {
return showDevicesTabForUser;
}
@Override
public void setOffset(int offset) {
for (ConversationScreenControllerObserver conversationScreenControllerObserver : conversationScreenControllerObservers) {
conversationScreenControllerObserver.setListOffset(offset);
}
}
@Override
public boolean isShowingParticipant() {
return isShowingParticipant;
}
@Override
public void resetToMessageStream() {
isShowingParticipant = false;
isShowingUser = false;
showDevicesTabForUser = null;
launchMode = null;
}
@Override
public void setParticipantHeaderHeight(int participantHeaderHeight) {
for (ConversationScreenControllerObserver conversationScreenControllerObserver : conversationScreenControllerObservers) {
conversationScreenControllerObserver.onHeaderViewMeasured(participantHeaderHeight);
}
}
@Override
public void onScrollParticipantsList(int verticalOffset, boolean scrolledToBottom) {
for (ConversationScreenControllerObserver conversationScreenControllerObserver : conversationScreenControllerObservers) {
conversationScreenControllerObserver.onScrollParticipantsList(verticalOffset, scrolledToBottom);
}
}
@Override
public boolean isSingleConversation() {
return isSingleConversation;
}
@Override
public void setSingleConversation(boolean isSingleConversation) {
this.isSingleConversation = isSingleConversation;
}
@Override
public void setMemberOfConversation(boolean isMemberOfConversation) {
this.isMemberOfConversation = isMemberOfConversation;
}
@Override
public void addPeopleToConversation() {
for (ConversationScreenControllerObserver observer : conversationScreenControllerObservers) {
observer.onAddPeopleToConversation();
}
}
@Override
public void showUser(User user) {
if (user == null || isShowingUser) {
return;
}
isShowingUser = true;
for (ConversationScreenControllerObserver observer : conversationScreenControllerObservers) {
observer.onShowUser(user);
}
}
@Override
public void hideUser() {
if (!isShowingUser) {
return;
}
for (ConversationScreenControllerObserver observer : conversationScreenControllerObservers) {
observer.onHideUser();
}
isShowingUser = false;
if (launchMode == DialogLaunchMode.AVATAR) {
launchMode = null;
}
}
@Override
public boolean isShowingUser() {
return isShowingUser;
}
@Override
public void tearDown() {
conversationScreenControllerObservers.clear();
conversationScreenControllerObservers = null;
}
@Override
public boolean isConversationStreamUiInitialized() {
return conversationStreamUiReady;
}
@Override
public void setConversationStreamUiReady(boolean conversationStreamUiReady) {
if (this.conversationStreamUiReady == conversationStreamUiReady) {
return;
}
this.conversationStreamUiReady = conversationStreamUiReady;
if (!conversationStreamUiReady) {
return;
}
for (ConversationScreenControllerObserver observer : conversationScreenControllerObservers) {
observer.onConversationLoaded();
}
}
@Override
public void setPopoverLaunchedMode(DialogLaunchMode launchedFrom) {
this.launchMode = launchedFrom;
}
@Override
public void showConversationMenu(@ConversationMenuRequester int requester, IConversation conversation, View anchorView) {
for (ConversationScreenControllerObserver observer : conversationScreenControllerObservers) {
observer.onShowConversationMenu(requester, conversation, anchorView);
}
}
@Override
public DialogLaunchMode getPopoverLaunchMode() {
return launchMode;
}
@Override
public void showOtrClient(OtrClient otrClient, User user) {
for (ConversationScreenControllerObserver observer : conversationScreenControllerObservers) {
observer.onShowOtrClient(otrClient, user);
}
}
@Override
public void showCurrentOtrClient() {
for (ConversationScreenControllerObserver observer : conversationScreenControllerObservers) {
observer.onShowCurrentOtrClient();
}
}
@Override
public void hideOtrClient() {
for (ConversationScreenControllerObserver observer : conversationScreenControllerObservers) {
observer.onHideOtrClient();
}
}
@Override
public void setMessageBeingEdited(Message message) {
messageBeingEdited = message;
}
@Override
public boolean isMessageBeingEdited(Message message) {
if (messageBeingEdited == null ||
message == null) {
return false;
}
return messageBeingEdited.getId().equals(message.getId());
}
@Override
public void showLikesList(Message message) {
for (ConversationScreenControllerObserver observer : conversationScreenControllerObservers) {
observer.onShowLikesList(message);
}
}
}