/*
* Copyright (C) 2015 Jorge Ruesga
*
* 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.ruesga.android.wallpapers.photophase.adapters;
import android.animation.Animator;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ArrayAdapter;
import com.ruesga.android.wallpapers.photophase.R;
import com.ruesga.android.wallpapers.photophase.model.Album;
import com.ruesga.android.wallpapers.photophase.widgets.AlbumInfoView;
import java.util.ArrayList;
import java.util.List;
/**
* An implementation of {@link ArrayAdapter} supporting "Google Now Card Layout" like layout
*/
public class AlbumCardUiAdapter extends ArrayAdapter<Album> {
/**
* A class that conforms with the ViewHolder pattern to performance
* the list view rendering.
*/
private static class ViewHolder {
public ViewHolder() {
super();
}
AlbumInfoView mAlbumInfoView;
Animation mCardAnimation;
Animator mCardAnimator;
}
private List<Album> mData = new ArrayList<>();
private final AlbumInfoView.CallbacksListener mAlbumInfoCallback;
private final AlbumInfoView.CastProxy mCastProxy;
/**
* Constructor of <code>AlbumCardUiAdapter</code>.
*
* @param context The current context
* @param data The array with all the album data
* @param castProxy A helper class to deal con cast status information
* @param callback The album info view callback
*/
public AlbumCardUiAdapter(Context context, List<Album> data, AlbumInfoView.CastProxy castProxy,
AlbumInfoView.CallbacksListener callback) {
super(context, R.layout.album_info, R.id.album_name, data);
mData = data;
mAlbumInfoCallback = callback;
mCastProxy = castProxy;
}
/**
* {@inheritDoc}
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Retrieve album
final Album album = this.mData.get(position);
// Check to reuse view
View v = convertView;
if (v == null) {
//Create the view holder
LayoutInflater li =
(LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.album_info, parent, false);
// Create the controller for the view
ViewHolder viewHolder = new ViewHolder();
viewHolder.mAlbumInfoView = (AlbumInfoView)v.findViewById(R.id.album_info);
viewHolder.mAlbumInfoView.setAlbum(album);
viewHolder.mAlbumInfoView.addCallBackListener(mAlbumInfoCallback);
viewHolder.mAlbumInfoView.setCastProxy(mCastProxy);
v.setTag(viewHolder);
}
// Retrieve the view holder
ViewHolder viewHolder = (ViewHolder)v.getTag();
// Retrieve the view holder and update the view
viewHolder.mAlbumInfoView.updateView(album);
// Animate the view?
if (!album.isDisplayed()) {
album.setDisplayed(true);
// Reset the animation
if (viewHolder.mCardAnimation != null) {
viewHolder.mCardAnimation.cancel();
}
if (viewHolder.mCardAnimator != null) {
viewHolder.mCardAnimator.cancel();
}
// Card Animation
viewHolder.mCardAnimation = AnimationUtils.loadAnimation(
getContext(), R.anim.cards_slide_up);
viewHolder.mCardAnimation.setStartOffset(Math.min(250, position * 30));
v.startAnimation(viewHolder.mCardAnimation);
}
// Return the view
return v;
}
}