diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 29935f0..7dd12df 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -37,14 +37,6 @@ android:resource="@xml/file_paths"> - - - - diff --git a/android/app/src/main/java/com/ouji/factory/myapp/AppSecurity.java b/android/app/src/main/java/com/ouji/factory/myapp/AppSecurity.java new file mode 100644 index 0000000..e687ecd --- /dev/null +++ b/android/app/src/main/java/com/ouji/factory/myapp/AppSecurity.java @@ -0,0 +1,29 @@ +package com.ouji.factory.myapp; + +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import com.getcapacitor.JSObject; +import com.getcapacitor.Plugin; +import com.getcapacitor.PluginCall; +import com.getcapacitor.PluginMethod; +import com.getcapacitor.annotation.CapacitorPlugin; +import org.json.JSONArray; + +import java.util.List; + +@CapacitorPlugin(name = "AppSecurity") +public class AppSecurity extends Plugin { + + @PluginMethod + public void getInstalledApps(PluginCall call) { + PackageManager pm = getContext().getPackageManager(); + List packages = pm.getInstalledApplications(PackageManager.GET_META_DATA); + JSONArray appPackages = new JSONArray(); + for (ApplicationInfo packageInfo : packages) { + appPackages.put(packageInfo.packageName); + } + JSObject ret = new JSObject(); + ret.put("packages", appPackages); + call.resolve(ret); + } +} diff --git a/android/app/src/main/java/com/ouji/factory/myapp/MainActivity.java b/android/app/src/main/java/com/ouji/factory/myapp/MainActivity.java index 4815c1e..ee7dfc0 100644 --- a/android/app/src/main/java/com/ouji/factory/myapp/MainActivity.java +++ b/android/app/src/main/java/com/ouji/factory/myapp/MainActivity.java @@ -6,13 +6,16 @@ import android.view.WindowManager; import androidx.core.view.WindowCompat; import androidx.core.view.WindowInsetsControllerCompat; import com.getcapacitor.BridgeActivity; +import com.getcapacitor.Plugin; + +import java.util.ArrayList; public class MainActivity extends BridgeActivity { @Override public void onCreate(Bundle savedInstanceState) { + registerPlugin(AppSecurity.class); super.onCreate(savedInstanceState); - // Configure window for proper native behavior setupNativeWindow(); } diff --git a/backend/server.js b/backend/server.js index 1856f45..281436c 100644 --- a/backend/server.js +++ b/backend/server.js @@ -1102,6 +1102,18 @@ const geofence = polygon([ } }) + // Get App Blacklist Endpoint + app.get('/api/security/app-blacklist', authenticateJWT, async (req, res) => { + try { + const [rows] = await db.execute('SELECT package_name FROM app_blacklist'); + const packageNames = rows.map(row => row.package_name); + res.json(packageNames); + } catch (error) { + console.error('Get app blacklist error:', error); + res.status(500).json({ message: 'Database error fetching app blacklist.' }); + } + }); + // --- Server Start --- const httpPort = process.env.HTTP_PORT || 3000 const httpsPort = process.env.HTTPS_PORT || 3443 diff --git a/src/App.vue b/src/App.vue index d574609..fd0823d 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,12 +1,20 @@ @@ -27,6 +35,8 @@ const router = useRouter() const route = useRoute() const isLoggedIn = ref(false) +const isBlocked = ref(false) +const blockMessage = ref('') // Show bottom navigation only for worker routes @@ -102,6 +112,9 @@ watch( ) onMounted(async () => { + // Add app blocked event listener + window.addEventListener('app-blocked', handleAppBlocked) + // Initialize SafeArea plugin for proper safe area handling if (Capacitor.isNativePlatform()) { try { @@ -179,8 +192,14 @@ onMounted(async () => { } }) +const handleAppBlocked = (event) => { + isBlocked.value = true + blockMessage.value = event.detail.message +} + onBeforeUnmount(() => { // Clean up listeners + window.removeEventListener('app-blocked', handleAppBlocked) if (Capacitor.isNativePlatform()) { App.removeAllListeners() } @@ -188,6 +207,36 @@ onBeforeUnmount(() => {