mirror of
https://codeberg.org/gitnex/GitNex.git
synced 2024-12-16 15:48:13 +08:00
Clear cache, configure cache size (#482)
decrease the compression to have better results Move cache size outside of maxsize method. fix progress bar alignment for files Add cache size to picasso Use getAbsolutePath Merge branch 'app-cache' of gitea.com:gitnex/GitNex into app-cache Few imprvoements Merge branch 'master' into app-cache small improvement Implement configure cache size and clear it Co-authored-by: 6543 <6543@noreply.gitea.io> Reviewed-on: https://gitea.com/gitnex/GitNex/pulls/482 Reviewed-by: opyale <opyale@noreply.gitea.io>
This commit is contained in:
parent
a6b424f5ff
commit
ab8a5ed505
@ -95,6 +95,14 @@ public abstract class BaseActivity extends AppCompatActivity {
|
||||
tinyDb.putString("crashReportingEnabledInit", "yes");
|
||||
}
|
||||
|
||||
// default cache setter
|
||||
if(tinyDb.getString("cacheSizeStr").isEmpty()) {
|
||||
tinyDb.putString("cacheSizeStr", getResources().getString(R.string.cacheSizeDataSelectionSelectedText));
|
||||
}
|
||||
if(tinyDb.getString("cacheSizeImagesStr").isEmpty()) {
|
||||
tinyDb.putString("cacheSizeImagesStr", getResources().getString(R.string.cacheSizeImagesSelectionSelectedText));
|
||||
}
|
||||
|
||||
if (tinyDb.getBoolean("crashReportingEnabled")) {
|
||||
|
||||
CoreConfigurationBuilder ACRABuilder = new CoreConfigurationBuilder(this);
|
||||
|
@ -3,13 +3,22 @@ package org.mian.gitnex.activities;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.mian.gitnex.R;
|
||||
import org.mian.gitnex.helpers.FilesData;
|
||||
import org.mian.gitnex.helpers.Toasty;
|
||||
import org.mian.gitnex.helpers.ssl.MemorizingTrustManager;
|
||||
import org.mian.gitnex.util.AppUtil;
|
||||
import org.mian.gitnex.util.TinyDB;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.HashSet;
|
||||
|
||||
/**
|
||||
* Author M M Arif
|
||||
@ -20,6 +29,12 @@ public class SettingsSecurityActivity extends BaseActivity {
|
||||
private Context appCtx;
|
||||
private View.OnClickListener onClickListener;
|
||||
|
||||
private static String[] cacheSizeDataList = {"50 MB", "100 MB", "250 MB", "500 MB", "1 GB"};
|
||||
private static int cacheSizeDataSelectedChoice = 0;
|
||||
|
||||
private static String[] cacheSizeImagesList = {"50 MB", "100 MB", "250 MB", "500 MB", "1 GB"};
|
||||
private static int cacheSizeImagesSelectedChoice = 0;
|
||||
|
||||
@Override
|
||||
protected int getLayoutResourceId() {
|
||||
|
||||
@ -39,7 +54,127 @@ public class SettingsSecurityActivity extends BaseActivity {
|
||||
initCloseListener();
|
||||
closeActivity.setOnClickListener(onClickListener);
|
||||
|
||||
TextView cacheSizeDataSelected = findViewById(R.id.cacheSizeDataSelected); // setter for data cache size
|
||||
TextView cacheSizeImagesSelected = findViewById(R.id.cacheSizeImagesSelected); // setter for images cache size
|
||||
TextView clearCacheSelected = findViewById(R.id.clearCacheSelected); // setter for clear cache
|
||||
|
||||
LinearLayout certsFrame = findViewById(R.id.certsFrame);
|
||||
LinearLayout cacheSizeDataFrame = findViewById(R.id.cacheSizeDataSelectionFrame);
|
||||
LinearLayout cacheSizeImagesFrame = findViewById(R.id.cacheSizeImagesSelectionFrame);
|
||||
LinearLayout clearCacheFrame = findViewById(R.id.clearCacheSelectionFrame);
|
||||
|
||||
if(!tinyDb.getString("cacheSizeStr").isEmpty()) {
|
||||
cacheSizeDataSelected.setText(tinyDb.getString("cacheSizeStr"));
|
||||
}
|
||||
|
||||
if(!tinyDb.getString("cacheSizeImagesStr").isEmpty()) {
|
||||
cacheSizeImagesSelected.setText(tinyDb.getString("cacheSizeImagesStr"));
|
||||
}
|
||||
|
||||
if(cacheSizeDataSelectedChoice == 0) {
|
||||
cacheSizeDataSelectedChoice = tinyDb.getInt("cacheSizeId");
|
||||
}
|
||||
|
||||
if(cacheSizeImagesSelectedChoice == 0) {
|
||||
cacheSizeImagesSelectedChoice = tinyDb.getInt("cacheSizeImagesId");
|
||||
}
|
||||
|
||||
// clear cache setter
|
||||
File cacheDir = appCtx.getCacheDir();
|
||||
long size__ = FilesData.getFileSizeRecursively(new HashSet<>(), cacheDir);
|
||||
if(size__ > 0) {
|
||||
clearCacheSelected.setText(String.valueOf(AppUtil.formatFileSizeInDetail(size__)));
|
||||
}
|
||||
|
||||
// clear cache
|
||||
clearCacheFrame.setOnClickListener(v1 -> {
|
||||
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(SettingsSecurityActivity.this);
|
||||
|
||||
builder.setTitle(getResources().getString(R.string.clearCacheDialogHeader));
|
||||
builder.setMessage(getResources().getString(R.string.clearCacheDialogMessage));
|
||||
builder.setPositiveButton(R.string.menuDeleteText, (dialog, which) -> {
|
||||
|
||||
try {
|
||||
|
||||
FileUtils.deleteDirectory(cacheDir);
|
||||
FileUtils.mkdir(cacheDir.getAbsolutePath());
|
||||
this.recreate();
|
||||
this.overridePendingTransition(0, 0);
|
||||
|
||||
}
|
||||
catch (IOException e) {
|
||||
|
||||
Log.e("SettingsSecurity", e.toString());
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
builder.setNeutralButton(R.string.cancelButton, (dialog, which) -> dialog.dismiss());
|
||||
builder.create().show();
|
||||
|
||||
});
|
||||
|
||||
// cache size images selection dialog
|
||||
cacheSizeImagesFrame.setOnClickListener(view -> {
|
||||
|
||||
AlertDialog.Builder tsBuilder = new AlertDialog.Builder(SettingsSecurityActivity.this);
|
||||
|
||||
tsBuilder.setTitle(getResources().getString(R.string.cacheSizeImagesDialogHeader));
|
||||
if(cacheSizeImagesSelectedChoice != -1) {
|
||||
tsBuilder.setCancelable(true);
|
||||
}
|
||||
else {
|
||||
tsBuilder.setCancelable(false);
|
||||
}
|
||||
|
||||
tsBuilder.setSingleChoiceItems(cacheSizeImagesList, cacheSizeImagesSelectedChoice, (dialogInterfaceTheme, i) -> {
|
||||
|
||||
cacheSizeImagesSelectedChoice = i;
|
||||
cacheSizeImagesSelected.setText(cacheSizeImagesList[i]);
|
||||
tinyDb.putString("cacheSizeImagesStr", cacheSizeImagesList[i]);
|
||||
tinyDb.putInt("cacheSizeImagesId", i);
|
||||
|
||||
dialogInterfaceTheme.dismiss();
|
||||
Toasty.info(appCtx, getResources().getString(R.string.settingsSave));
|
||||
|
||||
});
|
||||
|
||||
AlertDialog cfDialog = tsBuilder.create();
|
||||
cfDialog.show();
|
||||
|
||||
});
|
||||
|
||||
// cache size data selection dialog
|
||||
cacheSizeDataFrame.setOnClickListener(view -> {
|
||||
|
||||
AlertDialog.Builder tsBuilder = new AlertDialog.Builder(SettingsSecurityActivity.this);
|
||||
|
||||
tsBuilder.setTitle(getResources().getString(R.string.cacheSizeDataDialogHeader));
|
||||
if(cacheSizeDataSelectedChoice != -1) {
|
||||
tsBuilder.setCancelable(true);
|
||||
}
|
||||
else {
|
||||
tsBuilder.setCancelable(false);
|
||||
}
|
||||
|
||||
tsBuilder.setSingleChoiceItems(cacheSizeDataList, cacheSizeDataSelectedChoice, (dialogInterfaceTheme, i) -> {
|
||||
|
||||
cacheSizeDataSelectedChoice = i;
|
||||
cacheSizeDataSelected.setText(cacheSizeDataList[i]);
|
||||
tinyDb.putString("cacheSizeStr", cacheSizeDataList[i]);
|
||||
tinyDb.putInt("cacheSizeId", i);
|
||||
|
||||
dialogInterfaceTheme.dismiss();
|
||||
Toasty.info(appCtx, getResources().getString(R.string.settingsSave));
|
||||
|
||||
});
|
||||
|
||||
AlertDialog cfDialog = tsBuilder.create();
|
||||
cfDialog.show();
|
||||
|
||||
});
|
||||
|
||||
// certs deletion
|
||||
certsFrame.setOnClickListener(v1 -> {
|
||||
|
@ -2,8 +2,10 @@ package org.mian.gitnex.clients;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.Log;
|
||||
import org.mian.gitnex.helpers.FilesData;
|
||||
import org.mian.gitnex.helpers.ssl.MemorizingTrustManager;
|
||||
import org.mian.gitnex.util.AppUtil;
|
||||
import org.mian.gitnex.util.TinyDB;
|
||||
import java.io.File;
|
||||
import java.security.SecureRandom;
|
||||
import javax.net.ssl.HttpsURLConnection;
|
||||
@ -24,9 +26,10 @@ public class AppApiService {
|
||||
|
||||
public static <S> S createService(Class<S> serviceClass, String instanceURL, Context ctx) {
|
||||
|
||||
TinyDB tinyDb = new TinyDB(ctx);
|
||||
final boolean connToInternet = AppUtil.haveNetworkConnection(ctx);
|
||||
File httpCacheDirectory = new File(ctx.getCacheDir(), "responses");
|
||||
int cacheSize = 50 * 1024 * 1024; // 50MB
|
||||
int cacheSize = FilesData.returnOnlyNumber(tinyDb.getString("cacheSizeStr")) * 1024 * 1024;
|
||||
Cache cache = new Cache(httpCacheDirectory, cacheSize);
|
||||
|
||||
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
|
||||
|
@ -49,7 +49,7 @@ public class PicassoService {
|
||||
//noinspection ResultOfMethodCallIgnored
|
||||
cachePath.mkdirs();
|
||||
|
||||
picasso = builder.memoryCache(new PicassoCache(cachePath)).build();
|
||||
picasso = builder.memoryCache(new PicassoCache(cachePath, context)).build();
|
||||
|
||||
}
|
||||
catch(Exception e) {
|
||||
|
@ -2,10 +2,12 @@ package org.mian.gitnex.clients;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.Log;
|
||||
import org.mian.gitnex.helpers.FilesData;
|
||||
import org.mian.gitnex.helpers.ssl.MemorizingTrustManager;
|
||||
import org.mian.gitnex.interfaces.ApiInterface;
|
||||
import org.mian.gitnex.interfaces.WebInterface;
|
||||
import org.mian.gitnex.util.AppUtil;
|
||||
import org.mian.gitnex.util.TinyDB;
|
||||
import java.io.File;
|
||||
import java.security.SecureRandom;
|
||||
import javax.net.ssl.HttpsURLConnection;
|
||||
@ -29,8 +31,9 @@ public class RetrofitClient {
|
||||
|
||||
private RetrofitClient(String instanceUrl, Context ctx) {
|
||||
|
||||
TinyDB tinyDb = new TinyDB(ctx);
|
||||
final boolean connToInternet = AppUtil.haveNetworkConnection(ctx);
|
||||
int cacheSize = 50 * 1024 * 1024; // 50MB
|
||||
int cacheSize = FilesData.returnOnlyNumber(tinyDb.getString("cacheSizeStr")) * 1024 * 1024;
|
||||
File httpCacheDirectory = new File(ctx.getCacheDir(), "responses");
|
||||
Cache cache = new Cache(httpCacheDirectory, cacheSize);
|
||||
|
||||
|
84
app/src/main/java/org/mian/gitnex/helpers/FilesData.java
Normal file
84
app/src/main/java/org/mian/gitnex/helpers/FilesData.java
Normal file
@ -0,0 +1,84 @@
|
||||
package org.mian.gitnex.helpers;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayDeque;
|
||||
import java.util.Deque;
|
||||
import java.util.HashSet;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Author M M Arif
|
||||
*/
|
||||
|
||||
public class FilesData {
|
||||
|
||||
public static int returnOnlyNumber(String fileSize) {
|
||||
|
||||
return Integer.parseInt(fileSize.substring(0, fileSize.indexOf(" ")));
|
||||
|
||||
}
|
||||
|
||||
public static long getFileSizeRecursively(Set<File> alreadySeen, File dirDirectory) {
|
||||
|
||||
long fileSize = 0;
|
||||
|
||||
for (File filItem : Objects.requireNonNull(dirDirectory.listFiles())) {
|
||||
|
||||
if (filItem.isDirectory()) {
|
||||
|
||||
fileSize += getFileSize(filItem);
|
||||
|
||||
}
|
||||
else {
|
||||
|
||||
alreadySeen.add(new File(filItem.getName()));
|
||||
fileSize += filItem.length();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return fileSize;
|
||||
|
||||
}
|
||||
|
||||
private static long getFileSize(File subDirectory) {
|
||||
|
||||
long fileSize = 0;
|
||||
|
||||
Deque<File> unprocessedDirs = new ArrayDeque<>();
|
||||
unprocessedDirs.add(subDirectory);
|
||||
Set<File> alreadySeen = new HashSet<>();
|
||||
|
||||
while (!unprocessedDirs.isEmpty()) {
|
||||
|
||||
File dir = unprocessedDirs.removeFirst();
|
||||
|
||||
for (File filItem : Objects.requireNonNull(dir.listFiles())) {
|
||||
|
||||
if (filItem.isDirectory()) {
|
||||
|
||||
unprocessedDirs.addFirst(filItem);
|
||||
|
||||
}
|
||||
else {
|
||||
|
||||
if (! alreadySeen.contains(filItem.getName())) {
|
||||
|
||||
alreadySeen.add(new File(filItem.getName()));
|
||||
fileSize += filItem.length();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return fileSize;
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -1,9 +1,11 @@
|
||||
package org.mian.gitnex.helpers;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.util.Log;
|
||||
import com.squareup.picasso.Cache;
|
||||
import org.mian.gitnex.util.TinyDB;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
@ -20,21 +22,26 @@ import java.util.UUID;
|
||||
|
||||
public class PicassoCache implements Cache {
|
||||
|
||||
private Context ctx;
|
||||
private String TAG = "PicassoCache";
|
||||
|
||||
private static final Bitmap.CompressFormat COMPRESS_FORMAT = Bitmap.CompressFormat.PNG;
|
||||
private static final int COMPRESSION_QUALITY = 0; // 0 = high compression (low file size) | 100 = no compression
|
||||
private static final int COMPRESSION_QUALITY = 50; // 0 = high compression (low file size) | 100 = no compression
|
||||
private final int CACHE_SIZE;
|
||||
|
||||
private static final String CACHE_MAP_FILE = "cacheMap";
|
||||
private static final int CACHE_SIZE = 25 * 1024 * 1024; // Cache can hold twenty-five megabytes
|
||||
|
||||
private File cachePath;
|
||||
private HashMap<String, String> cacheMap;
|
||||
|
||||
public PicassoCache(File cachePath) throws IOException, ClassNotFoundException {
|
||||
public PicassoCache(File cachePath, Context ctx) throws IOException, ClassNotFoundException {
|
||||
|
||||
TinyDB tinyDb = new TinyDB(ctx);
|
||||
|
||||
CACHE_SIZE = FilesData.returnOnlyNumber(tinyDb.getString("cacheSizeImagesStr")) * 1024 * 1024;
|
||||
this.cachePath = cachePath;
|
||||
cacheMap = new HashMap<>();
|
||||
this.ctx = ctx;
|
||||
|
||||
if(cacheMapExists(cachePath)) {
|
||||
|
||||
|
@ -66,4 +66,94 @@
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/cacheSizeDataSelectionFrame"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="15dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/cacheSizeDataHeaderSelector"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="16sp"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_marginStart="44dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:text="@string/cacheSizeDataSelectionHeaderText"
|
||||
android:textColor="?attr/primaryTextColor"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/cacheSizeDataSelected"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="14sp"
|
||||
android:layout_marginStart="44dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:text="@string/cacheSizeDataSelectionSelectedText"
|
||||
android:textColor="?attr/selectedTextColor"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/cacheSizeImagesSelectionFrame"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="15dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/cacheSizeImagesHeaderSelector"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="16sp"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_marginStart="44dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:text="@string/cacheSizeImagesSelectionHeaderText"
|
||||
android:textColor="?attr/primaryTextColor"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/cacheSizeImagesSelected"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="14sp"
|
||||
android:layout_marginStart="44dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:text="@string/cacheSizeImagesSelectionSelectedText"
|
||||
android:textColor="?attr/selectedTextColor"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/clearCacheSelectionFrame"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="15dp"
|
||||
android:orientation="vertical">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/clearCacheHeaderSelector"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="16sp"
|
||||
android:layout_marginTop="10dp"
|
||||
android:layout_marginStart="44dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:text="@string/clearCacheSelectionHeaderText"
|
||||
android:textColor="?attr/primaryTextColor"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/clearCacheSelected"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:textSize="14sp"
|
||||
android:layout_marginStart="44dp"
|
||||
android:layout_marginEnd="24dp"
|
||||
android:text="@string/clearCacheSelectionSelectedText"
|
||||
android:textColor="?attr/selectedTextColor"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
@ -54,8 +54,8 @@
|
||||
android:id="@+id/progress_bar"
|
||||
style="@style/Base.Widget.AppCompat.ProgressBar"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_centerInParent="true"
|
||||
android:indeterminate="true"
|
||||
android:visibility="gone" />
|
||||
|
||||
|
@ -288,6 +288,16 @@
|
||||
<string name="settingsFileviewerSourceCodeHeaderText">Source Code Theme</string>
|
||||
<string name="settingsFileviewerSourceCodeSelectedText" translatable="false">Sublime</string>
|
||||
<string name="fileviewerSourceCodeThemeSelectorDialogTitle">Select Source Code Theme</string>
|
||||
<string name="cacheSizeDataDialogHeader">Data Cache Size</string>
|
||||
<string name="cacheSizeDataSelectionHeaderText">Data Cache Size</string>
|
||||
<string name="cacheSizeDataSelectionSelectedText" translatable="false">50 MB</string>
|
||||
<string name="cacheSizeImagesDialogHeader">Images Cache Size</string>
|
||||
<string name="cacheSizeImagesSelectionHeaderText">Images Cache Size</string>
|
||||
<string name="cacheSizeImagesSelectionSelectedText" translatable="false">50 MB</string>
|
||||
<string name="clearCacheSelectionHeaderText">Clear Cache</string>
|
||||
<string name="clearCacheSelectionSelectedText" translatable="false">0 B</string>
|
||||
<string name="clearCacheDialogHeader">Clear Cache?</string>
|
||||
<string name="clearCacheDialogMessage">This will delete all the cache data including files and images.\n\nProceed with deletion?</string>
|
||||
<!-- settings -->
|
||||
|
||||
<string name="noMoreData">No more data available</string>
|
||||
@ -635,7 +645,7 @@
|
||||
|
||||
<string name="appreanceHintText">Themes, fonts, badges, code block theme</string>
|
||||
<string name="fileViewerHintText">PDF mode, source code theme</string>
|
||||
<string name="securityHintText">SSL certificates</string>
|
||||
<string name="securityHintText">SSL certificates, cache</string>
|
||||
<string name="languagesHintText">Languages</string>
|
||||
<string name="reportsHintText">Crash reports</string>
|
||||
</resources>
|
||||
|
Loading…
Reference in New Issue
Block a user