org.getlantern.firetweet.util.ImageLoadingHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.getlantern.firetweet.util.ImageLoadingHandler.java

Source

/*
 *             Firetweet - Twitter client for Android
 * 
 *  Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
 * 
 *  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 org.getlantern.firetweet.util;

import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.support.v4.content.res.ResourcesCompat;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.ImageView;
import android.widget.ProgressBar;

import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener;

import org.getlantern.firetweet.R;
import org.getlantern.firetweet.model.ParcelableMedia;
import org.getlantern.firetweet.view.ForegroundImageView;

import java.util.HashMap;
import java.util.Map;

public class ImageLoadingHandler implements ImageLoadingListener, ImageLoadingProgressListener {

    private final Map<View, String> mLoadingUris = new HashMap<>();
    private final int[] mProgressBarIds;

    public ImageLoadingHandler() {
        this(R.id.media_preview_progress);
    }

    public ImageLoadingHandler(final int... progressBarIds) {
        mProgressBarIds = progressBarIds;
    }

    public String getLoadingUri(final View view) {
        return mLoadingUris.get(view);
    }

    @Override
    public void onLoadingCancelled(final String imageUri, final View view) {
        if (view == null || imageUri == null || imageUri.equals(mLoadingUris.get(view)))
            return;
        mLoadingUris.remove(view);
        if (view instanceof ForegroundImageView) {
            ((ForegroundImageView) view).setForeground(null);
        }
        final ProgressBar progress = findProgressBar(view.getParent());
        if (progress != null) {
            progress.setVisibility(View.GONE);
        }
    }

    @Override
    public void onLoadingComplete(final String imageUri, final View view, final Bitmap bitmap) {
        if (view == null)
            return;
        mLoadingUris.remove(view);
        final ViewGroup parent = (ViewGroup) view.getParent();
        if (view instanceof ForegroundImageView) {
            final Drawable foreground;
            if (isVideoItem(parent)) {
                foreground = ResourcesCompat.getDrawable(view.getResources(), R.drawable.ic_card_media_play, null);
            } else {
                foreground = null;
            }
            ((ForegroundImageView) view).setForeground(foreground);
        }
        final ProgressBar progress = findProgressBar(parent);
        if (progress != null) {
            progress.setVisibility(View.GONE);
        }
    }

    private static boolean isVideoItem(ViewGroup parent) {
        final Object tag = parent.getTag();
        if (tag instanceof ParcelableMedia) {
            return ((ParcelableMedia) tag).type == ParcelableMedia.TYPE_VIDEO;
        }
        return false;
    }

    @Override
    public void onLoadingFailed(final String imageUri, final View view, final FailReason reason) {
        if (view == null)
            return;
        if (view instanceof ForegroundImageView) {
            ((ImageView) view).setImageDrawable(null);
            final Drawable foreground = ResourcesCompat.getDrawable(view.getResources(),
                    R.drawable.image_preview_refresh, null);
            ((ForegroundImageView) view).setForeground(foreground);
        }
        mLoadingUris.remove(view);
        final ProgressBar progress = findProgressBar(view.getParent());
        if (progress != null) {
            progress.setVisibility(View.GONE);
        }
    }

    @Override
    public void onLoadingStarted(final String imageUri, final View view) {
        if (view == null || imageUri == null || imageUri.equals(mLoadingUris.get(view)))
            return;
        if (view instanceof ForegroundImageView) {
            ((ForegroundImageView) view).setForeground(null);
        }
        mLoadingUris.put(view, imageUri);
        final ProgressBar progress = findProgressBar(view.getParent());
        if (progress != null) {
            progress.setVisibility(View.VISIBLE);
            progress.setIndeterminate(true);
            progress.setMax(100);
        }
    }

    @Override
    public void onProgressUpdate(final String imageUri, final View view, final int current, final int total) {
        if (total == 0 || view == null)
            return;
        final ProgressBar progress = findProgressBar(view.getParent());
        if (progress != null) {
            progress.setIndeterminate(false);
            progress.setProgress(100 * current / total);
        }
    }

    private ProgressBar findProgressBar(final ViewParent viewParent) {
        if (mProgressBarIds == null || !(viewParent instanceof View))
            return null;
        final View parent = (View) viewParent;
        for (final int id : mProgressBarIds) {
            final View progress = parent.findViewById(id);
            if (progress instanceof ProgressBar)
                return (ProgressBar) progress;
        }
        return null;
    }
}