package com.kenny.openimgur.fragments;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ProgressBar;
import com.kenny.openimgur.R;
import com.kenny.openimgur.activities.ProfileActivity;
import com.kenny.openimgur.activities.ViewActivity;
import com.kenny.openimgur.api.ApiClient;
import com.kenny.openimgur.api.responses.TrophyResponse;
import com.kenny.openimgur.classes.CustomLinkMovement;
import com.kenny.openimgur.classes.ImgurListener;
import com.kenny.openimgur.classes.ImgurTrophy;
import com.kenny.openimgur.classes.ImgurUser;
import com.kenny.openimgur.ui.VideoView;
import com.kenny.openimgur.ui.adapters.ProfileInfoAdapter;
import com.kenny.openimgur.util.LinkUtils;
import com.kenny.openimgur.util.LogUtil;
import com.kennyc.view.MultiStateView;
import java.util.List;
import butterknife.BindView;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* Created by kcampagna on 12/14/14.
*/
public class ProfileInfoFragment extends BaseFragment implements ImgurListener {
private static final String KEY_TROPHIES = "trophies";
private static final String KEY_USER = "user";
@BindView(R.id.list)
RecyclerView mList;
@BindView(R.id.container)
MultiStateView mMultiStateView;
ProfileInfoAdapter mAdapter;
ImgurUser mSelectedUser;
public static ProfileInfoFragment createInstance(@NonNull ImgurUser user) {
ProfileInfoFragment fragment = new ProfileInfoFragment();
Bundle args = new Bundle(1);
args.putParcelable(KEY_USER, user);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_profile_info, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
List<ImgurTrophy> trophies = null;
if (savedInstanceState != null) {
mSelectedUser = savedInstanceState.getParcelable(KEY_USER);
trophies = savedInstanceState.getParcelableArrayList(KEY_TROPHIES);
}
if (mSelectedUser == null) {
Bundle bundle = getArguments();
if (bundle == null || !bundle.containsKey(KEY_USER)) {
throw new IllegalArgumentException("Bundle can not be null and must contain a user");
} else {
mSelectedUser = bundle.getParcelable(KEY_USER);
}
}
mList.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
if (trophies != null && !trophies.isEmpty()) {
mAdapter = new ProfileInfoAdapter(getActivity(), trophies, mSelectedUser, this);
mList.setAdapter(mAdapter);
mMultiStateView.setViewState(MultiStateView.VIEW_STATE_CONTENT);
} else {
fetchTrophies();
}
}
@Override
public void onResume() {
super.onResume();
CustomLinkMovement.getInstance().addListener(this);
}
@Override
public void onPause() {
CustomLinkMovement.getInstance().removeListener(this);
super.onPause();
}
@Override
public void onDestroyView() {
if (mAdapter != null) mAdapter.onDestroy();
super.onDestroyView();
}
@Override
public void onPhotoTap(View view) {
// Adjust for header
int adapterPosition = mList.getChildAdapterPosition(view) - 1;
if (adapterPosition != RecyclerView.NO_POSITION) {
ImgurTrophy trophy = mAdapter.getItem(adapterPosition);
String dataLink = trophy.getDataLink();
String id = LinkUtils.getGalleryId(trophy.getDataLink());
if (!TextUtils.isEmpty(id)) {
startActivity(ViewActivity.createGalleryIntent(getActivity(), id));
} else if (!TextUtils.isEmpty(dataLink)) {
onLinkTap(null, dataLink);
}
}
}
@Override
public void onPlayTap(ProgressBar prog, FloatingActionButton play, ImageView image, VideoView video, final View view) {
// NOOP
}
@Override
public void onLinkTap(View view, @Nullable String url) {
if (!TextUtils.isEmpty(url) && isAdded()) {
LinkUtils.LinkMatch match = LinkUtils.findImgurLinkMatch(url);
switch (match) {
case GALLERY:
String id = LinkUtils.getGalleryId(url);
if (!TextUtils.isEmpty(id)) {
startActivity(ViewActivity.createGalleryIntent(getActivity(), id));
}
break;
case ALBUM:
String albumId = LinkUtils.getAlbumId(url);
Intent intent = ViewActivity.createAlbumIntent(getActivity(), albumId);
startActivity(intent);
break;
case IMAGE_URL_QUERY:
int index = url.indexOf("?");
url = url.substring(0, index);
// Intentional fallthrough
case IMAGE_URL:
boolean isDirectLink = LinkUtils.isDirectImageLink(url);
if (!isDirectLink) {
url = LinkUtils.getId(url);
}
getFragmentManager().beginTransaction().add(PopupImageDialogFragment.getInstance(url, LinkUtils.isLinkAnimated(url), isDirectLink, false), "popup").commitAllowingStateLoss();
break;
case DIRECT_LINK:
boolean isAnimated = LinkUtils.isLinkAnimated(url);
boolean isVideo = LinkUtils.isVideoLink(url);
PopupImageDialogFragment.getInstance(url, isAnimated, true, isVideo)
.show(getFragmentManager(), "popup");
break;
case IMAGE:
String[] split = url.split("\\/");
PopupImageDialogFragment.getInstance(split[split.length - 1], false, false, false)
.show(getFragmentManager(), "popup");
break;
case USER_CALLOUT:
startActivity(ProfileActivity.createIntent(getActivity(), url.replace("@", "")));
break;
case USER:
String username = LinkUtils.getUsername(url);
if (!TextUtils.isEmpty(username)) {
startActivity(ProfileActivity.createIntent(getActivity(), username));
}
break;
case TOPIC:
String topicId = LinkUtils.getTopicGalleryId(url);
startActivity(ViewActivity.createGalleryIntent(getActivity(), topicId));
break;
case NONE:
default:
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
if (browserIntent.resolveActivity(getActivity().getPackageManager()) != null) {
startActivity(browserIntent);
} else {
Snackbar.make(mMultiStateView, R.string.cant_launch_intent, Snackbar.LENGTH_LONG).show();
}
break;
}
}
}
@Override
public void onViewRepliesTap(View view) {
// NOOP
}
@Override
public void onPhotoLongTapListener(View view) {
// NOOP
}
private void fetchTrophies() {
ApiClient.getService().getProfileTrophies(mSelectedUser.getUsername()).enqueue(new Callback<TrophyResponse>() {
@Override
public void onResponse(Call<TrophyResponse> call, Response<TrophyResponse> response) {
if (!isAdded()) return;
if (response.body() != null && response.body().data != null) {
mAdapter = new ProfileInfoAdapter(getActivity(), response.body().data.trophies, mSelectedUser, ProfileInfoFragment.this);
} else {
mAdapter = new ProfileInfoAdapter(getActivity(), null, mSelectedUser, ProfileInfoFragment.this);
}
mList.setAdapter(mAdapter);
mMultiStateView.setViewState(MultiStateView.VIEW_STATE_CONTENT);
}
@Override
public void onFailure(Call<TrophyResponse> call, Throwable t) {
if (!isAdded()) return;
mAdapter = new ProfileInfoAdapter(getActivity(), null, mSelectedUser, ProfileInfoFragment.this);
mList.setAdapter(mAdapter);
mMultiStateView.setViewState(MultiStateView.VIEW_STATE_CONTENT);
}
});
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mAdapter != null && !mAdapter.isEmpty()) {
try {
outState.putParcelableArrayList(KEY_TROPHIES, mAdapter.retainItems());
} catch (NullPointerException npe) {
// This shouldn't be crashing, but for some reason is, need to figure out why
LogUtil.e(TAG, "NPE while saving state", npe);
}
}
outState.putParcelable(KEY_USER, mSelectedUser);
}
}