Skip to content

Commit 07193f7

Browse files
Bare workflow battery optimization module script.
1 parent f42675c commit 07193f7

File tree

1 file changed

+208
-0
lines changed

1 file changed

+208
-0
lines changed

scripts/setupBatteryOptimization.js

Lines changed: 208 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,208 @@
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

Comments
 (0)