Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.owncloud.android.ui.helpers;

public class FileOperationsHelperTest {
}
4 changes: 3 additions & 1 deletion src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -111,12 +111,14 @@
android:theme="@style/Theme.ownCloud.Launcher">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
</intent-filter>
<intent-filter>
<action android:name="NC_OPEN_FILE" />
</intent-filter>
<meta-data android:name="android.app.searchable"
android:resource="@xml/users_and_groups_searchable"/>
</activity>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ public class FileDisplayActivity extends FileActivity
public static final String RESTART = "RESTART";
public static final String ALL_FILES = "ALL_FILES";
public static final String PHOTO_SEARCH = "PHOTO_SEARCH";
public static final String OPEN_FILE = "NC_OPEN_FILE";

private SyncBroadcastReceiver mSyncBroadcastReceiver;
private UploadFinishReceiver mUploadFinishReceiver;
Expand Down Expand Up @@ -329,6 +330,11 @@ public void onClick(View v) {

upgradeNotificationForInstantUpload();
checkOutdatedServer();

if (OPEN_FILE.equals(getIntent().getAction())) {
getSupportFragmentManager().executePendingTransactions();
onOpenFileIntent(getIntent());
}
}

private Activity getActivity() {
Expand Down Expand Up @@ -511,6 +517,8 @@ protected void onNewIntent(Intent intent) {
showDetails(file);
} else if (Intent.ACTION_VIEW.equals(intent.getAction())) {
handleOpenFileViaIntent(intent);
} else if (OPEN_FILE.equals(intent.getAction())) {
onOpenFileIntent(intent);
} else if (RESTART.equals(intent.getAction())) {
finish();
startActivity(intent);
Expand Down Expand Up @@ -568,6 +576,14 @@ protected void onNewIntent(Intent intent) {
}
}

private void onOpenFileIntent(Intent intent) {
String extra = intent.getStringExtra(EXTRA_FILE);
OCFile file = getStorageManager().getFileByPath(extra);

OCFileListFragment fileListFragment = getListOfFilesFragment();
fileListFragment.onItemClicked(file);
}

private void doShareWith(String shareeName, ShareType shareType) {
getFileOperationsHelper().shareFileWithSharee(getFile(), shareeName, shareType,
getAppropriatePermissions(shareType));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@
import com.owncloud.android.ui.events.FavoriteEvent;
import com.owncloud.android.ui.events.SearchEvent;
import com.owncloud.android.ui.helpers.FileOperationsHelper;
import com.owncloud.android.ui.helpers.MenuHelper;
import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface;
import com.owncloud.android.ui.preview.PreviewImageFragment;
import com.owncloud.android.ui.preview.PreviewMediaFragment;
Expand Down Expand Up @@ -494,7 +495,7 @@ public void showActivityDetailView(OCFile file) {
@Override
public void onOverflowIconClicked(OCFile file, View view) {
PopupMenu popup = new PopupMenu(getActivity(), view);
popup.inflate(R.menu.item_file);
MenuHelper.inflateItemFileMenu(popup.getMenuInflater(), popup.getMenu());
Account currentAccount = ((FileActivity) getActivity()).getAccount();
FileMenuFilter mf = new FileMenuFilter(mAdapter.getFiles().size(),
Collections.singleton(file),
Expand Down Expand Up @@ -630,7 +631,7 @@ public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mActiveActionMode = mode;

MenuInflater inflater = getActivity().getMenuInflater();
inflater.inflate(R.menu.item_file, menu);
MenuHelper.inflateItemFileMenu(inflater, menu);
mode.invalidate();

//set gray color
Expand Down Expand Up @@ -1109,6 +1110,12 @@ public boolean onFileActionChosen(MenuItem item, Set<OCFile> checkedFiles) {
mContainerActivity.getFileOperationsHelper().toggleEncryption(singleFile, false);
return true;
}
case R.id.action_add_shortcut_to_homescreen: {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {
mContainerActivity.getFileOperationsHelper().addShortcutToHomescreen(singleFile);
}
return true;
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,20 @@
import android.Manifest;
import android.accounts.Account;
import android.app.Activity;
import android.app.PendingIntent;
import android.content.ActivityNotFoundException;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
Expand All @@ -45,6 +53,13 @@
import android.view.View;
import android.webkit.MimeTypeMap;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.core.content.FileProvider;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import com.evernote.android.job.JobRequest;
import com.nextcloud.client.account.CurrentAccountProvider;
import com.nextcloud.client.account.User;
Expand All @@ -53,6 +68,7 @@
import com.owncloud.android.R;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
import com.owncloud.android.datamodel.ThumbnailsCacheManager;
import com.owncloud.android.files.StreamMediaFileOperation;
import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
Expand All @@ -68,6 +84,7 @@
import com.owncloud.android.ui.activity.ConflictsResolveActivity;
import com.owncloud.android.ui.activity.ExternalSiteWebView;
import com.owncloud.android.ui.activity.FileActivity;
import com.owncloud.android.ui.activity.FileDisplayActivity;
import com.owncloud.android.ui.activity.RichDocumentsEditorWebView;
import com.owncloud.android.ui.activity.ShareActivity;
import com.owncloud.android.ui.activity.TextEditorWebView;
Expand All @@ -77,6 +94,7 @@
import com.owncloud.android.ui.events.SyncEventFinished;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.FileStorageUtils;
import com.owncloud.android.utils.MimeTypeUtil;
import com.owncloud.android.utils.PermissionUtil;
import com.owncloud.android.utils.UriUtils;

Expand All @@ -98,13 +116,6 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.core.content.FileProvider;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

/**
* Helper implementation for file operations locally and remote.
*/
Expand Down Expand Up @@ -1028,6 +1039,73 @@ private void deleteOldFiles(Activity activity) {
}
}

/**
* Adds a pinned shortcut to the home screen that points to the passed file/folder.
*
* @param file The file/folder to which a pinned shortcut should be added to the home screen.
*/
public void addShortcutToHomescreen(OCFile file) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
final ShortcutManager shortcutManager = fileActivity.getSystemService(ShortcutManager.class);

if (shortcutManager.isRequestPinShortcutSupported()) {
final Intent intent = new Intent(fileActivity, FileDisplayActivity.class);
intent.setAction(FileDisplayActivity.OPEN_FILE);
intent.putExtra(FileActivity.EXTRA_FILE, file.getRemotePath());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

final String shortcutId = "nextcloud_shortcut_" + file.getRemoteId();

Icon icon;

Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
ThumbnailsCacheManager.PREFIX_THUMBNAIL + file.getRemoteId());
if (thumbnail != null) {
thumbnail = bitmapToAdaptiveBitmap(thumbnail, fileActivity);
icon = Icon.createWithAdaptiveBitmap(thumbnail);
} else if (file.isFolder()) {
icon = Icon.createWithResource(fileActivity,
MimeTypeUtil.getFolderTypeIconId(file.isSharedWithMe() ||
file.isSharedWithSharee(), file.isSharedViaLink(), file.isEncrypted(), file.getMountType()));
} else {
icon = Icon.createWithResource(fileActivity,
MimeTypeUtil.getFileTypeIconId(file.getMimeType(), file.getFileName()));
}

final ShortcutInfo pinShortcutInfo = new ShortcutInfo.Builder(fileActivity, shortcutId)
.setShortLabel(file.getFileName())
.setLongLabel("Open " + file.getFileName())
.setIcon(icon)
.setIntent(intent)
.build();

final Intent pinnedShortcutCallbackIntent =
shortcutManager.createShortcutResultIntent(pinShortcutInfo);

final PendingIntent successCallback = PendingIntent.getBroadcast(fileActivity, 0,
pinnedShortcutCallbackIntent, 0);

shortcutManager.requestPinShortcut(pinShortcutInfo,
successCallback.getIntentSender());
}
}
}

private static Bitmap bitmapToAdaptiveBitmap(final Bitmap orig, final Context context) {
final float screenDensity = context.getResources().getDisplayMetrics().density;
final int adaptiveIconSize = Math.round(108 * screenDensity);
final int adaptiveIconOuterSides = Math.round(18 * screenDensity);

Drawable drawable = new BitmapDrawable(context.getResources(), orig);

final Bitmap bitmap = Bitmap.createBitmap(adaptiveIconSize, adaptiveIconSize, Bitmap.Config.ARGB_8888);
final Canvas canvas = new Canvas(bitmap);
drawable.setBounds(adaptiveIconOuterSides, adaptiveIconOuterSides, adaptiveIconSize - adaptiveIconOuterSides,
adaptiveIconSize - adaptiveIconOuterSides);
drawable.draw(canvas);
return bitmap;
}

public static File createImageFile(Activity activity) {
File storageDir = activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES);

Expand Down
28 changes: 28 additions & 0 deletions src/main/java/com/owncloud/android/ui/helpers/MenuHelper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.owncloud.android.ui.helpers;

import android.os.Build;
import android.view.Menu;
import android.view.MenuInflater;

import com.owncloud.android.R;

/**
* Collection of helper functions for handling menus.
*/
public final class MenuHelper {

private MenuHelper() {

}

/**
* Inflates the item file menu and handles menu items according to SDK version.
*
* @param inflater The inflater to use for inflation of the item file menu.
* @param menu The menu into which to inflate.
*/
public static void inflateItemFileMenu(final MenuInflater inflater, final Menu menu) {
inflater.inflate(R.menu.item_file, menu);
menu.findItem(R.id.action_add_shortcut_to_homescreen).setVisible(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can't say for sure if it will be the right place, but you might want to check if this needs to be moved/added to FileMenuFilter, while this might not work since (unfortunately) FileMenuFilter isn't used in all places where R.menu.item_fileis being used while your implementation (correctly) is.

So also looping in @tobiasKaminsky @ezaquarii for further discussion

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
import com.owncloud.android.ui.fragment.FileFragment;
import com.owncloud.android.ui.helpers.MenuHelper;
import com.owncloud.android.utils.BitmapUtils;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.MimeType;
Expand Down Expand Up @@ -322,7 +323,7 @@ public void onStop() {
@Override
public void onCreateOptionsMenu(@NotNull Menu menu, @NotNull MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.item_file, menu);
MenuHelper.inflateItemFileMenu(inflater, menu);

int nightModeFlag = getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
import com.owncloud.android.ui.fragment.FileFragment;
import com.owncloud.android.ui.helpers.MenuHelper;
import com.owncloud.android.utils.MimeTypeUtil;

import java.lang.ref.WeakReference;
Expand Down Expand Up @@ -340,7 +341,7 @@ private void stopAudio() {
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
menu.removeItem(R.id.action_search);
inflater.inflate(R.menu.item_file, menu);
MenuHelper.inflateItemFileMenu(inflater, menu);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import com.owncloud.android.ui.activity.FileDisplayActivity;
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
import com.owncloud.android.ui.helpers.MenuHelper;
import com.owncloud.android.utils.DisplayUtils;
import com.owncloud.android.utils.MimeTypeUtil;

Expand Down Expand Up @@ -235,7 +236,7 @@ protected void onPostExecute(final StringWriter stringWriter) {
@Override
public void onCreateOptionsMenu(@NotNull Menu menu, @NotNull MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.item_file, menu);
MenuHelper.inflateItemFileMenu(inflater, menu);

MenuItem menuItem = menu.findItem(R.id.action_search);
menuItem.setVisible(true);
Expand Down
9 changes: 8 additions & 1 deletion src/main/java/com/owncloud/android/utils/MimeTypeUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,13 @@ public static Drawable getFolderTypeIcon(boolean isSharedViaUsers, boolean isSha
public static Drawable getFolderTypeIcon(boolean isSharedViaUsers, boolean isSharedViaLink,
boolean isEncrypted, Account account, WebdavEntry.MountType mountType,
Context context) {
int drawableId = getFolderTypeIconId(isSharedViaUsers, isSharedViaLink, isEncrypted, mountType);

return ThemeUtils.tintDrawable(drawableId, ThemeUtils.elementColor(account, context));
}

public static int getFolderTypeIconId(boolean isSharedViaUsers, boolean isSharedViaLink,
boolean isEncrypted, WebdavEntry.MountType mountType) {
int drawableId;

if (isSharedViaLink) {
Expand All @@ -177,7 +184,7 @@ public static Drawable getFolderTypeIcon(boolean isSharedViaUsers, boolean isSha
drawableId = R.drawable.folder;
}

return ThemeUtils.tintDrawable(drawableId, ThemeUtils.elementColor(account, context));
return drawableId;
}

public static Drawable getDefaultFolderIcon(Context context) {
Expand Down
6 changes: 6 additions & 0 deletions src/main/res/menu/item_file.xml
Original file line number Diff line number Diff line change
Expand Up @@ -137,4 +137,10 @@
app:showAsAction="never"
android:showAsAction="never" />

<item
android:id="@+id/action_add_shortcut_to_homescreen"
android:title="@string/add_shortcut_to_home"
app:showAsAction="never"
android:showAsAction="never" />

</menu>
1 change: 1 addition & 0 deletions src/main/res/values-de/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@
<string name="what_s_new_image">Was-gibt\'s-Neues-Bild</string>
<string name="whats_new_skip">Überspringen</string>
<string name="whats_new_title">Neu in %1$s</string>
<string name="add_shortcut_to_home">Zum Startbildschirm hinzufügen</string>
<plurals name="sync_fail_in_favourites_content">
<item quantity="one">Inhalte von %1$d Datei konnten nicht synchronisiert werden (Konflikte: %2$d)</item>
<item quantity="other">Inhalte von %1$d Dateien konnten nicht synchronisiert werden (Konflikte: %2$d)</item>
Expand Down
1 change: 1 addition & 0 deletions src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -920,6 +920,7 @@
<string name="upload_list_delete">Delete</string>
<string name="create_new">Create new</string>
<string name="editor_placeholder" translatable="false">%1$s %2$s</string>
<string name="add_shortcut_to_home">Add to home screen</string>

<string name="sync_not_enough_space_dialog_action_choose">Choose what to sync</string>
<string name="sync_not_enough_space_dialog_action_free_space">Free up space</string>
Expand Down