From b26b05746f8d9ce27347d01e601b61a2a97bbbe7 Mon Sep 17 00:00:00 2001 From: Michael Weghorn Date: Thu, 15 Apr 2021 15:14:51 +0200 Subject: android: Show file picker for new docs on "Save As" When creating a new document in Android Viewer, don't show a file picker to choose where to save the file at once, but create a new document and only ask where to save the file once "Save As" has been selected. The plain "Save" entry is disabled until then, since no URI to save to is known at this time. The handling for the temporary local file, which is used for all of the "actual work" remains unchanged. While at it, rename 'ToolbarController#disableMenuItem' to 'ToolbarController#enableMenuItem' and invert the meaning of the boolean parameter since I find that more straightforward and it also better matches the naming of the underlying 'MenuItem' method as well. Change-Id: I3eefada5531bfb2202aca25f2c9f170a463f87f6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114152 Tested-by: Jenkins Reviewed-by: Michael Weghorn (cherry picked from commit 5ce43b2b4e79c51f0d8922caf77fa6492c05c2a7) --- .../org/libreoffice/LibreOfficeMainActivity.java | 35 +++++++-------- .../java/org/libreoffice/ToolbarController.java | 17 +++++--- .../src/java/org/libreoffice/ui/FileUtilities.java | 5 --- .../org/libreoffice/ui/LibreOfficeUIActivity.java | 51 +++------------------- 4 files changed, 32 insertions(+), 76 deletions(-) diff --git a/android/source/src/java/org/libreoffice/LibreOfficeMainActivity.java b/android/source/src/java/org/libreoffice/LibreOfficeMainActivity.java index 1812ad253744..066c05dc9662 100644 --- a/android/source/src/java/org/libreoffice/LibreOfficeMainActivity.java +++ b/android/source/src/java/org/libreoffice/LibreOfficeMainActivity.java @@ -169,24 +169,12 @@ public class LibreOfficeMainActivity extends AppCompatActivity implements Settin mDocumentOverlay = new DocumentOverlay(this, layerView); mbISReadOnlyMode = !isExperimentalMode(); - boolean isNewDocument = false; mDocumentUri = getIntent().getData(); if (mDocumentUri != null) { if (mDocumentUri.getScheme().equals(ContentResolver.SCHEME_CONTENT) || mDocumentUri.getScheme().equals(ContentResolver.SCHEME_ANDROID_RESOURCE)) { - final boolean isReadOnlyDoc; - if (getIntent().getStringExtra(LibreOfficeUIActivity.NEW_DOC_TYPE_KEY) != null) { - // New document type string is not null, meaning we want to open a new document - String newDocumentType = getIntent().getStringExtra(LibreOfficeUIActivity.NEW_DOC_TYPE_KEY); - // create a temporary local file, will be copied to the actual URI when saving - loadNewDocument(newDocumentType); - isNewDocument = true; - isReadOnlyDoc = false; - } else { - isReadOnlyDoc = (getIntent().getFlags() & Intent.FLAG_GRANT_WRITE_URI_PERMISSION) == 0; - } - + final boolean isReadOnlyDoc = (getIntent().getFlags() & Intent.FLAG_GRANT_WRITE_URI_PERMISSION) == 0; mbISReadOnlyMode = !isExperimentalMode() || isReadOnlyDoc; Log.d(LOGTAG, "SCHEME_CONTENT: getPath(): " + mDocumentUri.getPath()); @@ -198,12 +186,6 @@ public class LibreOfficeMainActivity extends AppCompatActivity implements Settin Log.d(LOGTAG, "SCHEME_FILE: getPath(): " + mDocumentUri.getPath()); toolbarTop.setTitle(mDocumentUri.getLastPathSegment()); } - } else { - Log.e(LOGTAG, "No document specified. This should never happen."); - return; - } - - if (!isNewDocument) { // create a temporary local copy to work with boolean copyOK = copyFileToTemp() && mTempFile != null; if (!copyOK) { @@ -212,6 +194,15 @@ public class LibreOfficeMainActivity extends AppCompatActivity implements Settin return; } LOKitShell.sendLoadEvent(mTempFile.getPath()); + } else if (getIntent().getStringExtra(LibreOfficeUIActivity.NEW_DOC_TYPE_KEY) != null) { + // New document type string is not null, meaning we want to open a new document + String newDocumentType = getIntent().getStringExtra(LibreOfficeUIActivity.NEW_DOC_TYPE_KEY); + // create a temporary local file, will be copied to the actual URI when saving + loadNewDocument(newDocumentType); + toolbarTop.setTitle(getString(R.string.default_document_name)); + } else { + Log.e(LOGTAG, "No document specified. This should never happen."); + return; } mDrawerLayout = findViewById(R.id.drawer_layout); @@ -339,6 +330,8 @@ public class LibreOfficeMainActivity extends AppCompatActivity implements Settin String displayName = FileUtilities.retrieveDisplayNameForDocumentUri(getContentResolver(), mDocumentUri); toolbarTop.setTitle(displayName); + // make sure that "Save" menu item is enabled + getToolbarController().setupToolbars(); } public void exportToPDF() { @@ -880,6 +873,10 @@ public class LibreOfficeMainActivity extends AppCompatActivity implements Settin return mbISReadOnlyMode; } + public boolean hasLocationForSave() { + return mDocumentUri != null; + } + public static void setDocumentChanged (boolean changed) { isDocumentChanged = changed; } diff --git a/android/source/src/java/org/libreoffice/ToolbarController.java b/android/source/src/java/org/libreoffice/ToolbarController.java index 1384339f8c30..d4985aee180e 100644 --- a/android/source/src/java/org/libreoffice/ToolbarController.java +++ b/android/source/src/java/org/libreoffice/ToolbarController.java @@ -45,12 +45,12 @@ public class ToolbarController implements Toolbar.OnMenuItemClickListener { clipboardManager = (ClipboardManager)mContext.getSystemService(Context.CLIPBOARD_SERVICE); } - public void disableMenuItem(final int menuItemId, final boolean disabled) { + private void enableMenuItem(final int menuItemId, final boolean enabled) { LOKitShell.getMainHandler().post(new Runnable() { public void run() { MenuItem menuItem = mMainMenu.findItem(menuItemId); if (menuItem != null) { - menuItem.setEnabled(!disabled); + menuItem.setEnabled(enabled); } else { Log.e(LOGTAG, "MenuItem not found."); } @@ -245,11 +245,14 @@ public class ToolbarController implements Toolbar.OnMenuItemClickListener { } void setupToolbars() { - // show message in case experimental mode is enabled (i.e. editing is supported in general), - // but current document is readonly - if (LibreOfficeMainActivity.isExperimentalMode() && LibreOfficeMainActivity.isReadOnlyMode()) { - disableMenuItem(R.id.action_save, true); - Toast.makeText(mContext, mContext.getString(R.string.temp_file_saving_disabled), Toast.LENGTH_LONG).show(); + if (LibreOfficeMainActivity.isExperimentalMode()) { + boolean enableSaveEntry = !LibreOfficeMainActivity.isReadOnlyMode() && mContext.hasLocationForSave(); + enableMenuItem(R.id.action_save, enableSaveEntry); + if (LibreOfficeMainActivity.isReadOnlyMode()) { + // show message in case experimental mode is enabled (i.e. editing is supported in general), + // but current document is readonly + Toast.makeText(mContext, mContext.getString(R.string.temp_file_saving_disabled), Toast.LENGTH_LONG).show(); + } } mMainMenu.findItem(R.id.action_parts).setVisible(mContext.isDrawerEnabled()); } diff --git a/android/source/src/java/org/libreoffice/ui/FileUtilities.java b/android/source/src/java/org/libreoffice/ui/FileUtilities.java index 660fbc0e4528..0d51dd55e1e5 100644 --- a/android/source/src/java/org/libreoffice/ui/FileUtilities.java +++ b/android/source/src/java/org/libreoffice/ui/FileUtilities.java @@ -33,11 +33,6 @@ public class FileUtilities { static final int UNKNOWN = 10; - public static final String DEFAULT_WRITER_EXTENSION = ".odt"; - public static final String DEFAULT_IMPRESS_EXTENSION = ".odp"; - public static final String DEFAULT_SPREADSHEET_EXTENSION = ".ods"; - public static final String DEFAULT_DRAWING_EXTENSION = ".odg"; - public static final String MIMETYPE_OPENDOCUMENT_TEXT = "application/vnd.oasis.opendocument.text"; public static final String MIMETYPE_OPENDOCUMENT_SPREADSHEET = "application/vnd.oasis.opendocument.spreadsheet"; public static final String MIMETYPE_OPENDOCUMENT_PRESENTATION = "application/vnd.oasis.opendocument.presentation"; diff --git a/android/source/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java b/android/source/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java index 9f1cd7a9089d..110123f54acf 100644 --- a/android/source/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java +++ b/android/source/src/java/org/libreoffice/ui/LibreOfficeUIActivity.java @@ -23,7 +23,6 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; -import android.support.annotation.NonNull; import android.support.design.widget.FloatingActionButton; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; @@ -66,9 +65,7 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements Settings INVALID } - private String LOGTAG = LibreOfficeUIActivity.class.getSimpleName(); - - private DocumentType newDocType = DocumentType.INVALID; + private static final String LOGTAG = LibreOfficeUIActivity.class.getSimpleName(); public static final String EXPLORER_PREFS_KEY = "EXPLORER_PREFS"; private static final String RECENT_DOCUMENTS_KEY = "RECENT_DOCUMENT_URIS"; @@ -123,7 +120,6 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements Settings }; private static final int REQUEST_CODE_OPEN_FILECHOOSER = 12345; - private static final int REQUEST_CODE_CREATE_NEW_DOCUMENT = 12346; private static final int PERMISSION_WRITE_EXTERNAL_STORAGE = 0; @@ -257,10 +253,6 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements Settings if (requestCode == REQUEST_CODE_OPEN_FILECHOOSER && resultCode == RESULT_OK) { final Uri fileUri = data.getData(); openDocument(fileUri); - } else if (requestCode == REQUEST_CODE_CREATE_NEW_DOCUMENT && resultCode == RESULT_OK) { - // "forward" to LibreOfficeMainActivity to create + open the file - final Uri fileUri = data.getData(); - loadNewDocument(newDocType, fileUri); } } @@ -295,33 +287,7 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements Settings startActivity(intent); } - private void createNewFileDialog() { - final String extension; - if (newDocType == DocumentType.WRITER) { - extension = FileUtilities.DEFAULT_WRITER_EXTENSION; - } else if (newDocType == DocumentType.CALC) { - extension = FileUtilities.DEFAULT_SPREADSHEET_EXTENSION; - } else if (newDocType == DocumentType.IMPRESS) { - extension = FileUtilities.DEFAULT_IMPRESS_EXTENSION; - } else if (newDocType == DocumentType.DRAW) { - extension = FileUtilities.DEFAULT_DRAWING_EXTENSION; - } else { - Log.e(LOGTAG, "Invalid document type passed."); - return; - } - - String defaultFileName = getString(R.string.default_document_name) + extension; - String mimeType = FileUtilities.getMimeType(defaultFileName); - - Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); - intent.addCategory(Intent.CATEGORY_OPENABLE); - intent.setType(mimeType); - intent.putExtra(Intent.EXTRA_TITLE, defaultFileName); - - startActivityForResult(intent, REQUEST_CODE_CREATE_NEW_DOCUMENT); - } - - private void loadNewDocument(DocumentType docType, Uri newFileUri) { + private void loadNewDocument(DocumentType docType) { final String newDocumentType; if (docType == DocumentType.WRITER) { newDocumentType = NEW_WRITER_STRING_KEY; @@ -338,7 +304,6 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements Settings Intent intent = new Intent(LibreOfficeUIActivity.this, LibreOfficeMainActivity.class); intent.putExtra(NEW_DOC_TYPE_KEY, newDocumentType); - intent.setData(newFileUri); startActivity(intent); } @@ -493,20 +458,16 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements Settings showSystemFilePickerAndOpenFile(); break; case R.id.newWriterFAB: - newDocType = DocumentType.WRITER; - createNewFileDialog(); + loadNewDocument(DocumentType.WRITER); break; case R.id.newImpressFAB: - newDocType = DocumentType.IMPRESS; - createNewFileDialog(); + loadNewDocument(DocumentType.IMPRESS); break; case R.id.newCalcFAB: - newDocType = DocumentType.CALC; - createNewFileDialog(); + loadNewDocument(DocumentType.CALC); break; case R.id.newDrawFAB: - newDocType = DocumentType.DRAW; - createNewFileDialog(); + loadNewDocument(DocumentType.DRAW); break; } } -- cgit v1.2.3