/**
* 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.giphy;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;
import com.waz.api.GiphyResults;
import com.waz.api.ImageAsset;
import com.waz.api.UpdateListener;
import com.waz.zclient.BaseActivity;
import com.waz.zclient.OnBackPressedListener;
import com.waz.zclient.R;
import com.waz.zclient.controllers.accentcolor.AccentColorObserver;
import com.waz.zclient.core.stores.network.NetworkStoreObserver;
import com.waz.zclient.pages.BaseFragment;
import com.waz.zclient.pages.main.profile.views.ConfirmationMenu;
import com.waz.zclient.pages.main.profile.views.ConfirmationMenuListener;
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.utils.TextViewUtils;
import com.waz.zclient.utils.TrackingUtils;
import com.waz.zclient.utils.ViewUtils;
import com.waz.zclient.views.LoadingIndicatorView;
import com.waz.zclient.views.images.ImageAssetView;
public class GiphySharingPreviewFragment extends BaseFragment<GiphySharingPreviewFragment.Container> implements AccentColorObserver,
ImageAssetView.BitmapLoadedCallback,
NetworkStoreObserver,
GiphyGridViewAdapter.ScrollGifCallback,
TextWatcher,
View.OnClickListener,
OnBackPressedListener {
public static final String TAG = GiphySharingPreviewFragment.class.getSimpleName();
public static final String ARG_SEARCH_TERM = "SEARCH_TERM";
public static final int GIPHY_SEARCH_DELAY_MIN_SEC = 800;
private String searchTerm;
private ImageAssetView previewImageAssetView;
private TextView giphyTitle;
private ConfirmationMenu confirmationMenu;
private Toolbar toolbar;
private EditText giphySearchEditText;
private ImageAsset foundImage;
private LoadingIndicatorView loadingIndicator;
private TextView errorView;
private RecyclerView recyclerView;
private GiphyGridViewAdapter giphyGridViewAdapter;
private GiphyResults giphyResults;
private Handler giphySearchHandler;
private final UpdateListener giphyResultUpdateListener = new UpdateListener() {
@Override
public void updated() {
if (giphyGridViewAdapter == null) {
return;
}
if (giphyResults == null ||
giphyResults.size() == 0) {
showError();
return;
}
errorView.setVisibility(View.GONE);
giphyGridViewAdapter.setGiphyResults(giphyResults);
}
};
private ConfirmationMenuListener confirmationMenuListener = new ConfirmationMenuListener() {
@Override
public void confirm() {
sendGif();
}
@Override
public void cancel() {
showGrid();
}
};
private Runnable giphySearchRunnable = new Runnable() {
@Override
public void run() {
updateGiphyResults();
}
};
public static GiphySharingPreviewFragment newInstance() {
GiphySharingPreviewFragment fragment = new GiphySharingPreviewFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
public static GiphySharingPreviewFragment newInstance(String searchTerm) {
GiphySharingPreviewFragment fragment = new GiphySharingPreviewFragment();
Bundle args = new Bundle();
args.putString(ARG_SEARCH_TERM, searchTerm);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
if (args == null) {
args = savedInstanceState;
}
searchTerm = args.getString(ARG_SEARCH_TERM, null);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_giphy_preview, container, false);
loadingIndicator = ViewUtils.getView(view, R.id.liv__giphy_preview__loading);
toolbar = ViewUtils.getView(view, R.id.t__giphy__toolbar);
giphySearchEditText = ViewUtils.getView(view, R.id.cet__giphy_preview__search);
previewImageAssetView = ViewUtils.getView(view, R.id.iv__giphy_preview__preview);
errorView = ViewUtils.getView(view, R.id.ttv__giphy_preview__error);
giphyTitle = ViewUtils.getView(view, R.id.ttv__giphy_preview__title);
recyclerView = ViewUtils.getView(view, R.id.rv__giphy_image_preview);
View closeButton = ViewUtils.getView(view, R.id.gtv__giphy_preview__close_button);
confirmationMenu = ViewUtils.getView(view, R.id.cm__giphy_preview__confirmation_menu);
giphySearchHandler = new Handler();
loadingIndicator.setType(LoadingIndicatorView.INFINITE_LOADING_BAR);
giphySearchEditText.addTextChangedListener(this);
giphySearchEditText.setText(searchTerm);
giphyGridViewAdapter = new GiphyGridViewAdapter(getActivity());
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
recyclerView.setAdapter(giphyGridViewAdapter);
closeButton.setOnClickListener(this);
confirmationMenu.setConfirmationMenuListener(confirmationMenuListener);
confirmationMenu.setConfirm(getString(R.string.sharing__image_preview__confirm_action));
confirmationMenu.setCancel(getString(R.string.confirmation_menu__cancel));
confirmationMenu.setWireTheme(getControllerFactory().getThemeController().getThemeDependentOptionsTheme());
errorView.setVisibility(View.GONE);
previewImageAssetView.setVisibility(View.GONE);
confirmationMenu.setVisibility(View.GONE);
recyclerView.setVisibility(View.VISIBLE);
giphyTitle.setVisibility(View.GONE);
if (ThemeUtils.isDarkTheme(getContext())) {
toolbar.setNavigationIcon(R.drawable.ic_action_search_light);
} else {
toolbar.setNavigationIcon(R.drawable.ic_action_search_dark);
}
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (giphySearchEditText.getVisibility() == View.VISIBLE) {
return;
}
showGrid();
}
});
updateGiphyResults();
return view;
}
@Override
public void onStart() {
super.onStart();
KeyboardUtils.hideKeyboard(getActivity());
giphyGridViewAdapter.setScrollGifCallback(this);
getControllerFactory().getAccentColorController().addAccentColorObserver(this);
getStoreFactory().getNetworkStore().addNetworkStoreObserver(this);
giphyTitle.setText(getStoreFactory().getConversationStore().getCurrentConversation().getName());
}
@Override
public void onResume() {
super.onResume();
if (giphySearchEditText.getVisibility() == View.VISIBLE) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
giphySearchEditText.requestFocus();
giphySearchEditText.setSelection(giphySearchEditText.getText().length());
if (TextUtils.isEmpty(searchTerm)) {
KeyboardUtils.showKeyboard(getActivity());
}
}
}, getResources().getInteger(R.integer.people_picker__keyboard__show_delay));
}
}
@Override
public void onStop() {
getControllerFactory().getAccentColorController().removeAccentColorObserver(this);
getStoreFactory().getNetworkStore().removeNetworkStoreObserver(this);
giphyGridViewAdapter.setScrollGifCallback(null);
if (giphyResults != null) {
giphyResults.removeUpdateListener(giphyResultUpdateListener);
}
KeyboardUtils.hideKeyboard(getActivity());
super.onStop();
}
@Override
public void onAccentColorHasChanged(Object sender, int color) {
confirmationMenu.setAccentColor(color);
if (!getControllerFactory().getThemeController().isDarkTheme()) {
confirmationMenu.setCancelColor(color, color);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
//noinspection deprecation
confirmationMenu.setConfirmColor(getResources().getColor(R.color.white), color);
} else {
confirmationMenu.setConfirmColor(getResources().getColor(R.color.white, getContext().getTheme()), color);
}
}
loadingIndicator.setColor(color);
}
@Override
public void onDestroyView() {
previewImageAssetView.clearImage();
previewImageAssetView = null;
giphyTitle = null;
confirmationMenu = null;
foundImage = null;
recyclerView = null;
giphyGridViewAdapter = null;
giphyResults = null;
giphySearchHandler.removeCallbacks(giphySearchRunnable);
super.onDestroyView();
}
@Override
public void onConnectivityChange(boolean hasInternet, boolean isServerError) {
if (!hasInternet) {
onLossOfNetworkConnection();
return;
}
onResumedNetworkConnection();
}
@Override
public void onNoInternetConnection(boolean isServerError) {
}
@Override
public void onBitmapLoadFinished(boolean bitmapLoaded) {
confirmationMenu.setConfirmEnabled(true);
loadingIndicator.hide();
previewImageAssetView.setBitmapLoadedCallback(null);
}
@Override
public void setSelectedGifFromGridView(ImageAsset gifAsset) {
foundImage = gifAsset;
confirmationMenu.setConfirmEnabled(false);
previewImageAssetView.setBitmapLoadedCallback(this);
previewImageAssetView.setImageAsset(gifAsset);
loadingIndicator.show();
KeyboardUtils.closeKeyboardIfShown(getActivity());
if (ThemeUtils.isDarkTheme(getContext())) {
toolbar.setNavigationIcon(R.drawable.action_back_light);
} else {
toolbar.setNavigationIcon(R.drawable.action_back_dark);
}
ViewUtils.fadeInView(previewImageAssetView);
ViewUtils.fadeInView(confirmationMenu);
ViewUtils.fadeInView(giphyTitle);
ViewUtils.fadeOutView(recyclerView);
ViewUtils.fadeOutView(giphySearchEditText);
ViewUtils.fadeOutView(errorView);
}
@Override
public boolean onBackPressed() {
if (previewImageAssetView.getVisibility() == View.VISIBLE) {
showGrid();
return true;
}
return false;
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.gtv__giphy_preview__close_button:
getControllerFactory().getGiphyController().cancel();
break;
}
}
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
searchTerm = giphySearchEditText.getText().toString();
giphySearchHandler.removeCallbacks(giphySearchRunnable);
giphySearchHandler.postDelayed(giphySearchRunnable, GIPHY_SEARCH_DELAY_MIN_SEC);
}
@Override
public void afterTextChanged(Editable editable) {
}
private void updateGiphyResults() {
errorView.setVisibility(View.GONE);
previewImageAssetView.clearImage();
loadingIndicator.show();
if (TextUtils.isEmpty(searchTerm) || searchTerm == null) {
giphyResults = getStoreFactory().getZMessagingApiStore()
.getApi()
.getGiphy()
.trending();
} else {
giphyResults = getStoreFactory().getZMessagingApiStore()
.getApi()
.getGiphy()
.search(searchTerm);
}
giphyResults.whenReady(new Runnable() {
@Override
public void run() {
loadingIndicator.hide();
giphyResultUpdateListener.updated();
}
});
giphyResults.addUpdateListener(giphyResultUpdateListener);
giphyGridViewAdapter.setGiphyResults(giphyResults);
}
private void showError() {
loadingIndicator.hide();
previewImageAssetView.clearImage();
errorView.setText(R.string.giphy_preview__error);
TextViewUtils.mediumText(errorView);
errorView.setVisibility(View.VISIBLE);
}
private void showGrid() {
foundImage = null;
previewImageAssetView.clearImage();
if (ThemeUtils.isDarkTheme(getContext())) {
toolbar.setNavigationIcon(R.drawable.ic_action_search_light);
} else {
toolbar.setNavigationIcon(R.drawable.ic_action_search_dark);
}
ViewUtils.fadeOutView(previewImageAssetView);
ViewUtils.fadeOutView(confirmationMenu);
ViewUtils.fadeOutView(giphyTitle);
ViewUtils.fadeInView(recyclerView);
ViewUtils.fadeInView(giphySearchEditText);
giphySearchEditText.requestFocus();
}
private void sendGif() {
TrackingUtils.onSentGifMessage(((BaseActivity) getActivity()).injectJava(GlobalTrackingController.class),
getStoreFactory().getConversationStore().getCurrentConversation());
if (TextUtils.isEmpty(searchTerm) || searchTerm == null) {
getStoreFactory().getConversationStore().sendMessage(getString(R.string.giphy_preview__message_via_random_trending));
} else {
getStoreFactory().getConversationStore().sendMessage(getString(R.string.giphy_preview__message_via_search,
searchTerm));
}
getStoreFactory().getNetworkStore().doIfHasInternetOrNotifyUser(null);
getStoreFactory().getConversationStore().sendMessage(foundImage);
getControllerFactory().getGiphyController().close();
}
private void onLossOfNetworkConnection() {
confirmationMenu.setConfirmationMenuListener(null);
previewImageAssetView.setClickable(false);
}
private void onResumedNetworkConnection() {
confirmationMenu.setConfirmationMenuListener(confirmationMenuListener);
previewImageAssetView.setClickable(true);
}
public interface Container { }
}