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) + } } }