|
| 1 | +const fs = require("fs-extra"); |
| 2 | +const path = require("path"); |
| 3 | + |
| 4 | +const packageName = "com.digitalnomad91.codebuilderadmin"; |
| 5 | + |
| 6 | +// Paths to Android files |
| 7 | +const androidManifestPath = path.join( |
| 8 | + __dirname, |
| 9 | + "../android/app/src/main/AndroidManifest.xml" |
| 10 | +); |
| 11 | +const javaMainApplicationPath = path.join( |
| 12 | + __dirname, |
| 13 | + "../android/app/src/main/java/com/digitalnomad91/codebuilderadmin/MainApplication.java" |
| 14 | +); |
| 15 | +const kotlinMainApplicationPath = path.join( |
| 16 | + __dirname, |
| 17 | + "../android/app/src/main/java/com/digitalnomad91/codebuilderadmin/MainApplication.kt" |
| 18 | +); |
| 19 | +const javaHelperPath = path.join( |
| 20 | + __dirname, |
| 21 | + "../android/app/src/main/java/com/digitalnomad91/codebuilderadmin/BatteryOptimizationHelper.java" |
| 22 | +); |
| 23 | +const kotlinHelperPath = path.join( |
| 24 | + __dirname, |
| 25 | + "../android/app/src/main/java/com/digitalnomad91/codebuilderadmin/BatteryOptimizationHelper.kt" |
| 26 | +); |
| 27 | + |
| 28 | +// Determine whether the project uses Java or Kotlin |
| 29 | +const isKotlin = fs.existsSync(kotlinMainApplicationPath); |
| 30 | +const mainApplicationPath = isKotlin |
| 31 | + ? kotlinMainApplicationPath |
| 32 | + : javaMainApplicationPath; |
| 33 | +const helperPath = isKotlin ? kotlinHelperPath : javaHelperPath; |
| 34 | + |
| 35 | +console.log(`🔍 Detected ${isKotlin ? "Kotlin" : "Java"} project`); |
| 36 | + |
| 37 | +// 🟢 1. Ensure `AndroidManifest.xml` has the required permission |
| 38 | +const addPermissionToManifest = async () => { |
| 39 | + try { |
| 40 | + let manifest = await fs.readFile(androidManifestPath, "utf8"); |
| 41 | + const permission = |
| 42 | + '<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />'; |
| 43 | + |
| 44 | + // Ensure the permission is inside <manifest> but before <application> |
| 45 | + if (!manifest.includes(permission)) { |
| 46 | + manifest = manifest.replace( |
| 47 | + /<manifest[^>]*>/, |
| 48 | + (match) => `${match}\n ${permission}` |
| 49 | + ); |
| 50 | + |
| 51 | + await fs.writeFile(androidManifestPath, manifest, "utf8"); |
| 52 | + console.log( |
| 53 | + "✅ Battery optimization permission added to AndroidManifest.xml" |
| 54 | + ); |
| 55 | + } else { |
| 56 | + console.log( |
| 57 | + "🔹 Battery optimization permission already exists in AndroidManifest.xml" |
| 58 | + ); |
| 59 | + } |
| 60 | + } catch (error) { |
| 61 | + console.error("❌ Error updating AndroidManifest.xml:", error); |
| 62 | + } |
| 63 | +}; |
| 64 | + |
| 65 | +// 🟢 2. Create the `BatteryOptimizationHelper` module in either Java or Kotlin |
| 66 | +const javaHelperCode = ` |
| 67 | +package com.digitalnomad91.codebuilderadmin; |
| 68 | +
|
| 69 | +import android.content.Context; |
| 70 | +import android.content.Intent; |
| 71 | +import android.net.Uri; |
| 72 | +import android.provider.Settings; |
| 73 | +import com.facebook.react.bridge.ReactApplicationContext; |
| 74 | +import com.facebook.react.bridge.ReactContextBaseJavaModule; |
| 75 | +import com.facebook.react.bridge.ReactMethod; |
| 76 | +
|
| 77 | +public class BatteryOptimizationHelper extends ReactContextBaseJavaModule { |
| 78 | +
|
| 79 | + public BatteryOptimizationHelper(ReactApplicationContext reactContext) { |
| 80 | + super(reactContext); |
| 81 | + } |
| 82 | +
|
| 83 | + @Override |
| 84 | + public String getName() { |
| 85 | + return "BatteryOptimizationHelper"; |
| 86 | + } |
| 87 | +
|
| 88 | + @ReactMethod |
| 89 | + public void autoHighlightApp() { |
| 90 | + try { |
| 91 | + Context context = getReactApplicationContext(); |
| 92 | + Intent intent = new Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS); |
| 93 | + intent.setData(Uri.parse("package:${packageName}")); |
| 94 | + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |
| 95 | + context.startActivity(intent); |
| 96 | + } catch (Exception e) { |
| 97 | + e.printStackTrace(); |
| 98 | + } |
| 99 | + } |
| 100 | +} |
| 101 | +`; |
| 102 | + |
| 103 | +const kotlinHelperCode = ` |
| 104 | +package com.digitalnomad91.codebuilderadmin |
| 105 | +
|
| 106 | +import android.content.Context |
| 107 | +import android.content.Intent |
| 108 | +import android.net.Uri |
| 109 | +import android.provider.Settings |
| 110 | +import com.facebook.react.bridge.ReactApplicationContext |
| 111 | +import com.facebook.react.bridge.ReactContextBaseJavaModule |
| 112 | +import com.facebook.react.bridge.ReactMethod |
| 113 | +
|
| 114 | +class BatteryOptimizationHelper(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) { |
| 115 | + |
| 116 | + override fun getName(): String { |
| 117 | + return "BatteryOptimizationHelper" |
| 118 | + } |
| 119 | +
|
| 120 | + @ReactMethod |
| 121 | + fun autoHighlightApp() { |
| 122 | + try { |
| 123 | + val context: Context = reactApplicationContext |
| 124 | + val packageName = context.packageName // ✅ FIX: Dynamically retrieve package name |
| 125 | +
|
| 126 | + val intent = Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS) |
| 127 | + intent.data = Uri.parse("package:$packageName") // ✅ FIX: Use correct package name |
| 128 | + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) |
| 129 | + context.startActivity(intent) |
| 130 | + } catch (e: Exception) { |
| 131 | + e.printStackTrace() |
| 132 | + } |
| 133 | + } |
| 134 | +} |
| 135 | +`; |
| 136 | + |
| 137 | +const createBatteryOptimizationHelper = async () => { |
| 138 | + try { |
| 139 | + const helperCode = isKotlin ? kotlinHelperCode : javaHelperCode; |
| 140 | + await fs.ensureFile(helperPath); |
| 141 | + await fs.writeFile(helperPath, helperCode, "utf8"); |
| 142 | + console.log( |
| 143 | + `✅ BatteryOptimizationHelper.${isKotlin ? "kt" : "java"} created` |
| 144 | + ); |
| 145 | + } catch (error) { |
| 146 | + console.error( |
| 147 | + `❌ Error creating BatteryOptimizationHelper.${ |
| 148 | + isKotlin ? "kt" : "java" |
| 149 | + }:`, |
| 150 | + error |
| 151 | + ); |
| 152 | + } |
| 153 | +}; |
| 154 | + |
| 155 | +// 🟢 3. Modify `MainApplication` to register the new module |
| 156 | +const modifyMainApplication = async () => { |
| 157 | + try { |
| 158 | + let mainApplication = await fs.readFile(mainApplicationPath, "utf8"); |
| 159 | + const importStatement = `import com.digitalnomad91.codebuilderadmin.BatteryOptimizationHelper`; |
| 160 | + |
| 161 | + if (!mainApplication.includes(importStatement)) { |
| 162 | + mainApplication = mainApplication.replace( |
| 163 | + "import com.facebook.react.ReactPackage", |
| 164 | + `import com.facebook.react.ReactPackage\n${importStatement}` |
| 165 | + ); |
| 166 | + } |
| 167 | + |
| 168 | + if (isKotlin) { |
| 169 | + const registerModule = |
| 170 | + "BatteryOptimizationHelper(reactNativeHost.reactInstanceManager.currentReactContext!!),"; |
| 171 | + if (!mainApplication.includes(registerModule)) { |
| 172 | + mainApplication = mainApplication.replace( |
| 173 | + "packages = mutableListOf(", |
| 174 | + `packages = mutableListOf(\n ${registerModule}` |
| 175 | + ); |
| 176 | + } |
| 177 | + } else { |
| 178 | + const registerModule = "new BatteryOptimizationHelper(),"; |
| 179 | + if (!mainApplication.includes(registerModule)) { |
| 180 | + mainApplication = mainApplication.replace( |
| 181 | + "new MainReactPackage(),", |
| 182 | + `new MainReactPackage(),\n ${registerModule}` |
| 183 | + ); |
| 184 | + } |
| 185 | + } |
| 186 | + |
| 187 | + await fs.writeFile(mainApplicationPath, mainApplication, "utf8"); |
| 188 | + console.log( |
| 189 | + `✅ BatteryOptimizationHelper registered in MainApplication.${ |
| 190 | + isKotlin ? "kt" : "java" |
| 191 | + }` |
| 192 | + ); |
| 193 | + } catch (error) { |
| 194 | + console.error( |
| 195 | + `❌ Error updating MainApplication.${isKotlin ? "kt" : "java"}:`, |
| 196 | + error |
| 197 | + ); |
| 198 | + } |
| 199 | +}; |
| 200 | + |
| 201 | +// Run all steps |
| 202 | +(async () => { |
| 203 | + console.log("🚀 Setting up battery optimization exemption..."); |
| 204 | + await addPermissionToManifest(); |
| 205 | + await createBatteryOptimizationHelper(); |
| 206 | + await modifyMainApplication(); |
| 207 | + console.log("🎉 Battery optimization setup complete!"); |
| 208 | +})(); |
0 commit comments