Skip to content

Commit 969a7fd

Browse files
committed
fix video media files rendering
1 parent 20b00c5 commit 969a7fd

6 files changed

Lines changed: 61 additions & 25 deletions

File tree

app/src/main/java/com/iriswallet/data/AppRepository.kt

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.iriswallet.data
22

3+
import android.system.Os
34
import android.util.Log
45
import com.iriswallet.R
56
import com.iriswallet.data.db.HiddenAsset
@@ -13,8 +14,8 @@ import com.iriswallet.utils.AppAssetType
1314
import com.iriswallet.utils.AppConstants
1415
import com.iriswallet.utils.AppContainer
1516
import com.iriswallet.utils.AppException
16-
import com.iriswallet.utils.AppMedia
1717
import com.iriswallet.utils.AppTransfer
18+
import com.iriswallet.utils.AppUtils
1819
import com.iriswallet.utils.Receiver
1920
import com.iriswallet.utils.RgbFaucet
2021
import com.iriswallet.utils.TAG
@@ -137,6 +138,8 @@ object AppRepository {
137138
assetToUpdate.settledBalance = rgbAsset.settledBalance
138139
assetToUpdate.totalBalance = rgbAsset.totalBalance
139140
}
141+
if (nextUpdateTransfers) fixMediaFile(rgbAsset)
142+
140143
updateRGBAsset(
141144
assetToUpdate,
142145
refresh = firstAppRefresh,
@@ -153,11 +156,13 @@ object AppRepository {
153156
if (assetToUpdate == null) {
154157
assetToUpdate = rgbAsset
155158
appAssets.add(rgbAsset)
159+
fixMediaFile(rgbAsset)
156160
} else if (rgbPendingAssetIDs.contains(assetToUpdate.id)) {
157161
appAssets.remove(assetToUpdate)
158162
removeRgbPendingAsset(assetToUpdate.id)
159163
assetToUpdate = rgbAsset
160164
appAssets.add(rgbAsset)
165+
fixMediaFile(rgbAsset)
161166
} else {
162167
continue
163168
}
@@ -273,15 +278,9 @@ object AppRepository {
273278
fun issueRgb20Asset(ticker: String, name: String, amounts: List<ULong>): AppAsset {
274279
checkMaxAssets()
275280
val contract = handleMissingFunds { RgbRepository.issueAssetRgb20(ticker, name, amounts) }
276-
val asset =
277-
AppAsset(
278-
AppAssetType.RGB20,
279-
contract.assetId,
280-
name,
281-
false,
282-
ticker = ticker,
283-
)
281+
val asset = AppAsset(contract, false)
284282
appAssets.add(asset)
283+
fixMediaFile(asset)
285284
updateRGBAsset(asset)
286285
return asset
287286
}
@@ -305,15 +304,9 @@ object AppRepository {
305304
RgbRepository.issueAssetRgb25(name, amounts, description, filePath)
306305
}
307306
file?.delete()
308-
val asset =
309-
AppAsset(
310-
AppAssetType.RGB25,
311-
contract.assetId,
312-
name,
313-
false,
314-
)
315-
if (contract.dataPaths.isNotEmpty()) asset.media = AppMedia(contract.dataPaths[0])
307+
val asset = AppAsset(contract, false)
316308
appAssets.add(asset)
309+
fixMediaFile(asset)
317310
updateRGBAsset(asset)
318311
return asset
319312
}
@@ -368,6 +361,22 @@ object AppRepository {
368361
}
369362
}
370363

364+
private fun fixMediaFile(asset: AppAsset) {
365+
if (asset.media != null) {
366+
val sanitizedFile = File(asset.media.getSanitizedPath())
367+
if (!sanitizedFile.exists()) {
368+
sanitizedFile.parentFile?.mkdirs()
369+
try {
370+
Os.symlink(asset.media.filePath, sanitizedFile.absolutePath)
371+
Log.d(TAG, "Created symlink for media file")
372+
} catch (e: Exception) {
373+
Log.w(TAG, "Failed creating media file symlink")
374+
AppUtils.copyFile(File(asset.media.filePath), sanitizedFile)
375+
}
376+
}
377+
}
378+
}
379+
371380
fun getAssets(): List<AppAsset> {
372381
updateBitcoinAsset(refresh = false)
373382
updateRGBAssets(refresh = false)

app/src/main/java/com/iriswallet/ui/AssetDetailFragment.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import android.graphics.SurfaceTexture
66
import android.graphics.drawable.Drawable
77
import android.media.MediaMetadataRetriever
88
import android.media.MediaPlayer
9+
import android.net.Uri
910
import android.os.Bundle
1011
import android.util.Log
1112
import android.view.*
@@ -282,7 +283,10 @@ class AssetDetailFragment :
282283
binding.detailAssetFileCard.visibility = View.GONE
283284
binding.detailCollectibleCard.visibility = View.VISIBLE
284285
val retriever = MediaMetadataRetriever()
285-
retriever.setDataSource(media.filePath)
286+
retriever.setDataSource(
287+
requireContext(),
288+
Uri.fromFile(File(media.getSanitizedPath()))
289+
)
286290
val videoWidth =
287291
retriever
288292
.extractMetadata(MediaMetadataRetriever.METADATA_KEY_VIDEO_WIDTH)
@@ -295,7 +299,11 @@ class AssetDetailFragment :
295299
?: 0
296300
retriever.release()
297301
val collectibleVideoThumbnail =
298-
AppUtils.getVideoThumbnail(media.filePath, videoWidth, videoHeight)
302+
AppUtils.getVideoThumbnail(
303+
media.getSanitizedPath(),
304+
videoWidth,
305+
videoHeight
306+
)
299307
binding.detailCollectibleImg.setImageBitmap(collectibleVideoThumbnail)
300308
textureView =
301309
LayoutInflater.from(context)
@@ -365,7 +373,7 @@ class AssetDetailFragment :
365373
override fun onSurfaceTextureAvailable(surface: SurfaceTexture, width: Int, height: Int) {
366374
try {
367375
mediaPlayer = MediaPlayer()
368-
mediaPlayer?.setDataSource(asset.media!!.filePath)
376+
mediaPlayer?.setDataSource(asset.media!!.getSanitizedPath())
369377
mediaPlayer?.prepareAsync()
370378
mediaPlayer?.setSurface(Surface(surface))
371379
mediaPlayer?.isLooping = true

app/src/main/java/com/iriswallet/ui/CollectiblesAdapter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class CollectiblesAdapter(
4343
MimeType.VIDEO -> {
4444
val width = fragment.resources.getDimensionPixelSize(R.dimen.collectible_size)
4545
val collectibleVideoThumbnail =
46-
AppUtils.getVideoThumbnail(media.filePath, width, width)
46+
AppUtils.getVideoThumbnail(media.getSanitizedPath(), width, width)
4747
if (collectibleVideoThumbnail == null) Log.e(TAG, "Unhandled error")
4848
else viewHolder.binding.collectibleImg.setImageBitmap(collectibleVideoThumbnail)
4949
}

app/src/main/java/com/iriswallet/ui/FaucetFragment.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,12 @@ class FaucetFragment : MainBaseFragment<FragmentFaucetBinding>(FragmentFaucetBin
5555
} else {
5656
val date =
5757
ZonedDateTime.parse(
58-
distribution.randomParams.requestWindowClose,
59-
DateTimeFormatter.ISO_LOCAL_DATE_TIME.withZone(ZoneOffset.UTC)
60-
).withZoneSameInstant(ZoneId.systemDefault())
58+
distribution.randomParams.requestWindowClose,
59+
DateTimeFormatter.ISO_LOCAL_DATE_TIME.withZone(
60+
ZoneOffset.UTC
61+
)
62+
)
63+
.withZoneSameInstant(ZoneId.systemDefault())
6164
getString(
6265
R.string.faucet_random_req_succeeded,
6366
date.format(DateTimeFormatter.ofPattern("HH:mm, MMM dd"))

app/src/main/java/com/iriswallet/utils/AppData.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ data class AppAsset(
2121
var certified: Boolean,
2222
val iface: AssetIface? = null,
2323
val ticker: String? = null,
24-
var media: AppMedia? = null,
24+
val media: AppMedia? = null,
2525
val fromFaucet: Boolean = false,
2626
var spendableBalance: ULong = 0UL,
2727
var settledBalance: ULong = 0UL,
@@ -39,6 +39,7 @@ data class AppAsset(
3939
certified,
4040
iface = rgbAsset.assetIface,
4141
ticker = rgbAsset.ticker,
42+
media = rgbAsset.dataPaths.getOrNull(0)?.let { AppMedia(it) },
4243
spendableBalance = rgbAsset.balance.spendable,
4344
settledBalance = rgbAsset.balance.settled,
4445
totalBalance = rgbAsset.balance.future,
@@ -130,6 +131,10 @@ data class AppMedia(
130131
},
131132
media.mime,
132133
)
134+
135+
fun getSanitizedPath(): String {
136+
return filePath.replace(":", "")
137+
}
133138
}
134139

135140
data class AppResponse<T>(

app/src/main/java/com/iriswallet/utils/AppUtils.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import com.iriswallet.data.SharedPreferencesManager
3535
import com.journeyapps.barcodescanner.BarcodeEncoder
3636
import com.lelloman.identicon.drawable.ClassicIdenticonDrawable
3737
import java.io.File
38+
import java.io.FileInputStream
3839
import java.io.FileOutputStream
3940
import java.net.URL
4041
import java.security.MessageDigest
@@ -64,6 +65,16 @@ class AppUtils {
6465
}
6566
}
6667

68+
fun copyFile(src: File, dst: File) {
69+
val inStream = FileInputStream(src)
70+
val outStream = FileOutputStream(dst)
71+
val inChannel = inStream.channel
72+
val outChannel = outStream.channel
73+
inChannel.transferTo(0, inChannel.size(), outChannel)
74+
inStream.close()
75+
outStream.close()
76+
}
77+
6778
fun deleteAppData() {
6879
Log.i(TAG, "Deleting app data...")
6980
deleteBdkData()

0 commit comments

Comments
 (0)