diff --git a/play-services-base-core/src/main/java/org/microg/gms/common/PackageUtils.java b/play-services-base-core/src/main/java/org/microg/gms/common/PackageUtils.java
index 58b209b8..b4b3d69d 100644
--- a/play-services-base-core/src/main/java/org/microg/gms/common/PackageUtils.java
+++ b/play-services-base-core/src/main/java/org/microg/gms/common/PackageUtils.java
@@ -17,6 +17,7 @@
package org.microg.gms.common;
import android.app.ActivityManager;
+import android.app.Application;
import android.app.PendingIntent;
import android.content.Context;
import android.content.pm.PackageInfo;
@@ -26,6 +27,7 @@ import android.os.Binder;
import androidx.annotation.Nullable;
+import java.lang.reflect.Method;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
@@ -230,6 +232,19 @@ public class PackageUtils {
}
}
+ public static String getProcessName() {
+ if (android.os.Build.VERSION.SDK_INT >= 28)
+ return Application.getProcessName();
+ try {
+ Class> activityThread = Class.forName("android.app.ActivityThread");
+ String methodName = android.os.Build.VERSION.SDK_INT >= 18 ? "currentProcessName" : "currentPackageName";
+ Method getProcessName = activityThread.getDeclaredMethod(methodName);
+ return (String) getProcessName.invoke(null);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
public static String sha1sum(byte[] bytes) {
MessageDigest md;
try {
diff --git a/play-services-core/src/main/AndroidManifest.xml b/play-services-core/src/main/AndroidManifest.xml
index b816da4a..831a1514 100644
--- a/play-services-core/src/main/AndroidManifest.xml
+++ b/play-services-core/src/main/AndroidManifest.xml
@@ -129,11 +129,11 @@
-
+
@@ -238,6 +238,8 @@
+
+
@@ -346,7 +348,8 @@
+ android:exported="true"
+ android:process=":ui">
@@ -358,6 +361,7 @@
android:name="org.microg.gms.auth.login.LoginActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
+ android:process=":ui"
android:theme="@style/Theme.LoginBlue">
@@ -370,6 +374,7 @@
android:name="org.microg.gms.auth.AskPermissionActivity"
android:excludeFromRecents="true"
android:exported="true"
+ android:process=":ui"
android:theme="@style/Theme.AppCompat.DayNight.Dialog" />
+ android:exported="true"
+ android:process=":ui" />
@@ -422,6 +429,7 @@
@@ -433,6 +441,7 @@
android:name="org.microg.gms.ui.SettingsActivity"
android:icon="@mipmap/ic_microg_settings"
android:label="@string/gms_settings_name"
+ android:process=":ui"
android:roundIcon="@mipmap/ic_microg_settings">
@@ -441,6 +450,7 @@
+
@@ -449,6 +459,7 @@
android:name="org.microg.gms.ui.SettingsDashboardActivity"
android:icon="@mipmap/ic_microg_settings"
android:label="Legacy microG Settings"
+ android:process=":ui"
android:roundIcon="@mipmap/ic_microg_settings" />
@@ -456,6 +467,7 @@
android:name="org.microg.gms.ui.SettingsActivityLink"
android:icon="@drawable/microg_light_color_24"
android:label="@string/gms_settings_name"
+ android:process=":ui"
android:targetActivity="org.microg.gms.ui.SettingsActivity">
@@ -475,25 +487,32 @@
+ android:label="@string/pref_about_title"
+ android:process=":ui" />
+ android:label="@string/gms_settings_name"
+ android:process=":ui" />
+ android:label="@string/service_name_snet"
+ android:process=":ui" />
+ android:label="@string/self_check_title"
+ android:process=":ui" />
-
+
@@ -503,7 +522,9 @@
-
+
diff --git a/play-services-core/src/main/kotlin/org/microg/gms/gcm/StatusInfo.kt b/play-services-core/src/main/kotlin/org/microg/gms/gcm/StatusInfo.kt
new file mode 100644
index 00000000..1797ca6c
--- /dev/null
+++ b/play-services-core/src/main/kotlin/org/microg/gms/gcm/StatusInfo.kt
@@ -0,0 +1,53 @@
+/*
+ * SPDX-FileCopyrightText: 2020, microG Project Team
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package org.microg.gms.gcm
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.util.Log
+import java.io.Serializable
+import kotlin.coroutines.resume
+import kotlin.coroutines.suspendCoroutine
+
+private const val ACTION_STATUS_INFO_REQUEST = "org.microg.gms.STATUS_INFO_REQUEST"
+private const val ACTION_STATUS_INFO_RESPONSE = "org.microg.gms.STATUS_INFO_RESPONSE"
+private const val EXTRA_STATUS_INFO = "org.microg.gms.STATUS_INFO"
+private const val TAG = "GmsGcmStatusInfo"
+
+data class StatusInfo(val connected: Boolean, val startTimestamp: Long) : Serializable
+
+class StatusInfoProvider : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent) {
+ try {
+ context.sendOrderedBroadcast(Intent(ACTION_STATUS_INFO_RESPONSE).apply {
+ setPackage(context.packageName)
+ putExtra(EXTRA_STATUS_INFO, StatusInfo(McsService.isConnected(), McsService.getStartTimestamp()))
+ }, null)
+ } catch (e: Exception) {
+ Log.w(TAG, e)
+ }
+ }
+}
+
+suspend fun getStatusInfo(context: Context): StatusInfo? = suspendCoroutine {
+ context.registerReceiver(object : BroadcastReceiver() {
+ override fun onReceive(context: Context, intent: Intent?) {
+ try {
+ it.resume(intent?.getSerializableExtra(EXTRA_STATUS_INFO) as? StatusInfo)
+ } catch (e: Exception) {
+ Log.w(TAG, e)
+ }
+ context.unregisterReceiver(this)
+ }
+ }, IntentFilter(ACTION_STATUS_INFO_RESPONSE))
+ try {
+ context.sendOrderedBroadcast(Intent(context, StatusInfoProvider::class.java), null)
+ } catch (e: Exception) {
+ it.resume(null)
+ }
+}
diff --git a/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationPreferencesFragment.kt b/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationPreferencesFragment.kt
index 43e5fca8..9b5f8281 100644
--- a/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationPreferencesFragment.kt
+++ b/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationPreferencesFragment.kt
@@ -20,6 +20,7 @@ import kotlinx.coroutines.withContext
import org.microg.gms.gcm.GcmDatabase
import org.microg.gms.gcm.GcmPrefs
import org.microg.gms.gcm.McsService
+import org.microg.gms.gcm.getStatusInfo
class PushNotificationPreferencesFragment : PreferenceFragmentCompat() {
private lateinit var pushStatusCategory: PreferenceCategory
@@ -67,10 +68,13 @@ class PushNotificationPreferencesFragment : PreferenceFragmentCompat() {
private fun updateStatus() {
handler.postDelayed(updateRunnable, UPDATE_INTERVAL)
pushStatusCategory.isVisible = GcmPrefs.get(context).isEnabled
- pushStatus.summary = if (McsService.isConnected()) {
- getString(R.string.gcm_network_state_connected, DateUtils.getRelativeTimeSpanString(McsService.getStartTimestamp(), System.currentTimeMillis(), 0))
- } else {
- getString(R.string.gcm_network_state_disconnected)
+ lifecycleScope.launchWhenStarted {
+ val statusInfo = getStatusInfo(requireContext())
+ pushStatus.summary = if (statusInfo != null && statusInfo.connected) {
+ getString(R.string.gcm_network_state_connected, DateUtils.getRelativeTimeSpanString(statusInfo.startTimestamp, System.currentTimeMillis(), 0))
+ } else {
+ getString(R.string.gcm_network_state_disconnected)
+ }
}
}