Loading app/src/main/AndroidManifest.xml +5 −0 Original line number Diff line number Diff line Loading @@ -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" Loading app/src/main/java/app/fedilab/android/BaseMainActivity.java +4 −47 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; }); Loading app/src/main/java/app/fedilab/android/activities/CacheActivity.java 0 → 100644 +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); } } app/src/main/java/app/fedilab/android/client/entities/app/QuickLoad.java +64 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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)); Loading @@ -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; Loading app/src/main/java/app/fedilab/android/client/entities/app/StatusCache.java +13 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
app/src/main/AndroidManifest.xml +5 −0 Original line number Diff line number Diff line Loading @@ -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" Loading
app/src/main/java/app/fedilab/android/BaseMainActivity.java +4 −47 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; }); Loading
app/src/main/java/app/fedilab/android/activities/CacheActivity.java 0 → 100644 +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); } }
app/src/main/java/app/fedilab/android/client/entities/app/QuickLoad.java +64 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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)); Loading @@ -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; Loading
app/src/main/java/app/fedilab/android/client/entities/app/StatusCache.java +13 −0 Original line number Diff line number Diff line Loading @@ -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