package io.guh.nymeaapp; import java.io.File; import android.util.Log; import android.content.Intent; import android.content.Context; import android.os.Bundle; import android.os.Build; import android.telephony.TelephonyManager; import android.provider.Settings; import android.provider.Settings.Secure; import android.os.Vibrator; import android.net.Uri; import android.content.res.Configuration; import android.content.IntentFilter; import android.content.BroadcastReceiver; import android.location.LocationManager; import androidx.core.content.FileProvider; import androidx.core.view.ViewCompat; import androidx.core.view.WindowCompat; import android.view.WindowInsets; public class NymeaAppActivity extends org.qtproject.qt5.android.bindings.QtActivity { private static final String TAG = "nymea-app: NymeaAppActivity"; private static Context context = null; private static native void darkModeEnabledChangedJNI(); private static native void notificationActionReceivedJNI(String data); private static native void locationServicesEnabledChangedJNI(); private BroadcastReceiver m_gpsSwitchStateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.i(TAG, "**** Intent received!!!" + intent.getAction()); if (LocationManager.MODE_CHANGED_ACTION.equals(intent.getAction())) { locationServicesEnabledChangedJNI(); } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Move th app to the background (Edge to edge is forced since SDK 35) //WindowCompat.setDecorFitsSystemWindows(getWindow(), true); this.context = getApplicationContext(); } public void onNewIntent (Intent intent) { Log.d(TAG, "New intent: " + intent); String notificationData = intent.getStringExtra("notificationData"); if (notificationData != null) { Log.d(TAG, "Intent data: " + notificationData); notificationActionReceivedJNI(notificationData); } } @Override public void onResume() { super.onResume(); IntentFilter filter = new IntentFilter(LocationManager.MODE_CHANGED_ACTION); // filter.addAction(Intent.ACTION_PROVIDER_CHANGED); registerReceiver(m_gpsSwitchStateReceiver, filter); } @Override public void onPause() { super.onPause(); unregisterReceiver(m_gpsSwitchStateReceiver); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); NymeaAppActivity.darkModeEnabledChangedJNI(); } public String notificationData() { return getIntent().getStringExtra("notificationData"); } public static Context getAppContext() { return NymeaAppActivity.context; } public String deviceSerial() { return Secure.getString(getApplicationContext().getContentResolver(), Secure.ANDROID_ID); } public static String deviceManufacturer() { return Build.MANUFACTURER; } public static String deviceModel() { return Build.MODEL; } public static String device() { return Build.DEVICE; } public void vibrate(int duration) { Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); v.vibrate(duration); } public void shareFile(String fileName) { Intent sendIntent = new Intent(); sendIntent.setAction(Intent.ACTION_SEND); sendIntent.setType("text/plain"); Uri uri = FileProvider.getUriForFile(getApplicationContext(), getPackageName() + ".fileprovider", new File(fileName)); sendIntent.putExtra(Intent.EXTRA_STREAM, uri); if (sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(sendIntent); } else { Log.d(TAG, "Intent not resolved"); } } public boolean darkModeEnabled() { return (getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES; } public boolean locationServicesEnabled() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { // This is a new method provided in API 28 LocationManager lm = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE); return lm.isLocationEnabled(); } // This was deprecated in API 28 int mode = Settings.Secure.getInt(getApplicationContext().getContentResolver(), Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF); return (mode != Settings.Secure.LOCATION_MODE_OFF); } public int topPadding() { WindowInsets windowInsets = getWindow().getDecorView().getRootWindowInsets(); return windowInsets.getInsets(WindowInsets.Type.statusBars() | WindowInsets.Type.displayCutout()).top; } public int bottomPadding() { WindowInsets windowInsets = getWindow().getDecorView().getRootWindowInsets(); return windowInsets.getInsets(WindowInsets.Type.navigationBars() | WindowInsets.Type.displayCutout()).bottom; } }