com.jaspersoft.android.jaspermobile.activities.save.SaveReportService.java Source code

Java tutorial

Introduction

Here is the source code for com.jaspersoft.android.jaspermobile.activities.save.SaveReportService.java

Source

/*
 * Copyright  2016 TIBCO Software,Inc.All rights reserved.
 * http://community.jaspersoft.com/project/jaspermobile-android
 *
 * Unless you have purchased a commercial license agreement from TIBCO Jaspersoft,
 * the following license terms apply:
 *
 * This program is part of TIBCO Jaspersoft Mobile for Android.
 *
 * TIBCO Jaspersoft Mobile is free software:you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation,either version 3of the License,or
 * (at your option)any later version.
 *
 * TIBCO Jaspersoft Mobile 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with TIBCO Jaspersoft Mobile for Android.If not,see
 * <http://www.gnu.org/licenses/lgpl>.
 */

package com.jaspersoft.android.jaspermobile.activities.save;

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.support.v4.app.NotificationCompat;

import com.jaspersoft.android.jaspermobile.Analytics;
import com.jaspersoft.android.jaspermobile.R;
import com.jaspersoft.android.jaspermobile.data.entity.ExportBundle;
import com.jaspersoft.android.jaspermobile.ui.view.activity.NavigationActivity_;
import com.jaspersoft.android.jaspermobile.ui.view.fragment.ComponentProviderDelegate;

import org.androidannotations.annotations.EService;
import org.androidannotations.annotations.SystemService;

import java.util.Date;

import javax.inject.Inject;

/**
 * @author Andrew Tivodar
 * @since 2.3
 */

@EService
public class SaveReportService extends Service implements ReportDownloadManager.ReportDownloadCallback {

    public final static String ACTION_SAVE_REPORT = "saveReport";
    public final static String ACTION_CANCEL_SAVING = "cancelSaving";

    public final static String EXPORT_BUNDLE_EXTRA = "exportBundle";
    public final static String ITEM_URI_EXTRA = "itemUri";

    private static final int LOADING_NOTIFICATION_ID = 434;

    @Inject
    protected Analytics analytics;

    @SystemService
    protected NotificationManager mNotificationManager;
    private ReportDownloadManager mReportDownloadManager;

    public static void start(Context context, ExportBundle bundle) {
        Intent startIntent = SaveReportService_.intent(context).get();
        startIntent.setAction(ACTION_SAVE_REPORT);
        startIntent.putExtra(EXPORT_BUNDLE_EXTRA, bundle);
        context.startService(startIntent);
    }

    public static void cancel(Context context, Uri reportUri) {
        Intent cancelIntent = SaveReportService_.intent(context).get();
        cancelIntent.setAction(ACTION_CANCEL_SAVING);
        cancelIntent.putExtra(ITEM_URI_EXTRA, reportUri);
        context.startService(cancelIntent);
    }

    @Override
    public void onCreate() {
        super.onCreate();

        ComponentProviderDelegate.INSTANCE.getProfileComponent(this).inject(this);

        mReportDownloadManager = new ReportDownloadManager(this);
        mReportDownloadManager.setReportDownloadCallback(this);

        startForegroundNotification();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        String action = intent.getAction();
        Bundle extras = intent.getExtras();

        if (SaveReportService.ACTION_CANCEL_SAVING.equals(action)) {
            Uri reportUri = extras.getParcelable(SaveReportService.ITEM_URI_EXTRA);
            mReportDownloadManager.cancelDownloading(reportUri);
        } else {
            ExportBundle bundle = extras.getParcelable(SaveReportService.EXPORT_BUNDLE_EXTRA);
            mReportDownloadManager.downloadReport(bundle);
        }

        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDownloadCountChange(int count) {
        if (count > 0) {
            updateDownloadingNotification(count);
        } else {
            stopSelf();
        }
    }

    @Override
    public void onDownloadComplete(String reportName) {
        notifySaveResult(reportName, android.R.drawable.stat_sys_download_done,
                getString(R.string.sr_t_report_saved));
        analytics.sendEvent(Analytics.EventCategory.RESOURCE.getValue(), Analytics.EventAction.SAVED.getValue(),
                Analytics.EventLabel.DONE.getValue());
    }

    @Override
    public void onDownloadFailed(String reportName) {
        notifySaveResult(reportName, android.R.drawable.ic_dialog_alert, getString(R.string.sdr_saving_error_msg));
        analytics.sendEvent(Analytics.EventCategory.RESOURCE.getValue(), Analytics.EventAction.SAVED.getValue(),
                Analytics.EventLabel.FAILED.getValue());
    }

    @Override
    public void onDownloadCanceled() {
        analytics.sendEvent(Analytics.EventCategory.RESOURCE.getValue(), Analytics.EventAction.SAVED.getValue(),
                Analytics.EventLabel.CANCELED.getValue());
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        cancelForegroundNotification();
    }

    private void startForegroundNotification() {
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(android.R.drawable.stat_sys_download)
                .setContentTitle(getString(R.string.sdr_starting_downloading_msg));
        startForeground(LOADING_NOTIFICATION_ID, mBuilder.build());
    }

    private void cancelForegroundNotification() {
        mNotificationManager.cancel(LOADING_NOTIFICATION_ID);
    }

    private void updateDownloadingNotification(int downloadingCount) {
        String savingTitle = downloadingCount > 1 ? getString(R.string.sdr_saving_multiply_msg, downloadingCount)
                : getString(R.string.sdr_saving_msg);

        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(android.R.drawable.stat_sys_download).setContentTitle(savingTitle)
                .setContentIntent(getSavedItemIntent());

        mNotificationManager.notify(LOADING_NOTIFICATION_ID, mBuilder.build());
    }

    private void notifySaveResult(String reportName, int iconId, String message) {
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this).setSmallIcon(iconId)
                .setContentTitle(reportName).setContentText(message).setContentIntent(getSavedItemIntent())
                .setAutoCancel(true);

        mNotificationManager.notify(createNotificationId(), mBuilder.build());
    }

    private int createNotificationId() {
        long time = new Date().getTime();
        String tmpStr = String.valueOf(time);
        String last5Str = tmpStr.substring(tmpStr.length() - 6);
        return Integer.valueOf(last5Str);
    }

    private PendingIntent getSavedItemIntent() {
        Intent notificationIntent = NavigationActivity_.intent(this).currentSelection(R.id.vg_saved_items).get();

        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        return PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    }

}