package com.fastaccess.provider.tasks.notification; import android.app.IntentService; import android.app.Notification; import android.app.NotificationManager; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.NotificationCompat; import com.annimon.stream.LongStream; import com.fastaccess.R; import com.fastaccess.helper.AppHelper; import com.fastaccess.helper.BundleConstant; import com.fastaccess.helper.Bundler; import com.fastaccess.helper.InputHelper; import com.fastaccess.helper.PrefGetter; import com.fastaccess.provider.rest.RestProvider; import com.fastaccess.provider.scheme.SchemeParser; import rx.Observable; import rx.schedulers.Schedulers; /** * Created by Kosh on 11 Mar 2017, 12:13 AM */ public class ReadNotificationService extends IntentService { public static final int READ_SINGLE = 1; public static final int READ_ALL = 2; public static final int OPEN_NOTIFICATION = 3; public static final int UN_SUBSCRIBE = 4; private NotificationCompat.Builder notification; private NotificationManager notificationManager; public static void start(@NonNull Context context, long id) { Intent intent = new Intent(context.getApplicationContext(), ReadNotificationService.class); intent.putExtras(Bundler.start() .put(BundleConstant.EXTRA_TYPE, READ_SINGLE) .put(BundleConstant.ID, id) .end()); context.startService(intent); } public static Intent start(@NonNull Context context, long id, @NonNull String url) { return start(context, id, url, false); } public static Intent start(@NonNull Context context, long id, @NonNull String url, boolean onlyRead) { Intent intent = new Intent(context.getApplicationContext(), ReadNotificationService.class); intent.putExtras(Bundler.start() .put(BundleConstant.EXTRA_TYPE, OPEN_NOTIFICATION) .put(BundleConstant.EXTRA, url) .put(BundleConstant.ID, id) .put(BundleConstant.YES_NO_EXTRA, onlyRead) .end()); return intent; } public static void unSubscribe(@NonNull Context context, long id) { Intent intent = new Intent(context.getApplicationContext(), ReadNotificationService.class); intent.putExtras(Bundler.start() .put(BundleConstant.EXTRA_TYPE, UN_SUBSCRIBE) .put(BundleConstant.ID, id) .end()); context.startService(intent); } public static void start(@NonNull Context context, @NonNull long[] ids) { Intent intent = new Intent(context.getApplicationContext(), ReadNotificationService.class); intent.putExtras(Bundler.start() .put(BundleConstant.EXTRA_TYPE, READ_ALL) .put(BundleConstant.ID, ids) .end()); context.startService(intent); } public ReadNotificationService() { super(ReadNotificationService.class.getSimpleName()); } @Override public void onCreate() { super.onCreate(); notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); } @Override protected void onHandleIntent(@Nullable Intent intent) { if (intent != null && intent.getExtras() != null) { Bundle bundle = intent.getExtras(); int type = bundle.getInt(BundleConstant.EXTRA_TYPE); if (type == READ_SINGLE) { markSingleAsRead(bundle.getLong(BundleConstant.ID)); } else if (type == READ_ALL) { markMultiAsRead(bundle.getLongArray(BundleConstant.ID)); } else if (type == OPEN_NOTIFICATION) { openNotification(bundle.getLong(BundleConstant.ID), bundle.getString(BundleConstant.EXTRA), bundle.getBoolean(BundleConstant.YES_NO_EXTRA)); } else if (type == UN_SUBSCRIBE) { unSubscribeFromThread(bundle.getLong(BundleConstant.ID)); } } } private void unSubscribeFromThread(long id) { RestProvider.getNotificationService() .unSubscribe(id) .doOnSubscribe(() -> notify(id, getNotification().build())) .subscribeOn(Schedulers.io()) .flatMap(notification1 -> Observable.create(subscriber -> markSingleAsRead(id))) .subscribe(booleanResponse -> cancel(id), throwable -> cancel(id)); } private void openNotification(long id, @Nullable String url, boolean readOnly) { if (id > 0 && url != null) { AppHelper.cancelNotification(this, InputHelper.getSafeIntId(id)); if (!PrefGetter.isMarkAsReadEnabled() || readOnly) { markSingleAsRead(id); } if (!readOnly) SchemeParser.launchUri(getApplicationContext(), Uri.parse(url), true, true); } } private void markMultiAsRead(@Nullable long[] ids) { if (ids != null && ids.length > 0) { LongStream.of(ids).forEach(this::markSingleAsRead); } } private void markSingleAsRead(long id) { com.fastaccess.data.dao.model.Notification.markAsRead(id) .onErrorComplete() .subscribe(); RestProvider.getNotificationService() .markAsRead(String.valueOf(id)) .doOnSubscribe(() -> notify(id, getNotification().build())) .subscribeOn(Schedulers.io()) .subscribe(booleanResponse -> cancel(id), throwable -> cancel(id)); } private NotificationCompat.Builder getNotification() { if (notification == null) { notification = new NotificationCompat.Builder(this) .setContentTitle(getString(R.string.marking_as_read)) .setSmallIcon(R.drawable.ic_sync) .setProgress(0, 100, true); } return notification; } private void notify(long id, Notification notification) { notificationManager.notify(InputHelper.getSafeIntId(id), notification); } private void cancel(long id) { notificationManager.cancel(InputHelper.getSafeIntId(id)); } }