Commit 154cc63f authored by Thomas's avatar Thomas
Browse files

Improve cache

parent e4255286
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -184,6 +184,11 @@
            android:theme="@style/AppThemeBarDark"
            android:windowSoftInputMode="stateVisible" />

        <activity
            android:name=".activities.CacheActivity"
            android:label="@string/action_cache"
            android:theme="@style/AppThemeBarDark" />

        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.fileProvider"
+4 −47
Original line number Diff line number Diff line
@@ -16,8 +16,8 @@ package app.fedilab.android;

import static app.fedilab.android.BaseMainActivity.status.DISCONNECTED;
import static app.fedilab.android.BaseMainActivity.status.UNKNOWN;
import static app.fedilab.android.helper.CacheHelper.deleteDir;
import static app.fedilab.android.helper.Helper.PREF_USER_TOKEN;
import static app.fedilab.android.helper.Helper.deleteDir;
import static app.fedilab.android.helper.Helper.getCurrentAccount;

import android.annotation.SuppressLint;
@@ -44,8 +44,6 @@ import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
@@ -83,6 +81,7 @@ import app.fedilab.android.activities.ActionActivity;
import app.fedilab.android.activities.AdminActionActivity;
import app.fedilab.android.activities.AnnouncementActivity;
import app.fedilab.android.activities.BaseActivity;
import app.fedilab.android.activities.CacheActivity;
import app.fedilab.android.activities.ComposeActivity;
import app.fedilab.android.activities.ContextActivity;
import app.fedilab.android.activities.DraftActivity;
@@ -525,55 +524,13 @@ public abstract class BaseMainActivity extends BaseActivity implements NetworkSt
                    startActivity(intent);
                    return true;
                } else if (itemId == R.id.action_cache) {
                    new Helper.CacheTask(BaseMainActivity.this);
                    Intent intent = new Intent(BaseMainActivity.this, CacheActivity.class);
                    startActivity(intent);
                    return true;
                } else if (itemId == R.id.action_proxy) {
                    Intent intent = new Intent(BaseMainActivity.this, ProxyActivity.class);
                    startActivity(intent);
                    return true;
                } else if (itemId == R.id.action_size) {
                    float scale = sharedpreferences.getFloat(getString(R.string.SET_FONT_SCALE), 1.0f);

                    AlertDialog.Builder builder = new AlertDialog.Builder(BaseMainActivity.this, Helper.dialogStyle());
                    builder.setTitle(R.string.text_size);
                    View popup_quick_settings = getLayoutInflater().inflate(R.layout.popup_text_size, new LinearLayout(BaseMainActivity.this), false);
                    builder.setView(popup_quick_settings);
                    SeekBar set_text_size = popup_quick_settings.findViewById(R.id.set_text_size);
                    final TextView set_text_size_value = popup_quick_settings.findViewById(R.id.set_text_size_value);
                    set_text_size_value.setText(String.format("%s%%", scale * 100));

                    set_text_size.setMax(20);

                    set_text_size.setProgress((((int) (scale * 100) - 80) / 5));

                    set_text_size.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                        @Override
                        public void onStopTrackingTouch(SeekBar seekBar) {
                        }

                        @Override
                        public void onStartTrackingTouch(SeekBar seekBar) {
                        }

                        @Override
                        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

                            int value = 80 + progress * 5;
                            float scale = (float) (value) / 100.0f;
                            set_text_size_value.setText(String.format("%s%%", value));
                            SharedPreferences.Editor editor = sharedpreferences.edit();
                            editor.putFloat(getString(R.string.SET_FONT_SCALE), scale);
                            editor.apply();
                        }
                    });
                    builder.setPositiveButton(R.string.validate, (dialog, which) -> {
                        BaseMainActivity.this.recreate();
                        recreate();
                        dialog.dismiss();
                    })
                            .setIcon(android.R.drawable.ic_dialog_alert)
                            .show();
                    return true;
                }
                return true;
            });
+85 −0
Original line number Diff line number Diff line
package app.fedilab.android.activities;
/* Copyright 2022 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.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.MenuItem;

import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.LinearLayoutManager;

import java.util.List;
import java.util.Locale;

import app.fedilab.android.R;
import app.fedilab.android.client.entities.app.Account;
import app.fedilab.android.client.entities.app.BaseAccount;
import app.fedilab.android.databinding.ActivityCacheBinding;
import app.fedilab.android.helper.CacheHelper;
import app.fedilab.android.helper.ThemeHelper;
import app.fedilab.android.ui.drawer.CacheAdapter;

public class CacheActivity extends BaseActivity {

    private ActivityCacheBinding binding;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ThemeHelper.applyThemeBar(this);
        binding = ActivityCacheBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        if (getSupportActionBar() != null) {
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setBackgroundDrawable(new ColorDrawable(ContextCompat.getColor(this, R.color.cyanea_primary)));
        }
        CacheHelper.getCacheValues(CacheActivity.this, size -> {
            if (size > 0) {
                size = size / 1000000.0f;
            }
            binding.fileCacheSize.setText(String.format("%s %s", String.format(Locale.getDefault(), "%.2f", size), getString(R.string.cache_units)));
        });


        new Thread(() -> {
            List<BaseAccount> accounts = new Account(CacheActivity.this).getPushNotificationAccounts();
            Handler mainHandler = new Handler(Looper.getMainLooper());
            Runnable myRunnable = () -> {
                CacheAdapter cacheAdapter = new CacheAdapter(accounts);
                LinearLayoutManager mLayoutManager = new LinearLayoutManager(CacheActivity.this);
                binding.cacheRecyclerview.setLayoutManager(mLayoutManager);
                binding.cacheRecyclerview.setAdapter(cacheAdapter);
            };
            mainHandler.post(myRunnable);
        }).start();

    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            finish();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}
+64 −6
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.database.sqlite.SQLiteDatabase;

import com.google.gson.annotations.SerializedName;

import java.util.ArrayList;
import java.util.List;

import app.fedilab.android.client.entities.api.Notification;
@@ -147,6 +148,30 @@ public class QuickLoad {
        return (count > 0);
    }


    /**
     * Count statuses in cache for an account
     *
     * @param account Account {@link Account}
     * @return int - Number of statuses
     * @throws DBException Exception
     */
    public int count(BaseAccount account) throws DBException {
        if (db == null) {
            throw new DBException("db is null. Wrong initialization.");
        }
        int count = 0;
        Cursor c = db.query(Sqlite.TABLE_QUICK_LOAD, null, Sqlite.COL_USER_ID + " =  ? AND " + Sqlite.COL_INSTANCE + " =?",
                new String[]{account.user_id, account.instance}, null, null, null, null);
        List<QuickLoad> quickLoadList = cursorToQuickLoadList(c);
        if (quickLoadList != null) {
            for (QuickLoad quickLoad : quickLoadList) {
                count += quickLoad.statuses.size();
            }
        }
        return count;
    }

    /**
     * @param position     - current position in timeline
     * @param timeLineType - Timeline.TimeLineEnum
@@ -510,20 +535,36 @@ public class QuickLoad {
        quickLoad.statuses = statuses.subList(startAt, endAt);
    }


    /**
     * Convert a cursor to QuickLoad
     * Restore statusDraft list from db
     *
     * @param c Cursor
     * @return QuickLoad
     * @return List<Emoji>
     */
    private QuickLoad cursorToQuickLoad(Cursor c) {
    private List<QuickLoad> cursorToQuickLoadList(Cursor c) {
        //No element found
        if (c.getCount() == 0) {
            c.close();
            return null;
        }
        //Take the first element
        c.moveToFirst();
        List<QuickLoad> quickLoads = new ArrayList<>();
        while (c.moveToNext()) {
            QuickLoad quickLoad = convertCursorToQuickLoad(c);
            quickLoads.add(quickLoad);
        }
        //Close the cursor
        c.close();
        return quickLoads;
    }

    /**
     * Convert a cursor to QuickLoad
     *
     * @param c Cursor
     * @return QuickLoad
     */
    private QuickLoad convertCursorToQuickLoad(Cursor c) {
        QuickLoad quickLoad = new QuickLoad();
        quickLoad.id = c.getInt(c.getColumnIndexOrThrow(Sqlite.COL_ID));
        quickLoad.instance = c.getString(c.getColumnIndexOrThrow(Sqlite.COL_INSTANCE));
@@ -535,9 +576,26 @@ public class QuickLoad {
            quickLoad.notifications = Notification.restoreNotificationsFromString(c.getString(c.getColumnIndexOrThrow(Sqlite.COL_STATUSES)));
        }
        quickLoad.position = c.getInt(c.getColumnIndexOrThrow(Sqlite.COL_POSITION));

        //TimelineHelper.filterStatus(_mContext, quickLoad.statuses, TimelineHelper.FilterTimeLineType.PUBLIC);
        quickLoad.statuses = SpannableHelper.convertStatus(_mContext, quickLoad.statuses);
        return quickLoad;
    }

    /**
     * Convert a cursor to QuickLoad
     *
     * @param c Cursor
     * @return QuickLoad
     */
    private QuickLoad cursorToQuickLoad(Cursor c) {
        //No element found
        if (c.getCount() == 0) {
            c.close();
            return null;
        }
        //Take the first element
        c.moveToFirst();
        QuickLoad quickLoad = convertCursorToQuickLoad(c);
        //Close the cursor
        c.close();
        return quickLoad;
+13 −0
Original line number Diff line number Diff line
@@ -343,6 +343,19 @@ public class StatusCache {
        return reply;
    }


    public int count(BaseAccount account) throws DBException {
        if (db == null) {
            throw new DBException("db is null. Wrong initialization.");
        }
        Cursor mCount = db.rawQuery("select count(*) from " + Sqlite.TABLE_STATUS_CACHE
                + " where " + Sqlite.COL_INSTANCE + " = '" + account.instance + "' AND " + Sqlite.COL_USER_ID + " = '" + account.user_id + "'", null);
        mCount.moveToFirst();
        int count = mCount.getInt(0);
        mCount.close();
        return count;
    }

    /**
     * Convert a cursor to list of statuses
     *
Loading