mirror of
https://github.com/nextcloud/android.git
synced 2024-11-25 22:55:46 +03:00
Merge pull request #298 from zmatsuo/openUrlFile
Add open URL file feature
This commit is contained in:
commit
461b1c86b3
1 changed files with 91 additions and 25 deletions
116
src/com/owncloud/android/files/FileOperationsHelper.java
Normal file → Executable file
116
src/com/owncloud/android/files/FileOperationsHelper.java
Normal file → Executable file
|
@ -30,6 +30,7 @@ import android.content.pm.PackageManager;
|
||||||
import android.content.pm.ResolveInfo;
|
import android.content.pm.ResolveInfo;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v4.app.DialogFragment;
|
import android.support.v4.app.DialogFragment;
|
||||||
import android.webkit.MimeTypeMap;
|
import android.webkit.MimeTypeMap;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
@ -50,8 +51,13 @@ import com.owncloud.android.ui.activity.FileActivity;
|
||||||
import com.owncloud.android.ui.activity.ShareActivity;
|
import com.owncloud.android.ui.activity.ShareActivity;
|
||||||
import com.owncloud.android.ui.dialog.ShareLinkToDialog;
|
import com.owncloud.android.ui.dialog.ShareLinkToDialog;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -67,46 +73,106 @@ public class FileOperationsHelper {
|
||||||
/// Identifier of operation in progress which result shouldn't be lost
|
/// Identifier of operation in progress which result shouldn't be lost
|
||||||
private long mWaitingForOpId = Long.MAX_VALUE;
|
private long mWaitingForOpId = Long.MAX_VALUE;
|
||||||
|
|
||||||
|
private static final Pattern mPatternUrl = Pattern.compile("^URL=(.+)$");
|
||||||
|
private static final Pattern mPatternString = Pattern.compile("<string>(.+)</string>");
|
||||||
|
|
||||||
public FileOperationsHelper(FileActivity fileActivity) {
|
public FileOperationsHelper(FileActivity fileActivity) {
|
||||||
mFileActivity = fileActivity;
|
mFileActivity = fileActivity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private String getUrlFromFile(String storagePath, Pattern pattern) {
|
||||||
|
String url = null;
|
||||||
|
|
||||||
|
FileReader fr = null;
|
||||||
|
BufferedReader br = null;
|
||||||
|
try {
|
||||||
|
fr = new FileReader(storagePath);
|
||||||
|
br = new BufferedReader(fr);
|
||||||
|
|
||||||
|
String line;
|
||||||
|
while ((line = br.readLine()) != null) {
|
||||||
|
Matcher m = pattern.matcher(line);
|
||||||
|
if (m.find()) {
|
||||||
|
url = m.group(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log_OC.d(TAG, e.getMessage());
|
||||||
|
return null;
|
||||||
|
} finally {
|
||||||
|
if (br != null) {
|
||||||
|
try {
|
||||||
|
br.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log_OC.d(TAG, "Error closing buffered reader for URL file", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fr != null) {
|
||||||
|
try {
|
||||||
|
fr.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log_OC.d(TAG, "Error closing file reader for URL file", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private Intent createIntentFromFile(String storagePath) {
|
||||||
|
String url = null;
|
||||||
|
int lastIndexOfDot = storagePath.lastIndexOf('.');
|
||||||
|
if (lastIndexOfDot >= 0) {
|
||||||
|
String fileExt = storagePath.substring(lastIndexOfDot + 1);
|
||||||
|
if (fileExt.equalsIgnoreCase("url") ||fileExt.equalsIgnoreCase("desktop")) {
|
||||||
|
// Windows internet shortcut file .url
|
||||||
|
// Ubuntu internet shortcut file .desktop
|
||||||
|
url = getUrlFromFile(storagePath, mPatternUrl);
|
||||||
|
} else if (fileExt.equalsIgnoreCase("webloc")) {
|
||||||
|
// mac internet shortcut file .webloc
|
||||||
|
url = getUrlFromFile(storagePath, mPatternString);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (url == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new Intent(Intent.ACTION_VIEW, Uri.parse(url));
|
||||||
|
}
|
||||||
|
|
||||||
public void openFile(OCFile file) {
|
public void openFile(OCFile file) {
|
||||||
if (file != null) {
|
if (file != null) {
|
||||||
String storagePath = file.getStoragePath();
|
String storagePath = file.getStoragePath();
|
||||||
String encodedStoragePath = WebdavUtils.encodePath(storagePath);
|
String encodedStoragePath = WebdavUtils.encodePath(storagePath);
|
||||||
|
Uri uri = Uri.parse("file://" + encodedStoragePath);
|
||||||
|
|
||||||
Intent intentForSavedMimeType = new Intent(Intent.ACTION_VIEW);
|
Intent openFileWithIntent = null;
|
||||||
intentForSavedMimeType.setDataAndType(Uri.parse("file://"+ encodedStoragePath),
|
int lastIndexOfDot = storagePath.lastIndexOf('.');
|
||||||
file.getMimetype());
|
if (lastIndexOfDot >= 0) {
|
||||||
intentForSavedMimeType.setFlags(
|
String fileExt = storagePath.substring(lastIndexOfDot + 1);
|
||||||
Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
|
String guessedMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileExt);
|
||||||
);
|
if (guessedMimeType != null) {
|
||||||
|
openFileWithIntent = new Intent(Intent.ACTION_VIEW);
|
||||||
Intent intentForGuessedMimeType = null;
|
openFileWithIntent.setDataAndType(uri, guessedMimeType);
|
||||||
if (storagePath.lastIndexOf('.') >= 0) {
|
|
||||||
String guessedMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
|
|
||||||
storagePath.substring(storagePath.lastIndexOf('.') + 1)
|
|
||||||
);
|
|
||||||
if (guessedMimeType != null && !guessedMimeType.equals(file.getMimetype())) {
|
|
||||||
intentForGuessedMimeType = new Intent(Intent.ACTION_VIEW);
|
|
||||||
intentForGuessedMimeType.setDataAndType(Uri.parse("file://" +
|
|
||||||
encodedStoragePath), guessedMimeType);
|
|
||||||
intentForGuessedMimeType.setFlags(
|
|
||||||
Intent.FLAG_GRANT_READ_URI_PERMISSION |
|
|
||||||
Intent.FLAG_GRANT_WRITE_URI_PERMISSION
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Intent openFileWithIntent;
|
if(openFileWithIntent == null) {
|
||||||
if (intentForGuessedMimeType != null) {
|
openFileWithIntent = createIntentFromFile(storagePath);
|
||||||
openFileWithIntent = intentForGuessedMimeType;
|
|
||||||
} else {
|
|
||||||
openFileWithIntent = intentForSavedMimeType;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (openFileWithIntent == null) {
|
||||||
|
openFileWithIntent = new Intent(Intent.ACTION_VIEW);
|
||||||
|
openFileWithIntent.setDataAndType(uri, file.getMimetype());
|
||||||
|
}
|
||||||
|
|
||||||
|
openFileWithIntent.setFlags(
|
||||||
|
Intent.FLAG_GRANT_READ_URI_PERMISSION |
|
||||||
|
Intent.FLAG_GRANT_WRITE_URI_PERMISSION
|
||||||
|
);
|
||||||
|
|
||||||
List<ResolveInfo> launchables = mFileActivity.getPackageManager().
|
List<ResolveInfo> launchables = mFileActivity.getPackageManager().
|
||||||
queryIntentActivities(openFileWithIntent, PackageManager.GET_INTENT_FILTERS);
|
queryIntentActivities(openFileWithIntent, PackageManager.GET_INTENT_FILTERS);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue