Commit 8977990f authored by Thomas's avatar Thomas
Browse files

Cache messages

parent b64fd393
Loading
Loading
Loading
Loading
+0 −86
Original line number Diff line number Diff line
package app.fedilab.android.mastodon.client.entities.app;
/* Copyright 2023 Thomas Schneider
 *
 * This file is a part of Fedilab
 *
 * 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.
 *
 * Fedilab 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 Fedilab; if not,
 * see <http://www.gnu.org/licenses>. */

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

import com.google.gson.annotations.SerializedName;

import java.io.Serializable;
import java.util.Date;

import app.fedilab.android.mastodon.exception.DBException;
import app.fedilab.android.mastodon.helper.Helper;
import app.fedilab.android.sqlite.Sqlite;

public class HomeFetchLog implements Serializable {

    private final SQLiteDatabase db;
    @SerializedName("id")
    public long id = -1;
    @SerializedName("instance")
    public String instance;
    @SerializedName("user_id")
    public String user_id;
    @SerializedName("fetched_count")
    public int fetched_count;
    @SerializedName("inserted")
    public int inserted;
    @SerializedName("updated")
    public int updated;
    @SerializedName("failed")
    public int failed;
    @SerializedName("frequency")
    public int frequency;
    @SerializedName("created_at")
    public Date created_ad;
    private Context context;

    public HomeFetchLog() {
        db = null;
    }

    public HomeFetchLog(Context context) {
        //Creation of the DB with tables
        this.context = context;
        this.db = Sqlite.getInstance(context.getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
    }

    public long insert(HomeFetchLog homeFetchLog) throws DBException {
        if (db == null) {
            throw new DBException("db is null. Wrong initialization.");
        }
        ContentValues values = new ContentValues();
        values.put(Sqlite.COL_INSTANCE, homeFetchLog.instance);
        values.put(Sqlite.COL_USER_ID, homeFetchLog.user_id);
        values.put(Sqlite.COL_FETCHED_COUNT, homeFetchLog.fetched_count);
        values.put(Sqlite.COL_FAILED, homeFetchLog.failed);
        values.put(Sqlite.COL_INSERTED, homeFetchLog.inserted);
        values.put(Sqlite.COL_UPDATED, homeFetchLog.updated);
        values.put(Sqlite.COL_FREQUENCY, homeFetchLog.frequency);
        values.put(Sqlite.COL_CREATED_AT, Helper.dateToString(new Date()));

        //Inserts logs
        try {
            return db.insertOrThrow(Sqlite.TABLE_HOME_FETCH_LOGS, null, values);
        } catch (Exception e) {
            e.printStackTrace();
            return -1;
        }
    }

}
+12 −38
Original line number Diff line number Diff line
@@ -46,7 +46,6 @@ import app.fedilab.android.mastodon.client.entities.api.Pagination;
import app.fedilab.android.mastodon.client.entities.api.Status;
import app.fedilab.android.mastodon.client.entities.app.Account;
import app.fedilab.android.mastodon.client.entities.app.BaseAccount;
import app.fedilab.android.mastodon.client.entities.app.HomeFetchLog;
import app.fedilab.android.mastodon.client.entities.app.StatusCache;
import app.fedilab.android.mastodon.client.entities.app.Timeline;
import app.fedilab.android.mastodon.exception.DBException;
@@ -77,12 +76,13 @@ public class FetchHomeWorker extends Worker {
        notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    }

    public static void setRepeatHome(Context context, BaseAccount account) {
    public static void setRepeatHome(Context context, BaseAccount account, Data inputData) {
        WorkManager.getInstance(context).cancelAllWorkByTag(Helper.WORKER_REFRESH_HOME + account.user_id + account.instance);
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
        String value = prefs.getString(context.getString(R.string.SET_FETCH_HOME_DELAY_VALUE) + account.user_id + account.instance, "60");
        PeriodicWorkRequest notificationPeriodic = new PeriodicWorkRequest.Builder(FetchHomeWorker.class, Long.parseLong(value), TimeUnit.MINUTES)
                .addTag(Helper.WORKER_REFRESH_HOME)
                .setInputData(inputData)
                .addTag(Helper.WORKER_REFRESH_HOME + account.user_id + account.instance)
                .build();
        WorkManager.getInstance(context).enqueueUniquePeriodicWork(Helper.WORKER_REFRESH_HOME + account.user_id + account.instance, ExistingPeriodicWorkPolicy.REPLACE, notificationPeriodic);
    }
@@ -135,10 +135,15 @@ public class FetchHomeWorker extends Worker {
    @NonNull
    @Override
    public Result doWork() {

        setForegroundAsync(createForegroundInfo());

        String instance = getInputData().getString(Helper.ARG_INSTANCE);
        String userId = getInputData().getString(Helper.ARG_USER_ID);

        try {
            List<BaseAccount> accounts = new Account(getApplicationContext()).getCrossAccounts();
            for (BaseAccount account : accounts) {
            BaseAccount account = new Account(getApplicationContext()).getUniqAccount(userId, instance);
            if (account != null) {
                try {
                    fetchHome(getApplicationContext(), account);
                } catch (IOException e) {
@@ -164,18 +169,13 @@ public class FetchHomeWorker extends Worker {
            int call = 0;
            String max_id = null;
            MastodonTimelinesService mastodonTimelinesService = init(account.instance);
            int inserted = 0;
            int updated = 0;
            int failed = 0;
            int count = 0;
            while (canContinue && call < max_calls) {
                Call<List<Status>> homeCall = mastodonTimelinesService.getHome(account.token, account.instance, max_id, null, status_per_page, null);
                Call<List<Status>> homeCall = mastodonTimelinesService.getHome(account.token, max_id, null, null, status_per_page, null);
                if (homeCall != null) {
                    Response<List<Status>> homeResponse = homeCall.execute();
                    if (homeResponse.isSuccessful()) {
                        List<Status> statusList = homeResponse.body();
                        if (statusList != null && statusList.size() > 0) {
                            count += statusList.size();
                            for (Status status : statusList) {
                                StatusCache statusCacheDAO = new StatusCache(getApplicationContext());
                                StatusCache statusCache = new StatusCache();
@@ -185,16 +185,9 @@ public class FetchHomeWorker extends Worker {
                                statusCache.type = Timeline.TimeLineEnum.HOME;
                                statusCache.status_id = status.id;
                                try {
                                    int val = statusCacheDAO.insertOrUpdate(statusCache, Timeline.TimeLineEnum.HOME.getValue());
                                    if (val == 1) {
                                        inserted++;
                                    }
                                    if (val == 0) {
                                        updated++;
                                    }
                                    statusCacheDAO.insertOrUpdate(statusCache, Timeline.TimeLineEnum.HOME.getValue());
                                } catch (DBException e) {
                                    e.printStackTrace();
                                    failed = -1;
                                }
                            }
                            Pagination pagination = MastodonHelper.getPagination(homeResponse.headers());
@@ -202,18 +195,13 @@ public class FetchHomeWorker extends Worker {
                                max_id = pagination.max_id;
                            } else {
                                canContinue = false;
                                failed = 4;
                            }
                        } else {
                            failed = 3;
                            canContinue = false;
                        }
                    } else {
                        canContinue = false;
                        failed = 2;
                    }
                } else {
                    failed = 1;
                }
                //Pause between calls (1 second)
                try {
@@ -223,20 +211,6 @@ public class FetchHomeWorker extends Worker {
                }
                call++;
            }
            HomeFetchLog homeFetchLog = new HomeFetchLog();
            homeFetchLog.user_id = account.user_id;
            homeFetchLog.instance = account.instance;
            String frequency = prefs.getString(context.getString(R.string.SET_FETCH_HOME_DELAY_VALUE) + account.user_id + account.instance, "60");
            homeFetchLog.frequency = Integer.parseInt(frequency);
            homeFetchLog.fetched_count = count;
            homeFetchLog.inserted = inserted;
            homeFetchLog.updated = updated;
            homeFetchLog.failed = failed;
            try {
                new HomeFetchLog(context).insert(homeFetchLog);
            } catch (DBException e) {
                e.printStackTrace();
            }
        }
    }

+8 −2
Original line number Diff line number Diff line
@@ -23,8 +23,10 @@ import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceManager;
import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;
import androidx.work.Data;
import androidx.work.WorkManager;

import app.fedilab.android.BaseMainActivity;
import app.fedilab.android.R;
import app.fedilab.android.activities.MainActivity;
import app.fedilab.android.mastodon.helper.Helper;
@@ -70,6 +72,10 @@ public class FragmentHomeCacheSettings extends PreferenceFragmentCompat implemen
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if (getActivity() != null) {
            SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity());
            Data inputData = new Data.Builder()
                    .putString(Helper.ARG_INSTANCE, BaseMainActivity.currentInstance)
                    .putString(Helper.ARG_USER_ID, BaseMainActivity.currentUserID)
                    .build();
            if (key.compareToIgnoreCase(getString(R.string.SET_FETCH_HOME)) == 0) {
                SharedPreferences.Editor editor = sharedpreferences.edit();
                SwitchPreference SET_FETCH_HOME = findPreference(getString(R.string.SET_FETCH_HOME));
@@ -77,7 +83,7 @@ public class FragmentHomeCacheSettings extends PreferenceFragmentCompat implemen
                    editor.putBoolean(getString(R.string.SET_FETCH_HOME) + MainActivity.currentUserID + MainActivity.currentInstance, SET_FETCH_HOME.isChecked());
                    editor.commit();
                    if (SET_FETCH_HOME.isChecked()) {
                        FetchHomeWorker.setRepeatHome(requireActivity(), MainActivity.currentAccount);
                        FetchHomeWorker.setRepeatHome(requireActivity(), MainActivity.currentAccount, inputData);
                    } else {
                        WorkManager.getInstance(requireActivity()).cancelAllWorkByTag(Helper.WORKER_REFRESH_HOME + MainActivity.currentUserID + MainActivity.currentInstance);
                    }
@@ -89,7 +95,7 @@ public class FragmentHomeCacheSettings extends PreferenceFragmentCompat implemen
                    SharedPreferences.Editor editor = sharedpreferences.edit();
                    editor.putString(getString(R.string.SET_FETCH_HOME_DELAY_VALUE) + MainActivity.currentUserID + MainActivity.currentInstance, SET_FETCH_HOME_DELAY_VALUE.getValue());
                    editor.commit();
                    FetchHomeWorker.setRepeatHome(requireActivity(), MainActivity.currentAccount);
                    FetchHomeWorker.setRepeatHome(requireActivity(), MainActivity.currentAccount, inputData);
                }
            }
        }
+1 −15
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@ import android.database.sqlite.SQLiteOpenHelper;
public class Sqlite extends SQLiteOpenHelper {


    public static final int DB_VERSION = 10;
    public static final int DB_VERSION = 9;
    public static final String DB_NAME = "fedilab_db";

    //Table of owned accounts
@@ -212,17 +212,6 @@ public class Sqlite extends SQLiteOpenHelper {
            + COL_USER_INSTANCE + " TEXT NOT NULL)";


    private static final String CREATE_TABLE_HOME_FETCH_LOGS = "CREATE TABLE IF NOT EXISTS " + TABLE_HOME_FETCH_LOGS + " ("
            + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
            + COL_INSTANCE + " TEXT NOT NULL, "
            + COL_USER_ID + " TEXT NOT NULL, "
            + COL_FETCHED_COUNT + " INTEGER NOT NULL DEFAULT 0, "
            + COL_INSERTED + " INTEGER NOT NULL DEFAULT 0, "
            + COL_UPDATED + " INTEGER NOT NULL DEFAULT 0, "
            + COL_FAILED + " INTEGER NOT NULL DEFAULT 0, "
            + COL_FREQUENCY + " INTEGER NOT NULL DEFAULT 0, "
            + COL_CREATED_AT + " TEXT NOT NULL)";

    public static SQLiteDatabase db;
    private static Sqlite sInstance;

@@ -254,7 +243,6 @@ public class Sqlite extends SQLiteOpenHelper {
        db.execSQL(CREATE_DOMAINS_TRACKING);
        db.execSQL(CREATE_TABLE_MUTED);
        db.execSQL(CREATE_TABLE_STORED_INSTANCES);
        db.execSQL(CREATE_TABLE_HOME_FETCH_LOGS);
    }

    @Override
@@ -283,8 +271,6 @@ public class Sqlite extends SQLiteOpenHelper {
                db.execSQL(CREATE_TABLE_MUTED);
            case 8:
                db.execSQL(CREATE_TABLE_STORED_INSTANCES);
            case 9:
                db.execSQL(CREATE_TABLE_HOME_FETCH_LOGS);
            default:
                break;
        }