com.luorrak.ouroboros.services.ReplyCheckerService.java Source code

Java tutorial

Introduction

Here is the source code for com.luorrak.ouroboros.services.ReplyCheckerService.java

Source

package com.luorrak.ouroboros.services;

import android.app.IntentService;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.database.Cursor;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.koushikdutta.ion.Ion;
import com.luorrak.ouroboros.R;
import com.luorrak.ouroboros.api.JsonParser;
import com.luorrak.ouroboros.catalog.CatalogActivity;
import com.luorrak.ouroboros.util.ChanUrls;
import com.luorrak.ouroboros.util.DbContract;
import com.luorrak.ouroboros.util.InfiniteDbHelper;
import com.luorrak.ouroboros.util.Util;

import java.util.concurrent.ExecutionException;

/**
 * Ouroboros - An 8chan browser
 * Copyright (C) 2015  Luorrak
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

public class ReplyCheckerService extends IntentService {
    NotificationManager notificationManager;

    public ReplyCheckerService() {
        super(ReplyCheckerService.class.getName());

    }

    @Override
    public void onCreate() {
        super.onCreate();
        notificationManager = (NotificationManager) getSystemService(getApplicationContext().NOTIFICATION_SERVICE);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        InfiniteDbHelper infiniteDbHelper = new InfiniteDbHelper(getApplicationContext());
        Cursor userPostsCursor = infiniteDbHelper.getUserPostsCursor();
        Cursor repliesCursor;
        String userPostBoardName;
        String userPostResto;
        String userPostNo;
        int userReplyCount;
        int userPostErrorCount;
        int replyCount = 0;
        int threadReplyCount;
        int position;

        String oldResto = "";
        if ((userPostsCursor != null) && (userPostsCursor.getCount() > 0)) {
            do {
                threadReplyCount = 0;
                position = 0;
                String userPostRowId = String
                        .valueOf(userPostsCursor.getInt(userPostsCursor.getColumnIndex(DbContract.UserPosts._ID)));
                userPostBoardName = userPostsCursor
                        .getString(userPostsCursor.getColumnIndex(DbContract.UserPosts.COLUMN_BOARDS));
                userPostResto = userPostsCursor
                        .getString(userPostsCursor.getColumnIndex(DbContract.UserPosts.COLUMN_RESTO));
                userPostNo = userPostsCursor
                        .getString(userPostsCursor.getColumnIndex(DbContract.UserPosts.COLUMN_NO));
                userReplyCount = userPostsCursor
                        .getInt(userPostsCursor.getColumnIndex(DbContract.UserPosts.COLUMN_NUMBER_OF_REPLIES));
                userPostErrorCount = userPostsCursor
                        .getInt(userPostsCursor.getColumnIndex(DbContract.UserPosts.COLUMN_ERROR_COUNT));

                if (!userPostResto.equals(oldResto)) {
                    getThreadJson(userPostBoardName, userPostResto, infiniteDbHelper, userPostRowId,
                            userPostErrorCount);
                    oldResto = userPostResto;
                }

                Cursor rcCursor = infiniteDbHelper.getRCPost(userPostBoardName, userPostResto, userPostNo);
                if ((rcCursor != null) && (rcCursor.getCount() > 0)) {
                    repliesCursor = infiniteDbHelper.getRCReplies(userPostNo);
                    threadReplyCount = repliesCursor.getCount();
                    repliesCursor.close();

                    position = rcCursor.getInt(rcCursor.getColumnIndex(DbContract.UserPosts.COLUMN_POSITION));
                }
                rcCursor.close();

                if (threadReplyCount > userReplyCount) {
                    replyCount++;
                    infiniteDbHelper.updateUserPostReplyCount(userPostRowId, threadReplyCount);
                    infiniteDbHelper.updateUserPostPosition(userPostRowId, position);
                    infiniteDbHelper.addUserPostFlag(userPostRowId);
                }

            } while (userPostsCursor.moveToNext());
            userPostsCursor.close();
            infiniteDbHelper.deleteRCCache();

            if (replyCount > 0) {
                createNotification(replyCount);
            }
        }
    }

    private void getThreadJson(final String userPostBoardName, String userPostResto,
            final InfiniteDbHelper infiniteDbHelper, String userPostRowId, int userPostErrorCount) {
        JsonObject jsonObject = null;
        try {
            jsonObject = Ion.with(getApplicationContext())
                    .load(ChanUrls.getThreadUrl(userPostBoardName, userPostResto))
                    .setLogging("ReplyService", Log.DEBUG).asJsonObject().get();
        } catch (InterruptedException e) {
            userPostPrune(infiniteDbHelper, userPostRowId, userPostErrorCount);
        } catch (ExecutionException e) {
            userPostPrune(infiniteDbHelper, userPostRowId, userPostErrorCount);
        }
        if (jsonObject != null) {
            insertRCIntoDatabase(jsonObject, userPostBoardName, infiniteDbHelper);
            infiniteDbHelper.updateUserPostErrorCount(userPostRowId, 0);
        } else {
            userPostPrune(infiniteDbHelper, userPostRowId, userPostErrorCount);
        }
    }

    private void userPostPrune(InfiniteDbHelper infiniteDbHelper, String userPostRowId, int userPostErrorCount) {
        if (userPostErrorCount == 2) {
            infiniteDbHelper.deleteUserPostsEntry(userPostRowId);
        } else {
            infiniteDbHelper.updateUserPostErrorCount(userPostRowId, userPostErrorCount + 1);
        }
    }

    private void insertRCIntoDatabase(JsonObject jsonObject, String userPostBoardName,
            InfiniteDbHelper infiniteDbHelper) {
        JsonParser jsonParser = new JsonParser();
        JsonArray posts = jsonObject.getAsJsonArray("posts");
        int position = 0;
        for (JsonElement postElement : posts) {
            JsonObject post = postElement.getAsJsonObject();
            infiniteDbHelper.insertRCEntry(userPostBoardName, jsonParser.getThreadResto(post),
                    jsonParser.getThreadNo(post), jsonParser.getThreadSub(post), jsonParser.getThreadCom(post),
                    jsonParser.getThreadEmail(post), jsonParser.getThreadName(post), jsonParser.getThreadTrip(post),
                    jsonParser.getThreadTime(post), jsonParser.getThreadLastModified(post),
                    jsonParser.getThreadId(post), jsonParser.getThreadEmbed(post), jsonParser.getMediaFiles(post),
                    position);
            position++;
        }
    }

    private void createNotification(int replyCount) {
        String title = (replyCount > 1) ? replyCount + " Posts Replied To" : replyCount + " Post Replied To";
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getApplicationContext())
                .setSmallIcon(R.mipmap.white_ouroboros)
                .setColor(getApplicationContext().getResources().getColor(R.color.md_green_500))
                .setContentTitle(title).setContentText("Click here to go see");

        Intent resultIntent = new Intent(this, CatalogActivity.class);
        resultIntent.putExtra(Util.INTENT_REPLY_CHECKER, true);

        PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);
        notificationBuilder.setContentIntent(resultPendingIntent);
        notificationManager.notify(1438, notificationBuilder.build());
    }
}