com.quarterfull.newsAndroid.services.DownloadImagesService.java Source code

Java tutorial

Introduction

Here is the source code for com.quarterfull.newsAndroid.services.DownloadImagesService.java

Source

/**
* Android ownCloud News
*
* @author David Luhmer
* @copyright 2013 David Luhmer david-dev@live.de
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library 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 AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library.  If not, see <http://www.gnu.org/licenses/>.
*
*/

package com.quarterfull.newsAndroid.services;

import android.app.IntentService;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.support.v4.app.NotificationCompat;
import android.widget.Toast;

import com.nostra13.universalimageloader.core.ImageLoader;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;

import de.greenrobot.dao.query.LazyList;
import com.quarterfull.newsAndroid.NewsReaderListActivity;
import com.quarterfull.newsAndroid.R;
import com.quarterfull.newsAndroid.async_tasks.GetImageThreaded;
import com.quarterfull.newsAndroid.database.DatabaseConnectionOrm;
import com.quarterfull.newsAndroid.database.model.Feed;
import com.quarterfull.newsAndroid.database.model.RssItem;
import com.quarterfull.newsAndroid.helper.FavIconHandler;
import com.quarterfull.newsAndroid.helper.ImageDownloadFinished;
import com.quarterfull.newsAndroid.helper.ImageHandler;

public class DownloadImagesService extends IntentService {

    public static final String LAST_ITEM_ID = "LAST_ITEM_ID";

    public enum DownloadMode {
        FAVICONS_ONLY, PICTURES_ONLY, FAVICONS_AND_PICTURES
    }

    public static final String DOWNLOAD_MODE_STRING = "DOWNLOAD_MODE";
    private static Random random;

    private int NOTIFICATION_ID = 1;
    private NotificationManager notificationManager;
    private NotificationCompat.Builder mNotificationDownloadImages;

    private int maxCount;
    //private int total_size = 0;

    List<String> linksToImages = new LinkedList<>();

    public DownloadImagesService() {
        super(null);
    }

    public DownloadImagesService(String name) {
        super(name);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        try {
            maxCount = 0;
            if (random == null)
                random = new Random();
            NOTIFICATION_ID = random.nextInt();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    @Override
    public void onDestroy() {
        if (mNotificationDownloadImages != null) {
            if (maxCount == 0)
                notificationManager.cancel(NOTIFICATION_ID);
        }
        super.onDestroy();
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        DownloadMode downloadMode = (DownloadMode) intent.getSerializableExtra(DOWNLOAD_MODE_STRING);

        DatabaseConnectionOrm dbConn = new DatabaseConnectionOrm(this);
        Notification notify = BuildNotification();

        if (downloadMode.equals(DownloadMode.FAVICONS_ONLY)) {
            List<Feed> feedList = dbConn.getListOfFeeds();
            FavIconHandler favIconHandler = new FavIconHandler(this);
            for (Feed feed : feedList) {
                favIconHandler.PreCacheFavIcon(feed);
            }
        } else if (downloadMode.equals(DownloadMode.FAVICONS_AND_PICTURES)
                || downloadMode.equals(DownloadMode.PICTURES_ONLY)) {
            long lastId = intent.getLongExtra(LAST_ITEM_ID, 0);
            List<RssItem> rssItemList = dbConn.getAllItemsWithIdHigher(lastId);
            List<String> links = new ArrayList<>();
            for (RssItem rssItem : rssItemList) {
                String body = rssItem.getBody();
                links.addAll(ImageHandler.getImageLinksFromText(body));

                if (links.size() > 10000) {
                    notificationManager.notify(123, GetNotificationLimitImagesReached(10000));
                    break;
                }
            }
            ((LazyList) rssItemList).close();

            maxCount = links.size();

            if (maxCount > 0) {
                notificationManager.notify(NOTIFICATION_ID, notify);
            }

            linksToImages.addAll(links);

            StartNextDownloadInQueue();
        }
    }

    private synchronized void StartNextDownloadInQueue() {
        try {
            if (linksToImages.size() > 0) {
                String link = linksToImages.remove(0);
                new GetImageThreaded(link, imgDownloadFinished, 999).start();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            Toast.makeText(this, "Error while downloading images.", Toast.LENGTH_LONG).show();
        }
    }

    private Notification GetNotificationLimitImagesReached(int limit) {
        Intent intentNewsReader = new Intent(this, NewsReaderListActivity.class);
        PendingIntent pIntent = PendingIntent.getActivity(this, 0, intentNewsReader, 0);
        NotificationCompat.Builder notifyBuilder = new NotificationCompat.Builder(this)
                .setContentTitle("ownCloud News Reader")
                .setContentText("Only " + limit + " images can be cached at once")
                .setSmallIcon(R.drawable.ic_notification).setContentIntent(pIntent);

        Notification notify = notifyBuilder.build();

        //Hide the notification after its selected
        notify.flags |= Notification.FLAG_AUTO_CANCEL;
        return notify;
    }

    private Notification BuildNotification() {
        Intent intentNewsReader = new Intent(this, NewsReaderListActivity.class);
        PendingIntent pIntent = PendingIntent.getActivity(this, 0, intentNewsReader, 0);
        notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationDownloadImages = new NotificationCompat.Builder(this)
                .setContentTitle(getResources().getString(R.string.app_name))
                .setContentText("Downloading images for offline usage").setSmallIcon(R.drawable.ic_notification)
                .setContentIntent(pIntent).setOngoing(true);

        Notification notify = mNotificationDownloadImages.build();

        //Hide the notification after its selected
        notify.flags |= Notification.FLAG_AUTO_CANCEL;
        notify.flags |= Notification.FLAG_NO_CLEAR;

        return notify;
    }

    private void RemoveOldImages() {
        ImageLoader.getInstance().clearDiskCache();
    }

    ImageDownloadFinished imgDownloadFinished = new ImageDownloadFinished() {

        @Override
        public void DownloadFinished(long AsynkTaskId, Bitmap bitmap) {
            int count = maxCount - linksToImages.size();

            if (maxCount == count) {
                notificationManager.cancel(NOTIFICATION_ID);
                //RemoveOldImages();
            } else {
                mNotificationDownloadImages
                        .setContentText("Downloading Images for offline usage - " + (count + 1) + "/" + maxCount)
                        .setProgress(maxCount, count + 1, false);

                notificationManager.notify(NOTIFICATION_ID, mNotificationDownloadImages.build());

                StartNextDownloadInQueue();
            }
        }
    };
}