Skip to content

Commit ac7d82a

Browse files
Merge pull request #15855 from nextcloud/fix/open-file-intent-crash
fix: open file intent crash
2 parents 416e2b8 + 27340de commit ac7d82a

File tree

6 files changed

+112
-60
lines changed

6 files changed

+112
-60
lines changed

app/src/main/java/com/nextcloud/utils/ShortcutUtil.kt

Lines changed: 50 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -45,52 +45,62 @@ class ShortcutUtil @Inject constructor(private val mContext: Context) {
4545
user: User,
4646
syncedFolderProvider: SyncedFolderProvider
4747
) {
48-
if (ShortcutManagerCompat.isRequestPinShortcutSupported(mContext)) {
49-
val intent = Intent(mContext, FileDisplayActivity::class.java)
50-
intent.action = FileDisplayActivity.OPEN_FILE
51-
intent.putExtra(FileActivity.EXTRA_FILE, file.remotePath)
52-
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
53-
val shortcutId = "nextcloud_shortcut_" + file.remoteId
54-
val icon: IconCompat
55-
var thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
56-
ThumbnailsCacheManager.PREFIX_THUMBNAIL + file.remoteId
57-
)
58-
if (thumbnail != null) {
59-
thumbnail = bitmapToAdaptiveBitmap(thumbnail)
60-
icon = IconCompat.createWithAdaptiveBitmap(thumbnail)
61-
} else if (file.isFolder) {
48+
if (!ShortcutManagerCompat.isRequestPinShortcutSupported(mContext)) {
49+
return
50+
}
51+
52+
val intent = Intent(mContext, FileDisplayActivity::class.java).apply {
53+
action = FileDisplayActivity.OPEN_FILE
54+
putExtra(FileActivity.EXTRA_FILE_REMOTE_PATH, file.decryptedRemotePath)
55+
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
56+
}
57+
58+
val icon = createShortcutIcon(file, viewThemeUtils, user, syncedFolderProvider)
59+
60+
val shortcutInfo = ShortcutInfoCompat.Builder(mContext, "nextcloud_shortcut_${file.remoteId}")
61+
.setShortLabel(file.fileName)
62+
.setLongLabel(mContext.getString(R.string.pin_shortcut_label, file.fileName))
63+
.setIcon(icon)
64+
.setIntent(intent)
65+
.build()
66+
67+
val resultIntent =
68+
ShortcutManagerCompat.createShortcutResultIntent(mContext, shortcutInfo)
69+
70+
val pendingIntent = PendingIntent.getBroadcast(
71+
mContext,
72+
file.hashCode(),
73+
resultIntent,
74+
FLAG_IMMUTABLE
75+
)
76+
77+
ShortcutManagerCompat.requestPinShortcut(mContext, shortcutInfo, pendingIntent.intentSender)
78+
}
79+
80+
private fun createShortcutIcon(
81+
file: OCFile,
82+
viewThemeUtils: ViewThemeUtils,
83+
user: User,
84+
syncedFolderProvider: SyncedFolderProvider
85+
): IconCompat {
86+
val thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
87+
ThumbnailsCacheManager.PREFIX_THUMBNAIL + file.remoteId
88+
)
89+
90+
return when {
91+
thumbnail != null -> IconCompat.createWithAdaptiveBitmap(bitmapToAdaptiveBitmap(thumbnail))
92+
93+
file.isFolder -> {
6294
val isAutoUploadFolder = SyncedFolderProvider.isAutoUploadFolder(syncedFolderProvider, file, user)
6395
val isDarkModeActive = syncedFolderProvider.preferences.isDarkModeEnabled
64-
6596
val overlayIconId = file.getFileOverlayIconId(isAutoUploadFolder)
6697
val drawable = MimeTypeUtil.getFolderIcon(isDarkModeActive, overlayIconId, mContext, viewThemeUtils)
67-
val bitmapIcon = drawable.toBitmap()
68-
icon = IconCompat.createWithBitmap(bitmapIcon)
69-
} else {
70-
icon = IconCompat.createWithResource(
71-
mContext,
72-
MimeTypeUtil.getFileTypeIconId(file.mimeType, file.fileName)
73-
)
98+
IconCompat.createWithBitmap(drawable.toBitmap())
7499
}
75-
val longLabel = mContext.getString(R.string.pin_shortcut_label, file.fileName)
76-
val pinShortcutInfo = ShortcutInfoCompat.Builder(mContext, shortcutId)
77-
.setShortLabel(file.fileName)
78-
.setLongLabel(longLabel)
79-
.setIcon(icon)
80-
.setIntent(intent)
81-
.build()
82-
val pinnedShortcutCallbackIntent =
83-
ShortcutManagerCompat.createShortcutResultIntent(mContext, pinShortcutInfo)
84-
val successCallback = PendingIntent.getBroadcast(
85-
mContext,
86-
0,
87-
pinnedShortcutCallbackIntent,
88-
FLAG_IMMUTABLE
89-
)
90-
ShortcutManagerCompat.requestPinShortcut(
100+
101+
else -> IconCompat.createWithResource(
91102
mContext,
92-
pinShortcutInfo,
93-
successCallback.intentSender
103+
MimeTypeUtil.getFileTypeIconId(file.mimeType, file.fileName)
94104
)
95105
}
96106
}

app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ public abstract class FileActivity extends DrawerActivity
129129
LoadingVersionNumberTask.VersionDevInterface, FileDetailSharingFragment.OnEditShareListener, NetworkChangeListener {
130130

131131
public static final String EXTRA_FILE = "com.owncloud.android.ui.activity.FILE";
132+
public static final String EXTRA_FILE_REMOTE_PATH = "com.owncloud.android.ui.activity.FILE_REMOTE_PATH";
132133
public static final String EXTRA_LIVE_PHOTO_FILE = "com.owncloud.android.ui.activity.LIVE.PHOTO.FILE";
133134
public static final String EXTRA_USER = "com.owncloud.android.ui.activity.USER";
134135
public static final String EXTRA_FROM_NOTIFICATION = "com.owncloud.android.ui.activity.FROM_NOTIFICATION";

app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ class FileDisplayActivity :
551551

552552
when {
553553
ACTION_DETAILS.equals(action, ignoreCase = true) -> {
554-
val file = intent.getParcelableArgument(EXTRA_FILE, OCFile::class.java)
554+
val file = getFileFromIntent(intent)
555555
setFile(file)
556556
showDetails(file)
557557
}
@@ -580,7 +580,6 @@ class FileDisplayActivity :
580580
when (intent.action) {
581581
Intent.ACTION_VIEW -> handleOpenFileViaIntent(intent)
582582
OPEN_FILE -> {
583-
supportFragmentManager.executePendingTransactions()
584583
onOpenFileIntent(intent)
585584
}
586585
}
@@ -647,18 +646,41 @@ class FileDisplayActivity :
647646
// endregion
648647

649648
private fun onOpenFileIntent(intent: Intent) {
650-
val extra = intent.getStringExtra(EXTRA_FILE)
651-
val file = storageManager.getFileByDecryptedRemotePath(extra)
652-
if (file != null) {
653-
val fileFragment: OCFileListFragment?
654-
val leftFragment = this.leftFragment
655-
if (leftFragment is OCFileListFragment) {
656-
fileFragment = leftFragment
657-
} else {
658-
fileFragment = OCFileListFragment()
659-
this.leftFragment = fileFragment
649+
val file = getFileFromIntent(intent)
650+
if (file == null) {
651+
Log_OC.e(TAG, "Can't open file intent, file is null")
652+
return
653+
}
654+
655+
val currentFragment = leftFragment
656+
657+
if (currentFragment == null) {
658+
Log_OC.e(TAG, "Can't open file intent, left fragment is null")
659+
return
660+
}
661+
662+
val fileListFragment: OCFileListFragment = when {
663+
currentFragment is OCFileListFragment && currentFragment !is GalleryFragment -> {
664+
currentFragment
665+
}
666+
667+
else -> {
668+
Log_OC.w(
669+
TAG,
670+
"Left fragment is not a valid OCFileListFragment " +
671+
"(was ${currentFragment::class.simpleName}). " +
672+
"Replacing with OCFileListFragment."
673+
)
674+
val newFragment = OCFileListFragment()
675+
setLeftFragment(newFragment, false)
676+
setupHomeSearchToolbarWithSortAndListButtons()
677+
newFragment
660678
}
661-
fileFragment.onItemClicked(file)
679+
}
680+
681+
// Post to main thread to ensure fragment is fully attached before interacting
682+
Handler(Looper.getMainLooper()).post {
683+
fileListFragment.onItemClicked(file)
662684
}
663685
}
664686

@@ -1291,11 +1313,8 @@ class FileDisplayActivity :
12911313

12921314
var startFile: OCFile? = null
12931315
if (intent != null) {
1294-
val fileArgs = intent.getParcelableArgument(EXTRA_FILE, OCFile::class.java)
1295-
if (fileArgs != null) {
1296-
startFile = fileArgs
1297-
file = startFile
1298-
}
1316+
startFile = getFileFromIntent(intent)
1317+
file = startFile
12991318
}
13001319

13011320
// refresh list of files
@@ -1336,6 +1355,11 @@ class FileDisplayActivity :
13361355
}, ON_RESUMED_RESET_DELAY)
13371356
}
13381357

1358+
private fun getFileFromIntent(intent: Intent?): OCFile? =
1359+
intent.getParcelableArgument(EXTRA_FILE, OCFile::class.java)
1360+
?: intent?.getStringExtra(EXTRA_FILE_REMOTE_PATH)
1361+
?.let { fileDataStorageManager.getFileByDecryptedRemotePath(it) }
1362+
13391363
private fun checkAndSetMenuItemId() {
13401364
if (MainApp.isOnlyPersonFiles()) {
13411365
menuItemId = R.id.nav_personal_files

app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,11 +287,21 @@ public void hidePreviewImage() {
287287
}
288288

289289
public void showSortListGroup(boolean show) {
290-
findViewById(R.id.sort_list_button_group).setVisibility(show ? View.VISIBLE : View.GONE);
290+
final var view = findViewById(R.id.sort_list_button_group);
291+
if (view == null) {
292+
return;
293+
}
294+
295+
view.setVisibility(show ? View.VISIBLE : View.GONE);
291296
}
292297

293298
public boolean sortListGroupVisibility(){
294-
return findViewById(R.id.sort_list_button_group).getVisibility() == View.VISIBLE;
299+
final var view = findViewById(R.id.sort_list_button_group);
300+
if (view == null) {
301+
return false;
302+
}
303+
304+
return view.getVisibility() == View.VISIBLE;
295305
}
296306
/**
297307
* Change the bitmap for the toolbar's preview image.

app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,8 @@ open class ExtendedListFragment :
764764
}
765765
}
766766

767+
protected fun isAccountManagerInitialized(): Boolean = ::accountManager.isInitialized
768+
767769
private data class EmptyListData(val headline: Int, val message: Int, val icon: Int?, val tintIcon: Boolean)
768770

769771
companion object {

app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,6 +1241,11 @@ private void fileOnItemClick(OCFile file) {
12411241
}
12421242

12431243
private void handlePendingDownloadFile(OCFile file) {
1244+
if (!isAccountManagerInitialized()) {
1245+
Log_OC.e(TAG, "AccountManager not yet initialized");
1246+
return;
1247+
}
1248+
12441249
User account = accountManager.getUser();
12451250
OCCapability capability = mContainerActivity.getStorageManager().getCapability(account.getAccountName());
12461251

0 commit comments

Comments
 (0)