diff --git a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java index fd6ebe870a..243210a236 100755 --- a/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -1,23 +1,22 @@ /** - * ownCloud Android client application - * - * @author masensio - * @author David A. Velasco - * @author Juan Carlos González Cabrero - * Copyright (C) 2015 ownCloud Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * ownCloud Android client application * + * @author masensio + * @author David A. Velasco + * @author Juan Carlos González Cabrero + * Copyright (C) 2015 ownCloud Inc. + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + *

+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ package com.owncloud.android.ui.helpers; @@ -29,12 +28,14 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.Uri; -import android.os.Parcelable; +import android.os.Build; import android.support.annotation.Nullable; import android.support.v4.app.DialogFragment; +import android.support.v4.content.FileProvider; import android.webkit.MimeTypeMap; import android.widget.Toast; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.OCFile; @@ -70,7 +71,7 @@ import java.util.regex.Pattern; public class FileOperationsHelper { private static final String TAG = FileOperationsHelper.class.getSimpleName(); - + private static final String FTAG_CHOOSER_DIALOG = "CHOOSER_DIALOG"; protected FileActivity mFileActivity = null; @@ -78,21 +79,21 @@ public class FileOperationsHelper { /// Identifier of operation in progress which result shouldn't be lost private long mWaitingForOpId = Long.MAX_VALUE; - private static final Pattern mPatternUrl = Pattern.compile("^URL=(.+)$"); - private static final Pattern mPatternString = Pattern.compile("(.+)"); + private static final Pattern mPatternUrl = Pattern.compile("^URL=(.+)$"); + private static final Pattern mPatternString = Pattern.compile("(.+)"); public FileOperationsHelper(FileActivity fileActivity) { mFileActivity = fileActivity; } - @Nullable + @Nullable private String getUrlFromFile(String storagePath, Pattern pattern) { String url = null; InputStreamReader fr = null; BufferedReader br = null; try { - fr = new InputStreamReader(new FileInputStream(storagePath), "UTF8"); + fr = new InputStreamReader(new FileInputStream(storagePath), "UTF8"); br = new BufferedReader(fr); String line; @@ -104,7 +105,7 @@ public class FileOperationsHelper { } } } catch (IOException e) { - Log_OC.d(TAG, e.getMessage()); + Log_OC.d(TAG, e.getMessage()); } finally { if (br != null) { try { @@ -123,20 +124,20 @@ public class FileOperationsHelper { } } 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 + 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 + // mac internet shortcut file .webloc url = getUrlFromFile(storagePath, mPatternString); } } @@ -164,7 +165,7 @@ public class FileOperationsHelper { } } - if(openFileWithIntent == null) { + if (openFileWithIntent == null) { openFileWithIntent = createIntentFromFile(storagePath); } @@ -181,7 +182,7 @@ public class FileOperationsHelper { List launchables = mFileActivity.getPackageManager(). queryIntentActivities(openFileWithIntent, PackageManager.GET_INTENT_FILTERS); - if(launchables != null && launchables.size() > 0) { + if (launchables != null && launchables.size() > 0) { try { mFileActivity.startActivity( Intent.createChooser( @@ -249,7 +250,7 @@ public class FileOperationsHelper { } } - public void getFileWithLink(OCFile file){ + public void getFileWithLink(OCFile file) { if (isSharedSupported()) { if (file != null) { mFileActivity.showLoadingDialog(mFileActivity.getApplicationContext(). @@ -286,7 +287,7 @@ public class FileOperationsHelper { if (file != null) { // TODO check capability? mFileActivity.showLoadingDialog(mFileActivity.getApplicationContext(). - getString(R.string.wait_a_moment)); + getString(R.string.wait_a_moment)); Intent service = new Intent(mFileActivity, OperationsService.class); service.setAction(OperationsService.ACTION_CREATE_SHARE_WITH_SHAREE); @@ -334,7 +335,7 @@ public class FileOperationsHelper { queueShareIntent(unshareService); } - public void unshareFileWithUserOrGroup(OCFile file, ShareType shareType, String userOrGroup){ + public void unshareFileWithUserOrGroup(OCFile file, ShareType shareType, String userOrGroup) { // Unshare the file: Create the intent Intent unshareService = new Intent(mFileActivity, OperationsService.class); @@ -348,7 +349,7 @@ public class FileOperationsHelper { } - private void queueShareIntent(Intent shareIntent){ + private void queueShareIntent(Intent shareIntent) { if (isSharedSupported()) { // Unshare the file mWaitingForOpId = mFileActivity.getOperationsServiceBinder(). @@ -372,10 +373,10 @@ public class FileOperationsHelper { * * @param file File to share or unshare. */ - public void showShareFile(OCFile file){ + public void showShareFile(OCFile file) { Intent intent = new Intent(mFileActivity, ShareActivity.class); - intent.putExtra(mFileActivity.EXTRA_FILE, (Parcelable) file); - intent.putExtra(mFileActivity.EXTRA_ACCOUNT, mFileActivity.getAccount()); + intent.putExtra(FileActivity.EXTRA_FILE, file); + intent.putExtra(FileActivity.EXTRA_ACCOUNT, mFileActivity.getAccount()); mFileActivity.startActivity(intent); } @@ -503,8 +504,8 @@ public class FileOperationsHelper { // set MimeType sendIntent.setType(file.getMimetype()); sendIntent.putExtra( - Intent.EXTRA_STREAM, - file.getExposedFileUri(mFileActivity) + Intent.EXTRA_STREAM, + file.getExposedFileUri(mFileActivity) ); sendIntent.putExtra(Intent.ACTION_SEND, true); // Send Action @@ -519,7 +520,7 @@ public class FileOperationsHelper { } public void syncFiles(Collection files) { - for (OCFile file: files) { + for (OCFile file : files) { syncFile(file); } } @@ -527,13 +528,29 @@ public class FileOperationsHelper { public void setPictureAs(OCFile file) { if (file != null) { if (file.isDown()) { - File externalFile = new File(file.getStoragePath()); - Uri sendUri = Uri.fromFile(externalFile); - Intent intent = new Intent(Intent.ACTION_ATTACH_DATA); - intent.setDataAndType(sendUri, file.getMimetype()); - intent.putExtra("mimeType", file.getMimetype()); - mFileActivity.startActivityForResult(Intent.createChooser(intent, - mFileActivity.getString(R.string.set_as)), 200); + Context context = MainApp.getAppContext(); + + try { + File externalFile = new File(file.getStoragePath()); + Intent intent = new Intent(Intent.ACTION_ATTACH_DATA); + Uri sendUri; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + sendUri = FileProvider.getUriForFile(context, + context.getResources().getString(R.string.file_provider_authority), externalFile); + } else { + sendUri = Uri.fromFile(externalFile); + } + + intent.setDataAndType(sendUri, file.getMimetype()); + intent.putExtra("mimeType", file.getMimetype()); + mFileActivity.startActivityForResult(Intent.createChooser(intent, + mFileActivity.getString(R.string.set_as)), 200); + + } catch (ActivityNotFoundException exception) { + Toast.makeText(context, R.string.picture_set_as_no_app, Toast.LENGTH_LONG).show(); + } } } else { Log_OC.wtf(TAG, "Trying to send a NULL OCFile"); @@ -546,7 +563,7 @@ public class FileOperationsHelper { * @param file The file or folder to synchronize */ public void syncFile(OCFile file) { - if (!file.isFolder()){ + if (!file.isFolder()) { Intent intent = new Intent(mFileActivity, OperationsService.class); intent.setAction(OperationsService.ACTION_SYNC_FILE); intent.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount()); @@ -554,8 +571,8 @@ public class FileOperationsHelper { intent.putExtra(OperationsService.EXTRA_SYNC_FILE_CONTENTS, true); mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(intent); mFileActivity.showLoadingDialog(mFileActivity.getApplicationContext(). - getString(R.string.wait_a_moment)); - + getString(R.string.wait_a_moment)); + } else { Intent intent = new Intent(mFileActivity, OperationsService.class); intent.setAction(OperationsService.ACTION_SYNC_FOLDER); @@ -568,37 +585,37 @@ public class FileOperationsHelper { public void toggleFavoriteFiles(Collection files, boolean shouldBeFavorite) { List alreadyRightStateList = new ArrayList<>(); - for(OCFile file : files) { - if(file.getIsFavorite() == shouldBeFavorite) { + for (OCFile file : files) { + if (file.getIsFavorite() == shouldBeFavorite) { alreadyRightStateList.add(file); } } files.removeAll(alreadyRightStateList); - for (OCFile file: files) { + for (OCFile file : files) { toggleFavoriteFile(file, shouldBeFavorite); } } public void toggleFavoriteFile(OCFile file, boolean shouldBeFavorite) { - if(file.getIsFavorite() != shouldBeFavorite) { + if (file.getIsFavorite() != shouldBeFavorite) { EventBus.getDefault().post(new FavoriteEvent(file.getRemotePath(), shouldBeFavorite, file.getRemoteId())); } } - public void toogleOfflineFiles(Collection files, boolean isAvailableOffline){ + public void toogleOfflineFiles(Collection files, boolean isAvailableOffline) { List alreadyRightStateList = new ArrayList<>(); - for(OCFile file : files) { - if(file.isAvailableOffline() == isAvailableOffline) { + for (OCFile file : files) { + if (file.isAvailableOffline() == isAvailableOffline) { alreadyRightStateList.add(file); } } files.removeAll(alreadyRightStateList); - for (OCFile file: files) { + for (OCFile file : files) { toggleOfflineFile(file, isAvailableOffline); } } @@ -623,7 +640,7 @@ public class FileOperationsHelper { } } } - + public void renameFile(OCFile file, String newFilename) { // RenameFile Intent service = new Intent(mFileActivity, OperationsService.class); @@ -632,7 +649,7 @@ public class FileOperationsHelper { service.putExtra(OperationsService.EXTRA_REMOTE_PATH, file.getRemotePath()); service.putExtra(OperationsService.EXTRA_NEWNAME, newFilename); mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(service); - + mFileActivity.showLoadingDialog(mFileActivity.getString(R.string.wait_a_moment)); } @@ -654,7 +671,7 @@ public class FileOperationsHelper { service.putExtra(OperationsService.EXTRA_REMOVE_ONLY_LOCAL, onlyLocalCopy); mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(service); } - + mFileActivity.showLoadingDialog(mFileActivity.getString(R.string.wait_a_moment)); } @@ -666,8 +683,8 @@ public class FileOperationsHelper { service.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount()); service.putExtra(OperationsService.EXTRA_REMOTE_PATH, remotePath); service.putExtra(OperationsService.EXTRA_CREATE_FULL_PATH, createFullPath); - mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(service); - + mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(service); + mFileActivity.showLoadingDialog(mFileActivity.getString(R.string.wait_a_moment)); } @@ -765,7 +782,7 @@ public class FileOperationsHelper { mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(service); mFileActivity.showLoadingDialog( - mFileActivity.getString(R.string.wait_checking_credentials) + mFileActivity.getString(R.string.wait_checking_credentials) ); } } diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index cae1420011..663bc6f3d2 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -662,6 +662,7 @@ New notification received Logout + No app found to set a picture with!