/**
* 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.connect;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.widget.TextView;
import com.waz.api.IConversation;
import com.waz.api.User;
import com.waz.zclient.BaseActivity;
import com.waz.zclient.R;
import com.waz.zclient.controllers.accentcolor.AccentColorObserver;
import com.waz.zclient.core.stores.connect.ConnectStoreObserver;
import com.waz.zclient.core.stores.connect.IConnectStore;
import com.waz.zclient.pages.BaseFragment;
import com.waz.zclient.pages.main.participants.ProfileAnimation;
import com.waz.zclient.pages.main.participants.ProfileSourceAnimation;
import com.waz.zclient.pages.main.participants.ProfileTabletAnimation;
import com.waz.zclient.pages.main.participants.dialog.DialogLaunchMode;
import com.waz.zclient.tracking.GlobalTrackingController;
import com.waz.zclient.ui.theme.ThemeUtils;
import com.waz.zclient.ui.utils.KeyboardUtils;
import com.waz.zclient.ui.views.UserDetailsView;
import com.waz.zclient.ui.views.ZetaButton;
import com.waz.zclient.utils.LayoutSpec;
import com.waz.zclient.utils.TrackingUtils;
import com.waz.zclient.utils.ViewUtils;
import com.waz.zclient.views.images.ImageAssetImageView;
import com.waz.zclient.views.menus.FooterMenu;
import com.waz.zclient.views.menus.FooterMenuCallback;
public class SendConnectRequestFragment extends BaseFragment<SendConnectRequestFragment.Container> implements UserProfile,
ConnectStoreObserver,
AccentColorObserver {
public static final String TAG = SendConnectRequestFragment.class.getName();
public static final String ARGUMENT_USER_ID = "ARGUMENT_USER_ID";
public static final String ARGUMENT_USER_REQUESTER = "ARGUMENT_USER_REQUESTER";
private String userId;
private IConnectStore.UserRequester userRequester;
// Flag true if layout has been set
private boolean isBelowUserProfile;
private TextView displayNameTextView;
private UserDetailsView userDetailsView;
private ZetaButton connectButton;
private FooterMenu footerMenu;
private ImageAssetImageView imageAssetImageViewProfile;
public static SendConnectRequestFragment newInstance(String userId, IConnectStore.UserRequester userRequester) {
SendConnectRequestFragment newFragment = new SendConnectRequestFragment();
Bundle args = new Bundle();
args.putString(ARGUMENT_USER_ID, userId);
args.putString(ARGUMENT_USER_REQUESTER, userRequester.toString());
newFragment.setArguments(args);
return newFragment;
}
//////////////////////////////////////////////////////////////////////////////////////////
//
// Lifecycle
//
//////////////////////////////////////////////////////////////////////////////////////////
@Override
public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
Animation animation = super.onCreateAnimation(transit, enter, nextAnim);
if (getControllerFactory().getConversationScreenController().getPopoverLaunchMode() != DialogLaunchMode.AVATAR &&
getControllerFactory().getConversationScreenController().getPopoverLaunchMode() != DialogLaunchMode.COMMON_USER) {
int centerX = ViewUtils.getOrientationIndependentDisplayWidth(getActivity()) / 2;
int centerY = ViewUtils.getOrientationIndependentDisplayHeight(getActivity()) / 2;
int duration;
int delay = 0;
if (isBelowUserProfile) {
if (LayoutSpec.isTablet(getActivity())) {
animation = new ProfileTabletAnimation(enter,
getResources().getInteger(R.integer.framework_animation_duration_long),
-getResources().getDimensionPixelSize(R.dimen.participant_dialog__initial_width));
} else {
if (enter) {
isBelowUserProfile = false;
duration = getResources().getInteger(R.integer.reopen_profile_source__animation_duration);
delay = getResources().getInteger(R.integer.reopen_profile_source__delay);
} else {
duration = getResources().getInteger(R.integer.reopen_profile_source__animation_duration);
}
animation = new ProfileSourceAnimation(enter, duration, delay, centerX, centerY);
}
} else if (nextAnim != 0) {
if (LayoutSpec.isTablet(getActivity())) {
animation = new ProfileTabletAnimation(enter,
getResources().getInteger(R.integer.framework_animation_duration_long),
getResources().getDimensionPixelSize(R.dimen.participant_dialog__initial_width));
} else {
if (enter) {
duration = getResources().getInteger(R.integer.open_profile__animation_duration);
delay = getResources().getInteger(R.integer.open_profile__delay);
} else {
duration = getResources().getInteger(R.integer.close_profile__animation_duration);
}
animation = new ProfileAnimation(enter, duration, delay, centerX, centerY);
}
}
}
return animation;
}
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup viewContainer, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_send_connect_request, viewContainer, false);
if (savedInstanceState == null) {
userId = getArguments().getString(ARGUMENT_USER_ID);
userRequester = IConnectStore.UserRequester.valueOf(getArguments().getString(ARGUMENT_USER_REQUESTER));
} else {
userId = savedInstanceState.getString(ARGUMENT_USER_ID);
userRequester = IConnectStore.UserRequester.valueOf(savedInstanceState.getString(ARGUMENT_USER_REQUESTER));
}
Toolbar toolbar = ViewUtils.getView(rootView, R.id.t__send_connect__toolbar);
displayNameTextView = ViewUtils.getView(rootView, R.id.tv__send_connect__toolbar__title);
userDetailsView = ViewUtils.getView(rootView, R.id.udv__send_connect__user_details);
connectButton = ViewUtils.getView(rootView, R.id.zb__send_connect_request__connect_button);
footerMenu = ViewUtils.getView(rootView, R.id.fm__footer);
imageAssetImageViewProfile = ViewUtils.getView(rootView, R.id.iaiv__send_connect);
imageAssetImageViewProfile.setDisplayType(ImageAssetImageView.DisplayType.CIRCLE);
imageAssetImageViewProfile.setSaturation(0);
View backgroundContainer = ViewUtils.getView(rootView, R.id.fl__send_connect_request__background_container);
backgroundContainer.setClickable(true);
if (userRequester == IConnectStore.UserRequester.PARTICIPANTS &&
getControllerFactory().getConversationScreenController().getPopoverLaunchMode() != DialogLaunchMode.AVATAR &&
getControllerFactory().getConversationScreenController().getPopoverLaunchMode() != DialogLaunchMode.COMMON_USER) {
backgroundContainer.setBackgroundColor(Color.TRANSPARENT);
}
connectButton.setText(getResources().getString(R.string.send_connect_request__connect_button__text));
if (ThemeUtils.isDarkTheme(getContext())) {
toolbar.setNavigationIcon(R.drawable.action_back_light);
} else {
toolbar.setNavigationIcon(R.drawable.action_back_dark);
}
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getContainer().dismissUserProfile();
}
});
footerMenu.setVisibility(View.GONE);
return rootView;
}
@Override
public void onStart() {
super.onStart();
getControllerFactory().getAccentColorController().addAccentColorObserver(this);
getStoreFactory().getConnectStore().addConnectRequestObserver(this);
getStoreFactory().getConnectStore().loadUser(userId, userRequester);
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString(ARGUMENT_USER_ID, userId);
if (userRequester != null) {
outState.putString(ARGUMENT_USER_REQUESTER, userRequester.toString());
}
super.onSaveInstanceState(outState);
}
@Override
public void onStop() {
KeyboardUtils.hideKeyboard(getActivity());
getStoreFactory().getConnectStore().removeConnectRequestObserver(this);
getControllerFactory().getAccentColorController().removeAccentColorObserver(this);
super.onStop();
}
@Override
public void onDestroyView() {
userDetailsView.recycle();
imageAssetImageViewProfile = null;
super.onDestroyView();
}
private void trackSendConnectRequest(User user) {
TrackingUtils.tagSentConnectRequestFromUserProfileEvent(((BaseActivity) getActivity()).injectJava(GlobalTrackingController.class),
userRequester,
user.getCommonConnectionsCount());
}
//////////////////////////////////////////////////////////////////////////////////////////
//
// UserProfile
//
//////////////////////////////////////////////////////////////////////////////////////////
@Override
public void isBelowUserProfile(boolean isBelow) {
isBelowUserProfile = isBelow;
}
//////////////////////////////////////////////////////////////////////////////////////////
//
// IConnectStoreObserver
//
//////////////////////////////////////////////////////////////////////////////////////////
@Override
public void onConnectUserUpdated(final User user, final IConnectStore.UserRequester userRequester) {
if (this.userRequester != userRequester) {
return;
}
imageAssetImageViewProfile.connectImageAsset(user.getPicture());
displayNameTextView.setText(user.getName());
userDetailsView.setUser(user);
connectButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (user == null ||
getStoreFactory() == null ||
getStoreFactory().isTornDown()) {
return;
}
User me = getStoreFactory().getProfileStore().getSelfUser();
String myName = me != null ? me.getName() : "";
String otherName = user.getName();
String message = getString(R.string.connect__message, otherName, myName);
IConversation conversation = getStoreFactory().getConnectStore().connectToNewUser(user, message);
trackSendConnectRequest(user);
if (conversation != null) {
KeyboardUtils.hideKeyboard(getActivity());
getContainer().onConnectRequestWasSentToUser();
}
}
});
if (userRequester == IConnectStore.UserRequester.PARTICIPANTS) {
footerMenu.setRightActionText(getString(R.string.glyph__minus));
}
footerMenu.setCallback(new FooterMenuCallback() {
@Override
public void onLeftActionClicked() {
showConnectButtonInsteadOfFooterMenu();
}
@Override
public void onRightActionClicked() {
if (userRequester == IConnectStore.UserRequester.PARTICIPANTS) {
getContainer().showRemoveConfirmation(user);
}
}
});
if (userRequester == IConnectStore.UserRequester.PARTICIPANTS) {
footerMenu.setVisibility(View.VISIBLE);
connectButton.setVisibility(View.GONE);
} else {
footerMenu.setVisibility(View.GONE);
connectButton.setVisibility(View.VISIBLE);
}
}
@Override
public void onInviteRequestSent(IConversation conversation) {
}
//////////////////////////////////////////////////////////////////////////////////////////
//
// AccentColorObserver
//
//////////////////////////////////////////////////////////////////////////////////////////
@Override
public void onAccentColorHasChanged(Object sender, int color) {
connectButton.setAccentColor(color);
}
private void showConnectButtonInsteadOfFooterMenu() {
if (connectButton.getVisibility() == View.VISIBLE) {
return;
}
footerMenu.setVisibility(View.GONE);
connectButton.setAlpha(0);
connectButton.setVisibility(View.VISIBLE);
ViewUtils.fadeInView(connectButton,
getResources().getInteger(R.integer.framework_animation_duration_long));
}
public interface Container extends UserProfileContainer {
void onConnectRequestWasSentToUser();
void showRemoveConfirmation(User user);
}
}