1
0
mirror of https://github.com/foobnix/LibreraReader.git synced 2025-10-06 00:02:43 +02:00

refactoring

This commit is contained in:
Ivan Ivanenko
2025-08-06 14:26:15 +03:00
parent e546e0f8b9
commit db7cd14428
64 changed files with 75 additions and 600 deletions

View File

@@ -287,13 +287,13 @@ android {
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
proImplementation project(':pro')
fdroidImplementation project(':pro')
implementation project(':smartreflow')
proImplementation project(':libPro')
fdroidImplementation project(':libPro')
implementation project(':libReflow')
//compose
implementation 'androidx.compose.ui:ui'
implementation project(":googleDrive")
implementation project(':appLibDrive')
/** AndroidX **/

View File

@@ -1,5 +1,5 @@
#Mon Jul 14 12:33:06 EEST 2025
appCodeNumber=6346
#Wed Aug 06 14:01:27 EEST 2025
appCodeNumber=6350
appDB=8
appVersionNumberBase=9.0
appVersionNumberIndex=17
appVersionNumberIndex=18

View File

@@ -86,7 +86,7 @@ public class Fb2Extractor extends BaseExtractor {
" \n" + //
" </navMap>\n" + //
"</ncx>";//
public static Map<Integer, String> epub3Pages = new HashMap();
public static Map<Integer, String> epub3Pages = new HashMap<>();
static Fb2Extractor inst = new Fb2Extractor();
static Pattern pattern = Pattern.compile("<a id=\"page(\\d+)\"");
public Map<String, String> genresRus = new HashMap<>();
@@ -293,8 +293,8 @@ public class Fb2Extractor extends BaseExtractor {
}
boolean isProcess = AppState.get().isEnableTextReplacement ||
(BookCSS.get().isAutoHypens && TxtUtils.isNotEmpty(AppSP.get().hypenLang));
boolean isProcess = AppState.get().isEnableTextReplacement ||
(BookCSS.get().isAutoHypens && TxtUtils.isNotEmpty(AppSP.get().hypenLang));
if (isProcess) {
line = HypenUtils.applyHypnes(line, replacements);
}

View File

@@ -17,6 +17,7 @@ import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestManager;
@@ -25,6 +26,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import com.foobnix.LibreraApp;
import com.foobnix.android.utils.Dips;
import com.foobnix.android.utils.LOG;
import com.foobnix.model.AppState;
@@ -33,8 +35,6 @@ import com.foobnix.pdf.search.activity.HorizontalViewActivity;
import com.foobnix.sys.ImageExtractor;
import com.foobnix.ui2.MainTabs2;
import com.foobnix.LibreraApp;
import org.ebookdroid.ui.viewer.VerticalViewActivity;
import java.util.regex.Pattern;
@@ -56,8 +56,8 @@ public class IMG {
IMG.context = context;
bookBGWithMark = context.getResources().getDrawable(R.drawable.bookeffect2);
bookBGNoMark = context.getResources().getDrawable(R.drawable.bookeffect1);
bookBGWithMark = ContextCompat.getDrawable(context, R.drawable.bookeffect2);
bookBGNoMark = ContextCompat.getDrawable(context, R.drawable.bookeffect1);
}

View File

@@ -1804,13 +1804,13 @@ public class DragingDialogs {
public void onClick(View v) {
PopupMenu menu = new PopupMenu(v.getContext(), v);
Drawable highlight = controller.getActivity().getResources().getDrawable(R.drawable.glyphicons_695_text_background);
Drawable highlight = controller.getDrawable(R.drawable.glyphicons_695_text_background);
highlight.setColorFilter(Color.parseColor(AppState.get().annotationTextColor), Mode.SRC_ATOP);
Drawable underline = controller.getActivity().getResources().getDrawable(R.drawable.glyphicons_104_underline);
Drawable underline = controller.getDrawable(R.drawable.glyphicons_104_underline);
underline.setColorFilter(Color.parseColor(AppState.get().annotationTextColor), Mode.SRC_ATOP);
Drawable strikeout = controller.getActivity().getResources().getDrawable(R.drawable.glyphicons_105_strikethrough);
Drawable strikeout = controller.getDrawable(R.drawable.glyphicons_105_strikethrough);
strikeout.setColorFilter(Color.parseColor(AppState.get().annotationTextColor), Mode.SRC_ATOP);
menu.getMenu().add(R.string.highlight_of_text).setIcon(highlight).setOnMenuItemClickListener(new OnMenuItemClickListener() {

View File

@@ -21,7 +21,7 @@ import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide;
import com.foobnix.LibreraBuildConfig;
import com.foobnix.LibreraApp;
import com.foobnix.android.utils.Dips;
import com.foobnix.android.utils.Keyboards;
import com.foobnix.android.utils.LOG;
@@ -30,7 +30,6 @@ import com.foobnix.android.utils.TxtUtils;
import com.foobnix.android.utils.Views;
import com.foobnix.dao2.FileMeta;
import com.foobnix.drive.GFile;
import com.foobnix.ext.PdfExtract;
import com.foobnix.model.AppBookmark;
import com.foobnix.model.AppData;
import com.foobnix.model.AppState;
@@ -43,7 +42,6 @@ import com.foobnix.pdf.info.IMG;
import com.foobnix.pdf.info.R;
import com.foobnix.pdf.info.TintUtil;
import com.foobnix.pdf.info.view.Dialogs;
import com.foobnix.pdf.info.view.DragingDialogs;
import com.foobnix.pdf.info.view.ScaledImageView;
import com.foobnix.pdf.search.activity.msg.NotifyAllFragments;
import com.foobnix.pdf.search.activity.msg.UpdateAllFragments;
@@ -58,9 +56,6 @@ import com.foobnix.ui2.adapter.DefaultListeners;
import com.foobnix.ui2.adapter.FileMetaAdapter;
import org.ebookdroid.BookType;
import com.foobnix.LibreraApp;
import org.ebookdroid.core.codec.CodecDocument;
import org.ebookdroid.droids.mupdf.codec.MuPdfDocument;
import org.ebookdroid.droids.mupdf.codec.PdfContext;
@@ -368,7 +363,7 @@ public class FileInformationDialog {
doc.recycle();
String text = TxtUtils.replaceLast(meta.toString(), "<br>", "");
metaTagsInfo.setText(Html.fromHtml(text));
metaTagsInfo.setText(Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY));
} catch (Exception e) {
LOG.e(e);
@@ -539,7 +534,7 @@ public class FileInformationDialog {
}
private static void editMeta(FileMeta fileMeta, TextView click, TextView author, String key) {
click.setOnClickListener(v -> Dialogs.showEditDialog(author.getContext(),true, author.getContext().getString(R.string.edit), author.getText().toString(), result -> {
click.setOnClickListener(v -> Dialogs.showEditDialog(author.getContext(), true, author.getContext().getString(R.string.edit), author.getText().toString(), result -> {
PdfContext codecContex = new PdfContext();
CodecDocument doc = codecContex.openDocument(fileMeta.getPath(), "");
doc.setMeta(key, result);

View File

@@ -7,6 +7,7 @@ import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
@@ -19,6 +20,7 @@ import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.Toast;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
@@ -135,6 +137,10 @@ public abstract class DocumentController {
LOG.d("readTimeStart");
}
public Drawable getDrawable(int res) {
return ContextCompat.getDrawable(activity, res);
}
public void resetReadTimer() {
readTimeStart = System.currentTimeMillis();
LOG.d("resetReadTimer");

View File

@@ -153,7 +153,7 @@ public abstract class HorizontalModeController extends DocumentController {
} else if (pagesCount > 0) {
currentPage = bs.getCurrentPage(getPageCount()).viewIndex;
}
if(AppState.get().isAlwaysOpenOnPage1){
if (AppState.get().isAlwaysOpenOnPage1) {
currentPage = 0;
}
@@ -352,7 +352,7 @@ public abstract class HorizontalModeController extends DocumentController {
return codeDocument.getPage(page).getPageLinks();
} catch (Exception e) {
LOG.e(e);
return Collections.EMPTY_LIST;
return Collections.emptyList();
}
}
@@ -421,7 +421,7 @@ public abstract class HorizontalModeController extends DocumentController {
return codeDocument.getMediaAttachments();
} catch (Exception e) {
LOG.e(e);
return Collections.EMPTY_LIST;
return Collections.emptyList();
}
}

View File

@@ -126,7 +126,7 @@ public class HorizontalViewActivity extends AdsFragmentActivity {
VerticalViewPager viewPager;
SeekBar seekBar;
TextView toastBrightnessText, floatingBookmarkTextView, maxSeek, currentSeek, pagesCountIndicator, flippingIntervalView, pagesTime, pagesTime1, pagesPower, titleTxt, chapterView, modeName, pannelBookTitle;
View bottomBar, bottomIndicators, onClose, overlay, pagesBookmark, musicButtonPanel, parentParent;
View bottomBar, bottomIndicators, onClose, overlay, pagesBookmark, musicButtonPanel, parentParent;
LinearLayout actionBar, bottomPanel;
TTSControlsView ttsActive;
FrameLayout anchor, adFrame;
@@ -1208,7 +1208,9 @@ public class HorizontalViewActivity extends AdsFragmentActivity {
});
} Runnable flippingRunnable = new Runnable() {
}
Runnable flippingRunnable = new Runnable() {
@Override
public void run() {
@@ -1380,7 +1382,9 @@ public class HorizontalViewActivity extends AdsFragmentActivity {
onPageFlip1.setVisibility(View.VISIBLE);
onPageFlip1.setImageResource(R.drawable.glyphicons_174_pause);
} Runnable updateTimePower = new Runnable() {
}
Runnable updateTimePower = new Runnable() {
@Override
public void run() {
@@ -1605,7 +1609,9 @@ public class HorizontalViewActivity extends AdsFragmentActivity {
}
lastClick = System.currentTimeMillis();
viewPager.setCurrentItem(dc.getCurentPage() + 1, isAnimate);
} Runnable onRefresh = new Runnable() {
}
Runnable onRefresh = new Runnable() {
@Override
public void run() {
@@ -1700,7 +1706,7 @@ public class HorizontalViewActivity extends AdsFragmentActivity {
TTSService.playPause(HorizontalViewActivity.this, dc);
} else if (ev.getMessage().equals(MessageEvent.MESSAGE_SHARE_PAGE)) {
ExtUtils.sharePage(dc,dc.getCurentPage());
ExtUtils.sharePage(dc, dc.getCurentPage());
} else if (ev.getMessage().equals(MessageEvent.MESSAGE_SELECTED_TEXT)) {
if (dc.isTextFormat() && TxtUtils.isFooterNote(AppState.get().selectedText)) {
@@ -1975,7 +1981,9 @@ public class HorizontalViewActivity extends AdsFragmentActivity {
@Override
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) {
return super.onCreateView(parent, name, context, attrs);
} public View.OnClickListener onBookmarks = new View.OnClickListener() {
}
public View.OnClickListener onBookmarks = new View.OnClickListener() {
@Override
public void onClick(final View v) {
@@ -2216,20 +2224,20 @@ public class HorizontalViewActivity extends AdsFragmentActivity {
@Override
public boolean onKeyUp(final int keyCode, final KeyEvent event) {
LOG.d("getChildCount", anchor.getChildCount(),anchor.getVisibility()==View.VISIBLE, keyCode, isMyKey);
LOG.d("getChildCount", anchor.getChildCount(), anchor.getVisibility() == View.VISIBLE, keyCode, isMyKey);
if (isMyKey) {
return true;
}
if (anchor.getVisibility()==View.VISIBLE &&
if (anchor.getVisibility() == View.VISIBLE &&
(KeyEvent.KEYCODE_ESCAPE == keyCode ||
KeyEvent.KEYCODE_BACK == keyCode)
KeyEvent.KEYCODE_BACK == keyCode)
) {
closeDialog();
return true;
}
if (anchor.getVisibility()==View.VISIBLE){
if (anchor.getVisibility() == View.VISIBLE) {
return false;
}
@@ -2420,7 +2428,9 @@ public class HorizontalViewActivity extends AdsFragmentActivity {
return true;
}
return false;
} View.OnLongClickListener onBookmarksLong = new View.OnLongClickListener() {
}
View.OnLongClickListener onBookmarksLong = new View.OnLongClickListener() {
@Override
public boolean onLongClick(final View arg0) {
@@ -2481,16 +2491,6 @@ public class HorizontalViewActivity extends AdsFragmentActivity {
}
SeekBar.OnSeekBarChangeListener onSeek = new SeekBar.OnSeekBarChangeListener() {
@Override

View File

@@ -184,7 +184,7 @@ public class PageImaveView extends View {
public synchronized Pair<List<PageLink>, List<Annotation>> getPageLinks(int number) {
if (AppSP.get().isCut || AppSP.get().isCrop) {
return new Pair(Collections.emptyList(), Collections.emptyList());
return new Pair<>(Collections.emptyList(), Collections.emptyList());
}
return getPageLinksInner(number);
@@ -228,7 +228,7 @@ public class PageImaveView extends View {
if (a == null) {
a = Collections.emptyList();
}
return new Pair(t, a);
return new Pair<>(t, a);
} catch (Exception e) {
LOG.e(e);
return null;
@@ -580,7 +580,7 @@ public class PageImaveView extends View {
}
}
return new Pair(p, a);
return new Pair<>(p, a);
}

View File

@@ -1,65 +1,9 @@
package com.foobnix.ui2;
import android.app.Activity;
import android.app.IntentService;
import android.app.Notification;
import android.content.Context;
import android.content.Intent;
import android.graphics.RectF;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import androidx.core.app.NotificationCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
public class BooksService {
import com.foobnix.android.utils.Apps;
import com.foobnix.android.utils.Dips;
import com.foobnix.android.utils.JsonDB;
import com.foobnix.android.utils.LOG;
import com.foobnix.android.utils.Objects;
import com.foobnix.android.utils.TxtUtils;
import com.foobnix.dao2.FileMeta;
import com.foobnix.drive.GFile;
import com.foobnix.ext.CacheZipUtils;
import com.foobnix.ext.CacheZipUtils.CacheDir;
import com.foobnix.ext.EbookMeta;
import com.foobnix.model.AppData;
import com.foobnix.model.AppProfile;
import com.foobnix.model.AppSP;
import com.foobnix.model.AppState;
import com.foobnix.model.SimpleMeta;
import com.foobnix.model.TagData;
import com.foobnix.pdf.info.AppsConfig;
import com.foobnix.pdf.info.Clouds;
import com.foobnix.pdf.info.ExtUtils;
import com.foobnix.pdf.info.IMG;
import com.foobnix.pdf.info.R;
import com.foobnix.pdf.info.io.SearchCore;
import com.foobnix.pdf.info.model.BookCSS;
import com.foobnix.pdf.search.activity.msg.MessageSync;
import com.foobnix.pdf.search.activity.msg.MessageSyncFinish;
import com.foobnix.pdf.search.activity.msg.UpdateAllFragments;
import com.foobnix.sys.ImageExtractor;
import com.foobnix.sys.TempHolder;
import com.foobnix.tts.TTSNotification;
import org.ebookdroid.BookType;
import org.ebookdroid.common.bitmaps.BitmapRef;
import org.ebookdroid.common.settings.books.SharedBooks;
import org.ebookdroid.core.codec.CodecContext;
import org.ebookdroid.core.codec.CodecDocument;
import org.ebookdroid.core.codec.CodecPage;
import org.greenrobot.eventbus.EventBus;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
public class BooksService extends IntentService {
public static String TAG = "BooksService";
public static String INTENT_NAME = "BooksServiceIntent";
public static String ACTION_SEARCH_ALL = "ACTION_SEARCH_ALL";
@@ -78,476 +22,5 @@ public class BooksService extends IntentService {
public static volatile boolean isRunning = false;
Handler handler;
boolean isStartForeground = false;
Runnable timer2 = new Runnable() {
@Override
public void run() {
LOG.d("timer2");
sendBuildingLibrary();
handler.postDelayed(timer2, 250);
}
};
private List<FileMeta> itemsMeta = new LinkedList<FileMeta>();
Runnable timer = new Runnable() {
@Override
public void run() {
LOG.d("timer 2");
sendProggressMessage();
handler.postDelayed(timer, 250);
}
};
public BooksService() {
super("BooksService");
handler = new Handler(Looper.getMainLooper());
LOG.d("BooksService", "Create");
}
public static void sendFinishMessage(Context c) {
Intent intent = new Intent(INTENT_NAME).putExtra(Intent.EXTRA_TEXT, RESULT_SEARCH_FINISH);
LocalBroadcastManager.getInstance(c).sendBroadcast(intent);
}
public static void startForeground(Activity a, String action) {
final Intent intent = new Intent(a, BooksService.class).setAction(action);
a.startService(intent);
// if (Build.VERSION.SDK_INT >= 26) {
// a.startForegroundService(intent);
// } else {
// a.startService(intent);
//
// }
}
@Override
public void onDestroy() {
super.onDestroy();
isStartForeground = false;
LOG.d("BooksService", "onDestroy");
}
@Override
public void onCreate() {
super.onCreate();
//startMyForeground();
}
public void startMyForeground() {
if (!isStartForeground) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {
Notification notification = new NotificationCompat.Builder(this, TTSNotification.DEFAULT) //
.setSmallIcon(R.drawable.glyphicons_761_sync) //
.setContentTitle(Apps.getApplicationName(this)) //
.setContentText(getString(R.string.please_wait_books_are_being_processed_)).setPriority(NotificationCompat.PRIORITY_DEFAULT)//
.build();
startForeground(TTSNotification.NOT_ID_2, notification);
}
AppProfile.init(this);
isStartForeground = true;
}
}
@Override
protected void onHandleIntent(Intent intent) {
//startMyForeground();
if (intent == null) {
return;
}
try {
sendProggressMessage();
if (isRunning) {
LOG.d(TAG, "BooksService", "Is-running");
return;
}
isRunning = true;
LOG.d(TAG, "BooksService", "Action", intent.getAction());
//TESET
if (ACTION_RUN_SYNCRONICATION.equals(intent.getAction())) {
if (AppSP.get().isEnableSync) {
AppProfile.save(this);
try {
EventBus.getDefault().post(new MessageSync(MessageSync.STATE_VISIBLE));
AppSP.get().syncTimeStatus = MessageSync.STATE_VISIBLE;
GFile.sycnronizeAll(this);
AppSP.get().syncTime = System.currentTimeMillis();
AppSP.get().syncTimeStatus = MessageSync.STATE_SUCCESS;
EventBus.getDefault().post(new MessageSync(MessageSync.STATE_SUCCESS));
} catch (Exception e) {
GFile.logout(this);
AppSP.get().syncTimeStatus = MessageSync.STATE_FAILE;
EventBus.getDefault().post(new MessageSync(MessageSync.STATE_FAILE));
LOG.e(e);
}
if (GFile.isNeedUpdate) {
LOG.d("GFILE-isNeedUpdate", GFile.isNeedUpdate);
TempHolder.get().listHash++;
EventBus.getDefault().post(new UpdateAllFragments());
}
}
}
if (ACTION_REMOVE_DELETED.equals(intent.getAction())) {
List<FileMeta> all = AppDB.get().getAll();
for (FileMeta meta : all) {
if (meta == null) {
continue;
}
if (Clouds.isCloud(meta.getPath())) {
continue;
}
File bookFile = new File(meta.getPath());
if (ExtUtils.isMounted(bookFile)) {
if (!bookFile.exists()) {
AppDB.get().delete(meta);
LOG.d("BooksService", "Delete-setIsSearchBook", meta.getPath());
}
}
}
List<FileMeta> localMeta = new LinkedList<FileMeta>();
if (JsonDB.isEmpty(BookCSS.get().searchPathsJson)) {
sendFinishMessage();
return;
}
for (final String path : JsonDB.get(BookCSS.get().searchPathsJson)) {
if (path != null && path.trim().length() > 0) {
final File root = new File(path);
if (root.isDirectory()) {
LOG.d(TAG, "Search in " + root.getPath());
SearchCore.search(localMeta, root, ExtUtils.seachExts);
}
}
}
for (FileMeta meta : localMeta) {
if (!all.contains(meta)) {
FileMetaCore.createMetaIfNeedSafe(meta.getPath(), true);
LOG.d("BooksService", "Add book", meta.getPath());
}
}
List<FileMeta> allNone = AppDB.get().getAllByState(FileMetaCore.STATE_NONE);
for (FileMeta m : allNone) {
LOG.d("BooksService", "STATE_NONE", m.getTitle(), m.getPath(), m.getTitle());
FileMetaCore.createMetaIfNeedSafe(m.getPath(), false);
}
Clouds.get().syncronizeGet();
} else if (ACTION_SEARCH_ALL.equals(intent.getAction())) {
LOG.d(ACTION_SEARCH_ALL);
//TempHolder.listHash++;
//AppDB.get().getDao().detachAll();
AppProfile.init(this);
ImageExtractor.clearErrors();
IMG.clearDiscCache();
handler.post(new Runnable() {
@Override
public void run() {
IMG.clearMemoryCache();
}
});
AppDB.get().deleteAllData();
itemsMeta.clear();
handler.post(timer);
for (final String path : JsonDB.get(BookCSS.get().searchPathsJson)) {
if (path != null && path.trim().length() > 0) {
final File root = new File(path);
if (root.isDirectory()) {
LOG.d("Search in: " + root.getPath());
SearchCore.search(itemsMeta, root, ExtUtils.seachExts);
}
}
}
for (FileMeta meta : itemsMeta) {
meta.setIsSearchBook(true);
}
final List<SimpleMeta> allExcluded = AppData.get().getAllExcluded();
if (TxtUtils.isListNotEmpty(allExcluded)) {
for (FileMeta meta : itemsMeta) {
if (allExcluded.contains(SimpleMeta.SyncSimpleMeta(meta.getPath()))) {
meta.setIsSearchBook(false);
}
}
}
final List<FileMeta> allSyncBooks = AppData.get().getAllSyncBooks();
if (TxtUtils.isListNotEmpty(allSyncBooks)) {
for (FileMeta meta : itemsMeta) {
for (FileMeta sync : allSyncBooks) {
if (meta.getTitle().equals(sync.getTitle()) && !meta.getPath().equals(sync.getPath())) {
meta.setIsSearchBook(false);
LOG.d(TAG, "remove-dublicate", meta.getPath());
}
}
}
}
itemsMeta.addAll(AppData.get().getAllFavoriteFiles(false));
itemsMeta.addAll(AppData.get().getAllFavoriteFolders());
AppDB.get().saveAll(itemsMeta);
handler.removeCallbacks(timer);
sendFinishMessage();
handler.post(timer2);
for (FileMeta meta : itemsMeta) {
File file = new File(meta.getPath());
FileMetaCore.get().upadteBasicMeta(meta, file);
}
AppDB.get().updateAll(itemsMeta);
sendFinishMessage();
for (FileMeta meta : itemsMeta) {
//if(FileMetaCore.isSafeToExtactBook(meta.getPath())) {
EbookMeta ebookMeta = FileMetaCore.get().getEbookMeta(meta.getPath(), CacheDir.ZipService, true);
FileMetaCore.get().udpateFullMeta(meta, ebookMeta);
//}
}
SharedBooks.updateProgress(itemsMeta, true, -1);
AppDB.get().updateAll(itemsMeta);
itemsMeta.clear();
handler.removeCallbacks(timer2);
sendFinishMessage();
CacheDir.ZipService.removeCacheContent();
Clouds.get().syncronizeGet();
TagData.restoreTags();
List<FileMeta> allNone = AppDB.get().getAllByState(FileMetaCore.STATE_NONE);
for (FileMeta m : allNone) {
LOG.d("BooksService-createMetaIfNeedSafe-service", m.getTitle(), m.getPath(), m.getTitle());
FileMetaCore.createMetaIfNeedSafe(m.getPath(), false);
}
updateBookAnnotations();
} else if (ACTION_SYNC_DROPBOX.equals(intent.getAction())) {
Clouds.get().syncronizeGet();
} else if (ACTION_RUN_SELF_TEST.equals(intent.getAction())) {
try {
AppProfile.syncTestFolder.mkdirs();
File logFile = AppData.getTestFileName();
logFile.delete();
BufferedWriter out = new BufferedWriter(new FileWriter(logFile));
List<FileMeta> all = AppDB.get().searchBy("", AppDB.SORT_BY.getByID(AppState.get().sortBy), AppState.get().isSortAsc);
int w = Dips.screenWidth();
int h = Dips.screenHeight();
int s = BookCSS.get().fontSizeSp;
int count = all.size();
int n = 0;
int errors = 0;
writeLine(out, "ApplicationName: " + Apps.getApplicationName(this));
writeLine(out, "VersionName: " + Apps.getVersionName(this));
writeLine(out, "PackageName: " + Apps.getPackageName(this));
writeLine(out, "os.arch: " + System.getProperty("os.arch"));
writeLine(out, "MUPDF_VERSION: " + AppsConfig.MUPDF_FZ_VERSION);
writeLine(out, "Build.VERSION.SDK_INT: " + Build.VERSION.SDK_INT);
writeLine(out, "Height x Width: " + Dips.screenHeight() + "x" + Dips.screenWidth());
out.newLine();
writeLine(out, "Build.MANUFACTURER: " + Build.MANUFACTURER);
writeLine(out, "Build.PRODUCT: " + Build.PRODUCT);
writeLine(out, "Build.DEVICE: " + Build.DEVICE);
writeLine(out, "Build.BRAND: " + Build.BRAND);
writeLine(out, "Build.MODEL: " + Build.MODEL);
out.newLine();
writeLine(out, "[CSS]");
writeLine(out, BookCSS.get().toCssString().replace("}", "}\n"));
writeLine(out, "[BookCSS]");
writeLine(out, Objects.toJSONString(BookCSS.get()).replace(",", ",\n"));
writeLine(out, "[AppState]");
writeLine(out, Objects.toJSONString(AppState.get()).replace(",", ",\n"));
writeLine(out, "Books: " + count);
sendNotifyAll();
for (FileMeta item : all) {
n++;
writeLine(out, item.getPath());
if (TxtUtils.isEmpty(item.getPath())) {
writeLine(out, "Skip");
continue;
}
if (ExtUtils.isZip(item.getPath()) && !CacheZipUtils.isSingleAndSupportEntry(item.getPath()).first) {
writeLine(out, "Skip");
continue;
}
sendTextMessage("Test: " + n + "/" + count);
try {
CodecContext codecContex = BookType.getCodecContextByPath(item.getPath());
CodecDocument codecDocument = codecContex.openDocument(item.getPath(), "");
int pageCount = codecDocument.getPageCount(w, h, s);
if (pageCount == 0) {
codecDocument.recycle();
writeLine(out, "Error");
errors++;
sendNotifyAll();
continue;
}
CodecPage page = codecDocument.getPage(pageCount / 2);
RectF rectF = new RectF(0, 0, 1f, 1f);
BitmapRef bitmapRef = page.renderBitmap(w, h, rectF, false);
bitmapRef.getBitmap().recycle();
page.getText();
page.getPageLinks();
page.getPageHTML();
if (!page.isRecycled()) {
page.recycle();
}
if (!BookType.DJVU.is(item.getPath())) {
codecDocument.recycle();
}
} catch (Exception e) {
writeLine(out, "Error");
errors++;
sendNotifyAll();
}
}
writeLine(out, "Errors: " + errors);
writeLine(out, "Finish");
out.close();
} catch (Exception e) {
LOG.e(e);
}
sendNotifyAll();
}
} finally {
sendFinishMessage();
isRunning = false;
}
//stopSelf();
}
public void writeLine(BufferedWriter out, String line) throws IOException {
LOG.d("Self-test", line);
out.write(line);
out.newLine();
out.flush();
}
public void updateBookAnnotations() {
if (AppState.get().isDisplayAnnotation) {
sendBuildingLibrary();
LOG.d("updateBookAnnotations begin");
List<FileMeta> itemsMeta = AppDB.get().getAll();
for (FileMeta meta : itemsMeta) {
if (TxtUtils.isEmpty(meta.getAnnotation())) {
String bookOverview = FileMetaCore.getBookOverview(meta.getPath());
meta.setAnnotation(bookOverview);
}
}
AppDB.get().updateAll(itemsMeta);
sendFinishMessage();
LOG.d("updateBookAnnotations end");
}
}
private void sendFinishMessage() {
try {
//AppDB.get().getDao().detachAll();
} catch (Exception e) {
LOG.e(e);
}
sendFinishMessage(this);
EventBus.getDefault().post(new MessageSyncFinish());
}
private void sendTextMessage(String text) {
Intent itent = new Intent(INTENT_NAME).putExtra(Intent.EXTRA_TEXT, RESULT_SEARCH_MESSAGE_TXT).putExtra("TEXT", text);
LocalBroadcastManager.getInstance(this).sendBroadcast(itent);
}
private void sendNotifyAll() {
Intent itent = new Intent(INTENT_NAME).putExtra(Intent.EXTRA_TEXT, RESULT_NOTIFY_ALL);
LocalBroadcastManager.getInstance(this).sendBroadcast(itent);
}
private void sendProggressMessage() {
Intent itent = new Intent(INTENT_NAME).putExtra(Intent.EXTRA_TEXT, RESULT_SEARCH_COUNT).putExtra("android.intent.extra.INDEX", itemsMeta.size());
LocalBroadcastManager.getInstance(this).sendBroadcast(itent);
}
private void sendBuildingLibrary() {
Intent itent = new Intent(INTENT_NAME).putExtra(Intent.EXTRA_TEXT, RESULT_BUILD_LIBRARY);
LocalBroadcastManager.getInstance(this).sendBroadcast(itent);
}
}

View File

@@ -71,7 +71,7 @@ public class EntryAdapter extends AppRecycleAdapter<Entry, RecyclerView.ViewHold
if (TxtUtils.isNotEmpty(body)) {
holder.content.setVisibility(View.VISIBLE);
String text = TxtUtils.replaceLast(body, "\n", "");
holder.content.setText(Html.fromHtml(text));
holder.content.setText(Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY));
if (body.length() >= 200) {
holder.expand.setVisibility(View.VISIBLE);
@@ -184,7 +184,7 @@ public class EntryAdapter extends AppRecycleAdapter<Entry, RecyclerView.ViewHold
public void onClick(View v) {
if (TxtUtils.isNotEmpty(search.toString())) {
String encode = Urls.encode(search.getText().toString());
encode = encode.replace(" ","+");
encode = encode.replace(" ", "+");
String replace = link.href.replace("{searchterms}", encode).replace("{searchTerms}", encode);
Link l = new Link(replace);
@@ -290,7 +290,7 @@ public class EntryAdapter extends AppRecycleAdapter<Entry, RecyclerView.ViewHold
} else {
t.setVisibility(View.GONE);
}
t.setTextColor(context.getResources().getColor(R.color.tint_blue));
t.setTextColor(ContextCompat.getColor(context, R.color.tint_blue));
if (AppState.get().isUiTextColor) {
TintUtil.setUITextColor(t, AppState.get().uiTextColor);

View File

@@ -642,7 +642,7 @@ public class FileMetaAdapter extends AppRecycleAdapter<FileMeta, RecyclerView.Vi
holder.tags.removeAllViews();
for (final String tag : StringDB.asList(fileMeta.getTag())) {
TextView t = new TextView(holder.tags.getContext());
t.setTextAppearance(holder.tags.getContext(), R.style.textLink);
t.setTextAppearance(R.style.textLink);
TxtUtils.bold(t);
t.setText(tag + " ");
t.setSingleLine();

View File

@@ -32,6 +32,8 @@ import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.util.Pair;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
@@ -499,7 +501,7 @@ public class BrowseFragment2 extends UIFragment<FileMeta> {
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION//
);
getActivity().startActivityForResult(intent, MainTabs2.REQUEST_CODE_ADD_RESOURCE);
ActivityCompat.startActivityForResult(getActivity(), intent, MainTabs2.REQUEST_CODE_ADD_RESOURCE, new Bundle());
return true;
}
}).setIcon(R.drawable.glyphicons_145_folder_open);
@@ -1087,7 +1089,7 @@ public class BrowseFragment2 extends UIFragment<FileMeta> {
TextView slash = new TextView(getActivity());
slash.setText(id);
slash.setTextColor(getResources().getColor(R.color.white));
slash.setTextColor(ContextCompat.getColor(requireContext(), R.color.white));
paths.addView(slash);
} else {
@@ -1103,7 +1105,7 @@ public class BrowseFragment2 extends UIFragment<FileMeta> {
} else {
nameView.setText(name + ":");
}
nameView.setTextColor(getResources().getColor(R.color.white));
nameView.setTextColor(ContextCompat.getColor(requireContext(), R.color.white));
nameView.setOnClickListener(new OnClickListener() {
@Override
@@ -1116,7 +1118,7 @@ public class BrowseFragment2 extends UIFragment<FileMeta> {
if (split.length == 0 && Clouds.isCloud(displayPath)) {
TextView logout = new TextView(getActivity());
logout.setText(TxtUtils.underline(getActivity().getString(R.string.logout)));
logout.setTextColor(getResources().getColor(R.color.white));
logout.setTextColor(ContextCompat.getColor(requireContext(), R.color.white));
logout.setOnClickListener(new OnClickListener() {
@Override
@@ -1161,12 +1163,12 @@ public class BrowseFragment2 extends UIFragment<FileMeta> {
}
TextView slash = new TextView(getActivity());
slash.setText(" / ");
slash.setTextColor(getResources().getColor(R.color.white));
slash.setTextColor(ContextCompat.getColor(requireContext(), R.color.white));
TextView item = new TextView(getActivity());
item.setText(part);
item.setGravity(Gravity.CENTER);
item.setTextColor(getResources().getColor(R.color.white));
item.setTextColor(ContextCompat.getColor(requireContext(), R.color.white));
item.setSingleLine();
TypedValue outValue = new TypedValue();
getContext().getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
@@ -1242,7 +1244,7 @@ public class BrowseFragment2 extends UIFragment<FileMeta> {
} else {
stub.setText(" (" + itemsCount + ") ");
}
stub.setTextColor(getResources().getColor(R.color.white));
stub.setTextColor(ContextCompat.getColor(requireContext(), R.color.white));
stub.setSingleLine();
paths.addView(stub);

View File

@@ -80,11 +80,10 @@ kotlin {
dependencies {
implementation(project(":appLibDrive"))
// Firebase BOM
implementation(project(":googleDrive"))
//BOM begin
implementation(platform("androidx.compose:compose-bom:2025.07.00"))
implementation("androidx.compose.ui:ui")

View File

@@ -61,7 +61,7 @@ kotlin {
dependencies {
implementation(platform("androidx.compose:compose-bom:2025.07.00"))
implementation("androidx.compose.ui:ui")
api("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.material:material-icons-core")
implementation("androidx.compose.material:material-icons-extended")

View File

View File

@@ -30,9 +30,9 @@ dependencyResolutionManagement {
}
rootProject.name = "Librera"
include(":app")
include(":pro")
include(":smartreflow")
include(":Builder")
include(":libPro")
include(":libReflow")
include(":appCompose")
include(":googleDrive")
include(":appLibDrive")
include(":Builder")