@@ -53,13 +53,15 @@ data class Store(val name: String, val url: String, val icon: String)
5353data class CropScanData (
5454 val status : String , val name : String , val confidence : Int , val severity : String ,
5555 val symptoms : String , val cause : String , val treatment : String , val prevention : String ,
56+ val details : String ,
5657 val products : List <Pair <Pair <String , String >, List <Store >>> // Pair(Name to Dose, Stores)
5758)
5859
5960data class SoilScanData (
6061 val soilType : String , val estimatedPH : String , val texture : String ,
6162 val organicMatter : String , val deficiencies : List <String >,
6263 val suitableCrops : List <String >, val improvements : String ,
64+ val details : String ,
6365 val fertilizers : List <Pair <Pair <String , String >, List <Store >>>
6466)
6567
@@ -82,7 +84,8 @@ fun parseCropJson(raw: String): CropScanData? = runCatching {
8284 }
8385 } ? : emptyList()
8486 CropScanData (j.optString(" status" ), j.optString(" name" ), j.optInt(" confidence" ), j.optString(" severity" ),
85- j.optString(" symptoms" ), j.optString(" cause" ), j.optString(" treatment" ), j.optString(" prevention" ), prods)
87+ j.optString(" symptoms" ), j.optString(" cause" ), j.optString(" treatment" ), j.optString(" prevention" ),
88+ j.optString(" details" ), prods)
8689}.getOrNull()
8790
8891fun parseSoilJson (raw : String ): SoilScanData ? = runCatching {
@@ -106,7 +109,7 @@ fun parseSoilJson(raw: String): SoilScanData? = runCatching {
106109 }
107110 } ? : emptyList()
108111 SoilScanData (j.optString(" soilType" ), j.optString(" estimatedPH" ), j.optString(" texture" ),
109- j.optString(" organicMatter" ), defs, crops, j.optString(" improvements" ), ferts)
112+ j.optString(" organicMatter" ), defs, crops, j.optString(" improvements" ), j.optString( " details " ), ferts)
110113}.getOrNull()
111114@Composable
112115fun DiseaseScannerScreen (modifier : Modifier = Modifier ) {
@@ -473,83 +476,17 @@ fun ScanResultView(modifier: Modifier, raw: String, mode: ScanMode, accent: Colo
473476
474477fun saveReportToDownloads (context : android.content.Context , content : String ) {
475478 try {
476- // Format the raw JSON into a readable text report
477- val formattedContent = runCatching {
478- val d = parseCropJson(content)
479- if (d != null ) {
480- """
481- NuKropAI Scan Report
482- ====================
483- Status: ${d.status}
484- Diagnosis: ${d.name}
485- Confidence: ${d.confidence} %
486- Severity: ${d.severity}
487-
488- SYMPTOMS
489- --------
490- ${d.symptoms}
491-
492- CAUSE
493- -----
494- ${d.cause}
495-
496- TREATMENT PLAN
497- --------------
498- ${d.treatment}
499-
500- PREVENTION
501- ----------
502- ${d.prevention}
503-
504- PRODUCTS RECOMMENDED
505- --------------------
506- ${d.products.joinToString(" \n " ) { (info, stores) ->
507- " - ${info.first} (Dose: ${info.second} )\n Buy: ${stores.firstOrNull()?.url ? : " Search locally" } "
508- }}
509- """ .trimIndent()
510- } else {
511- val s = parseSoilJson(content)
512- if (s != null ) {
513- """
514- NuKropAI Soil Report
515- ====================
516- Soil Type: ${s.soilType}
517- Est. pH: ${s.estimatedPH}
518- Texture: ${s.texture}
519- Organic Matter: ${s.organicMatter}
520-
521- DEFICIENCIES
522- ------------
523- ${s.deficiencies.joinToString(" , " )}
524-
525- IMPROVEMENTS
526- ------------
527- ${s.improvements}
528-
529- SUITABLE CROPS
530- --------------
531- ${s.suitableCrops.joinToString(" , " )}
532-
533- FERTILIZERS
534- -----------
535- ${s.fertilizers.joinToString(" \n " ) { (info, stores) ->
536- " - ${info.first} (Dose: ${info.second} )\n Buy: ${stores.firstOrNull()?.url ? : " Search locally" } "
537- }}
538- """ .trimIndent()
539- } else content
540- }
541- }.getOrDefault(content)
542-
479+ val cleanRaw = content.replace(Regex (" <think>.*?</think>" , RegexOption .DOT_MATCHES_ALL ), " " ).trim()
543480 val resolver = context.contentResolver
544481 val contentValues = ContentValues ().apply {
545- put(MediaStore .MediaColumns .DISPLAY_NAME , " NuKropAI_Report_${System .currentTimeMillis()} .txt " )
546- put(MediaStore .MediaColumns .MIME_TYPE , " text/plain " )
482+ put(MediaStore .MediaColumns .DISPLAY_NAME , " NuKropAI_Report_${System .currentTimeMillis()} .json " )
483+ put(MediaStore .MediaColumns .MIME_TYPE , " application/json " )
547484 put(MediaStore .MediaColumns .RELATIVE_PATH , Environment .DIRECTORY_DOWNLOADS )
548485 }
549486 val uri = resolver.insert(MediaStore .Files .getContentUri(" external" ), contentValues)
550487 if (uri != null ) {
551488 resolver.openOutputStream(uri)?.use { os ->
552- os.write(formattedContent .toByteArray())
489+ os.write(cleanRaw .toByteArray())
553490 }
554491 Toast .makeText(context, " Saved to Downloads!" , Toast .LENGTH_SHORT ).show()
555492 } else {
@@ -585,9 +522,10 @@ fun CropResultUI(d: CropScanData, accent: Color, context: android.content.Contex
585522 }
586523 }
587524
588- if (d.symptoms.isNotEmpty()) ResultBlock (" 👁️ Symptoms Observed" , d.symptoms)
589- if (d.treatment.isNotEmpty()) ResultBlock (" 💊 Treatment Plan" , d.treatment)
525+ if (d.symptoms.isNotEmpty()) ResultBlock (" 🦠 Symptoms Observed" , d.symptoms)
526+ if (d.treatment.isNotEmpty()) ResultBlock (" 💉 Treatment Plan" , d.treatment)
590527 if (d.prevention.isNotEmpty()) ResultBlock (" 🛡️ Prevention" , d.prevention)
528+ if (d.details.isNotEmpty()) ResultBlock (" ℹ️ Detailed Insights" , d.details)
591529 if (d.products.isNotEmpty()) {
592530 Text (" 🛒 Buy Recommended Products" , fontSize = 15 .sp, fontWeight = FontWeight .Bold , color = NuKropText ,
593531 modifier = Modifier .padding(horizontal = 16 .dp, vertical = 10 .dp))
@@ -610,9 +548,10 @@ fun SoilResultUI(d: SoilScanData, accent: Color, context: android.content.Contex
610548 }
611549 }
612550 }
613- if (d.deficiencies.isNotEmpty()) ResultBlock (" ⚠️ Likely Deficiencies" , d.deficiencies.joinToString(" • " ))
614- if (d.suitableCrops.isNotEmpty()) ResultBlock (" 🌾 Best Crops to Grow" , d.suitableCrops.joinToString(" , " ))
615- if (d.improvements.isNotEmpty()) ResultBlock (" 💡 Improvement Tips" , d.improvements)
551+ if (d.deficiencies.isNotEmpty()) ResultBlock (" 📉 Likely Deficiencies" , d.deficiencies.joinToString(" • " ))
552+ if (d.suitableCrops.isNotEmpty()) ResultBlock (" 🌱 Best Crops to Grow" , d.suitableCrops.joinToString(" , " ))
553+ if (d.improvements.isNotEmpty()) ResultBlock (" 🛠 Improvement Tips" , d.improvements)
554+ if (d.details.isNotEmpty()) ResultBlock (" ℹ️ Detailed Insights" , d.details)
616555 if (d.fertilizers.isNotEmpty()) {
617556 Text (" 🛒 Recommended Fertilizers" , fontSize = 15 .sp, fontWeight = FontWeight .Bold , color = NuKropText ,
618557 modifier = Modifier .padding(horizontal = 16 .dp, vertical = 10 .dp))
0 commit comments