/*
* Copyright (C) 2014 Freddie (Musenkishi) Lust-Hed
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.musenkishi.wally.base;
import android.content.Intent;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v7.widget.GridLayoutManager;
import android.text.method.LinkMovementMethod;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.TextView;
import com.musenkishi.wally.R;
import com.musenkishi.wally.adapters.RecyclerImagesAdapter;
import com.musenkishi.wally.dataprovider.models.DataProviderError;
import com.musenkishi.wally.util.TextLinkBuilder;
import com.musenkishi.wally.views.AutoGridView;
/**
* A base class where common logic for gridview based fragments is placed.
* Created by Freddie (Musenkishi) Lust-Hed on 2014-10-07.
*/
public abstract class GridFragment extends BaseFragment {
public static final short REQUEST_CODE = 25380;
private ViewGroup errorLayout;
protected AutoGridView gridView;
protected View progressBar;
protected RecyclerImagesAdapter imagesAdapter;
protected int itemSize;
protected String query;
private GridLayoutManager gridLayoutManager;
/**
* Call this to setup basic views like the gridview.
* @param rootView
*/
protected void onCreateView(@NonNull View rootView) {
errorLayout = (ViewGroup) rootView.findViewById(R.id.error_layout);
gridView = (AutoGridView) rootView.findViewById(R.id.listview);
gridLayoutManager = new GridLayoutManager(rootView.getContext(), 2);
gridView.setLayoutManager(gridLayoutManager);
gridView.getItemAnimator().setSupportsChangeAnimations(true);
progressBar = rootView.findViewById(R.id.loader);
if (progressBar != null) {
progressBar.setAlpha(0.0f);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && imagesAdapter != null) {
gridView.post(new Runnable() {
@Override
public void run() {
imagesAdapter.notifyDataSetChanged();
}
});
}
}
protected void showLoader() {
progressBar.animate().alpha(1.0f).setDuration(300).start();
}
protected void hideLoader() {
progressBar.animate().alpha(0.0f).setDuration(300).start();
}
protected void setupAutoSizeGridView() {
final ViewTreeObserver viewTreeObserver = gridView.getViewTreeObserver();
if (viewTreeObserver != null) {
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
int lastWidth = -1;
@Override
public void onGlobalLayout() {
int width = gridView.getWidth() - gridView.getPaddingLeft() - gridView.getPaddingRight();
if (width == lastWidth || width <= 0) {
return;
}
// Compute number of columns
int maxItemWidth = gridView.getDefaultCellWidth();
int numColumns = 1;
while (true) {
if (width / numColumns > maxItemWidth) {
++numColumns;
} else {
break;
}
}
itemSize = width / numColumns;
if (imagesAdapter != null) {
imagesAdapter.setItemSize(itemSize);
}
gridLayoutManager.setSpanCount(numColumns);
}
});
}
}
protected abstract void getImages(int index, String query);
protected void showErrorMessage(DataProviderError dataProviderError, int index) {
if (dataProviderError.getType().equals(DataProviderError.Type.LOCAL) && dataProviderError.getHttpStatusCode() == 204){
//TODO Even if we don't show an error, it's still requesting images... find a way to stop it.
if (index == 1){
//No images was found with current filter and search settings
}
} else if (errorLayout != null) {
int numberOfRetries = (errorLayout.getTag() instanceof Integer) ?
(Integer) errorLayout.getTag()
: 1;
hideLoader();
gridView.setVisibility(View.GONE);
TextView message = (TextView) errorLayout.findViewById(R.id.error_backend_textview_message);
TextView status = (TextView) errorLayout.findViewById(R.id.error_backend_textview_status);
TextView checkBackend = (TextView) errorLayout.findViewById(R.id.error_backend_textview_check_backend);
if (numberOfRetries >= 3) {
TextLinkBuilder backendTextLinkBuilder = new TextLinkBuilder(
errorLayout.getContext(),
R.string.error_backend_check_backend,
R.string.error_backend_check_backend
);
backendTextLinkBuilder.color(getResources().getColor(R.color.Material_Blue_500));
backendTextLinkBuilder.onClick(new TextLinkBuilder.OnTextClickedListener() {
@Override
public void onClick(View textView) {
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://alpha.wallhaven.cc"));
startActivity(browserIntent);
}
});
checkBackend.setMovementMethod(LinkMovementMethod.getInstance());
checkBackend.setText(backendTextLinkBuilder.build());
checkBackend.setVisibility(View.VISIBLE);
} else {
checkBackend.setVisibility(View.GONE);
}
TextLinkBuilder textLinkBuilder = new TextLinkBuilder(errorLayout.getContext(), R.string.error_backend_message_text, R.string.error_backend_message_text_link);
textLinkBuilder.color(getResources().getColor(R.color.Material_Blue_500));
message.setTag(index);
textLinkBuilder.onClick(new TextLinkBuilder.OnTextClickedListener() {
@Override
public void onClick(View textView) {
int index = (Integer) textView.getTag();
errorLayout.setVisibility(View.GONE);
gridView.setVisibility(View.VISIBLE);
showLoader();
getImages(index, query);
int numberOfRetries = (errorLayout.getTag() instanceof Integer) ?
(Integer) errorLayout.getTag()
: 1;
numberOfRetries++;
errorLayout.setTag(numberOfRetries);
}
});
message.setMovementMethod(LinkMovementMethod.getInstance());
message.setText(textLinkBuilder.build());
if (dataProviderError != null) {
status.setText(dataProviderError.getHttpStatusCode() + " " + dataProviderError.getMessage());
} else {
status.setVisibility(View.GONE);
}
errorLayout.setVisibility(View.VISIBLE);
}
}
}