mirror of
				https://codeberg.org/tom79/Fedilab.git
				synced 2025-10-20 11:20:16 +03:00 
			
		
		
		
	Improve cache
This commit is contained in:
		
							parent
							
								
									e425528648
								
							
						
					
					
						commit
						154cc63f69
					
				
					 15 changed files with 679 additions and 175 deletions
				
			
		|  | @ -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" | ||||
|  |  | |||
|  | @ -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; | ||||
|             }); | ||||
|  |  | |||
|  | @ -0,0 +1,85 @@ | |||
| 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); | ||||
|     } | ||||
| } | ||||
|  | @ -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,6 +535,52 @@ public class QuickLoad { | |||
|         quickLoad.statuses = statuses.subList(startAt, endAt); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * Restore statusDraft list from db | ||||
|      * | ||||
|      * @param c Cursor | ||||
|      * @return List<Emoji> | ||||
|      */ | ||||
|     private List<QuickLoad> cursorToQuickLoadList(Cursor c) { | ||||
|         //No element found | ||||
|         if (c.getCount() == 0) { | ||||
|             c.close(); | ||||
|             return null; | ||||
|         } | ||||
|         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)); | ||||
|         quickLoad.user_id = c.getString(c.getColumnIndexOrThrow(Sqlite.COL_USER_ID)); | ||||
|         quickLoad.slug = c.getString(c.getColumnIndexOrThrow(Sqlite.COL_SLUG)); | ||||
|         if (typeOfFetch == type.STATUSES) { | ||||
|             quickLoad.statuses = StatusDraft.restoreStatusListFromString(c.getString(c.getColumnIndexOrThrow(Sqlite.COL_STATUSES))); | ||||
|         } else if (typeOfFetch == type.NOTIFICATIONS) { | ||||
|             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 | ||||
|      * | ||||
|  | @ -524,20 +595,7 @@ public class QuickLoad { | |||
|         } | ||||
|         //Take the first element | ||||
|         c.moveToFirst(); | ||||
|         QuickLoad quickLoad = new QuickLoad(); | ||||
|         quickLoad.id = c.getInt(c.getColumnIndexOrThrow(Sqlite.COL_ID)); | ||||
|         quickLoad.instance = c.getString(c.getColumnIndexOrThrow(Sqlite.COL_INSTANCE)); | ||||
|         quickLoad.user_id = c.getString(c.getColumnIndexOrThrow(Sqlite.COL_USER_ID)); | ||||
|         quickLoad.slug = c.getString(c.getColumnIndexOrThrow(Sqlite.COL_SLUG)); | ||||
|         if (typeOfFetch == type.STATUSES) { | ||||
|             quickLoad.statuses = StatusDraft.restoreStatusListFromString(c.getString(c.getColumnIndexOrThrow(Sqlite.COL_STATUSES))); | ||||
|         } else if (typeOfFetch == type.NOTIFICATIONS) { | ||||
|             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); | ||||
|         QuickLoad quickLoad = convertCursorToQuickLoad(c); | ||||
|         //Close the cursor | ||||
|         c.close(); | ||||
|         return quickLoad; | ||||
|  |  | |||
|  | @ -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 | ||||
|      * | ||||
|  |  | |||
|  | @ -73,6 +73,7 @@ public class StatusDraft implements Serializable { | |||
|         this.db = Sqlite.getInstance(context.getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open(); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * Serialized a list of Status class | ||||
|      * | ||||
|  | @ -190,6 +191,19 @@ public class StatusDraft implements Serializable { | |||
|         return db.delete(Sqlite.TABLE_STATUS_DRAFT, Sqlite.COL_USER_ID + " = '" + BaseMainActivity.currentUserID + "' AND " + Sqlite.COL_INSTANCE + " = '" + BaseMainActivity.currentInstance + "'", null); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     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_DRAFT | ||||
|                 + " 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; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * update statusDraft in db | ||||
|      * | ||||
|  |  | |||
							
								
								
									
										197
									
								
								app/src/main/java/app/fedilab/android/helper/CacheHelper.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								app/src/main/java/app/fedilab/android/helper/CacheHelper.java
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,197 @@ | |||
| package app.fedilab.android.helper; | ||||
| /* 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 static app.fedilab.android.helper.Helper.getCurrentAccount; | ||||
| 
 | ||||
| import android.content.Context; | ||||
| import android.os.Handler; | ||||
| import android.os.Looper; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.View; | ||||
| import android.widget.LinearLayout; | ||||
| import android.widget.TextView; | ||||
| import android.widget.Toast; | ||||
| 
 | ||||
| import androidx.appcompat.app.AlertDialog; | ||||
| import androidx.appcompat.widget.SwitchCompat; | ||||
| 
 | ||||
| import java.io.File; | ||||
| import java.lang.ref.WeakReference; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| import java.util.Locale; | ||||
| import java.util.Objects; | ||||
| 
 | ||||
| import app.fedilab.android.BaseMainActivity; | ||||
| import app.fedilab.android.R; | ||||
| import app.fedilab.android.client.entities.app.BaseAccount; | ||||
| import app.fedilab.android.client.entities.app.QuickLoad; | ||||
| import app.fedilab.android.client.entities.app.StatusCache; | ||||
| import app.fedilab.android.client.entities.app.StatusDraft; | ||||
| import app.fedilab.android.exception.DBException; | ||||
| import es.dmoral.toasty.Toasty; | ||||
| 
 | ||||
| public class CacheHelper { | ||||
| 
 | ||||
|     public static void getCacheValues(Context context, Callback callback) { | ||||
|         new Thread(() -> { | ||||
|             long sizeCache = cacheSize(context.getCacheDir().getParentFile()); | ||||
|             Handler mainHandler = new Handler(Looper.getMainLooper()); | ||||
|             Runnable myRunnable = () -> callback.getCacheSize(sizeCache); | ||||
|             mainHandler.post(myRunnable); | ||||
|         }).start(); | ||||
|     } | ||||
| 
 | ||||
|     public static void getTimelineValues(Context context, BaseAccount account, CallbackAccount callbackAccount) { | ||||
|         new Thread(() -> { | ||||
|             List<Integer> count = new ArrayList<>(); | ||||
|             try { | ||||
|                 count.add(new StatusCache(context).count(account)); | ||||
|             } catch (DBException e) { | ||||
|                 e.printStackTrace(); | ||||
|             } | ||||
|             try { | ||||
|                 count.add(new QuickLoad(context).count(account)); | ||||
|             } catch (DBException e) { | ||||
|                 e.printStackTrace(); | ||||
|             } | ||||
|             try { | ||||
|                 count.add(new StatusDraft(context).count(account)); | ||||
|             } catch (DBException e) { | ||||
|                 e.printStackTrace(); | ||||
|             } | ||||
|             Handler mainHandler = new Handler(Looper.getMainLooper()); | ||||
|             Runnable myRunnable = () -> callbackAccount.getcount(count); | ||||
|             mainHandler.post(myRunnable); | ||||
|         }).start(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Retrieves the cache size | ||||
|      * | ||||
|      * @param directory File | ||||
|      * @return long value in Mo | ||||
|      */ | ||||
|     public static long cacheSize(File directory) { | ||||
|         long length = 0; | ||||
|         if (directory == null || directory.length() == 0) | ||||
|             return -1; | ||||
|         for (File file : Objects.requireNonNull(directory.listFiles())) { | ||||
|             if (file.isFile()) { | ||||
|                 try { | ||||
|                     length += file.length(); | ||||
|                 } catch (NullPointerException e) { | ||||
|                     return -1; | ||||
|                 } | ||||
|             } else { | ||||
|                 if (!file.getName().equals("databases") && !file.getName().equals("shared_prefs")) { | ||||
|                     length += cacheSize(file); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         return length; | ||||
|     } | ||||
| 
 | ||||
|     public static boolean deleteDir(File dir) { | ||||
|         if (dir != null && dir.isDirectory()) { | ||||
|             String[] children = dir.list(); | ||||
|             assert children != null; | ||||
|             for (String aChildren : children) { | ||||
|                 if (!aChildren.equals("databases") && !aChildren.equals("shared_prefs")) { | ||||
|                     boolean success = deleteDir(new File(dir, aChildren)); | ||||
|                     if (!success) { | ||||
|                         return false; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             return dir.delete(); | ||||
|         } else { | ||||
|             return dir != null && dir.isFile() && dir.delete(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     public interface Callback { | ||||
|         void getCacheSize(float size); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     public interface CallbackAccount { | ||||
|         void getcount(List<Integer> countStatuses); | ||||
|     } | ||||
| 
 | ||||
|     public static class CacheTask { | ||||
|         private final WeakReference<Context> contextReference; | ||||
|         private float cacheSize; | ||||
| 
 | ||||
|         public CacheTask(Context context) { | ||||
|             contextReference = new WeakReference<>(context); | ||||
|             doInBackground(); | ||||
|         } | ||||
| 
 | ||||
|         protected void doInBackground() { | ||||
|             new Thread(() -> { | ||||
|                 long sizeCache = cacheSize(contextReference.get().getCacheDir().getParentFile()); | ||||
|                 cacheSize = 0; | ||||
|                 if (sizeCache > 0) { | ||||
|                     cacheSize = (float) sizeCache / 1000000.0f; | ||||
|                 } | ||||
|                 Handler mainHandler = new Handler(Looper.getMainLooper()); | ||||
|                 Runnable myRunnable = () -> { | ||||
|                     AlertDialog.Builder builder = new AlertDialog.Builder(contextReference.get(), Helper.dialogStyle()); | ||||
|                     LayoutInflater inflater = ((BaseMainActivity) contextReference.get()).getLayoutInflater(); | ||||
|                     View dialogView = inflater.inflate(R.layout.popup_cache, new LinearLayout(contextReference.get()), false); | ||||
|                     TextView message = dialogView.findViewById(R.id.message); | ||||
|                     message.setText(contextReference.get().getString(R.string.cache_message, String.format("%s %s", String.format(Locale.getDefault(), "%.2f", cacheSize), contextReference.get().getString(R.string.cache_units)))); | ||||
|                     builder.setView(dialogView); | ||||
|                     builder.setTitle(R.string.cache_title); | ||||
| 
 | ||||
|                     final SwitchCompat clean_all = dialogView.findViewById(R.id.clean_all); | ||||
|                     final float finalCacheSize = cacheSize; | ||||
|                     builder | ||||
|                             .setPositiveButton(R.string.clear, (dialog, which) -> new Thread(() -> { | ||||
|                                 try { | ||||
|                                     String path = Objects.requireNonNull(contextReference.get().getCacheDir().getParentFile()).getPath(); | ||||
|                                     File dir = new File(path); | ||||
|                                     if (dir.isDirectory()) { | ||||
|                                         deleteDir(dir); | ||||
|                                     } | ||||
|                                     if (clean_all.isChecked()) { | ||||
|                                         new QuickLoad(contextReference.get()).deleteForAllAccount(); | ||||
|                                         new StatusCache(contextReference.get()).deleteForAllAccount(); | ||||
|                                     } else { | ||||
|                                         new QuickLoad(contextReference.get()).deleteForAccount(getCurrentAccount(contextReference.get())); | ||||
|                                         new StatusCache(contextReference.get()).deleteForAccount(getCurrentAccount(contextReference.get())); | ||||
|                                     } | ||||
|                                     Handler mainHandler2 = new Handler(Looper.getMainLooper()); | ||||
|                                     Runnable myRunnable2 = () -> { | ||||
|                                         Toasty.success(contextReference.get(), contextReference.get().getString(R.string.toast_cache_clear, String.format("%s %s", String.format(Locale.getDefault(), "%.2f", finalCacheSize), contextReference.get().getString(R.string.cache_units))), Toast.LENGTH_LONG).show(); | ||||
|                                         dialog.dismiss(); | ||||
|                                     }; | ||||
|                                     mainHandler2.post(myRunnable2); | ||||
|                                 } catch (Exception ignored) { | ||||
|                                 } | ||||
|                             }).start()) | ||||
|                             .setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss()) | ||||
|                             .setIcon(android.R.drawable.ic_dialog_alert) | ||||
|                             .show(); | ||||
|                 }; | ||||
|                 mainHandler.post(myRunnable); | ||||
|             }).start(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | @ -55,7 +55,6 @@ import android.provider.OpenableColumns; | |||
| import android.text.TextUtils; | ||||
| import android.util.DisplayMetrics; | ||||
| import android.util.TypedValue; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.Menu; | ||||
| import android.view.MenuItem; | ||||
| import android.view.View; | ||||
|  | @ -67,7 +66,6 @@ import android.webkit.URLUtil; | |||
| import android.webkit.WebChromeClient; | ||||
| import android.webkit.WebSettings; | ||||
| import android.widget.ImageView; | ||||
| import android.widget.LinearLayout; | ||||
| import android.widget.TextView; | ||||
| import android.widget.Toast; | ||||
| 
 | ||||
|  | @ -75,7 +73,6 @@ import androidx.annotation.IdRes; | |||
| import androidx.annotation.NonNull; | ||||
| import androidx.annotation.Nullable; | ||||
| import androidx.appcompat.app.AlertDialog; | ||||
| import androidx.appcompat.widget.SwitchCompat; | ||||
| import androidx.core.app.NotificationCompat; | ||||
| import androidx.core.app.NotificationManagerCompat; | ||||
| import androidx.core.content.ContextCompat; | ||||
|  | @ -102,7 +99,6 @@ import java.io.FileOutputStream; | |||
| import java.io.IOException; | ||||
| import java.io.InputStream; | ||||
| import java.io.OutputStream; | ||||
| import java.lang.ref.WeakReference; | ||||
| import java.net.Authenticator; | ||||
| import java.net.InetAddress; | ||||
| import java.net.InetSocketAddress; | ||||
|  | @ -133,8 +129,6 @@ import app.fedilab.android.broadcastreceiver.ToastMessage; | |||
| import app.fedilab.android.client.entities.api.Attachment; | ||||
| import app.fedilab.android.client.entities.app.Account; | ||||
| import app.fedilab.android.client.entities.app.BaseAccount; | ||||
| import app.fedilab.android.client.entities.app.QuickLoad; | ||||
| import app.fedilab.android.client.entities.app.StatusCache; | ||||
| import app.fedilab.android.exception.DBException; | ||||
| import app.fedilab.android.sqlite.Sqlite; | ||||
| import app.fedilab.android.viewmodel.mastodon.OauthVM; | ||||
|  | @ -1047,49 +1041,6 @@ public class Helper { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Retrieves the cache size | ||||
|      * | ||||
|      * @param directory File | ||||
|      * @return long value in Mo | ||||
|      */ | ||||
|     public static long cacheSize(File directory) { | ||||
|         long length = 0; | ||||
|         if (directory == null || directory.length() == 0) | ||||
|             return -1; | ||||
|         for (File file : Objects.requireNonNull(directory.listFiles())) { | ||||
|             if (file.isFile()) { | ||||
|                 try { | ||||
|                     length += file.length(); | ||||
|                 } catch (NullPointerException e) { | ||||
|                     return -1; | ||||
|                 } | ||||
|             } else { | ||||
|                 if (!file.getName().equals("databases") && !file.getName().equals("shared_prefs")) { | ||||
|                     length += cacheSize(file); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         return length; | ||||
|     } | ||||
| 
 | ||||
|     public static boolean deleteDir(File dir) { | ||||
|         if (dir != null && dir.isDirectory()) { | ||||
|             String[] children = dir.list(); | ||||
|             assert children != null; | ||||
|             for (String aChildren : children) { | ||||
|                 if (!aChildren.equals("databases") && !aChildren.equals("shared_prefs")) { | ||||
|                     boolean success = deleteDir(new File(dir, aChildren)); | ||||
|                     if (!success) { | ||||
|                         return false; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             return dir.delete(); | ||||
|         } else { | ||||
|             return dir != null && dir.isFile() && dir.delete(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public static Proxy getProxy(Context context) { | ||||
|         SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); | ||||
|  | @ -1626,64 +1577,5 @@ public class Helper { | |||
|         return currentAccount; | ||||
|     } | ||||
| 
 | ||||
|     public static class CacheTask { | ||||
|         private final WeakReference<Context> contextReference; | ||||
|         private float cacheSize; | ||||
| 
 | ||||
|         public CacheTask(Context context) { | ||||
|             contextReference = new WeakReference<>(context); | ||||
|             doInBackground(); | ||||
|         } | ||||
| 
 | ||||
|         protected void doInBackground() { | ||||
|             new Thread(() -> { | ||||
|                 long sizeCache = cacheSize(contextReference.get().getCacheDir().getParentFile()); | ||||
|                 cacheSize = 0; | ||||
|                 if (sizeCache > 0) { | ||||
|                     cacheSize = (float) sizeCache / 1000000.0f; | ||||
|                 } | ||||
|                 Handler mainHandler = new Handler(Looper.getMainLooper()); | ||||
|                 Runnable myRunnable = () -> { | ||||
|                     AlertDialog.Builder builder = new AlertDialog.Builder(contextReference.get(), Helper.dialogStyle()); | ||||
|                     LayoutInflater inflater = ((BaseMainActivity) contextReference.get()).getLayoutInflater(); | ||||
|                     View dialogView = inflater.inflate(R.layout.popup_cache, new LinearLayout(contextReference.get()), false); | ||||
|                     TextView message = dialogView.findViewById(R.id.message); | ||||
|                     message.setText(contextReference.get().getString(R.string.cache_message, String.format("%s %s", String.format(Locale.getDefault(), "%.2f", cacheSize), contextReference.get().getString(R.string.cache_units)))); | ||||
|                     builder.setView(dialogView); | ||||
|                     builder.setTitle(R.string.cache_title); | ||||
| 
 | ||||
|                     final SwitchCompat clean_all = dialogView.findViewById(R.id.clean_all); | ||||
|                     final float finalCacheSize = cacheSize; | ||||
|                     builder | ||||
|                             .setPositiveButton(R.string.clear, (dialog, which) -> new Thread(() -> { | ||||
|                                 try { | ||||
|                                     String path = Objects.requireNonNull(contextReference.get().getCacheDir().getParentFile()).getPath(); | ||||
|                                     File dir = new File(path); | ||||
|                                     if (dir.isDirectory()) { | ||||
|                                         deleteDir(dir); | ||||
|                                     } | ||||
|                                     if (clean_all.isChecked()) { | ||||
|                                         new QuickLoad(contextReference.get()).deleteForAllAccount(); | ||||
|                                         new StatusCache(contextReference.get()).deleteForAllAccount(); | ||||
|                                     } else { | ||||
|                                         new QuickLoad(contextReference.get()).deleteForAccount(getCurrentAccount(contextReference.get())); | ||||
|                                         new StatusCache(contextReference.get()).deleteForAccount(getCurrentAccount(contextReference.get())); | ||||
|                                     } | ||||
|                                     Handler mainHandler2 = new Handler(Looper.getMainLooper()); | ||||
|                                     Runnable myRunnable2 = () -> { | ||||
|                                         Toasty.success(contextReference.get(), contextReference.get().getString(R.string.toast_cache_clear, String.format("%s %s", String.format(Locale.getDefault(), "%.2f", finalCacheSize), contextReference.get().getString(R.string.cache_units))), Toast.LENGTH_LONG).show(); | ||||
|                                         dialog.dismiss(); | ||||
|                                     }; | ||||
|                                     mainHandler2.post(myRunnable2); | ||||
|                                 } catch (Exception ignored) { | ||||
|                                 } | ||||
|                             }).start()) | ||||
|                             .setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss()) | ||||
|                             .setIcon(android.R.drawable.ic_dialog_alert) | ||||
|                             .show(); | ||||
|                 }; | ||||
|                 mainHandler.post(myRunnable); | ||||
|             }).start(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,96 @@ | |||
| package app.fedilab.android.ui.drawer; | ||||
| /* 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.content.Context; | ||||
| import android.view.LayoutInflater; | ||||
| import android.view.ViewGroup; | ||||
| 
 | ||||
| import androidx.annotation.NonNull; | ||||
| import androidx.recyclerview.widget.RecyclerView; | ||||
| 
 | ||||
| import java.util.List; | ||||
| 
 | ||||
| import app.fedilab.android.activities.ProfileActivity; | ||||
| import app.fedilab.android.client.entities.app.BaseAccount; | ||||
| import app.fedilab.android.databinding.DrawerCacheBinding; | ||||
| import app.fedilab.android.helper.CacheHelper; | ||||
| import app.fedilab.android.helper.MastodonHelper; | ||||
| 
 | ||||
| 
 | ||||
| public class CacheAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { | ||||
| 
 | ||||
|     private static ProfileActivity.action doAction; | ||||
|     private final List<BaseAccount> accountList; | ||||
|     private Context context; | ||||
| 
 | ||||
|     public CacheAdapter(List<BaseAccount> accountList) { | ||||
|         this.accountList = accountList; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     public int getCount() { | ||||
|         return accountList.size(); | ||||
|     } | ||||
| 
 | ||||
|     public BaseAccount getItem(int position) { | ||||
|         return accountList.get(position); | ||||
|     } | ||||
| 
 | ||||
|     @NonNull | ||||
|     @Override | ||||
|     public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { | ||||
|         this.context = parent.getContext(); | ||||
|         DrawerCacheBinding itemBinding = DrawerCacheBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false); | ||||
|         return new AccountCacheViewHolder(itemBinding); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) { | ||||
|         BaseAccount account = accountList.get(position); | ||||
|         AccountCacheViewHolder holder = (AccountCacheViewHolder) viewHolder; | ||||
|         MastodonHelper.loadPPMastodon(holder.binding.pp, account.mastodon_account); | ||||
|         holder.binding.acct.setText(String.format("@%s@%s", account.mastodon_account.username, account.instance)); | ||||
|         holder.binding.displayName.setText(account.mastodon_account.display_name); | ||||
|         CacheHelper.getTimelineValues(context, account, countStatuses -> { | ||||
|             if (countStatuses != null && countStatuses.size() == 3) { | ||||
|                 holder.binding.homeCount.setText(String.valueOf(countStatuses.get(0))); | ||||
|                 holder.binding.otherCount.setText(String.valueOf(countStatuses.get(1))); | ||||
|                 holder.binding.draftCount.setText(String.valueOf(countStatuses.get(2))); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     public long getItemId(int position) { | ||||
|         return position; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public int getItemCount() { | ||||
|         return accountList.size(); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     public static class AccountCacheViewHolder extends RecyclerView.ViewHolder { | ||||
|         DrawerCacheBinding binding; | ||||
| 
 | ||||
|         AccountCacheViewHolder(DrawerCacheBinding itemView) { | ||||
|             super(itemView.getRoot()); | ||||
|             binding = itemView; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | @ -19,8 +19,12 @@ import android.os.Bundle; | |||
| 
 | ||||
| import androidx.preference.PreferenceFragmentCompat; | ||||
| import androidx.preference.PreferenceManager; | ||||
| import androidx.preference.PreferenceScreen; | ||||
| import androidx.preference.SeekBarPreference; | ||||
| 
 | ||||
| import app.fedilab.android.R; | ||||
| import app.fedilab.android.helper.Helper; | ||||
| import es.dmoral.toasty.Toasty; | ||||
| 
 | ||||
| public class FragmentInterfaceSettings extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener { | ||||
| 
 | ||||
|  | @ -30,8 +34,21 @@ public class FragmentInterfaceSettings extends PreferenceFragmentCompat implemen | |||
|         createPref(); | ||||
|     } | ||||
| 
 | ||||
|     boolean recreate; | ||||
|     private void createPref() { | ||||
| 
 | ||||
|         getPreferenceScreen().removeAll(); | ||||
|         addPreferencesFromResource(R.xml.pref_interface); | ||||
|         PreferenceScreen preferenceScreen = getPreferenceScreen(); | ||||
|         if (preferenceScreen == null) { | ||||
|             Toasty.error(requireActivity(), getString(R.string.toast_error), Toasty.LENGTH_SHORT).show(); | ||||
|             return; | ||||
|         } | ||||
|         SeekBarPreference SET_FONT_SCALE = findPreference(getString(R.string.SET_FONT_SCALE_INT)); | ||||
|         if (SET_FONT_SCALE != null) { | ||||
|             SET_FONT_SCALE.setMax(180); | ||||
|             SET_FONT_SCALE.setMin(80); | ||||
|         } | ||||
|         recreate = false; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|  | @ -39,7 +56,12 @@ public class FragmentInterfaceSettings extends PreferenceFragmentCompat implemen | |||
|         if (getActivity() != null) { | ||||
|             SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(requireActivity()); | ||||
|             SharedPreferences.Editor editor = sharedpreferences.edit(); | ||||
| 
 | ||||
|             if (key.compareToIgnoreCase(getString(R.string.SET_FONT_SCALE_INT)) == 0) { | ||||
|                 int progress = sharedPreferences.getInt(getString(R.string.SET_FONT_SCALE_INT), 110); | ||||
|                 float scale = (float) (progress) / 100.0f; | ||||
|                 editor.putFloat(getString(R.string.SET_FONT_SCALE), scale); | ||||
|                 recreate = true; | ||||
|             } | ||||
|             editor.apply(); | ||||
|         } | ||||
|     } | ||||
|  | @ -57,6 +79,11 @@ public class FragmentInterfaceSettings extends PreferenceFragmentCompat implemen | |||
|         super.onPause(); | ||||
|         getPreferenceScreen().getSharedPreferences() | ||||
|                 .unregisterOnSharedPreferenceChangeListener(this); | ||||
|         if (recreate) { | ||||
|             recreate = false; | ||||
|             requireActivity().recreate(); | ||||
|             Helper.recreateMainActivity(requireActivity()); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										40
									
								
								app/src/main/res/layout/activity_cache.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								app/src/main/res/layout/activity_cache.xml
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,40 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="match_parent" | ||||
|     android:layout_margin="@dimen/fab_margin"> | ||||
| 
 | ||||
|     <com.google.android.material.checkbox.MaterialCheckBox | ||||
|         android:id="@+id/label_file_cache" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_marginTop="10dp" | ||||
|         android:checked="true" | ||||
|         android:text="@string/files_cache_size" | ||||
|         app:buttonTint="@color/cyanea_accent_dark_reference" | ||||
|         app:layout_constraintStart_toStartOf="parent" | ||||
|         app:layout_constraintTop_toTopOf="parent" /> | ||||
| 
 | ||||
|     <androidx.appcompat.widget.AppCompatTextView | ||||
|         android:id="@+id/file_cache_size" | ||||
|         android:layout_width="100dp" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_marginTop="10dp" | ||||
|         android:gravity="center" | ||||
|         android:textSize="18sp" | ||||
|         app:layout_constraintBottom_toBottomOf="@+id/label_file_cache" | ||||
|         app:layout_constraintEnd_toEndOf="parent" | ||||
|         app:layout_constraintTop_toTopOf="@+id/label_file_cache" | ||||
|         tools:text="105 Mb" /> | ||||
| 
 | ||||
|     <androidx.recyclerview.widget.RecyclerView | ||||
|         android:id="@+id/cache_recyclerview" | ||||
|         android:layout_width="match_parent" | ||||
|         android:layout_height="0dp" | ||||
|         app:layout_constraintBottom_toBottomOf="parent" | ||||
|         app:layout_constraintEnd_toEndOf="parent" | ||||
|         app:layout_constraintStart_toStartOf="parent" | ||||
|         app:layout_constraintTop_toBottomOf="@+id/label_file_cache" /> | ||||
| </androidx.constraintlayout.widget.ConstraintLayout> | ||||
							
								
								
									
										108
									
								
								app/src/main/res/layout/drawer_cache.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								app/src/main/res/layout/drawer_cache.xml
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,108 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | ||||
| <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||
|     xmlns:app="http://schemas.android.com/apk/res-auto" | ||||
|     xmlns:tools="http://schemas.android.com/tools" | ||||
|     android:layout_width="match_parent" | ||||
|     android:layout_height="wrap_content"> | ||||
| 
 | ||||
|     <androidx.appcompat.widget.AppCompatImageView | ||||
|         android:id="@+id/pp" | ||||
|         android:layout_width="50dp" | ||||
|         android:layout_height="50dp" | ||||
|         android:scaleType="centerCrop" | ||||
|         app:layout_constraintStart_toStartOf="parent" | ||||
|         app:layout_constraintTop_toTopOf="parent" | ||||
|         tools:src="@tools:sample/avatars" /> | ||||
| 
 | ||||
|     <androidx.appcompat.widget.AppCompatTextView | ||||
|         android:id="@+id/display_name" | ||||
|         android:layout_width="0dp" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_marginStart="10dp" | ||||
|         android:maxLines="1" | ||||
|         android:textSize="18sp" | ||||
|         app:layout_constraintStart_toEndOf="@+id/pp" | ||||
|         app:layout_constraintTop_toTopOf="@+id/pp" | ||||
|         tools:text="@tools:sample/full_names" /> | ||||
| 
 | ||||
|     <androidx.appcompat.widget.AppCompatTextView | ||||
|         android:id="@+id/acct" | ||||
|         android:layout_width="0dp" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_marginStart="10dp" | ||||
|         android:layout_marginTop="5dp" | ||||
|         android:maxLines="1" | ||||
|         android:textSize="16sp" | ||||
|         app:layout_constraintStart_toEndOf="@+id/pp" | ||||
|         app:layout_constraintTop_toBottomOf="@+id/display_name" | ||||
|         tools:text="@tools:sample/last_names" /> | ||||
| 
 | ||||
|     <com.google.android.material.checkbox.MaterialCheckBox | ||||
|         android:id="@+id/label_home_timeline_cache_count" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_marginTop="10dp" | ||||
|         android:checked="true" | ||||
|         android:text="@string/messages_in_cache_for_home" | ||||
|         app:buttonTint="@color/cyanea_accent_dark_reference" | ||||
|         app:layout_constraintStart_toStartOf="parent" | ||||
|         app:layout_constraintTop_toBottomOf="@+id/pp" /> | ||||
| 
 | ||||
|     <androidx.appcompat.widget.AppCompatTextView | ||||
|         android:id="@+id/home_count" | ||||
|         android:layout_width="50dp" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_marginTop="10dp" | ||||
|         android:gravity="center" | ||||
|         android:textSize="18sp" | ||||
|         app:layout_constraintBottom_toBottomOf="@+id/label_home_timeline_cache_count" | ||||
|         app:layout_constraintEnd_toEndOf="parent" | ||||
|         app:layout_constraintTop_toTopOf="@+id/label_home_timeline_cache_count" | ||||
|         tools:text="50" /> | ||||
| 
 | ||||
|     <com.google.android.material.checkbox.MaterialCheckBox | ||||
|         android:id="@+id/label_timelines_cache_count" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_marginTop="10dp" | ||||
|         android:checked="true" | ||||
|         android:text="@string/messages_in_cache_for_other_timelines" | ||||
|         app:buttonTint="@color/cyanea_accent_dark_reference" | ||||
|         app:layout_constraintStart_toStartOf="parent" | ||||
|         app:layout_constraintTop_toBottomOf="@+id/label_home_timeline_cache_count" /> | ||||
| 
 | ||||
|     <androidx.appcompat.widget.AppCompatTextView | ||||
|         android:id="@+id/other_count" | ||||
|         android:layout_width="50dp" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_marginTop="10dp" | ||||
|         android:gravity="center" | ||||
|         android:textSize="18sp" | ||||
|         app:layout_constraintBottom_toBottomOf="@+id/label_timelines_cache_count" | ||||
|         app:layout_constraintEnd_toEndOf="parent" | ||||
|         app:layout_constraintTop_toTopOf="@+id/label_timelines_cache_count" | ||||
|         tools:text="150" /> | ||||
| 
 | ||||
|     <com.google.android.material.checkbox.MaterialCheckBox | ||||
|         android:id="@+id/label_drafts_count" | ||||
|         android:layout_width="wrap_content" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_marginTop="10dp" | ||||
|         android:checked="false" | ||||
|         android:text="@string/messages_stored_in_drafts" | ||||
|         app:buttonTint="@color/cyanea_accent_dark_reference" | ||||
|         app:layout_constraintStart_toStartOf="parent" | ||||
|         app:layout_constraintTop_toBottomOf="@+id/label_timelines_cache_count" /> | ||||
| 
 | ||||
|     <androidx.appcompat.widget.AppCompatTextView | ||||
|         android:id="@+id/draft_count" | ||||
|         android:layout_width="50dp" | ||||
|         android:layout_height="wrap_content" | ||||
|         android:layout_marginTop="10dp" | ||||
|         android:gravity="center" | ||||
|         android:textSize="18sp" | ||||
|         app:layout_constraintBottom_toBottomOf="@+id/label_drafts_count" | ||||
|         app:layout_constraintEnd_toEndOf="parent" | ||||
|         app:layout_constraintTop_toTopOf="@+id/label_drafts_count" | ||||
|         tools:text="49" /> | ||||
| </androidx.constraintlayout.widget.ConstraintLayout> | ||||
|  | @ -13,10 +13,6 @@ | |||
|         android:id="@+id/action_proxy" | ||||
|         android:title="@string/proxy_set" | ||||
|         app:showAsAction="never" /> | ||||
|     <item | ||||
|         android:id="@+id/action_size" | ||||
|         android:title="@string/text_size" | ||||
|         app:showAsAction="never" /> | ||||
|     <item | ||||
|         android:id="@+id/action_logout_account" | ||||
|         android:title="@string/action_logout_account" | ||||
|  |  | |||
|  | @ -1501,6 +1501,7 @@ | |||
|     <string name="SET_NOTIF_MEDIA" translatable="false">SET_NOTIF_MEDIA</string> | ||||
|     <string name="SET_NOTIF_STATUS" translatable="false">SET_NOTIF_STATUS</string> | ||||
|     <string name="SET_FONT_SCALE" translatable="false">SET_FONT_SCALE</string> | ||||
|     <string name="SET_FONT_SCALE_INT" translatable="false">SET_FONT_SCALE_INT</string> | ||||
|     <string name="SET_NOTIF_FOLLOW_FILTER" translatable="false">SET_NOTIF_FOLLOW_FILTER</string> | ||||
|     <string name="SET_NOTIF_ADD_FILTER" translatable="false">SET_NOTIF_ADD_FILTER</string> | ||||
|     <string name="SET_NOTIF_MENTION_FILTER" translatable="false">SET_NOTIF_MENTION_FILTER</string> | ||||
|  | @ -1627,6 +1628,13 @@ | |||
|     <string name="msg_share_image">Share Image</string> | ||||
|     <string name="tap_here_to_refresh_poll">Tap here to refresh poll</string> | ||||
|     <string name="action_announcement_from_to">Announcement · %1$s - %2$s</string> | ||||
|     <string name="delete_cache">Delete cache</string> | ||||
|     <string name="messages_in_cache_for_home">Messages in cache for Home</string> | ||||
|     <string name="messages_in_cache_for_other_timelines">Messages in cache for other timelines</string> | ||||
|     <string name="messages_stored_in_drafts">Messages stored in drafts</string> | ||||
|     <string name="built_in_browser_cache">Built-in browser cache</string> | ||||
|     <string name="files_cache">Fiiles cache</string> | ||||
|     <string name="files_cache_size">File cache size</string> | ||||
| 
 | ||||
|     <string-array name="photo_editor_emoji" translatable="false"> | ||||
|         <!--  Smiles  --> | ||||
|  |  | |||
|  | @ -34,6 +34,14 @@ | |||
|         app:summary="@string/set_enable_crash_report_indication" | ||||
|         app:title="@string/set_enable_crash_report" /> | ||||
| 
 | ||||
|     <androidx.preference.SeekBarPreference | ||||
|         android:defaultValue="110" | ||||
|         android:max="180" | ||||
|         app:iconSpaceReserved="false" | ||||
|         app:key="@string/SET_FONT_SCALE_INT" | ||||
|         app:showSeekBarValue="true" | ||||
|         app:title="@string/text_size" /> | ||||
| 
 | ||||
|     <androidx.preference.SeekBarPreference | ||||
|         android:defaultValue="100" | ||||
|         android:max="1000" | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue