/* * 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); } }