mirror of
https://github.com/foobnix/LibreraReader.git
synced 2025-10-06 00:02:43 +02:00
refactoring
This commit is contained in:
@@ -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 **/
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
@@ -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() {
|
||||
|
@@ -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);
|
||||
|
@@ -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");
|
||||
|
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -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);
|
||||
|
@@ -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();
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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")
|
||||
|
@@ -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")
|
0
pro/.gitignore → libPro/.gitignore
vendored
0
pro/.gitignore → libPro/.gitignore
vendored
@@ -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")
|
||||
|
Reference in New Issue
Block a user