#!/bin/bash echo "🚀 Creating Valid HikeMap APK (Alternative Method)" echo "==================================================" # Create temp directory for APK build TEMP_DIR="/tmp/hikemap-apk-build" rm -rf "$TEMP_DIR" mkdir -p "$TEMP_DIR" cd "$TEMP_DIR" # Create basic Android project structure echo "📁 Creating Android project structure..." mkdir -p app/src/main/java/org/duckdns/bibbit/hikemap mkdir -p app/src/main/res/values mkdir -p app/src/main/res/drawable mkdir -p app/src/main/assets # Create MainActivity.java cat > app/src/main/java/org/duckdns/bibbit/hikemap/MainActivity.java <<'EOF' package org.duckdns.bibbit.hikemap; import android.app.Activity; import android.os.Bundle; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.webkit.GeolocationPermissions; import android.webkit.WebChromeClient; import android.Manifest; import android.content.pm.PackageManager; import android.os.Build; public class MainActivity extends Activity { private WebView webView; private static final int LOCATION_PERMISSION_REQUEST = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); webView = new WebView(this); setContentView(webView); // Request location permission if needed if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{ Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION }, LOCATION_PERMISSION_REQUEST); } } WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setDatabaseEnabled(true); webSettings.setGeolocationEnabled(true); webSettings.setLoadWithOverviewMode(true); webSettings.setUseWideViewPort(true); webSettings.setAllowFileAccess(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("https://maps.bibbit.duckdns.org")) { return false; } return true; } }); webView.setWebChromeClient(new WebChromeClient() { @Override public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { callback.invoke(origin, true, false); } }); webView.loadUrl("https://maps.bibbit.duckdns.org"); } @Override public void onBackPressed() { if (webView.canGoBack()) { webView.goBack(); } else { super.onBackPressed(); } } } EOF # Create AndroidManifest.xml cat > app/src/main/AndroidManifest.xml <<'EOF' EOF # Create strings.xml cat > app/src/main/res/values/strings.xml <<'EOF' HikeMap EOF # Copy icon if available if [ -f /home/frigate/HikeMap/icon-192x192.png ]; then cp /home/frigate/HikeMap/icon-192x192.png app/src/main/res/drawable/ic_launcher.png else # Create a simple default icon echo "Creating default icon..." convert -size 192x192 xc:green app/src/main/res/drawable/ic_launcher.png 2>/dev/null || true fi # Create build.gradle for app module cat > app/build.gradle <<'EOF' apply plugin: 'com.android.application' android { compileSdkVersion 33 defaultConfig { applicationId "org.duckdns.bibbit.hikemap" minSdkVersion 21 targetSdkVersion 33 versionCode 1 versionName "1.0.0" } buildTypes { release { minifyEnabled false } } } dependencies { } EOF # Create root build.gradle cat > build.gradle <<'EOF' buildscript { repositories { google() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:7.4.2' } } allprojects { repositories { google() mavenCentral() } } EOF # Create settings.gradle cat > settings.gradle <<'EOF' include ':app' EOF # Create gradle.properties cat > gradle.properties <<'EOF' android.useAndroidX=false android.enableJetifier=false EOF echo "✅ Android project structure created" echo "" echo "📝 Note: To build this APK, you need:" echo " 1. Android SDK installed" echo " 2. Run: ./gradlew assembleRelease" echo " 3. Sign the APK with jarsigner or apksigner" echo "" echo "The Docker build is still running in the background and will produce a better APK."