Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
34048e6
Bump actions/checkout from 5 to 6
dependabot[bot] Dec 10, 2025
09f6146
Fix: Resolve all compilation errors for WearOS Bluetooth support
Dec 14, 2025
2b9c0be
Merge branch 'master' into wearos-bluetooth-support
SBALAVIGNESH123 Dec 14, 2025
c59523d
Fix: Add missing BLUETOOTH_CONNECT permission
Dec 15, 2025
eda5727
Merge branch 'wearos-bluetooth-support' of https://github.com/SBALAVI…
Dec 15, 2025
8bbba2c
Add permission string for interacting across profiles in Japanese
noimzip Dec 7, 2025
cfa7088
Add Thai translations for microG-UI-tools component (#3179)
grenadin Dec 16, 2025
def05a6
Fixed the inability to change profile picture (#3170)
DaVinci9196 Dec 16, 2025
9440651
Merge branch 'master' into wearos-bluetooth-support
SBALAVIGNESH123 Dec 16, 2025
22b8895
Fix: Add runtime permission checks for BLUETOOTH_CONNECT
Dec 16, 2025
623cb2a
Wifi: Handle invalid WifiInfo objects without bssid
mar-v-in Dec 29, 2025
52deaee
location: allow IP fallback for Wi-Fi-only geolocation
althafvly Dec 30, 2025
2aae6af
Location: Don't trigger moving wifi shortcut if connection info is br…
mar-v-in Jan 6, 2026
48c962e
Merge branch 'master' into wearos-bluetooth-support
SBALAVIGNESH123 Jan 6, 2026
95d5fc1
Vending: Added PI access management (#3108)
DaVinci9196 Jan 7, 2026
00b8c36
HmsMaps: Optimize UI controls (#3129)
DaVinci9196 Jan 7, 2026
f9d1556
Vending: Added return value (update.availability) (#3145)
DaVinci9196 Jan 7, 2026
207ef83
Asset: Fixed game resource download issues (#3124)
DaVinci9196 Jan 7, 2026
527a0cd
Phenotype: resolve Gmail failing to send emails with attachments (#3189)
DaVinci9196 Jan 7, 2026
bcd639d
Google 2FA: prevent infinite request loop if registration fails (#3222)
DaVinci9196 Jan 8, 2026
748964b
Vending: Added InAppReviewActivity (#3163)
DaVinci9196 Jan 8, 2026
7a10209
Auth: Fixed some login failure issues (#3143)
DaVinci9196 Jan 8, 2026
41d01cb
Add missing action to manifest
mar-v-in Jan 9, 2026
7f8a5d0
Merge branch 'master' into wearos-bluetooth-support
SBALAVIGNESH123 Jan 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ jobs:
# Log available space
df -h
- name: "Checkout sources"
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: "Setup Java"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/dependency-submission.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:

steps:
- name: "Checkout sources"
uses: actions/checkout@v5
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: "Setup Java"
Expand Down
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ buildscript {
ext.preferenceVersion = '1.2.0'
ext.recyclerviewVersion = '1.3.2'
ext.webkitVersion = '1.10.0'
ext.workVersion = '2.7.0'

ext.slf4jVersion = '1.7.36'
ext.volleyVersion = '1.2.1'
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: 2025 microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/

package com.google.android.gms.auth.api.identity;

parcelable ClearTokenRequest;
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
/*
* SPDX-FileCopyrightText: 2025 microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/

package com.google.android.gms.auth.api.identity;

parcelable RevokeAccessRequest;
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,13 @@ import com.google.android.gms.auth.api.identity.internal.IAuthorizationCallback;
import com.google.android.gms.auth.api.identity.internal.IVerifyWithGoogleCallback;
import com.google.android.gms.auth.api.identity.AuthorizationRequest;
import com.google.android.gms.auth.api.identity.VerifyWithGoogleRequest;
import com.google.android.gms.auth.api.identity.RevokeAccessRequest;
import com.google.android.gms.auth.api.identity.ClearTokenRequest;
import com.google.android.gms.common.api.internal.IStatusCallback;

interface IAuthorizationService {
void authorize(in IAuthorizationCallback callback, in AuthorizationRequest request) = 0;
void verifyWithGoogle(in IVerifyWithGoogleCallback callback, in VerifyWithGoogleRequest request) = 1;
void revokeAccess(in IStatusCallback callback, in RevokeAccessRequest request) = 2;
void clearToken(in IStatusCallback callback, in ClearTokenRequest request) = 3;
}
Original file line number Diff line number Diff line change
Expand Up @@ -143,4 +143,13 @@ public static abstract class Builder {
public void writeToParcel(@NonNull Parcel parcel, int flags) {
CREATOR.writeToParcel(this, parcel, flags);
}

@Override
public String toString() {
return "RevokeAccessRequest{" +
"scopes=" + scopes +
", account=" + account +
", sessionId='" + sessionId + '\'' +
'}';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/**
* SPDX-FileCopyrightText: 2025 microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/

package org.microg.gms.common

import android.accounts.Account
import android.annotation.SuppressLint
import android.content.Context
import android.content.Context.MODE_PRIVATE
import androidx.core.content.edit
import org.microg.gms.auth.AuthConstants

class AccountUtils(val context: Context) {

private val prefs = context.getSharedPreferences("common.selected_account_prefs", MODE_PRIVATE)

companion object {
private const val TYPE = "selected_account_type:"
@SuppressLint("StaticFieldLeak")
@Volatile
private var instance: AccountUtils? = null
fun get(context: Context): AccountUtils = instance ?: synchronized(this) {
instance ?: AccountUtils(context.applicationContext).also { instance = it }
}
}

fun saveSelectedAccount(packageName: String, account: Account?) {
if (account != null) {
prefs.edit(true) {
putString(packageName, account.name)
putString(TYPE.plus(packageName), account.type)
}
}
}

fun getSelectedAccount(packageName: String): Account? {
val name = prefs.getString(packageName, null) ?: return null
val type = prefs.getString(TYPE.plus(packageName), AuthConstants.DEFAULT_ACCOUNT_TYPE) ?: return null
return Account(name, type)
}

fun removeSelectedAccount(packageName: String) {
prefs.edit {
remove(packageName)
remove(TYPE.plus(packageName))
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@ object SettingsContract {
const val ASSET_DEVICE_SYNC = "vending_device_sync"
const val APPS_INSTALL = "vending_apps_install"
const val APPS_INSTALLER_LIST = "vending_apps_installer_list"
const val PLAY_INTEGRITY_APP_LIST = "vending_play_integrity_apps"

val PROJECTION = arrayOf(
LICENSING,
Expand All @@ -289,6 +290,7 @@ object SettingsContract {
ASSET_DEVICE_SYNC,
APPS_INSTALL,
APPS_INSTALLER_LIST,
PLAY_INTEGRITY_APP_LIST
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,7 @@ class SettingsProvider : ContentProvider() {
Vending.SPLIT_INSTALL -> getSettingsBoolean(key, false)
Vending.APPS_INSTALL -> getSettingsBoolean(key, false)
Vending.APPS_INSTALLER_LIST -> getSettingsString(key, "")
Vending.PLAY_INTEGRITY_APP_LIST -> getSettingsString(key, "")
else -> throw IllegalArgumentException("Unknown key: $key")
}
}
Expand All @@ -386,6 +387,7 @@ class SettingsProvider : ContentProvider() {
Vending.ASSET_DEVICE_SYNC -> editor.putBoolean(key, value as Boolean)
Vending.APPS_INSTALL -> editor.putBoolean(key, value as Boolean)
Vending.APPS_INSTALLER_LIST -> editor.putString(key, value as String)
Vending.PLAY_INTEGRITY_APP_LIST -> editor.putString(key, value as String)
else -> throw IllegalArgumentException("Unknown key: $key")
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/**
* SPDX-FileCopyrightText: 2025 microG Project Team
* SPDX-License-Identifier: Apache-2.0
*/

package org.microg.gms.vending

import org.json.JSONException
import org.json.JSONObject

class PlayIntegrityData(var allowed: Boolean,
val packageName: String,
val pkgSignSha256: String,
var lastTime: Long,
var lastResult: String? = null,
var lastStatus: Boolean = false) {

override fun toString(): String {
return JSONObject()
.put(ALLOWED, allowed)
.put(PACKAGE_NAME, packageName)
.put(SIGNATURE, pkgSignSha256)
.put(LAST_VISIT_TIME, lastTime)
.put(LAST_VISIT_RESULT, lastResult)
.put(LAST_VISIT_STATUS, lastStatus)
.toString()
}

companion object {
private const val PACKAGE_NAME = "packageName"
private const val ALLOWED = "allowed"
private const val SIGNATURE = "signature"
private const val LAST_VISIT_TIME = "lastVisitTime"
private const val LAST_VISIT_RESULT = "lastVisitResult"
private const val LAST_VISIT_STATUS = "lastVisitStatus"

private fun parse(jsonString: String): PlayIntegrityData? {
try {
val json = JSONObject(jsonString)
return PlayIntegrityData(
json.getBoolean(ALLOWED),
json.getString(PACKAGE_NAME),
json.getString(SIGNATURE),
json.getLong(LAST_VISIT_TIME),
json.getString(LAST_VISIT_RESULT),
json.getBoolean(LAST_VISIT_STATUS)
)
} catch (e: JSONException) {
return null
}
}

fun loadDataSet(content: String): Set<PlayIntegrityData> {
return content.split("|").mapNotNull { parse(it) }.toSet()
}

fun updateDataSetString(channelList: Set<PlayIntegrityData>, channel: PlayIntegrityData): String {
val channelData = channelList.find { it.packageName == channel.packageName && it.pkgSignSha256 == channel.pkgSignSha256 }
val newChannelList = if (channelData != null) {
channelData.allowed = channel.allowed
channelData.lastTime = channel.lastTime
channelData.lastResult = channel.lastResult
channelData.lastStatus = channel.lastStatus
channelList
} else {
channelList + channel
}
return newChannelList.let { it -> it.joinToString(separator = "|") { it.toString() } }
}
}
}
2 changes: 2 additions & 0 deletions play-services-core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,8 @@ dependencies {

implementation "androidx.lifecycle:lifecycle-service:$lifecycleVersion"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlinVersion"

implementation "androidx.work:work-runtime-ktx:$workVersion"
}

android {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@

<string name="self_check_cat_permissions">権限付与</string>
<string name="self_check_name_permission">%1$sの権限:</string>
<string name="self_check_name_permission_interact_across_profiles">仕事用プロファイルを操作する権限:</string>
<string name="self_check_resolution_permission">ここをタップして権限を付与してください。 権限を付与しないと、アプリが正しく動作しない可能性があります。</string>

<string name="about_root_title">microG UIデモ</string>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2013-2017 microG Project Team
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->

<resources>
<string name="lib_name">เครื่องมือส่วนต่อประสานกับผู้ใช้ของ microG</string>
<string name="lib_license">Apache License 2.0, ทีม microG</string>

<string name="about_version_str">เวอร์ชัน %1$s</string>
<string name="about_name_version_str">%1$s %2$s</string>
<string name="about_default_license">สงวนลิขสิทธิ์ทุกประการ</string>

<string name="prefcat_setup">ตั้งค่า</string>

<string name="self_check_title">โมดูลการตรวจสอบด้วยตนเอง</string>
<string name="self_check_desc">ตรวจสอบว่าระบบได้รับการตั้งค่าอย่างถูกต้องเพื่อใช้งาน microG หรือไม่</string>

<string name="self_check_cat_permissions">ได้รับสิทธิ์แล้ว</string>
<string name="self_check_name_permission">สิทธิ์ในการเข้าถึง %1$s:</string>
<string name="self_check_name_permission_interact_across_profiles">สิทธิ์ในการโต้ตอบกับโปรไฟล์งานของบริษัท:</string>
<string name="self_check_resolution_permission">แตะที่นี้เพื่อทำการให้สิทธิ์ การไม่ให้สิทธิ์อาจจะส่งผลให้เกิดพฤติกรรมไม่เหมาะสม</string>

<string name="about_root_title">สาธิตส่วนต่อประสานกับผู้ใช้ของ microG</string>
<string name="about_root_summary">สรุป</string>
<string name="about_root_version">เวอร์ชัน v0.1.0</string>
<string name="about_root_libraries">ไลบรารีสนับสนุน</string>

<string name="about_android_support_v4">ไลบรารีสนับสนุนเวอร์ชัน 4</string>
<string name="about_android_support_v7_appcompat">ไลบรารีสนับสนุน appcompat เวอร์ชัน 7</string>
<string name="about_android_support_v7_preference">ไลบรารีสนับสนุนการตั้งค่า เวอร์ชัน 7</string>
<string name="about_android_support_license">Apache License 2.0, The Android Open Source Project</string>
</resources>
6 changes: 3 additions & 3 deletions play-services-core/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -376,8 +376,9 @@
android:exported="false"
android:process=":persistent">
<intent-filter>
<action android:name="org.microg.gms.gcm.REGISTERED" />
<action android:name="org.microg.gms.gcm.CONNECTED" />
<action android:name="org.microg.gms.gcm.REGISTER_ACCOUNT" />
<action android:name="org.microg.gms.gcm.REGISTER_ALL_ACCOUNTS" />
<action android:name="org.microg.gms.gcm.NOTIFY_COMPLETE" />

<action android:name="com.google.android.c2dm.intent.RECEIVE" />
Expand Down Expand Up @@ -420,8 +421,7 @@
</receiver>

<receiver
android:name="org.microg.gms.gcm.UnregisterReceiver"
android:process=":persistent">
android:name="org.microg.gms.common.PersistentTrustedReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_DATA_CLEARED" />
<action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,8 @@
import static android.app.AlarmManager.ELAPSED_REALTIME_WAKEUP;
import static android.os.Build.VERSION.SDK_INT;
import static org.microg.gms.common.PackageUtils.warnIfNotPersistentProcess;
import static org.microg.gms.gcm.ExtensionsKt.ACTION_GCM_CONNECTED;
import static org.microg.gms.gcm.GcmConstants.*;
import static org.microg.gms.gcm.ExtensionsKt.ACTION_GCM_REGISTERED;
import static org.microg.gms.gcm.McsConstants.*;

@ForegroundServiceInfo(value = "Cloud messaging", resName = "service_name_mcs", resPackage = "com.google.android.gms")
Expand Down Expand Up @@ -497,15 +497,15 @@ private void handleLoginResponse(LoginResponse loginResponse) {
if (loginResponse.error == null) {
GcmPrefs.clearLastPersistedId(this);
logd(this, "Logged in");
notifyGcmRegistered();
notifyGcmConnected();
wakeLock.release();
} else {
throw new RuntimeException("Could not login: " + loginResponse.error);
}
}

private void notifyGcmRegistered() {
Intent intent = new Intent(ACTION_GCM_REGISTERED);
private void notifyGcmConnected() {
Intent intent = new Intent(ACTION_GCM_CONNECTED);
intent.setPackage(Constants.GMS_PACKAGE_NAME);
sendBroadcast(intent);
}
Expand Down

This file was deleted.

Loading