diff --git a/app/src/main/java/net/gsantner/markor/activity/DocumentActivity.java b/app/src/main/java/net/gsantner/markor/activity/DocumentActivity.java index 82efc2777..7a37554a7 100644 --- a/app/src/main/java/net/gsantner/markor/activity/DocumentActivity.java +++ b/app/src/main/java/net/gsantner/markor/activity/DocumentActivity.java @@ -81,14 +81,20 @@ public static void launch(Activity activity, File path, Boolean doPreview, Inten } public static void handleFileClick(Activity activity, File file, Integer lineNumber) { - if (activity != null && file != null) { - if (FormatRegistry.isFileSupported(file)) { + if (activity == null || file == null) { + return; + } + + if (file.isDirectory()) { + if (file.canRead()) { launch(activity, file, null, null, lineNumber); - } else if (GsFileUtils.getFilenameExtension(file).equals(".apk")) { - GsContextUtils.instance.requestApkInstallation(activity, file); - } else { - askUserIfWantsToOpenFileInThisApp(activity, file); } + } else if (FormatRegistry.isFileSupported(file) && GsFileUtils.canCreate(file)) { + launch(activity, file, null, null, lineNumber); + } else if (GsFileUtils.getFilenameExtension(file).equals(".apk")) { + GsContextUtils.instance.requestApkInstallation(activity, file); + } else { + askUserIfWantsToOpenFileInThisApp(activity, file); } } diff --git a/app/src/main/java/net/gsantner/markor/activity/DocumentShareIntoFragment.java b/app/src/main/java/net/gsantner/markor/activity/DocumentShareIntoFragment.java index 2bfa2ac16..3c8a9454d 100644 --- a/app/src/main/java/net/gsantner/markor/activity/DocumentShareIntoFragment.java +++ b/app/src/main/java/net/gsantner/markor/activity/DocumentShareIntoFragment.java @@ -54,12 +54,12 @@ public class DocumentShareIntoFragment extends MarkorBaseFragment { public static final String TEXT_TOKEN = "{{text}}"; public static DocumentShareIntoFragment newInstance(Intent intent) { - DocumentShareIntoFragment f = new DocumentShareIntoFragment(); - Bundle args = new Bundle(); + final DocumentShareIntoFragment f = new DocumentShareIntoFragment(); + final Bundle args = new Bundle(); final String sharedText = formatLink(intent.getStringExtra(Intent.EXTRA_SUBJECT), intent.getStringExtra(Intent.EXTRA_TEXT)); - Object intentFile = intent.getSerializableExtra(Document.EXTRA_PATH); + final Object intentFile = intent.getSerializableExtra(Document.EXTRA_PATH); if (intentFile instanceof File && ((File) intentFile).isDirectory()) { f.workingDir = (File) intentFile; } @@ -219,12 +219,12 @@ private void appendToExistingDocumentAndClose(final File file, final boolean sho Toast.makeText(context, R.string.error_could_not_open_file, Toast.LENGTH_LONG).show(); } + _appSettings.addRecentDocument(file); if (showEditor) { showInDocumentActivity(document); + } else { + context.finish(); } - _appSettings.addRecentDocument(file); - - context.finish(); } private String formatShare(final String shared) { @@ -264,6 +264,7 @@ private void showAppendDialog(int keyId) { break; } } + MarkorFileBrowserFactory.showFileDialog(new GsFileBrowserOptions.SelectionListenerAdapter() { @Override public void onFsViewerConfig(GsFileBrowserOptions.Options dopt) { @@ -280,23 +281,39 @@ public void onFsViewerSelected(String request, File file, final Integer lineNumb } - private void createNewDocument() { - MarkorFileBrowserFactory.showFolderDialog(new GsFileBrowserOptions.SelectionListenerAdapter() { + private void createSelectNewDocument() { + MarkorFileBrowserFactory.showFileDialog(new GsFileBrowserOptions.SelectionListenerAdapter() { + GsFileBrowserOptions.Options _dopt = null; + @Override public void onFsViewerConfig(GsFileBrowserOptions.Options dopt) { - dopt.rootFolder = (workingDir == null) ? _appSettings.getNotebookDirectory() : workingDir; + dopt.rootFolder = _appSettings.getNotebookDirectory(); + dopt.startFolder = workingDir; + dopt.okButtonText = R.string.create_new_document; + dopt.okButtonEnable = true; + dopt.dismissAfterCallback = false; + _dopt = dopt; } @Override - public void onFsViewerSelected(String request, File dir, final Integer lineNumber) { - NewFileDialog dialog = NewFileDialog.newInstance(dir, false, (ok, f) -> { - if (ok && f.isFile()) { - appendToExistingDocumentAndClose(f, true); - } - }); - dialog.show(getActivity().getSupportFragmentManager(), NewFileDialog.FRAGMENT_TAG); + public void onFsViewerSelected(final String request, final File sel, final Integer lineNumber) { + if (sel.isDirectory()) { + NewFileDialog.newInstance(sel, false, (ok, f) -> { + if (ok && f.isFile()) { + appendToExistingDocumentAndClose(f, true); + } + }).show(getChildFragmentManager(), NewFileDialog.FRAGMENT_TAG); + } else { + appendToExistingDocumentAndClose(sel, true); + } } - }, getFragmentManager(), getActivity()); + + @Override + public void onFsViewerCancel(final String request) { + // Will cause the dialog to dismiss after this callback + _dopt.dismissAfterCallback = true; + } + }, getParentFragmentManager(), getActivity(), MarkorFileBrowserFactory.IsMimeText); } private void showInDocumentActivity(final Document document) { @@ -321,14 +338,13 @@ public Boolean onPreferenceClicked(Preference preference, String key, int keyId) close = true; break; } - case R.string.pref_key__share_into__create_document: { - createNewDocument(); + case R.string.pref_key__select_create_document: { + createSelectNewDocument(); return true; } case R.string.pref_key__favourite_files: case R.string.pref_key__popular_documents: - case R.string.pref_key__recent_documents: - case R.string.pref_key__share_into__existing_document: { + case R.string.pref_key__recent_documents: { showAppendDialog(keyId); return true; } diff --git a/app/src/main/java/net/gsantner/markor/activity/MainActivity.java b/app/src/main/java/net/gsantner/markor/activity/MainActivity.java index 4ed688349..2e2878b32 100644 --- a/app/src/main/java/net/gsantner/markor/activity/MainActivity.java +++ b/app/src/main/java/net/gsantner/markor/activity/MainActivity.java @@ -296,7 +296,7 @@ public void onClickFab(final View view) { if (f.isFile()) { DocumentActivity.launch(MainActivity.this, f, false, null, null); } else if (f.isDirectory()) { - _notebook.reloadCurrentFolder(); + _notebook.getAdapter().showFile(f); } } }); diff --git a/app/src/main/java/net/gsantner/markor/format/FormatRegistry.java b/app/src/main/java/net/gsantner/markor/format/FormatRegistry.java index 1c465fe71..2a41f35a1 100644 --- a/app/src/main/java/net/gsantner/markor/format/FormatRegistry.java +++ b/app/src/main/java/net/gsantner/markor/format/FormatRegistry.java @@ -88,7 +88,7 @@ public class FormatRegistry { }; public static boolean isFileSupported(final File file, final boolean... textOnly) { - boolean textonly = textOnly != null && textOnly.length > 0 && textOnly[0]; + final boolean textonly = textOnly != null && textOnly.length > 0 && textOnly[0]; if (file != null) { final String filepath = file.getAbsolutePath().toLowerCase(Locale.ROOT); for (TextConverterBase converter : CONVERTERS) { diff --git a/app/src/main/java/net/gsantner/markor/frontend/NewFileDialog.java b/app/src/main/java/net/gsantner/markor/frontend/NewFileDialog.java index 5b4d8433e..be58b69b3 100644 --- a/app/src/main/java/net/gsantner/markor/frontend/NewFileDialog.java +++ b/app/src/main/java/net/gsantner/markor/frontend/NewFileDialog.java @@ -210,7 +210,7 @@ private AlertDialog.Builder makeDialog(final File basedir, final boolean allowCr return; } final String usedFoldername = getFileNameWithoutExtension(fileNameEdit.getText().toString().trim(), templateSpinner.getSelectedItemPosition()); - File f = new File(basedir, usedFoldername); + final File f = new File(basedir, usedFoldername); if (cu.isUnderStorageAccessFolder(getContext(), f, true)) { DocumentFile dof = cu.getDocumentFile(getContext(), f, true); callback(dof != null && dof.exists(), f); diff --git a/app/src/main/java/net/gsantner/markor/frontend/filebrowser/MarkorFileBrowserFactory.java b/app/src/main/java/net/gsantner/markor/frontend/filebrowser/MarkorFileBrowserFactory.java index 8e3ee7a65..4af523f72 100644 --- a/app/src/main/java/net/gsantner/markor/frontend/filebrowser/MarkorFileBrowserFactory.java +++ b/app/src/main/java/net/gsantner/markor/frontend/filebrowser/MarkorFileBrowserFactory.java @@ -29,7 +29,11 @@ public class MarkorFileBrowserFactory { public static GsCallback.b2 IsMimeAudio = (context, file) -> file != null && GsContextUtils.instance.getMimeType(context, file).startsWith("audio/"); public static GsCallback.b2 IsMimeVideo = (context, file) -> file != null && GsContextUtils.instance.getMimeType(context, file).startsWith("video/"); - public static GsFileBrowserOptions.Options prepareFsViewerOpts(Context context, boolean doSelectFolder, GsFileBrowserOptions.SelectionListener listener) { + public static GsFileBrowserOptions.Options prepareFsViewerOpts( + final Context context, + final boolean doSelectFolder, + final GsFileBrowserOptions.SelectionListener listener + ) { final GsFileBrowserOptions.Options opts = new GsFileBrowserOptions.Options(); final MarkorContextUtils cu = new MarkorContextUtils(context); final AppSettings appSettings = ApplicationObject.settings(); @@ -40,6 +44,8 @@ public static GsFileBrowserOptions.Options prepareFsViewerOpts(Context context, opts.doSelectFolder = doSelectFolder; opts.doSelectFile = !doSelectFolder; + opts.okButtonEnable = opts.doSelectFolder || opts.doSelectMultiple; + opts.searchButtonImage = R.drawable.ic_search_black_24dp; opts.newDirButtonImage = R.drawable.baseline_create_new_folder_24; opts.homeButtonImage = R.drawable.ic_home_black_24dp; @@ -84,20 +90,30 @@ public static File[] strlistToArray(List strlist) { return files; } - private static void showDialog(FragmentManager fm, GsFileBrowserOptions.Options opts) { - GsFileBrowserDialog filesystemViewerDialog = GsFileBrowserDialog.newInstance(opts); + private static GsFileBrowserDialog showDialog(final FragmentManager fm, final GsFileBrowserOptions.Options opts) { + final GsFileBrowserDialog filesystemViewerDialog = GsFileBrowserDialog.newInstance(opts); filesystemViewerDialog.show(fm, GsFileBrowserDialog.FRAGMENT_TAG); + return filesystemViewerDialog; } - public static void showFileDialog(GsFileBrowserOptions.SelectionListener listener, FragmentManager fm, Context context, GsCallback.b2 fileOverallFilter) { + public static GsFileBrowserDialog showFileDialog( + final GsFileBrowserOptions.SelectionListener listener, + final FragmentManager fm, + final Context context, + final GsCallback.b2 fileOverallFilter + ) { final GsFileBrowserOptions.Options opts = prepareFsViewerOpts(context, false, listener); opts.fileOverallFilter = fileOverallFilter; - showDialog(fm, opts); + return showDialog(fm, opts); } - public static void showFolderDialog(GsFileBrowserOptions.SelectionListener listener, FragmentManager fm, Context context) { + public static GsFileBrowserDialog showFolderDialog( + final GsFileBrowserOptions.SelectionListener listener, + final FragmentManager fm, + final Context context + ) { final GsFileBrowserOptions.Options opts = prepareFsViewerOpts(context, true, listener); opts.okButtonText = R.string.select_this_folder; - showDialog(fm, opts); + return showDialog(fm, opts); } } diff --git a/app/src/main/java/net/gsantner/opoc/frontend/GsSearchOrCustomTextDialog.java b/app/src/main/java/net/gsantner/opoc/frontend/GsSearchOrCustomTextDialog.java index 4f3754efe..45528c6d1 100644 --- a/app/src/main/java/net/gsantner/opoc/frontend/GsSearchOrCustomTextDialog.java +++ b/app/src/main/java/net/gsantner/opoc/frontend/GsSearchOrCustomTextDialog.java @@ -55,6 +55,7 @@ import net.gsantner.opoc.wrapper.GsCallback; import net.gsantner.opoc.wrapper.GsTextWatcherAdapter; +import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; diff --git a/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserDialog.java b/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserDialog.java index d5bb4a393..4a31ace96 100644 --- a/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserDialog.java +++ b/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserDialog.java @@ -19,7 +19,6 @@ import android.app.Activity; import android.app.Dialog; -import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import android.view.LayoutInflater; @@ -53,8 +52,8 @@ public class GsFileBrowserDialog extends DialogFragment implements GsFileBrowser //######################## public static final String FRAGMENT_TAG = "FilesystemViewerCreator"; - public static GsFileBrowserDialog newInstance(GsFileBrowserOptions.Options options) { - GsFileBrowserDialog f = new GsFileBrowserDialog(); + public static GsFileBrowserDialog newInstance(final GsFileBrowserOptions.Options options) { + final GsFileBrowserDialog f = new GsFileBrowserDialog(); f.setStyle(DialogFragment.STYLE_NO_TITLE, 0); options.listener.onFsViewerConfig(options); f.setDialogOptions(options); @@ -93,9 +92,9 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa } @Override - public void onViewCreated(View root, @Nullable Bundle savedInstanceState) { + public void onViewCreated(final View root, final @Nullable Bundle savedInstanceState) { super.onViewCreated(root, savedInstanceState); - Context context = getContext(); + final Activity activity = getActivity(); _recyclerList = root.findViewById(R.id.ui__filesystem_dialog__list); _dialogTitle = root.findViewById(R.id.ui__filesystem_dialog__title_text); @@ -151,10 +150,10 @@ public void onViewCreated(View root, @Nullable Bundle savedInstanceState) { root.setBackgroundColor(rcolor(_dopt.backgroundColor)); final LinearLayoutManager lam = (LinearLayoutManager) _recyclerList.getLayoutManager(); - DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(getActivity(), lam.getOrientation()); + final DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(activity, lam.getOrientation()); _recyclerList.addItemDecoration(dividerItemDecoration); - _filesystemViewerAdapter = new GsFileBrowserListAdapter(_dopt, context); + _filesystemViewerAdapter = new GsFileBrowserListAdapter(_dopt, activity); _recyclerList.setAdapter(_filesystemViewerAdapter); _filesystemViewerAdapter.getFilter().filter(""); onFsViewerDoUiUpdate(_filesystemViewerAdapter); @@ -168,7 +167,6 @@ private void setDialogOptions(GsFileBrowserOptions.Options options) { _dopt = options; _callback = _dopt.listener; _dopt.listener = this; - checkOptions(); } public void changeAdapterFilter(CharSequence s, int start, int before, int count) { @@ -177,7 +175,7 @@ public void changeAdapterFilter(CharSequence s, int start, int before, int count } } - public void onClicked(View view) { + public void onClicked(final View view) { switch (view.getId()) { case R.id.ui__filesystem_dialog__button_ok: case R.id.ui__filesystem_dialog__home: { @@ -197,7 +195,7 @@ public void onClicked(View view) { break; } case R.id.ui__filesystem_dialog__button_cancel: { - onFsViewerNothingSelected(_dopt.requestId); + onFsViewerCancel(_dopt.requestId); break; } case R.id.ui__filesystem_dialog__new_dir: { @@ -225,28 +223,19 @@ private void showNewDirDialog() { dopt.titleText = _dopt.newDirButtonText; dopt.textColor = rcolor(_dopt.primaryTextColor); dopt.searchHintText = android.R.string.untitled; - dopt.callback = (name) -> { - final File file = _filesystemViewerAdapter.createDirectoryHere(name); - if (file != null) { - _recyclerList.postDelayed(() -> _filesystemViewerAdapter.showAndBlink(file, _recyclerList), 100); - } - }; + dopt.callback = (name) -> _filesystemViewerAdapter.createDirectoryHere(name, true); GsSearchOrCustomTextDialog.showMultiChoiceDialogWithSearchFilterUI(activity, dopt); } - private void checkOptions() { - if (_dopt.doSelectFile && !_dopt.doSelectMultiple) { - _dopt.okButtonEnable = false; - } - } - @Override - public void onFsViewerSelected(String request, File file, final Integer lineNumber) { + public void onFsViewerSelected(final String request, final File file, final Integer lineNumber) { if (_callback != null) { _callback.onFsViewerSelected(_dopt.requestId, file, lineNumber); } - dismiss(); + if (_dopt.dismissAfterCallback) { + dismiss(); + } } @Override @@ -254,15 +243,19 @@ public void onFsViewerMultiSelected(String request, File... files) { if (_callback != null) { _callback.onFsViewerMultiSelected(_dopt.requestId, files); } - dismiss(); + if (_dopt.dismissAfterCallback) { + dismiss(); + } } @Override - public void onFsViewerNothingSelected(String request) { + public void onFsViewerCancel(String request) { if (_callback != null) { - _callback.onFsViewerNothingSelected(_dopt.requestId); + _callback.onFsViewerCancel(_dopt.requestId); + } + if (_dopt.dismissAfterCallback) { + dismiss(); } - dismiss(); } @Override diff --git a/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserFragment.java b/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserFragment.java index 1f67b3961..105180b02 100644 --- a/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserFragment.java +++ b/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserFragment.java @@ -117,7 +117,7 @@ public void onViewCreated(@NonNull View root, @Nullable Bundle savedInstanceStat _recyclerList.addItemDecoration(dividerItemDecoration); _previousNotebookDirectory = _appSettings.getNotebookDirectory(); - _filesystemViewerAdapter = new GsFileBrowserListAdapter(_dopt, context, _recyclerList); + _filesystemViewerAdapter = new GsFileBrowserListAdapter(_dopt, context); _recyclerList.setAdapter(_filesystemViewerAdapter); _filesystemViewerAdapter.getFilter().filter(""); onFsViewerDoUiUpdate(_filesystemViewerAdapter); @@ -160,7 +160,7 @@ public void onClicked(View view) { break; } case R.id.ui__filesystem_dialog__button_cancel: { - onFsViewerNothingSelected(_dopt.requestId); + onFsViewerCancel(_dopt.requestId); break; } @@ -189,9 +189,9 @@ public void onFsViewerMultiSelected(String request, File... files) { } @Override - public void onFsViewerNothingSelected(String request) { + public void onFsViewerCancel(String request) { if (_callback != null) { - _callback.onFsViewerNothingSelected(_dopt.requestId); + _callback.onFsViewerCancel(_dopt.requestId); } } @@ -525,7 +525,7 @@ private void executeSearchAction() { onFsViewerSelected("", load, lineNumber); } } else { - showFile(load); + _filesystemViewerAdapter.showFile(load); } }); } @@ -591,6 +591,12 @@ public void onFsViewerDoUiUpdate(GsFileBrowserListAdapter adapter) { } } } + + @Override + public void onFsViewerCancel(final String request) { + super.onFsViewerCancel(request); + _filesystemViewerAdapter.reloadCurrentFolder(); // May be new folders + } }, getChildFragmentManager(), getActivity()); } @@ -642,45 +648,6 @@ private void importFileToCurrentDirectory(Context context, File sourceFile) { Toast.makeText(context, getString(R.string.import_) + ": " + sourceFile.getName(), Toast.LENGTH_LONG).show(); } - @Override - public void setUserVisibleHint(boolean isVisibleToUser) { - super.setUserVisibleHint(isVisibleToUser); - - } - - // Switch to folder and show the file - public void showFile(final File file) { - final GsFileBrowserListAdapter adapter = getAdapter(); - if (adapter == null || !file.exists()) { - return; - } - - final File dir = file.getParentFile(); - if (dir == null) { - return; - } - - final File current = adapter.getCurrentFolder(); - - if (!current.equals(dir)) { - // Wait up to 2s for the folder to load - final long init = System.currentTimeMillis(); - adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { - @Override - public void onChanged() { - super.onChanged(); - if ((System.currentTimeMillis() - init) < 2000) { - _recyclerList.postDelayed(() -> adapter.showAndBlink(file, _recyclerList), 250); - } - adapter.unregisterAdapterDataObserver(this); - } - }); - adapter.setCurrentFolder(dir); - } else { - adapter.showAndBlink(file, _recyclerList); - } - } - public void setCurrentFolder(final File folder) { if (folder != null && folder.canRead() && _filesystemViewerAdapter != null) { _filesystemViewerAdapter.setCurrentFolder(folder); diff --git a/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserListAdapter.java b/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserListAdapter.java index fda4c30e8..de5f0486d 100644 --- a/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserListAdapter.java +++ b/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserListAdapter.java @@ -76,7 +76,7 @@ public class GsFileBrowserListAdapter extends RecyclerView.Adapter _virtualMapping = new HashMap<>(); - private final RecyclerView _recyclerView; + private RecyclerView _recyclerView; private final SharedPreferences _prefApp; //######################## @@ -84,17 +84,13 @@ public class GsFileBrowserListAdapter extends RecyclerView.Adapter(); _adapterDataFiltered = new ArrayList<>(); _currentSelection = new HashSet<>(); _context = context; loadFolder((options.startFolder != null) ? options.startFolder : options.rootFolder); - _recyclerView = recyclerView; _prefApp = _context.getSharedPreferences("app", Context.MODE_PRIVATE); // Prevents view flicker - https://stackoverflow.com/a/32488059 @@ -202,6 +198,12 @@ public void onBindViewHolder(@NonNull FilesystemViewerViewHolder holder, int pos holder.itemRoot.setOnLongClickListener(this); } + @Override + public void onAttachedToRecyclerView(final RecyclerView view) { + super.onAttachedToRecyclerView(view); + _recyclerView = view; + } + public String formatFileDescription(final File file, String format) { if (TextUtils.isEmpty(format)) { return DateUtils.formatDateTime(_context, file.lastModified(), (DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_NUMERIC_DATE)); @@ -321,7 +323,7 @@ public void onClick(View view) { switch (view.getId()) { case R.id.opoc_filesystem_item__root: { // A own item was clicked - TagContainer data = (TagContainer) view.getTag(); + final TagContainer data = (TagContainer) view.getTag(); if (data != null && data.file != null) { File file = data.file; if (_virtualMapping.containsKey(file)) { @@ -352,9 +354,8 @@ public void onClick(View view) { } case R.id.ui__filesystem_dialog__button_ok: { if (_dopt.doSelectMultiple && areItemsSelected()) { - _dopt.listener.onFsViewerMultiSelected(_dopt.requestId, - _currentSelection.toArray(new File[0])); - } else if (_dopt.doSelectFolder && (_currentFolder.exists() || isCurrentFolderVirtual())) { + _dopt.listener.onFsViewerMultiSelected(_dopt.requestId, _currentSelection.toArray(new File[0])); + } else { _dopt.listener.onFsViewerSelected(_dopt.requestId, _currentFolder, null); } return; @@ -461,7 +462,7 @@ public boolean onLongClick(View view) { return false; } - public File createDirectoryHere(final CharSequence name) { + public File createDirectoryHere(final CharSequence name, final boolean show) { if (name == null || _currentFolder == null || !_currentFolder.canWrite()) { return null; } @@ -475,7 +476,11 @@ public File createDirectoryHere(final CharSequence name) { try { final File file = new File(_currentFolder, trimmed); if (file.exists() || file.mkdir()) { - reloadCurrentFolder(); + if (show) { + showFile(file); + } else { + reloadCurrentFolder(); + } return file; } } catch (SecurityException ignored) { @@ -485,19 +490,48 @@ public File createDirectoryHere(final CharSequence name) { return null; } + // Switch to folder and show the file + public void showFile(final File file) { + if (file == null || !file.exists() || _recyclerView == null) { + return; + } + + final File dir = file.getParentFile(); + if (dir == null) { + return; + } + + if (getFilePosition(file) < 0) { + // Wait up to 2s for the folder to load or reload + final long init = System.currentTimeMillis(); + registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { + @Override + public void onChanged() { + super.onChanged(); + if ((System.currentTimeMillis() - init) < 2000) { + _recyclerView.postDelayed(() -> showAndBlink(file), 250); + } + unregisterAdapterDataObserver(this); + } + }); + loadFolder(dir); // Will reload folder if necessary + } else { + showAndBlink(file); + } + } + /** * Show a file in the current folder and blink it * * @param file File to blink - * @param recycler RecyclerView which holds the file items */ - public void showAndBlink(final File file, final RecyclerView recycler) { + private void showAndBlink(final File file) { final int pos = getFilePosition(file); - final LinearLayoutManager manager = (LinearLayoutManager) recycler.getLayoutManager(); + final LinearLayoutManager manager = (LinearLayoutManager) _recyclerView.getLayoutManager(); if (manager != null && pos >= 0) { manager.scrollToPositionWithOffset(pos, 1); - recycler.postDelayed(() -> { - final RecyclerView.ViewHolder holder = recycler.findViewHolderForLayoutPosition(pos); + _recyclerView.postDelayed(() -> { + final RecyclerView.ViewHolder holder = _recyclerView.findViewHolderForLayoutPosition(pos); if (holder != null) { GsContextUtils.blinkView(holder.itemView); } diff --git a/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserOptions.java b/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserOptions.java index f814f8031..518ed9857 100644 --- a/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserOptions.java +++ b/app/src/main/java/net/gsantner/opoc/frontend/filebrowser/GsFileBrowserOptions.java @@ -31,7 +31,7 @@ public interface SelectionListener { void onFsViewerMultiSelected(final String request, final File... files); - void onFsViewerNothingSelected(final String request); + void onFsViewerCancel(final String request); void onFsViewerConfig(final Options dopt); @@ -72,7 +72,8 @@ public static class Options { homeButtonEnable = true, cancelButtonEnable = true, okButtonEnable = true, - newDirButtonEnable = true; + newDirButtonEnable = true, + dismissAfterCallback = true; public GsCallback.b2 fileOverallFilter = (context, file) -> true; @@ -130,7 +131,7 @@ public void onFsViewerMultiSelected(String request, File... files) { } @Override - public void onFsViewerNothingSelected(String request) { + public void onFsViewerCancel(String request) { } @Override diff --git a/app/src/main/java/net/gsantner/opoc/util/GsFileUtils.java b/app/src/main/java/net/gsantner/opoc/util/GsFileUtils.java index 43c952d86..4a96ee141 100644 --- a/app/src/main/java/net/gsantner/opoc/util/GsFileUtils.java +++ b/app/src/main/java/net/gsantner/opoc/util/GsFileUtils.java @@ -265,6 +265,7 @@ public static boolean copyFile(final File src, final File dst) { is.close(); } if (os != null) { + os.flush(); os.close(); } } diff --git a/app/src/main/res/layout/opoc_filesystem_dialog.xml b/app/src/main/res/layout/opoc_filesystem_dialog.xml index 9b006859c..ec9b3fdcc 100644 --- a/app/src/main/res/layout/opoc_filesystem_dialog.xml +++ b/app/src/main/res/layout/opoc_filesystem_dialog.xml @@ -65,10 +65,12 @@ android:src="@android:drawable/ic_menu_search" android:layout_width="wrap_content" android:layout_height="wrap_content" + app:fabSize="mini" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toTopOf="@id/ui__filesystem_dialog__new_dir" - android:layout_marginRight="20dp" - android:layout_marginBottom="20dp" + android:layout_marginRight="10dp" + android:layout_marginBottom="15dp" + android:alpha="0.75" tools:ignore="ContentDescription" app:shapeAppearance="@style/ShapeAppearanceOverlay.Material3.FloatingActionButton"/> @@ -77,10 +79,12 @@ android:src="@android:drawable/ic_input_add" android:layout_width="wrap_content" android:layout_height="wrap_content" + app:fabSize="mini" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toTopOf="@id/ui__filesystem_dialog__home" - android:layout_marginRight="20dp" - android:layout_marginBottom="20dp" + android:layout_marginRight="10dp" + android:layout_marginBottom="15dp" + android:alpha="0.75" tools:ignore="ContentDescription" app:shapeAppearance="@style/ShapeAppearanceOverlay.Material3.FloatingActionButton"/> @@ -89,10 +93,12 @@ android:src="@android:drawable/btn_star" android:layout_width="wrap_content" android:layout_height="wrap_content" + app:fabSize="mini" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toTopOf="@id/ui__filesystem_dialog__buttons" - android:layout_marginRight="20dp" - android:layout_marginBottom="20dp" + android:layout_marginRight="10dp" + android:layout_marginBottom="15dp" + android:alpha="0.75" tools:ignore="ContentDescription" app:shapeAppearance="@style/ShapeAppearanceOverlay.Material3.FloatingActionButton"/> diff --git a/app/src/main/res/values/string-not_translatable.xml b/app/src/main/res/values/string-not_translatable.xml index 00765eb3a..25ef56a5d 100644 --- a/app/src/main/res/values/string-not_translatable.xml +++ b/app/src/main/res/values/string-not_translatable.xml @@ -157,8 +157,6 @@ work. If not, see . pref_key__share_into__quicknote pref_key__share_into__todo pref_key__share_into__clipboard - pref_key__share_into__existing_document - pref_key__share_into__create_document pref_key__share_into__reshare pref_key__share_into__calendar_event pref_key__more_info__settings @@ -185,6 +183,7 @@ work. If not, see . pref_key__recent_documents pref_key__popular_documents pref_key__favourite_files + pref_key__select_create_document pref_key__share_into__open_in_browser pref_key__inject_to_head pref_key__inject_to_body diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 7219f8639..ab0743f8a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -225,6 +225,7 @@ work. If not, see . Edit text in the center of the screen Clipboard Select existing document + Select or create document Open Source Licenses Rate this app Translate diff --git a/app/src/main/res/xml/prefactions_share_into.xml b/app/src/main/res/xml/prefactions_share_into.xml index f427b5ed5..7d1283ddc 100644 --- a/app/src/main/res/xml/prefactions_share_into.xml +++ b/app/src/main/res/xml/prefactions_share_into.xml @@ -39,6 +39,11 @@ + + - - diff --git a/app/thirdparty/java/other/writeily/widget/WrWidgetConfigure.java b/app/thirdparty/java/other/writeily/widget/WrWidgetConfigure.java index 555e5de21..27670ea7e 100644 --- a/app/thirdparty/java/other/writeily/widget/WrWidgetConfigure.java +++ b/app/thirdparty/java/other/writeily/widget/WrWidgetConfigure.java @@ -67,7 +67,13 @@ public void onFsViewerConfig(GsFileBrowserOptions.Options dopt) { dopt.titleText = R.string.select_folder; dopt.rootFolder = ApplicationObject.settings().getNotebookDirectory(); } - }, fragManager, this); + + @Override + public void onFsViewerCancel(final String request) { + finish(); + } + + }, getSupportFragmentManager(), this); } public static File getWidgetDirectory(final Context context, int id) {