package com.ota import android.util.Log import com.facebook.drawee.view.SimpleDraweeView import com.facebook.imagepipeline.request.ImageRequestBuilder import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReadableArray import com.facebook.react.uimanager.SimpleViewManager import com.facebook.react.uimanager.ThemedReactContext import com.facebook.react.uimanager.annotations.ReactProp import com.facebook.drawee.backends.pipeline.Fresco import java.io.File import android.net.Uri import android.graphics.PorterDuff import android.graphics.PorterDuffColorFilter public class CodePushImageViewManager(private val reactContext: ReactApplicationContext) : SimpleViewManager() { companion object { const val TAG = "CodePushImageView" } override fun getName() = "RCTImageView" override fun createViewInstance(reactContext: ThemedReactContext): SimpleDraweeView { return SimpleDraweeView(reactContext) } @ReactProp(name = "tintColor", customType = "Color") fun setTintColor(view: SimpleDraweeView, color: Int?) { if (color != null) { view.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN) } else { view.clearColorFilter() } } @ReactProp(name = "src") fun setSrc(view: SimpleDraweeView, sources: ReadableArray) { if (sources.size() == 0) return val src = sources.getMap(0) if (!src.hasKey("uri")) return val uriString = src.getString("uri") ?: return Log.d(TAG, "Received URI: $uriString") val uri = Uri.parse(uriString) val fullPath = uri.path ?: return val codePushRoot = File(reactContext.filesDir, "CodePush/xyteqitrd").absolutePath val relativePath = fullPath.removePrefix(codePushRoot).removePrefix("/") // 1. Check for updated CodePush file (no need to split, just use the full name) val cleanedName = uriString.substringAfterLast("/") // e.g. src_images_onboard1.png val codePushFile = File("$codePushRoot/assets", relativePath) Log.d(TAG, "codePushFile: ${codePushFile.absolutePath}") if (codePushFile.exists()) { Log.d(TAG, "Using CodePush updated image: ${codePushFile.absolutePath}") val request = ImageRequestBuilder.newBuilderWithSource(Uri.fromFile(codePushFile)).build() view.controller = Fresco.newDraweeControllerBuilder() .setImageRequest(request) .setOldController(view.controller) .build() return } // 2. Fallback to static drawable in APK val resourceName = cleanedName.substringBeforeLast(".") // Remove extension val resId = reactContext.resources.getIdentifier( resourceName, "drawable", reactContext.packageName ) if (resId != 0) { Log.d(TAG, "Using bundled drawable resource ID: $resId ($resourceName)") view.setImageResource(resId) return } // 3. Final fallback (e.g., remote URI or broken reference) Log.w(TAG, "Image not found in CodePush or resources: $uriString") val fallbackUri = Uri.parse(uriString) val request = ImageRequestBuilder.newBuilderWithSource(fallbackUri).build() view.controller = Fresco.newDraweeControllerBuilder() .setImageRequest(request) .setOldController(view.controller) .build() } }