android: add view document from other file-managers functionality.
Change-Id: I2325110a18c0acd93ec235e1a2e0dcc55affa6f5 Reviewed-on: https://gerrit.libreoffice.org/70025 Reviewed-by: Jan Holesovsky <kendy@collabora.com> Tested-by: Jan Holesovsky <kendy@collabora.com>
This commit is contained in:
parent
75949f6fd2
commit
c74a47bc7e
4 changed files with 133 additions and 22 deletions
|
@ -101,11 +101,12 @@
|
|||
<data android:mimeType="image/x-wmf" />
|
||||
<data android:mimeType="image/svg+xml" />
|
||||
</intent-filter>
|
||||
</activity> <!-- Document Provider Settings Activity -->
|
||||
<activity
|
||||
android:name=".storage.DocumentProviderSettingsActivity"
|
||||
android:label="@string/storage_provider_settings"
|
||||
android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
|
||||
</activity>
|
||||
|
||||
<!-- Document Provider Settings Activity -->
|
||||
<activity android:name=".storage.DocumentProviderSettingsActivity"
|
||||
android:theme="@style/Theme.AppCompat.Light.DarkActionBar"
|
||||
android:label="@string/storage_provider_settings">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
</intent-filter>
|
||||
|
|
|
@ -9,8 +9,10 @@
|
|||
|
||||
package org.libreoffice.androidapp;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.content.SharedPreferences;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.res.AssetFileDescriptor;
|
||||
import android.content.res.AssetManager;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
|
@ -22,24 +24,39 @@ import android.webkit.WebSettings;
|
|||
import android.webkit.WebView;
|
||||
import android.webkit.WebViewClient;
|
||||
import android.widget.Button;
|
||||
import android.widget.Toast;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.channels.Channels;
|
||||
import java.nio.channels.FileChannel;
|
||||
import java.nio.channels.ReadableByteChannel;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.core.app.ActivityCompat;
|
||||
import androidx.core.content.ContextCompat;
|
||||
|
||||
public class MainActivity extends AppCompatActivity {
|
||||
final static String TAG = "MainActivity";
|
||||
|
||||
private static final String ASSETS_EXTRACTED_PREFS_KEY = "ASSETS_EXTRACTED";
|
||||
private static final int PERMISSION_WRITE_EXTERNAL_STORAGE = 777;
|
||||
|
||||
WebView mWebView;
|
||||
private File mTempFile = null;
|
||||
|
||||
private int providerId;
|
||||
private URI documentUri;
|
||||
|
||||
private String urlToLoad;
|
||||
private WebView mWebView;
|
||||
|
||||
private boolean isDocEditable = false;
|
||||
private boolean isDocDebuggable = true;
|
||||
|
||||
private static boolean copyFromAssets(AssetManager assetManager,
|
||||
String fromAssetPath, String targetDir) {
|
||||
|
@ -49,7 +66,7 @@ public class MainActivity extends AppCompatActivity {
|
|||
boolean res = true;
|
||||
for (String file : files) {
|
||||
String[] dirOrFile = assetManager.list(fromAssetPath + "/" + file);
|
||||
if ( dirOrFile.length == 0) {
|
||||
if (dirOrFile.length == 0) {
|
||||
// noinspection ResultOfMethodCallIgnored
|
||||
new File(targetDir).mkdirs();
|
||||
res &= copyAsset(assetManager,
|
||||
|
@ -127,8 +144,29 @@ public class MainActivity extends AppCompatActivity {
|
|||
String cacheDir = getApplication().getCacheDir().getAbsolutePath();
|
||||
String apkFile = getApplication().getPackageResourcePath();
|
||||
|
||||
// String urlToLoad = "file://" + dataDir + "/hello-world.odt";
|
||||
String urlToLoad=getIntent().getStringExtra("URI");
|
||||
if (getIntent().getData() != null) {
|
||||
|
||||
if (getIntent().getData().getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
|
||||
isDocEditable = false;
|
||||
Toast.makeText(this, getResources().getString(R.string.temp_file_saving_disabled), Toast.LENGTH_SHORT).show();
|
||||
if (copyFileToTemp() && mTempFile != null) {
|
||||
urlToLoad = mTempFile.toURI().toString();
|
||||
Log.d(TAG, "SCHEME_CONTENT: getPath(): " + getIntent().getData().getPath());
|
||||
} else {
|
||||
// TODO: can't open the file
|
||||
Log.e(TAG, "couldn't create temporary file from " + getIntent().getData());
|
||||
}
|
||||
} else if (getIntent().getData().getScheme().equals(ContentResolver.SCHEME_FILE)) {
|
||||
isDocEditable = true;
|
||||
urlToLoad = getIntent().getData().getPath();
|
||||
Log.d(TAG, "SCHEME_FILE: getPath(): " + getIntent().getData().getPath());
|
||||
// Gather data to rebuild IFile object later
|
||||
providerId = getIntent().getIntExtra(
|
||||
"org.libreoffice.document_provider_id", 0);
|
||||
documentUri = (URI) getIntent().getSerializableExtra(
|
||||
"org.libreoffice.document_uri");
|
||||
}
|
||||
}
|
||||
|
||||
createLOOLWSD(dataDir, cacheDir, apkFile, assetManager, urlToLoad);
|
||||
|
||||
|
@ -147,11 +185,48 @@ public class MainActivity extends AppCompatActivity {
|
|||
}
|
||||
}
|
||||
|
||||
mWebView.loadUrl("file:///android_asset/dist/loleaflet.html?file_path=" +
|
||||
urlToLoad +
|
||||
"&closebutton=1&permission=edit" +
|
||||
"&debug=true"); // TODO remove later?
|
||||
loadDocument();
|
||||
}
|
||||
|
||||
private boolean copyFileToTemp() {
|
||||
ContentResolver contentResolver = getContentResolver();
|
||||
FileChannel inputChannel = null;
|
||||
FileChannel outputChannel = null;
|
||||
// CSV files need a .csv suffix to be opened in Calc.
|
||||
String suffix = null;
|
||||
String intentType = getIntent().getType();
|
||||
// K-9 mail uses the first, GMail uses the second variant.
|
||||
if ("text/comma-separated-values".equals(intentType) || "text/csv".equals(intentType))
|
||||
suffix = ".csv";
|
||||
|
||||
try {
|
||||
try {
|
||||
AssetFileDescriptor assetFD = contentResolver.openAssetFileDescriptor(getIntent().getData(), "r");
|
||||
if (assetFD == null) {
|
||||
Log.e(TAG, "couldn't create assetfiledescriptor from " + getIntent().getDataString());
|
||||
return false;
|
||||
}
|
||||
inputChannel = assetFD.createInputStream().getChannel();
|
||||
mTempFile = File.createTempFile("LibreOffice", suffix, this.getCacheDir());
|
||||
|
||||
outputChannel = new FileOutputStream(mTempFile).getChannel();
|
||||
long bytesTransferred = 0;
|
||||
// might not copy all at once, so make sure everything gets copied....
|
||||
while (bytesTransferred < inputChannel.size()) {
|
||||
bytesTransferred += outputChannel.transferFrom(inputChannel, bytesTransferred, inputChannel.size());
|
||||
}
|
||||
Log.e(TAG, "Success copying " + bytesTransferred + " bytes");
|
||||
return true;
|
||||
} finally {
|
||||
if (inputChannel != null) inputChannel.close();
|
||||
if (outputChannel != null) outputChannel.close();
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
return false;
|
||||
} catch (IOException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
|
@ -162,37 +237,61 @@ public class MainActivity extends AppCompatActivity {
|
|||
updatePreferences();
|
||||
}
|
||||
|
||||
private void loadDocument() {
|
||||
String finalUrlToLoad = "file:///android_asset/dist/loleaflet.html?file_path=" +
|
||||
urlToLoad+"&closebutton=1";
|
||||
if (isDocEditable) {
|
||||
finalUrlToLoad += "&permission=edit";
|
||||
} else {
|
||||
finalUrlToLoad += "&permission=readonly";
|
||||
}
|
||||
if (isDocDebuggable) {
|
||||
finalUrlToLoad += "&debug=true";
|
||||
}
|
||||
mWebView.loadUrl(finalUrlToLoad);
|
||||
}
|
||||
|
||||
static {
|
||||
System.loadLibrary("androidapp");
|
||||
}
|
||||
|
||||
/** Initialize the LOOLWSD to load 'loadFileURL'. */
|
||||
/**
|
||||
* Initialize the LOOLWSD to load 'loadFileURL'.
|
||||
*/
|
||||
public native void createLOOLWSD(String dataDir, String cacheDir, String apkFile, AssetManager assetManager, String loadFileURL);
|
||||
|
||||
/** Passing messages from JS (instead of the websocket communication). */
|
||||
/**
|
||||
* Passing messages from JS (instead of the websocket communication).
|
||||
*/
|
||||
@JavascriptInterface
|
||||
public native void postMobileMessage(String message);
|
||||
|
||||
/** Passing messages from JS (instead of the websocket communication). */
|
||||
/**
|
||||
* Passing messages from JS (instead of the websocket communication).
|
||||
*/
|
||||
@JavascriptInterface
|
||||
public void postMobileError(String message) {
|
||||
// TODO handle this
|
||||
Log.d(TAG, "postMobileError: " + message);
|
||||
}
|
||||
|
||||
/** Passing messages from JS (instead of the websocket communication). */
|
||||
/**
|
||||
* Passing messages from JS (instead of the websocket communication).
|
||||
*/
|
||||
@JavascriptInterface
|
||||
public void postMobileDebug(String message) {
|
||||
// TODO handle this
|
||||
Log.d(TAG, "postMobileDebug: " + message);
|
||||
}
|
||||
|
||||
/** Passing message the other way around - from Java to the FakeWebSocket in JS. */
|
||||
/**
|
||||
* Passing message the other way around - from Java to the FakeWebSocket in JS.
|
||||
*/
|
||||
void callFakeWebsocketOnMessage(final String message) {
|
||||
// call from the UI thread
|
||||
mWebView.post(new Runnable() {
|
||||
public void run() {
|
||||
Log.i(TAG,"Forwarding to the WebView: " + message);
|
||||
Log.i(TAG, "Forwarding to the WebView: " + message);
|
||||
mWebView.loadUrl("javascript:window.TheFakeWebSocket.onmessage({'data':" + message + "});");
|
||||
}
|
||||
});
|
||||
|
|
|
@ -580,9 +580,19 @@ public class LibreOfficeUIActivity extends AppCompatActivity implements /*Settin
|
|||
@Override
|
||||
protected void onPostExecute(File file) {
|
||||
if (file != null) {
|
||||
Intent intent = new Intent(getBaseContext(), MainActivity.class);
|
||||
intent.putExtra("URI", document.getUri().toString());
|
||||
startActivity(intent);
|
||||
Intent i = new Intent(Intent.ACTION_VIEW, Uri.fromFile(file));
|
||||
String packageName = getApplicationContext().getPackageName();
|
||||
ComponentName componentName = new ComponentName(packageName,
|
||||
MainActivity.class.getName());
|
||||
i.setComponent(componentName);
|
||||
|
||||
// these extras allow to rebuild the IFile object in LOMainActivity
|
||||
i.putExtra("org.libreoffice.document_provider_id",
|
||||
documentProvider.getId());
|
||||
i.putExtra("org.libreoffice.document_uri",
|
||||
document.getUri());
|
||||
|
||||
startActivity(i);
|
||||
}
|
||||
}
|
||||
}.execute(document);
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
<string name="app_vendor">This release was supplied by $VENDOR.</string>
|
||||
<string name="no_recent_items">No recent items</string>
|
||||
<string name="no_items">No items</string>
|
||||
<string name="temp_file_saving_disabled">This file is read-only, saving is disabled.</string>
|
||||
|
||||
<string name="about_license">Show License</string>
|
||||
<string name="about_notice">Show Notice</string>
|
||||
|
|
Loading…
Reference in a new issue