Skip to content

Commit 83d55d8

Browse files
New script for updated architecture.
1 parent 35646d3 commit 83d55d8

File tree

1 file changed

+63
-93
lines changed

1 file changed

+63
-93
lines changed

scripts/setupBatteryOptimization.js

Lines changed: 63 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -8,31 +8,20 @@ const androidManifestPath = path.join(
88
__dirname,
99
"../android/app/src/main/AndroidManifest.xml"
1010
);
11-
const javaMainApplicationPath = path.join(
12-
__dirname,
13-
"../android/app/src/main/java/com/digitalnomad91/codebuilderadmin/MainApplication.java"
14-
);
1511
const kotlinMainApplicationPath = path.join(
1612
__dirname,
1713
"../android/app/src/main/java/com/digitalnomad91/codebuilderadmin/MainApplication.kt"
1814
);
19-
const javaHelperPath = path.join(
20-
__dirname,
21-
"../android/app/src/main/java/com/digitalnomad91/codebuilderadmin/BatteryOptimizationHelper.java"
22-
);
2315
const kotlinHelperPath = path.join(
2416
__dirname,
2517
"../android/app/src/main/java/com/digitalnomad91/codebuilderadmin/BatteryOptimizationHelper.kt"
2618
);
2719

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;
20+
// Check if the app uses Kotlin
21+
const mainApplicationPath = kotlinMainApplicationPath;
22+
const helperPath = kotlinHelperPath;
3423

35-
console.log(`🔍 Detected ${isKotlin ? "Kotlin" : "Java"} project`);
24+
console.log("🔍 Detected Kotlin project");
3625

3726
// 🟢 1. Ensure `AndroidManifest.xml` has the required permission
3827
const addPermissionToManifest = async () => {
@@ -41,7 +30,6 @@ const addPermissionToManifest = async () => {
4130
const permission =
4231
'<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />';
4332

44-
// Ensure the permission is inside <manifest> but before <application>
4533
if (!manifest.includes(permission)) {
4634
manifest = manifest.replace(
4735
/<manifest[^>]*>/,
@@ -62,57 +50,24 @@ const addPermissionToManifest = async () => {
6250
}
6351
};
6452

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-
53+
// 🟢 2. Create `BatteryOptimizationHelper.kt` with improved logic
10354
const kotlinHelperCode = `
104-
package com.digitalnomad91.codebuilderadmin
55+
package ${packageName}
10556
10657
import android.content.Context
10758
import android.content.Intent
10859
import android.net.Uri
10960
import android.provider.Settings
61+
import android.util.Log
62+
import com.facebook.react.ReactPackage
63+
import com.facebook.react.bridge.NativeModule
11064
import com.facebook.react.bridge.ReactApplicationContext
11165
import com.facebook.react.bridge.ReactContextBaseJavaModule
11266
import com.facebook.react.bridge.ReactMethod
67+
import com.facebook.react.uimanager.ViewManager
11368
11469
class BatteryOptimizationHelper(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
115-
70+
11671
override fun getName(): String {
11772
return "BatteryOptimizationHelper"
11873
}
@@ -121,42 +76,63 @@ class BatteryOptimizationHelper(reactContext: ReactApplicationContext) : ReactCo
12176
fun autoHighlightApp() {
12277
try {
12378
val context: Context = reactApplicationContext
124-
val packageName = context.packageName // ✅ FIX: Dynamically retrieve package name
79+
val packageName = context.packageName
80+
81+
Log.d("BatteryOptimizationHelper", "Opening battery optimization settings for " + packageName)
12582
83+
// First, try opening the specific battery optimization settings
12684
val intent = Intent(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS)
127-
intent.data = Uri.parse("package:$packageName") // ✅ FIX: Use correct package name
85+
intent.data = Uri.parse("package:" + packageName)
12886
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
129-
context.startActivity(intent)
87+
88+
if (intent.resolveActivity(context.packageManager) != null) {
89+
context.startActivity(intent)
90+
Log.d("BatteryOptimizationHelper", "Battery optimization settings opened!")
91+
} else {
92+
// If direct setting fails, open general battery settings instead
93+
Log.e("BatteryOptimizationHelper", "Could not resolve activity for battery optimization settings! Trying general battery settings...")
94+
val generalIntent = Intent(Settings.ACTION_BATTERY_SAVER_SETTINGS)
95+
generalIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
96+
97+
if (generalIntent.resolveActivity(context.packageManager) != null) {
98+
context.startActivity(generalIntent)
99+
Log.d("BatteryOptimizationHelper", "General battery settings opened!")
100+
} else {
101+
Log.e("BatteryOptimizationHelper", "Could not resolve activity for general battery settings!")
102+
}
103+
}
130104
} catch (e: Exception) {
131-
e.printStackTrace()
105+
Log.e("BatteryOptimizationHelper", "Error opening battery settings: " + e.message, e)
132106
}
133107
}
134108
}
109+
110+
class BatteryOptimizationPackage : ReactPackage {
111+
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
112+
return listOf(BatteryOptimizationHelper(reactContext))
113+
}
114+
115+
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
116+
return emptyList()
117+
}
118+
}
135119
`;
136120

137121
const createBatteryOptimizationHelper = async () => {
138122
try {
139-
const helperCode = isKotlin ? kotlinHelperCode : javaHelperCode;
140123
await fs.ensureFile(helperPath);
141-
await fs.writeFile(helperPath, helperCode, "utf8");
142-
console.log(
143-
`✅ BatteryOptimizationHelper.${isKotlin ? "kt" : "java"} created`
144-
);
124+
await fs.writeFile(helperPath, kotlinHelperCode, "utf8");
125+
console.log("✅ BatteryOptimizationHelper.kt created");
145126
} catch (error) {
146-
console.error(
147-
`❌ Error creating BatteryOptimizationHelper.${
148-
isKotlin ? "kt" : "java"
149-
}:`,
150-
error
151-
);
127+
console.error("❌ Error creating BatteryOptimizationHelper.kt:", error);
152128
}
153129
};
154130

155-
// 🟢 3. Modify `MainApplication` to register the new module
131+
// 🟢 3. Modify `MainApplication.kt` to register the module correctly
156132
const modifyMainApplication = async () => {
157133
try {
158134
let mainApplication = await fs.readFile(mainApplicationPath, "utf8");
159-
const importStatement = `import com.digitalnomad91.codebuilderadmin.BatteryOptimizationHelper`;
135+
const importStatement = `import ${packageName}.BatteryOptimizationPackage`;
160136

161137
if (!mainApplication.includes(importStatement)) {
162138
mainApplication = mainApplication.replace(
@@ -165,36 +141,30 @@ const modifyMainApplication = async () => {
165141
);
166142
}
167143

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(),";
144+
// ✅ Detect Expo’s New Architecture
145+
const isNewArch = mainApplication.includes("DefaultReactNativeHost");
146+
147+
if (isNewArch) {
148+
console.log(
149+
"🔍 Detected Expo New Architecture. Adjusting `MainApplication.kt`..."
150+
);
151+
152+
const registerModule = "BatteryOptimizationPackage()";
153+
179154
if (!mainApplication.includes(registerModule)) {
180155
mainApplication = mainApplication.replace(
181-
"new MainReactPackage(),",
182-
`new MainReactPackage(),\n ${registerModule}`
156+
/val packages = PackageList\(this\)\.packages/,
157+
`val packages = PackageList(this).packages.toMutableList()\n packages.add(${registerModule})`
183158
);
184159
}
185160
}
186161

187162
await fs.writeFile(mainApplicationPath, mainApplication, "utf8");
188163
console.log(
189-
`✅ BatteryOptimizationHelper registered in MainApplication.${
190-
isKotlin ? "kt" : "java"
191-
}`
164+
"✅ BatteryOptimizationPackage registered in MainApplication.kt"
192165
);
193166
} catch (error) {
194-
console.error(
195-
`❌ Error updating MainApplication.${isKotlin ? "kt" : "java"}:`,
196-
error
197-
);
167+
console.error("❌ Error updating MainApplication.kt:", error);
198168
}
199169
};
200170

0 commit comments

Comments
 (0)