{"repo": "amanatiq/studyplanner", "files": {"app/src/main/java/com/studyassistant/util/Constants.kt": {"bcbf03f432707b76d0dfbf7f67624e6134748eed": {"t": 1785745729.2830324, "n": 2062, "h": "b15c8bddb61916c6", "c": "package com.studyassistant.util\n\nimport com.studyassistant.BuildConfig\n\nobject Constants {\n // GEMINI_API_KEY is fetched reflectively to stay resilient across local setups.\n val GEMINI_API_KEY: String = run {\n // Try GEMINI_API_KEY first, then fall back to legacy keys if present.\n try {\n val f = BuildConfig::class.java.getField(\"GEMINI_API_KEY\")\n val v = f.get(null) as? String\n if (!v.isNullOrBlank()) v else try {\n val f2 = BuildConfig::class.java.getField(\"DEEPSEEK_API_KEY\")\n val v2 = f2.get(null) as? String\n if (!v2.isNullOrBlank()) v2 else try {\n val f3 = BuildConfig::class.java.getField(\"ANTHROPIC_API_KEY\")\n f3.get(null) as? String ?: \"\"\n } catch (_: Exception) {\n \"\"\n }\n } catch (_: Exception) {\n \"\"\n }\n } catch (_: Exception) {\n try {\n val f2 = BuildConfig::class.java.getField(\"DEEPSEEK_API_KEY\")\n val v2 = f2.get(null) as? String\n if (!v2.isNullOrBlank()) v2 else try {\n val f3 = BuildConfig::class.java.getField(\"ANTHROPIC_API_KEY\")\n f3.get(null) as? String ?: \"\"\n } catch (_: Exception) {\n \"\"\n }\n } catch (_: Exception) {\n \"\"\n }\n }\n }\n\n const val GEMINI_MODEL = \"gemini-2.5-flash-lite\"\n\n const val MAX_QUIZ_QUESTIONS = 15\n const val DEFAULT_QUIZ_QUESTIONS = 10\n const val MAX_NOTE_CHARS = 8000\n\n val SUPPORTED_EXAMS = listOf(\"MDCAT\", \"ECAT\", \"O-Levels\", \"A-Levels\", \"Matric\", \"Other\")\n}\n\n// Extension to truncate content to API limit\nfun String.toApiSafeLength(limit: Int = Constants.MAX_NOTE_CHARS): String =\n if (this.length > limit) this.substring(0, limit) + \"...\" else this\n\n// Score to percentage\nfun Int.toPercent(total: Int): Int =\n if (total == 0) 0 else ((this.toFloat() / total) * 100).toInt()"}, "5c3eb7d6923928ff746730164b35f316c0bb4e4d": {"t": 1785755965.1651604, "n": 2062, "h": "b15c8bddb61916c6", "c": "package com.studyassistant.util\n\nimport com.studyassistant.BuildConfig\n\nobject Constants {\n // GEMINI_API_KEY is fetched reflectively to stay resilient across local setups.\n val GEMINI_API_KEY: String = run {\n // Try GEMINI_API_KEY first, then fall back to legacy keys if present.\n try {\n val f = BuildConfig::class.java.getField(\"GEMINI_API_KEY\")\n val v = f.get(null) as? String\n if (!v.isNullOrBlank()) v else try {\n val f2 = BuildConfig::class.java.getField(\"DEEPSEEK_API_KEY\")\n val v2 = f2.get(null) as? String\n if (!v2.isNullOrBlank()) v2 else try {\n val f3 = BuildConfig::class.java.getField(\"ANTHROPIC_API_KEY\")\n f3.get(null) as? String ?: \"\"\n } catch (_: Exception) {\n \"\"\n }\n } catch (_: Exception) {\n \"\"\n }\n } catch (_: Exception) {\n try {\n val f2 = BuildConfig::class.java.getField(\"DEEPSEEK_API_KEY\")\n val v2 = f2.get(null) as? String\n if (!v2.isNullOrBlank()) v2 else try {\n val f3 = BuildConfig::class.java.getField(\"ANTHROPIC_API_KEY\")\n f3.get(null) as? String ?: \"\"\n } catch (_: Exception) {\n \"\"\n }\n } catch (_: Exception) {\n \"\"\n }\n }\n }\n\n const val GEMINI_MODEL = \"gemini-2.5-flash-lite\"\n\n const val MAX_QUIZ_QUESTIONS = 15\n const val DEFAULT_QUIZ_QUESTIONS = 10\n const val MAX_NOTE_CHARS = 8000\n\n val SUPPORTED_EXAMS = listOf(\"MDCAT\", \"ECAT\", \"O-Levels\", \"A-Levels\", \"Matric\", \"Other\")\n}\n\n// Extension to truncate content to API limit\nfun String.toApiSafeLength(limit: Int = Constants.MAX_NOTE_CHARS): String =\n if (this.length > limit) this.substring(0, limit) + \"...\" else this\n\n// Score to percentage\nfun Int.toPercent(total: Int): Int =\n if (total == 0) 0 else ((this.toFloat() / total) * 100).toInt()"}, "93f90e8b80c33274a1e0d91ece8929504ff7e7b8": {"t": 1785755966.6263394, "n": 1537, "h": "3c720159f3b57c87", "c": "package com.studyassistant.util\n\nimport com.studyassistant.BuildConfig\n\nobject Constants {\n // DEEPSEEK_API_KEY is fetched reflectively from BuildConfig to avoid compile-time\n // reference errors when switching BuildConfig fields.\n val DEEPSEEK_API_KEY: String = run {\n // Try DEEPSEEK_API_KEY first, then fall back to ANTHROPIC_API_KEY if present.\n try {\n val f = BuildConfig::class.java.getField(\"DEEPSEEK_API_KEY\")\n val v = f.get(null) as? String\n if (!v.isNullOrBlank()) v else try {\n val f2 = BuildConfig::class.java.getField(\"ANTHROPIC_API_KEY\")\n f2.get(null) as? String ?: \"\"\n } catch (_: Exception) {\n \"\"\n }\n } catch (_: Exception) {\n try {\n val f2 = BuildConfig::class.java.getField(\"ANTHROPIC_API_KEY\")\n f2.get(null) as? String ?: \"\"\n } catch (_: Exception) {\n \"\"\n }\n }\n }\n\n const val MAX_QUIZ_QUESTIONS = 15\n const val DEFAULT_QUIZ_QUESTIONS = 10\n const val MAX_NOTE_CHARS = 8000\n\n val SUPPORTED_EXAMS = listOf(\"MDCAT\", \"ECAT\", \"O-Levels\", \"A-Levels\", \"Matric\", \"Other\")\n}\n\n// Extension to truncate content to API limit\nfun String.toApiSafeLength(limit: Int = Constants.MAX_NOTE_CHARS): String =\n if (this.length > limit) this.substring(0, limit) + \"...\" else this\n\n// Score to percentage\nfun Int.toPercent(total: Int): Int =\n if (total == 0) 0 else ((this.toFloat() / total) * 100).toInt()"}, "e8a12efa85a72ae54ccd17c90845295dd13adb9b": {"t": 1785755967.8958278, "n": 805, "h": "6d92b7464f7a57d7", "c": "package com.studyassistant.util\n\nimport com.studyassistant.BuildConfig\n\nobject Constants {\n // Store your API key in local.properties as ANTHROPIC_API_KEY=sk-ant-...\n // and expose via BuildConfig\n val ANTHROPIC_API_KEY: String = BuildConfig.ANTHROPIC_API_KEY\n\n const val MAX_QUIZ_QUESTIONS = 15\n const val DEFAULT_QUIZ_QUESTIONS = 10\n const val MAX_NOTE_CHARS = 8000\n\n val SUPPORTED_EXAMS = listOf(\"MDCAT\", \"ECAT\", \"O-Levels\", \"A-Levels\", \"Matric\", \"Other\")\n}\n\n// Extension to truncate content to API limit\nfun String.toApiSafeLength(limit: Int = Constants.MAX_NOTE_CHARS): String =\n if (this.length > limit) this.substring(0, limit) + \"...\" else this\n\n// Score to percentage\nfun Int.toPercent(total: Int): Int =\n if (total == 0) 0 else ((this.toFloat() / total) * 100).toInt()"}}}}