ShortcutUtil.kt 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * Nextcloud - Android Client
  3. *
  4. * SPDX-FileCopyrightText: 2023 Alper Ozturk <alper_ozturk@proton.me>
  5. * SPDX-FileCopyrightText: 2022 Álvaro Brey <alvaro@alvarobrey.com>
  6. * SPDX-FileCopyrightText: 2022 Felix Nüsse <felix.nuesse@t-online.de>
  7. * SPDX-License-Identifier: AGPL-3.0-or-later
  8. */
  9. package com.nextcloud.utils
  10. import android.app.PendingIntent
  11. import android.app.PendingIntent.FLAG_IMMUTABLE
  12. import android.content.Context
  13. import android.content.Intent
  14. import android.graphics.Bitmap
  15. import android.graphics.Canvas
  16. import android.graphics.drawable.BitmapDrawable
  17. import android.graphics.drawable.Drawable
  18. import androidx.core.content.pm.ShortcutInfoCompat
  19. import androidx.core.content.pm.ShortcutManagerCompat
  20. import androidx.core.graphics.drawable.IconCompat
  21. import androidx.core.graphics.drawable.toBitmap
  22. import com.nextcloud.client.account.User
  23. import com.owncloud.android.R
  24. import com.owncloud.android.datamodel.OCFile
  25. import com.owncloud.android.datamodel.SyncedFolderProvider
  26. import com.owncloud.android.datamodel.ThumbnailsCacheManager
  27. import com.owncloud.android.ui.activity.FileActivity
  28. import com.owncloud.android.ui.activity.FileDisplayActivity
  29. import com.owncloud.android.utils.MimeTypeUtil
  30. import com.owncloud.android.utils.theme.ViewThemeUtils
  31. import javax.inject.Inject
  32. class ShortcutUtil @Inject constructor(private val mContext: Context) {
  33. /**
  34. * Adds a pinned shortcut to the home screen that points to the passed file/folder.
  35. *
  36. * @param file The file/folder to which a pinned shortcut should be added to the home screen.
  37. */
  38. fun addShortcutToHomescreen(
  39. file: OCFile,
  40. viewThemeUtils: ViewThemeUtils,
  41. user: User,
  42. syncedFolderProvider: SyncedFolderProvider
  43. ) {
  44. if (ShortcutManagerCompat.isRequestPinShortcutSupported(mContext)) {
  45. val intent = Intent(mContext, FileDisplayActivity::class.java)
  46. intent.action = FileDisplayActivity.OPEN_FILE
  47. intent.putExtra(FileActivity.EXTRA_FILE, file.remotePath)
  48. intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
  49. val shortcutId = "nextcloud_shortcut_" + file.remoteId
  50. val icon: IconCompat
  51. var thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
  52. ThumbnailsCacheManager.PREFIX_THUMBNAIL + file.remoteId
  53. )
  54. if (thumbnail != null) {
  55. thumbnail = bitmapToAdaptiveBitmap(thumbnail)
  56. icon = IconCompat.createWithAdaptiveBitmap(thumbnail)
  57. } else if (file.isFolder) {
  58. val isAutoUploadFolder = SyncedFolderProvider.isAutoUploadFolder(syncedFolderProvider, file, user)
  59. val isDarkModeActive = syncedFolderProvider.preferences.isDarkModeEnabled
  60. val overlayIconId = file.getFileOverlayIconId(isAutoUploadFolder)
  61. val drawable = MimeTypeUtil.getFileIcon(isDarkModeActive, overlayIconId, mContext, viewThemeUtils)
  62. val bitmapIcon = drawable.toBitmap()
  63. icon = IconCompat.createWithBitmap(bitmapIcon)
  64. } else {
  65. icon = IconCompat.createWithResource(
  66. mContext,
  67. MimeTypeUtil.getFileTypeIconId(file.mimeType, file.fileName)
  68. )
  69. }
  70. val longLabel = mContext.getString(R.string.pin_shortcut_label, file.fileName)
  71. val pinShortcutInfo = ShortcutInfoCompat.Builder(mContext, shortcutId)
  72. .setShortLabel(file.fileName)
  73. .setLongLabel(longLabel)
  74. .setIcon(icon)
  75. .setIntent(intent)
  76. .build()
  77. val pinnedShortcutCallbackIntent =
  78. ShortcutManagerCompat.createShortcutResultIntent(mContext, pinShortcutInfo)
  79. val successCallback = PendingIntent.getBroadcast(
  80. mContext,
  81. 0,
  82. pinnedShortcutCallbackIntent,
  83. FLAG_IMMUTABLE
  84. )
  85. ShortcutManagerCompat.requestPinShortcut(
  86. mContext,
  87. pinShortcutInfo,
  88. successCallback.intentSender
  89. )
  90. }
  91. }
  92. private fun bitmapToAdaptiveBitmap(orig: Bitmap): Bitmap {
  93. val adaptiveIconSize = mContext.resources.getDimensionPixelSize(R.dimen.adaptive_icon_size)
  94. val adaptiveIconOuterSides = mContext.resources.getDimensionPixelSize(R.dimen.adaptive_icon_padding)
  95. val drawable: Drawable = BitmapDrawable(mContext.resources, orig)
  96. val bitmap = Bitmap.createBitmap(adaptiveIconSize, adaptiveIconSize, Bitmap.Config.ARGB_8888)
  97. val canvas = Canvas(bitmap)
  98. drawable.setBounds(
  99. adaptiveIconOuterSides,
  100. adaptiveIconOuterSides,
  101. adaptiveIconSize - adaptiveIconOuterSides,
  102. adaptiveIconSize - adaptiveIconOuterSides
  103. )
  104. drawable.draw(canvas)
  105. return bitmap
  106. }
  107. }