Android Open Source - Locast-Core-Android Notification Progress Listener






From Project

Back to project page Locast-Core-Android.

License

The source code is released under:

GNU General Public License

If you think the Android project Locast-Core-Android listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

package edu.mit.mobile.android.locast.sync;
/* ww w  .j  av a 2  s.c o m*/
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.Builder;
import edu.mit.mobile.android.locast.R;
import edu.mit.mobile.android.locast.net.NetworkClient.FileTransferProgressListener;

/**
 * A progress listener that displays progress using a system notification. Uploads notifications are
 * left, so the user knows what's been uploaded.
 *
 * @author <a href="mailto:spomeroy@mit.edu">Steve Pomeroy</a>
 *
 */
public class NotificationProgressListener implements FileTransferProgressListener {

    public static final int TYPE_UPLOAD = 100;
    public static final int TYPE_DOWNLOAD = 101;

    // //////////////////////////////

    private static final int MAX_SEGMENT_PROGRESS = 1000;

    private final Builder mNotificationBuilder;
    private int mType = TYPE_DOWNLOAD;

    private int mCompletionCount = 0;
    private int mTotal = 1;

    private int mFileProgress = 0;
    private final NotificationManager mNotificationManager;
    private final Resources mResources;
    private Context mContext;
    private boolean mShown;
    private final int mId;
    private Uri mLastContentItem;
    private CharSequence mLastTitle;
    private boolean mSuccessful = false;

    // ///////////////////////////////

    /**
     * @param context
     * @param type
     *            Either {@link #TYPE_DOWNLOAD} or {@link #TYPE_UPLOAD}
     * @param id
     *            the notification ID to be used.
     */
    public NotificationProgressListener(Context context, int type, int id) {
        mContext = context;
        mId = id;
        mType = type;

        mNotificationBuilder = new NotificationCompat.Builder(context)

        .setOngoing(true)

        .setOnlyAlertOnce(true)

        .setProgress(MAX_SEGMENT_PROGRESS, 0, false);

        mNotificationManager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);

        mShown = false;

        mResources = context.getResources();
    }

    /**
     * Sets the total number of items expected to be transferred. Defaults to 1.
     *
     * @param totalItems
     */
    public void setTotalItems(int totalItems) {
        mTotal = totalItems;
    }

    @Override
    public void onTransferStart(Uri contentItem, CharSequence title, String contentType,
            long totalBytes) {
        mNotificationBuilder.setSmallIcon(getIcon(false)).setWhen(System.currentTimeMillis());

        if (title == null) {
            if (mTotal > 1) {
                title = (mCompletionCount + 1) + "/" + mTotal;
            } else {
                title = "";
            }
        }
        mLastTitle = title;

        mNotificationBuilder.setContentTitle(getTitle(title));
        mNotificationBuilder.setTicker(getTitle(title));
        mNotificationBuilder.setContentIntent(getPendingContentIntent(contentItem));

        mShown = true;
        mNotificationManager.notify(mId, mNotificationBuilder.build());
    }

    private int getIcon(boolean complete) {
        if (complete && !mSuccessful) {
            return android.R.drawable.stat_sys_warning;
        }

        switch (mType) {
            case TYPE_UPLOAD:
                return complete ? android.R.drawable.stat_sys_upload_done
                        : android.R.drawable.stat_sys_upload;
            default:
            case TYPE_DOWNLOAD:
                return complete ? android.R.drawable.stat_sys_download_done
                        : android.R.drawable.stat_sys_download;
        }
    }

    private int getProgress() {
        return mCompletionCount * MAX_SEGMENT_PROGRESS + mFileProgress;
    }

    private int getProgressMax() {
        return mTotal * MAX_SEGMENT_PROGRESS;
    }

    private CharSequence getTitle(CharSequence what) {
        return mResources.getString(mType == TYPE_UPLOAD ? R.string.sync_uploading
                : R.string.sync_downloading, what);
    }

    @Override
    public void onTransferProgress(Uri contentItem, long transferredBytes, long totalBytes) {

        boolean indeterminate = false;
        // total bytes should never be 0, but if it is, don't attempt to divide by it.
        if (totalBytes > 0) {
            mFileProgress = (int) ((transferredBytes * MAX_SEGMENT_PROGRESS) / totalBytes);
        } else {
            mFileProgress = 0;
            indeterminate = true;
        }

        mNotificationBuilder.setProgress(getProgressMax(), getProgress(), indeterminate);

        mShown = true;
        mNotificationManager.notify(mId, mNotificationBuilder.build());
    }

    @Override
    public void onTransferComplete(Uri contentItem) {
        mFileProgress = 0;
        mCompletionCount++;

        mLastContentItem = contentItem;

        mShown = true;

    }

    /**
     * <p>
     * Signals that all transfers have been completed. For downloads, this clears the notification.
     * For uploads, this leaves a dismissible notification that links to the content that's been
     * uploaded. Once this method has been called, this object should be discarded and no more
     * callbacks should be called.
     * </p>
     */
    public void onAllTransfersComplete() {
        if (mShown) {
            switch (mType) {

                case TYPE_DOWNLOAD:
                    mNotificationManager.cancel(mId);
                    break;

                default:
                case TYPE_UPLOAD:
                    replaceWithCompleteNotification();
                    break;
            }
        }

        mContext = null;
    }

    public void onTransfersSuccessful() {
        if (mShown) {
            mSuccessful = true;
        }
    }

    private void replaceWithCompleteNotification() {
        final Notification n = mNotificationBuilder
                .setOngoing(false)
                .setAutoCancel(true)
                .setWhen(System.currentTimeMillis())
                .setProgress(0, 0, false)

                .setContentIntent(getPendingContentIntent(mLastContentItem))
                .setContentTitle(
                        mContext.getString(mSuccessful ? R.string.sync_upload_success_message
                                : R.string.error_sync_upload_fail_message, mLastTitle))
                .setSmallIcon(getIcon(true))
                .setTicker(
                        mContext.getText(mSuccessful ? R.string.sync_upload_success
                                : R.string.error_sync_upload_fail)).build();

        mNotificationManager.notify(mId, n);

    }

    private PendingIntent getPendingContentIntent(Uri lastContentItem) {
        return PendingIntent.getActivity(mContext, 0, new Intent(Intent.ACTION_VIEW,
                lastContentItem), PendingIntent.FLAG_CANCEL_CURRENT);
    }
}




Java Source Code List

com.beoui.geocell.GeocellLogger.java
com.beoui.geocell.GeocellQueryEngine.java
com.beoui.geocell.GeocellUtils.java
com.beoui.geocell.annotations.Geocells.java
com.beoui.geocell.annotations.Latitude.java
com.beoui.geocell.annotations.Longitude.java
com.beoui.geocell.comparator.DoubleTupleComparator.java
com.beoui.geocell.comparator.LocationComparableTuple.java
com.beoui.geocell.model.BoundingBox.java
com.beoui.geocell.model.CostFunction.java
com.beoui.geocell.model.DefaultCostFunction.java
com.beoui.geocell.model.GeocellQuery.java
com.beoui.geocell.model.LocationCapable.java
com.beoui.geocell.model.Point.java
com.beoui.geocell.model.Tuple.java
com.stackoverflow.ArrayUtils.java
com.stackoverflow.CollectionUtils.java
com.stackoverflow.MediaUtils.java
com.stackoverflow.Predicate.java
edu.mit.mobile.android.MelAndroid.java
edu.mit.mobile.android.json.JSONArrayAdapter.java
edu.mit.mobile.android.locast.Constants.java
edu.mit.mobile.android.locast.accounts.AbsAccountChangeReceiver.java
edu.mit.mobile.android.locast.accounts.AbsLocastAuthenticationService.java
edu.mit.mobile.android.locast.accounts.AbsLocastAuthenticatorActivity.java
edu.mit.mobile.android.locast.accounts.AbsLocastAuthenticator.java
edu.mit.mobile.android.locast.accounts.AbsRegisterActivity.java
edu.mit.mobile.android.locast.accounts.LogoutFragment.java
edu.mit.mobile.android.locast.app.LocastApplication.java
edu.mit.mobile.android.locast.data.AbsComment.java
edu.mit.mobile.android.locast.data.AbsResourcesSync.java
edu.mit.mobile.android.locast.data.CastMedia.java
edu.mit.mobile.android.locast.data.ImageContent.java
edu.mit.mobile.android.locast.data.JSONSyncableIdenticalChildFinder.java
edu.mit.mobile.android.locast.data.JsonSyncableItem.java
edu.mit.mobile.android.locast.data.MediaProcessingException.java
edu.mit.mobile.android.locast.data.NoPublicPath.java
edu.mit.mobile.android.locast.data.OrderedList.java
edu.mit.mobile.android.locast.data.ResourcesSync.java
edu.mit.mobile.android.locast.data.SyncException.java
edu.mit.mobile.android.locast.data.SyncItemDeletedException.java
edu.mit.mobile.android.locast.data.SyncMapException.java
edu.mit.mobile.android.locast.data.SyncMap.java
edu.mit.mobile.android.locast.data.VideoContent.java
edu.mit.mobile.android.locast.data.interfaces.AuthorableUtils.java
edu.mit.mobile.android.locast.data.interfaces.Authorable.java
edu.mit.mobile.android.locast.data.interfaces.CommentableUtils.java
edu.mit.mobile.android.locast.data.interfaces.Commentable.java
edu.mit.mobile.android.locast.data.interfaces.FavoritableUtils.java
edu.mit.mobile.android.locast.data.interfaces.Favoritable.java
edu.mit.mobile.android.locast.data.interfaces.LocatableUtils.java
edu.mit.mobile.android.locast.data.interfaces.Locatable.java
edu.mit.mobile.android.locast.data.interfaces.PrivatelyAuthorableUtils.java
edu.mit.mobile.android.locast.data.interfaces.PrivatelyAuthorable.java
edu.mit.mobile.android.locast.data.interfaces.TitledUtils.java
edu.mit.mobile.android.locast.data.interfaces.Titled.java
edu.mit.mobile.android.locast.data.tags.IdenticalTagFinder.java
edu.mit.mobile.android.locast.data.tags.TagSyncField.java
edu.mit.mobile.android.locast.data.tags.Tag.java
edu.mit.mobile.android.locast.data.tags.TaggableUtils.java
edu.mit.mobile.android.locast.data.tags.TaggableWrapper.java
edu.mit.mobile.android.locast.data.tags.Taggable.java
edu.mit.mobile.android.locast.net.ClientResponseException.java
edu.mit.mobile.android.locast.net.LocastApplicationCallbacks.java
edu.mit.mobile.android.locast.net.NetworkClient.java
edu.mit.mobile.android.locast.net.NetworkProtocolException.java
edu.mit.mobile.android.locast.sync.AbsLocastAccountSyncService.java
edu.mit.mobile.android.locast.sync.AbsMediaSync.java
edu.mit.mobile.android.locast.sync.LocastSimpleSyncService.java
edu.mit.mobile.android.locast.sync.LocastSyncService.java
edu.mit.mobile.android.locast.sync.LocastSyncStatusObserver.java
edu.mit.mobile.android.locast.sync.NotificationProgressListener.java
edu.mit.mobile.android.locast.sync.SyncColumns.java
edu.mit.mobile.android.locast.sync.SyncEngine.java
edu.mit.mobile.android.locast.sync.SyncableProvider.java
edu.mit.mobile.android.locast.sync.SyncableSimpleContentProvider.java
edu.mit.mobile.android.locast.sync.Syncable.java
edu.mit.mobile.android.locast.widget.RemoteTagsAdapter.java
edu.mit.mobile.android.locast.widget.TagButton.java
edu.mit.mobile.android.locast.widget.TagListView.java
edu.mit.mobile.android.locast.widget.TagList.java
edu.mit.mobile.android.locast.widget.TagsLoaderCallbacks.java
edu.mit.mobile.android.location.IncrementalLocator.java
se.fnord.android.layout.PredicateLayout.java