diff --git a/Android.mk b/Android.mk index 5416ad10..2f7c68b6 100644 --- a/Android.mk +++ b/Android.mk @@ -22,20 +22,20 @@ LOCAL_PACKAGE_NAME := GmsCore gmscore_root := $(LOCAL_PATH) gmscore_dir := play-services-core gmscore_out := $(TARGET_COMMON_OUT_ROOT)/obj/APPS/$(LOCAL_MODULE)_intermediates -gmscore_build := $(gmscore_root)/$(gmscore_dir)/build -gmscore_apk := build/outputs/apk/release/play-services-core-release-unsigned.apk +gmscore_build := $(gmscore_dir)/build +gmscore_apk := $(gmscore_build)/outputs/apk/release/play-services-core-release-unsigned.apk -$(gmscore_root)/$(gmscore_dir)/$(gmscore_apk): - rm -Rf $(gmscore_build) +$(gmscore_root)/$(gmscore_apk): + rm -Rf $(gmscore_root)/$(gmscore_build) mkdir -p $(ANDROID_BUILD_TOP)/$(gmscore_out) - ln -s $(ANDROID_BUILD_TOP)/$(gmscore_out) $(ANDROID_BUILD_TOP)/$(gmscore_build) + ln -s $(ANDROID_BUILD_TOP)/$(gmscore_out) $(ANDROID_BUILD_TOP)/$(gmscore_root)/$(gmscore_build) echo "sdk.dir=$(ANDROID_HOME)" > $(gmscore_root)/local.properties cd $(gmscore_root) && git submodule update --recursive --init cd $(gmscore_root)/$(gmscore_dir) && JAVA_TOOL_OPTIONS="$(JAVA_TOOL_OPTIONS) -Dfile.encoding=UTF8" ../gradlew assembleRelease LOCAL_CERTIFICATE := platform -LOCAL_SRC_FILES := $(gmscore_dir)/$(gmscore_apk) +LOCAL_SRC_FILES := $(gmscore_apk) LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) -include $(BUILD_PREBUILT) +include $(BUILD_PREBUILT) \ No newline at end of file diff --git a/LICENSES/CC0-1.0.txt b/LICENSES/CC0-1.0.txt new file mode 100644 index 00000000..0e259d42 --- /dev/null +++ b/LICENSES/CC0-1.0.txt @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/build.gradle b/build.gradle index 65ee0b65..b6dea5be 100644 --- a/build.gradle +++ b/build.gradle @@ -4,31 +4,9 @@ */ buildscript { - ext.cronetVersion = '91.0.4472.120.1' - ext.safeParcelVersion = '1.7.0' - - ext.kotlinVersion = '1.4.32' - ext.coroutineVersion = '1.3.8' - - ext.annotationVersion = '1.2.0' - ext.appcompatVersion = '1.2.0' - ext.fragmentVersion = '1.3.0' - ext.lifecycleVersion = '2.3.1' - ext.mediarouterVersion = '1.2.2' - ext.navigationVersion = '2.3.5' - ext.preferenceVersion = '1.1.1' - ext.recyclerviewVersion = '1.1.0' - - ext.supportLibraryVersion = "28.0.0" - ext.wireVersion = '3.2.2' - - ext.androidBuildGradleVersion = "4.1.0" - - ext.androidBuildVersionTools = "30.0.2" - - ext.androidMinSdk = 21 - ext.androidTargetSdk = 29 - ext.androidCompileSdk = 30 + ext.androidMinSdk = 23 + ext.androidTargetSdk = 30 + ext.androidCompileSdk = 31 repositories { jcenter() @@ -36,9 +14,9 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.0.2' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion" - classpath "com.squareup.wire:wire-gradle-plugin:$wireVersion" + classpath 'com.android.tools.build:gradle:7.1.0' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10" + classpath "com.squareup.wire:wire-gradle-plugin:3.2.2" } } @@ -46,8 +24,8 @@ allprojects { apply plugin: 'idea' group = 'org.microg.gms' - version = "0.2.22.212658" - ext.appVersionCode = 212658001 + version = "0.2.23.220217" + ext.appVersionCode = 220217001 ext.isReleaseVersion = false } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 5f8423db..942d8725 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sat Sep 11 09:04:01 CEST 2021 +#Wed Jan 26 02:00:21 CET 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index fbd7c515..60cf9e8c 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,8 @@ -#!/usr/bin/env sh +#!/bin/sh +# SPDX-License-Identifier: Apache-2.0 # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +18,101 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,99 +122,112 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) -exec "$JAVACMD" "$@" + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" \ No newline at end of file diff --git a/play-services-api/build.gradle b/play-services-api/build.gradle index 3eb582b8..a7e8a5c4 100644 --- a/play-services-api/build.gradle +++ b/play-services-api/build.gradle @@ -18,7 +18,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion androidCompileSdk - buildToolsVersion "$androidBuildVersionTools" + buildToolsVersion "30.0.3" defaultConfig { minSdkVersion androidMinSdk diff --git a/play-services-api/src/main/aidl/com/google/android/gms/auth/api/internal/IAuthCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/auth/api/internal/IAuthCallbacks.aidl new file mode 100644 index 00000000..ae8e79c5 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/auth/api/internal/IAuthCallbacks.aidl @@ -0,0 +1,8 @@ +package com.google.android.gms.auth.api.internal; + +import com.google.android.gms.auth.api.proxy.ProxyResponse; + +interface IAuthCallbacks { + void onProxyResponse(in ProxyResponse response) = 0; + void onSpatulaHeader(String spatulaHeader) = 1; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/auth/api/internal/IAuthService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/auth/api/internal/IAuthService.aidl new file mode 100644 index 00000000..a5f6a537 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/auth/api/internal/IAuthService.aidl @@ -0,0 +1,11 @@ +package com.google.android.gms.auth.api.internal; + +import com.google.android.gms.auth.api.internal.IAuthCallbacks; +//import com.google.android.gms.auth.api.proxy.ProxyGrpcRequest; +import com.google.android.gms.auth.api.proxy.ProxyRequest; + +interface IAuthService { + void performProxyRequest(IAuthCallbacks callbacks, in ProxyRequest request) = 0; +// void performProxyGrpcRequest(IAuthCallback callbacks, in ProxyGrpcRequest request) = 1; + void getSpatulaHeader(IAuthCallbacks callbacks) = 2; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/auth/api/proxy/ProxyRequest.aidl b/play-services-api/src/main/aidl/com/google/android/gms/auth/api/proxy/ProxyRequest.aidl new file mode 100644 index 00000000..fa5885f8 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/auth/api/proxy/ProxyRequest.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.auth.api.proxy; + +parcelable ProxyRequest; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/auth/api/proxy/ProxyResponse.aidl b/play-services-api/src/main/aidl/com/google/android/gms/auth/api/proxy/ProxyResponse.aidl new file mode 100644 index 00000000..eae21f3c --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/auth/api/proxy/ProxyResponse.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.auth.api.proxy; + +parcelable ProxyResponse; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/auth/appcert/IAppCertService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/auth/appcert/IAppCertService.aidl new file mode 100644 index 00000000..ee7f7338 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/auth/appcert/IAppCertService.aidl @@ -0,0 +1,6 @@ +package com.google.android.gms.auth.appcert; + +interface IAppCertService { + boolean fetchDeviceKey() = 0; + String getSpatulaHeader(String packageName) = 1; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/checkin/internal/ICheckinService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/checkin/internal/ICheckinService.aidl index 6ac61289..973de92f 100644 --- a/play-services-api/src/main/aidl/com/google/android/gms/checkin/internal/ICheckinService.aidl +++ b/play-services-api/src/main/aidl/com/google/android/gms/checkin/internal/ICheckinService.aidl @@ -2,4 +2,6 @@ package com.google.android.gms.checkin.internal; interface ICheckinService { String getDeviceDataVersionInfo(); + long getLastCheckinSuccessTime(); + String getLastSimOperator(); } diff --git a/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerCallbacks.aidl index 31042db8..61e23cff 100644 --- a/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerCallbacks.aidl +++ b/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerCallbacks.aidl @@ -1,7 +1,13 @@ package com.google.android.gms.clearcut.internal; import com.google.android.gms.common.api.Status; +import com.google.android.gms.common.data.DataHolder; interface IClearcutLoggerCallbacks { - oneway void onStatus(in Status status) = 0; + oneway void onLogResult(in Status status) = 0; + oneway void onForceUploadResult(in Status status) = 1; + oneway void onStartCollectForDebugResult(in Status status, long l) = 2; + oneway void onStopCollectForDebugResult(in Status status) = 3; + oneway void onCollectForDebugExpiryTime(in Status status, long l) = 4; + oneway void onLogEventParcelables(in DataHolder data) = 6; } diff --git a/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerService.aidl index b2f1b2fd..018252e0 100644 --- a/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerService.aidl +++ b/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/IClearcutLoggerService.aidl @@ -4,5 +4,11 @@ import com.google.android.gms.clearcut.internal.IClearcutLoggerCallbacks; import com.google.android.gms.clearcut.LogEventParcelable; interface IClearcutLoggerService { - void log(IClearcutLoggerCallbacks callbacks, in LogEventParcelable event) = 0; + oneway void log(IClearcutLoggerCallbacks callbacks, in LogEventParcelable event) = 0; + oneway void forceUpload(IClearcutLoggerCallbacks callbacks) = 1; + oneway void startCollectForDebug(IClearcutLoggerCallbacks callbacks) = 2; + oneway void stopCollectForDebug(IClearcutLoggerCallbacks callbacks) = 3; + oneway void getCollectForDebugExpiryTime(IClearcutLoggerCallbacks callbacks) = 4; + oneway void getLogEventParcelablesLegacy(IClearcutLoggerCallbacks callbacks) = 5; + oneway void getLogEventParcelables(IClearcutLoggerCallbacks callbacks) = 6; } diff --git a/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/PlayLoggerContext.aidl b/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/PlayLoggerContext.aidl new file mode 100644 index 00000000..e213b96c --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/clearcut/internal/PlayLoggerContext.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.clearcut.internal; + +parcelable PlayLoggerContext; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/measurement/api/internal/IAppMeasurementDynamiteService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/measurement/api/internal/IAppMeasurementDynamiteService.aidl new file mode 100644 index 00000000..5df0a37f --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/measurement/api/internal/IAppMeasurementDynamiteService.aidl @@ -0,0 +1,55 @@ +package com.google.android.gms.measurement.api.internal; + +import com.google.android.gms.dynamic.IObjectWrapper; +import com.google.android.gms.measurement.api.internal.IBundleReceiver; +import com.google.android.gms.measurement.api.internal.IEventHandlerProxy; +import com.google.android.gms.measurement.api.internal.IStringProvider; +import com.google.android.gms.measurement.api.internal.InitializationParams; + +interface IAppMeasurementDynamiteService { + void initialize(in IObjectWrapper context, in InitializationParams params, long timestamp) = 0; + void logEvent(String str, String str2, in Bundle bundle, boolean z, boolean z2, long timestamp) = 1; + void logEventAndBundle(String str, String str2, in Bundle bundle, IBundleReceiver receiver, long j) = 2; + void setUserProperty(String str, String str2, in IObjectWrapper obj, boolean z, long j) = 3; + void getUserProperties(String str, String str2, boolean z, IBundleReceiver receiver) = 4; + void getMaxUserProperties(String str, IBundleReceiver receiver) = 5; + void setUserId(String str, long j) = 6; + void setConditionalUserProperty(in Bundle bundle, long j) = 7; + void clearConditionalUserProperty(String str, String str2, in Bundle bundle) = 8; + void getConditionalUserProperties(String str, String str2, IBundleReceiver receiver) = 9; + void setMeasurementEnabled(boolean z, long j) = 10; + void resetAnalyticsData(long j) = 11; + void setMinimumSessionDuration(long j) = 12; + void setSessionTimeoutDuration(long j) = 13; + void setCurrentScreen(in IObjectWrapper obj, String str, String str2, long j) = 14; + void getCurrentScreenName(IBundleReceiver receiver) = 15; + void getCurrentScreenClass(IBundleReceiver receiver) = 16; + void setInstanceIdProvider(IStringProvider provider) = 17; + void getCachedAppInstanceId(IBundleReceiver receiver) = 18; + void getAppInstanceId(IBundleReceiver receiver) = 19; + void getGmpAppId(IBundleReceiver receiver) = 20; + void generateEventId(IBundleReceiver receiver) = 21; + void beginAdUnitExposure(String str, long j) = 22; + void endAdUnitExposure(String str, long j) = 23; + void onActivityStarted(in IObjectWrapper activity, long j) = 24; + void onActivityStopped(in IObjectWrapper activity, long j) = 25; + void onActivityCreated(in IObjectWrapper activity, in Bundle bundle, long j) = 26; + void onActivityDestroyed(in IObjectWrapper activity, long j) = 27; + void onActivityPaused(in IObjectWrapper activity, long j) = 28; + void onActivityResumed(in IObjectWrapper activity, long j) = 29; + void onActivitySaveInstanceState(in IObjectWrapper activity, IBundleReceiver receiver, long j) = 30; + void performAction(in Bundle bundle, IBundleReceiver receiver, long j) = 31; + void logHealthData(int i, String str, in IObjectWrapper obj, in IObjectWrapper obj2, in IObjectWrapper obj3) = 32; + void setEventInterceptor(IEventHandlerProxy proxy) = 33; + void registerOnMeasurementEventListener(IEventHandlerProxy proxy) = 34; + void unregisterOnMeasurementEventListener(IEventHandlerProxy proxy) = 35; + void initForTests(in Map map) = 36; + void getTestFlag(IBundleReceiver receiver, int i) = 37; + void setDataCollectionEnabled(boolean z) = 38; + void isDataCollectionEnabled(IBundleReceiver receiver) = 39; + + void setDefaultEventParameters(in Bundle bundle) = 41; + void setConsent(in Bundle bundle, long j) = 43; + void setConsentThirdParty(in Bundle bundle, long j) = 44; + void clearMeasurementEnabled(long j) = 42; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/measurement/api/internal/IBundleReceiver.aidl b/play-services-api/src/main/aidl/com/google/android/gms/measurement/api/internal/IBundleReceiver.aidl new file mode 100644 index 00000000..68d80ee8 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/measurement/api/internal/IBundleReceiver.aidl @@ -0,0 +1,5 @@ +package com.google.android.gms.measurement.api.internal; + +interface IBundleReceiver { + void onBundle(in Bundle bundle); +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/measurement/api/internal/IEventHandlerProxy.aidl b/play-services-api/src/main/aidl/com/google/android/gms/measurement/api/internal/IEventHandlerProxy.aidl new file mode 100644 index 00000000..5325899b --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/measurement/api/internal/IEventHandlerProxy.aidl @@ -0,0 +1,6 @@ +package com.google.android.gms.measurement.api.internal; + +interface IEventHandlerProxy { + void f1(String s1, String s2, in Bundle bundle, long j) = 0; + int f2() = 1; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/measurement/api/internal/IStringProvider.aidl b/play-services-api/src/main/aidl/com/google/android/gms/measurement/api/internal/IStringProvider.aidl new file mode 100644 index 00000000..2d8f9d17 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/measurement/api/internal/IStringProvider.aidl @@ -0,0 +1,4 @@ +package com.google.android.gms.measurement.api.internal; + +interface IStringProvider { +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/measurement/api/internal/InitializationParams.aidl b/play-services-api/src/main/aidl/com/google/android/gms/measurement/api/internal/InitializationParams.aidl new file mode 100644 index 00000000..cce367c7 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/measurement/api/internal/InitializationParams.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.measurement.api.internal; + +parcelable InitializationParams; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/IMeasurementService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/IMeasurementService.aidl index 8a99173a..1c78896a 100644 --- a/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/IMeasurementService.aidl +++ b/play-services-api/src/main/aidl/com/google/android/gms/measurement/internal/IMeasurementService.aidl @@ -3,23 +3,25 @@ package com.google.android.gms.measurement.internal; import com.google.android.gms.measurement.internal.AppMetadata; import com.google.android.gms.measurement.internal.ConditionalUserPropertyParcel; import com.google.android.gms.measurement.internal.EventParcel; +import com.google.android.gms.measurement.internal.UserAttributeParcel; interface IMeasurementService { - void f1(in EventParcel p0, in AppMetadata p1) = 0; -// void zza(UserAttributeParcel p0, AppMetadata p1) = 1; - void f4(in AppMetadata p0) = 3; -// void zza(EventParcel p0, String p1, String p2) = 4; -// void zzb(AppMetadata p0) = 5; -// List zza(AppMetadata p0, boolean p1) = 6; -// byte[] zza(EventParcel p0, String p1) = 8; + void f1(in EventParcel event, in AppMetadata app) = 0; + void f2(in UserAttributeParcel attribute, in AppMetadata app) = 1; + void f4(in AppMetadata app) = 3; +// void f5(in EventParcel p0, String p1, String p2) = 4; +// void f6(in AppMetadata p0) = 5; +// List f7(in AppMetadata p0, boolean p1) = 6; +// byte[] f9(in EventParcel p0, String p1) = 8; void f10(long p0, String p1, String p2, String p3) = 9; - String f11(in AppMetadata p0) = 10; - void f12(in ConditionalUserPropertyParcel p0, in AppMetadata p1) = 11; -// void zza(ConditionalUserPropertyParcel p0) = 12; -// List zza(String p0, String p1, boolean p2, AppMetadata p3) = 13; -// List zza(String p0, String p1, String p2, boolean p3) = 14; -// List zza(String p0, String p1, AppMetadata p2) = 15; -// List zza(String p0, String p1, String p2) = 16; -// void zzd(AppMetadata p0) = 17; -// void zza(Bundle p0, AppMetadata p1) = 18; + String f11(in AppMetadata app) = 10; + void f12(in ConditionalUserPropertyParcel property, in AppMetadata app) = 11; +// void f13(ConditionalUserPropertyParcel p0) = 12; +// List getUserProperties(String p0, String p1, boolean p2, in AppMetadata p3) = 13; +// List getUserPropertiesAs(String p0, String p1, String p2, boolean p3) = 14; +// List getConditionalUserProperties(String p0, String p1, in AppMetadata p2) = 15; +// List getCondtionalUserPropertiesAs(String p0, String p1, String p2) = 16; +// void f18(in AppMetadata p0) = 17; + void setDefaultEventParameters(in Bundle params, in AppMetadata app) = 18; +// void f20(in AppMetadata p0) = 19; } diff --git a/play-services-api/src/main/aidl/com/google/android/gms/playlog/internal/IPlayLogService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/playlog/internal/IPlayLogService.aidl index 86169b99..9bcdee44 100644 --- a/play-services-api/src/main/aidl/com/google/android/gms/playlog/internal/IPlayLogService.aidl +++ b/play-services-api/src/main/aidl/com/google/android/gms/playlog/internal/IPlayLogService.aidl @@ -1,8 +1,9 @@ package com.google.android.gms.playlog.internal; +import com.google.android.gms.clearcut.internal.PlayLoggerContext; import com.google.android.gms.playlog.internal.LogEvent; -import com.google.android.gms.playlog.internal.PlayLoggerContext; +// Deprecated interface IPlayLogService { void onEvent(String packageName, in PlayLoggerContext context, in LogEvent event) = 1; void onMultiEvent(String packageName, in PlayLoggerContext context, in List events) = 2; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/playlog/internal/PlayLoggerContext.aidl b/play-services-api/src/main/aidl/com/google/android/gms/playlog/internal/PlayLoggerContext.aidl deleted file mode 100644 index 9cc0e0e4..00000000 --- a/play-services-api/src/main/aidl/com/google/android/gms/playlog/internal/PlayLoggerContext.aidl +++ /dev/null @@ -1,3 +0,0 @@ -package com.google.android.gms.playlog.internal; - -parcelable PlayLoggerContext; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/UsageReportingOptInOptions.aidl b/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/UsageReportingOptInOptions.aidl new file mode 100644 index 00000000..a88060fb --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/UsageReportingOptInOptions.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.usagereporting; + +parcelable UsageReportingOptInOptions; diff --git a/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingCallbacks.aidl b/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingCallbacks.aidl new file mode 100644 index 00000000..3e877c25 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingCallbacks.aidl @@ -0,0 +1,11 @@ +package com.google.android.gms.usagereporting.internal; + +import com.google.android.gms.common.api.Status; +import com.google.android.gms.usagereporting.UsageReportingOptInOptions; + +interface IUsageReportingCallbacks { + oneway void onOptInOptions(in Status status, in UsageReportingOptInOptions options) = 1; + oneway void onOptInOptionsSet(in Status status) = 2; + oneway void onOptInOptionsChangedListenerAdded(in Status status) = 3; + oneway void onOptInOptionsChangedListenerRemoved(in Status status) = 4; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingOptInOptionsChangedListener.aidl b/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingOptInOptionsChangedListener.aidl new file mode 100644 index 00000000..8e9c2875 --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingOptInOptionsChangedListener.aidl @@ -0,0 +1,5 @@ +package com.google.android.gms.usagereporting.internal; + +interface IUsageReportingOptInOptionsChangedListener { + oneway void onOptionsChanged() = 1; +} diff --git a/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingService.aidl b/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingService.aidl new file mode 100644 index 00000000..46d6265d --- /dev/null +++ b/play-services-api/src/main/aidl/com/google/android/gms/usagereporting/internal/IUsageReportingService.aidl @@ -0,0 +1,12 @@ +package com.google.android.gms.usagereporting.internal; + +import com.google.android.gms.usagereporting.internal.IUsageReportingCallbacks; +import com.google.android.gms.usagereporting.internal.IUsageReportingOptInOptionsChangedListener; +import com.google.android.gms.usagereporting.UsageReportingOptInOptions; + +interface IUsageReportingService { + oneway void getOptInOptions(IUsageReportingCallbacks callbacks) = 1; + oneway void setOptInOptions(in UsageReportingOptInOptions options, IUsageReportingCallbacks callbacks) = 2; + oneway void addOptInOptionsChangedListener(IUsageReportingOptInOptionsChangedListener listener, IUsageReportingCallbacks callbacks) = 3; + oneway void removeOptInOptionsChangedListener(IUsageReportingOptInOptionsChangedListener listener, IUsageReportingCallbacks callbacks) = 4; +} diff --git a/play-services-api/src/main/aidl/com/mgoogle/android/gms/phenotype/internal/IPhenotypeService.aidl b/play-services-api/src/main/aidl/com/mgoogle/android/gms/phenotype/internal/IPhenotypeService.aidl index e4099a1b..51cdf17f 100644 --- a/play-services-api/src/main/aidl/com/mgoogle/android/gms/phenotype/internal/IPhenotypeService.aidl +++ b/play-services-api/src/main/aidl/com/mgoogle/android/gms/phenotype/internal/IPhenotypeService.aidl @@ -4,5 +4,6 @@ import com.mgoogle.android.gms.phenotype.internal.IPhenotypeCallbacks; interface IPhenotypeService { void register(IPhenotypeCallbacks callbacks, String p1, int p2, in String[] p3, in byte[] p4) = 0; + void register2(IPhenotypeCallbacks callbacks, String p1, int p2, in String[] p3, in int[] p4, in byte[] p5) = 1; void getConfigurationSnapshot(IPhenotypeCallbacks callbacks, String p1, String p2, String p3) = 10; } diff --git a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/CorpusStatus.java b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/CorpusStatus.java index 5c71ea0c..ecfbbd0d 100644 --- a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/CorpusStatus.java +++ b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/CorpusStatus.java @@ -24,7 +24,7 @@ import org.microg.safeparcel.SafeParceled; public class CorpusStatus extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode; + private final int versionCode; @SafeParceled(1) public boolean found; @SafeParceled(2) diff --git a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/PIMEUpdateResponse.java b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/PIMEUpdateResponse.java index d542f48f..6bb080ba 100644 --- a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/PIMEUpdateResponse.java +++ b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/PIMEUpdateResponse.java @@ -21,7 +21,7 @@ import org.microg.safeparcel.SafeParceled; public class PIMEUpdateResponse extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode; + private final int versionCode; @SafeParceled(1) private String b; diff --git a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/QuerySpecification.java b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/QuerySpecification.java index 1be52c8f..cddcd2ab 100644 --- a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/QuerySpecification.java +++ b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/QuerySpecification.java @@ -24,7 +24,7 @@ import java.util.List; public class QuerySpecification extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 2; + private final int versionCode = 2; @SafeParceled(1) public final boolean b; //@SafeParceled(value = 2, subType = "TODO") diff --git a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SearchResults.java b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SearchResults.java index fec25f00..3fc9a6f8 100644 --- a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SearchResults.java +++ b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SearchResults.java @@ -21,7 +21,7 @@ import org.microg.safeparcel.SafeParceled; public class SearchResults extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 2; + private final int versionCode = 2; public static Creator CREATOR = new AutoCreator(SearchResults.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SuggestSpecification.java b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SuggestSpecification.java index 0f80a053..34dc8333 100644 --- a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SuggestSpecification.java +++ b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SuggestSpecification.java @@ -21,7 +21,7 @@ import org.microg.safeparcel.SafeParceled; public class SuggestSpecification extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode; + private final int versionCode; public SuggestSpecification() { versionCode = 2; diff --git a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SuggestionResults.java b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SuggestionResults.java index f616d51d..6ff68066 100644 --- a/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SuggestionResults.java +++ b/play-services-api/src/main/java/com/google/android/gms/appdatasearch/SuggestionResults.java @@ -21,7 +21,7 @@ import org.microg.safeparcel.SafeParceled; public class SuggestionResults extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode; + private final int versionCode; @SafeParceled(1) public final String errorMessage; diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/AccountChangeEvent.java b/play-services-api/src/main/java/com/google/android/gms/auth/AccountChangeEvent.java index d9a19568..0485f3a2 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/AccountChangeEvent.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/AccountChangeEvent.java @@ -19,5 +19,5 @@ package com.google.android.gms.auth; import org.microg.safeparcel.AutoSafeParcelable; public class AccountChangeEvent extends AutoSafeParcelable { - public static Creator CREATOR = new AutoCreator<>(AccountChangeEvent.class); + public static Creator CREATOR = new AutoCreator(AccountChangeEvent.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/AccountChangeEventsRequest.java b/play-services-api/src/main/java/com/google/android/gms/auth/AccountChangeEventsRequest.java index 78a84c71..dce80fc1 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/AccountChangeEventsRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/AccountChangeEventsRequest.java @@ -21,12 +21,12 @@ import org.microg.safeparcel.SafeParceled; public class AccountChangeEventsRequest extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(2) private int i; @SafeParceled(3) private String s; - public static Creator CREATOR = new AutoCreator<>(AccountChangeEventsRequest.class); + public static Creator CREATOR = new AutoCreator(AccountChangeEventsRequest.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/AccountChangeEventsResponse.java b/play-services-api/src/main/java/com/google/android/gms/auth/AccountChangeEventsResponse.java index df9e72e8..763e5d42 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/AccountChangeEventsResponse.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/AccountChangeEventsResponse.java @@ -24,13 +24,13 @@ import java.util.List; public class AccountChangeEventsResponse extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(value = 2, subClass = AccountChangeEvent.class) - private List events; + private final List events; public AccountChangeEventsResponse() { - events = new ArrayList<>(); + events = new ArrayList(); } - public static Creator CREATOR = new AutoCreator<>(AccountChangeEventsResponse.class); + public static Creator CREATOR = new AutoCreator(AccountChangeEventsResponse.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/TokenData.java b/play-services-api/src/main/java/com/google/android/gms/auth/TokenData.java index da762be9..c6fbe9e5 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/TokenData.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/TokenData.java @@ -25,7 +25,7 @@ import java.util.List; public class TokenData extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(2) public final String token; @@ -60,5 +60,5 @@ public class TokenData extends AutoSafeParcelable { this.scopes = null; } - public static final Creator CREATOR = new AutoCreator<>(TokenData.class); + public static final Creator CREATOR = new AutoCreator(TokenData.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/Credential.java b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/Credential.java index cc761a4a..5a92ddc5 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/Credential.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/Credential.java @@ -13,37 +13,29 @@ import android.text.TextUtils; import org.microg.gms.common.PublicApi; import org.microg.safeparcel.AutoSafeParcelable; -import org.microg.safeparcel.SafeParceled; import java.util.Arrays; import java.util.List; import java.util.Locale; -import java.util.Objects; @PublicApi public class Credential extends AutoSafeParcelable { @Field(1000) - private int versionCode = 1; + private final int versionCode = 1; @Field(1) private String id; - @Field(2) private String name; - @Field(3) private Uri profilePictureUri; - @Field(value = 4, subClass = IdToken.class) private List tokens; - @Field(5) private String password; - @Field(6) private String accountType; - @Field(7) private String generatedPassword; @@ -132,19 +124,19 @@ public class Credential extends AutoSafeParcelable { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof Credential)) return false; + if (o == null || !(o instanceof Credential)) return false; Credential that = (Credential) o; - if (!Objects.equals(id, that.id)) return false; - if (!Objects.equals(name, that.name)) return false; - if (!Objects.equals(profilePictureUri, that.profilePictureUri)) + if (id != null ? !id.equals(that.id) : that.id != null) return false; + if (name != null ? !name.equals(that.name) : that.name != null) return false; + if (profilePictureUri != null ? !profilePictureUri.equals(that.profilePictureUri) : that.profilePictureUri != null) return false; - if (!Objects.equals(password, that.password)) + if (password != null ? !password.equals(that.password) : that.password != null) return false; - if (!Objects.equals(accountType, that.accountType)) + if (accountType != null ? !accountType.equals(that.accountType) : that.accountType != null) return false; - return Objects.equals(generatedPassword, that.generatedPassword); + return generatedPassword != null ? generatedPassword.equals(that.generatedPassword) : that.generatedPassword == null; } @@ -154,7 +146,7 @@ public class Credential extends AutoSafeParcelable { } public static class Builder { - private String id; + private final String id; private String name; private Uri profilePictureUri; private String password; @@ -238,5 +230,5 @@ public class Credential extends AutoSafeParcelable { } } - public static final Creator CREATOR = new AutoCreator<>(Credential.class); + public static final Creator CREATOR = new AutoCreator(Credential.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/CredentialPickerConfig.java b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/CredentialPickerConfig.java index 516e9ccc..4cb1bbc9 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/CredentialPickerConfig.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/CredentialPickerConfig.java @@ -10,20 +10,17 @@ package com.google.android.gms.auth.api.credentials; import org.microg.gms.common.PublicApi; import org.microg.safeparcel.AutoSafeParcelable; -import org.microg.safeparcel.SafeParceled; @PublicApi public class CredentialPickerConfig extends AutoSafeParcelable { @Field(1000) - private int versionCode = 1; + private final int versionCode = 1; @Field(1) private boolean showAddAccountButton; - @Field(2) private boolean showCancelButton; - @Field(3) private boolean forNewAccount; @@ -60,7 +57,7 @@ public class CredentialPickerConfig extends AutoSafeParcelable { '}'; } - public static class Builder { + public class Builder { private boolean showAddAccountButton; private boolean showCancelButton; private boolean forNewAccount; @@ -94,5 +91,5 @@ public class CredentialPickerConfig extends AutoSafeParcelable { } } - public static final Creator CREATOR = new AutoCreator<>(CredentialPickerConfig.class); + public static final Creator CREATOR = new AutoCreator(CredentialPickerConfig.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/CredentialRequest.java b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/CredentialRequest.java index d5cbf928..6255fbf9 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/CredentialRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/CredentialRequest.java @@ -9,7 +9,6 @@ package com.google.android.gms.auth.api.credentials; import org.microg.safeparcel.AutoSafeParcelable; -import org.microg.safeparcel.SafeParceled; /** * Parameters for requesting a Credential, via Auth.CredentialsApi.request(). Instances can be @@ -18,17 +17,14 @@ import org.microg.safeparcel.SafeParceled; public class CredentialRequest extends AutoSafeParcelable { @Field(1000) - private int versionCode = 1; + private final int versionCode = 1; @Field(1) private boolean passwordLoginSupported; - @Field(2) private String[] accountTypes; - @Field(3) private CredentialPickerConfig credentialPickerConfig; - @Field(4) private CredentialPickerConfig credentialHintPickerConfig; @@ -65,7 +61,7 @@ public class CredentialRequest extends AutoSafeParcelable { return passwordLoginSupported; } - public static final Creator CREATOR = new AutoCreator<>(CredentialRequest.class); + public static final Creator CREATOR = new AutoCreator(CredentialRequest.class); public static class Builder { private boolean passwordLoginSupported; diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/HintRequest.java b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/HintRequest.java index 381c34fb..1f1cae80 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/HintRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/HintRequest.java @@ -20,7 +20,7 @@ import java.util.Arrays; @PublicApi public class HintRequest extends AutoSafeParcelable { @Field(1000) - private int versionCode = 2; + private final int versionCode = 2; @Field(1) private CredentialPickerConfig hintPickerConfig; @@ -167,4 +167,4 @@ public class HintRequest extends AutoSafeParcelable { this.serverClientId = serverClientId; } } -} \ No newline at end of file +} diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/IdToken.java b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/IdToken.java index 9da04ae7..aa6d19d4 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/IdToken.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/IdToken.java @@ -10,13 +10,12 @@ package com.google.android.gms.auth.api.credentials; import org.microg.gms.common.PublicApi; import org.microg.safeparcel.AutoSafeParcelable; -import org.microg.safeparcel.SafeParceled; @PublicApi public class IdToken extends AutoSafeParcelable { @Field(1000) - private int versionCode = 1; + private final int versionCode = 1; @Field(1) private String accountType; @@ -46,5 +45,5 @@ public class IdToken extends AutoSafeParcelable { return id; } - public static final Creator CREATOR = new AutoCreator<>(IdToken.class); + public static final Creator CREATOR = new AutoCreator(IdToken.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/IdentityProviders.java b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/IdentityProviders.java index e3a83f5d..8cd24eed 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/IdentityProviders.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/IdentityProviders.java @@ -31,4 +31,4 @@ public final class IdentityProviders { public static String getIdentityProviderForAccount(Account account) { return null; } -} \ No newline at end of file +} diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/internal/DeleteRequest.java b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/internal/DeleteRequest.java index e560ddc5..bd7ae6f2 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/internal/DeleteRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/internal/DeleteRequest.java @@ -19,5 +19,5 @@ package com.google.android.gms.auth.api.credentials.internal; import org.microg.safeparcel.AutoSafeParcelable; public class DeleteRequest extends AutoSafeParcelable { - public static final Creator CREATOR = new AutoCreator<>(DeleteRequest.class); + public static final Creator CREATOR = new AutoCreator(DeleteRequest.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/internal/GeneratePasswordRequest.java b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/internal/GeneratePasswordRequest.java index 5fd6fcb7..3da7a72a 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/internal/GeneratePasswordRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/internal/GeneratePasswordRequest.java @@ -19,5 +19,5 @@ package com.google.android.gms.auth.api.credentials.internal; import org.microg.safeparcel.AutoSafeParcelable; public class GeneratePasswordRequest extends AutoSafeParcelable { - public static final Creator CREATOR = new AutoCreator<>(GeneratePasswordRequest.class); + public static final Creator CREATOR = new AutoCreator(GeneratePasswordRequest.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/internal/SaveRequest.java b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/internal/SaveRequest.java index 24a9d92f..5ec25998 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/internal/SaveRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/api/credentials/internal/SaveRequest.java @@ -19,5 +19,5 @@ package com.google.android.gms.auth.api.credentials.internal; import org.microg.safeparcel.AutoSafeParcelable; public class SaveRequest extends AutoSafeParcelable { - public static final Creator CREATOR = new AutoCreator<>(SaveRequest.class); + public static final Creator CREATOR = new AutoCreator(SaveRequest.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/api/proxy/ProxyRequest.java b/play-services-api/src/main/java/com/google/android/gms/auth/api/proxy/ProxyRequest.java new file mode 100644 index 00000000..acca03a4 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/auth/api/proxy/ProxyRequest.java @@ -0,0 +1,41 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.auth.api.proxy; + +import android.os.Bundle; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ProxyRequest extends AutoSafeParcelable { + public static final int HTTP_METHOD_GET = 0; + public static final int HTTP_METHOD_POST = 1; + public static final int HTTP_METHOD_PUT = 2; + public static final int HTTP_METHOD_DELETE = 3; + public static final int HTTP_METHOD_HEAD = 4; + public static final int HTTP_METHOD_OPTIONS = 5; + public static final int HTTP_METHOD_TRACE = 6; + public static final int HTTP_METHOD_PATCH = 7; + + @Field(1000) + private final int versionCode = 2; + @Field(1) + public String url; + @Field(2) + public int httpMethod; + @Field(3) + public long timeoutMillis; + @Field(4) + public byte[] body; + @Field(5) + public Bundle headers; + + @Override + public String toString() { + return url; + } + + public static final Creator CREATOR = new AutoCreator<>(ProxyRequest.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/api/proxy/ProxyResponse.java b/play-services-api/src/main/java/com/google/android/gms/auth/api/proxy/ProxyResponse.java new file mode 100644 index 00000000..b18d21be --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/auth/api/proxy/ProxyResponse.java @@ -0,0 +1,30 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.auth.api.proxy; + +import android.app.PendingIntent; +import android.os.Bundle; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class ProxyResponse extends AutoSafeParcelable { + public static final int STATUS_CODE_NO_CONNECTION = -1; + + @Field(1000) + private final int versionCode = 1; + @Field(1) + public int gmsStatusCode; + @Field(2) + public PendingIntent recoveryAction; + @Field(3) + public int httpStatusCode; + @Field(4) + public Bundle headers; + @Field(5) + public byte[] body; + + public static final Creator CREATOR = new AutoCreator<>(ProxyResponse.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/AccountRecoveryGuidanceRequest.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/AccountRecoveryGuidanceRequest.java index 037427cb..d5f1d054 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/AccountRecoveryGuidanceRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/AccountRecoveryGuidanceRequest.java @@ -25,7 +25,7 @@ import org.microg.safeparcel.SafeParceled; public class AccountRecoveryGuidanceRequest extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(2) @Deprecated public final String accountName; @@ -42,5 +42,5 @@ public class AccountRecoveryGuidanceRequest extends AutoSafeParcelable { this.account = account; } - public static final Creator CREATOR = new AutoCreator<>(AccountRecoveryGuidanceRequest.class); + public static final Creator CREATOR = new AutoCreator(AccountRecoveryGuidanceRequest.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/AccountRemovalRequest.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/AccountRemovalRequest.java index 740b36f8..439825c2 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/AccountRemovalRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/AccountRemovalRequest.java @@ -25,7 +25,7 @@ import org.microg.safeparcel.SafeParceled; public class AccountRemovalRequest extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(2) @Deprecated public final String accountName; @@ -42,5 +42,5 @@ public class AccountRemovalRequest extends AutoSafeParcelable { this.account = account; } - public static final Creator CREATOR = new AutoCreator<>(AccountRemovalRequest.class); + public static final Creator CREATOR = new AutoCreator(AccountRemovalRequest.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/ConfirmCredentialsRequest.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/ConfirmCredentialsRequest.java index 2b55b7cb..16142d6a 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/ConfirmCredentialsRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/ConfirmCredentialsRequest.java @@ -24,11 +24,11 @@ import org.microg.safeparcel.SafeParceled; public class ConfirmCredentialsRequest extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(2) public AccountCredentials accountCredentials; @SafeParceled(3) public CaptchaSolution captchaSolution; - public static final Creator CREATOR = new AutoCreator<>(ConfirmCredentialsRequest.class); + public static final Creator CREATOR = new AutoCreator(ConfirmCredentialsRequest.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/TokenRequest.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/TokenRequest.java index 20efadb4..099e56f4 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/TokenRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/dataservice/TokenRequest.java @@ -26,7 +26,7 @@ import org.microg.safeparcel.SafeParceled; public class TokenRequest extends AutoSafeParcelable{ @SafeParceled(1) - private int versionCode = 4; + private final int versionCode = 4; @SafeParceled(3) public String accountName; @SafeParceled(4) @@ -40,5 +40,5 @@ public class TokenRequest extends AutoSafeParcelable{ return new Account(accountName, accountType); } - public static final Creator CREATOR = new AutoCreator<>(TokenRequest.class); + public static final Creator CREATOR = new AutoCreator(TokenRequest.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/delegate/ConfirmCredentialsWorkflowRequest.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/delegate/ConfirmCredentialsWorkflowRequest.java index 9e1903dd..d4308ef7 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/delegate/ConfirmCredentialsWorkflowRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/delegate/ConfirmCredentialsWorkflowRequest.java @@ -27,7 +27,7 @@ import org.microg.safeparcel.SafeParceled; public class ConfirmCredentialsWorkflowRequest extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 3; + private final int versionCode = 3; @SafeParceled(2) public String accountName; @SafeParceled(3) @@ -39,5 +39,5 @@ public class ConfirmCredentialsWorkflowRequest extends AutoSafeParcelable { @SafeParceled(6) public AccountAuthenticatorResponse accountAuthenticatorResponse; - public static final Creator CREATOR = new AutoCreator<>(ConfirmCredentialsWorkflowRequest.class); + public static final Creator CREATOR = new AutoCreator(ConfirmCredentialsWorkflowRequest.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/AccountCredentials.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/AccountCredentials.java index f8315516..33995a9a 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/AccountCredentials.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/AccountCredentials.java @@ -24,7 +24,7 @@ import org.microg.safeparcel.SafeParceled; // TODO public class AccountCredentials extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 2; + private final int versionCode = 2; @SafeParceled(3) public String accountName; @SafeParceled(9) @@ -34,5 +34,5 @@ public class AccountCredentials extends AutoSafeParcelable { return new Account(accountName, accountType); } - public static final Creator CREATOR = new AutoCreator<>(AccountCredentials.class); + public static final Creator CREATOR = new AutoCreator(AccountCredentials.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/AppDescription.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/AppDescription.java index 8b63ab12..efa4b2bc 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/AppDescription.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/AppDescription.java @@ -21,7 +21,7 @@ import org.microg.safeparcel.SafeParceled; public class AppDescription extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(2) public int callingUid; @SafeParceled(3) @@ -31,5 +31,5 @@ public class AppDescription extends AutoSafeParcelable { @SafeParceled(5) public String callingPkg; - public static final Creator CREATOR = new AutoCreator<>(AppDescription.class); + public static final Creator CREATOR = new AutoCreator(AppDescription.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/CaptchaSolution.java b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/CaptchaSolution.java index 6fe2b279..c0cb9326 100644 --- a/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/CaptchaSolution.java +++ b/play-services-api/src/main/java/com/google/android/gms/auth/firstparty/shared/CaptchaSolution.java @@ -23,7 +23,7 @@ import org.microg.safeparcel.SafeParceled; public class CaptchaSolution extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; - public static final Creator CREATOR = new AutoCreator<>(CaptchaSolution.class); + public static final Creator CREATOR = new AutoCreator(CaptchaSolution.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/clearcut/LogEventParcelable.java b/play-services-api/src/main/java/com/google/android/gms/clearcut/LogEventParcelable.java index 1c3b00ec..f275f206 100644 --- a/play-services-api/src/main/java/com/google/android/gms/clearcut/LogEventParcelable.java +++ b/play-services-api/src/main/java/com/google/android/gms/clearcut/LogEventParcelable.java @@ -18,22 +18,23 @@ package com.google.android.gms.clearcut; import android.util.Base64; -import com.google.android.gms.phenotype.ExperimentToken; -import com.google.android.gms.phenotype.GenericDimension; -import com.google.android.gms.playlog.internal.PlayLoggerContext; +import com.google.android.gms.clearcut.internal.LogVerifierResultParcelable; +import com.google.android.gms.clearcut.internal.PlayLoggerContext; +import com.mgoogle.android.gms.phenotype.ExperimentToken; +import com.mgoogle.android.gms.phenotype.GenericDimension; import org.microg.safeparcel.AutoSafeParcelable; -import org.microg.safeparcel.SafeParceled; import java.nio.ByteBuffer; import java.nio.CharBuffer; +import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.StandardCharsets; import java.util.Arrays; public class LogEventParcelable extends AutoSafeParcelable { @Field(1) - private int versionCode = 1; + private final int versionCode = 1; @Field(2) public final PlayLoggerContext context; @@ -62,6 +63,9 @@ public class LogEventParcelable extends AutoSafeParcelable { @Field(10) public final GenericDimension[] genericDimensions; + @Field(11) + public final LogVerifierResultParcelable logVerifierResult; + private LogEventParcelable() { context = null; bytes = null; @@ -71,6 +75,7 @@ public class LogEventParcelable extends AutoSafeParcelable { addPhenotypeExperimentTokens = false; experimentTokenParcelables = null; genericDimensions = null; + logVerifierResult = null; } public LogEventParcelable(PlayLoggerContext context, byte[] bytes, int[] testCodes, String[] mendelPackages, int[] experimentIds, byte[][] experimentTokens, boolean addPhenotypeExperimentTokens) { @@ -81,8 +86,9 @@ public class LogEventParcelable extends AutoSafeParcelable { this.experimentIds = experimentIds; this.experimentTokens = experimentTokens; this.addPhenotypeExperimentTokens = addPhenotypeExperimentTokens; - experimentTokenParcelables = null; - genericDimensions = null; + this.experimentTokenParcelables = null; + this.genericDimensions = null; + this.logVerifierResult = null; } @Override @@ -112,5 +118,5 @@ public class LogEventParcelable extends AutoSafeParcelable { } } - public static final Creator CREATOR = new AutoCreator<>(LogEventParcelable.class); + public static final Creator CREATOR = new AutoCreator(LogEventParcelable.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/clearcut/internal/LogVerifierResultParcelable.java b/play-services-api/src/main/java/com/google/android/gms/clearcut/internal/LogVerifierResultParcelable.java new file mode 100644 index 00000000..4b1fa834 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/clearcut/internal/LogVerifierResultParcelable.java @@ -0,0 +1,15 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.clearcut.internal; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class LogVerifierResultParcelable extends AutoSafeParcelable { + @Field(1) + public boolean b; + + public static final Creator CREATOR = new AutoCreator<>(LogVerifierResultParcelable.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/playlog/internal/PlayLoggerContext.java b/play-services-api/src/main/java/com/google/android/gms/clearcut/internal/PlayLoggerContext.java similarity index 76% rename from play-services-api/src/main/java/com/google/android/gms/playlog/internal/PlayLoggerContext.java rename to play-services-api/src/main/java/com/google/android/gms/clearcut/internal/PlayLoggerContext.java index 9e595a9c..85799407 100644 --- a/play-services-api/src/main/java/com/google/android/gms/playlog/internal/PlayLoggerContext.java +++ b/play-services-api/src/main/java/com/google/android/gms/clearcut/internal/PlayLoggerContext.java @@ -1,28 +1,16 @@ /* - * 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. + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 */ -package com.google.android.gms.playlog.internal; +package com.google.android.gms.clearcut.internal; import org.microg.safeparcel.AutoSafeParcelable; -import org.microg.safeparcel.SafeParceled; public class PlayLoggerContext extends AutoSafeParcelable { @Field(1) - private int versionCode = 1; + private final int versionCode = 1; @Field(2) public final String packageName; @@ -33,9 +21,6 @@ public class PlayLoggerContext extends AutoSafeParcelable { @Field(4) public final int logSource; - @Field(8) - public final String logSourceName; - @Field(5) public final String uploadAccount; @@ -45,6 +30,9 @@ public class PlayLoggerContext extends AutoSafeParcelable { @Field(7) public final boolean logAndroidId; + @Field(8) + public final String logSourceName; + @Field(9) public final boolean isAnonymous; @@ -57,13 +45,16 @@ public class PlayLoggerContext extends AutoSafeParcelable { @Field(12) public final boolean scrubMccMnc; + @Field(13) + public final Integer piiLevelset; + private PlayLoggerContext() { packageName = uploadAccount = logSourceName = loggingId = null; - qosTier = packageVersionCode = logSource = appMobileSpecId = -1; + qosTier = packageVersionCode = logSource = appMobileSpecId = piiLevelset = -1; isAnonymous = logAndroidId = scrubMccMnc = false; } - public PlayLoggerContext(String packageName, int packageVersionCode, int logSource, String logSourceName, String uploadAccount, String loggingId, boolean isAnonymous, int qosTier, boolean scrubMccMnc) { + public PlayLoggerContext(String packageName, int packageVersionCode, int logSource, String logSourceName, String uploadAccount, String loggingId, boolean isAnonymous, int qosTier, boolean scrubMccMnc, int piiLevelset) { this.packageName = packageName; this.packageVersionCode = packageVersionCode; this.logSource = logSource; @@ -75,6 +66,7 @@ public class PlayLoggerContext extends AutoSafeParcelable { this.qosTier = qosTier; this.appMobileSpecId = null; this.scrubMccMnc = scrubMccMnc; + this.piiLevelset = piiLevelset; } @Override @@ -89,9 +81,12 @@ public class PlayLoggerContext extends AutoSafeParcelable { sb.append(", logSourceName=").append(logSourceName); sb.append(", isAnonymous=").append(isAnonymous); sb.append(", qosTier=").append(qosTier); + sb.append(", appMobileSpecId=").append(appMobileSpecId); + sb.append(", scrubMccMnc=").append(scrubMccMnc); + sb.append(", piiLevelset=").append(piiLevelset); sb.append(']'); return sb.toString(); } public static Creator CREATOR = new AutoCreator(PlayLoggerContext.class); -} \ No newline at end of file +} diff --git a/play-services-api/src/main/java/com/google/android/gms/common/internal/GoogleCertificatesQuery.java b/play-services-api/src/main/java/com/google/android/gms/common/internal/GoogleCertificatesQuery.java index f47be78c..c8240279 100644 --- a/play-services-api/src/main/java/com/google/android/gms/common/internal/GoogleCertificatesQuery.java +++ b/play-services-api/src/main/java/com/google/android/gms/common/internal/GoogleCertificatesQuery.java @@ -71,5 +71,5 @@ public class GoogleCertificatesQuery extends AutoSafeParcelable { return certData; } - public static final Creator CREATOR = new AutoCreator<>(GoogleCertificatesQuery.class); + public static final Creator CREATOR = new AutoCreator(GoogleCertificatesQuery.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/common/server/FavaDiagnosticsEntity.java b/play-services-api/src/main/java/com/google/android/gms/common/server/FavaDiagnosticsEntity.java index d32e668b..6f10959a 100644 --- a/play-services-api/src/main/java/com/google/android/gms/common/server/FavaDiagnosticsEntity.java +++ b/play-services-api/src/main/java/com/google/android/gms/common/server/FavaDiagnosticsEntity.java @@ -20,5 +20,5 @@ import org.microg.safeparcel.AutoSafeParcelable; public class FavaDiagnosticsEntity extends AutoSafeParcelable { - public static final Creator CREATOR = new AutoCreator<>(FavaDiagnosticsEntity.class); + public static final Creator CREATOR = new AutoCreator(FavaDiagnosticsEntity.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/measurement/api/internal/InitializationParams.java b/play-services-api/src/main/java/com/google/android/gms/measurement/api/internal/InitializationParams.java new file mode 100644 index 00000000..43d7ff75 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/measurement/api/internal/InitializationParams.java @@ -0,0 +1,45 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.measurement.api.internal; + +import android.os.Bundle; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class InitializationParams extends AutoSafeParcelable { + @Field(1) + public long field1; + @Field(2) + public long field2; + @Field(3) + public boolean field3; + @Field(4) + public String field4; + @Field(5) + public String field5; + @Field(6) + public String field6; + @Field(7) + public Bundle field7; + @Field(8) + public String field8; + + @Override + public String toString() { + return "InitializationParams{" + + "field1=" + field1 + + ", field2=" + field2 + + ", field3=" + field3 + + ", field4='" + field4 + '\'' + + ", field5='" + field5 + '\'' + + ", field6='" + field6 + '\'' + + ", field7=" + field7 + + ", field8='" + field8 + '\'' + + '}'; + } + + public static final Creator CREATOR = new AutoCreator<>(InitializationParams.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/measurement/internal/AppMetadata.java b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/AppMetadata.java index be233570..b2b38f33 100644 --- a/play-services-api/src/main/java/com/google/android/gms/measurement/internal/AppMetadata.java +++ b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/AppMetadata.java @@ -25,7 +25,7 @@ public class AppMetadata extends AutoSafeParcelable { @Field(8) private String field8; @Field(9) - private boolean field9 = true; + private final boolean field9 = true; @Field(10) private boolean field10; @Field(11) @@ -57,5 +57,9 @@ public class AppMetadata extends AutoSafeParcelable { @Field(25) private String field25; + public String toString() { + return "AppMetadata[" + packageName + "]"; + } + public static final Creator CREATOR = new AutoCreator<>(AppMetadata.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/measurement/internal/EventParams.java b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/EventParams.java new file mode 100644 index 00000000..54de1394 --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/EventParams.java @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.measurement.internal; + +import android.os.Bundle; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class EventParams extends AutoSafeParcelable { + @Field(2) + public Bundle data; + + public static final Creator CREATOR = new AutoCreator<>(EventParams.class); +} diff --git a/play-services-api/src/main/java/com/google/android/gms/measurement/internal/EventParcel.java b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/EventParcel.java index 3ff7c796..7b5b6179 100644 --- a/play-services-api/src/main/java/com/google/android/gms/measurement/internal/EventParcel.java +++ b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/EventParcel.java @@ -8,5 +8,14 @@ package com.google.android.gms.measurement.internal; import org.microg.safeparcel.AutoSafeParcelable; public class EventParcel extends AutoSafeParcelable { + @Field(2) + public String name; + @Field(3) + public EventParams params; + @Field(4) + public String origin; + @Field(5) + public long timestamp; + public static final Creator CREATOR = new AutoCreator<>(EventParcel.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/measurement/internal/UserAttributeParcel.java b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/UserAttributeParcel.java index 6070b923..d9c74663 100644 --- a/play-services-api/src/main/java/com/google/android/gms/measurement/internal/UserAttributeParcel.java +++ b/play-services-api/src/main/java/com/google/android/gms/measurement/internal/UserAttributeParcel.java @@ -8,5 +8,20 @@ package com.google.android.gms.measurement.internal; import org.microg.safeparcel.AutoSafeParcelable; public class UserAttributeParcel extends AutoSafeParcelable { + @Field(1) + public int field1; + @Field(2) + public String name; + @Field(3) + public long timestamp; + @Field(4) + public Long field4; + @Field(6) + public String field6; + @Field(7) + public String field7; + @Field(8) + public Double field8; + public static final Creator CREATOR = new AutoCreator<>(UserAttributeParcel.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/people/internal/ParcelableLoadImageOptions.java b/play-services-api/src/main/java/com/google/android/gms/people/internal/ParcelableLoadImageOptions.java index 24b3872d..d0a7a742 100644 --- a/play-services-api/src/main/java/com/google/android/gms/people/internal/ParcelableLoadImageOptions.java +++ b/play-services-api/src/main/java/com/google/android/gms/people/internal/ParcelableLoadImageOptions.java @@ -21,7 +21,7 @@ import org.microg.safeparcel.SafeParceled; public class ParcelableLoadImageOptions extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) public int imageSize; @@ -32,5 +32,5 @@ public class ParcelableLoadImageOptions extends AutoSafeParcelable { @SafeParceled(3) public boolean useLargePictureForCp2Images; - public static final Creator CREATOR = new AutoCreator<>(ParcelableLoadImageOptions.class); + public static final Creator CREATOR = new AutoCreator(ParcelableLoadImageOptions.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/people/model/AccountMetadata.java b/play-services-api/src/main/java/com/google/android/gms/people/model/AccountMetadata.java index 103c572c..53038bbc 100644 --- a/play-services-api/src/main/java/com/google/android/gms/people/model/AccountMetadata.java +++ b/play-services-api/src/main/java/com/google/android/gms/people/model/AccountMetadata.java @@ -22,7 +22,7 @@ import org.microg.safeparcel.SafeParceled; public class AccountMetadata extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 2; + private final int versionCode = 2; @SafeParceled(2) public boolean hasGooglePlus = true; @@ -36,5 +36,5 @@ public class AccountMetadata extends AutoSafeParcelable { @SafeParceled(5) public boolean hasFeature4 = true; - public static Creator CREATOR = new AutoCreator<>(AccountMetadata.class); + public static Creator CREATOR = new AutoCreator(AccountMetadata.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/people/model/AvatarReference.java b/play-services-api/src/main/java/com/google/android/gms/people/model/AvatarReference.java index 3dbaba62..b03af386 100644 --- a/play-services-api/src/main/java/com/google/android/gms/people/model/AvatarReference.java +++ b/play-services-api/src/main/java/com/google/android/gms/people/model/AvatarReference.java @@ -30,5 +30,5 @@ public class AvatarReference extends AutoSafeParcelable { @SafeParceled(2) public String location; - public static final Creator CREATOR = new AutoCreator<>(AvatarReference.class); + public static final Creator CREATOR = new AutoCreator(AvatarReference.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/playlog/internal/LogEvent.java b/play-services-api/src/main/java/com/google/android/gms/playlog/internal/LogEvent.java index 4fc0e62a..5b129ba3 100644 --- a/play-services-api/src/main/java/com/google/android/gms/playlog/internal/LogEvent.java +++ b/play-services-api/src/main/java/com/google/android/gms/playlog/internal/LogEvent.java @@ -21,10 +21,11 @@ import org.microg.safeparcel.SafeParceled; import java.util.Date; +@Deprecated public class LogEvent extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(2) public final long eventTime; @@ -50,5 +51,5 @@ public class LogEvent extends AutoSafeParcelable { '}'; } - public static Creator CREATOR = new AutoCreator<>(LogEvent.class); + public static Creator CREATOR = new AutoCreator(LogEvent.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/search/corpora/GetCorpusStatusRequest.java b/play-services-api/src/main/java/com/google/android/gms/search/corpora/GetCorpusStatusRequest.java index 051a5332..923fa08d 100644 --- a/play-services-api/src/main/java/com/google/android/gms/search/corpora/GetCorpusStatusRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/search/corpora/GetCorpusStatusRequest.java @@ -22,7 +22,7 @@ import org.microg.safeparcel.SafeParceled; public class GetCorpusStatusRequest extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) public final String packageName; diff --git a/play-services-api/src/main/java/com/google/android/gms/search/corpora/RequestIndexingRequest.java b/play-services-api/src/main/java/com/google/android/gms/search/corpora/RequestIndexingRequest.java index 4fa3396b..5ad820ee 100644 --- a/play-services-api/src/main/java/com/google/android/gms/search/corpora/RequestIndexingRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/search/corpora/RequestIndexingRequest.java @@ -22,7 +22,7 @@ import org.microg.safeparcel.SafeParceled; public class RequestIndexingRequest extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) public final String packageName; diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/GetCurrentExperimentIdsRequest.java b/play-services-api/src/main/java/com/google/android/gms/search/global/GetCurrentExperimentIdsRequest.java index 6cc364e9..4f4fb2f2 100644 --- a/play-services-api/src/main/java/com/google/android/gms/search/global/GetCurrentExperimentIdsRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/GetCurrentExperimentIdsRequest.java @@ -22,7 +22,7 @@ import org.microg.safeparcel.SafeParceled; public class GetCurrentExperimentIdsRequest extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; public static final Creator CREATOR = new AutoCreator(GetCurrentExperimentIdsRequest.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/GetCurrentExperimentIdsResponse.java b/play-services-api/src/main/java/com/google/android/gms/search/global/GetCurrentExperimentIdsResponse.java index 6fa3ef70..d7c03e83 100644 --- a/play-services-api/src/main/java/com/google/android/gms/search/global/GetCurrentExperimentIdsResponse.java +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/GetCurrentExperimentIdsResponse.java @@ -26,7 +26,7 @@ import java.util.Arrays; public class GetCurrentExperimentIdsResponse extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) public final Status status; diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/GetGlobalSearchSourcesRequest.java b/play-services-api/src/main/java/com/google/android/gms/search/global/GetGlobalSearchSourcesRequest.java index 6c062611..d00af636 100644 --- a/play-services-api/src/main/java/com/google/android/gms/search/global/GetGlobalSearchSourcesRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/GetGlobalSearchSourcesRequest.java @@ -22,7 +22,7 @@ import org.microg.safeparcel.SafeParceled; public class GetGlobalSearchSourcesRequest extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) public boolean bool; diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/GetGlobalSearchSourcesResponse.java b/play-services-api/src/main/java/com/google/android/gms/search/global/GetGlobalSearchSourcesResponse.java index 3aa8e3b2..e972d4e2 100644 --- a/play-services-api/src/main/java/com/google/android/gms/search/global/GetGlobalSearchSourcesResponse.java +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/GetGlobalSearchSourcesResponse.java @@ -28,7 +28,7 @@ import java.util.Arrays; public class GetGlobalSearchSourcesResponse extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) public final Status status; diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/GetPendingExperimentIdsRequest.java b/play-services-api/src/main/java/com/google/android/gms/search/global/GetPendingExperimentIdsRequest.java index 3df0a0cc..38c0a3b1 100644 --- a/play-services-api/src/main/java/com/google/android/gms/search/global/GetPendingExperimentIdsRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/GetPendingExperimentIdsRequest.java @@ -22,7 +22,7 @@ import org.microg.safeparcel.SafeParceled; public class GetPendingExperimentIdsRequest extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; public static final Creator CREATOR = new AutoCreator(GetPendingExperimentIdsRequest.class); } diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/GetPendingExperimentIdsResponse.java b/play-services-api/src/main/java/com/google/android/gms/search/global/GetPendingExperimentIdsResponse.java index cd98184a..0f05c33c 100644 --- a/play-services-api/src/main/java/com/google/android/gms/search/global/GetPendingExperimentIdsResponse.java +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/GetPendingExperimentIdsResponse.java @@ -26,7 +26,7 @@ import java.util.Arrays; public class GetPendingExperimentIdsResponse extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) public final Status status; diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/SetExperimentIdsRequest.java b/play-services-api/src/main/java/com/google/android/gms/search/global/SetExperimentIdsRequest.java index dd6982f2..c1c5001d 100644 --- a/play-services-api/src/main/java/com/google/android/gms/search/global/SetExperimentIdsRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/SetExperimentIdsRequest.java @@ -24,7 +24,7 @@ import java.util.Arrays; public class SetExperimentIdsRequest extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) public byte[] experimentIds; diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/SetExperimentIdsResponse.java b/play-services-api/src/main/java/com/google/android/gms/search/global/SetExperimentIdsResponse.java index 17fb679f..ae31e4fd 100644 --- a/play-services-api/src/main/java/com/google/android/gms/search/global/SetExperimentIdsResponse.java +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/SetExperimentIdsResponse.java @@ -24,7 +24,7 @@ import org.microg.safeparcel.SafeParceled; public class SetExperimentIdsResponse extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) public final Status status; diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/SetIncludeInGlobalSearchRequest.java b/play-services-api/src/main/java/com/google/android/gms/search/global/SetIncludeInGlobalSearchRequest.java index 4e4fe7b6..ca8ef82a 100644 --- a/play-services-api/src/main/java/com/google/android/gms/search/global/SetIncludeInGlobalSearchRequest.java +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/SetIncludeInGlobalSearchRequest.java @@ -22,7 +22,7 @@ import org.microg.safeparcel.SafeParceled; public class SetIncludeInGlobalSearchRequest extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) public String packageName; diff --git a/play-services-api/src/main/java/com/google/android/gms/search/global/SetIncludeInGlobalSearchResponse.java b/play-services-api/src/main/java/com/google/android/gms/search/global/SetIncludeInGlobalSearchResponse.java index c9671038..d31ea040 100644 --- a/play-services-api/src/main/java/com/google/android/gms/search/global/SetIncludeInGlobalSearchResponse.java +++ b/play-services-api/src/main/java/com/google/android/gms/search/global/SetIncludeInGlobalSearchResponse.java @@ -24,7 +24,7 @@ import org.microg.safeparcel.SafeParceled; public class SetIncludeInGlobalSearchResponse extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) public final Status status; diff --git a/play-services-api/src/main/java/com/google/android/gms/search/queries/QueryResponse.java b/play-services-api/src/main/java/com/google/android/gms/search/queries/QueryResponse.java index a3f1ce55..6b9132b7 100644 --- a/play-services-api/src/main/java/com/google/android/gms/search/queries/QueryResponse.java +++ b/play-services-api/src/main/java/com/google/android/gms/search/queries/QueryResponse.java @@ -25,7 +25,7 @@ import org.microg.safeparcel.SafeParceled; public class QueryResponse extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) public final Status status; diff --git a/play-services-api/src/main/java/com/google/android/gms/usagereporting/UsageReportingOptInOptions.java b/play-services-api/src/main/java/com/google/android/gms/usagereporting/UsageReportingOptInOptions.java new file mode 100644 index 00000000..0e7ec10b --- /dev/null +++ b/play-services-api/src/main/java/com/google/android/gms/usagereporting/UsageReportingOptInOptions.java @@ -0,0 +1,15 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.usagereporting; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class UsageReportingOptInOptions extends AutoSafeParcelable { + @Field(2) + public int optInUsageReporting; + + public static final Creator CREATOR = new AutoCreator<>(UsageReportingOptInOptions.class); +} diff --git a/play-services-api/src/main/java/com/mgoogle/android/gms/phenotype/ExperimentToken.java b/play-services-api/src/main/java/com/mgoogle/android/gms/phenotype/ExperimentToken.java index 16bb0a60..4984686b 100644 --- a/play-services-api/src/main/java/com/mgoogle/android/gms/phenotype/ExperimentToken.java +++ b/play-services-api/src/main/java/com/mgoogle/android/gms/phenotype/ExperimentToken.java @@ -3,10 +3,10 @@ * SPDX-License-Identifier: Apache-2.0 */ -package com.google.android.gms.phenotype; +package com.mgoogle.android.gms.phenotype; import org.microg.safeparcel.AutoSafeParcelable; public class ExperimentToken extends AutoSafeParcelable { public static final Creator CREATOR = new AutoCreator<>(ExperimentToken.class); -} \ No newline at end of file +} diff --git a/play-services-api/src/main/java/com/mgoogle/android/gms/phenotype/GenericDimension.java b/play-services-api/src/main/java/com/mgoogle/android/gms/phenotype/GenericDimension.java index 3c95f744..40e46bdf 100644 --- a/play-services-api/src/main/java/com/mgoogle/android/gms/phenotype/GenericDimension.java +++ b/play-services-api/src/main/java/com/mgoogle/android/gms/phenotype/GenericDimension.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package com.google.android.gms.phenotype; +package com.mgoogle.android.gms.phenotype; import org.microg.safeparcel.AutoSafeParcelable; @@ -14,4 +14,4 @@ public class GenericDimension extends AutoSafeParcelable { public int b; public static final Creator CREATOR = new AutoCreator<>(GenericDimension.class); -} \ No newline at end of file +} diff --git a/play-services-base-api/build.gradle b/play-services-base-api/build.gradle index 4f64f888..f4055b16 100644 --- a/play-services-base-api/build.gradle +++ b/play-services-base-api/build.gradle @@ -22,10 +22,11 @@ dependencies { android { compileSdkVersion androidCompileSdk - buildToolsVersion "$androidBuildVersionTools" + buildToolsVersion "30.0.3" aidlPackageWhiteList "com/google/android/gms/common/data/DataHolder.aidl" aidlPackageWhiteList "com/google/android/gms/common/images/WebImage.aidl" + aidlPackageWhiteList "com/google/android/gms/common/api/internal/IStatusCallback.aidl" defaultConfig { minSdkVersion androidMinSdk diff --git a/play-services-base-api/src/main/java/com/google/android/gms/common/data/DataHolder.java b/play-services-base-api/src/main/java/com/google/android/gms/common/data/DataHolder.java index 2d9113d0..c154b3e4 100644 --- a/play-services-base-api/src/main/java/com/google/android/gms/common/data/DataHolder.java +++ b/play-services-base-api/src/main/java/com/google/android/gms/common/data/DataHolder.java @@ -46,7 +46,7 @@ import java.util.Map; @PublicApi(until = "1") public class DataHolder extends AutoSafeParcelable implements Closeable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) private final String[] columns; diff --git a/play-services-base-api/src/main/java/com/google/android/gms/common/images/WebImage.java b/play-services-base-api/src/main/java/com/google/android/gms/common/images/WebImage.java index 1843f847..fee75495 100644 --- a/play-services-base-api/src/main/java/com/google/android/gms/common/images/WebImage.java +++ b/play-services-base-api/src/main/java/com/google/android/gms/common/images/WebImage.java @@ -16,13 +16,13 @@ package com.google.android.gms.common.images; -import java.util.Locale; - import android.net.Uri; import org.microg.safeparcel.AutoSafeParcelable; import org.microg.safeparcel.SafeParceled; +import java.util.Locale; + public class WebImage extends AutoSafeParcelable { public static final Creator CREATOR = new AutoCreator<>(WebImage.class); @@ -35,7 +35,7 @@ public class WebImage extends AutoSafeParcelable { } @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(2) private final Uri uri; diff --git a/play-services-base/build.gradle b/play-services-base/build.gradle index 7c7f1b25..67fef509 100644 --- a/play-services-base/build.gradle +++ b/play-services-base/build.gradle @@ -18,7 +18,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion androidCompileSdk - buildToolsVersion "$androidBuildVersionTools" + buildToolsVersion "30.0.3" defaultConfig { minSdkVersion androidMinSdk @@ -32,12 +32,12 @@ android { } dependencies { - implementation 'com.google.android.gms:play-services-base:17.6.0' + implementation 'com.google.android.gms:play-services-base:18.0.1' api project(':play-services-basement') api project(':play-services-tasks') api project(':play-services-base-api') - implementation 'androidx.fragment:fragment:1.3.6' - implementation 'com.google.android.gms:play-services-base:17.6.0' + implementation 'androidx.fragment:fragment:1.4.1' + implementation 'com.google.android.gms:play-services-base:18.0.1' } \ No newline at end of file diff --git a/play-services-base/src/main/java/com/google/android/gms/common/GoogleApiAvailability.java b/play-services-base/src/main/java/com/google/android/gms/common/GoogleApiAvailability.java index 30afec09..ef43eb7d 100644 --- a/play-services-base/src/main/java/com/google/android/gms/common/GoogleApiAvailability.java +++ b/play-services-base/src/main/java/com/google/android/gms/common/GoogleApiAvailability.java @@ -16,22 +16,6 @@ package com.google.android.gms.common; -import android.app.Activity; -import android.app.Dialog; -import android.app.PendingIntent; -import android.content.Context; -import android.content.DialogInterface; -import android.os.Bundle; -import androidx.fragment.app.FragmentActivity; -import android.util.Log; - -import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener; -import com.google.android.gms.tasks.Task; -import com.google.android.gms.tasks.Tasks; - -import org.microg.gms.common.Constants; -import org.microg.gms.common.PublicApi; - import static com.google.android.gms.common.ConnectionResult.INTERNAL_ERROR; import static com.google.android.gms.common.ConnectionResult.INVALID_ACCOUNT; import static com.google.android.gms.common.ConnectionResult.NETWORK_ERROR; @@ -43,6 +27,23 @@ import static com.google.android.gms.common.ConnectionResult.SERVICE_VERSION_UPD import static com.google.android.gms.common.ConnectionResult.SIGN_IN_REQUIRED; import static com.google.android.gms.common.ConnectionResult.SUCCESS; +import android.app.Activity; +import android.app.Dialog; +import android.app.PendingIntent; +import android.content.Context; +import android.content.DialogInterface; +import android.os.Bundle; +import android.util.Log; + +import androidx.fragment.app.FragmentActivity; + +import com.google.android.gms.common.api.GoogleApiClient.OnConnectionFailedListener; +import com.google.android.gms.tasks.Task; +import com.google.android.gms.tasks.Tasks; + +import org.microg.gms.common.Constants; +import org.microg.gms.common.PublicApi; + @PublicApi public class GoogleApiAvailability { private static final String TAG = "GmsApiAvailability"; diff --git a/play-services-base/src/main/java/com/google/android/gms/common/api/GoogleApi.java b/play-services-base/src/main/java/com/google/android/gms/common/api/GoogleApi.java index 455ba014..54e2c63a 100644 --- a/play-services-base/src/main/java/com/google/android/gms/common/api/GoogleApi.java +++ b/play-services-base/src/main/java/com/google/android/gms/common/api/GoogleApi.java @@ -18,7 +18,7 @@ import org.microg.gms.common.api.PendingGoogleApiCall; @PublicApi public abstract class GoogleApi implements HasApiKey { - private GoogleApiManager manager; + private final GoogleApiManager manager; @PublicApi(exclude = true) public Api api; diff --git a/play-services-base/src/main/java/com/google/android/gms/common/data/DataBuffer.java b/play-services-base/src/main/java/com/google/android/gms/common/data/DataBuffer.java index 309a667b..49c13a99 100644 --- a/play-services-base/src/main/java/com/google/android/gms/common/data/DataBuffer.java +++ b/play-services-base/src/main/java/com/google/android/gms/common/data/DataBuffer.java @@ -28,7 +28,7 @@ import java.util.Iterator; @PublicApi public abstract class DataBuffer implements Releasable, Iterable { - private DataHolder dataHolder; + private final DataHolder dataHolder; @PublicApi(exclude = true) public DataBuffer(DataHolder dataHolder) { diff --git a/play-services-base/src/main/java/org/microg/gms/common/GmsClient.java b/play-services-base/src/main/java/org/microg/gms/common/GmsClient.java index 64ac6942..adbd9b55 100644 --- a/play-services-base/src/main/java/org/microg/gms/common/GmsClient.java +++ b/play-services-base/src/main/java/org/microg/gms/common/GmsClient.java @@ -44,7 +44,7 @@ public abstract class GmsClient implements ApiClient { protected ConnectionState state = ConnectionState.NOT_CONNECTED; private ServiceConnection serviceConnection; private I serviceInterface; - private String actionString; + private final String actionString; protected int serviceId = -1; protected Account account = null; @@ -110,7 +110,7 @@ public abstract class GmsClient implements ApiClient { @Override public synchronized boolean isConnected() { - return state == ConnectionState.CONNECTED || state == ConnectionState.PSEUDO_CONNECTED; + return (state == ConnectionState.CONNECTED && serviceInterface != null && serviceInterface.asBinder().isBinderAlive() ) || state == ConnectionState.PSEUDO_CONNECTED; } @Override diff --git a/play-services-base/src/main/java/org/microg/gms/common/MultiConnectionKeeper.java b/play-services-base/src/main/java/org/microg/gms/common/MultiConnectionKeeper.java index 78c9d4f6..57f63efc 100644 --- a/play-services-base/src/main/java/org/microg/gms/common/MultiConnectionKeeper.java +++ b/play-services-base/src/main/java/org/microg/gms/common/MultiConnectionKeeper.java @@ -16,6 +16,10 @@ package org.microg.gms.common; +import static android.os.Build.VERSION.SDK_INT; +import static android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH; +import static org.microg.gms.common.Constants.GMS_PACKAGE_NAME; + import android.annotation.SuppressLint; import android.content.ComponentName; import android.content.Context; @@ -29,10 +33,6 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; -import static android.os.Build.VERSION.SDK_INT; -import static android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH; -import static org.microg.gms.common.Constants.GMS_PACKAGE_NAME; - public class MultiConnectionKeeper { private static final String TAG = "GmsMultiConKeeper"; @@ -88,7 +88,7 @@ public class MultiConnectionKeeper { private boolean connected = false; private IBinder binder; private ComponentName component; - private ServiceConnection serviceConnection = new ServiceConnection() { + private final ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { Log.d(TAG, "Connection(" + actionString + ") : ServiceConnection : " + diff --git a/play-services-base/src/main/java/org/microg/gms/common/api/GoogleApiManager.java b/play-services-base/src/main/java/org/microg/gms/common/api/GoogleApiManager.java index addad6a7..4e05aa75 100644 --- a/play-services-base/src/main/java/org/microg/gms/common/api/GoogleApiManager.java +++ b/play-services-base/src/main/java/org/microg/gms/common/api/GoogleApiManager.java @@ -21,9 +21,9 @@ import java.util.Objects; public class GoogleApiManager { private static GoogleApiManager instance; - private Context context; - private Map clientMap = new HashMap<>(); - private Map>> waitingApiCallMap = new HashMap<>(); + private final Context context; + private final Map clientMap = new HashMap<>(); + private final Map>> waitingApiCallMap = new HashMap<>(); private GoogleApiManager(Context context) { this.context = context; @@ -81,7 +81,7 @@ public class GoogleApiManager { } private class ConnectionCallback implements ConnectionCallbacks { - private ApiInstance apiInstance; + private final ApiInstance apiInstance; public ConnectionCallback(ApiInstance apiInstance) { this.apiInstance = apiInstance; @@ -99,7 +99,7 @@ public class GoogleApiManager { } private class ConnectionFailedListener implements OnConnectionFailedListener { - private ApiInstance apiInstance; + private final ApiInstance apiInstance; public ConnectionFailedListener(ApiInstance apiInstance) { this.apiInstance = apiInstance; @@ -112,8 +112,8 @@ public class GoogleApiManager { } private static class WaitingApiCall { - private PendingGoogleApiCall apiCall; - private TaskCompletionSource completionSource; + private final PendingGoogleApiCall apiCall; + private final TaskCompletionSource completionSource; public WaitingApiCall(PendingGoogleApiCall apiCall, TaskCompletionSource completionSource) { this.apiCall = apiCall; @@ -148,8 +148,8 @@ public class GoogleApiManager { } private static class ApiInstance { - private Class apiClass; - private Api.ApiOptions apiOptions; + private final Class apiClass; + private final Api.ApiOptions apiOptions; public ApiInstance(Class apiClass, Api.ApiOptions apiOptions) { this.apiClass = apiClass; diff --git a/play-services-basement/build.gradle b/play-services-basement/build.gradle index ff0dabcc..674edc4c 100644 --- a/play-services-basement/build.gradle +++ b/play-services-basement/build.gradle @@ -20,13 +20,13 @@ apply plugin: 'kotlin-android' dependencies { api "org.microg:safe-parcel:1.7.0" - implementation "androidx.annotation:annotation:1.2.0" + implementation 'androidx.annotation:annotation:1.3.0' implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.32' } android { compileSdkVersion androidCompileSdk - buildToolsVersion "$androidBuildVersionTools" + buildToolsVersion "30.0.3" aidlPackageWhiteList "com/google/android/gms/common/api/Status.aidl" aidlPackageWhiteList "com/google/android/gms/common/internal/ICancelToken.aidl" diff --git a/play-services-basement/src/main/java/com/google/android/gms/common/Feature.java b/play-services-basement/src/main/java/com/google/android/gms/common/Feature.java new file mode 100644 index 00000000..0a5b0813 --- /dev/null +++ b/play-services-basement/src/main/java/com/google/android/gms/common/Feature.java @@ -0,0 +1,36 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.common; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class Feature extends AutoSafeParcelable { + @Field(1) + private String name; + @Field(2) + private int oldVersion; + @Field(3) + private long version = -1; + + private Feature() { + } + + public Feature(String name, long version) { + this.name = name; + this.version = version; + } + + public String getName() { + return name; + } + + public long getVersion() { + if (version == -1) return oldVersion; + return version; + } + + public static final Creator CREATOR = new AutoSafeParcelable.AutoCreator<>(Feature.class); +} diff --git a/play-services-basement/src/main/java/com/google/android/gms/common/api/Scope.java b/play-services-basement/src/main/java/com/google/android/gms/common/api/Scope.java index 28211ee6..60bc1fb9 100644 --- a/play-services-basement/src/main/java/com/google/android/gms/common/api/Scope.java +++ b/play-services-basement/src/main/java/com/google/android/gms/common/api/Scope.java @@ -27,7 +27,7 @@ import org.microg.safeparcel.SafeParceled; @PublicApi public class Scope extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(2) private final String scopeUri; diff --git a/play-services-basement/src/main/java/com/google/android/gms/common/api/Status.java b/play-services-basement/src/main/java/com/google/android/gms/common/api/Status.java index d7e6f9a5..7b936e67 100644 --- a/play-services-basement/src/main/java/com/google/android/gms/common/api/Status.java +++ b/play-services-basement/src/main/java/com/google/android/gms/common/api/Status.java @@ -32,14 +32,14 @@ import org.microg.safeparcel.SafeParceled; @PublicApi public final class Status extends AutoSafeParcelable implements Result { @PublicApi(exclude = true) - public static final Status INTERNAL_ERROR = new Status(CommonStatusCodes.INTERNAL_ERROR); + public static final Status INTERNAL_ERROR = new Status(CommonStatusCodes.INTERNAL_ERROR, "Internal error"); @PublicApi(exclude = true) - public static final Status CANCELED = new Status(CommonStatusCodes.CANCELED); + public static final Status CANCELED = new Status(CommonStatusCodes.CANCELED, "Cancelled"); @PublicApi(exclude = true) - public static final Status SUCCESS = new Status(CommonStatusCodes.SUCCESS); + public static final Status SUCCESS = new Status(CommonStatusCodes.SUCCESS, "Success"); @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) private final int statusCode; diff --git a/play-services-basement/src/main/java/com/google/android/gms/common/internal/GetServiceRequest.java b/play-services-basement/src/main/java/com/google/android/gms/common/internal/GetServiceRequest.java index d498328c..a203a99f 100644 --- a/play-services-basement/src/main/java/com/google/android/gms/common/internal/GetServiceRequest.java +++ b/play-services-basement/src/main/java/com/google/android/gms/common/internal/GetServiceRequest.java @@ -20,45 +20,46 @@ import android.accounts.Account; import android.os.Bundle; import android.os.IBinder; +import com.google.android.gms.common.Feature; import com.google.android.gms.common.api.Scope; import org.microg.gms.common.Constants; import org.microg.gms.common.GmsService; import org.microg.safeparcel.AutoSafeParcelable; -import org.microg.safeparcel.SafeParceled; import java.util.Arrays; -import kotlin.Suppress; - -@SuppressWarnings("deprecation") public class GetServiceRequest extends AutoSafeParcelable { - @SafeParceled(1) - private int versionCode = 3; - - @SafeParceled(2) + @Field(1) + private final int versionCode = 4; + @Field(2) public final int serviceId; - - @SafeParceled(3) + @Field(3) public int gmsVersion; - - @SafeParceled(4) + @Field(4) public String packageName; - - @SafeParceled(5) + @Field(5) public IBinder accountAccessor; - - @SafeParceled(6) + @Field(6) public Scope[] scopes; - - @SafeParceled(7) + @Field(7) public Bundle extras; - - @SafeParceled(8) + @Field(8) public Account account; - - @SafeParceled(9) - public long long1; + @Field(9) + private long field9; + @Field(10) + public Feature[] defaultFeatures; + @Field(11) + public Feature[] apiFeatures; + @Field(12) + private boolean field12; + @Field(13) + private int field13; + @Field(14) + private boolean field14; + @Field(15) + private String field15; private GetServiceRequest() { serviceId = -1; @@ -68,6 +69,7 @@ public class GetServiceRequest extends AutoSafeParcelable { public GetServiceRequest(int serviceId) { this.serviceId = serviceId; this.gmsVersion = Constants.GMS_VERSION_CODE; + this.field12 = true; } @Override @@ -82,5 +84,5 @@ public class GetServiceRequest extends AutoSafeParcelable { '}'; } - public static Creator CREATOR = new AutoCreator<>(GetServiceRequest.class); -} + public static Creator CREATOR = new AutoCreator(GetServiceRequest.class); +} \ No newline at end of file diff --git a/play-services-basement/src/main/java/org/microg/gms/common/GmsService.java b/play-services-basement/src/main/java/org/microg/gms/common/GmsService.java index 7eca86e3..d53dba37 100644 --- a/play-services-basement/src/main/java/org/microg/gms/common/GmsService.java +++ b/play-services-basement/src/main/java/org/microg/gms/common/GmsService.java @@ -19,36 +19,147 @@ package org.microg.gms.common; public enum GmsService { UNKNOWN(-2), ANY(-1), + GAMES(1, "com.google.android.gms.games.service.START"), + PLUS(2, "com.google.android.gms.plus.service.START", "com.google.android.gms.plus.service.internal.START"), + PANORAMA(3, "com.google.android.gms.panorama.service.START"), + WALLET(4, "com.google.android.gms.wallet.service.BIND"), PEOPLE(5, "com.google.android.gms.people.service.START"), + LOCATION(6), + APPSTATE(7, "com.google.android.gms.appstate.service.START"), + ADREQUEST(8, "com.google.android.gms.ads.service.START"), ACCOUNT(9, "com.google.android.gms.accounts.ACCOUNT_SERVICE"), CAST(10, "com.google.android.gms.cast.service.BIND_CAST_DEVICE_CONTROLLER_SERVICE"), + DRIVE(11, "com.google.android.gms.drive.ApiService.START"), ADDRESS(12, "com.google.android.gms.identity.service.BIND"), - AUTH(16, "com.google.android.gms.auth.service.START"), + CAR(13, "com.google.android.gms.car.service.START"), + WEARABLE(14, "com.google.android.gms.wearable.BIND"), + AUTH_PROXY(16, "com.google.android.gms.auth.service.START"), + FITNESS(17, "com.google.android.gms.fitness.GoogleFitnessService.START"), + REMINDERS(18, "com.google.android.gms.reminders.service.START"), LIGHTWEIGHT_INDEX(19, "com.google.android.gms.icing.LIGHTWEIGHT_INDEX_SERVICE"), + DEVICE_CONNECTION(20, "com.google.android.gms.deviceconnection.service.START"), INDEX(21, "com.google.android.gms.icing.INDEX_SERVICE"), LOCATION_REPORTING(22, "com.google.android.gms.location.reporting.service.START", "com.google.android.location.reporting.service.START"), LOCATION_MANAGER(23, "com.google.android.location.internal.GoogleLocationManagerService.START"), PLAY_LOG(24, "com.google.android.gms.playlog.service.START"), + LOCKBOX(26, "com.google.android.gms.lockbox.service.START"), CAST_MIRRORING(27, "com.google.android.gms.cast_mirroring.service.START"), + NETWORK_QUALITY(28, "com.google.android.gms.mdm.services.START"), + FEEDBACK(29, "com.google.android.gms.feedback.internal.IFeedbackService"), SEARCH_ADMINISTRATION(30), + PHOTO_AUTO_BACKUP(31, "com.google.android.gms.photos.autobackup.service.START"), SEARCH_QUERIES(32), SEARCH_GLOBAL(33), + UDC(35, "com.google.android.gms.udc.service.START"), SEARCH_CORPORA(36), + DEVICE_MANAGER(37, "com.google.android.gms.mdm.services.DeviceManagerApiService.START"), + PSEUDONYMOUS_ID(38, "com.google.android.gms.pseudonymous.service.START"), COMMON(39, "com.google.android.gms.common.service.START"), CLEARCUT_LOGGER(40, "com.google.android.gms.clearcut.service.START"), + USAGE_REPORTING(41, "com.google.android.gms.usagereporting.service.START"), + KIDS(42, "com.google.android.gms.kids.service.START"), + DOWNLOAD(43, "com.google.android.gms.common.download.START"), SIGN_IN(44, "com.google.android.gms.signin.service.START"), + SAFETY_NET_CLIENT(45, "com.google.android.gms.safetynet.service.START"), + GSERVICES(46, "com.google.android.gms.ads.gservice.START"), CONTEXT_MANAGER(47, "com.google.android.contextmanager.service.ContextManagerService.START"), + AUDIO_MODEM(48, "com.google.android.gms.audiomodem.service.AudioModemService.START"), + NEARBY_SHARING(49, "com.google.android.gms.nearby.sharing.service.NearbySharingService.START"), LIGHTWEIGHT_NETWORK_QUALITY(50, "com.google.android.gms.herrevad.services.LightweightNetworkQualityAndroidService.START"), - PHENOTYPE(51, "com.mgoogle.android.gms.phenotype.service.START"), + PHENOTYPE(51, "com.google.android.gms.phenotype.service.START"), + VOICE_UNLOCK(52, "com.google.android.gms.speech.service.START"), + NEARBY_CONNECTIONS(54, "com.google.android.gms.nearby.connection.service.START"), + FITNESS_SENSORS(55, "com.google.android.gms.fitness.SensorsApi"), + FITNESS_RECORDING(56, "com.google.android.gms.fitness.RecordingApi"), + FITNESS_HISTORY(57, "com.google.android.gms.fitness.HistoryApi"), + FITNESS_SESSIONS(58, "com.google.android.gms.fitness.SessionsApi"), + FITNESS_BLE(59, "com.google.android.gms.fitness.BleApi"), + FITNESS_CONFIG(60, "com.google.android.gms.fitness.ConfigApi"), + FITNESS_INTERNAL(61, "com.google.android.gms.fitness.InternalApi"), + NEARBY_MESSAGES(62, "com.google.android.gms.nearby.messages.service.NearbyMessagesService.START"), + HELP(63, "com.google.android.gms.googlehelp.service.GoogleHelpService.START"), + CONFIG(64, "com.google.android.gms.config.START"), GEODATA(65, "com.google.android.gms.location.places.GeoDataApi"), SEARCH_IME(66), PLACE_DETECTION(67, "com.google.android.gms.location.places.PlaceDetectionApi"), CREDENTIALS(68, "com.google.android.gms.auth.api.credentials.service.START"), + NEARBY_BOOTSTRAP(69, "com.google.android.gms.nearby.bootstrap.service.NearbyBootstrapService.START"), + PLUS_INTERNAL(70), + SOURCE_DEVICE(75, "com.google.android.gms.smartdevice.d2d.SourceDeviceService.START"), + TARGET_DEVICE(76, "com.google.android.gms.smartdevice.d2d.TargetDeviceService.START"), + APP_INVITE(77, "com.google.android.gms.appinvite.service.START"), + TAP_AND_PAY(79, "com.google.android.gms.tapandpay.service.BIND"), + CHROME_SYNC(80, "com.google.android.gms.chromesync.service.START"), + ACCOUNTS(81, "com.google.android.gms.smartdevice.setup.accounts.AccountsService.START"), + CAST_REMOTE_DISPLAY(83, "com.google.android.gms.cast.remote_display.service.START"), + TRUST_AGENT(85, "com.google.android.gms.trustagent.StateApi.START"), + AUTH_SIGN_IN(91, "com.google.android.gms.auth.api.signin.service.START"), MEASUREMENT(93, "com.google.android.gms.measurement.START"), + FREIGHTER(98, "com.google.android.gms.freighter.service.START"), + GUNS(110, "com.google.android.gms.notifications.service.START"), + BLE(111, "com.google.android.gms.beacon.internal.IBleService.START"), + FIREBASE_AUTH(112, "com.google.firebase.auth.api.gms.service.START"), + APP_INDEXING(113), GASS(116, "com.google.android.gms.gass.START"), + WORK_ACCOUNT(120), + INSTANT_APPS(121, "com.google.android.gms.instantapps.START"), + CAST_FIRSTPATY(122, "com.google.android.gms.cast.firstparty.START"), + AD_CACHE(123, "com.google.android.gms.ads.service.CACHE"), + CRYPT_AUTH(129, "com.google.android.gms.auth.cryptauth.cryptauthservice.START"), + DYNAMIC_LINKS(131, "com.google.firebase.dynamiclinks.service.START"), + FONTS(132, "com.google.android.gms.fonts.service.START"), + ROMANESCO(135, "com.google.android.gms.romanesco.service.START"), + TRAINER(139, "com.google.android.gms.learning.trainer.START"), + FIDO2_REGULAR(148, "com.google.android.gms.fido.fido2.regular.START"), + FIDO2_PRIVILEGED(149, "com.google.android.gms.fido.fido2.privileged.START"), + DATA_DOWNLOAD(152, "com.google.android.mdd.service.START"), + ACCOUNT_DATA(153, "com.google.android.gms.auth.account.data.service.START"), + CONSTELLATION(155, "com.google.android.gms.constellation.service.START"), + AUDIT(154, "com.google.android.gms.audit.service.START"), + SYSTEM_UPDATE(157, "com.google.android.gms.update.START_API_SERVICE"), + USER_LOCATION(163, "com.google.android.gms.userlocation.service.START"), + AD_HTTP(166, "com.google.android.gms.ads.service.HTTP"), + LANGUAGE_PROFILE(167, "com.google.android.gms.languageprofile.service.START"), + MDNS(168, "com.google.android.gms.mdns.service.START"), + FIDO2_ZEROPARTY(180, "com.google.android.gms.fido.fido2.zeroparty.START"), + G1_RESTORE(181, "com.google.android.gms.backup.G1_RESTORE"), + G1_BACKUP(182, "com.google.android.gms.backup.G1_BACKUP"), + PAYSE(188, "com.google.android.gms.payse.service.BIND"), + RCS(189, "com.google.android.gms.rcs.START"), + CARRIER_AUTH(191, "com.google.android.gms.carrierauth.service.START"), + SYSTEM_UPDATE_SINGLE_UESR(192, "com.google.android.gms.update.START_SINGLE_USER_API_SERVICE"), + APP_USAGE(193, "com.google.android.gms.appusage.service.START"), + NEARBY_SHARING_2(194, "com.google.android.gms.nearby.sharing.START_SERVICE"), + AD_CONSENT_LOOKUP(195, "com.google.android.gms.ads.service.CONSENT_LOOKUP"), + PHONE_INTERNAL(197, "com.google.android.gms.auth.api.phone.service.InternalService.START"), + PAY(198, "com.google.android.gms.pay.service.BIND"), + ASTERISM(199, "com.google.android.gms.asterism.service.START"), + MODULE_RESTORE(201, "com.google.android.gms.backup.GMS_MODULE_RESTORE"), FACS_CACHE(202, "com.google.android.gms.facs.cache.service.START"), + RECAPTCHA(205, "com.google.android.gms.recaptcha.service.START"), + CONTACT_SYNC(208, "com.google.android.gms.people.contactssync.service.START"), IDENTITY_SIGN_IN(212, "com.google.android.gms.auth.api.identity.service.signin.START"), + CREDENTIAL_STORE(214, "com.google.android.gms.fido.credentialstore.internal_service.START"), + EVENT_ATTESTATION(216, "com.google.android.gms.ads.identifier.service.EVENT_ATTESTATION"), + SCHEDULER(218, "com.google.android.gms.scheduler.ACTION_PROXY_SCHEDULE"), + AUTHORIZATION(219, "com.google.android.gms.auth.api.identity.service.authorization.START"), FACS_SYNC(220, "com.google.android.gms.facs.internal.service.START"), + AUTH_CONFIG_SYNC(221, "com.google.android.gms.auth.config.service.START"), + CREDENTIAL_SAVING(223, "com.google.android.gms.auth.api.identity.service.credentialsaving.START"), + GOOGLE_AUTH(224, "com.google.android.gms.auth.account.authapi.START"), + ENTERPRISE_LOADER(225, "com.google.android.gms.enterprise.loader.service.START"), + THUNDERBIRD(226, "com.google.android.gms.thunderbird.service.START"), + NEARBY_EXPOSURE(236, "com.google.android.gms.nearby.exposurenotification.START"), + GMS_COMPLIANCE(257, "com.google.android.gms.gmscompliance.service.START"), + FIDO_SOURCE_DEVICE(262, "com.google.android.gms.fido.sourcedevice.service.START"), + FAST_PAIR(265, "com.google.android.gms.nearby.fastpair.START"), + MATCHSTICK_LIGHTER(268, "com.google.android.gms.matchstick.lighter.service.START"), + FIDO_TARGET_DEVICE_INTERNAL(269, "com.google.android.gms.fido.targetdevice.internal_service.START"), + TELEMETRY(270, "com.google.android.gms.common.telemetry.service.START"), + SECOND_DEVICE_AUTH(275, "com.google.android.gms.setup.auth.SecondDeviceAuth.START"), + LOCATION_SHARING_REPORTER(277, "com.google.android.gms.locationsharingreporter.service.START"), + OCR(279, "com.google.android.gms.ocr.service.START"), + OCR_INTERNAL(281, "com.google.android.gms.ocr.service.internal.START"), ; public int SERVICE_ID; @@ -61,6 +172,11 @@ public enum GmsService { this.SECONDARY_ACTIONS = actions; } + public interface ADVERTISING_ID { + // Has no service id + String ACTION = "com.google.android.gms.ads.identifier.service.START"; + } + public static GmsService byServiceId(int serviceId) { for (GmsService service : values()) { if (service.SERVICE_ID == serviceId) return service; @@ -85,4 +201,4 @@ public enum GmsService { if (this != UNKNOWN) return toString(); return "UNKNOWN(" + serviceId + ")"; } -} +} \ No newline at end of file diff --git a/play-services-cast-api/build.gradle b/play-services-cast-api/build.gradle index af8fd50e..92e76c5e 100644 --- a/play-services-cast-api/build.gradle +++ b/play-services-cast-api/build.gradle @@ -18,7 +18,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion androidCompileSdk - buildToolsVersion "$androidBuildVersionTools" + buildToolsVersion "30.0.3" aidlPackageWhiteList "com/google/android/gms/cast/ApplicationMetadata.aidl" aidlPackageWhiteList "com/google/android/gms/cast/LaunchOptions.aidl" diff --git a/play-services-cast-api/src/main/aidl/com/google/android/gms/cast/RequestItem.aidl b/play-services-cast-api/src/main/aidl/com/google/android/gms/cast/RequestItem.aidl new file mode 100644 index 00000000..96c3751e --- /dev/null +++ b/play-services-cast-api/src/main/aidl/com/google/android/gms/cast/RequestItem.aidl @@ -0,0 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.cast; + +parcelable RequestItem; diff --git a/play-services-cast-api/src/main/aidl/com/google/android/gms/cast/internal/IBundleCallback.aidl b/play-services-cast-api/src/main/aidl/com/google/android/gms/cast/internal/IBundleCallback.aidl new file mode 100644 index 00000000..15043379 --- /dev/null +++ b/play-services-cast-api/src/main/aidl/com/google/android/gms/cast/internal/IBundleCallback.aidl @@ -0,0 +1,10 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.cast.internal; + +interface IBundleCallback { + oneway void onBundle(in Bundle bundle); +} diff --git a/play-services-cast-api/src/main/aidl/com/google/android/gms/cast/internal/ICastService.aidl b/play-services-cast-api/src/main/aidl/com/google/android/gms/cast/internal/ICastService.aidl new file mode 100644 index 00000000..7ee5c972 --- /dev/null +++ b/play-services-cast-api/src/main/aidl/com/google/android/gms/cast/internal/ICastService.aidl @@ -0,0 +1,18 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.cast.internal; + +import com.google.android.gms.common.api.internal.IStatusCallback; +import com.google.android.gms.cast.internal.IBundleCallback; +import com.google.android.gms.cast.RequestItem; + +interface ICastService { + oneway void broadcastPrecacheMessageLegacy(IStatusCallback callback, in String[] arg2, String precacheData) = 0; + oneway void broadcastPrecacheMessage(IStatusCallback callback, in String[] arg2, String precacheData, in List requestItems) = 1; + oneway void getCxLessStatus(IStatusCallback callback) = 3; + oneway void getFeatureFlags(IBundleCallback callback, in String[] flags) = 4; + oneway void getCastStatusCodeDictionary(IBundleCallback callback, in String[] dictionaries) = 5; +} diff --git a/play-services-cast-api/src/main/java/com/google/android/gms/cast/ApplicationMetadata.java b/play-services-cast-api/src/main/java/com/google/android/gms/cast/ApplicationMetadata.java index f8614ce1..1e3993b3 100644 --- a/play-services-cast-api/src/main/java/com/google/android/gms/cast/ApplicationMetadata.java +++ b/play-services-cast-api/src/main/java/com/google/android/gms/cast/ApplicationMetadata.java @@ -30,7 +30,7 @@ import java.util.List; public class ApplicationMetadata extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(2) public String applicationId; @SafeParceled(3) diff --git a/play-services-cast-api/src/main/java/com/google/android/gms/cast/ApplicationStatus.java b/play-services-cast-api/src/main/java/com/google/android/gms/cast/ApplicationStatus.java index 2eafc853..46aa7737 100644 --- a/play-services-cast-api/src/main/java/com/google/android/gms/cast/ApplicationStatus.java +++ b/play-services-cast-api/src/main/java/com/google/android/gms/cast/ApplicationStatus.java @@ -28,7 +28,7 @@ public class ApplicationStatus extends AutoSafeParcelable { } @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(2) private String applicationStatus; diff --git a/play-services-cast-api/src/main/java/com/google/android/gms/cast/CastDevice.java b/play-services-cast-api/src/main/java/com/google/android/gms/cast/CastDevice.java index b340325b..aaf50ff3 100644 --- a/play-services-cast-api/src/main/java/com/google/android/gms/cast/CastDevice.java +++ b/play-services-cast-api/src/main/java/com/google/android/gms/cast/CastDevice.java @@ -16,8 +16,8 @@ package com.google.android.gms.cast; -import android.os.Bundle; import android.net.Uri; +import android.os.Bundle; import android.text.TextUtils; import com.google.android.gms.common.images.WebImage; @@ -73,7 +73,7 @@ public class CastDevice extends AutoSafeParcelable { public static final int CAPABILITY_AUDIO_IN = 8; @SafeParceled(1) - private int versionCode = 3; + private final int versionCode = 3; @SafeParceled(2) private String deviceId; @@ -183,7 +183,7 @@ public class CastDevice extends AutoSafeParcelable { ", modelName=" + modelName + ", deviceVersion=" + deviceVersion + ", servicePort=" + servicePort + - (icons == null ? "" : (", icons=" + icons.toString())) + + (icons == null ? "" : (", icons=" + icons)) + ", capabilities=" + capabilities + ", status=" + status + "}"; diff --git a/play-services-cast-api/src/main/java/com/google/android/gms/cast/CastDeviceStatus.java b/play-services-cast-api/src/main/java/com/google/android/gms/cast/CastDeviceStatus.java index b44251f3..ea781b53 100644 --- a/play-services-cast-api/src/main/java/com/google/android/gms/cast/CastDeviceStatus.java +++ b/play-services-cast-api/src/main/java/com/google/android/gms/cast/CastDeviceStatus.java @@ -33,7 +33,7 @@ public class CastDeviceStatus extends AutoSafeParcelable { } @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(2) private double volume; @SafeParceled(3) diff --git a/play-services-cast-api/src/main/java/com/google/android/gms/cast/JoinOptions.java b/play-services-cast-api/src/main/java/com/google/android/gms/cast/JoinOptions.java index 9c938e08..affa9563 100644 --- a/play-services-cast-api/src/main/java/com/google/android/gms/cast/JoinOptions.java +++ b/play-services-cast-api/src/main/java/com/google/android/gms/cast/JoinOptions.java @@ -21,9 +21,9 @@ import org.microg.safeparcel.SafeParceled; public class JoinOptions extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(2) - private int connectionType = 0; + private final int connectionType = 0; public static Creator CREATOR = new AutoCreator<>(JoinOptions.class); } diff --git a/play-services-cast-api/src/main/java/com/google/android/gms/cast/LaunchOptions.java b/play-services-cast-api/src/main/java/com/google/android/gms/cast/LaunchOptions.java index 5e0f0562..609302d6 100644 --- a/play-services-cast-api/src/main/java/com/google/android/gms/cast/LaunchOptions.java +++ b/play-services-cast-api/src/main/java/com/google/android/gms/cast/LaunchOptions.java @@ -21,7 +21,7 @@ import org.microg.safeparcel.SafeParceled; public class LaunchOptions extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(2) private boolean relaunchIfRunning; @SafeParceled(3) diff --git a/play-services-cast-api/src/main/java/com/google/android/gms/cast/RequestItem.java b/play-services-cast-api/src/main/java/com/google/android/gms/cast/RequestItem.java new file mode 100644 index 00000000..0fd47c4d --- /dev/null +++ b/play-services-cast-api/src/main/java/com/google/android/gms/cast/RequestItem.java @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.cast; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class RequestItem extends AutoSafeParcelable { + @Field(2) + public String url; + @Field(3) + public int protocolType; + @Field(4) + public int initialTime; + @Field(5) + public String hlsSegmentFormat; + + public static Creator CREATOR = new AutoCreator(RequestItem.class); +} diff --git a/play-services-cast-framework-api/build.gradle b/play-services-cast-framework-api/build.gradle index aa53beca..c9b8b637 100644 --- a/play-services-cast-framework-api/build.gradle +++ b/play-services-cast-framework-api/build.gradle @@ -18,7 +18,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion androidCompileSdk - buildToolsVersion "$androidBuildVersionTools" + buildToolsVersion "30.0.3" defaultConfig { minSdkVersion androidMinSdk diff --git a/play-services-cast-framework-api/src/main/java/com/google/android/gms/cast/framework/CastOptions.java b/play-services-cast-framework-api/src/main/java/com/google/android/gms/cast/framework/CastOptions.java index 75dd0850..adfdb1ca 100644 --- a/play-services-cast-framework-api/src/main/java/com/google/android/gms/cast/framework/CastOptions.java +++ b/play-services-cast-framework-api/src/main/java/com/google/android/gms/cast/framework/CastOptions.java @@ -16,18 +16,16 @@ package com.google.android.gms.cast.framework; -import org.microg.safeparcel.AutoSafeParcelable; -import org.microg.safeparcel.SafeParceled; - -import com.google.android.gms.cast.framework.media.CastMediaOptions; import com.google.android.gms.cast.LaunchOptions; +import com.google.android.gms.cast.framework.media.CastMediaOptions; + +import org.microg.safeparcel.AutoSafeParcelable; import java.util.ArrayList; -import java.util.List; public class CastOptions extends AutoSafeParcelable { @Field(1) - private int versionCode = 1; + private final int versionCode = 1; @Field(2) private String receiverApplicationId; @Field(3) diff --git a/play-services-cast-framework-api/src/main/java/com/google/android/gms/cast/framework/media/CastMediaOptions.java b/play-services-cast-framework-api/src/main/java/com/google/android/gms/cast/framework/media/CastMediaOptions.java index 2a9afe90..742e9798 100644 --- a/play-services-cast-framework-api/src/main/java/com/google/android/gms/cast/framework/media/CastMediaOptions.java +++ b/play-services-cast-framework-api/src/main/java/com/google/android/gms/cast/framework/media/CastMediaOptions.java @@ -17,12 +17,11 @@ package com.google.android.gms.cast.framework.media; import org.microg.safeparcel.AutoSafeParcelable; -import org.microg.safeparcel.SafeParceled; public class CastMediaOptions extends AutoSafeParcelable { @Field(1) - private int versionCode = 1; + private final int versionCode = 1; @Field(2) public String mediaIntentReceiverClassName; @Field(3) diff --git a/play-services-cast-framework-api/src/main/java/com/google/android/gms/cast/framework/media/NotificationOptions.java b/play-services-cast-framework-api/src/main/java/com/google/android/gms/cast/framework/media/NotificationOptions.java index 2219e4a3..e0949265 100644 --- a/play-services-cast-framework-api/src/main/java/com/google/android/gms/cast/framework/media/NotificationOptions.java +++ b/play-services-cast-framework-api/src/main/java/com/google/android/gms/cast/framework/media/NotificationOptions.java @@ -16,17 +16,16 @@ package com.google.android.gms.cast.framework.media; -import java.util.List; - import com.google.android.gms.cast.framework.media.INotificationActionsProvider; import org.microg.safeparcel.AutoSafeParcelable; -import org.microg.safeparcel.SafeParceled; + +import java.util.List; public class NotificationOptions extends AutoSafeParcelable { @Field(1) - private int versionCode = 1; + private final int versionCode = 1; @Field(2) public List actions; @Field(3) diff --git a/play-services-cast/build.gradle b/play-services-cast/build.gradle index 788618f5..dbdf42b0 100755 --- a/play-services-cast/build.gradle +++ b/play-services-cast/build.gradle @@ -18,7 +18,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion androidCompileSdk - buildToolsVersion "$androidBuildVersionTools" + buildToolsVersion "30.0.3" defaultConfig { minSdkVersion androidMinSdk diff --git a/play-services-cast/src/main/java/com/google/android/gms/cast/CastRemoteDisplay.java b/play-services-cast/src/main/java/com/google/android/gms/cast/CastRemoteDisplay.java index 0cd3d5af..4f1d59ae 100755 --- a/play-services-cast/src/main/java/com/google/android/gms/cast/CastRemoteDisplay.java +++ b/play-services-cast/src/main/java/com/google/android/gms/cast/CastRemoteDisplay.java @@ -43,8 +43,8 @@ public final class CastRemoteDisplay { } public static final class CastRemoteDisplayOptions implements Api.ApiOptions.HasOptions { - private CastDevice castDevice; - private CastRemoteDisplaySessionCallbacks callbacks; + private final CastDevice castDevice; + private final CastRemoteDisplaySessionCallbacks callbacks; private CastRemoteDisplayOptions(CastDevice castDevice, CastRemoteDisplaySessionCallbacks callbacks) { this.castDevice = castDevice; @@ -52,8 +52,8 @@ public final class CastRemoteDisplay { } public static final class Builder { - private CastDevice castDevice; - private CastRemoteDisplaySessionCallbacks callbacks; + private final CastDevice castDevice; + private final CastRemoteDisplaySessionCallbacks callbacks; public Builder(CastDevice castDevice, CastRemoteDisplaySessionCallbacks callbacks) { this.castDevice = castDevice; diff --git a/play-services-cast/src/main/java/org/microg/gms/cast/CastApiClientBuilder.java b/play-services-cast/src/main/java/org/microg/gms/cast/CastApiClientBuilder.java index aba48971..47847803 100755 --- a/play-services-cast/src/main/java/org/microg/gms/cast/CastApiClientBuilder.java +++ b/play-services-cast/src/main/java/org/microg/gms/cast/CastApiClientBuilder.java @@ -21,9 +21,9 @@ import android.os.Looper; import com.google.android.gms.cast.Cast; +import org.microg.gms.common.api.ApiClient; import org.microg.gms.common.api.ApiClientBuilder; import org.microg.gms.common.api.ApiClientSettings; -import org.microg.gms.common.api.ApiClient; import org.microg.gms.common.api.ConnectionCallbacks; import org.microg.gms.common.api.OnConnectionFailedListener; diff --git a/play-services-cast/src/main/java/org/microg/gms/cast/CastRemoteDisplayApiClientBuilder.java b/play-services-cast/src/main/java/org/microg/gms/cast/CastRemoteDisplayApiClientBuilder.java index 588d25c3..b3f5374a 100755 --- a/play-services-cast/src/main/java/org/microg/gms/cast/CastRemoteDisplayApiClientBuilder.java +++ b/play-services-cast/src/main/java/org/microg/gms/cast/CastRemoteDisplayApiClientBuilder.java @@ -22,9 +22,9 @@ import android.os.Looper; import com.google.android.gms.cast.CastRemoteDisplay; import org.microg.gms.common.DummyApiClient; +import org.microg.gms.common.api.ApiClient; import org.microg.gms.common.api.ApiClientBuilder; import org.microg.gms.common.api.ApiClientSettings; -import org.microg.gms.common.api.ApiClient; import org.microg.gms.common.api.ConnectionCallbacks; import org.microg.gms.common.api.OnConnectionFailedListener; diff --git a/play-services-core-proto/src/main/proto/appcert.proto b/play-services-core-proto/src/main/proto/appcert.proto new file mode 100644 index 00000000..4ab1e5e7 --- /dev/null +++ b/play-services-core-proto/src/main/proto/appcert.proto @@ -0,0 +1,32 @@ +option java_package = "org.microg.gms.auth.appcert"; +option java_outer_classname = "AppCertProto"; + +message DeviceKeyRequest { + optional uint64 androidId = 2; + optional uint64 sessionId = 3; + message VersionInfo { + optional uint32 sdkVersion = 1; + optional uint32 gmsVersion = 2; + } + optional VersionInfo versionInfo = 4; + optional string token = 5; +} + +message DeviceKey { + optional uint64 keyId = 1; + optional uint64 deviceId = 3; + optional bytes macSecret = 4; + optional bytes keyCert = 5; +} + +message SpatulaHeaderProto { + message PackageInfo { + optional string packageName = 1; + optional string packageCertificateHash = 3; + } + optional PackageInfo packageInfo = 1; + optional bytes hmac = 2; + optional uint64 deviceId = 3; + optional uint64 keyId = 4; + optional bytes keyCert = 5; +} diff --git a/play-services-core/build.gradle b/play-services-core/build.gradle index 84429485..16d32fcd 100644 --- a/play-services-core/build.gradle +++ b/play-services-core/build.gradle @@ -28,29 +28,31 @@ dependencies { implementation project(':play-services-core:microg-ui-tools') // deprecated implementation project(':play-services-api') implementation project(':play-services-cast-api') + implementation project(':play-services-tasks') // AndroidX UI - implementation 'androidx.appcompat:appcompat:1.3.1' - implementation 'androidx.mediarouter:mediarouter:1.2.5' - implementation "androidx.preference:preference-ktx:$preferenceVersion" + implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'androidx.mediarouter:mediarouter:1.2.6' + implementation 'androidx.preference:preference-ktx:1.2.0' implementation "org.microg.gms:conscrypt-gmscore:2.5.1" - implementation "androidx.annotation:annotation:1.2.0" - implementation "androidx.lifecycle:lifecycle-service:2.3.1" + implementation 'androidx.annotation:annotation:1.3.0' + implementation 'androidx.lifecycle:lifecycle-service:2.4.0' // Navigation - implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5' - implementation 'androidx.navigation:navigation-ui-ktx:2.3.5' + implementation 'androidx.navigation:navigation-fragment-ktx:2.4.0' + implementation 'androidx.navigation:navigation-ui-ktx:2.4.0' - implementation "androidx.lifecycle:lifecycle-service:2.3.1" - implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.32' + implementation 'androidx.lifecycle:lifecycle-service:2.4.0' + implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10' + implementation 'com.android.volley:volley:1.2.1' api project(':play-services-basement') } android { compileSdkVersion androidCompileSdk - buildToolsVersion "$androidBuildVersionTools" + buildToolsVersion "30.0.3" defaultConfig { versionName version diff --git a/play-services-core/microg-ui-tools/build.gradle b/play-services-core/microg-ui-tools/build.gradle index edb1b523..cfd28f93 100644 --- a/play-services-core/microg-ui-tools/build.gradle +++ b/play-services-core/microg-ui-tools/build.gradle @@ -18,7 +18,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion androidCompileSdk - buildToolsVersion "$androidBuildVersionTools" + buildToolsVersion "30.0.3" defaultConfig { minSdkVersion androidMinSdk @@ -37,7 +37,7 @@ android { } dependencies { - implementation 'androidx.appcompat:appcompat:1.3.1' - implementation "androidx.preference:preference:$preferenceVersion" + implementation 'androidx.appcompat:appcompat:1.4.1' + implementation 'androidx.preference:preference:1.2.0' } diff --git a/play-services-core/microg-ui-tools/src/main/java/org/microg/tools/ui/SwitchBar.java b/play-services-core/microg-ui-tools/src/main/java/org/microg/tools/ui/SwitchBar.java index 61f28ae5..b404bcbc 100644 --- a/play-services-core/microg-ui-tools/src/main/java/org/microg/tools/ui/SwitchBar.java +++ b/play-services-core/microg-ui-tools/src/main/java/org/microg/tools/ui/SwitchBar.java @@ -17,6 +17,8 @@ package org.microg.tools.ui; +import static android.os.Build.VERSION.SDK_INT; + import android.content.Context; import android.os.Build; import android.os.Parcel; @@ -35,8 +37,6 @@ import androidx.appcompat.widget.SwitchCompat; import java.util.ArrayList; -import static android.os.Build.VERSION.SDK_INT; - public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedChangeListener, View.OnClickListener { @@ -52,12 +52,12 @@ public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedC private final TextAppearanceSpan mSummarySpan; - private ToggleSwitch mSwitch; - private TextView mTextView; + private final ToggleSwitch mSwitch; + private final TextView mTextView; private String mLabel; private String mSummary; - private ArrayList mSwitchChangeListeners = + private final ArrayList mSwitchChangeListeners = new ArrayList<>(); public SwitchBar(Context context) { diff --git a/play-services-core/microg-ui-tools/src/main/res/layout/switch_bar.xml b/play-services-core/microg-ui-tools/src/main/res/layout/switch_bar.xml index f8a6d55e..224fdf66 100644 --- a/play-services-core/microg-ui-tools/src/main/res/layout/switch_bar.xml +++ b/play-services-core/microg-ui-tools/src/main/res/layout/switch_bar.xml @@ -29,7 +29,7 @@ android:ellipsize="end" android:maxLines="2" android:text="@string/v7_preference_on" - android:theme="@style/TextAppearance.AppCompat.Title.Inverse"/> + android:textAppearance="@style/TextAppearance.AppCompat.Title.Inverse"/> + android:permissionGroup="android.permission-group.NETWORK" + android:protectionLevel="privileged|signature" /> + + + @@ -277,7 +284,7 @@ android:exported="true" /> @@ -285,12 +292,24 @@ - + + + + + + + + + + + + + @@ -299,12 +318,14 @@ + @@ -318,7 +339,7 @@ + android:exported="true" /> @@ -360,16 +382,19 @@ + android:process=":ui" + android:taskAffinity="org.microg.gms.settings" /> + android:process=":ui" + android:taskAffinity="org.microg.gms.settings" /> + android:process=":ui" + android:taskAffinity="org.microg.gms.settings"> @@ -411,7 +436,7 @@ @@ -467,17 +492,168 @@ + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/CastContextImpl.java b/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/CastContextImpl.java index 96d805e4..c453714c 100644 --- a/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/CastContextImpl.java +++ b/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/CastContextImpl.java @@ -34,8 +34,8 @@ import com.google.android.gms.cast.framework.ISessionProvider; import com.google.android.gms.dynamic.IObjectWrapper; import com.google.android.gms.dynamic.ObjectWrapper; -import java.util.Map; import java.util.HashMap; +import java.util.Map; public class CastContextImpl extends ICastContext.Stub { private static final String TAG = CastContextImpl.class.getSimpleName(); @@ -43,13 +43,13 @@ public class CastContextImpl extends ICastContext.Stub { private SessionManagerImpl sessionManager; private DiscoveryManagerImpl discoveryManager; - private Context context; - private CastOptions options; - private IMediaRouter router; - private Map sessionProviders = new HashMap(); + private final Context context; + private final CastOptions options; + private final IMediaRouter router; + private final Map sessionProviders = new HashMap(); public ISessionProvider defaultSessionProvider; - private MediaRouteSelector mergedSelector; + private final MediaRouteSelector mergedSelector; public CastContextImpl(IObjectWrapper context, CastOptions options, IMediaRouter router, Map sessionProviders) throws RemoteException { this.context = (Context) ObjectWrapper.unwrap(context); diff --git a/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/CastDynamiteModuleImpl.java b/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/CastDynamiteModuleImpl.java index 03615bbe..fccaf432 100644 --- a/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/CastDynamiteModuleImpl.java +++ b/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/CastDynamiteModuleImpl.java @@ -27,9 +27,6 @@ import com.google.android.gms.cast.framework.IReconnectionService; import com.google.android.gms.cast.framework.ISession; import com.google.android.gms.cast.framework.ISessionProxy; import com.google.android.gms.cast.framework.media.CastMediaOptions; -import com.google.android.gms.cast.framework.internal.CastContextImpl; -import com.google.android.gms.cast.framework.internal.CastSessionImpl; -import com.google.android.gms.cast.framework.internal.SessionImpl; import com.google.android.gms.cast.framework.media.IMediaNotificationService; import com.google.android.gms.cast.framework.media.internal.IFetchBitmapTask; import com.google.android.gms.cast.framework.media.internal.IFetchBitmapTaskProgressPublisher; diff --git a/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/CastSessionImpl.java b/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/CastSessionImpl.java index cc63b949..1ea984e5 100644 --- a/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/CastSessionImpl.java +++ b/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/CastSessionImpl.java @@ -16,8 +16,6 @@ package com.google.android.gms.cast.framework.internal; -import com.google.android.gms.cast.framework.ICastSession; - import android.os.Bundle; import android.os.RemoteException; import android.util.Log; @@ -25,15 +23,16 @@ import android.util.Log; import com.google.android.gms.cast.ApplicationMetadata; import com.google.android.gms.cast.framework.CastOptions; import com.google.android.gms.cast.framework.ICastConnectionController; +import com.google.android.gms.cast.framework.ICastSession; import com.google.android.gms.common.api.Status; import com.google.android.gms.dynamic.IObjectWrapper; import com.google.android.gms.dynamic.ObjectWrapper; public class CastSessionImpl extends ICastSession.Stub { private static final String TAG = CastSessionImpl.class.getSimpleName(); - private CastOptions options; - private SessionImpl session; - private ICastConnectionController controller; + private final CastOptions options; + private final SessionImpl session; + private final ICastConnectionController controller; public CastSessionImpl(CastOptions options, IObjectWrapper session, ICastConnectionController controller) throws RemoteException { this.options = options; diff --git a/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/DiscoveryManagerImpl.java b/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/DiscoveryManagerImpl.java index b0e7b51c..b6832966 100644 --- a/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/DiscoveryManagerImpl.java +++ b/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/DiscoveryManagerImpl.java @@ -21,19 +21,18 @@ import android.util.Log; import com.google.android.gms.cast.framework.IDiscoveryManager; import com.google.android.gms.cast.framework.IDiscoveryManagerListener; -import com.google.android.gms.cast.framework.internal.CastContextImpl; import com.google.android.gms.dynamic.IObjectWrapper; import com.google.android.gms.dynamic.ObjectWrapper; -import java.util.Set; import java.util.HashSet; +import java.util.Set; public class DiscoveryManagerImpl extends IDiscoveryManager.Stub { private static final String TAG = DiscoveryManagerImpl.class.getSimpleName(); - private CastContextImpl castContextImpl; + private final CastContextImpl castContextImpl; - private Set discoveryManagerListeners = new HashSet(); + private final Set discoveryManagerListeners = new HashSet(); public DiscoveryManagerImpl(CastContextImpl castContextImpl) { this.castContextImpl = castContextImpl; diff --git a/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/MediaRouterCallbackImpl.java b/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/MediaRouterCallbackImpl.java index 9f65d8ba..c18e6b86 100644 --- a/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/MediaRouterCallbackImpl.java +++ b/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/MediaRouterCallbackImpl.java @@ -26,7 +26,7 @@ import com.google.android.gms.dynamic.ObjectWrapper; public class MediaRouterCallbackImpl extends IMediaRouterCallback.Stub { private static final String TAG = MediaRouterCallbackImpl.class.getSimpleName(); - private CastContextImpl castContext; + private final CastContextImpl castContext; public MediaRouterCallbackImpl(CastContextImpl castContext) { this.castContext = castContext; diff --git a/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/SessionImpl.java b/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/SessionImpl.java index 954405d8..7969509e 100644 --- a/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/SessionImpl.java +++ b/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/SessionImpl.java @@ -20,7 +20,6 @@ import android.os.Bundle; import android.os.RemoteException; import android.util.Log; - import com.google.android.gms.cast.ApplicationMetadata; import com.google.android.gms.cast.CastDevice; import com.google.android.gms.cast.framework.ISession; @@ -31,9 +30,9 @@ import com.google.android.gms.dynamic.ObjectWrapper; public class SessionImpl extends ISession.Stub { private static final String TAG = SessionImpl.class.getSimpleName(); - private String category; - private String sessionId; - private ISessionProxy proxy; + private final String category; + private final String sessionId; + private final ISessionProxy proxy; private CastSessionImpl castSession; diff --git a/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/SessionManagerImpl.java b/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/SessionManagerImpl.java index 918968fe..609ff6c6 100644 --- a/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/SessionManagerImpl.java +++ b/play-services-core/src/main/java/com/google/android/gms/cast/framework/internal/SessionManagerImpl.java @@ -24,26 +24,23 @@ import com.google.android.gms.cast.framework.CastState; import com.google.android.gms.cast.framework.ICastStateListener; import com.google.android.gms.cast.framework.ISessionManager; import com.google.android.gms.cast.framework.ISessionManagerListener; -import com.google.android.gms.cast.framework.internal.CastContextImpl; -import com.google.android.gms.cast.framework.internal.SessionImpl; import com.google.android.gms.dynamic.IObjectWrapper; import com.google.android.gms.dynamic.ObjectWrapper; -import java.util.Set; -import java.util.HashSet; - -import java.util.Map; import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; public class SessionManagerImpl extends ISessionManager.Stub { private static final String TAG = SessionManagerImpl.class.getSimpleName(); - private CastContextImpl castContext; + private final CastContextImpl castContext; - private Set sessionManagerListeners = new HashSet(); - private Set castStateListeners = new HashSet(); + private final Set sessionManagerListeners = new HashSet(); + private final Set castStateListeners = new HashSet(); - private Map routeSessions = new HashMap<>(); + private final Map routeSessions = new HashMap<>(); private SessionImpl currentSession; diff --git a/play-services-core/src/main/java/com/google/android/gms/cast/media/CastMediaRouteProviderService.java b/play-services-core/src/main/java/com/google/android/gms/cast/media/CastMediaRouteProviderService.java index e2502eea..bf0553de 100644 --- a/play-services-core/src/main/java/com/google/android/gms/cast/media/CastMediaRouteProviderService.java +++ b/play-services-core/src/main/java/com/google/android/gms/cast/media/CastMediaRouteProviderService.java @@ -16,11 +16,11 @@ package com.google.android.gms.cast.media; -import org.microg.gms.cast.CastMediaRouteProvider; - import androidx.mediarouter.media.MediaRouteProvider; import androidx.mediarouter.media.MediaRouteProviderService; +import org.microg.gms.cast.CastMediaRouteProvider; + public class CastMediaRouteProviderService extends MediaRouteProviderService { private static final String TAG = CastMediaRouteProviderService.class.getSimpleName(); diff --git a/play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteContext.java b/play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteContext.java index 8484447b..00bde131 100644 --- a/play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteContext.java +++ b/play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteContext.java @@ -23,10 +23,10 @@ import dalvik.system.PathClassLoader; public class DynamiteContext extends ContextWrapper { private static final String TAG = "DynamiteContext"; - private DynamiteModuleInfo moduleInfo; - private Context originalContext; - private Context gmsContext; - private DynamiteContext appContext; + private final DynamiteModuleInfo moduleInfo; + private final Context originalContext; + private final Context gmsContext; + private final DynamiteContext appContext; private ClassLoader classLoader; diff --git a/play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteLoaderImpl.java b/play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteLoaderImpl.java index 48e5a4b5..62f387df 100644 --- a/play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteLoaderImpl.java +++ b/play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteLoaderImpl.java @@ -17,8 +17,6 @@ package com.google.android.gms.chimera.container; import android.content.Context; -import android.content.ContextWrapper; -import android.content.pm.PackageManager; import android.os.RemoteException; import android.util.Log; @@ -26,10 +24,6 @@ import com.google.android.gms.dynamic.IObjectWrapper; import com.google.android.gms.dynamic.ObjectWrapper; import com.google.android.gms.dynamite.IDynamiteLoader; -import org.microg.gms.common.Constants; - -import java.lang.reflect.Field; - public class DynamiteLoaderImpl extends IDynamiteLoader.Stub { private static final String TAG = "GmsDynamiteLoaderImpl"; diff --git a/play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteModuleInfo.java b/play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteModuleInfo.java index 637a269f..73d9c735 100644 --- a/play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteModuleInfo.java +++ b/play-services-core/src/main/java/com/google/android/gms/chimera/container/DynamiteModuleInfo.java @@ -8,12 +8,9 @@ package com.google.android.gms.chimera.container; import java.util.Collection; import java.util.Collections; -import static android.content.Context.CONTEXT_IGNORE_SECURITY; -import static android.content.Context.CONTEXT_INCLUDE_CODE; - public class DynamiteModuleInfo { private Class descriptor; - private String moduleId; + private final String moduleId; public DynamiteModuleInfo(String moduleId) { this.moduleId = moduleId; diff --git a/play-services-core/src/main/java/com/google/android/gms/chimera/container/FilteredClassLoader.java b/play-services-core/src/main/java/com/google/android/gms/chimera/container/FilteredClassLoader.java index 76731fc3..74c2bb36 100644 --- a/play-services-core/src/main/java/com/google/android/gms/chimera/container/FilteredClassLoader.java +++ b/play-services-core/src/main/java/com/google/android/gms/chimera/container/FilteredClassLoader.java @@ -5,8 +5,6 @@ package com.google.android.gms.chimera.container; -import android.util.Log; - import java.util.Collection; import java.util.HashSet; diff --git a/play-services-core/src/main/java/com/google/android/gms/common/GoogleCertificatesImpl.java b/play-services-core/src/main/java/com/google/android/gms/common/GoogleCertificatesImpl.java index bbe72472..7ab30bc3 100644 --- a/play-services-core/src/main/java/com/google/android/gms/common/GoogleCertificatesImpl.java +++ b/play-services-core/src/main/java/com/google/android/gms/common/GoogleCertificatesImpl.java @@ -18,9 +18,10 @@ package com.google.android.gms.common; import android.content.pm.PackageManager; import android.os.RemoteException; -import androidx.annotation.Keep; import android.util.Log; +import androidx.annotation.Keep; + import com.google.android.gms.common.internal.GoogleCertificatesQuery; import com.google.android.gms.common.internal.IGoogleCertificatesApi; import com.google.android.gms.dynamic.IObjectWrapper; diff --git a/play-services-core/src/main/java/com/google/android/gms/common/security/ProviderInstallerImpl.java b/play-services-core/src/main/java/com/google/android/gms/common/security/ProviderInstallerImpl.java index 0135b57f..01137bd2 100644 --- a/play-services-core/src/main/java/com/google/android/gms/common/security/ProviderInstallerImpl.java +++ b/play-services-core/src/main/java/com/google/android/gms/common/security/ProviderInstallerImpl.java @@ -5,6 +5,8 @@ package com.google.android.gms.common.security; +import static com.google.android.gms.security.ProviderInstaller.PROVIDER_NAME; + import android.content.Context; import android.content.pm.ApplicationInfo; import android.os.Build; @@ -38,8 +40,6 @@ import java.util.zip.ZipFile; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; -import static com.google.android.gms.security.ProviderInstaller.PROVIDER_NAME; - @Keep public class ProviderInstallerImpl { private static final String TAG = "GmsProviderInstaller"; diff --git a/play-services-core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/measurement/dynamite/ModuleDescriptor.java b/play-services-core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/measurement/dynamite/ModuleDescriptor.java new file mode 100644 index 00000000..0c3f0bcd --- /dev/null +++ b/play-services-core/src/main/java/com/google/android/gms/dynamite/descriptors/com/google/android/gms/measurement/dynamite/ModuleDescriptor.java @@ -0,0 +1,22 @@ +/* + * 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. + */ + +package com.google.android.gms.dynamite.descriptors.com.google.android.gms.measurement.dynamite; + +public class ModuleDescriptor { + public static final String MODULE_ID = "com.google.android.gms.measurement.dynamite"; + public static final int MODULE_VERSION = 53; +} diff --git a/play-services-core/src/main/java/org/microg/gms/BaseService.java b/play-services-core/src/main/java/org/microg/gms/BaseService.java index 398c00ed..3941e508 100644 --- a/play-services-core/src/main/java/org/microg/gms/BaseService.java +++ b/play-services-core/src/main/java/org/microg/gms/BaseService.java @@ -16,7 +16,6 @@ package org.microg.gms; -import android.app.Service; import android.content.Intent; import android.os.IBinder; import android.os.RemoteException; @@ -30,16 +29,19 @@ import com.google.android.gms.common.internal.IGmsServiceBroker; import org.microg.gms.common.GmsService; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.Arrays; import java.util.EnumSet; public abstract class BaseService extends LifecycleService { private final IGmsServiceBroker broker; + private final EnumSet services; protected final String TAG; public BaseService(String tag, GmsService supportedService, GmsService... supportedServices) { this.TAG = tag; - EnumSet services = EnumSet.of(supportedService); + services = EnumSet.of(supportedService); services.addAll(Arrays.asList(supportedServices)); broker = new AbstractGmsServiceBroker(services) { @Override @@ -62,5 +64,10 @@ public abstract class BaseService extends LifecycleService { return broker.asBinder(); } + @Override + protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) { + writer.println(TAG + " providing services " + services.toString()); + } + public abstract void handleServiceRequest(IGmsCallbacks callback, GetServiceRequest request, GmsService service) throws RemoteException; } diff --git a/play-services-core/src/main/java/org/microg/gms/auth/AccountContentProvider.java b/play-services-core/src/main/java/org/microg/gms/auth/AccountContentProvider.java index b1fb4822..2254ba39 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/AccountContentProvider.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/AccountContentProvider.java @@ -16,6 +16,12 @@ package org.microg.gms.auth; +import static org.microg.gms.auth.AuthConstants.DEFAULT_ACCOUNT_TYPE; +import static org.microg.gms.auth.AuthConstants.PROVIDER_EXTRA_ACCOUNTS; +import static org.microg.gms.auth.AuthConstants.PROVIDER_EXTRA_CLEAR_PASSWORD; +import static org.microg.gms.auth.AuthConstants.PROVIDER_METHOD_CLEAR_PASSWORD; +import static org.microg.gms.auth.AuthConstants.PROVIDER_METHOD_GET_ACCOUNTS; + import android.Manifest; import android.accounts.Account; import android.accounts.AccountManager; @@ -35,12 +41,6 @@ import org.microg.gms.common.PackageUtils; import java.util.Arrays; -import static org.microg.gms.auth.AuthConstants.DEFAULT_ACCOUNT_TYPE; -import static org.microg.gms.auth.AuthConstants.PROVIDER_EXTRA_ACCOUNTS; -import static org.microg.gms.auth.AuthConstants.PROVIDER_EXTRA_CLEAR_PASSWORD; -import static org.microg.gms.auth.AuthConstants.PROVIDER_METHOD_CLEAR_PASSWORD; -import static org.microg.gms.auth.AuthConstants.PROVIDER_METHOD_GET_ACCOUNTS; - public class AccountContentProvider extends ContentProvider { private static final String TAG = "GmsAuthProvider"; diff --git a/play-services-core/src/main/java/org/microg/gms/auth/AuthManager.java b/play-services-core/src/main/java/org/microg/gms/auth/AuthManager.java index 08618fd1..73adeabf 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/AuthManager.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/AuthManager.java @@ -16,6 +16,10 @@ package org.microg.gms.auth; +import static android.content.pm.ApplicationInfo.FLAG_SYSTEM; +import static android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; +import static org.microg.gms.auth.AuthPrefs.isTrustGooglePermitted; + import android.accounts.Account; import android.accounts.AccountManager; import android.content.Context; @@ -28,10 +32,6 @@ import org.microg.mgms.settings.SettingsContract; import java.io.IOException; -import static android.content.pm.ApplicationInfo.FLAG_SYSTEM; -import static android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; -import static org.microg.gms.auth.AuthPrefs.isTrustGooglePermitted; - public class AuthManager { private static final String TAG = "GmsAuthManager"; diff --git a/play-services-core/src/main/java/org/microg/gms/auth/AuthManagerServiceImpl.java b/play-services-core/src/main/java/org/microg/gms/auth/AuthManagerServiceImpl.java index 80ac29cf..6343439d 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/AuthManagerServiceImpl.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/AuthManagerServiceImpl.java @@ -16,26 +16,23 @@ package org.microg.gms.auth; +import static android.accounts.AccountManager.KEY_ACCOUNTS; +import static android.accounts.AccountManager.KEY_ACCOUNT_NAME; +import static android.accounts.AccountManager.KEY_ACCOUNT_TYPE; +import static android.accounts.AccountManager.KEY_AUTHTOKEN; +import static android.accounts.AccountManager.KEY_CALLER_PID; + import android.accounts.Account; import android.accounts.AccountManager; -import android.accounts.AuthenticatorException; -import android.accounts.OperationCanceledException; -import android.app.NotificationManager; -import android.app.PendingIntent; +import android.annotation.SuppressLint; import android.content.Context; -import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Parcel; import android.os.RemoteException; -import android.util.Base64; import android.util.Log; -import androidx.core.app.NotificationCompat; -import androidx.core.app.NotificationManagerCompat; - import com.google.android.auth.IAuthManagerService; -import com.mgoogle.android.gms.R; import com.google.android.gms.auth.AccountChangeEventsRequest; import com.google.android.gms.auth.AccountChangeEventsResponse; import com.google.android.gms.auth.TokenData; @@ -48,12 +45,6 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; -import static android.accounts.AccountManager.KEY_ACCOUNTS; -import static android.accounts.AccountManager.KEY_ACCOUNT_NAME; -import static android.accounts.AccountManager.KEY_ACCOUNT_TYPE; -import static android.accounts.AccountManager.KEY_AUTHTOKEN; -import static android.accounts.AccountManager.KEY_CALLER_PID; - public class AuthManagerServiceImpl extends IAuthManagerService.Stub { private static final String TAG = "GmsAuthManagerSvc"; @@ -180,6 +171,7 @@ public class AuthManagerServiceImpl extends IAuthManagerService.Stub { } @Override + @SuppressLint("MissingPermission") // Workaround bug in Android Linter public Bundle clearToken(String token, Bundle extras) { String packageName = extras.getString(KEY_ANDROID_PACKAGE_NAME); if (packageName == null) packageName = extras.getString(KEY_CLIENT_PACKAGE_NAME); diff --git a/play-services-core/src/main/java/org/microg/gms/auth/AuthRequest.java b/play-services-core/src/main/java/org/microg/gms/auth/AuthRequest.java index 8dda8e4c..55ff536b 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/AuthRequest.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/AuthRequest.java @@ -16,20 +16,21 @@ package org.microg.gms.auth; +import static org.microg.gms.common.HttpFormClient.RequestContent; +import static org.microg.gms.common.HttpFormClient.RequestHeader; + import android.content.Context; import org.microg.gms.checkin.LastCheckinInfo; -import org.microg.gms.common.Build; import org.microg.gms.common.Constants; import org.microg.gms.common.HttpFormClient; import org.microg.gms.common.Utils; +import org.microg.gms.profile.Build; +import org.microg.gms.profile.ProfileManager; import java.io.IOException; import java.util.Locale; -import static org.microg.gms.common.HttpFormClient.RequestContent; -import static org.microg.gms.common.HttpFormClient.RequestHeader; - public class AuthRequest extends HttpFormClient.Request { private static final String SERVICE_URL = "https://android.googleapis.com/auth"; private static final String USER_AGENT = "GoogleAuth/1.4 (%s %s); gzip"; @@ -77,8 +78,6 @@ public class AuthRequest extends HttpFormClient.Request { public boolean getAccountId; @RequestContent("ACCESS_TOKEN") public boolean isAccessToken; - @RequestContent("droidguard_results") - public String droidguardResults; @RequestContent("has_permission") public boolean hasPermission; @RequestContent("add_account") @@ -91,10 +90,11 @@ public class AuthRequest extends HttpFormClient.Request { userAgent = String.format(USER_AGENT, deviceName, buildVersion); } - public AuthRequest build(Build build) { - sdkVersion = build.sdk; - deviceName = build.device; - buildVersion = build.id; + public AuthRequest build(Context context) { + ProfileManager.ensureInitialized(context); + sdkVersion = Build.VERSION.SDK_INT; + deviceName = Build.DEVICE; + buildVersion = Build.ID; return this; } @@ -111,7 +111,7 @@ public class AuthRequest extends HttpFormClient.Request { } public AuthRequest fromContext(Context context) { - build(Utils.getBuild(context)); + build(context); locale(Utils.getLocale(context)); androidIdHex = Long.toHexString(LastCheckinInfo.read(context).getAndroidId()); return this; @@ -186,11 +186,6 @@ public class AuthRequest extends HttpFormClient.Request { return this; } - public AuthRequest droidguardResults(String droidguardResults) { - this.droidguardResults = droidguardResults; - return this; - } - public AuthResponse getResponse() throws IOException { return HttpFormClient.request(SERVICE_URL, this, AuthResponse.class); } diff --git a/play-services-core/src/main/java/org/microg/gms/auth/AuthResponse.java b/play-services-core/src/main/java/org/microg/gms/auth/AuthResponse.java index f94eacef..f7c034c2 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/AuthResponse.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/AuthResponse.java @@ -16,12 +16,12 @@ package org.microg.gms.auth; +import static org.microg.gms.common.HttpFormClient.ResponseField; + import android.util.Log; import java.lang.reflect.Field; -import static org.microg.gms.common.HttpFormClient.ResponseField; - public class AuthResponse { private static final String TAG = "GmsAuthResponse"; diff --git a/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java b/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java index 61224887..7e090360 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/login/LoginActivity.java @@ -16,12 +16,29 @@ package org.microg.gms.auth.login; +import static android.accounts.AccountManager.PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE; +import static android.accounts.AccountManager.VISIBILITY_USER_MANAGED_VISIBLE; +import static android.os.Build.VERSION.SDK_INT; +import static android.os.Build.VERSION_CODES.GINGERBREAD_MR1; +import static android.os.Build.VERSION_CODES.HONEYCOMB; +import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.telephony.TelephonyManager.SIM_STATE_UNKNOWN; +import static android.view.KeyEvent.KEYCODE_BACK; +import static android.view.View.INVISIBLE; +import static android.view.View.VISIBLE; +import static android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT; +import static org.microg.gms.auth.AuthPrefs.isAuthVisible; +import static org.microg.gms.checkin.CheckinPrefs.hideLauncherIcon; +import static org.microg.gms.checkin.CheckinPrefs.isSpoofingEnabled; +import static org.microg.gms.checkin.CheckinPrefs.setSpoofingEnabled; +import static org.microg.gms.common.Constants.GMS_PACKAGE_NAME; +import static org.microg.gms.common.Constants.GMS_VERSION_CODE; + import android.accounts.Account; import android.accounts.AccountManager; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.content.Context; -import android.content.Intent; import android.graphics.Color; import android.net.ConnectivityManager; import android.net.NetworkInfo; @@ -43,7 +60,6 @@ import android.widget.RelativeLayout; import android.widget.TextView; import androidx.annotation.StringRes; -import androidx.preference.PreferenceManager; import com.mgoogle.android.gms.R; @@ -52,7 +68,6 @@ import org.microg.gms.auth.AuthConstants; import org.microg.gms.auth.AuthManager; import org.microg.gms.auth.AuthRequest; import org.microg.gms.auth.AuthResponse; -import org.microg.gms.checkin.CheckinClient; import org.microg.gms.checkin.CheckinManager; import org.microg.gms.checkin.LastCheckinInfo; import org.microg.gms.common.HttpFormClient; @@ -63,24 +78,6 @@ import org.microg.gms.ui.UtilsKt; import java.io.IOException; import java.util.Locale; -import static android.accounts.AccountManager.PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE; -import static android.accounts.AccountManager.VISIBILITY_USER_MANAGED_VISIBLE; -import static android.os.Build.VERSION.SDK_INT; -import static android.os.Build.VERSION_CODES.GINGERBREAD_MR1; -import static android.os.Build.VERSION_CODES.HONEYCOMB; -import static android.os.Build.VERSION_CODES.LOLLIPOP; -import static android.telephony.TelephonyManager.SIM_STATE_UNKNOWN; -import static android.view.KeyEvent.KEYCODE_BACK; -import static android.view.View.INVISIBLE; -import static android.view.View.VISIBLE; -import static android.view.inputmethod.InputMethodManager.SHOW_IMPLICIT; -import static org.microg.gms.auth.AuthPrefs.isAuthVisible; -import static org.microg.gms.checkin.CheckinPrefs.hideLauncherIcon; -import static org.microg.gms.checkin.CheckinPrefs.isSpoofingEnabled; -import static org.microg.gms.checkin.CheckinPrefs.setSpoofingEnabled; -import static org.microg.gms.common.Constants.GMS_PACKAGE_NAME; -import static org.microg.gms.common.Constants.GMS_VERSION_CODE; - public class LoginActivity extends AssistantActivity { public static final String TMPL_NEW_ACCOUNT = "new_account"; public static final String EXTRA_TMPL = "tmpl"; @@ -102,8 +99,8 @@ public class LoginActivity extends AssistantActivity { private ViewGroup authContent; private int state = 0; - private String HuaweiButtonPreference = "huaweiloginbutton"; - private String LoginButtonPreference = "standardloginbutton"; + private final String HuaweiButtonPreference = "huaweiloginbutton"; + private final String LoginButtonPreference = "standardloginbutton"; @SuppressLint("AddJavascriptInterface") @Override @@ -312,7 +309,6 @@ public class LoginActivity extends AssistantActivity { .token(oAuthToken).isAccessToken() .addAccount() .getAccountId() - .droidguardResults(null /*TODO*/) .getResponseAsync(new HttpFormClient.Callback() { @Override public void onResponse(AuthResponse response) { @@ -422,7 +418,7 @@ public class LoginActivity extends AssistantActivity { @JavascriptInterface public final void addAccount(String json) { - Log.d(TAG, "JSBridge: addAccount " + json); + Log.d(TAG, "JSBridge: addAccount"); } @JavascriptInterface @@ -458,7 +454,7 @@ public class LoginActivity extends AssistantActivity { @JavascriptInterface public final String getAndroidId() { long androidId = LastCheckinInfo.read(LoginActivity.this).getAndroidId(); - Log.d(TAG, "JSBridge: getAndroidId " + androidId); + Log.d(TAG, "JSBridge: getAndroidId"); if (androidId == 0 || androidId == -1) return null; return Long.toHexString(androidId); } @@ -520,7 +516,6 @@ public class LoginActivity extends AssistantActivity { @JavascriptInterface public final void hideKeyboard() { - Log.d(TAG, "JSBridge: hideKeyboard"); inputMethodManager.hideSoftInputFromWindow(webView.getWindowToken(), 0); } @@ -536,7 +531,7 @@ public class LoginActivity extends AssistantActivity { @JavascriptInterface public final void log(String s) { - Log.d(TAG, "JSBridge: log " + s); + Log.d(TAG, "JSBridge: log"); } @JavascriptInterface @@ -546,13 +541,12 @@ public class LoginActivity extends AssistantActivity { @JavascriptInterface public final void setAccountIdentifier(String accountIdentifier) { - Log.d(TAG, "JSBridge: setAccountIdentifier " + accountIdentifier); + Log.d(TAG, "JSBridge: setAccountIdentifier"); } @TargetApi(HONEYCOMB) @JavascriptInterface public final void setBackButtonEnabled(boolean backButtonEnabled) { - Log.d(TAG, "JSBridge: setBackButtonEnabled: " + backButtonEnabled); if (SDK_INT <= GINGERBREAD_MR1) return; int visibility = getWindow().getDecorView().getSystemUiVisibility(); if (backButtonEnabled) @@ -570,13 +564,11 @@ public class LoginActivity extends AssistantActivity { @JavascriptInterface public final void showKeyboard() { - Log.d(TAG, "JSBridge: showKeyboard"); inputMethodManager.showSoftInput(webView, SHOW_IMPLICIT); } @JavascriptInterface public final void showView() { - Log.d(TAG, "JSBridge: showView"); runOnUiThread(() -> webView.setVisibility(VISIBLE)); } diff --git a/play-services-core/src/main/java/org/microg/gms/auth/loginservice/AccountAuthenticator.java b/play-services-core/src/main/java/org/microg/gms/auth/loginservice/AccountAuthenticator.java index b2072a0c..2bce17af 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/loginservice/AccountAuthenticator.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/loginservice/AccountAuthenticator.java @@ -16,6 +16,16 @@ package org.microg.gms.auth.loginservice; +import static android.accounts.AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE; +import static android.accounts.AccountManager.KEY_ACCOUNT_NAME; +import static android.accounts.AccountManager.KEY_ACCOUNT_TYPE; +import static android.accounts.AccountManager.KEY_ANDROID_PACKAGE_NAME; +import static android.accounts.AccountManager.KEY_AUTHTOKEN; +import static android.accounts.AccountManager.KEY_BOOLEAN_RESULT; +import static android.accounts.AccountManager.KEY_CALLER_PID; +import static android.accounts.AccountManager.KEY_CALLER_UID; +import static android.accounts.AccountManager.KEY_INTENT; + import android.accounts.AbstractAccountAuthenticator; import android.accounts.Account; import android.accounts.AccountAuthenticatorResponse; @@ -24,7 +34,6 @@ import android.accounts.NetworkErrorException; import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.util.Base64; import android.util.Log; import org.microg.gms.auth.AuthConstants; @@ -36,16 +45,6 @@ import org.microg.gms.common.PackageUtils; import java.util.Arrays; import java.util.List; -import static android.accounts.AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE; -import static android.accounts.AccountManager.KEY_ACCOUNT_NAME; -import static android.accounts.AccountManager.KEY_ACCOUNT_TYPE; -import static android.accounts.AccountManager.KEY_ANDROID_PACKAGE_NAME; -import static android.accounts.AccountManager.KEY_AUTHTOKEN; -import static android.accounts.AccountManager.KEY_BOOLEAN_RESULT; -import static android.accounts.AccountManager.KEY_CALLER_PID; -import static android.accounts.AccountManager.KEY_CALLER_UID; -import static android.accounts.AccountManager.KEY_INTENT; - class AccountAuthenticator extends AbstractAccountAuthenticator { private static final String TAG = "GmsAuthenticator"; private final Context context; diff --git a/play-services-core/src/main/java/org/microg/gms/auth/loginservice/GoogleLoginService.java b/play-services-core/src/main/java/org/microg/gms/auth/loginservice/GoogleLoginService.java index 086c0612..30d6541c 100644 --- a/play-services-core/src/main/java/org/microg/gms/auth/loginservice/GoogleLoginService.java +++ b/play-services-core/src/main/java/org/microg/gms/auth/loginservice/GoogleLoginService.java @@ -16,12 +16,12 @@ package org.microg.gms.auth.loginservice; +import static android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT; + import android.app.Service; import android.content.Intent; import android.os.IBinder; -import static android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT; - public class GoogleLoginService extends Service { private AccountAuthenticator authenticator; diff --git a/play-services-core/src/main/java/org/microg/gms/cast/CastDeviceControllerImpl.java b/play-services-core/src/main/java/org/microg/gms/cast/CastDeviceControllerImpl.java index 8dffb214..d6bc80f9 100644 --- a/play-services-core/src/main/java/org/microg/gms/cast/CastDeviceControllerImpl.java +++ b/play-services-core/src/main/java/org/microg/gms/cast/CastDeviceControllerImpl.java @@ -16,9 +16,6 @@ package org.microg.gms.cast; -import java.io.IOException; -import java.util.ArrayList; - import android.content.Context; import android.os.Bundle; import android.os.RemoteException; @@ -35,15 +32,18 @@ import com.google.android.gms.cast.internal.ICastDeviceControllerListener; import com.google.android.gms.common.api.CommonStatusCodes; import com.google.android.gms.common.internal.BinderWrapper; +import java.io.IOException; +import java.util.ArrayList; + import su.litvak.chromecast.api.v2.Application; import su.litvak.chromecast.api.v2.ChromeCast; -import su.litvak.chromecast.api.v2.Namespace; -import su.litvak.chromecast.api.v2.ChromeCastConnectionEventListener; -import su.litvak.chromecast.api.v2.ChromeCastSpontaneousEventListener; -import su.litvak.chromecast.api.v2.ChromeCastRawMessageListener; import su.litvak.chromecast.api.v2.ChromeCastConnectionEvent; -import su.litvak.chromecast.api.v2.ChromeCastSpontaneousEvent; +import su.litvak.chromecast.api.v2.ChromeCastConnectionEventListener; import su.litvak.chromecast.api.v2.ChromeCastRawMessage; +import su.litvak.chromecast.api.v2.ChromeCastRawMessageListener; +import su.litvak.chromecast.api.v2.ChromeCastSpontaneousEvent; +import su.litvak.chromecast.api.v2.ChromeCastSpontaneousEventListener; +import su.litvak.chromecast.api.v2.Namespace; public class CastDeviceControllerImpl extends ICastDeviceController.Stub implements ChromeCastConnectionEventListener, @@ -53,9 +53,9 @@ public class CastDeviceControllerImpl extends ICastDeviceController.Stub impleme { private static final String TAG = "GmsCastDeviceController"; - private Context context; - private String packageName; - private CastDevice castDevice; + private final Context context; + private final String packageName; + private final CastDevice castDevice; boolean notificationEnabled; long castFlags; ICastDeviceControllerListener listener; diff --git a/play-services-core/src/main/java/org/microg/gms/cast/CastMediaRouteController.java b/play-services-core/src/main/java/org/microg/gms/cast/CastMediaRouteController.java index 6f2bdda6..0d2aa35f 100644 --- a/play-services-core/src/main/java/org/microg/gms/cast/CastMediaRouteController.java +++ b/play-services-core/src/main/java/org/microg/gms/cast/CastMediaRouteController.java @@ -27,9 +27,9 @@ import su.litvak.chromecast.api.v2.ChromeCast; public class CastMediaRouteController extends MediaRouteProvider.RouteController { private static final String TAG = CastMediaRouteController.class.getSimpleName(); - private CastMediaRouteProvider provider; - private String routeId; - private ChromeCast chromecast; + private final CastMediaRouteProvider provider; + private final String routeId; + private final ChromeCast chromecast; public CastMediaRouteController(CastMediaRouteProvider provider, String routeId, String address) { super(); diff --git a/play-services-core/src/main/java/org/microg/gms/cast/CastMediaRouteProvider.java b/play-services-core/src/main/java/org/microg/gms/cast/CastMediaRouteProvider.java index 09d3b623..e4014ad9 100644 --- a/play-services-core/src/main/java/org/microg/gms/cast/CastMediaRouteProvider.java +++ b/play-services-core/src/main/java/org/microg/gms/cast/CastMediaRouteProvider.java @@ -45,13 +45,13 @@ import java.util.Map; public class CastMediaRouteProvider extends MediaRouteProvider { private static final String TAG = CastMediaRouteProvider.class.getSimpleName(); - private Map castDevices = new HashMap<>(); - private Map serviceCastIds = new HashMap<>(); + private final Map castDevices = new HashMap<>(); + private final Map serviceCastIds = new HashMap<>(); private NsdManager mNsdManager; private NsdManager.DiscoveryListener mDiscoveryListener; - private List customCategories = new ArrayList<>(); + private final List customCategories = new ArrayList<>(); private enum State { NOT_DISCOVERING, diff --git a/play-services-core/src/main/java/org/microg/gms/checkin/CheckinClient.java b/play-services-core/src/main/java/org/microg/gms/checkin/CheckinClient.java index 2793663a..ea031218 100755 --- a/play-services-core/src/main/java/org/microg/gms/checkin/CheckinClient.java +++ b/play-services-core/src/main/java/org/microg/gms/checkin/CheckinClient.java @@ -16,13 +16,14 @@ package org.microg.gms.checkin; +import android.content.Context; import android.util.Log; -import org.microg.gms.common.Build; import org.microg.gms.common.DeviceConfiguration; import org.microg.gms.common.DeviceIdentifier; import org.microg.gms.common.PhoneInfo; import org.microg.gms.common.Utils; +import org.microg.gms.profile.Build; import java.io.IOException; import java.io.InputStream; @@ -75,7 +76,7 @@ public class CheckinClient { return response; } - public static CheckinRequest makeRequest(Build build, DeviceConfiguration deviceConfiguration, + public static CheckinRequest makeRequest(Context context, DeviceConfiguration deviceConfiguration, DeviceIdentifier deviceIdent, PhoneInfo phoneInfo, LastCheckinInfo checkinInfo, Locale locale, List accounts, Boolean brandSpoof) { @@ -84,19 +85,19 @@ public class CheckinClient { .androidId(checkinInfo.getAndroidId()) .checkin(new CheckinRequest.Checkin.Builder() .build(new CheckinRequest.Checkin.Build.Builder() - .bootloader(brandSpoof ? "c2f2-0.2-5799621" : build.bootloader) - .brand(brandSpoof ? "google" : build.brand) + .bootloader(brandSpoof ? "c2f2-0.2-5799621" : Build.BOOTLOADER) + .brand(brandSpoof ? "google" : Build.BOOTLOADER) .clientId("android-google") - .device(brandSpoof ? "generic" : build.device) - .fingerprint(brandSpoof ? "google/coral/coral:10/QD1A.190821.007/5831595:user/release-keys" : build.fingerprint) - .hardware(brandSpoof ? "coral" : build.hardware) - .manufacturer(brandSpoof ? "Google" : build.manufacturer) - .model(brandSpoof ? "mainline" : build.model) + .device(brandSpoof ? "generic" : Build.DEVICE) + .fingerprint(brandSpoof ? "google/coral/coral:10/QD1A.190821.007/5831595:user/release-keys" : Build.FINGERPRINT) + .hardware(brandSpoof ? "coral" : Build.HARDWARE) + .manufacturer(brandSpoof ? "Google" : Build.MANUFACTURER) + .model(brandSpoof ? "mainline" : Build.MODEL) .otaInstalled(false) // TODO? - .product(brandSpoof ? "coral" : build.product) - .radio(brandSpoof ? "" : build.radio) - .sdkVersion(brandSpoof ? 29 : build.sdk) - .time(build.time / 1000) + .product(brandSpoof ? "coral" : Build.PRODUCT) + .radio(brandSpoof ? "" : Build.RADIO) + .sdkVersion(brandSpoof ? 29 : Build.VERSION.SDK_INT) + .time(Build.TIME / 1000) .build()) .cellOperator(phoneInfo.cellOperator) .event(Collections.singletonList(new CheckinRequest.Checkin.Event.Builder() @@ -135,7 +136,7 @@ public class CheckinClient { .loggingId(new Random().nextLong()) // TODO: static .meid(deviceIdent.meid) .otaCert(Collections.singletonList("71Q6Rn2DDZl1zPDVaaeEHItd")) - .serial(build.serial) + .serial(Build.SERIAL) .timeZone(TimeZone.getDefault().getID()) .userName((String) TODO) .userSerialNumber((Integer) TODO) diff --git a/play-services-core/src/main/java/org/microg/gms/checkin/CheckinManager.java b/play-services-core/src/main/java/org/microg/gms/checkin/CheckinManager.java index 9bed5db0..9252bb19 100755 --- a/play-services-core/src/main/java/org/microg/gms/checkin/CheckinManager.java +++ b/play-services-core/src/main/java/org/microg/gms/checkin/CheckinManager.java @@ -16,6 +16,8 @@ package org.microg.gms.checkin; +import static org.microg.gms.checkin.CheckinPrefs.isSpoofingEnabled; + import android.accounts.Account; import android.accounts.AccountManager; import android.content.ContentResolver; @@ -32,8 +34,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import static org.microg.gms.checkin.CheckinPrefs.isSpoofingEnabled; - public class CheckinManager { private static final String TAG = "GmsCheckinManager"; private static final long MIN_CHECKIN_INTERVAL = 3 * 60 * 60 * 1000; // 3 hours @@ -58,7 +58,7 @@ public class CheckinManager { accounts.add(new CheckinClient.Account(account.name, token)); } } - CheckinRequest request = CheckinClient.makeRequest(Utils.getBuild(context), + CheckinRequest request = CheckinClient.makeRequest(context, new DeviceConfiguration(context), Utils.getDeviceIdentifier(context), Utils.getPhoneInfo(context), info, Utils.getLocale(context), accounts, isSpoofingEnabled(context)); diff --git a/play-services-core/src/main/java/org/microg/gms/checkin/CheckinService.java b/play-services-core/src/main/java/org/microg/gms/checkin/CheckinService.java index 39f7ef70..bd5bfabb 100755 --- a/play-services-core/src/main/java/org/microg/gms/checkin/CheckinService.java +++ b/play-services-core/src/main/java/org/microg/gms/checkin/CheckinService.java @@ -32,12 +32,12 @@ import android.util.Log; import androidx.legacy.content.WakefulBroadcastReceiver; -import com.mgoogle.android.gms.R; import com.google.android.gms.checkin.internal.ICheckinService; +import com.mgoogle.android.gms.R; import org.microg.gms.auth.AuthConstants; -import org.microg.gms.common.ForegroundServiceInfo; import org.microg.gms.common.ForegroundServiceContext; +import org.microg.gms.common.ForegroundServiceInfo; import org.microg.gms.gcm.McsService; import org.microg.gms.people.PeopleManager; @@ -54,11 +54,21 @@ public class CheckinService extends IntentService { public static final String EXTRA_RESULT_RECEIVER = "receiver"; public static final String EXTRA_NEW_CHECKIN_TIME = "checkin_time"; - private ICheckinService iface = new ICheckinService.Stub() { + private final ICheckinService iface = new ICheckinService.Stub() { @Override public String getDeviceDataVersionInfo() throws RemoteException { return LastCheckinInfo.read(CheckinService.this).getDeviceDataVersionInfo(); } + + @Override + public long getLastCheckinSuccessTime() throws RemoteException { + return LastCheckinInfo.read(CheckinService.this).getLastCheckin(); + } + + @Override + public String getLastSimOperator() throws RemoteException { + return null; + } }; public CheckinService() { diff --git a/play-services-core/src/main/java/org/microg/gms/checkin/TriggerReceiver.java b/play-services-core/src/main/java/org/microg/gms/checkin/TriggerReceiver.java index da7c90c3..4b6551bd 100755 --- a/play-services-core/src/main/java/org/microg/gms/checkin/TriggerReceiver.java +++ b/play-services-core/src/main/java/org/microg/gms/checkin/TriggerReceiver.java @@ -16,6 +16,12 @@ package org.microg.gms.checkin; +import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; +import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; +import static android.os.Build.VERSION.SDK_INT; +import static org.microg.gms.checkin.CheckinService.EXTRA_FORCE_CHECKIN; +import static org.microg.gms.checkin.CheckinService.REGULAR_CHECKIN_INTERVAL; + import android.app.PendingIntent; import android.content.Context; import android.content.Intent; @@ -28,12 +34,6 @@ import androidx.legacy.content.WakefulBroadcastReceiver; import org.microg.gms.common.ForegroundServiceContext; -import static android.app.PendingIntent.FLAG_UPDATE_CURRENT; -import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; -import static android.os.Build.VERSION.SDK_INT; -import static org.microg.gms.checkin.CheckinService.EXTRA_FORCE_CHECKIN; -import static org.microg.gms.checkin.CheckinService.REGULAR_CHECKIN_INTERVAL; - public class TriggerReceiver extends WakefulBroadcastReceiver { private static final String TAG = "GmsCheckinTrigger"; @@ -55,14 +55,14 @@ public class TriggerReceiver extends WakefulBroadcastReceiver { subIntent.putExtra(EXTRA_FORCE_CHECKIN, force); startWakefulService(new ForegroundServiceContext(context), subIntent); } else if (SDK_INT >= 23) { - // no network, register a network callback to retry when we have internet - NetworkRequest networkRequest = new NetworkRequest.Builder() - .addCapability(NET_CAPABILITY_INTERNET) - .build(); - Intent i = new Intent(context, TriggerReceiver.class); - PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, i, FLAG_UPDATE_CURRENT); - cm.registerNetworkCallback(networkRequest, pendingIntent); - } + // no network, register a network callback to retry when we have internet + NetworkRequest networkRequest = new NetworkRequest.Builder() + .addCapability(NET_CAPABILITY_INTERNET) + .build(); + Intent i = new Intent(context, TriggerReceiver.class); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, i, FLAG_UPDATE_CURRENT); + cm.registerNetworkCallback(networkRequest, pendingIntent); + } } else { Log.d(TAG, "Ignoring " + intent + ": checkin is disabled"); } diff --git a/play-services-core/src/main/java/org/microg/gms/clearcut/ClearcutLoggerService.java b/play-services-core/src/main/java/org/microg/gms/clearcut/ClearcutLoggerService.java deleted file mode 100644 index 02203153..00000000 --- a/play-services-core/src/main/java/org/microg/gms/clearcut/ClearcutLoggerService.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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. - */ - -package org.microg.gms.clearcut; - -import android.os.RemoteException; - -import com.google.android.gms.common.internal.GetServiceRequest; -import com.google.android.gms.common.internal.IGmsCallbacks; - -import org.microg.gms.BaseService; -import org.microg.gms.common.GmsService; - -public class ClearcutLoggerService extends BaseService { - private ClearcutLoggerServiceImpl clearcutService = new ClearcutLoggerServiceImpl(); - - public ClearcutLoggerService() { - super("GmsClearcutSvc", GmsService.CLEARCUT_LOGGER); - } - - @Override - public void handleServiceRequest(IGmsCallbacks callback, GetServiceRequest request, GmsService service) throws RemoteException { - callback.onPostInitComplete(0, clearcutService.asBinder(), null); - } -} diff --git a/play-services-core/src/main/java/org/microg/gms/clearcut/ClearcutLoggerServiceImpl.java b/play-services-core/src/main/java/org/microg/gms/clearcut/ClearcutLoggerServiceImpl.java deleted file mode 100644 index fd1a1dac..00000000 --- a/play-services-core/src/main/java/org/microg/gms/clearcut/ClearcutLoggerServiceImpl.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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. - */ - -package org.microg.gms.clearcut; - -import android.os.RemoteException; -import android.util.Log; - -import com.google.android.gms.clearcut.LogEventParcelable; -import com.google.android.gms.clearcut.internal.IClearcutLoggerCallbacks; -import com.google.android.gms.clearcut.internal.IClearcutLoggerService; -import com.google.android.gms.common.api.Status; - -public class ClearcutLoggerServiceImpl extends IClearcutLoggerService.Stub { - private static final String TAG = "GmsClearcutLogSvcImpl"; - - @Override - public void log(IClearcutLoggerCallbacks callbacks, LogEventParcelable event) throws RemoteException { - // These logs are not really helpful for us, so let's just ignore it. - try { - callbacks.onStatus(Status.SUCCESS); - } catch (Exception ignored) { - } - } -} diff --git a/play-services-core/src/main/java/org/microg/gms/common/Build.java b/play-services-core/src/main/java/org/microg/gms/common/Build.java deleted file mode 100644 index 423d90d5..00000000 --- a/play-services-core/src/main/java/org/microg/gms/common/Build.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * 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. - */ - -package org.microg.gms.common; - -import java.util.Locale; -import java.util.Random; - -public class Build { - public String fingerprint = android.os.Build.FINGERPRINT; - public String hardware = android.os.Build.HARDWARE; - public String brand = android.os.Build.BRAND; - public String radio = getRadio(); - public String bootloader = android.os.Build.BOOTLOADER; - public long time = android.os.Build.TIME; - public String device = android.os.Build.DEVICE; - public int sdk = android.os.Build.VERSION.SDK_INT; - public String model = android.os.Build.MODEL; - public String manufacturer = android.os.Build.MANUFACTURER; - public String product = android.os.Build.PRODUCT; - public String id = android.os.Build.ID; - public String serial = generateSerialNumber(); // TODO: static - - @SuppressWarnings("deprecation") - private static String getRadio() { - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - return android.os.Build.getRadioVersion(); - } else { - return android.os.Build.RADIO; - } - } - - private String generateSerialNumber() { - String serial; - Random rand = new Random(); - StringBuilder serialBuilder = new StringBuilder("008741"); - for (int i = 0; i < 10; i++) - serialBuilder.append(Integer.toString(rand.nextInt(16), 16)); - serial = serialBuilder.toString(); - serial = serial.toUpperCase(Locale.US); - return serial; - } -} diff --git a/play-services-core/src/main/java/org/microg/gms/common/ForegroundServiceContext.java b/play-services-core/src/main/java/org/microg/gms/common/ForegroundServiceContext.java index 352e9905..8da30387 100644 --- a/play-services-core/src/main/java/org/microg/gms/common/ForegroundServiceContext.java +++ b/play-services-core/src/main/java/org/microg/gms/common/ForegroundServiceContext.java @@ -80,7 +80,7 @@ public class ForegroundServiceContext extends ContextWrapper { try { Notification notification = buildForegroundNotification(service, serviceName); service.startForeground(serviceName.hashCode(), notification); - Log.d(tag, "Notification: " + notification.toString()); + Log.d(tag, "Notification: " + notification); } catch (Exception e) { Log.w(tag, e); } diff --git a/play-services-core/src/main/java/org/microg/gms/common/MultiListenerProxy.java b/play-services-core/src/main/java/org/microg/gms/common/MultiListenerProxy.java index 958b9cd5..66f44776 100644 --- a/play-services-core/src/main/java/org/microg/gms/common/MultiListenerProxy.java +++ b/play-services-core/src/main/java/org/microg/gms/common/MultiListenerProxy.java @@ -106,7 +106,7 @@ public class MultiListenerProxy implements InvocationHandl private static class CollectionListenerPool extends ListenerPool { - private Collection listeners; + private final Collection listeners; public CollectionListenerPool(Collection listeners) { this.listeners = listeners; @@ -145,7 +145,7 @@ public class MultiListenerProxy implements InvocationHandl } public static class MultiCollectionListenerPool extends ListenerPool { - private Collection> multiCol; + private final Collection> multiCol; public MultiCollectionListenerPool(Collection> multiCol) { this.multiCol = multiCol; diff --git a/play-services-core/src/main/java/org/microg/gms/common/PackageUtils.java b/play-services-core/src/main/java/org/microg/gms/common/PackageUtils.java index 5404fe4e..7d80c3b8 100644 --- a/play-services-core/src/main/java/org/microg/gms/common/PackageUtils.java +++ b/play-services-core/src/main/java/org/microg/gms/common/PackageUtils.java @@ -16,6 +16,10 @@ package org.microg.gms.common; +import static android.os.Build.VERSION.SDK_INT; +import static org.microg.gms.common.Constants.GMS_PACKAGE_NAME; +import static org.microg.gms.common.Constants.GMS_PACKAGE_SIGNATURE_SHA1; + import android.app.ActivityManager; import android.app.Application; import android.app.PendingIntent; @@ -36,10 +40,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import static android.os.Build.VERSION.SDK_INT; -import static org.microg.gms.common.Constants.GMS_PACKAGE_NAME; -import static org.microg.gms.common.Constants.GMS_PACKAGE_SIGNATURE_SHA1; - public class PackageUtils { private static final String GOOGLE_PLATFORM_KEY = GMS_PACKAGE_SIGNATURE_SHA1; @@ -130,6 +130,30 @@ public class PackageUtils { return null; } + @Nullable + public static byte[] firstSignatureDigestBytes(Context context, String packageName) { + return firstSignatureDigestBytes(context.getPackageManager(), packageName); + } + + @Nullable + public static byte[] firstSignatureDigestBytes(PackageManager packageManager, String packageName) { + final PackageInfo info; + try { + info = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES); + } catch (PackageManager.NameNotFoundException e) { + return null; + } + if (info != null && info.signatures != null && info.signatures.length > 0) { + for (Signature sig : info.signatures) { + byte[] digest = sha1bytes(sig.toByteArray()); + if (digest != null) { + return digest; + } + } + } + return null; + } + @Nullable public static String getCallingPackage(Context context) { int callingUid = Binder.getCallingUid(), callingPid = Binder.getCallingPid(); @@ -140,11 +164,36 @@ public class PackageUtils { return packageName; } + public static byte[] sha1bytes(byte[] bytes) { + MessageDigest md; + try { + md = MessageDigest.getInstance("SHA1"); + } catch (final NoSuchAlgorithmException e) { + return null; + } + if (md != null) { + return md.digest(bytes); + } + return null; + } + @Nullable public static String getAndCheckCallingPackage(Context context, String suggestedPackageName) { return getAndCheckCallingPackage(context, suggestedPackageName, 0); } + @Nullable + public static String getAndCheckCallingPackageOrExtendedAccess(Context context, String suggestedPackageName) { + try { + return getAndCheckCallingPackage(context, suggestedPackageName, 0); + } catch (Exception e) { + if (callerHasExtendedAccess(context)) { + return suggestedPackageName; + } + throw e; + } + } + @Nullable public static String getAndCheckCallingPackage(Context context, int suggestedCallerUid) { return getAndCheckCallingPackage(context, null, suggestedCallerUid); diff --git a/play-services-core/src/main/java/org/microg/gms/common/RemoteListenerProxy.java b/play-services-core/src/main/java/org/microg/gms/common/RemoteListenerProxy.java index e14aea00..bc310c1c 100644 --- a/play-services-core/src/main/java/org/microg/gms/common/RemoteListenerProxy.java +++ b/play-services-core/src/main/java/org/microg/gms/common/RemoteListenerProxy.java @@ -38,8 +38,8 @@ public class RemoteListenerProxy implements ServiceConnect private final String bindAction; private IBinder remote; private boolean connecting; - private List waiting = new ArrayList<>(); - private Class tClass; + private final List waiting = new ArrayList<>(); + private final Class tClass; public static T get(Context context, Intent intent, Class tClass, String bindAction) { return (T) Proxy.newProxyInstance(tClass.getClassLoader(), new Class[]{tClass}, diff --git a/play-services-core/src/main/java/org/microg/gms/common/Utils.java b/play-services-core/src/main/java/org/microg/gms/common/Utils.java index e13700a5..1aa984a2 100644 --- a/play-services-core/src/main/java/org/microg/gms/common/Utils.java +++ b/play-services-core/src/main/java/org/microg/gms/common/Utils.java @@ -16,6 +16,8 @@ package org.microg.gms.common; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; + import android.content.Context; import android.util.Log; @@ -24,18 +26,12 @@ import java.io.IOException; import java.io.InputStream; import java.util.Locale; -import static android.content.pm.PackageManager.PERMISSION_GRANTED; - public class Utils { public static Locale getLocale(Context context) { return Locale.getDefault(); // TODO } - public static Build getBuild(Context context) { - return new Build(); - } - public static DeviceIdentifier getDeviceIdentifier(Context context) { return new DeviceIdentifier(); } diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/GcmDatabase.java b/play-services-core/src/main/java/org/microg/gms/gcm/GcmDatabase.java index ce32d8d3..d9881dd8 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/GcmDatabase.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/GcmDatabase.java @@ -20,7 +20,7 @@ import java.util.List; public class GcmDatabase extends SQLiteOpenHelper { private static final String TAG = GcmDatabase.class.getSimpleName(); public static final String DB_NAME = "gcmstatus"; - private static int DB_VERSION = 1; + private static final int DB_VERSION = 1; private static final String CREATE_TABLE_APPS = "CREATE TABLE apps (" + "package_name TEXT," + "last_error TEXT DEFAULT ''," + @@ -50,7 +50,7 @@ public class GcmDatabase extends SQLiteOpenHelper { private static final String FIELD_TIMESTAMP = "timestamp"; private static final String FIELD_REGISTER_ID = "register_id"; - private Context context; + private final Context context; public GcmDatabase(Context context) { super(context, DB_NAME, null, DB_VERSION); diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/GcmLegacyData.java b/play-services-core/src/main/java/org/microg/gms/gcm/GcmLegacyData.java index cab9652a..59ecf7e1 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/GcmLegacyData.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/GcmLegacyData.java @@ -31,7 +31,7 @@ public class GcmLegacyData { static final String REMOVED = "%%REMOVED%%"; static final String ERROR = "%%ERROR%%"; - private Context context; + private final Context context; public GcmLegacyData(Context context) { this.context = context; @@ -46,7 +46,7 @@ public class GcmLegacyData { private final int STATE_ERROR = 1; private final int STATE_REMOVED = 2; private final int STATE_REGISTERED = 3; - private int state; + private final int state; public LegacyAppInfo(String key, String value) { if (ERROR.equals(value)) { diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/McsInputStream.java b/play-services-core/src/main/java/org/microg/gms/gcm/McsInputStream.java index 75374e50..fd4fa38e 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/McsInputStream.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/McsInputStream.java @@ -16,6 +16,17 @@ package org.microg.gms.gcm; +import static org.microg.gms.gcm.McsConstants.MCS_CLOSE_TAG; +import static org.microg.gms.gcm.McsConstants.MCS_DATA_MESSAGE_STANZA_TAG; +import static org.microg.gms.gcm.McsConstants.MCS_HEARTBEAT_ACK_TAG; +import static org.microg.gms.gcm.McsConstants.MCS_HEARTBEAT_PING_TAG; +import static org.microg.gms.gcm.McsConstants.MCS_IQ_STANZA_TAG; +import static org.microg.gms.gcm.McsConstants.MCS_LOGIN_REQUEST_TAG; +import static org.microg.gms.gcm.McsConstants.MCS_LOGIN_RESPONSE_TAG; +import static org.microg.gms.gcm.McsConstants.MSG_INPUT; +import static org.microg.gms.gcm.McsConstants.MSG_INPUT_ERROR; +import static org.microg.gms.gcm.McsConstants.MSG_TEARDOWN; + import android.os.Handler; import android.util.Log; @@ -33,17 +44,6 @@ import java.io.Closeable; import java.io.IOException; import java.io.InputStream; -import static org.microg.gms.gcm.McsConstants.MCS_CLOSE_TAG; -import static org.microg.gms.gcm.McsConstants.MCS_DATA_MESSAGE_STANZA_TAG; -import static org.microg.gms.gcm.McsConstants.MCS_HEARTBEAT_ACK_TAG; -import static org.microg.gms.gcm.McsConstants.MCS_HEARTBEAT_PING_TAG; -import static org.microg.gms.gcm.McsConstants.MCS_IQ_STANZA_TAG; -import static org.microg.gms.gcm.McsConstants.MCS_LOGIN_REQUEST_TAG; -import static org.microg.gms.gcm.McsConstants.MCS_LOGIN_RESPONSE_TAG; -import static org.microg.gms.gcm.McsConstants.MSG_INPUT; -import static org.microg.gms.gcm.McsConstants.MSG_INPUT_ERROR; -import static org.microg.gms.gcm.McsConstants.MSG_TEARDOWN; - public class McsInputStream extends Thread implements Closeable { private static final String TAG = "GmsGcmMcsInput"; @@ -54,9 +54,9 @@ public class McsInputStream extends Thread implements Closeable { private int version = -1; private int lastStreamIdReported = -1; private int streamId = 0; - private long lastMsgTime = 0; + private final long lastMsgTime = 0; - private boolean closed = false; + private volatile boolean closed = false; public McsInputStream(InputStream is, Handler mainHandler) { this(is, mainHandler, false); @@ -82,7 +82,11 @@ public class McsInputStream extends Thread implements Closeable { } } } catch (IOException e) { - mainHandler.dispatchMessage(mainHandler.obtainMessage(MSG_INPUT_ERROR, e)); + if (closed) { + Log.d(TAG, "We were closed already. Ignoring IOException"); + } else { + mainHandler.dispatchMessage(mainHandler.obtainMessage(MSG_INPUT_ERROR, e)); + } } try { is.close(); @@ -119,7 +123,7 @@ public class McsInputStream extends Thread implements Closeable { Log.d(TAG, "Reading from MCS version: " + version); initialized = true; } catch (IOException e) { - Log.w(TAG, e); + Log.w(TAG, "Error reading version", e); } } } diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/McsOutputStream.java b/play-services-core/src/main/java/org/microg/gms/gcm/McsOutputStream.java index a4867b6d..12cd7047 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/McsOutputStream.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/McsOutputStream.java @@ -16,6 +16,13 @@ package org.microg.gms.gcm; +import static org.microg.gms.gcm.McsConstants.MCS_VERSION_CODE; +import static org.microg.gms.gcm.McsConstants.MSG_OUTPUT; +import static org.microg.gms.gcm.McsConstants.MSG_OUTPUT_DONE; +import static org.microg.gms.gcm.McsConstants.MSG_OUTPUT_ERROR; +import static org.microg.gms.gcm.McsConstants.MSG_OUTPUT_READY; +import static org.microg.gms.gcm.McsConstants.MSG_TEARDOWN; + import android.os.Handler; import android.os.Looper; import android.util.Log; @@ -26,25 +33,18 @@ import java.io.Closeable; import java.io.IOException; import java.io.OutputStream; -import static org.microg.gms.gcm.McsConstants.MCS_VERSION_CODE; -import static org.microg.gms.gcm.McsConstants.MSG_OUTPUT; -import static org.microg.gms.gcm.McsConstants.MSG_OUTPUT_DONE; -import static org.microg.gms.gcm.McsConstants.MSG_OUTPUT_ERROR; -import static org.microg.gms.gcm.McsConstants.MSG_OUTPUT_READY; -import static org.microg.gms.gcm.McsConstants.MSG_TEARDOWN; - public class McsOutputStream extends Thread implements Handler.Callback, Closeable { private static final String TAG = "GmsGcmMcsOutput"; private final OutputStream os; private boolean initialized; - private int version = MCS_VERSION_CODE; + private final int version = MCS_VERSION_CODE; private int streamId = 0; - private Handler mainHandler; + private final Handler mainHandler; private Handler myHandler; - private boolean closed = false; + private volatile boolean closed = false; public McsOutputStream(OutputStream os, Handler mainHandler) { this(os, mainHandler, false); @@ -78,7 +78,11 @@ public class McsOutputStream extends Thread implements Handler.Callback, Closeab writeInternal((Message) msg.obj, msg.arg1); mainHandler.dispatchMessage(mainHandler.obtainMessage(MSG_OUTPUT_DONE, msg.arg1, msg.arg2, msg.obj)); } catch (IOException e) { - mainHandler.dispatchMessage(mainHandler.obtainMessage(MSG_OUTPUT_ERROR, e)); + if (closed) { + Log.d(TAG, "We were closed already. Ignoring IOException"); + } else { + mainHandler.dispatchMessage(mainHandler.obtainMessage(MSG_OUTPUT_ERROR, e)); + } } return true; case MSG_TEARDOWN: diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/McsService.java b/play-services-core/src/main/java/org/microg/gms/gcm/McsService.java index 7ecfe1a5..8a67b886 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/McsService.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/McsService.java @@ -16,61 +16,6 @@ package org.microg.gms.gcm; -import android.app.AlarmManager; -import android.app.PendingIntent; -import android.app.Service; -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.PermissionInfo; -import android.content.pm.ResolveInfo; -import android.net.ConnectivityManager; -import android.os.Build; -import android.os.Bundle; -import android.os.Handler; -import android.os.IBinder; -import android.os.Looper; -import android.os.Messenger; -import android.os.Parcelable; -import android.os.PowerManager; -import android.os.SystemClock; -import android.os.UserHandle; -import android.util.Log; - -import androidx.legacy.content.WakefulBroadcastReceiver; - -import com.mgoogle.android.gms.R; -import com.squareup.wire.Message; - -import org.microg.gms.checkin.LastCheckinInfo; -import org.microg.gms.common.ForegroundServiceContext; -import org.microg.gms.common.ForegroundServiceInfo; -import org.microg.gms.common.PackageUtils; -import org.microg.gms.gcm.mcs.AppData; -import org.microg.gms.gcm.mcs.Close; -import org.microg.gms.gcm.mcs.DataMessageStanza; -import org.microg.gms.gcm.mcs.Extension; -import org.microg.gms.gcm.mcs.HeartbeatAck; -import org.microg.gms.gcm.mcs.HeartbeatPing; -import org.microg.gms.gcm.mcs.IqStanza; -import org.microg.gms.gcm.mcs.LoginRequest; -import org.microg.gms.gcm.mcs.LoginResponse; -import org.microg.gms.gcm.mcs.Setting; - -import java.io.Closeable; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.net.Socket; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; - -import javax.net.ssl.SSLContext; - -import okio.ByteString; - import static android.app.AlarmManager.ELAPSED_REALTIME_WAKEUP; import static android.os.Build.VERSION.SDK_INT; import static org.microg.gms.common.PackageUtils.warnIfNotPersistentProcess; @@ -109,6 +54,63 @@ import static org.microg.gms.gcm.McsConstants.MSG_OUTPUT_ERROR; import static org.microg.gms.gcm.McsConstants.MSG_OUTPUT_READY; import static org.microg.gms.gcm.McsConstants.MSG_TEARDOWN; +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.app.Service; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.PermissionInfo; +import android.content.pm.ResolveInfo; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.os.Messenger; +import android.os.Parcelable; +import android.os.PowerManager; +import android.os.SystemClock; +import android.os.UserHandle; +import android.util.Log; + +import androidx.legacy.content.WakefulBroadcastReceiver; + +import com.mgoogle.android.gms.R; +import com.squareup.wire.Message; + +import org.microg.gms.checkin.LastCheckinInfo; +import org.microg.gms.common.ForegroundServiceContext; +import org.microg.gms.common.ForegroundServiceInfo; +import org.microg.gms.common.PackageUtils; +import org.microg.gms.gcm.mcs.AppData; +import org.microg.gms.gcm.mcs.Close; +import org.microg.gms.gcm.mcs.DataMessageStanza; +import org.microg.gms.gcm.mcs.Extension; +import org.microg.gms.gcm.mcs.HeartbeatAck; +import org.microg.gms.gcm.mcs.HeartbeatPing; +import org.microg.gms.gcm.mcs.IqStanza; +import org.microg.gms.gcm.mcs.LoginRequest; +import org.microg.gms.gcm.mcs.LoginResponse; +import org.microg.gms.gcm.mcs.Setting; + +import java.io.Closeable; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.net.Socket; +import java.net.SocketException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.net.ssl.SSLContext; + +import okio.ByteString; + @ForegroundServiceInfo(value = "Cloud messaging", res = R.string.service_name_mcs) public class McsService extends Service implements Handler.Callback { private static final String TAG = "GmsGcmMcsSvc"; @@ -121,12 +123,16 @@ public class McsService extends Service implements Handler.Callback { public static final int SERVICE_PORT = 5228; private static final int WAKELOCK_TIMEOUT = 5000; + // On bad mobile network a ping can take >60s, so we wait for an ACK for 90s + private static final int HEARTBEAT_ACK_AFTER_PING_TIMEOUT_MS = 90000; + private static long lastHeartbeatPingElapsedRealtime = -1; private static long lastHeartbeatAckElapsedRealtime = -1; private static long lastIncomingNetworkRealtime = 0; private static long startTimestamp = 0; public static String activeNetworkPref = null; - private AtomicInteger nextMessageId = new AtomicInteger(0x1000000); + private boolean wasTornDown = false; + private final AtomicInteger nextMessageId = new AtomicInteger(0x1000000); private static Socket sslSocket; private static McsInputStream inputStream; @@ -147,7 +153,7 @@ public class McsService extends Service implements Handler.Callback { private Intent connectIntent; - private static int maxTtl = 24 * 60 * 60; + private static final int maxTtl = 24 * 60 * 60; private Object deviceIdleController; private Method getUserIdMethod; @@ -223,6 +229,7 @@ public class McsService extends Service implements Handler.Callback { @Override public void onDestroy() { + Log.d(TAG, "onDestroy"); alarmManager.cancel(heartbeatIntent); closeAll(); database.close(); @@ -240,14 +247,20 @@ public class McsService extends Service implements Handler.Callback { logd(null, "Connection is not enabled or dead."); return false; } - // consider connection to be dead if we did not receive an ack within twice the heartbeat interval + // consider connection to be dead if we did not receive an ack within 90s to our ping int heartbeatMs = GcmPrefs.get(context).getHeartbeatMsFor(activeNetworkPref); + // if disabled for active network, heartbeatMs will be -1 if (heartbeatMs < 0) { closeAll(); - } else if (SystemClock.elapsedRealtime() - lastHeartbeatAckElapsedRealtime > 2 * heartbeatMs) { - logd(null, "No heartbeat for " + (SystemClock.elapsedRealtime() - lastHeartbeatAckElapsedRealtime) / 1000 + " seconds, connection assumed to be dead after " + 2 * heartbeatMs / 1000 + " seconds"); - GcmPrefs.get(context).learnTimeout(context, activeNetworkPref); return false; + } else { + boolean noAckReceived = lastHeartbeatAckElapsedRealtime < lastHeartbeatPingElapsedRealtime; + long timeSinceLastPing = SystemClock.elapsedRealtime() - lastHeartbeatPingElapsedRealtime; + if (noAckReceived && timeSinceLastPing > HEARTBEAT_ACK_AFTER_PING_TIMEOUT_MS) { + logd(null, "No heartbeat for " + timeSinceLastPing / 1000 + "s, connection assumed to be dead after 90s"); + GcmPrefs.get(context).learnTimeout(context, activeNetworkPref); + return false; + } } return true; } @@ -431,11 +444,14 @@ public class McsService extends Service implements Handler.Callback { try { closeAll(); ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); - activeNetworkPref = GcmPrefs.get(this).getNetworkPrefForInfo(cm.getActiveNetworkInfo()); - if (!GcmPrefs.get(this).isEnabledFor(cm.getActiveNetworkInfo())) { + NetworkInfo activeNetworkInfo = cm.getActiveNetworkInfo(); + activeNetworkPref = GcmPrefs.get(this).getNetworkPrefForInfo(activeNetworkInfo); + if (!GcmPrefs.get(this).isEnabledFor(activeNetworkInfo)) { + logd(this, "Don't connect, because disabled for " + activeNetworkInfo.getTypeName()); scheduleReconnect(this); return; } + wasTornDown = false; logd(this, "Starting MCS connection..."); Socket socket = new Socket(SERVICE_HOST, SERVICE_PORT); @@ -448,6 +464,7 @@ public class McsService extends Service implements Handler.Callback { outputStream.start(); startTimestamp = System.currentTimeMillis(); + lastHeartbeatPingElapsedRealtime = SystemClock.elapsedRealtime(); lastHeartbeatAckElapsedRealtime = SystemClock.elapsedRealtime(); lastIncomingNetworkRealtime = SystemClock.elapsedRealtime(); scheduleHeartbeat(this); @@ -633,6 +650,12 @@ public class McsService extends Service implements Handler.Callback { case MSG_INPUT_ERROR: case MSG_OUTPUT_ERROR: logd(this, "I/O error: " + msg.obj); + if (msg.obj instanceof SocketException) { + SocketException e = (SocketException) msg.obj; + if ("Connection reset".equals(e.getMessage())) { + GcmPrefs.get(this).learnTimeout(this, activeNetworkPref); + } + } rootHandler.sendMessage(rootHandler.obtainMessage(MSG_TEARDOWN, msg.obj)); return true; case MSG_TEARDOWN: @@ -653,6 +676,7 @@ public class McsService extends Service implements Handler.Callback { ping.last_stream_id_received(inputStream.getStreamId()); } send(MCS_HEARTBEAT_PING_TAG, ping.build()); + lastHeartbeatPingElapsedRealtime = SystemClock.elapsedRealtime(); scheduleHeartbeat(this); } else { logd(this, "Ignoring heartbeat, not connected!"); @@ -683,7 +707,7 @@ public class McsService extends Service implements Handler.Callback { handleOutputDone(msg); return true; } - Log.w(TAG, "Unknown message: " + msg); + Log.w(TAG, "Unknown message (" + msg.what + "): " + msg); return false; } @@ -717,6 +741,7 @@ public class McsService extends Service implements Handler.Callback { resetCurrentDelay(); lastIncomingNetworkRealtime = SystemClock.elapsedRealtime(); } catch (Exception e) { + Log.w(TAG, "Exception when handling input: " + message, e); rootHandler.sendMessage(rootHandler.obtainMessage(MSG_TEARDOWN, e)); } } @@ -731,6 +756,7 @@ public class McsService extends Service implements Handler.Callback { } private static void closeAll() { + logd(null, "Closing all sockets..."); tryClose(inputStream); tryClose(outputStream); if (sslSocket != null) { @@ -742,6 +768,14 @@ public class McsService extends Service implements Handler.Callback { } private void handleTeardown(android.os.Message msg) { + if (wasTornDown) { + // This can get called multiple times from different places via MSG_TEARDOWN + // this causes the reconnect delay to increase with each call to scheduleReconnect(), + // increasing the time we are disconnected. + logd(this, "Was torn down already, not doing it again"); + return; + } + wasTornDown = true; closeAll(); scheduleReconnect(this); diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/PushRegisterManager.java b/play-services-core/src/main/java/org/microg/gms/gcm/PushRegisterManager.java index 7dab2ca8..1dcfec44 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/PushRegisterManager.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/PushRegisterManager.java @@ -16,6 +16,12 @@ package org.microg.gms.gcm; +import static org.microg.gms.gcm.GcmConstants.ERROR_SERVICE_NOT_AVAILABLE; +import static org.microg.gms.gcm.GcmConstants.EXTRA_ERROR; +import static org.microg.gms.gcm.GcmConstants.EXTRA_REGISTRATION_ID; +import static org.microg.gms.gcm.GcmConstants.EXTRA_RETRY_AFTER; +import static org.microg.gms.gcm.GcmConstants.EXTRA_UNREGISTERED; + import android.content.Context; import android.os.Bundle; import android.util.Log; @@ -23,16 +29,9 @@ import android.util.Log; import org.microg.gms.checkin.LastCheckinInfo; import org.microg.gms.common.HttpFormClient; import org.microg.gms.common.PackageUtils; -import org.microg.gms.common.Utils; import java.io.IOException; -import static org.microg.gms.gcm.GcmConstants.ERROR_SERVICE_NOT_AVAILABLE; -import static org.microg.gms.gcm.GcmConstants.EXTRA_ERROR; -import static org.microg.gms.gcm.GcmConstants.EXTRA_REGISTRATION_ID; -import static org.microg.gms.gcm.GcmConstants.EXTRA_RETRY_AFTER; -import static org.microg.gms.gcm.GcmConstants.EXTRA_UNREGISTERED; - public class PushRegisterManager { private static final String TAG = "GmsGcmRegisterMgr"; @@ -41,7 +40,7 @@ public class PushRegisterManager { RegisterResponse response = new RegisterResponse(); try { response = new RegisterRequest() - .build(Utils.getBuild(context)) + .build(context) .sender(sender) .info(info) .checkin(LastCheckinInfo.read(context)) diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/RegisterRequest.java b/play-services-core/src/main/java/org/microg/gms/gcm/RegisterRequest.java index 43f04028..dbc21088 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/RegisterRequest.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/RegisterRequest.java @@ -16,21 +16,23 @@ package org.microg.gms.gcm; +import static org.microg.gms.common.HttpFormClient.RequestContent; +import static org.microg.gms.common.HttpFormClient.RequestContentDynamic; +import static org.microg.gms.common.HttpFormClient.RequestHeader; + +import android.content.Context; import android.os.Bundle; import android.text.TextUtils; import org.microg.gms.checkin.LastCheckinInfo; -import org.microg.gms.common.Build; import org.microg.gms.common.HttpFormClient; +import org.microg.gms.profile.Build; +import org.microg.gms.profile.ProfileManager; import java.io.IOException; import java.util.LinkedHashMap; import java.util.Map; -import static org.microg.gms.common.HttpFormClient.RequestContent; -import static org.microg.gms.common.HttpFormClient.RequestContentDynamic; -import static org.microg.gms.common.HttpFormClient.RequestHeader; - public class RegisterRequest extends HttpFormClient.Request { private static final String SERVICE_URL = "https://android.clients.google.com/c2dm/register3"; private static final String USER_AGENT = "Android-GCM/1.5 (%s %s)"; @@ -61,7 +63,7 @@ public class RegisterRequest extends HttpFormClient.Request { @RequestContent("target_ver") public Integer sdkVersion; @RequestContentDynamic - private Map extraParams = new LinkedHashMap<>(); + private final Map extraParams = new LinkedHashMap<>(); @Override public void prepare() { @@ -103,9 +105,10 @@ public class RegisterRequest extends HttpFormClient.Request { return this; } - public RegisterRequest build(Build build) { - deviceName = build.device; - buildVersion = build.id; + public RegisterRequest build(Context context) { + ProfileManager.ensureInitialized(context); + deviceName = Build.DEVICE; + buildVersion = Build.ID; return this; } diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/RegisterResponse.java b/play-services-core/src/main/java/org/microg/gms/gcm/RegisterResponse.java index 6d35560c..3bc5eba6 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/RegisterResponse.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/RegisterResponse.java @@ -16,11 +16,11 @@ package org.microg.gms.gcm; +import static org.microg.gms.common.HttpFormClient.ResponseField; + import org.microg.gms.common.HttpFormClient.ResponseHeader; import org.microg.gms.common.HttpFormClient.ResponseStatusText; -import static org.microg.gms.common.HttpFormClient.ResponseField; - public class RegisterResponse { @ResponseField("token") public String token; diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/SendReceiver.java b/play-services-core/src/main/java/org/microg/gms/gcm/SendReceiver.java index b2d1067a..2a6ac115 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/SendReceiver.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/SendReceiver.java @@ -16,6 +16,8 @@ package org.microg.gms.gcm; +import static org.microg.gms.gcm.McsConstants.ACTION_SEND; + import android.content.Context; import android.content.Intent; import android.os.Bundle; @@ -23,8 +25,6 @@ import android.util.Log; import androidx.legacy.content.WakefulBroadcastReceiver; -import static org.microg.gms.gcm.McsConstants.ACTION_SEND; - public class SendReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/TriggerReceiver.java b/play-services-core/src/main/java/org/microg/gms/gcm/TriggerReceiver.java index 3be427c3..245d5c2a 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/TriggerReceiver.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/TriggerReceiver.java @@ -16,6 +16,12 @@ package org.microg.gms.gcm; +import static android.os.Build.VERSION.SDK_INT; +import static android.os.Build.VERSION_CODES.N; +import static org.microg.gms.gcm.McsConstants.ACTION_CONNECT; +import static org.microg.gms.gcm.McsConstants.ACTION_HEARTBEAT; +import static org.microg.gms.gcm.McsConstants.EXTRA_REASON; + import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -25,15 +31,10 @@ import android.util.Log; import androidx.legacy.content.WakefulBroadcastReceiver; +import org.microg.gms.checkin.CheckinPrefs; import org.microg.gms.checkin.LastCheckinInfo; import org.microg.gms.common.ForegroundServiceContext; -import static android.os.Build.VERSION.SDK_INT; -import static android.os.Build.VERSION_CODES.N; -import static org.microg.gms.gcm.McsConstants.ACTION_CONNECT; -import static org.microg.gms.gcm.McsConstants.ACTION_HEARTBEAT; -import static org.microg.gms.gcm.McsConstants.EXTRA_REASON; - public class TriggerReceiver extends WakefulBroadcastReceiver { private static final String TAG = "GmsGcmTrigger"; public static final String FORCE_TRY_RECONNECT = "org.microg.gms.gcm.FORCE_TRY_RECONNECT"; @@ -67,6 +68,14 @@ public class TriggerReceiver extends WakefulBroadcastReceiver { if (LastCheckinInfo.read(context).getAndroidId() == 0) { Log.d(TAG, "Ignoring " + intent + ": need to checkin first."); + if (CheckinPrefs.isEnabled(context)) { + // Do a check-in if we are not actually checked in, + // but should be, e.g. cleared app data + Log.d(TAG, "Requesting check-in..."); + String action = "android.server.checkin.CHECKIN"; + Class clazz = org.microg.gms.checkin.TriggerReceiver.class; + context.sendBroadcast(new Intent(action, null, context, clazz)); + } return; } diff --git a/play-services-core/src/main/java/org/microg/gms/gcm/UnregisterReceiver.java b/play-services-core/src/main/java/org/microg/gms/gcm/UnregisterReceiver.java index ebc3cf72..28a72d10 100644 --- a/play-services-core/src/main/java/org/microg/gms/gcm/UnregisterReceiver.java +++ b/play-services-core/src/main/java/org/microg/gms/gcm/UnregisterReceiver.java @@ -1,5 +1,11 @@ package org.microg.gms.gcm; +import static android.content.Intent.ACTION_PACKAGE_DATA_CLEARED; +import static android.content.Intent.ACTION_PACKAGE_FULLY_REMOVED; +import static android.content.Intent.ACTION_PACKAGE_REMOVED; +import static android.content.Intent.EXTRA_DATA_REMOVED; +import static android.content.Intent.EXTRA_REPLACING; + import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -7,12 +13,6 @@ import android.util.Log; import java.util.List; -import static android.content.Intent.ACTION_PACKAGE_REMOVED; -import static android.content.Intent.ACTION_PACKAGE_DATA_CLEARED; -import static android.content.Intent.ACTION_PACKAGE_FULLY_REMOVED; -import static android.content.Intent.EXTRA_DATA_REMOVED; -import static android.content.Intent.EXTRA_REPLACING; - public class UnregisterReceiver extends BroadcastReceiver { private static final String TAG = "GmsGcmUnregisterRcvr"; diff --git a/play-services-core/src/main/java/org/microg/gms/gservices/GServicesProvider.java b/play-services-core/src/main/java/org/microg/gms/gservices/GServicesProvider.java index 2382814d..ea2cf938 100644 --- a/play-services-core/src/main/java/org/microg/gms/gservices/GServicesProvider.java +++ b/play-services-core/src/main/java/org/microg/gms/gservices/GServicesProvider.java @@ -18,16 +18,12 @@ package org.microg.gms.gservices; import android.content.ContentProvider; import android.content.ContentValues; -import android.content.Intent; import android.database.Cursor; import android.database.MatrixCursor; import android.net.Uri; import android.os.Build; import android.util.Log; -import org.microg.gms.checkin.CheckinPrefs; -import org.microg.gms.gcm.GcmPrefs; - import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -50,8 +46,8 @@ public class GServicesProvider extends ContentProvider { private static final String TAG = "GmsServicesProvider"; private DatabaseHelper databaseHelper; - private Map cache = new HashMap<>(); - private Set cachedPrefixes = new HashSet<>(); + private final Map cache = new HashMap<>(); + private final Set cachedPrefixes = new HashSet<>(); @Override public boolean onCreate() { diff --git a/play-services-core/src/main/java/org/microg/gms/icing/IndexService.java b/play-services-core/src/main/java/org/microg/gms/icing/IndexService.java index 6401e6ab..03ae062a 100644 --- a/play-services-core/src/main/java/org/microg/gms/icing/IndexService.java +++ b/play-services-core/src/main/java/org/microg/gms/icing/IndexService.java @@ -27,10 +27,10 @@ import org.microg.gms.BaseService; import org.microg.gms.common.GmsService; public class IndexService extends BaseService { - private AppDataSearchImpl appDataSearch = new AppDataSearchImpl(); - private GlobalSearchAdminImpl globalSearchAdmin = new GlobalSearchAdminImpl(); - private SearchCorporaImpl searchCorpora = new SearchCorporaImpl(); - private SearchQueriesImpl searchQueries = new SearchQueriesImpl(); + private final AppDataSearchImpl appDataSearch = new AppDataSearchImpl(); + private final GlobalSearchAdminImpl globalSearchAdmin = new GlobalSearchAdminImpl(); + private final SearchCorporaImpl searchCorpora = new SearchCorporaImpl(); + private final SearchQueriesImpl searchQueries = new SearchQueriesImpl(); public IndexService() { super("GmsIcingIndexSvc", diff --git a/play-services-core/src/main/java/org/microg/gms/icing/LightweightIndexService.java b/play-services-core/src/main/java/org/microg/gms/icing/LightweightIndexService.java index 2715c6ba..d84e1e22 100644 --- a/play-services-core/src/main/java/org/microg/gms/icing/LightweightIndexService.java +++ b/play-services-core/src/main/java/org/microg/gms/icing/LightweightIndexService.java @@ -25,7 +25,7 @@ import org.microg.gms.BaseService; import org.microg.gms.common.GmsService; public class LightweightIndexService extends BaseService { - private LightweightAppDataSearchImpl appDataSearch = new LightweightAppDataSearchImpl(); + private final LightweightAppDataSearchImpl appDataSearch = new LightweightAppDataSearchImpl(); public LightweightIndexService() { super("GmsIcingLightIndexSvc", GmsService.LIGHTWEIGHT_INDEX); diff --git a/play-services-core/src/main/java/org/microg/gms/icing/SearchCorporaImpl.java b/play-services-core/src/main/java/org/microg/gms/icing/SearchCorporaImpl.java index fa61dedb..00e60006 100644 --- a/play-services-core/src/main/java/org/microg/gms/icing/SearchCorporaImpl.java +++ b/play-services-core/src/main/java/org/microg/gms/icing/SearchCorporaImpl.java @@ -38,7 +38,7 @@ public class SearchCorporaImpl extends ISearchCorporaService.Stub { private static final String TAG = "GmsIcingCorporaImpl"; // We count the sequence number here to make clients happy. - private Map corpusSequenceNumbers = new HashMap(); + private final Map corpusSequenceNumbers = new HashMap(); @Override public void requestIndexing(RequestIndexingRequest request, ISearchCorporaCallbacks callbacks) throws RemoteException { diff --git a/play-services-core/src/main/java/org/microg/gms/location/GoogleLocationManager.java b/play-services-core/src/main/java/org/microg/gms/location/GoogleLocationManager.java index 5742cb49..f90831a4 100644 --- a/play-services-core/src/main/java/org/microg/gms/location/GoogleLocationManager.java +++ b/play-services-core/src/main/java/org/microg/gms/location/GoogleLocationManager.java @@ -16,14 +16,26 @@ package org.microg.gms.location; +import static android.Manifest.permission.ACCESS_COARSE_LOCATION; +import static android.Manifest.permission.ACCESS_FINE_LOCATION; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; +import static android.location.LocationManager.GPS_PROVIDER; +import static com.google.android.gms.location.LocationRequest.PRIORITY_HIGH_ACCURACY; + import android.Manifest; import android.app.PendingIntent; import android.content.Context; import android.location.Location; import android.location.LocationManager; import android.os.Binder; +import android.os.Handler; +import android.os.Looper; import android.os.RemoteException; +import android.util.Log; +import androidx.lifecycle.Lifecycle; + +import com.google.android.gms.common.api.Status; import com.google.android.gms.location.ILocationListener; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.internal.FusedLocationProviderResult; @@ -32,25 +44,26 @@ import com.google.android.gms.location.internal.LocationRequestUpdateData; import org.microg.gms.common.PackageUtils; import org.microg.gms.common.Utils; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; -import static android.Manifest.permission.ACCESS_COARSE_LOCATION; -import static android.Manifest.permission.ACCESS_FINE_LOCATION; -import static android.content.pm.PackageManager.PERMISSION_GRANTED; -import static android.location.LocationManager.GPS_PROVIDER; -import static com.google.android.gms.location.LocationRequest.PRIORITY_HIGH_ACCURACY; - public class GoogleLocationManager implements LocationChangeListener { + private static final String TAG = "LocationManager"; + private static final String MOCK_PROVIDER = "mock"; + private static final long VERIFY_CURRENT_REQUESTS_INTERVAL_MS = 5000; // 5 seconds private static final long SWITCH_ON_FRESHNESS_CLIFF_MS = 30000; // 30 seconds private static final String ACCESS_MOCK_LOCATION = "android.permission.ACCESS_MOCK_LOCATION"; private final Context context; + private final Handler handler; + private final Runnable verifyCurrentRequestsRunnable = this::verifyCurrentRequests; private final RealLocationProvider gpsProvider; private final MockLocationProvider mockProvider; private final List currentRequests = new ArrayList(); - public GoogleLocationManager(Context context) { + public GoogleLocationManager(Context context, Lifecycle lifecycle) { + long callingIdentity = Binder.clearCallingIdentity(); this.context = context; LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); if (Utils.hasSelfPermissionOrNotify(context, Manifest.permission.ACCESS_FINE_LOCATION)) { @@ -59,6 +72,12 @@ public class GoogleLocationManager implements LocationChangeListener { this.gpsProvider = null; } mockProvider = new MockLocationProvider(this); + handler = new Handler(Looper.getMainLooper()); + Binder.restoreCallingIdentity(callingIdentity); + } + + public void invokeOnceReady(Runnable runnable) { + } public Location getLastLocation(String packageName) { @@ -68,23 +87,6 @@ public class GoogleLocationManager implements LocationChangeListener { public Location getLocation(boolean gpsPermission, boolean networkPermission) { if (mockProvider.getLocation() != null) return mockProvider.getLocation(); - if (gpsPermission) { - Location network = null; - Location gps = gpsProvider == null ? null : gpsProvider.getLastLocation(); - if (network == null) - return gps; - if (gps == null) - return network; - if (gps.getTime() > network.getTime() - SWITCH_ON_FRESHNESS_CLIFF_MS) - return gps; - return network; - } else if (networkPermission) { - Location network = null; - if (network != null && network.getExtras() != null && network.getExtras().getParcelable("no_gps_location") instanceof Location) { - network = network.getExtras().getParcelable("no_gps_location"); - } - return network; - } return null; } @@ -109,14 +111,20 @@ public class GoogleLocationManager implements LocationChangeListener { } } if (old != null) { + Log.d(TAG, "Removing replaced location request: " + old); currentRequests.remove(old); } currentRequests.add(request); if (gpsProvider != null && request.hasFinePermission() && request.locationRequest.getPriority() == PRIORITY_HIGH_ACCURACY) { + Log.d(TAG, "Registering request with high accuracy location provider"); gpsProvider.addRequest(request); } else if (gpsProvider != null && old != null) { + Log.d(TAG, "Unregistering request with high accuracy location provider"); gpsProvider.removeRequest(old); + } else { + Log.w(TAG, "Not providing high accuracy location: missing permission"); } + handler.postDelayed(this::onLocationChanged, request.locationRequest.getFastestInterval()); } public void requestLocationUpdates(LocationRequest request, ILocationListener listener, String packageName) { @@ -151,25 +159,41 @@ public class GoogleLocationManager implements LocationChangeListener { } public void updateLocationRequest(LocationRequestUpdateData data) { - String packageName = PackageUtils.getCallingPackage(context); - if (data.pendingIntent != null) - packageName = PackageUtils.packageFromPendingIntent(data.pendingIntent); - if (data.opCode == LocationRequestUpdateData.REQUEST_UPDATES) { - requestLocationUpdates(new LocationRequestHelper(context, packageName, Binder.getCallingUid(), data)); - } else if (data.opCode == LocationRequestUpdateData.REMOVE_UPDATES) { - for (int i = 0; i < currentRequests.size(); i++) { - if (currentRequests.get(i).respondsTo(data.listener) - || currentRequests.get(i).respondsTo(data.pendingIntent) - || currentRequests.get(i).respondsTo(data.callback)) { - removeLocationUpdates(currentRequests.get(i)); - i--; + try { + Log.d(TAG, "updateLocationRequest: " + data); + String packageName = PackageUtils.getCallingPackage(context); + if (data.pendingIntent != null) + packageName = PackageUtils.packageFromPendingIntent(data.pendingIntent); + Log.d(TAG, "Using source package: " + packageName); + if (data.opCode == LocationRequestUpdateData.REQUEST_UPDATES) { + requestLocationUpdates(new LocationRequestHelper(context, packageName, Binder.getCallingUid(), data)); + } else if (data.opCode == LocationRequestUpdateData.REMOVE_UPDATES) { + for (int i = 0; i < currentRequests.size(); i++) { + if (currentRequests.get(i).respondsTo(data.listener) + || currentRequests.get(i).respondsTo(data.pendingIntent) + || currentRequests.get(i).respondsTo(data.callback)) { + removeLocationUpdates(currentRequests.get(i)); + i--; + } } } - } - if (data.fusedLocationProviderCallback != null) { - try { - data.fusedLocationProviderCallback.onFusedLocationProviderResult(FusedLocationProviderResult.SUCCESS); - } catch (RemoteException ignored) { + Log.d(TAG, "Updated current requests, verifying"); + verifyCurrentRequests(); + if (data.fusedLocationProviderCallback != null) { + try { + Log.d(TAG, "Send success result to " + packageName); + data.fusedLocationProviderCallback.onFusedLocationProviderResult(FusedLocationProviderResult.SUCCESS); + } catch (RemoteException ignored) { + } + } + } catch (Exception e) { + Log.w(TAG, "Exception in updateLocationRequest", e); + if (data.fusedLocationProviderCallback != null) { + try { + Log.d(TAG, "Send internal error result"); + data.fusedLocationProviderCallback.onFusedLocationProviderResult(FusedLocationProviderResult.create(Status.INTERNAL_ERROR)); + } catch (RemoteException ignored) { + } } } } @@ -186,6 +210,22 @@ public class GoogleLocationManager implements LocationChangeListener { mockProvider.setLocation(mockLocation); } + private void verifyCurrentRequests() { + handler.removeCallbacks(verifyCurrentRequestsRunnable); + try { + for (int i = 0; i < currentRequests.size(); i++) { + LocationRequestHelper request = currentRequests.get(i); + if (!request.isActive()) { + removeLocationUpdates(request); + i--; + } + } + } catch (Exception e) { + Log.w(TAG, e); + } + handler.postDelayed(verifyCurrentRequestsRunnable, VERIFY_CURRENT_REQUESTS_INTERVAL_MS); + } + @Override public void onLocationChanged() { for (int i = 0; i < currentRequests.size(); i++) { @@ -196,4 +236,12 @@ public class GoogleLocationManager implements LocationChangeListener { } } } + + public void dump(PrintWriter writer) { + if (gpsProvider != null) gpsProvider.dump(writer); + writer.println(currentRequests.size() + " requests:"); + for (LocationRequestHelper request : currentRequests) { + writer.println(" " + request.id + " package=" + request.packageName + " interval=" + request.locationRequest.getInterval() + " smallestDisplacement=" + request.locationRequest.getSmallestDisplacement()); + } + } } diff --git a/play-services-core/src/main/java/org/microg/gms/location/GoogleLocationManagerService.java b/play-services-core/src/main/java/org/microg/gms/location/GoogleLocationManagerService.java index e2906b1c..0f2a7e20 100644 --- a/play-services-core/src/main/java/org/microg/gms/location/GoogleLocationManagerService.java +++ b/play-services-core/src/main/java/org/microg/gms/location/GoogleLocationManagerService.java @@ -17,7 +17,6 @@ package org.microg.gms.location; import android.os.RemoteException; -import android.util.Log; import com.google.android.gms.common.internal.GetServiceRequest; import com.google.android.gms.common.internal.IGmsCallbacks; @@ -25,15 +24,23 @@ import com.google.android.gms.common.internal.IGmsCallbacks; import org.microg.gms.BaseService; import org.microg.gms.common.GmsService; +import java.io.FileDescriptor; +import java.io.PrintWriter; + public class GoogleLocationManagerService extends BaseService { - private GoogleLocationManagerServiceImpl impl = new GoogleLocationManagerServiceImpl(this); + private final GoogleLocationManagerServiceImpl impl = new GoogleLocationManagerServiceImpl(this, getLifecycle()); public GoogleLocationManagerService() { - super("GmsLocManagerSvc", GmsService.LOCATION_MANAGER, GmsService.GEODATA, GmsService.PLACE_DETECTION); + super("LocationManager", GmsService.LOCATION_MANAGER, GmsService.GEODATA, GmsService.PLACE_DETECTION); } @Override public void handleServiceRequest(IGmsCallbacks callback, GetServiceRequest request, GmsService service) throws RemoteException { } + + @Override + protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) { + impl.getLocationManager().dump(writer); + } } diff --git a/play-services-core/src/main/java/org/microg/gms/location/GoogleLocationManagerServiceImpl.java b/play-services-core/src/main/java/org/microg/gms/location/GoogleLocationManagerServiceImpl.java index 31ac74a3..8169a4c7 100644 --- a/play-services-core/src/main/java/org/microg/gms/location/GoogleLocationManagerServiceImpl.java +++ b/play-services-core/src/main/java/org/microg/gms/location/GoogleLocationManagerServiceImpl.java @@ -20,12 +20,19 @@ import android.app.PendingIntent; import android.content.Context; import android.location.Location; import android.os.Binder; +import android.os.Handler; import android.os.IBinder; +import android.os.Looper; import android.os.Parcel; import android.os.RemoteException; import android.util.Log; +import androidx.annotation.NonNull; +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleOwner; + import com.google.android.gms.common.api.Status; +import com.google.android.gms.common.api.internal.IStatusCallback; import com.google.android.gms.location.ActivityRecognitionResult; import com.google.android.gms.location.GeofencingRequest; import com.google.android.gms.location.GestureRequest; @@ -35,6 +42,7 @@ import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationSettingsRequest; import com.google.android.gms.location.LocationSettingsResult; import com.google.android.gms.location.LocationSettingsStates; +import com.google.android.gms.location.internal.DeviceOrientationRequestUpdateData; import com.google.android.gms.location.internal.IGeofencerCallbacks; import com.google.android.gms.location.internal.IGoogleLocationManagerService; import com.google.android.gms.location.internal.ISettingsCallbacks; @@ -58,19 +66,31 @@ import org.microg.gms.common.PackageUtils; import java.util.Arrays; import java.util.List; -public class GoogleLocationManagerServiceImpl extends IGoogleLocationManagerService.Stub { +public class GoogleLocationManagerServiceImpl extends IGoogleLocationManagerService.Stub implements LifecycleOwner { private static final String TAG = "GmsLocManagerSvcImpl"; private final Context context; + private final Lifecycle lifecycle; private GoogleLocationManager locationManager; - public GoogleLocationManagerServiceImpl(Context context) { + public GoogleLocationManagerServiceImpl(Context context, Lifecycle lifecycle) { this.context = context; + this.lifecycle = lifecycle; } - private GoogleLocationManager getLocationManager() { + @NonNull + @Override + public Lifecycle getLifecycle() { + return lifecycle; + } + + public void invokeOnceReady(Runnable runnable) { + getLocationManager().invokeOnceReady(runnable); + } + + public synchronized GoogleLocationManager getLocationManager() { if (locationManager == null) - locationManager = new GoogleLocationManager(context); + locationManager = new GoogleLocationManager(context, lifecycle); return locationManager; } @@ -119,18 +139,6 @@ public class GoogleLocationManagerServiceImpl extends IGoogleLocationManagerServ return null; } - @Override - public Status iglms65(PendingIntent pendingIntent) throws RemoteException { - Log.d(TAG, "iglms65"); - return null; - } - - @Override - public Status iglms66(PendingIntent pendingIntent) throws RemoteException { - Log.d(TAG, "iglms66"); - return null; - } - @Override public Status requestGestureUpdates(GestureRequest request, PendingIntent pendingIntent) throws RemoteException { Log.d(TAG, "requestGestureUpdates"); @@ -195,6 +203,11 @@ public class GoogleLocationManagerServiceImpl extends IGoogleLocationManagerServ getLocationManager().setMockLocation(mockLocation); } + @Override + public void injectLocation(Location mockLocation, int injectionType) throws RemoteException { + Log.d(TAG, "injectLocation[" + injectionType + "]: " + mockLocation); + } + @Override public void iglms14(LatLngBounds var1, int var2, PlaceFilter var3, PlacesParams var4, IPlacesCallbacks var5) throws RemoteException { @@ -246,13 +259,14 @@ public class GoogleLocationManagerServiceImpl extends IGoogleLocationManagerServ } @Override - public void iglms25(PlaceReport var1, PlacesParams var2) throws RemoteException { - Log.d(TAG, "iglms25: " + var1); + public Location getLastLocationWith(String s) throws RemoteException { + Log.d(TAG, "getLastLocationWith: " + s); + return getLastLocation(); } @Override - public void iglms26(Location var1, int var2) throws RemoteException { - Log.d(TAG, "iglms26: " + var1); + public void iglms25(PlaceReport var1, PlacesParams var2) throws RemoteException { + Log.d(TAG, "iglms25: " + var1); } @Override @@ -262,6 +276,11 @@ public class GoogleLocationManagerServiceImpl extends IGoogleLocationManagerServ return new LocationAvailability(); } + @Override + public void removeSleepSegmentUpdates(PendingIntent pendingIntent, IStatusCallback callback) throws RemoteException { + Log.d(TAG, "removeSleepSegmentUpdates"); + } + @Override public void iglms42(String var1, PlacesParams var2, IPlacesCallbacks var3) throws RemoteException { @@ -307,7 +326,29 @@ public class GoogleLocationManagerServiceImpl extends IGoogleLocationManagerServ public void requestLocationSettingsDialog(LocationSettingsRequest settingsRequest, ISettingsCallbacks callback, String packageName) throws RemoteException { Log.d(TAG, "requestLocationSettingsDialog: " + settingsRequest); PackageUtils.getAndCheckCallingPackage(context, packageName); - callback.onLocationSettingsResult(new LocationSettingsResult(new LocationSettingsStates(true, true, false, true, true, false), Status.SUCCESS)); + (new Handler(Looper.getMainLooper())).post(() -> { + try { + callback.onLocationSettingsResult(new LocationSettingsResult(new LocationSettingsStates(true, true, true, true, true, true), Status.SUCCESS)); + } catch (RemoteException e) { + Log.w(TAG, e); + } + }); + } + + @Override + public void removeActivityTransitionUpdates(PendingIntent pendingIntent, IStatusCallback callback) throws RemoteException { + Log.d(TAG, "removeActivityTransitionUpdates"); + } + + @Override + public void updateDeviceOrientationRequest(DeviceOrientationRequestUpdateData request) throws RemoteException { + Log.d(TAG, "updateDeviceOrientationRequest: " + request); + } + + @Override + public boolean setActivityRecognitionMode(int mode) throws RemoteException { + Log.d(TAG, "setActivityRecognitionMode: " + mode); + return false; } @Override @@ -348,6 +389,37 @@ public class GoogleLocationManagerServiceImpl extends IGoogleLocationManagerServ Log.d(TAG, "iglms58: " + var1); } + @Override + public void iglms65(PendingIntent pendingIntent, IStatusCallback callback) throws RemoteException { + Log.d(TAG, "iglms65"); + } + + @Override + public void iglms66(PendingIntent pendingIntent, IStatusCallback callback) throws RemoteException { + Log.d(TAG, "iglms66"); + } + + @Override + public void iglms68(PendingIntent pendingIntent, IStatusCallback callback) throws RemoteException { + Log.d(TAG, "iglms68"); + } + + @Override + public void iglms71(IStatusCallback callback) throws RemoteException { + Log.d(TAG, "iglms71"); + } + + @Override + public void iglms76(PendingIntent pendingIntent) throws RemoteException { + Log.d(TAG, "iglms76"); + } + + @Override + public int iglms78() throws RemoteException { + Log.d(TAG, "iglms78"); + return 0; + } + @Override public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { if (super.onTransact(code, data, reply, flags)) return true; diff --git a/play-services-core/src/main/java/org/microg/gms/location/LocationChangeListener.java b/play-services-core/src/main/java/org/microg/gms/location/LocationChangeListener.java index f574746d..01129d23 100644 --- a/play-services-core/src/main/java/org/microg/gms/location/LocationChangeListener.java +++ b/play-services-core/src/main/java/org/microg/gms/location/LocationChangeListener.java @@ -17,5 +17,5 @@ package org.microg.gms.location; public interface LocationChangeListener { - public void onLocationChanged(); + void onLocationChanged(); } diff --git a/play-services-core/src/main/java/org/microg/gms/location/LocationRequestHelper.java b/play-services-core/src/main/java/org/microg/gms/location/LocationRequestHelper.java index 24daa598..8b4da91c 100644 --- a/play-services-core/src/main/java/org/microg/gms/location/LocationRequestHelper.java +++ b/play-services-core/src/main/java/org/microg/gms/location/LocationRequestHelper.java @@ -16,6 +16,9 @@ package org.microg.gms.location; +import static android.Manifest.permission.ACCESS_COARSE_LOCATION; +import static android.Manifest.permission.ACCESS_FINE_LOCATION; + import android.annotation.TargetApi; import android.app.AppOpsManager; import android.app.PendingIntent; @@ -35,9 +38,7 @@ import com.google.android.gms.location.LocationResult; import com.google.android.gms.location.internal.LocationRequestUpdateData; import java.util.Arrays; - -import static android.Manifest.permission.ACCESS_COARSE_LOCATION; -import static android.Manifest.permission.ACCESS_FINE_LOCATION; +import java.util.UUID; public class LocationRequestHelper { public static final String TAG = "GmsLocRequestHelper"; @@ -51,6 +52,7 @@ public class LocationRequestHelper { public ILocationListener listener; public PendingIntent pendingIntent; public ILocationCallback callback; + public String id = UUID.randomUUID().toString(); private Location lastReport; private int numReports = 0; @@ -84,17 +86,41 @@ public class LocationRequestHelper { this.callback = data.callback; } + public boolean isActive() { + if (!hasCoarsePermission()) return false; + if (listener != null) { + try { + return listener.asBinder().isBinderAlive(); + } catch (Exception e) { + return false; + } + } else if (pendingIntent != null) { + return true; + } else if (callback != null) { + try { + return callback.asBinder().isBinderAlive(); + } catch (Exception e) { + return false; + } + } else { + return false; + } + } + /** * @return whether to continue sending reports to this {@link LocationRequestHelper} */ public boolean report(Location location) { if (location == null) return true; - if (!hasCoarsePermission()) return false; + if (!isActive()) return false; if (lastReport != null) { + if (location.equals(lastReport)) { + return true; + } if (location.getTime() - lastReport.getTime() < locationRequest.getFastestInterval()) { return true; } - if (location.distanceTo(lastReport) < locationRequest.getSmallestDesplacement()) { + if (location.distanceTo(lastReport) < locationRequest.getSmallestDisplacement()) { return true; } } diff --git a/play-services-core/src/main/java/org/microg/gms/location/MockLocationProvider.java b/play-services-core/src/main/java/org/microg/gms/location/MockLocationProvider.java index bdeb7318..b8d90223 100644 --- a/play-services-core/src/main/java/org/microg/gms/location/MockLocationProvider.java +++ b/play-services-core/src/main/java/org/microg/gms/location/MockLocationProvider.java @@ -16,11 +16,11 @@ package org.microg.gms.location; +import static org.microg.gms.location.LocationConstants.KEY_MOCK_LOCATION; + import android.location.Location; import android.os.Bundle; -import static org.microg.gms.location.LocationConstants.KEY_MOCK_LOCATION; - public class MockLocationProvider { private boolean mockEnabled = false; private Location mockLocation = null; diff --git a/play-services-core/src/main/java/org/microg/gms/location/RealLocationProvider.java b/play-services-core/src/main/java/org/microg/gms/location/RealLocationProvider.java index 98e1947a..c8e0a075 100644 --- a/play-services-core/src/main/java/org/microg/gms/location/RealLocationProvider.java +++ b/play-services-core/src/main/java/org/microg/gms/location/RealLocationProvider.java @@ -23,6 +23,7 @@ import android.os.Bundle; import android.os.Looper; import android.util.Log; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; @@ -41,10 +42,15 @@ public class RealLocationProvider { private float connectedMinDistance; private Location lastLocation; private final List requests = new ArrayList(); - private LocationListener listener = new LocationListener() { + private final LocationListener listener = new LocationListener() { @Override public void onLocationChanged(Location location) { - lastLocation = location; + lastLocation = new Location(location); + try { + lastLocation.getExtras().keySet(); // call to unparcel() + } catch (Exception e) { + // Sometimes we need to define the correct ClassLoader before unparcel(). Ignore those. + } changeListener.onLocationChanged(); } @@ -121,7 +127,7 @@ public class RealLocationProvider { StringBuilder sb = new StringBuilder(); for (LocationRequestHelper request : requests) { minTime = Math.min(request.locationRequest.getInterval(), minTime); - minDistance = Math.min(request.locationRequest.getSmallestDesplacement(), minDistance); + minDistance = Math.min(request.locationRequest.getSmallestDisplacement(), minDistance); if (sb.length() != 0) sb.append(", "); sb.append(request.packageName).append(":").append(request.locationRequest.getInterval()).append("ms"); } @@ -146,4 +152,16 @@ public class RealLocationProvider { connectedMinDistance = minDistance; } } + + public void dump(PrintWriter writer) { + if (writer != null) { + writer.println(name + " provider:"); + writer.println(" last location: " + lastLocation); + writer.println(" active: " + connected.get()); + if (connected.get()) { + writer.println(" interval: " + connectedMinTime); + writer.println(" distance: " + connectedMinDistance); + } + } + } } diff --git a/play-services-core/src/main/java/org/microg/gms/location/ReportingAndroidService.java b/play-services-core/src/main/java/org/microg/gms/location/ReportingAndroidService.java index d382cdcc..d9c5bda1 100644 --- a/play-services-core/src/main/java/org/microg/gms/location/ReportingAndroidService.java +++ b/play-services-core/src/main/java/org/microg/gms/location/ReportingAndroidService.java @@ -25,7 +25,7 @@ import org.microg.gms.BaseService; import org.microg.gms.common.GmsService; public class ReportingAndroidService extends BaseService { - private ReportingServiceImpl reportingService = new ReportingServiceImpl(); + private final ReportingServiceImpl reportingService = new ReportingServiceImpl(); public ReportingAndroidService() { super("GmsLocReportingSvc", GmsService.LOCATION_REPORTING); diff --git a/play-services-core/src/main/java/org/microg/gms/location/ReportingServiceImpl.java b/play-services-core/src/main/java/org/microg/gms/location/ReportingServiceImpl.java index c091cbde..f369f84e 100644 --- a/play-services-core/src/main/java/org/microg/gms/location/ReportingServiceImpl.java +++ b/play-services-core/src/main/java/org/microg/gms/location/ReportingServiceImpl.java @@ -17,6 +17,7 @@ package org.microg.gms.location; import android.accounts.Account; +import android.os.Parcel; import android.os.RemoteException; import android.util.Log; @@ -58,4 +59,15 @@ public class ReportingServiceImpl extends IReportingService.Stub { Log.d(TAG, "reportDeviceAtPlace"); return 0; } + + + @Override + public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { + if (super.onTransact(code, data, reply, flags)) { + return true; + } + + Log.d(TAG, "onTransact [unknown]: " + code + ", " + data + ", " + flags); + return false; + } } diff --git a/play-services-core/src/main/java/org/microg/gms/measurement/MeasurementBrokerService.java b/play-services-core/src/main/java/org/microg/gms/measurement/MeasurementBrokerService.java deleted file mode 100644 index 4cd9a0f8..00000000 --- a/play-services-core/src/main/java/org/microg/gms/measurement/MeasurementBrokerService.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2018 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. - */ - -package org.microg.gms.measurement; - -import android.os.RemoteException; -import android.util.Log; - -import com.google.android.gms.common.api.CommonStatusCodes; -import com.google.android.gms.common.api.Status; -import com.google.android.gms.common.internal.GetServiceRequest; -import com.google.android.gms.common.internal.IGmsCallbacks; - -import org.microg.gms.BaseService; -import org.microg.gms.common.GmsService; - -public class MeasurementBrokerService extends BaseService { - public MeasurementBrokerService() { - super("GmsMeasureBrokerSvc", GmsService.MEASUREMENT); - } - - @Override - public void handleServiceRequest(IGmsCallbacks callback, GetServiceRequest request, GmsService service) throws RemoteException { - callback.onPostInitComplete(CommonStatusCodes.SUCCESS, new MeasurementServiceImpl().asBinder(), null); - } -} diff --git a/play-services-core/src/main/java/org/microg/gms/measurement/MeasurementServiceImpl.java b/play-services-core/src/main/java/org/microg/gms/measurement/MeasurementServiceImpl.java deleted file mode 100644 index b6fbb62b..00000000 --- a/play-services-core/src/main/java/org/microg/gms/measurement/MeasurementServiceImpl.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2018 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. - */ - -package org.microg.gms.measurement; - -import android.os.Parcel; -import android.os.RemoteException; -import android.util.Log; - -import com.google.android.gms.measurement.internal.AppMetadata; -import com.google.android.gms.measurement.internal.ConditionalUserPropertyParcel; -import com.google.android.gms.measurement.internal.EventParcel; -import com.google.android.gms.measurement.internal.IMeasurementService; - -public class MeasurementServiceImpl extends IMeasurementService.Stub { - private static final String TAG = "GmsMeasureSvcImpl"; - - @Override - public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { - if (super.onTransact(code, data, reply, flags)) return true; - Log.d(TAG, "onTransact [unknown]: " + code + ", " + data + ", " + flags); - return false; - } - - @Override - public void f1(EventParcel p0, AppMetadata p1) throws RemoteException { - Log.d(TAG, "f1: " + p1.packageName); - } - - @Override - public void f4(AppMetadata p0) throws RemoteException { - Log.d(TAG, "f4: " + p0.packageName); - } - - @Override - public void f10(long p0, String p1, String p2, String p3) throws RemoteException { - Log.d(TAG, "f10: " + p1); - } - - @Override - public String f11(AppMetadata p0) throws RemoteException { - Log.d(TAG, "f11: " + p0.packageName); - return null; - } - - @Override - public void f12(ConditionalUserPropertyParcel p0, AppMetadata p1) throws RemoteException { - Log.d(TAG, "f12: " + p1.packageName); - } -} diff --git a/play-services-core/src/main/java/org/microg/gms/people/PeopleService.java b/play-services-core/src/main/java/org/microg/gms/people/PeopleService.java index 03f03b17..f894a6bd 100644 --- a/play-services-core/src/main/java/org/microg/gms/people/PeopleService.java +++ b/play-services-core/src/main/java/org/microg/gms/people/PeopleService.java @@ -25,7 +25,7 @@ import org.microg.gms.BaseService; import org.microg.gms.common.GmsService; public class PeopleService extends BaseService { - private PeopleServiceImpl impl = new PeopleServiceImpl(this); + private final PeopleServiceImpl impl = new PeopleServiceImpl(this); public PeopleService() { super("GmsPeopleSvc", GmsService.PEOPLE); diff --git a/play-services-core/src/main/java/org/microg/gms/playlog/PlayLogService.java b/play-services-core/src/main/java/org/microg/gms/playlog/PlayLogService.java index 28015345..1ee8a893 100644 --- a/play-services-core/src/main/java/org/microg/gms/playlog/PlayLogService.java +++ b/play-services-core/src/main/java/org/microg/gms/playlog/PlayLogService.java @@ -24,9 +24,10 @@ import com.google.android.gms.common.internal.IGmsCallbacks; import org.microg.gms.BaseService; import org.microg.gms.common.GmsService; +@Deprecated public class PlayLogService extends BaseService { - private PlayLogServiceImpl playLogService = new PlayLogServiceImpl(); + private final PlayLogServiceImpl playLogService = new PlayLogServiceImpl(); public PlayLogService() { super("GmsPlayLogSvc", GmsService.PLAY_LOG); diff --git a/play-services-core/src/main/java/org/microg/gms/playlog/PlayLogServiceImpl.java b/play-services-core/src/main/java/org/microg/gms/playlog/PlayLogServiceImpl.java index ddf82e44..833b264c 100644 --- a/play-services-core/src/main/java/org/microg/gms/playlog/PlayLogServiceImpl.java +++ b/play-services-core/src/main/java/org/microg/gms/playlog/PlayLogServiceImpl.java @@ -20,12 +20,13 @@ import android.os.Parcel; import android.os.RemoteException; import android.util.Log; +import com.google.android.gms.clearcut.internal.PlayLoggerContext; import com.google.android.gms.playlog.internal.IPlayLogService; import com.google.android.gms.playlog.internal.LogEvent; -import com.google.android.gms.playlog.internal.PlayLoggerContext; import java.util.List; +@Deprecated public class PlayLogServiceImpl extends IPlayLogService.Stub { private static final String TAG = "GmsPlayLogSvcImpl"; diff --git a/play-services-core/src/main/java/org/microg/gms/ui/AccountSettingsActivity.java b/play-services-core/src/main/java/org/microg/gms/ui/AccountSettingsActivity.java index 0804d384..f0901aec 100755 --- a/play-services-core/src/main/java/org/microg/gms/ui/AccountSettingsActivity.java +++ b/play-services-core/src/main/java/org/microg/gms/ui/AccountSettingsActivity.java @@ -16,6 +16,11 @@ package org.microg.gms.ui; +import static android.accounts.AccountManager.PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE; +import static android.accounts.AccountManager.VISIBILITY_USER_MANAGED_NOT_VISIBLE; +import static android.accounts.AccountManager.VISIBILITY_USER_MANAGED_VISIBLE; +import static org.microg.gms.auth.AuthManager.PREF_AUTH_VISIBLE; + import android.accounts.Account; import android.accounts.AccountManager; import android.os.Build; @@ -31,11 +36,6 @@ import org.microg.gms.auth.AuthConstants; import org.microg.tools.ui.AbstractSettingsActivity; import org.microg.tools.ui.ResourceSettingsFragment; -import static android.accounts.AccountManager.PACKAGE_NAME_KEY_LEGACY_NOT_VISIBLE; -import static android.accounts.AccountManager.VISIBILITY_USER_MANAGED_NOT_VISIBLE; -import static android.accounts.AccountManager.VISIBILITY_USER_MANAGED_VISIBLE; -import static org.microg.gms.auth.AuthManager.PREF_AUTH_VISIBLE; - public class AccountSettingsActivity extends AbstractSettingsActivity { @Override diff --git a/play-services-core/src/main/java/org/microg/gms/ui/SettingsDashboardActivity.java b/play-services-core/src/main/java/org/microg/gms/ui/SettingsDashboardActivity.java index ed2fb218..0375f317 100755 --- a/play-services-core/src/main/java/org/microg/gms/ui/SettingsDashboardActivity.java +++ b/play-services-core/src/main/java/org/microg/gms/ui/SettingsDashboardActivity.java @@ -20,7 +20,6 @@ import androidx.fragment.app.Fragment; import com.mgoogle.android.gms.R; -//import org.microg.nlp.Preferences; import org.microg.tools.ui.AbstractDashboardActivity; public class SettingsDashboardActivity extends AbstractDashboardActivity { diff --git a/play-services-core/src/main/kotlin/com/google/android/gms/measurement/internal/AppMeasurementDynamiteService.kt b/play-services-core/src/main/kotlin/com/google/android/gms/measurement/internal/AppMeasurementDynamiteService.kt new file mode 100644 index 00000000..a0f3373c --- /dev/null +++ b/play-services-core/src/main/kotlin/com/google/android/gms/measurement/internal/AppMeasurementDynamiteService.kt @@ -0,0 +1,198 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package com.google.android.gms.measurement.internal + +import android.os.Bundle +import android.os.Parcelable +import android.util.Log +import com.google.android.gms.dynamic.IObjectWrapper +import com.google.android.gms.measurement.api.internal.* + +private const val TAG = "AppMeasurementService" + +class AppMeasurementDynamiteService : IAppMeasurementDynamiteService.Stub() { + override fun initialize(context: IObjectWrapper?, params: InitializationParams?, timestamp: Long) { + Log.d(TAG, "Not yet implemented: initialize") + } + + override fun logEvent(str: String?, str2: String?, bundle: Bundle?, z: Boolean, z2: Boolean, timestamp: Long) { + Log.d(TAG, "Not yet implemented: logEvent") + } + + override fun logEventAndBundle(str: String?, str2: String?, bundle: Bundle?, receiver: IBundleReceiver?, j: Long) { + Log.d(TAG, "Not yet implemented: logEventAndBundle") + receiver?.onBundle(Bundle().apply { putByteArray("r", ByteArray(0)) }) + } + + override fun setUserProperty(str: String?, str2: String?, obj: IObjectWrapper?, z: Boolean, j: Long) { + Log.d(TAG, "Not yet implemented: setUserProperty") + } + + override fun getUserProperties(str: String?, str2: String?, z: Boolean, receiver: IBundleReceiver?) { + Log.d(TAG, "Not yet implemented: getUserProperties") + receiver?.onBundle(Bundle()) + } + + override fun getMaxUserProperties(str: String?, receiver: IBundleReceiver?) { + Log.d(TAG, "Not yet implemented: getMaxUserProperties") + receiver?.onBundle(Bundle().apply { putInt("r", 25) }) + } + + override fun setUserId(str: String?, j: Long) { + Log.d(TAG, "Not yet implemented: setUserId") + } + + override fun setConditionalUserProperty(bundle: Bundle?, j: Long) { + Log.d(TAG, "Not yet implemented: setConditionalUserProperty") + } + + override fun clearConditionalUserProperty(str: String?, str2: String?, bundle: Bundle?) { + Log.d(TAG, "Not yet implemented: clearConditionalUserProperty") + } + + override fun getConditionalUserProperties(str: String?, str2: String?, receiver: IBundleReceiver?) { + Log.d(TAG, "Not yet implemented: getConditionalUserProperties") + receiver?.onBundle(Bundle().apply { putParcelableArrayList("r", arrayListOf()) }) + } + + override fun setMeasurementEnabled(z: Boolean, j: Long) { + Log.d(TAG, "Not yet implemented: setMeasurementEnabled") + } + + override fun resetAnalyticsData(j: Long) { + Log.d(TAG, "Not yet implemented: resetAnalyticsData") + } + + override fun setMinimumSessionDuration(j: Long) { + Log.d(TAG, "Not yet implemented: setMinimumSessionDuration") + } + + override fun setSessionTimeoutDuration(j: Long) { + Log.d(TAG, "Not yet implemented: setSessionTimeoutDuration") + } + + override fun setCurrentScreen(obj: IObjectWrapper?, str: String?, str2: String?, j: Long) { + Log.d(TAG, "Not yet implemented: setCurrentScreen") + } + + override fun getCurrentScreenName(receiver: IBundleReceiver?) { + Log.d(TAG, "Not yet implemented: getCurrentScreenName") + } + + override fun getCurrentScreenClass(receiver: IBundleReceiver?) { + Log.d(TAG, "Not yet implemented: getCurrentScreenClass") + } + + override fun setInstanceIdProvider(provider: IStringProvider?) { + Log.d(TAG, "Not yet implemented: setInstanceIdProvider") + } + + override fun getCachedAppInstanceId(receiver: IBundleReceiver?) { + Log.d(TAG, "Not yet implemented: getCachedAppInstanceId") + } + + override fun getAppInstanceId(receiver: IBundleReceiver?) { + Log.d(TAG, "Not yet implemented: getAppInstanceId") + } + + override fun getGmpAppId(receiver: IBundleReceiver?) { + Log.d(TAG, "Not yet implemented: getGmpAppId") + } + + override fun generateEventId(receiver: IBundleReceiver?) { + Log.d(TAG, "Not yet implemented: generateEventId") + } + + override fun beginAdUnitExposure(str: String?, j: Long) { + Log.d(TAG, "Not yet implemented: beginAdUnitExposure") + } + + override fun endAdUnitExposure(str: String?, j: Long) { + Log.d(TAG, "Not yet implemented: endAdUnitExposure") + } + + override fun onActivityStarted(activity: IObjectWrapper?, j: Long) { + Log.d(TAG, "Not yet implemented: onActivityStarted") + } + + override fun onActivityStopped(activity: IObjectWrapper?, j: Long) { + Log.d(TAG, "Not yet implemented: onActivityStopped") + } + + override fun onActivityCreated(activity: IObjectWrapper?, bundle: Bundle?, j: Long) { + Log.d(TAG, "Not yet implemented: onActivityCreated") + } + + override fun onActivityDestroyed(activity: IObjectWrapper?, j: Long) { + Log.d(TAG, "Not yet implemented: onActivityDestroyed") + } + + override fun onActivityPaused(activity: IObjectWrapper?, j: Long) { + Log.d(TAG, "Not yet implemented: onActivityPaused") + } + + override fun onActivityResumed(activity: IObjectWrapper?, j: Long) { + Log.d(TAG, "Not yet implemented: onActivityResumed") + } + + override fun onActivitySaveInstanceState(activity: IObjectWrapper?, receiver: IBundleReceiver?, j: Long) { + Log.d(TAG, "Not yet implemented: onActivitySaveInstanceState") + receiver?.onBundle(Bundle()) + } + + override fun performAction(bundle: Bundle?, receiver: IBundleReceiver?, j: Long) { + Log.d(TAG, "Not yet implemented: performAction") + } + + override fun logHealthData(i: Int, str: String?, obj: IObjectWrapper?, obj2: IObjectWrapper?, obj3: IObjectWrapper?) { + Log.d(TAG, "Not yet implemented: logHealthData") + } + + override fun setEventInterceptor(proxy: IEventHandlerProxy?) { + Log.d(TAG, "Not yet implemented: setEventInterceptor") + } + + override fun registerOnMeasurementEventListener(proxy: IEventHandlerProxy?) { + Log.d(TAG, "Not yet implemented: registerOnMeasurementEventListener") + } + + override fun unregisterOnMeasurementEventListener(proxy: IEventHandlerProxy?) { + Log.d(TAG, "Not yet implemented: unregisterOnMeasurementEventListener") + } + + override fun initForTests(map: MutableMap?) { + Log.d(TAG, "Not yet implemented: initForTests") + } + + override fun getTestFlag(receiver: IBundleReceiver?, i: Int) { + Log.d(TAG, "Not yet implemented: getTestFlag") + } + + override fun setDataCollectionEnabled(z: Boolean) { + Log.d(TAG, "Not yet implemented: setDataCollectionEnabled") + } + + override fun isDataCollectionEnabled(receiver: IBundleReceiver?) { + Log.d(TAG, "Not yet implemented: isDataCollectionEnabled") + receiver?.onBundle(Bundle().apply { putBoolean("r", false) }) + } + + override fun setDefaultEventParameters(bundle: Bundle?) { + Log.d(TAG, "Not yet implemented: setDefaultEventParameters") + } + + override fun setConsent(bundle: Bundle?, j: Long) { + Log.d(TAG, "Not yet implemented: setConsent") + } + + override fun setConsentThirdParty(bundle: Bundle?, j: Long) { + Log.d(TAG, "Not yet implemented: setConsentThirdParty") + } + + override fun clearMeasurementEnabled(j: Long) { + Log.d(TAG, "Not yet implemented: clearMeasurementEnabled") + } + +} diff --git a/play-services-core/src/main/kotlin/org/microg/gms/auth/appcert/AppCertManager.kt b/play-services-core/src/main/kotlin/org/microg/gms/auth/appcert/AppCertManager.kt new file mode 100644 index 00000000..fa66a147 --- /dev/null +++ b/play-services-core/src/main/kotlin/org/microg/gms/auth/appcert/AppCertManager.kt @@ -0,0 +1,156 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.auth.appcert + +import android.content.Context +import android.database.Cursor +import android.os.SystemClock +import android.util.Base64 +import android.util.Log +import com.android.volley.NetworkResponse +import com.android.volley.Request +import com.android.volley.Response +import com.android.volley.VolleyError +import com.android.volley.toolbox.Volley +import com.mgoogle.android.gms.BuildConfig +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import okio.ByteString.Companion.of +import org.microg.gms.checkin.LastCheckinInfo +import org.microg.gms.common.Constants +import org.microg.gms.common.PackageUtils +import org.microg.gms.gcm.GcmConstants +import org.microg.gms.gcm.GcmDatabase +import org.microg.gms.gcm.RegisterRequest +import org.microg.gms.gcm.completeRegisterRequest +import org.microg.gms.profile.Build +import org.microg.gms.profile.ProfileManager +import org.microg.mgms.settings.SettingsContract.CheckIn +import org.microg.mgms.settings.SettingsContract.getSettings +import javax.crypto.Mac +import javax.crypto.spec.SecretKeySpec +import kotlin.random.Random + +class AppCertManager(private val context: Context) { + private val queue = Volley.newRequestQueue(context) + + suspend fun fetchDeviceKey(): Boolean { + ProfileManager.ensureInitialized(context) + deviceKeyLock.withLock { + try { + val elapsedRealtime = SystemClock.elapsedRealtime() + if (elapsedRealtime - deviceKeyCacheTime < DEVICE_KEY_TIMEOUT) { + return deviceKey != null + } + Log.w(TAG, "DeviceKeys for app certifications are experimental") + deviceKeyCacheTime = elapsedRealtime + val lastCheckinInfo = LastCheckinInfo.read(context) + val androidId = lastCheckinInfo.androidId + val sessionId = Random.nextLong() + val token = completeRegisterRequest(context, GcmDatabase(context), RegisterRequest().build(context) + .checkin(lastCheckinInfo) + .app("com.google.android.gms", Constants.GMS_PACKAGE_SIGNATURE_SHA1, BuildConfig.VERSION_CODE) + .sender(REGISTER_SENDER) + .extraParam("subscription", REGISTER_SUBSCIPTION) + .extraParam("X-subscription", REGISTER_SUBSCIPTION) + .extraParam("subtype", REGISTER_SUBTYPE) + .extraParam("X-subtype", REGISTER_SUBTYPE) + .extraParam("scope", REGISTER_SCOPE)) + .getString(GcmConstants.EXTRA_REGISTRATION_ID) + val request = DeviceKeyRequest( + androidId = lastCheckinInfo.androidId, + sessionId = sessionId, + versionInfo = DeviceKeyRequest.VersionInfo(Build.VERSION.SDK_INT, BuildConfig.VERSION_CODE), + token = token + ) + Log.d(TAG, "Request: ${request.toString().chunked(128).joinToString("\n")}") + val deferredResponse = CompletableDeferred() + queue.add(object : Request(Method.POST, "https://android.googleapis.com/auth/devicekey", null) { + override fun getBody(): ByteArray = request.encode() + + override fun getBodyContentType(): String = "application/octet-stream" + + override fun parseNetworkResponse(response: NetworkResponse): Response { + return if (response.statusCode == 200) { + Response.success(response.data, null) + } else { + Response.success(null, null) + } + } + + override fun deliverError(error: VolleyError) { + Log.d(TAG, "Error: ${Base64.encodeToString(error.networkResponse.data, 2)}") + deferredResponse.complete(null) + } + + override fun deliverResponse(response: ByteArray?) { + deferredResponse.complete(response) + } + + override fun getHeaders(): Map { + return mapOf( + "User-Agent" to "GoogleAuth/1.4 (${Build.DEVICE} ${Build.ID}); gzip", + "content-type" to "application/octet-stream", + "app" to "com.google.android.gms", + "device" to androidId.toString(16) + ) + } + }) + val deviceKeyBytes = deferredResponse.await() ?: return false + deviceKey = DeviceKey.ADAPTER.decode(deviceKeyBytes) + Log.d(TAG, "Response: $deviceKey") + return true + } catch (e: Exception) { + Log.w(TAG, e) + return false + } + } + } + + suspend fun getSpatulaHeader(packageName: String): String? { + val deviceKey = deviceKey ?: if (fetchDeviceKey()) deviceKey else null + val packageCertificateHash = Base64.encodeToString(PackageUtils.firstSignatureDigestBytes(context, packageName), Base64.NO_WRAP) + val proto = if (deviceKey != null) { + val macSecret = deviceKey.macSecret?.toByteArray() + if (macSecret == null) { + Log.w(TAG, "Invalid device key: $deviceKey") + return null + } + val mac = Mac.getInstance("HMACSHA256") + mac.init(SecretKeySpec(macSecret, "HMACSHA256")) + val hmac = mac.doFinal("$packageName$packageCertificateHash".toByteArray()) + SpatulaHeaderProto( + packageInfo = SpatulaHeaderProto.PackageInfo(packageName, packageCertificateHash), + hmac = of(*hmac), + deviceId = deviceKey.deviceId, + keyId = deviceKey.keyId, + keyCert = deviceKey.keyCert ?: of() + ) + } else { + Log.d(TAG, "Using fallback spatula header based on Android ID") + val androidId = getSettings(context, CheckIn.getContentUri(context), arrayOf(CheckIn.ANDROID_ID, CheckIn.SECURITY_TOKEN)) { cursor: Cursor -> cursor.getLong(0) } + SpatulaHeaderProto( + packageInfo = SpatulaHeaderProto.PackageInfo(packageName, packageCertificateHash), + deviceId = androidId + ) + } + Log.d(TAG, "Spatula Header: $proto") + return Base64.encodeToString(proto.encode(), Base64.NO_WRAP) + } + + companion object { + private const val TAG = "AppCertManager" + private const val DEVICE_KEY_TIMEOUT = 60 * 60 * 1000L + private const val REGISTER_SENDER = "745476177629" + private const val REGISTER_SUBTYPE = "745476177629" + private const val REGISTER_SUBSCIPTION = "745476177629" + private const val REGISTER_SCOPE = "DeviceKeyRequest" + private val deviceKeyLock = Mutex() + private var deviceKey: DeviceKey? = null + private var deviceKeyCacheTime = 0L + } +} diff --git a/play-services-core/src/main/kotlin/org/microg/gms/auth/appcert/AppCertService.kt b/play-services-core/src/main/kotlin/org/microg/gms/auth/appcert/AppCertService.kt new file mode 100644 index 00000000..e73017e2 --- /dev/null +++ b/play-services-core/src/main/kotlin/org/microg/gms/auth/appcert/AppCertService.kt @@ -0,0 +1,42 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.auth.appcert + +import android.app.Service +import android.content.Context +import android.content.Intent +import android.os.IBinder +import android.os.Parcel +import android.util.Log +import com.google.android.gms.auth.appcert.IAppCertService +import kotlinx.coroutines.runBlocking +import org.microg.gms.common.PackageUtils +import org.microg.gms.utils.warnOnTransactionIssues + +private const val TAG = "AppCertService" + +class AppCertService : Service() { + override fun onBind(intent: Intent): IBinder { + Log.d(TAG, "onBind: $intent") + return AppCertServiceImpl(this).asBinder() + } +} + +class AppCertServiceImpl(private val context: Context) : IAppCertService.Stub() { + private val manager = AppCertManager(context) + + override fun fetchDeviceKey(): Boolean { + PackageUtils.assertExtendedAccess(context) + return runBlocking { manager.fetchDeviceKey() } + } + + override fun getSpatulaHeader(packageName: String): String? { + PackageUtils.assertExtendedAccess(context) + return runBlocking { manager.getSpatulaHeader(packageName) } + } + + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags) { super.onTransact(code, data, reply, flags) } +} diff --git a/play-services-core/src/main/kotlin/org/microg/gms/auth/CredentialPickerActivity.kt b/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/CredentialPickerActivity.kt similarity index 93% rename from play-services-core/src/main/kotlin/org/microg/gms/auth/CredentialPickerActivity.kt rename to play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/CredentialPickerActivity.kt index ee7d332f..ba1e9c4f 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/auth/CredentialPickerActivity.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/CredentialPickerActivity.kt @@ -1,9 +1,9 @@ /* - * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-FileCopyrightText: 2022 microG Project Team * SPDX-License-Identifier: Apache-2.0 */ -package org.microg.gms.auth +package org.microg.gms.auth.credentials import android.app.Activity import android.os.Bundle @@ -35,4 +35,4 @@ class CredentialPickerActivity : Activity() { Log.d("GmsCredentialPicker", "Not implemented. callingPackage=$callingPackage, logSessionId=$logSessionId, credentialsRequest=$credentialRequest, hintRequest=$hintRequest") finish() } -} \ No newline at end of file +} diff --git a/play-services-core/src/main/kotlin/org/microg/gms/auth/CredentialsService.kt b/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/CredentialsService.kt similarity index 81% rename from play-services-core/src/main/kotlin/org/microg/gms/auth/CredentialsService.kt rename to play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/CredentialsService.kt index e50c5e9e..adc0370b 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/auth/CredentialsService.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/auth/credentials/CredentialsService.kt @@ -1,11 +1,12 @@ /* - * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-FileCopyrightText: 2022 microG Project Team * SPDX-License-Identifier: Apache-2.0 */ -package org.microg.gms.auth +package org.microg.gms.auth.credentials import android.os.Bundle +import android.os.Parcel import android.util.Log import com.google.android.gms.auth.api.credentials.CredentialRequest import com.google.android.gms.auth.api.credentials.internal.* @@ -15,8 +16,9 @@ import com.google.android.gms.common.internal.GetServiceRequest import com.google.android.gms.common.internal.IGmsCallbacks import org.microg.gms.BaseService import org.microg.gms.common.GmsService +import org.microg.gms.utils.warnOnTransactionIssues -const val TAG = "GmsCredentials" +private const val TAG = "CredentialService" class CredentialsService : BaseService(TAG, GmsService.CREDENTIALS) { override fun handleServiceRequest(callback: IGmsCallbacks, request: GetServiceRequest, service: GmsService) { @@ -50,4 +52,5 @@ class CredentialsServiceImpl : ICredentialsService.Stub() { callbacks.onStatus(Status.SUCCESS) } -} \ No newline at end of file + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags) { super.onTransact(code, data, reply, flags) } +} diff --git a/play-services-core/src/main/kotlin/org/microg/gms/auth/proxy/AuthProxyService.kt b/play-services-core/src/main/kotlin/org/microg/gms/auth/proxy/AuthProxyService.kt new file mode 100644 index 00000000..e1cedd59 --- /dev/null +++ b/play-services-core/src/main/kotlin/org/microg/gms/auth/proxy/AuthProxyService.kt @@ -0,0 +1,63 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.auth.proxy + +import android.content.Context +import android.os.Bundle +import android.os.Parcel +import android.util.Log +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.lifecycleScope +import com.google.android.gms.auth.api.internal.IAuthCallbacks +import com.google.android.gms.auth.api.internal.IAuthService +import com.google.android.gms.auth.api.proxy.ProxyRequest +import com.google.android.gms.auth.api.proxy.ProxyResponse +import com.google.android.gms.common.api.CommonStatusCodes +import com.google.android.gms.common.internal.GetServiceRequest +import com.google.android.gms.common.internal.IGmsCallbacks +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import org.microg.gms.BaseService +import org.microg.gms.auth.appcert.AppCertManager +import org.microg.gms.common.GmsService +import org.microg.gms.common.PackageUtils +import org.microg.gms.utils.warnOnTransactionIssues + +private const val TAG = "AuthProxyService" + +class AuthProxyService : BaseService(TAG, GmsService.AUTH_PROXY) { + override fun handleServiceRequest(callback: IGmsCallbacks, request: GetServiceRequest, service: GmsService) { + val packageName = PackageUtils.getAndCheckCallingPackage(this, request.packageName) + ?: throw IllegalArgumentException("Missing package name") + val consumerPackageName = request.extras.getString("consumerPkg") + if (consumerPackageName != null) PackageUtils.assertExtendedAccess(this) + val serviceImpl = AuthServiceImpl(this, lifecycle, consumerPackageName ?: packageName) + callback.onPostInitComplete(CommonStatusCodes.SUCCESS, serviceImpl, Bundle()) + } +} + +class AuthServiceImpl(private val context: Context, private val lifecycle: Lifecycle, private val packageName: String) : IAuthService.Stub(), LifecycleOwner { + override fun performProxyRequest(callbacks: IAuthCallbacks, request: ProxyRequest) { + Log.d(TAG, "performProxyRequest($packageName, $request)") + lifecycleScope.launchWhenStarted { + callbacks.onProxyResponse(ProxyResponse().apply { gmsStatusCode = CommonStatusCodes.CANCELED }) + } + } + + override fun getSpatulaHeader(callbacks: IAuthCallbacks) { + Log.d(TAG, "getSpatulaHeader($packageName)") + lifecycleScope.launchWhenStarted { + val result = withContext(Dispatchers.IO) { AppCertManager(context).getSpatulaHeader(packageName) } + Log.d(TAG, "Result: $result") + callbacks.onSpatulaHeader(result) + } + } + + override fun getLifecycle(): Lifecycle = lifecycle + + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags) { super.onTransact(code, data, reply, flags) } +} diff --git a/play-services-core/src/main/kotlin/org/microg/gms/chimera/ServiceProvider.kt b/play-services-core/src/main/kotlin/org/microg/gms/chimera/ServiceProvider.kt index 24dfa1c0..5633c560 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/chimera/ServiceProvider.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/chimera/ServiceProvider.kt @@ -7,7 +7,6 @@ package org.microg.gms.chimera import android.content.ContentProvider import android.content.ContentValues -import android.content.Context import android.content.Intent import android.database.Cursor import android.database.MatrixCursor @@ -17,7 +16,6 @@ import android.util.Log import androidx.core.os.bundleOf import org.microg.gms.DummyService import org.microg.gms.common.GmsService -import org.microg.gms.common.RemoteListenerProxy class ServiceProvider : ContentProvider() { diff --git a/play-services-core/src/main/kotlin/org/microg/gms/clearcut/ClearcutLoggerService.kt b/play-services-core/src/main/kotlin/org/microg/gms/clearcut/ClearcutLoggerService.kt new file mode 100644 index 00000000..1e0d9b82 --- /dev/null +++ b/play-services-core/src/main/kotlin/org/microg/gms/clearcut/ClearcutLoggerService.kt @@ -0,0 +1,79 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ +package org.microg.gms.clearcut + +import android.os.Parcel +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.lifecycleScope +import com.google.android.gms.clearcut.LogEventParcelable +import com.google.android.gms.clearcut.internal.IClearcutLoggerCallbacks +import com.google.android.gms.clearcut.internal.IClearcutLoggerService +import com.google.android.gms.common.api.CommonStatusCodes +import com.google.android.gms.common.api.Status +import com.google.android.gms.common.data.DataHolder +import com.google.android.gms.common.internal.GetServiceRequest +import com.google.android.gms.common.internal.IGmsCallbacks +import org.microg.gms.BaseService +import org.microg.gms.common.GmsService +import org.microg.gms.utils.warnOnTransactionIssues + +private const val TAG = "ClearcutLoggerService" +private const val COLLECT_FOR_DEBUG_DURATION = 24L * 60 * 60 * 1000 + +class ClearcutLoggerService : BaseService(TAG, GmsService.CLEARCUT_LOGGER) { + override fun handleServiceRequest(callback: IGmsCallbacks, request: GetServiceRequest, service: GmsService) { + callback.onPostInitComplete(0, ClearcutLoggerServiceImpl(lifecycle), null) + } +} + +class ClearcutLoggerServiceImpl(private val lifecycle: Lifecycle) : IClearcutLoggerService.Stub(), LifecycleOwner { + private var collectForDebugExpiryTime: Long = 0 + + override fun log(callbacks: IClearcutLoggerCallbacks, event: LogEventParcelable) { + lifecycleScope.launchWhenStarted { + callbacks.onLogResult(Status.SUCCESS) + } + } + + override fun forceUpload(callbacks: IClearcutLoggerCallbacks) { + lifecycleScope.launchWhenStarted { + callbacks.onLogResult(Status.SUCCESS) + } + } + + override fun startCollectForDebug(callbacks: IClearcutLoggerCallbacks) { + lifecycleScope.launchWhenStarted { + collectForDebugExpiryTime = System.currentTimeMillis() + COLLECT_FOR_DEBUG_DURATION + callbacks.onStartCollectForDebugResult(Status.SUCCESS, collectForDebugExpiryTime) + } + } + + override fun stopCollectForDebug(callbacks: IClearcutLoggerCallbacks) { + lifecycleScope.launchWhenStarted { + callbacks.onStopCollectForDebugResult(Status.SUCCESS) + } + } + + override fun getCollectForDebugExpiryTime(callbacks: IClearcutLoggerCallbacks) { + lifecycleScope.launchWhenStarted { + callbacks.onCollectForDebugExpiryTime(Status.SUCCESS, collectForDebugExpiryTime) + } + } + + override fun getLogEventParcelablesLegacy(callbacks: IClearcutLoggerCallbacks) { + getLogEventParcelables(callbacks) + } + + override fun getLogEventParcelables(callbacks: IClearcutLoggerCallbacks) { + lifecycleScope.launchWhenStarted { + callbacks.onLogEventParcelables(DataHolder.empty(CommonStatusCodes.SUCCESS)) + } + } + + override fun getLifecycle(): Lifecycle = lifecycle + + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags) { super.onTransact(code, data, reply, flags) } +} diff --git a/play-services-core/src/main/kotlin/org/microg/gms/fonts/FontsProvider.kt b/play-services-core/src/main/kotlin/org/microg/gms/fonts/FontsProvider.kt index a15180c5..2ccf28d0 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/fonts/FontsProvider.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/fonts/FontsProvider.kt @@ -35,7 +35,7 @@ class FontsProvider : ContentProvider() { selectionArgs: Array?, sortOrder: String? ): Cursor { - Log.e(TAG, "query: $uri ${projection?.toList()} $selection") + Log.e(TAG, "query: $uri ${projection?.toList()} $selection ${selectionArgs?.joinToString(prefix = "[", postfix = "]")}") val cursor = MatrixCursor(COLUMNS) // We could also return an empty cursor here, but some apps have been reported to crash // when their expected font is not returned by Google's font provider. diff --git a/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmPrefs.kt b/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmPrefs.kt index 356ebac4..6f68b5bf 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmPrefs.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/gcm/GcmPrefs.kt @@ -1,15 +1,17 @@ +@file:Suppress("DEPRECATION") + package org.microg.gms.gcm import android.content.Context import android.content.Intent -import android.net.* +import android.net.ConnectivityManager +import android.net.NetworkInfo import android.util.Log import org.microg.gms.gcm.TriggerReceiver.FORCE_TRY_RECONNECT import org.microg.mgms.settings.SettingsContract import org.microg.mgms.settings.SettingsContract.Gcm import org.microg.mgms.settings.SettingsContract.setSettings -@Suppress("Warnings") data class GcmPrefs( val isGcmLogEnabled: Boolean, val lastPersistedId: String?, @@ -87,7 +89,6 @@ data class GcmPrefs( } } - @Suppress("DEPRECATION") fun getNetworkPrefForInfo(info: NetworkInfo?): String { if (info == null) return PREF_NETWORK_OTHER return if (info.isRoaming) PREF_NETWORK_ROAMING else when (info.type) { @@ -97,7 +98,6 @@ data class GcmPrefs( } } - @Suppress("DEPRECATION") fun getHeartbeatMsFor(info: NetworkInfo?): Int { return getHeartbeatMsFor(getNetworkPrefForInfo(info)) } @@ -118,13 +118,16 @@ data class GcmPrefs( Log.d("GmsGcmPrefs", "learnTimeout: $pref") when (pref) { PREF_NETWORK_MOBILE, PREF_NETWORK_ROAMING -> setSettings(context, Gcm.getContentUri(context)) { - put(Gcm.LEARNT_MOBILE, (learntMobileInterval * 0.95).toInt()) + val newInterval = (learntMobileInterval * 0.95).toInt() + put(Gcm.LEARNT_MOBILE, newInterval) } PREF_NETWORK_WIFI -> setSettings(context, Gcm.getContentUri(context)) { - put(Gcm.LEARNT_WIFI, (learntWifiInterval * 0.95).toInt()) + val newInterval = (learntMobileInterval * 0.95).toInt() + put(Gcm.LEARNT_WIFI, newInterval) } else -> setSettings(context, Gcm.getContentUri(context)) { - put(Gcm.LEARNT_OTHER, (learntOtherInterval * 0.95).toInt()) + val newInterval = (learntMobileInterval * 0.95).toInt() + put(Gcm.LEARNT_OTHER, newInterval) } } } @@ -156,7 +159,6 @@ data class GcmPrefs( } } - @Suppress("DEPRECATION") fun isEnabledFor(info: NetworkInfo?): Boolean { return isEnabled && info != null && getHeartbeatMsFor(info) >= 0 } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/gcm/PushRegisterService.kt b/play-services-core/src/main/kotlin/org/microg/gms/gcm/PushRegisterService.kt index 01c41379..d3e519bd 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/gcm/PushRegisterService.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/gcm/PushRegisterService.kt @@ -6,7 +6,6 @@ package org.microg.gms.gcm -import android.app.Activity import android.app.PendingIntent import android.content.Context import android.content.Intent @@ -22,7 +21,6 @@ import org.microg.gms.checkin.CheckinService import org.microg.gms.checkin.LastCheckinInfo import org.microg.gms.common.ForegroundServiceContext import org.microg.gms.common.PackageUtils -import org.microg.gms.common.Utils import org.microg.gms.gcm.GcmConstants.* import java.util.concurrent.atomic.AtomicBoolean import kotlin.coroutines.resume @@ -132,7 +130,7 @@ class PushRegisterService : LifecycleService() { Log.d(TAG, "register[req]: " + intent.toString() + " extras=" + intent.extras) val bundle = completeRegisterRequest(this, database, RegisterRequest() - .build(Utils.getBuild(this)) + .build(this) .sender(intent.getStringExtra(EXTRA_SENDER)) .checkin(LastCheckinInfo.read(this)) .app(packageName) @@ -148,7 +146,7 @@ class PushRegisterService : LifecycleService() { val packageName = intent.appPackageName ?: throw RuntimeException("No package provided") Log.d(TAG, "unregister[req]: " + intent.toString() + " extras=" + intent.extras) val bundle = completeRegisterRequest(this, database, RegisterRequest() - .build(Utils.getBuild(this)) + .build(this) .sender(intent.getStringExtra(EXTRA_SENDER)) .checkin(LastCheckinInfo.read(this)) .app(packageName) @@ -298,7 +296,7 @@ internal class PushRegisterHandler(private val context: Context, private val dat if (!delete) ensureAppRegistrationAllowed(context, database, packageName) val bundle = completeRegisterRequest(context, database, RegisterRequest() - .build(Utils.getBuild(context)) + .build(context) .sender(sender) .checkin(LastCheckinInfo.read(context)) .app(packageName) diff --git a/play-services-core/src/main/kotlin/org/microg/gms/measurement/MeasurementService.kt b/play-services-core/src/main/kotlin/org/microg/gms/measurement/MeasurementService.kt new file mode 100644 index 00000000..7f0a0afe --- /dev/null +++ b/play-services-core/src/main/kotlin/org/microg/gms/measurement/MeasurementService.kt @@ -0,0 +1,58 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.measurement + +import android.os.Bundle +import android.os.Parcel +import android.util.Log +import com.google.android.gms.common.api.CommonStatusCodes +import com.google.android.gms.common.internal.GetServiceRequest +import com.google.android.gms.common.internal.IGmsCallbacks +import com.google.android.gms.measurement.internal.* +import org.microg.gms.BaseService +import org.microg.gms.common.GmsService +import org.microg.gms.utils.warnOnTransactionIssues + +private const val TAG = "MeasurementService" + +class MeasurementService : BaseService(TAG, GmsService.MEASUREMENT) { + override fun handleServiceRequest(callback: IGmsCallbacks, request: GetServiceRequest, service: GmsService) { + callback.onPostInitComplete(CommonStatusCodes.SUCCESS, MeasurementServiceImpl(), Bundle()) + } +} + +class MeasurementServiceImpl : IMeasurementService.Stub() { + override fun f1(event: EventParcel, app: AppMetadata) { + Log.d(TAG, "f1($event) for $app") + } + + override fun f2(attribute: UserAttributeParcel?, app: AppMetadata) { + Log.d(TAG, "f2($attribute) for $app") + } + + override fun f4(app: AppMetadata) { + Log.d(TAG, "f4() for $app") + } + + override fun f10(p0: Long, p1: String?, p2: String?, p3: String?) { + Log.d(TAG, "f10($p0, $p1, $p2, $p3)") + } + + override fun f11(app: AppMetadata): String? { + Log.d(TAG, "f11() for $app") + return null + } + + override fun f12(property: ConditionalUserPropertyParcel, app: AppMetadata) { + Log.d(TAG, "f12($property) for $app") + } + + override fun setDefaultEventParameters(params: Bundle, app: AppMetadata) { + Log.d(TAG, "setDefaultEventParameters($params) for $app") + } + + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags) { super.onTransact(code, data, reply, flags) } +} diff --git a/play-services-core/src/main/kotlin/org/microg/gms/phenotype/PhenotypeService.kt b/play-services-core/src/main/kotlin/org/microg/gms/phenotype/PhenotypeService.kt index caf317a5..63e9e163 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/phenotype/PhenotypeService.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/phenotype/PhenotypeService.kt @@ -2,7 +2,6 @@ * SPDX-FileCopyrightText: 2020, microG Project Team * SPDX-License-Identifier: Apache-2.0 */ -@file:Suppress("DEPRECATION") package org.microg.gms.phenotype @@ -16,6 +15,7 @@ import com.mgoogle.android.gms.phenotype.internal.IPhenotypeCallbacks import com.mgoogle.android.gms.phenotype.internal.IPhenotypeService import org.microg.gms.BaseService import org.microg.gms.common.GmsService +import org.microg.gms.utils.warnOnTransactionIssues private const val TAG = "GmsPhenotypeSvc" @@ -27,7 +27,12 @@ class PhenotypeService : BaseService(TAG, GmsService.PHENOTYPE) { class PhenotypeServiceImpl : IPhenotypeService.Stub() { override fun register(callbacks: IPhenotypeCallbacks, p1: String?, p2: Int, p3: Array?, p4: ByteArray?) { - Log.d(TAG, "register($p1, $p2, ${p3?.contentToString()}, $p4)") + Log.d(TAG, "register($p1, $p2, $p3, $p4)") + callbacks.onRegister(Status.SUCCESS) + } + + override fun register2(callbacks: IPhenotypeCallbacks, p1: String?, p2: Int, p3: Array?, p4: IntArray?, p5: ByteArray?) { + Log.d(TAG, "register2($p1, $p2, $p3, $p4, $p5)") callbacks.onRegister(Status.SUCCESS) } @@ -38,9 +43,5 @@ class PhenotypeServiceImpl : IPhenotypeService.Stub() { }) } - override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean { - if (super.onTransact(code, data, reply, flags)) return true - Log.d(TAG, "onTransact [unknown]: $code, $data, $flags") - return false - } + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags) { super.onTransact(code, data, reply, flags) } } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/profile/Build.kt b/play-services-core/src/main/kotlin/org/microg/gms/profile/Build.kt new file mode 100644 index 00000000..ffaeda10 --- /dev/null +++ b/play-services-core/src/main/kotlin/org/microg/gms/profile/Build.kt @@ -0,0 +1,94 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.profile + +import android.annotation.TargetApi + +object Build { + @JvmField + var BOARD: String? = null + + @JvmField + var BOOTLOADER: String? = null + + @JvmField + var BRAND: String? = null + + @JvmField + var CPU_ABI: String? = null + + @JvmField + var CPU_ABI2: String? = null + + @JvmField + @TargetApi(21) + var SUPPORTED_ABIS: Array = emptyArray() + + @JvmField + var DEVICE: String? = null + + @JvmField + var DISPLAY: String? = null + + @JvmField + var FINGERPRINT: String? = null + + @JvmField + var HARDWARE: String? = null + + @JvmField + var HOST: String? = null + + @JvmField + var ID: String? = null + + @JvmField + var MANUFACTURER: String? = null + + @JvmField + var MODEL: String? = null + + @JvmField + var PRODUCT: String? = null + + @JvmField + var RADIO: String? = null + + @JvmField + var SERIAL: String? = null + + @JvmField + var TAGS: String? = null + + @JvmField + var TIME: Long = 0L + + @JvmField + var TYPE: String? = null + + @JvmField + var USER: String? = null + + object VERSION { + @JvmField + var CODENAME: String? = null + + @JvmField + var INCREMENTAL: String? = null + + @JvmField + var RELEASE: String? = null + + @JvmField + var SDK: String? = null + + @JvmField + var SDK_INT: Int = 0 + + @JvmField + var SECURITY_PATCH: String? = null + } +} diff --git a/play-services-core/src/main/kotlin/org/microg/gms/profile/ProfileManager.kt b/play-services-core/src/main/kotlin/org/microg/gms/profile/ProfileManager.kt new file mode 100644 index 00000000..ed756017 --- /dev/null +++ b/play-services-core/src/main/kotlin/org/microg/gms/profile/ProfileManager.kt @@ -0,0 +1,329 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.profile + +import android.annotation.SuppressLint +import android.content.Context +import android.content.res.XmlResourceParser +import android.util.Log +import org.microg.gms.utils.FileXmlResourceParser +import org.microg.mgms.settings.SettingsContract +import org.microg.mgms.settings.SettingsContract.Profile +import org.xmlpull.v1.XmlPullParser +import java.io.File +import java.util.* +import kotlin.random.Random + +@Suppress("Warnings") +object ProfileManager { + private const val TAG = "ProfileManager" + const val PROFILE_REAL = "real" + const val PROFILE_AUTO = "auto" + const val PROFILE_NATIVE = "native" + const val PROFILE_USER = "user" + const val PROFILE_SYSTEM = "system" + + private var activeProfile: String? = null + + private fun getUserProfileFile(context: Context): File = File(context.filesDir, "device_profile.xml") + private fun getSystemProfileFile(): File = File("/system/etc/microg_device_profile.xml") + private fun getProfileResId(context: Context, profile: String) = context.resources.getIdentifier("${context.packageName}:xml/profile_$profile".lowercase(Locale.US), null, null) + + fun getConfiguredProfile(context: Context): String = SettingsContract.getSettings(context, Profile.getContentUri(context), arrayOf(Profile.PROFILE)) { it.getString(0) } ?: PROFILE_AUTO + + fun getAutoProfile(context: Context): String { + if (hasProfile(context, PROFILE_SYSTEM) && isAutoProfile(context, PROFILE_SYSTEM)) return PROFILE_SYSTEM + val profile = "${android.os.Build.PRODUCT}_${android.os.Build.VERSION.SDK_INT}" + if (hasProfile(context, profile) && isAutoProfile(context, profile)) return profile + return PROFILE_NATIVE + } + + fun hasProfile(context: Context, profile: String): Boolean = when (profile) { + PROFILE_AUTO -> hasProfile(context, getAutoProfile(context)) + PROFILE_NATIVE, PROFILE_REAL -> true + PROFILE_USER -> getUserProfileFile(context).exists() + PROFILE_SYSTEM -> getSystemProfileFile().exists() + else -> getProfileResId(context, profile) != 0 + } + + private fun getProfileXml(context: Context, profile: String): XmlResourceParser? = kotlin.runCatching { + when (profile) { + PROFILE_AUTO -> getProfileXml(context, getAutoProfile(context)) + PROFILE_NATIVE, PROFILE_REAL -> null + PROFILE_USER -> FileXmlResourceParser(getUserProfileFile(context)) + PROFILE_SYSTEM -> FileXmlResourceParser(getSystemProfileFile()) + else -> { + val profileResId = getProfileResId(context, profile) + if (profileResId == 0) return@runCatching null + context.resources.getXml(profileResId) + } + } + }.getOrNull() + + fun isAutoProfile(context: Context, profile: String): Boolean = kotlin.runCatching { + when (profile) { + PROFILE_AUTO -> false + PROFILE_REAL -> false + PROFILE_NATIVE -> true + else -> getProfileXml(context, profile)?.use { + var next = it.next() + while (next != XmlPullParser.END_DOCUMENT) { + when (next) { + XmlPullParser.START_TAG -> when (it.name) { + "profile" -> { + return@use it.getAttributeBooleanValue(null, "auto", false) + } + } + } + next = it.next() + } + } == true + } + }.getOrDefault(false) + + private fun getProfileData(context: Context, profile: String, realData: Map): Map { + try { + if (profile in listOf(PROFILE_REAL, PROFILE_NATIVE)) return realData + val profileResId = getProfileResId(context, profile) + if (profileResId == 0) return realData + val resultData = mutableMapOf() + resultData.putAll(realData) + getProfileXml(context, profile)?.use { + var next = it.next() + while (next != XmlPullParser.END_DOCUMENT) { + when (next) { + XmlPullParser.START_TAG -> when (it.name) { + "data" -> { + val key = it.getAttributeValue(null, "key") + val value = it.getAttributeValue(null, "value") + resultData[key] = value + Log.d(TAG, "Overwrite from profile: $key = $value") + } + } + } + next = it.next() + } + } + return resultData + } catch (e: Exception) { + Log.w(TAG, e) + return realData + } + } + + private fun getProfile(context: Context) = getConfiguredProfile(context).let { if (it != PROFILE_AUTO) it else getAutoProfile(context) } + private fun getSerialFromSettings(context: Context): String? = SettingsContract.getSettings(context, Profile.getContentUri(context), arrayOf(Profile.SERIAL)) { it.getString(0) } + private fun saveSerial(context: Context, serial: String) = SettingsContract.setSettings(context, Profile.getContentUri(context)) { put(Profile.SERIAL, serial) } + + private fun randomSerial(template: String, prefixLength: Int = (template.length / 2).coerceAtMost(6)): String { + val serial = StringBuilder() + template.forEachIndexed { index, c -> + serial.append(when { + index < prefixLength -> c + c.isDigit() -> '0' + Random.nextInt(10) + c.isLowerCase() && c <= 'f' -> 'a' + Random.nextInt(6) + c.isLowerCase() -> 'a' + Random.nextInt(26) + c.isUpperCase() && c <= 'F' -> 'A' + Random.nextInt(6) + c.isUpperCase() -> 'A' + Random.nextInt(26) + else -> c + }) + } + return serial.toString() + } + + @SuppressLint("MissingPermission") + private fun getProfileSerialTemplate(context: Context, profile: String): String { + // Native + if (profile in listOf(PROFILE_REAL, PROFILE_NATIVE)) { + var candidate = try { + if (android.os.Build.VERSION.SDK_INT >= 26) { + android.os.Build.getSerial() + } else { + android.os.Build.SERIAL + } + } catch (e: Exception) { + android.os.Build.SERIAL + } + if (candidate != android.os.Build.UNKNOWN) return candidate + } + + // From profile + try { + getProfileXml(context, profile)?.use { + var next = it.next() + while (next != XmlPullParser.END_DOCUMENT) { + when (next) { + XmlPullParser.START_TAG -> when (it.name) { + "serial" -> return it.getAttributeValue(null, "template") + } + } + next = it.next() + } + } + } catch (e: Exception) { + Log.w(TAG, e) + } + + // Fallback + return randomSerial("008741A0B2C4D6E8") + } + + @SuppressLint("MissingPermission") + fun getSerial(context: Context, profile: String = getProfile(context), local: Boolean = false): String { + if (!local) getSerialFromSettings(context)?.let { return it } + val serialTemplate = getProfileSerialTemplate(context, profile) + val serial = when { + profile == PROFILE_REAL && serialTemplate != android.os.Build.UNKNOWN -> serialTemplate + else -> randomSerial(serialTemplate) + } + if (!local) saveSerial(context, serial) + return serial + } + + private fun getRealData(): Map = mutableMapOf( + "Build.BOARD" to android.os.Build.BOARD, + "Build.BOOTLOADER" to android.os.Build.BOOTLOADER, + "Build.BRAND" to android.os.Build.BRAND, + "Build.CPU_ABI" to android.os.Build.CPU_ABI, + "Build.CPU_ABI2" to android.os.Build.CPU_ABI2, + "Build.DEVICE" to android.os.Build.DEVICE, + "Build.DISPLAY" to android.os.Build.DISPLAY, + "Build.FINGERPRINT" to android.os.Build.FINGERPRINT, + "Build.HARDWARE" to android.os.Build.HARDWARE, + "Build.HOST" to android.os.Build.HOST, + "Build.ID" to android.os.Build.ID, + "Build.MANUFACTURER" to android.os.Build.MANUFACTURER, + "Build.MODEL" to android.os.Build.MODEL, + "Build.PRODUCT" to android.os.Build.PRODUCT, + "Build.RADIO" to android.os.Build.RADIO, + "Build.SERIAL" to android.os.Build.SERIAL, + "Build.TAGS" to android.os.Build.TAGS, + "Build.TIME" to android.os.Build.TIME.toString(), + "Build.TYPE" to android.os.Build.TYPE, + "Build.USER" to android.os.Build.USER, + "Build.VERSION.CODENAME" to android.os.Build.VERSION.CODENAME, + "Build.VERSION.INCREMENTAL" to android.os.Build.VERSION.INCREMENTAL, + "Build.VERSION.RELEASE" to android.os.Build.VERSION.RELEASE, + "Build.VERSION.SDK" to android.os.Build.VERSION.SDK, + "Build.VERSION.SDK_INT" to android.os.Build.VERSION.SDK_INT.toString() + ).apply { + if (android.os.Build.VERSION.SDK_INT >= 21) { + put("Build.SUPPORTED_ABIS", android.os.Build.SUPPORTED_ABIS.joinToString(",")) + } + if (android.os.Build.VERSION.SDK_INT >= 23) { + put("Build.VERSION.SECURITY_PATCH", android.os.Build.VERSION.SECURITY_PATCH) + } + } + + private fun applyProfileData(profileData: Map) { + fun applyStringField(key: String, valueSetter: (String) -> Unit) = profileData[key]?.let { valueSetter(it) } + fun applyIntField(key: String, valueSetter: (Int) -> Unit) = profileData[key]?.toIntOrNull()?.let { valueSetter(it) } + fun applyLongField(key: String, valueSetter: (Long) -> Unit) = profileData[key]?.toLongOrNull()?.let { valueSetter(it) } + + applyStringField("Build.BOARD") { Build.BOARD = it } + applyStringField("Build.BOOTLOADER") { Build.BOOTLOADER = it } + applyStringField("Build.BRAND") { Build.BRAND = it } + applyStringField("Build.CPU_ABI") { Build.CPU_ABI = it } + applyStringField("Build.CPU_ABI2") { Build.CPU_ABI2 = it } + applyStringField("Build.DEVICE") { Build.DEVICE = it } + applyStringField("Build.DISPLAY") { Build.DISPLAY = it } + applyStringField("Build.FINGERPRINT") { Build.FINGERPRINT = it } + applyStringField("Build.HARDWARE") { Build.HARDWARE = it } + applyStringField("Build.HOST") { Build.HOST = it } + applyStringField("Build.ID") { Build.ID = it } + applyStringField("Build.MANUFACTURER") { Build.MANUFACTURER = it } + applyStringField("Build.MODEL") { Build.MODEL = it } + applyStringField("Build.PRODUCT") { Build.PRODUCT = it } + applyStringField("Build.RADIO") { Build.RADIO = it } + applyStringField("Build.SERIAL") { Build.SERIAL = it } + applyStringField("Build.TAGS") { Build.TAGS = it } + applyLongField("Build.TIME") { Build.TIME = it } + applyStringField("Build.TYPE") { Build.TYPE = it } + applyStringField("Build.USER") { Build.USER = it } + applyStringField("Build.VERSION.CODENAME") { Build.VERSION.CODENAME = it } + applyStringField("Build.VERSION.INCREMENTAL") { Build.VERSION.INCREMENTAL = it } + applyStringField("Build.VERSION.RELEASE") { Build.VERSION.RELEASE = it } + applyStringField("Build.VERSION.SDK") { Build.VERSION.SDK = it } + applyIntField("Build.VERSION.SDK_INT") { Build.VERSION.SDK_INT = it } + if (android.os.Build.VERSION.SDK_INT >= 21) { + Build.SUPPORTED_ABIS = profileData["Build.SUPPORTED_ABIS"]?.split(",")?.toTypedArray() ?: emptyArray() + } else { + Build.SUPPORTED_ABIS = emptyArray() + } + if (android.os.Build.VERSION.SDK_INT >= 23) { + Build.VERSION.SECURITY_PATCH = profileData["Build.VERSION.SECURITY_PATCH"] + } else { + Build.VERSION.SECURITY_PATCH = null + } + } + + private fun applyProfile(context: Context, profile: String, serial: String = getSerial(context, profile)) { + val profileData = getProfileData(context, profile, getRealData()) + if (Log.isLoggable(TAG, Log.VERBOSE)) { + for ((key, value) in profileData) { + Log.v(TAG, "") + } + } + applyProfileData(profileData) + Build.SERIAL = serial + Log.d(TAG, "Using Serial ${Build.SERIAL}") + activeProfile = profile + } + + fun getProfileName(context: Context, profile: String): String? = getProfileName { getProfileXml(context, profile) } + + private fun getProfileName(parserCreator: () -> XmlResourceParser?): String? = parserCreator()?.use { + var next = it.next() + while (next != XmlPullParser.END_DOCUMENT) { + when (next) { + XmlPullParser.START_TAG -> when (it.name) { + "profile" -> { + return@use it.getAttributeValue(null, "name") + } + } + } + next = it.next() + } + null + } + + fun setProfile(context: Context, profile: String?) { + val changed = getProfile(context) != profile + val newProfile = profile ?: PROFILE_AUTO + val newSerial = if (changed) getSerial(context, newProfile, true) else getSerial(context) + SettingsContract.setSettings(context, Profile.getContentUri(context)) { + put(Profile.PROFILE, newProfile) + if (changed) put(Profile.SERIAL, newSerial) + } + if (changed && activeProfile != null) applyProfile(context, newProfile, newSerial) + } + + fun importUserProfile(context: Context, file: File): Boolean { + val profileName = getProfileName { FileXmlResourceParser(file) } ?: return false + try { + Log.d(TAG, "Importing user profile '$profileName'") + file.copyTo(getUserProfileFile(context)) + if (activeProfile == PROFILE_USER) applyProfile(context, PROFILE_USER) + return true + } catch (e: Exception) { + Log.w(TAG, e) + return false + } + } + + @JvmStatic + fun ensureInitialized(context: Context) { + synchronized(this) { + try { + val profile = getProfile(context) + if (activeProfile == profile) return + applyProfile(context, profile) + } catch (e: Exception) { + Log.w(TAG, e) + } + } + } +} diff --git a/play-services-core/src/main/kotlin/org/microg/gms/provision/ProvisionService.kt b/play-services-core/src/main/kotlin/org/microg/gms/provision/ProvisionService.kt index 2cb32302..abf92a67 100755 --- a/play-services-core/src/main/kotlin/org/microg/gms/provision/ProvisionService.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/provision/ProvisionService.kt @@ -26,7 +26,7 @@ class ProvisionService : LifecycleService() { super.onStartCommand(intent, flags, startId) lifecycleScope.launchWhenStarted { intent?.extras?.let { - val s = it.keySet().joinToString(", ") { key -> "$key = ${it[key]}" } + val s = it.keySet().map { key -> "$key = ${it[key]}" }.joinToString(", ") Log.d(TAG, "Provisioning: $s") } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/udc/FacsCacheService.kt b/play-services-core/src/main/kotlin/org/microg/gms/udc/FacsCacheService.kt index c12b37bf..c48e0e81 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/udc/FacsCacheService.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/udc/FacsCacheService.kt @@ -5,6 +5,7 @@ package org.microg.gms.udc +import android.os.Parcel import android.util.Log import com.google.android.gms.common.api.Status import com.google.android.gms.common.internal.GetServiceRequest @@ -14,6 +15,7 @@ import com.google.android.gms.facs.cache.internal.IFacsCacheCallbacks import com.google.android.gms.facs.cache.internal.IFacsCacheService import org.microg.gms.BaseService import org.microg.gms.common.GmsService +import org.microg.gms.utils.warnOnTransactionIssues private const val TAG = "GmsFacsCache" @@ -49,4 +51,5 @@ class FacsCacheServiceImpl : IFacsCacheService.Stub() { callbacks.onWriteDeviceLevelSettingsResult(Status.CANCELED) } + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags) { super.onTransact(code, data, reply, flags) } } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/ui/AppIconPreference.kt b/play-services-core/src/main/kotlin/org/microg/gms/ui/AppIconPreference.kt index 97bcca1d..739c514c 100755 --- a/play-services-core/src/main/kotlin/org/microg/gms/ui/AppIconPreference.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/ui/AppIconPreference.kt @@ -6,15 +6,22 @@ package org.microg.gms.ui import android.content.Context +import android.util.AttributeSet import android.util.DisplayMetrics import android.widget.ImageView import androidx.preference.Preference import androidx.preference.PreferenceViewHolder -class AppIconPreference(context: Context) : Preference(context) { - override fun onBindViewHolder(holder: PreferenceViewHolder?) { +class AppIconPreference : Preference { + constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super( + context!!, attrs, defStyleAttr, defStyleRes) + constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context!!, attrs, defStyleAttr) + constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs) + constructor(context: Context) : super(context) + + override fun onBindViewHolder(holder: PreferenceViewHolder) { super.onBindViewHolder(holder) - val icon = holder?.findViewById(android.R.id.icon) + val icon = holder.findViewById(android.R.id.icon) if (icon is ImageView) { icon.adjustViewBounds = true icon.scaleType = ImageView.ScaleType.CENTER_INSIDE diff --git a/play-services-core/src/main/kotlin/org/microg/gms/ui/Constants.kt b/play-services-core/src/main/kotlin/org/microg/gms/ui/Constants.kt index a316804f..f2525b2c 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/ui/Constants.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/ui/Constants.kt @@ -5,4 +5,4 @@ package org.microg.gms.ui -const val TAG = "GmsUi" \ No newline at end of file +const val TAG = "GmsUi" diff --git a/play-services-core/src/main/kotlin/org/microg/gms/ui/DeviceRegistrationFragment.kt b/play-services-core/src/main/kotlin/org/microg/gms/ui/DeviceRegistrationFragment.kt index 232298f8..17887575 100755 --- a/play-services-core/src/main/kotlin/org/microg/gms/ui/DeviceRegistrationFragment.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/ui/DeviceRegistrationFragment.kt @@ -31,10 +31,11 @@ class DeviceRegistrationFragment : Fragment(R.layout.device_registration_fragmen } fun setEnabled(newStatus: Boolean) { + val appContext = requireContext().applicationContext lifecycleScope.launchWhenResumed { - val info = getCheckinServiceInfo(requireContext()) + val info = getCheckinServiceInfo(appContext) val newConfiguration = info.configuration.copy(enabled = newStatus) - setCheckinServiceConfiguration(requireContext(), newConfiguration) + setCheckinServiceConfiguration(appContext, newConfiguration) displayServiceInfo(info.copy(configuration = newConfiguration)) } } @@ -46,8 +47,9 @@ class DeviceRegistrationFragment : Fragment(R.layout.device_registration_fragmen override fun onResume() { super.onResume() + val appContext = requireContext().applicationContext lifecycleScope.launchWhenResumed { - displayServiceInfo(getCheckinServiceInfo(requireContext())) + displayServiceInfo(getCheckinServiceInfo(appContext)) } } } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/ui/DeviceRegistrationPreferencesFragment.kt b/play-services-core/src/main/kotlin/org/microg/gms/ui/DeviceRegistrationPreferencesFragment.kt index 9e37b9b7..a0b4ad13 100755 --- a/play-services-core/src/main/kotlin/org/microg/gms/ui/DeviceRegistrationPreferencesFragment.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/ui/DeviceRegistrationPreferencesFragment.kt @@ -2,35 +2,127 @@ * SPDX-FileCopyrightText: 2020, microG Project Team * SPDX-License-Identifier: Apache-2.0 */ -@file:Suppress("DEPRECATION") package org.microg.gms.ui +import android.annotation.SuppressLint +import android.net.Uri import android.os.Bundle import android.os.Handler import android.text.format.DateUtils +import android.util.Log +import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.contract.ActivityResultContracts import androidx.lifecycle.lifecycleScope +import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat import com.mgoogle.android.gms.R import org.microg.gms.checkin.getCheckinServiceInfo +import org.microg.gms.profile.ProfileManager +import org.microg.gms.profile.ProfileManager.PROFILE_AUTO +import org.microg.gms.profile.ProfileManager.PROFILE_NATIVE +import org.microg.gms.profile.ProfileManager.PROFILE_REAL +import org.microg.gms.profile.ProfileManager.PROFILE_SYSTEM +import org.microg.gms.profile.ProfileManager.PROFILE_USER +import java.io.File +import java.io.FileOutputStream +@Suppress("Warnings") class DeviceRegistrationPreferencesFragment : PreferenceFragmentCompat() { + private lateinit var deviceProfile: ListPreference + private lateinit var importProfile: Preference + private lateinit var serial: Preference private lateinit var statusCategory: PreferenceCategory private lateinit var status: Preference private lateinit var androidId: Preference private val handler = Handler() private val updateRunnable = Runnable { updateStatus() } + private lateinit var profileFileImport: ActivityResultLauncher + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + profileFileImport = registerForActivityResult(ActivityResultContracts.GetContent(), this::onFileSelected) + } + + private fun onFileSelected(uri: Uri?) { + if (uri == null) return + try { + val context = requireContext() + val file = File.createTempFile("profile_", ".xml", context.cacheDir) + context.contentResolver.openInputStream(uri)?.use { inputStream -> + FileOutputStream(file).use { inputStream.copyTo(it) } + } + val success = ProfileManager.importUserProfile(context, file) + file.delete() + if (success && ProfileManager.isAutoProfile(context, PROFILE_USER)) { + ProfileManager.setProfile(context, PROFILE_USER) + } + updateStatus() + } catch (e: Exception) { + Log.w(TAG, e) + } + } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.preferences_device_registration) } + @SuppressLint("RestrictedApi") override fun onBindPreferences() { + deviceProfile = preferenceScreen.findPreference("pref_device_profile") ?: deviceProfile + importProfile = preferenceScreen.findPreference("pref_device_profile_import") ?: importProfile + serial = preferenceScreen.findPreference("pref_device_serial") ?: serial statusCategory = preferenceScreen.findPreference("prefcat_device_registration_status") ?: statusCategory status = preferenceScreen.findPreference("pref_device_registration_status") ?: status androidId = preferenceScreen.findPreference("pref_device_registration_android_id") ?: androidId + + deviceProfile.setOnPreferenceChangeListener { _, newValue -> + ProfileManager.setProfile(requireContext(), newValue as String? ?: PROFILE_AUTO) + updateStatus() + true + } + importProfile.setOnPreferenceClickListener { + profileFileImport.launch("text/xml") + true + } + } + + private fun configureProfilePreference() { + val context = requireContext() + val configuredProfile = ProfileManager.getConfiguredProfile(context) + val autoProfileName = when (val autoProfile = ProfileManager.getAutoProfile(context)) { + PROFILE_NATIVE -> getString(R.string.profile_name_native) + PROFILE_REAL -> getString(R.string.profile_name_real) + else -> ProfileManager.getProfileName(context, autoProfile) + } + val profiles = + mutableListOf(PROFILE_AUTO, PROFILE_NATIVE, PROFILE_REAL) + val profileNames = mutableListOf(getString(R.string.profile_name_auto, autoProfileName), getString(R.string.profile_name_native), getString(R.string.profile_name_real)) + if (ProfileManager.hasProfile(context, PROFILE_SYSTEM)) { + profiles.add(PROFILE_SYSTEM) + profileNames.add(getString(R.string.profile_name_system, ProfileManager.getProfileName(context, PROFILE_SYSTEM))) + } + if (ProfileManager.hasProfile(context, PROFILE_USER)) { + profiles.add(PROFILE_USER) + profileNames.add(getString(R.string.profile_name_user, ProfileManager.getProfileName(context, PROFILE_USER))) + } + for (profile in R.xml::class.java.declaredFields.map { it.name } + .filter { it.startsWith("profile_") } + .map { it.substring(8) } + .sorted()) { + val profileName = ProfileManager.getProfileName(context, profile) + if (profileName != null) { + profiles.add(profile) + profileNames.add(profileName) + } + } + deviceProfile.entryValues = profiles.toTypedArray() + deviceProfile.entries = profileNames.toTypedArray() + deviceProfile.value = configuredProfile + deviceProfile.summary = + profiles.indexOf(configuredProfile).takeIf { it >= 0 }?.let { profileNames[it] } ?: "Unknown" } override fun onResume() { @@ -44,12 +136,19 @@ class DeviceRegistrationPreferencesFragment : PreferenceFragmentCompat() { } private fun updateStatus() { + handler.removeCallbacks(updateRunnable) handler.postDelayed(updateRunnable, UPDATE_INTERVAL) + val appContext = requireContext().applicationContext lifecycleScope.launchWhenResumed { - val serviceInfo = getCheckinServiceInfo(requireContext()) + configureProfilePreference() + serial.summary = ProfileManager.getSerial(appContext) + val serviceInfo = getCheckinServiceInfo(appContext) statusCategory.isVisible = serviceInfo.configuration.enabled if (serviceInfo.lastCheckin > 0) { - status.summary = getString(R.string.checkin_last_registration, DateUtils.getRelativeTimeSpanString(serviceInfo.lastCheckin, System.currentTimeMillis(), 0)) + status.summary = getString( + R.string.checkin_last_registration, + DateUtils.getRelativeTimeSpanString(serviceInfo.lastCheckin, System.currentTimeMillis(), 0) + ) androidId.isVisible = true androidId.summary = serviceInfo.androidId.toString(16) } else { diff --git a/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAdvancedFragment.kt b/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAdvancedFragment.kt index 5c300d98..4e7150cf 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAdvancedFragment.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAdvancedFragment.kt @@ -4,14 +4,16 @@ */ package org.microg.gms.ui +import android.annotation.SuppressLint import android.os.Bundle import androidx.lifecycle.lifecycleScope import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat -import androidx.preference.TwoStatePreference import com.mgoogle.android.gms.R -import org.microg.gms.gcm.* +import org.microg.gms.gcm.GcmPrefs +import org.microg.gms.gcm.getGcmServiceInfo +import org.microg.gms.gcm.setGcmServiceConfiguration class PushNotificationAdvancedFragment : PreferenceFragmentCompat() { private lateinit var networkMobile: ListPreference @@ -23,6 +25,7 @@ class PushNotificationAdvancedFragment : PreferenceFragmentCompat() { addPreferencesFromResource(R.xml.preferences_gcm_advanced) } + @SuppressLint("RestrictedApi") override fun onBindPreferences() { networkMobile = preferenceScreen.findPreference(GcmPrefs.PREF_NETWORK_MOBILE) ?: networkMobile networkWifi = preferenceScreen.findPreference(GcmPrefs.PREF_NETWORK_WIFI) ?: networkWifi @@ -30,36 +33,40 @@ class PushNotificationAdvancedFragment : PreferenceFragmentCompat() { networkOther = preferenceScreen.findPreference(GcmPrefs.PREF_NETWORK_OTHER) ?: networkOther networkMobile.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> + val appContext = requireContext().applicationContext lifecycleScope.launchWhenResumed { (newValue as? String)?.toIntOrNull()?.let { - setGcmServiceConfiguration(requireContext(), getGcmServiceInfo(requireContext()).configuration.copy(mobile = it)) + setGcmServiceConfiguration(requireContext(), getGcmServiceInfo(appContext).configuration.copy(mobile = it)) } updateContent() } true } networkWifi.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> + val appContext = requireContext().applicationContext lifecycleScope.launchWhenResumed { (newValue as? String)?.toIntOrNull()?.let { - setGcmServiceConfiguration(requireContext(), getGcmServiceInfo(requireContext()).configuration.copy(wifi = it)) + setGcmServiceConfiguration(appContext, getGcmServiceInfo(requireContext()).configuration.copy(wifi = it)) } updateContent() } true } networkRoaming.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> + val appContext = requireContext().applicationContext lifecycleScope.launchWhenResumed { (newValue as? String)?.toIntOrNull()?.let { - setGcmServiceConfiguration(requireContext(), getGcmServiceInfo(requireContext()).configuration.copy(roaming = it)) + setGcmServiceConfiguration(appContext, getGcmServiceInfo(requireContext()).configuration.copy(roaming = it)) } updateContent() } true } networkOther.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> + val appContext = requireContext().applicationContext lifecycleScope.launchWhenResumed { (newValue as? String)?.toIntOrNull()?.let { - setGcmServiceConfiguration(requireContext(), getGcmServiceInfo(requireContext()).configuration.copy(other = it)) + setGcmServiceConfiguration(appContext, getGcmServiceInfo(requireContext()).configuration.copy(other = it)) } updateContent() } @@ -73,8 +80,9 @@ class PushNotificationAdvancedFragment : PreferenceFragmentCompat() { } private fun updateContent() { + val appContext = requireContext().applicationContext lifecycleScope.launchWhenResumed { - val serviceInfo = getGcmServiceInfo(requireContext()) + val serviceInfo = getGcmServiceInfo(appContext) networkMobile.value = serviceInfo.configuration.mobile.toString() networkMobile.summary = getSummaryString(serviceInfo.configuration.mobile, serviceInfo.learntMobileInterval) networkWifi.value = serviceInfo.configuration.wifi.toString() diff --git a/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAllAppsFragment.kt b/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAllAppsFragment.kt index c202444d..da3210e4 100755 --- a/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAllAppsFragment.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAllAppsFragment.kt @@ -52,8 +52,8 @@ class PushNotificationAllAppsFragment : PreferenceFragmentCompat() { } private fun updateContent() { + val context = requireContext() lifecycleScope.launchWhenResumed { - val context = requireContext() val apps = withContext(Dispatchers.IO) { val res = database.appList.map { app -> app to context.packageManager.getApplicationInfoIfExists(app.packageName) @@ -75,7 +75,7 @@ class PushNotificationAllAppsFragment : PreferenceFragmentCompat() { pref.key = "pref_push_app_" + app.packageName pref to (database.getRegistrationsByApp(app.packageName)) }.sortedBy { - it.first.title.toString().toLowerCase() + it.first.title.toString().lowercase() }.mapIndexed { idx, pair -> pair.first.order = idx pair diff --git a/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAppFragment.kt b/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAppFragment.kt index 567bfe28..f83a5e5d 100755 --- a/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAppFragment.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAppFragment.kt @@ -46,12 +46,13 @@ class PushNotificationAppFragment : Fragment(R.layout.push_notification_fragment override fun onResume() { super.onResume() + val context = requireContext() lifecycleScope.launchWhenResumed { - val pm = requireContext().packageManager + val pm = context.packageManager val applicationInfo = pm.getApplicationInfoIfExists(packageName) binding.appName = applicationInfo?.loadLabel(pm)?.toString() ?: packageName binding.appIcon = applicationInfo?.loadIcon(pm) - ?: AppCompatResources.getDrawable(requireContext(), android.R.mipmap.sym_def_app_icon) + ?: AppCompatResources.getDrawable(context, android.R.mipmap.sym_def_app_icon) } } } diff --git a/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAppPreferencesFragment.kt b/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAppPreferencesFragment.kt index cae63c36..7106e506 100755 --- a/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAppPreferencesFragment.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationAppPreferencesFragment.kt @@ -6,6 +6,7 @@ package org.microg.gms.ui +import android.annotation.SuppressLint import android.os.Bundle import android.text.format.DateUtils import androidx.appcompat.app.AlertDialog @@ -40,6 +41,7 @@ class PushNotificationAppPreferencesFragment : PreferenceFragmentCompat() { database = GcmDatabase(context) } + @SuppressLint("RestrictedApi") override fun onBindPreferences() { wakeForDelivery = preferenceScreen.findPreference("pref_push_app_wake_for_delivery") ?: wakeForDelivery allowRegister = preferenceScreen.findPreference("pref_push_app_allow_register") ?: allowRegister diff --git a/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationFragment.kt b/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationFragment.kt index 773578fa..8c906e03 100755 --- a/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationFragment.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/ui/PushNotificationFragment.kt @@ -31,10 +31,11 @@ class PushNotificationFragment : Fragment(R.layout.push_notification_fragment) { } fun setEnabled(newStatus: Boolean) { + val appContext = requireContext().applicationContext lifecycleScope.launchWhenResumed { - val info = getGcmServiceInfo(requireContext()) + val info = getGcmServiceInfo(appContext) val newConfiguration = info.configuration.copy(enabled = newStatus) - setGcmServiceConfiguration(requireContext(), newConfiguration) + setGcmServiceConfiguration(appContext, newConfiguration) displayServiceInfo(info.copy(configuration = newConfiguration)) } } @@ -45,9 +46,10 @@ class PushNotificationFragment : Fragment(R.layout.push_notification_fragment) { override fun onResume() { super.onResume() + val appContext = requireContext().applicationContext lifecycleScope.launchWhenResumed { - displayServiceInfo(getGcmServiceInfo(requireContext())) - binding.checkinEnabled = getCheckinServiceInfo(requireContext()).configuration.enabled + displayServiceInfo(getGcmServiceInfo(appContext)) + binding.checkinEnabled = getCheckinServiceInfo(appContext).configuration.enabled } } 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 39093757..e9b4291f 100755 --- 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 @@ -6,6 +6,7 @@ package org.microg.gms.ui +import android.annotation.SuppressLint import android.os.Bundle import android.os.Handler import android.text.format.DateUtils @@ -40,6 +41,7 @@ class PushNotificationPreferencesFragment : PreferenceFragmentCompat() { addPreferencesFromResource(R.xml.preferences_push_notifications) } + @SuppressLint("RestrictedApi") override fun onBindPreferences() { pushStatusCategory = preferenceScreen.findPreference("prefcat_push_status") ?: pushStatusCategory pushStatus = preferenceScreen.findPreference("pref_push_status") ?: pushStatus diff --git a/play-services-core/src/main/kotlin/org/microg/gms/ui/SettingsFragment.kt b/play-services-core/src/main/kotlin/org/microg/gms/ui/SettingsFragment.kt index 92b0d0ed..b1aa2a7e 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/ui/SettingsFragment.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/ui/SettingsFragment.kt @@ -3,27 +3,25 @@ * SPDX-License-Identifier: Apache-2.0 */ +@file:Suppress("UnusedImport") + package org.microg.gms.ui import android.content.ComponentName +import android.content.Context import android.content.pm.PackageManager -import android.content.Intent import android.os.Bundle -import androidx.lifecycle.lifecycleScope -import androidx.navigation.fragment.findNavController import androidx.preference.Preference import androidx.preference.SwitchPreferenceCompat import com.google.android.gms.cast.media.CastMediaRouteProviderService import com.mgoogle.android.gms.R -import org.microg.gms.checkin.CheckinClient -import org.microg.gms.checkin.getCheckinServiceInfo +import org.microg.gms.checkin.CheckinPrefs import org.microg.gms.gcm.GcmDatabase -import org.microg.gms.gcm.McsConstants.ACTION_RECONNECT -import org.microg.gms.gcm.McsService -import org.microg.gms.gcm.TriggerReceiver import org.microg.gms.gcm.getGcmServiceInfo import org.microg.mgms.settings.SettingsContract import org.microg.tools.ui.ResourceSettingsFragment +import androidx.lifecycle.lifecycleScope +import androidx.navigation.fragment.findNavController class SettingsFragment : ResourceSettingsFragment() { @@ -72,28 +70,24 @@ class SettingsFragment : ResourceSettingsFragment() { override fun onResume() { super.onResume() + val context = requireContext() lifecycleScope.launchWhenResumed { - updateDetails() + updateDetails(context) } } - private suspend fun updateDetails() { - val context = requireContext() + private suspend fun updateDetails(context: Context) { val gcmServiceInfo = getGcmServiceInfo(context) if (gcmServiceInfo.configuration.enabled) { val database = GcmDatabase(context) val regCount = database.registrationList.size - // check if we are connected as we should be and re-connect if not - if (!gcmServiceInfo.connected) { - context.sendBroadcast(Intent(ACTION_RECONNECT, null, context, TriggerReceiver::class.java)) - } database.close() - findPreference(PREF_GCM)?.setSummary(context.getResources().getString(R.string.service_status_enabled_short) + " - " + resources.getQuantityString(R.plurals.gcm_registered_apps_counter, regCount, regCount)) + findPreference(PREF_GCM)?.summary = context.resources.getString(R.string.service_status_enabled_short) + " - " + resources.getQuantityString(R.plurals.gcm_registered_apps_counter, regCount, regCount) } else { findPreference(PREF_GCM)?.setSummary(R.string.service_status_disabled_short) } - findPreference(PREF_CHECKIN)?.setSummary(if (getCheckinServiceInfo(context).configuration.enabled) R.string.service_status_enabled_short else R.string.service_status_disabled_short) + findPreference(PREF_CHECKIN)?.setSummary(if (CheckinPrefs.isEnabled(context)) R.string.service_status_enabled_short else R.string.service_status_disabled_short) } companion object { diff --git a/play-services-core/src/main/kotlin/org/microg/gms/ui/TextPreference.kt b/play-services-core/src/main/kotlin/org/microg/gms/ui/TextPreference.kt new file mode 100644 index 00000000..a6fefde7 --- /dev/null +++ b/play-services-core/src/main/kotlin/org/microg/gms/ui/TextPreference.kt @@ -0,0 +1,35 @@ +/* + * SPDX-FileCopyrightText: 2020, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.ui + +import android.content.Context +import android.util.AttributeSet +import android.view.Gravity +import android.view.ViewGroup.LayoutParams.MATCH_PARENT +import android.widget.LinearLayout +import android.widget.TextView +import androidx.preference.Preference +import androidx.preference.PreferenceViewHolder + +class TextPreference : Preference { + constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super( + context!!, attrs, defStyleAttr, defStyleRes) + constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context!!, attrs, defStyleAttr) + constructor(context: Context?, attrs: AttributeSet?) : super(context!!, attrs) + constructor(context: Context) : super(context) + + + override fun onBindViewHolder(holder: PreferenceViewHolder) { + super.onBindViewHolder(holder) + val iconFrame = holder.findViewById(androidx.preference.R.id.icon_frame) + iconFrame?.layoutParams?.height = MATCH_PARENT + (iconFrame as? LinearLayout)?.gravity = Gravity.TOP or Gravity.START + val pad = (context.resources.displayMetrics.densityDpi/160f * 20).toInt() + iconFrame?.setPadding(0, pad, 0, pad) + val textView = holder.findViewById(android.R.id.summary) as? TextView + textView?.maxLines = Int.MAX_VALUE + } +} diff --git a/play-services-core/src/main/kotlin/org/microg/gms/ui/Utils.kt b/play-services-core/src/main/kotlin/org/microg/gms/ui/Utils.kt index 5cfd2bfa..fbadc0f2 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/ui/Utils.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/ui/Utils.kt @@ -42,18 +42,17 @@ fun NavController.navigate(context: Context, @IdRes resId: Int, args: Bundle? = @RequiresApi(Build.VERSION_CODES.M) fun Context.hideIcon(hide: Boolean) { packageManager.setComponentEnabledSetting( - ComponentName.createRelative(this, "org.microg.gms.ui.SettingsActivityLauncher"), - when (hide) { - true -> PackageManager.COMPONENT_ENABLED_STATE_DISABLED - false -> PackageManager.COMPONENT_ENABLED_STATE_ENABLED - }, - PackageManager.DONT_KILL_APP + ComponentName.createRelative(this, "org.microg.gms.ui.SettingsActivityLauncher"), + when (hide) { + true -> PackageManager.COMPONENT_ENABLED_STATE_DISABLED + false -> PackageManager.COMPONENT_ENABLED_STATE_ENABLED + }, + PackageManager.DONT_KILL_APP ) } val Context.systemAnimationsEnabled: Boolean get() { - val duration: Float = Settings.Global.getFloat(contentResolver, Settings.Global.ANIMATOR_DURATION_SCALE, 1f) val transition: Float = Settings.Global.getFloat(contentResolver, Settings.Global.TRANSITION_ANIMATION_SCALE, 1f) diff --git a/play-services-core/src/main/kotlin/org/microg/gms/usagereporting/UsageReportingService.kt b/play-services-core/src/main/kotlin/org/microg/gms/usagereporting/UsageReportingService.kt new file mode 100644 index 00000000..86831b2e --- /dev/null +++ b/play-services-core/src/main/kotlin/org/microg/gms/usagereporting/UsageReportingService.kt @@ -0,0 +1,53 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.usagereporting + +import android.os.Bundle +import android.os.Parcel +import android.util.Log +import com.google.android.gms.common.api.CommonStatusCodes +import com.google.android.gms.common.api.Status +import com.google.android.gms.common.internal.GetServiceRequest +import com.google.android.gms.common.internal.IGmsCallbacks +import com.google.android.gms.usagereporting.UsageReportingOptInOptions +import com.google.android.gms.usagereporting.internal.IUsageReportingCallbacks +import com.google.android.gms.usagereporting.internal.IUsageReportingOptInOptionsChangedListener +import com.google.android.gms.usagereporting.internal.IUsageReportingService +import org.microg.gms.BaseService +import org.microg.gms.common.GmsService +import org.microg.gms.utils.warnOnTransactionIssues + +private const val TAG = "UsageReportingService" + +class UsageReportingService : BaseService(TAG, GmsService.USAGE_REPORTING) { + override fun handleServiceRequest(callback: IGmsCallbacks, request: GetServiceRequest, service: GmsService) { + callback.onPostInitComplete(CommonStatusCodes.SUCCESS, UsageReportingServiceImpl(), Bundle()) + } +} + +class UsageReportingServiceImpl : IUsageReportingService.Stub() { + override fun getOptInOptions(callbacks: IUsageReportingCallbacks) { + // Don't log to prevent log spam + callbacks.onOptInOptions(Status.SUCCESS, UsageReportingOptInOptions().apply { optInUsageReporting = 2 }) + } + + override fun setOptInOptions(options: UsageReportingOptInOptions, callbacks: IUsageReportingCallbacks) { + Log.d(TAG, "setOptInOptions($options)") + callbacks.onOptInOptionsSet(Status.SUCCESS) + } + + override fun addOptInOptionsChangedListener(listener: IUsageReportingOptInOptionsChangedListener, callbacks: IUsageReportingCallbacks) { + Log.d(TAG, "addOptInOptionsChangedListener($listener)") + callbacks.onOptInOptionsChangedListenerAdded(Status.SUCCESS) + } + + override fun removeOptInOptionsChangedListener(listener: IUsageReportingOptInOptionsChangedListener, callbacks: IUsageReportingCallbacks) { + Log.d(TAG, "removeOptInOptionsChangedListener($listener)") + callbacks.onOptInOptionsChangedListenerRemoved(Status.SUCCESS) + } + + override fun onTransact(code: Int, data: Parcel, reply: Parcel?, flags: Int): Boolean = warnOnTransactionIssues(code, reply, flags) { super.onTransact(code, data, reply, flags) } +} diff --git a/play-services-core/src/main/kotlin/org/microg/gms/utils/BinderUtils.kt b/play-services-core/src/main/kotlin/org/microg/gms/utils/BinderUtils.kt index 56a9737e..79e8ff8f 100644 --- a/play-services-core/src/main/kotlin/org/microg/gms/utils/BinderUtils.kt +++ b/play-services-core/src/main/kotlin/org/microg/gms/utils/BinderUtils.kt @@ -6,16 +6,19 @@ package org.microg.gms.utils import android.os.Binder +import android.os.IBinder import android.os.Parcel import android.util.Log -fun warnOnTransactionIssues(tag: String, code: Int, reply: Parcel?, flags: Int, base: () -> Boolean): Boolean { +private const val TAG = "BinderUtils" + +fun IBinder.warnOnTransactionIssues(code: Int, reply: Parcel?, flags: Int, base: () -> Boolean): Boolean { if (base.invoke()) { if ((flags and Binder.FLAG_ONEWAY) > 0 && (reply?.dataSize() ?: 0) > 0) { - Log.w(tag, "onTransact[$code] is oneway, but returned data") + Log.w(TAG, "Method $code in $interfaceDescriptor is oneway, but returned data") } return true } - Log.w(tag, "onTransact[$code] is not processed.") + Log.w(TAG, "Unknown method $code in $interfaceDescriptor, skipping") return (flags and Binder.FLAG_ONEWAY) > 0 // Don't return false on oneway transaction to suppress warning -} \ No newline at end of file +} diff --git a/play-services-core/src/main/kotlin/org/microg/gms/utils/FileXmlResourceParser.kt b/play-services-core/src/main/kotlin/org/microg/gms/utils/FileXmlResourceParser.kt new file mode 100644 index 00000000..689d0f46 --- /dev/null +++ b/play-services-core/src/main/kotlin/org/microg/gms/utils/FileXmlResourceParser.kt @@ -0,0 +1,127 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package org.microg.gms.utils + +import android.content.res.XmlResourceParser +import android.util.Xml +import org.xmlpull.v1.XmlPullParser +import java.io.Closeable +import java.io.File +import java.io.FileReader +import java.io.Reader + +class FileXmlResourceParser(private val reader: Reader, private val parser: XmlPullParser = Xml.newPullParser()) : + XmlResourceParser, + XmlPullParser by parser, + Closeable by reader { + constructor(file: File) : this(FileReader(file)) + + init { + parser.setInput(reader) + } + + override fun getAttributeNameResource(index: Int): Int { + return 0 + } + + override fun getAttributeListValue( + namespace: String?, attribute: String?, + options: Array?, defaultValue: Int + ): Int { + val s = getAttributeValue(namespace, attribute) + return s?.toInt() ?: defaultValue + } + + override fun getAttributeBooleanValue( + namespace: String?, attribute: String?, + defaultValue: Boolean + ): Boolean { + + val s = getAttributeValue(namespace, attribute) + return s?.toBooleanStrictOrNull() ?: defaultValue + } + + override fun getAttributeResourceValue( + namespace: String?, attribute: String?, + defaultValue: Int + ): Int { + val s = getAttributeValue(namespace, attribute) + return s?.toInt() ?: defaultValue + } + + override fun getAttributeIntValue( + namespace: String?, attribute: String?, + defaultValue: Int + ): Int { + val s = getAttributeValue(namespace, attribute) + return s?.toInt() ?: defaultValue + } + + override fun getAttributeUnsignedIntValue( + namespace: String?, attribute: String?, + defaultValue: Int + ): Int { + val s = getAttributeValue(namespace, attribute) + return s?.toInt() ?: defaultValue + } + + override fun getAttributeFloatValue( + namespace: String?, attribute: String?, + defaultValue: Float + ): Float { + val s = getAttributeValue(namespace, attribute) + return s?.toFloat() ?: defaultValue + } + + override fun getAttributeListValue( + index: Int, + options: Array?, defaultValue: Int + ): Int { + val s = getAttributeValue(index) + return s?.toInt() ?: defaultValue + } + + override fun getAttributeBooleanValue(index: Int, defaultValue: Boolean): Boolean { + val s = getAttributeValue(index) + return s?.toBooleanStrictOrNull() ?: defaultValue + } + + override fun getAttributeResourceValue(index: Int, defaultValue: Int): Int { + val s = getAttributeValue(index) + return s?.toInt() ?: defaultValue + } + + override fun getAttributeIntValue(index: Int, defaultValue: Int): Int { + val s = getAttributeValue(index) + return s?.toInt() ?: defaultValue + } + + override fun getAttributeUnsignedIntValue(index: Int, defaultValue: Int): Int { + val s = getAttributeValue(index) + return s?.toInt() ?: defaultValue + } + + override fun getAttributeFloatValue(index: Int, defaultValue: Float): Float { + val s = getAttributeValue(index) + return s?.toFloat() ?: defaultValue + } + + override fun getIdAttribute(): String? { + return getAttributeValue(null, "id") + } + + override fun getClassAttribute(): String? { + return getAttributeValue(null, "class") + } + + override fun getIdAttributeResourceValue(defaultValue: Int): Int { + return getAttributeResourceValue(null, "id", defaultValue) + } + + override fun getStyleAttribute(): Int { + return getAttributeResourceValue(null, "style", 0) + } +} diff --git a/play-services-core/src/main/kotlin/org/microg/mgms/settings/SettingsContract.kt b/play-services-core/src/main/kotlin/org/microg/mgms/settings/SettingsContract.kt index 84a7c321..841b47a0 100644 --- a/play-services-core/src/main/kotlin/org/microg/mgms/settings/SettingsContract.kt +++ b/play-services-core/src/main/kotlin/org/microg/mgms/settings/SettingsContract.kt @@ -88,6 +88,20 @@ object SettingsContract { ) } + object Profile { + private const val id = "profile" + fun getContentUri(context: Context) = Uri.withAppendedPath(getAuthorityUri(context), id) + fun getContentType(context: Context) = "vnd.android.cursor.item/vnd.${getAuthority(context)}.$id" + + const val PROFILE = "device_profile" + const val SERIAL = "device_profile_serial" + + val PROJECTION = arrayOf( + PROFILE, + SERIAL + ) + } + private fun withoutCallingIdentity(f: () -> T): T { val identity = Binder.clearCallingIdentity() try { @@ -97,6 +111,7 @@ object SettingsContract { } } + @JvmStatic fun getSettings(context: Context, uri: Uri, projection: Array?, f: (Cursor) -> T): T = withoutCallingIdentity { context.contentResolver.query(uri, projection, null, null, null).use { c -> require(c != null) { "Cursor for query $uri ${projection?.toList()} was null" } @@ -105,6 +120,7 @@ object SettingsContract { } } + @JvmStatic fun setSettings(context: Context, uri: Uri, v: ContentValues.() -> Unit) = withoutCallingIdentity { val values = ContentValues().apply { v.invoke(this) } val affected = context.contentResolver.update(uri, values, null, null) diff --git a/play-services-core/src/main/kotlin/org/microg/mgms/settings/SettingsProvider.kt b/play-services-core/src/main/kotlin/org/microg/mgms/settings/SettingsProvider.kt index b5731eb2..404aa443 100644 --- a/play-services-core/src/main/kotlin/org/microg/mgms/settings/SettingsProvider.kt +++ b/play-services-core/src/main/kotlin/org/microg/mgms/settings/SettingsProvider.kt @@ -20,6 +20,7 @@ import org.microg.gms.gcm.GcmPrefs import org.microg.mgms.settings.SettingsContract.Auth import org.microg.mgms.settings.SettingsContract.CheckIn import org.microg.mgms.settings.SettingsContract.Gcm +import org.microg.mgms.settings.SettingsContract.Profile import org.microg.mgms.settings.SettingsContract.getAuthority import java.io.File @@ -61,6 +62,7 @@ class SettingsProvider : ContentProvider() { CheckIn.getContentUri(context!!) -> queryCheckIn(projection ?: CheckIn.PROJECTION) Gcm.getContentUri(context!!) -> queryGcm(projection ?: Gcm.PROJECTION) Auth.getContentUri(context!!) -> queryAuth(projection ?: Auth.PROJECTION) + Profile.getContentUri(context!!) -> queryProfile(projection ?: Profile.PROJECTION) else -> null } @@ -76,6 +78,7 @@ class SettingsProvider : ContentProvider() { CheckIn.getContentUri(context!!) -> updateCheckIn(values) Gcm.getContentUri(context!!) -> updateGcm(values) Auth.getContentUri(context!!) -> updateAuth(values) + Profile.getContentUri(context!!) -> updateProfile(values) else -> return 0 } return 1 @@ -214,9 +217,30 @@ class SettingsProvider : ContentProvider() { editor.apply() } + private fun queryProfile(p: Array): Cursor = MatrixCursor(p).addRow(p) { key -> + when (key) { + Profile.PROFILE -> getSettingsString(key, "auto") + Profile.SERIAL -> getSettingsString(key) + else -> throw IllegalArgumentException("Unknown key: $key") + } + } + + private fun updateProfile(values: ContentValues) { + if (values.size() == 0) return + val editor = preferences.edit() + values.valueSet().forEach { (key, value) -> + when (key) { + Profile.PROFILE -> editor.putString(key, value as String?) + Profile.SERIAL -> editor.putString(key, value as String?) + else -> throw IllegalArgumentException("Unknown key: $key") + } + } + editor.apply() + } + private fun MatrixCursor.addRow( p: Array, - valueGetter: (String) -> Any + valueGetter: (String) -> Any? ): MatrixCursor { val row = newRow() for (key in p) row.add(valueGetter.invoke(key)) @@ -241,7 +265,16 @@ class SettingsProvider : ContentProvider() { * @return the current setting as [Int], because [ContentProvider] does not support [Boolean]. */ private fun getSettingsBoolean(key: String, def: Boolean): Int { - val default = systemDefaultPreferences?.getBoolean(key, def) ?: def - return if (preferences.getBoolean(key, default)) 1 else 0 + return listOf(preferences, systemDefaultPreferences).getBooleanAsInt(key, def) } + + private fun getSettingsString(key: String, def: String? = null): String? = listOf(preferences, systemDefaultPreferences).getString(key, def) + private fun getSettingsInt(key: String, def: Int): Int = listOf(preferences, systemDefaultPreferences).getInt(key, def) + private fun getSettingsLong(key: String, def: Long): Long = listOf(preferences, systemDefaultPreferences).getLong(key, def) + + private fun List.getString(key: String, def: String?): String? = foldRight(def) { preferences, defValue -> preferences?.getString(key, defValue) ?: defValue } + private fun List.getInt(key: String, def: Int): Int = foldRight(def) { preferences, defValue -> preferences?.getInt(key, defValue) ?: defValue } + private fun List.getLong(key: String, def: Long): Long = foldRight(def) { preferences, defValue -> preferences?.getLong(key, defValue) ?: defValue } + private fun List.getBoolean(key: String, def: Boolean): Boolean = foldRight(def) { preferences, defValue -> preferences?.getBoolean(key, defValue) ?: defValue } + private fun List.getBooleanAsInt(key: String, def: Boolean): Int = if (getBoolean(key, def)) 1 else 0 } diff --git a/play-services-core/src/main/res/drawable-anydpi-v21/microg_light_color_24.xml b/play-services-core/src/main/res/drawable-anydpi-v21/microg_light_color_24.xml index 5d62e2e4..9f1500dc 100644 --- a/play-services-core/src/main/res/drawable-anydpi-v21/microg_light_color_24.xml +++ b/play-services-core/src/main/res/drawable-anydpi-v21/microg_light_color_24.xml @@ -1,4 +1,4 @@ - - - - \ No newline at end of file diff --git a/play-services-core/src/main/res/layout/push_notification_app_fragment.xml b/play-services-core/src/main/res/layout/push_notification_app_fragment.xml index 4f63f961..5e32fcee 100755 --- a/play-services-core/src/main/res/layout/push_notification_app_fragment.xml +++ b/play-services-core/src/main/res/layout/push_notification_app_fragment.xml @@ -5,7 +5,6 @@ --> diff --git a/play-services-core/src/main/res/layout/push_notification_fragment.xml b/play-services-core/src/main/res/layout/push_notification_fragment.xml index 4cf48176..fdd799bd 100755 --- a/play-services-core/src/main/res/layout/push_notification_fragment.xml +++ b/play-services-core/src/main/res/layout/push_notification_fragment.xml @@ -5,8 +5,7 @@ --> + xmlns:app="http://schemas.android.com/apk/res-auto"> diff --git a/play-services-core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/play-services-core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 7353dbd1..00000000 --- a/play-services-core/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/play-services-core/src/main/res/mipmap-hdpi/ic_launcher_round.png b/play-services-core/src/main/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index a6c6fb8a..00000000 Binary files a/play-services-core/src/main/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/play-services-core/src/main/res/mipmap-mdpi/ic_launcher_round.png b/play-services-core/src/main/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 41b90dae..00000000 Binary files a/play-services-core/src/main/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/play-services-core/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/play-services-core/src/main/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index e70c0582..00000000 Binary files a/play-services-core/src/main/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/play-services-core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/play-services-core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index 03cec2d8..00000000 Binary files a/play-services-core/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/play-services-core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/play-services-core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index 092eadd7..00000000 Binary files a/play-services-core/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/play-services-core/src/main/res/values-cs/strings.xml b/play-services-core/src/main/res/values-cs/strings.xml index 43a9ee9e..6434a8a1 100644 --- a/play-services-core/src/main/res/values-cs/strings.xml +++ b/play-services-core/src/main/res/values-cs/strings.xml @@ -26,9 +26,6 @@ Klepnutím zde přejděte do nastavení a zakažte optimalizaci baterie pro aplikaci Vanced microG. Po provedení této akce a restartu zařízení toto oznámení zmizí Počkejte chviličku… - Pokud budete pokračovat, povolíte této aplikaci a společnosti Google využívat vaše informace v souladu s jejich příslušnými podmínkami služby a zásadami ochrany osobních údajů. - Aplikace %1$s by chtěla: - Aplikace %1$s by chtěla použít: Google Account Manager Promiňte… "Aplikace na vašem zařízení se pokouší přihlásit se k účtu Google. @@ -47,10 +44,6 @@ Zkuste to později." "Vaše zařízení právě kontaktuje Google za účelem uložení informací do vašeho účtu. Tato akce může trvat několik minut." - Povolit - Zamítnout - Je vyžadováno ověření - Aplikace %1$s pro přístup k vašemu účtu Google vyžaduje vaše ověření. poslouchat interní stavová vysílání poslouchat zprávy C2DM @@ -82,10 +75,6 @@ Tato akce může trvat několik minut." Neregistrováno Naposledy registrováno: %1$s - Optimalizace baterie jsou povoleny - Máte povolenou funkci Cloud Messaging, ale zároveň máte aktivní i optimalizace baterie pro microG Services Core. Aby vám mohla být doručována push oznámení, je potřeba optimalizace baterie zakázat. - Zakázat optimalizace - Předvolby účtu Osobní informace a soukromí Přihlášení a zabezpečení @@ -128,7 +117,6 @@ Tato akce může trvat několik minut." Připojeno: %1$s Povolit registraci - Povolit aplikaci {appName} registraci pro příjem push oznámení? Povolit aplikaci registraci pro příjem push oznámení. Spouštět aplikaci pro přijímání push zpráv Spouštět aplikaci na pozadí, aby mohla přijímat příchozí push zprávy. diff --git a/play-services-core/src/main/res/values-es/strings.xml b/play-services-core/src/main/res/values-es/strings.xml index cf50650e..eb1a176b 100644 --- a/play-services-core/src/main/res/values-es/strings.xml +++ b/play-services-core/src/main/res/values-es/strings.xml @@ -26,9 +26,6 @@ Toque aqui y deshabilita la optimización de batería para vanced microG, luego reinicie el dispositivo para cerrar esta notificación Solo un momento… - Al continuar, permites que esta app y Google usen tu información de acuerdo con sus respectivos términos de servicio y políticas de privacidad. - %1$s Le gustaria que: - %1$s Le gustaria usar: Administrador de Cuentas Google Disculpa… "Una app en tu dispositivo esta intentando iniciar sesión a una cuenta de Google. @@ -47,10 +44,6 @@ Vuelva a intentar en un rato." "Tu dispositivo esta contactando a Google para guardar información en tu cuenta. Esto puede tardar unos minutos." - Permitir - Denegar - Autenticación requerida - %1$s requiere tu autorización para acceder a tu cuenta de Google. escuchar transmisiones de estatus interno escuchar mensajes de C2DM @@ -82,10 +75,6 @@ Esto puede tardar unos minutos." No registrado Ultimo registro: %1$s - Optimizaciones de bateria habilitadas - Has habilitado Cloud Messaging pero tienes las optimizacion de bateria activada para los servicios de microG. Para que lleguen las notificaciones deberás deshabilitar la optimización de batería para microG. - Deshabilitar optimizaciones - Preferencias de Cuenta Informacion personal & privacidad Inició de Sesión y Seguridad @@ -128,7 +117,6 @@ Esto puede tardar unos minutos." Conectado desde %1$s Permitir registro - Permita que {appName} se registre para notificaciones push? Permita la app para registrarse para notificaciones push. Iniciar app en un mensaje push Iniciar app en segundo plano para recibir mensajes push entrantes. diff --git a/play-services-core/src/main/res/values-in/strings.xml b/play-services-core/src/main/res/values-in/strings.xml index d3163eb4..63f0aabb 100644 --- a/play-services-core/src/main/res/values-in/strings.xml +++ b/play-services-core/src/main/res/values-in/strings.xml @@ -26,9 +26,6 @@ Ketuk di sini dan nonaktifkan pengoptimalan baterai untuk microG, lalu reboot perangkat untuk menghapus notifikasi ini. Tunggu sebentar… - Dengan melanjutkan, anda mengizinkan aplikasi ini dan Google untuk menggunakan informasi anda sesuai dengan persyaratan layanan masing-masing dan kebijakan privasi. - %1$s ingin: - %1$s ingin menggunakan: Pengelola akun Google Maaf… "Sebuah aplikasi di perangkat anda mencoba untuk masuk ke akun Google. @@ -47,10 +44,6 @@ Coba lagi nanti." "Perangkat anda sedang menghubungkan ke Google untuk menyimpan informasi ke akun anda. Ini bisa berlangsung beberapa menit." - Izinkan - Tolak - Autentikasi dibutuhkan - %1$s membutuhkan autentikasi anda untuk mengakses akun Google anda. mendengarkan ke siaran internal langsung kirim ke pesan C2DM @@ -82,10 +75,6 @@ Ini bisa berlangsung beberapa menit." Tidak diregistrasi Registrasi terakhir: %1$s - Optimisasi baterai diaktifkan - Anda mengaktifkan Cloud Messaging namun mengaktifkan optimisasi baterai untuk layanan utama microG. Untuk mendapatkan notifikasi push anda harus menonaktifkan optimisasi baterai. - Nonaktifkan optimisasi - Preferensi akun Informasi pribadi & privasi Masuk & keamanan @@ -126,7 +115,6 @@ Ini bisa berlangsung beberapa menit." Terhubung sejak %1$s Izinkan registrasi - Izinkan {appName} untuk mendaftar pemberitahuan push? Izinkan aplikasi untuk meregistrasi untuk notifikasi push. Mulai aplikasi dalam pesan push Mulai aplikasi saat di background untuk menerima pesan push yang akan datang. diff --git a/play-services-core/src/main/res/values-it/strings.xml b/play-services-core/src/main/res/values-it/strings.xml index faaf7b72..9a4f8e0a 100755 --- a/play-services-core/src/main/res/values-it/strings.xml +++ b/play-services-core/src/main/res/values-it/strings.xml @@ -26,9 +26,6 @@ Tocca qui per disattivare l\'ottimizzazione della batteria per microG, poi riavvia il dispositivo per rimuovere questa notifica. Solo un secondo… - Continuando, consentirai a quest\'app e a Google di utilizzare le tue informazioni in conformità con i rispettivi termini di servizio e politiche sulla riservatezza. - %1$s vorrebbe: - %1$s vorrebbe utilizzare: Gestore Account Google Ci scusiamo… "Un'app sul tuo dispositivo sta tentando di accedere a un account Google. @@ -47,10 +44,6 @@ Riprova più tardi." "Il tuo dispositivo sta tentando di contattare Google per salvare le informazioni sul tuo account. Questo potrà richiedere un paio di minuti" - Consenti - Nega - Autenticazione richiesta - %1$s richiede a tua autorizzazione per accedere al tuo account Google. ascolta le trasmissioni di stato interne ascolta i messaggi C2DM @@ -82,10 +75,6 @@ Questo potrà richiedere un paio di minuti" Non registrato Ultima registrazione: %1$s - Ottimizzazione batteria attivata - Hai attivato l\'opzione Messaggistica Cloud ma i Servizi Vanced microG risultano al momento limitati dall\'ottimizzazione energetica di sistema. Se desideri ricevere le notifiche push, escludi i microG da questa ottimizzazione. - Disattiva ottimizzazione - Preferenze account Info personali e privacy Accesso e sicurezza @@ -126,7 +115,6 @@ Questo potrà richiedere un paio di minuti" Connesso %1$s Consenti registrazione - Consentire a {appName} di registrarsi per ricevere notifiche push? Consenti all\'app di registrarsi per ricevere notifiche push. Esegui app su messaggio push Esegui l\'app in secondo piano per ricevere i messaggi push in arrivo. @@ -137,4 +125,14 @@ Questo potrà richiedere un paio di minuti" Reti utilizzate per le notifiche push Attiva questa opzione in caso di voci duplicate nel menù di trasmissione + Profilo dispositivo + Seleziona profilo + Nativo + Reale + Personalizzato: %s + Automatico: %s + Sistema: %s + Importa profilo personalizzato + Importa profilo dispositivo da file + Seriale diff --git a/play-services-core/src/main/res/values-ru/strings.xml b/play-services-core/src/main/res/values-ru/strings.xml index 93be7343..25151d51 100644 --- a/play-services-core/src/main/res/values-ru/strings.xml +++ b/play-services-core/src/main/res/values-ru/strings.xml @@ -26,9 +26,6 @@ Нажмите здесь, чтобы отключить режим энергосбережения для microG. Затем перезагрузите устройство, чтобы отключить уведомление. Секундочку… - Продолжая, вы разрешаете этому приложению и Google использовать вашу информацию в соответствии с их соответствующими условиями использования и политикой конфиденциальности. - %1$s требует разрешение на: - %1$s хочет использовать: Настройки аккаунта Google Извините… "Это приложение на вашем устройстве пытается подключиться к вашему аккаунту Google. @@ -47,10 +44,6 @@ "Ваше устройство получает данные авторизации от Google. Это может занять несколько минут." - Разрешить - Отклонить - Необходима авторизация - %1$s требует вас авторизироваться в аккаунт Google. прослушивать внутренние сообщения о состоянии прослушивать C2DM сообщения @@ -82,10 +75,6 @@ Не зарегистрирован Последняя регистрация: %1$s - Включена экономия заряда батареи - Вы включили Cloud Messaging, но не отключили экономию заряда батареи для Vanced microG. Для корректной работы уведомлений вам нужно отключить экономию заряда батареи. - Отключить экономию - Настройки аккаунта Конфиденциальность Вход и безопастность @@ -128,7 +117,6 @@ Соединено: %1$s Разрешать авторизацию - Разрешить приложению {appName} регистрацию для push-уведомлений. Разрешить приложению регистрацию для push-уведомлений. Запуск приложения при уведомлении Запуск приложения в фоне для получения уведомлений. diff --git a/play-services-core/src/main/res/values/colors.xml b/play-services-core/src/main/res/values/colors.xml index 74ecc07a..cc8263b2 100755 --- a/play-services-core/src/main/res/values/colors.xml +++ b/play-services-core/src/main/res/values/colors.xml @@ -19,5 +19,4 @@ #ff3367d6 #ffFFAB40 - #88CCCCCC diff --git a/play-services-core/src/main/res/values/strings.xml b/play-services-core/src/main/res/values/strings.xml index 030ec7bd..29c2759b 100755 --- a/play-services-core/src/main/res/values/strings.xml +++ b/play-services-core/src/main/res/values/strings.xml @@ -16,7 +16,6 @@ --> - Vanced microG Settings Setup Vanced microG. @@ -26,9 +25,6 @@ Tap here to disable battery optimization for vanced microG, then restart the device to remove this notification Just a sec… - By continuing, you allow this app and Google to use your information in accordance with their respective terms of service and privacy policies. - %1$s would like to: - %1$s would like to use: Google Account Manager Sorry… "An app on your device is trying to sign in to a Google account. @@ -47,10 +43,6 @@ Try again later." "Your device is contacting Google to save information to your account. This can take a couple of minutes." - Allow - Deny - Authentication required - %1$s requires your authorization to access your Google account. listen to internal status broadcasts listen to C2DM messages @@ -82,10 +74,6 @@ This can take a couple of minutes." Not registered Last registration: %1$s - Battery optimizations enabled - You enabled Cloud Messaging but have battery optimizations active for microG Services Core. For push notifications to arrive you should disable battery optimizations. - Disable optimization - Account preferences Personal info & privacy Sign-in & security @@ -128,7 +116,6 @@ This can take a couple of minutes." Connected since %1$s Allow registration - Allow {appName} to register for push notifications? Allow the app to register for push notifications. Start app on push message Start the app while in background to receive the incoming push messages. @@ -139,4 +126,14 @@ This can take a couple of minutes." Networks to use for push notifications Enable this if you see duplicates in your casting menu + Device profile + Select profile + Native + Real + Custom: %s + Automatic: %s + System: %s + Import custom profile + Import device profile from file + Serial diff --git a/play-services-core/src/main/res/values/themes.xml b/play-services-core/src/main/res/values/themes.xml index da313b25..191b4777 100755 --- a/play-services-core/src/main/res/values/themes.xml +++ b/play-services-core/src/main/res/values/themes.xml @@ -26,13 +26,4 @@ false - - - diff --git a/play-services-core/src/main/res/xml/preferences_device_registration.xml b/play-services-core/src/main/res/xml/preferences_device_registration.xml index d245d19c..ecd4b469 100755 --- a/play-services-core/src/main/res/xml/preferences_device_registration.xml +++ b/play-services-core/src/main/res/xml/preferences_device_registration.xml @@ -6,22 +6,40 @@ + + + + + - diff --git a/play-services-core/src/main/res/xml/preferences_push_notifications.xml b/play-services-core/src/main/res/xml/preferences_push_notifications.xml index 3e1201fc..20862ae7 100755 --- a/play-services-core/src/main/res/xml/preferences_push_notifications.xml +++ b/play-services-core/src/main/res/xml/preferences_push_notifications.xml @@ -5,7 +5,6 @@ --> - + diff --git a/play-services-iid-api/build.gradle b/play-services-iid-api/build.gradle index 98613334..9a497d27 100644 --- a/play-services-iid-api/build.gradle +++ b/play-services-iid-api/build.gradle @@ -18,7 +18,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion androidCompileSdk - buildToolsVersion "$androidBuildVersionTools" + buildToolsVersion "30.0.3" defaultConfig { minSdkVersion androidMinSdk diff --git a/play-services-iid-api/src/main/java/com/google/android/gms/iid/MessengerCompat.java b/play-services-iid-api/src/main/java/com/google/android/gms/iid/MessengerCompat.java index 05bf4c8c..0e51092f 100644 --- a/play-services-iid-api/src/main/java/com/google/android/gms/iid/MessengerCompat.java +++ b/play-services-iid-api/src/main/java/com/google/android/gms/iid/MessengerCompat.java @@ -16,6 +16,9 @@ package com.google.android.gms.iid; +import static android.os.Build.VERSION.SDK_INT; +import static android.os.Build.VERSION_CODES.LOLLIPOP; + import android.os.Binder; import android.os.Handler; import android.os.IBinder; @@ -25,9 +28,6 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; -import static android.os.Build.VERSION.SDK_INT; -import static android.os.Build.VERSION_CODES.LOLLIPOP; - public class MessengerCompat implements Parcelable { private Messenger messenger; private IMessengerCompat messengerCompat; diff --git a/play-services-location-api/build.gradle b/play-services-location-api/build.gradle index 5066a8dd..f16d2c33 100644 --- a/play-services-location-api/build.gradle +++ b/play-services-location-api/build.gradle @@ -18,7 +18,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion androidCompileSdk - buildToolsVersion "$androidBuildVersionTools" + buildToolsVersion "30.0.3" defaultConfig { minSdkVersion androidMinSdk diff --git a/play-services-location-api/gradle.properties b/play-services-location-api/gradle.properties index cb75f79e..de0a3085 100644 --- a/play-services-location-api/gradle.properties +++ b/play-services-location-api/gradle.properties @@ -30,4 +30,5 @@ POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt POM_LICENCE_DIST=repo POM_DEVELOPER_ID=mar-v-in -POM_DEVELOPER_NAME=Marvin W \ No newline at end of file +POM_DEVELOPER_NAME=Marvin W + diff --git a/play-services-location-api/src/main/aidl/com/google/android/gms/location/DeviceOrientation.aidl b/play-services-location-api/src/main/aidl/com/google/android/gms/location/DeviceOrientation.aidl new file mode 100644 index 00000000..3055c41b --- /dev/null +++ b/play-services-location-api/src/main/aidl/com/google/android/gms/location/DeviceOrientation.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.location; + +parcelable DeviceOrientation; diff --git a/play-services-location-api/src/main/aidl/com/google/android/gms/location/IDeviceOrientationListener.aidl b/play-services-location-api/src/main/aidl/com/google/android/gms/location/IDeviceOrientationListener.aidl new file mode 100644 index 00000000..e3d3e6f0 --- /dev/null +++ b/play-services-location-api/src/main/aidl/com/google/android/gms/location/IDeviceOrientationListener.aidl @@ -0,0 +1,7 @@ +package com.google.android.gms.location; + +import com.google.android.gms.location.DeviceOrientation; + +interface IDeviceOrientationListener { + void onDeviceOrientationChanged(in DeviceOrientation deviceOrientation); +} diff --git a/play-services-location-api/src/main/aidl/com/google/android/gms/location/internal/DeviceOrientationRequestUpdateData.aidl b/play-services-location-api/src/main/aidl/com/google/android/gms/location/internal/DeviceOrientationRequestUpdateData.aidl new file mode 100644 index 00000000..e92b0f0d --- /dev/null +++ b/play-services-location-api/src/main/aidl/com/google/android/gms/location/internal/DeviceOrientationRequestUpdateData.aidl @@ -0,0 +1,3 @@ +package com.google.android.gms.location.internal; + +parcelable DeviceOrientationRequestUpdateData; diff --git a/play-services-location-api/src/main/aidl/com/google/android/gms/location/internal/IGoogleLocationManagerService.aidl b/play-services-location-api/src/main/aidl/com/google/android/gms/location/internal/IGoogleLocationManagerService.aidl index 8e78a899..19f9be10 100644 --- a/play-services-location-api/src/main/aidl/com/google/android/gms/location/internal/IGoogleLocationManagerService.aidl +++ b/play-services-location-api/src/main/aidl/com/google/android/gms/location/internal/IGoogleLocationManagerService.aidl @@ -5,8 +5,10 @@ import android.location.Location; import android.os.Bundle; import com.google.android.gms.common.api.Status; +import com.google.android.gms.common.api.internal.IStatusCallback; import com.google.android.gms.location.places.AutocompleteFilter; import com.google.android.gms.location.places.internal.IPlacesCallbacks; +import com.google.android.gms.location.internal.DeviceOrientationRequestUpdateData; import com.google.android.gms.location.internal.ISettingsCallbacks; import com.google.android.gms.location.internal.LocationRequestInternal; import com.google.android.gms.location.internal.LocationRequestUpdateData; @@ -36,17 +38,19 @@ interface IGoogleLocationManagerService { void removeGeofencesByIntent(in PendingIntent pendingIntent, IGeofencerCallbacks callbacks, String packageName) = 1; void removeGeofencesById(in String[] geofenceRequestIds, IGeofencerCallbacks callbacks, String packageName) = 2; void removeAllGeofences(IGeofencerCallbacks callbacks, String packageName) = 3; +// void removeGeofences(in RemoveGeofencingRequest request, IGeofencerCallbacks callback) = 73; void requestActivityUpdates(long detectionIntervalMillis, boolean alwaysTrue, in PendingIntent callbackIntent) = 4; void removeActivityUpdates(in PendingIntent callbackIntent) = 5; ActivityRecognitionResult getLastActivity(String packageName) = 63; - Status iglms65(in PendingIntent pendingIntent) = 64; - Status iglms66(in PendingIntent pendingIntent) = 65; Status requestGestureUpdates(in GestureRequest request, in PendingIntent pendingIntent) = 59; Status iglms61(in PendingIntent pendingIntent) = 60; Location getLastLocation() = 6; + Location getLastLocationWithPackage(String packageName) = 20; + Location getLastLocationWith(String s) = 79; + void requestLocationUpdatesWithListener(in LocationRequest request, ILocationListener listener) = 7; void requestLocationUpdatesWithPackage(in LocationRequest request, ILocationListener listener, String packageName) = 19; void requestLocationUpdatesWithIntent(in LocationRequest request, in PendingIntent callbackIntent) = 8; @@ -55,34 +59,55 @@ interface IGoogleLocationManagerService { void removeLocationUpdatesWithListener(ILocationListener listener) = 9; void removeLocationUpdatesWithIntent(in PendingIntent callbackIntent) = 10; void updateLocationRequest(in LocationRequestUpdateData locationRequestUpdateData) = 58; - //void flushLocations(IFusedLocationProviderCallback callback = 66; +// void flushLocations(IFusedLocationProviderCallback callback) = 66; void setMockMode(boolean mockMode) = 11; void setMockLocation(in Location mockLocation) = 12; + void injectLocation(in Location mockLocation, int injectionType) = 25; - Location getLastLocationWithPackage(String packageName) = 20; - void iglms26(in Location var1, int var2) = 25; LocationAvailability getLocationAvailabilityWithPackage(String packageName) = 33; - IBinder iglms51() = 50; +// void requestSleepSegmentUpdates(in PendingIntent pendingIntent, in SleepSegmentRequest request, IStatusCallback callback) = 78; + void removeSleepSegmentUpdates(in PendingIntent pendingIntent, IStatusCallback callback) = 68; + void requestLocationSettingsDialog(in LocationSettingsRequest settingsRequest, ISettingsCallbacks callback, String packageName) = 62; +// void requestActivityTransitionUpdates(in ActivityTransitionRequest request, in PendingIntent pendingIntent, IStatusCallback callback) = 71; + void removeActivityTransitionUpdates(in PendingIntent pendingIntent, IStatusCallback callback) = 72; + + void updateDeviceOrientationRequest(in DeviceOrientationRequestUpdateData request) = 74; + + boolean setActivityRecognitionMode(int mode) = 76; + void iglms14(in LatLngBounds var1, int var2, in PlaceFilter var3, in PlacesParams var4, IPlacesCallbacks var5) = 13; void iglms15(String var1, in PlacesParams var2, IPlacesCallbacks var3) = 14; void iglms16(in LatLng var1, in PlaceFilter var2, in PlacesParams var3, IPlacesCallbacks var4) = 15; void iglms17(in PlaceFilter var1, in PlacesParams var2, IPlacesCallbacks var3) = 16; void iglms18(in PlaceRequest var1, in PlacesParams var2, in PendingIntent var3) = 17; void iglms19(in PlacesParams var1, in PendingIntent var2) = 18; + void iglms25(in PlaceReport var1, in PlacesParams var2) = 24; + void iglms42(String var1, in PlacesParams var2, IPlacesCallbacks var3) = 41; + void iglms46(in UserAddedPlace var1, in PlacesParams var2, IPlacesCallbacks var3) = 45; void iglms47(in LatLngBounds var1, int var2, String var3, in PlaceFilter var4, in PlacesParams var5, IPlacesCallbacks var6) = 46; void iglms48(in NearbyAlertRequest var1, in PlacesParams var2, in PendingIntent var3) = 47; void iglms49(in PlacesParams var1, in PendingIntent var2) = 48; void iglms50(in UserDataType var1, in LatLngBounds var2, in List var3, in PlacesParams var4, IPlacesCallbacks var5) = 49; + IBinder iglms51() = 50; + IBinder iglms54() = 53; void iglms55(String var1, in LatLngBounds var2, in AutocompleteFilter var3, in PlacesParams var4, IPlacesCallbacks var5) = 54; + void iglms58(in List var1, in PlacesParams var2, IPlacesCallbacks var3) = 57; - //void updateDeviceOrientationRequest(in DeviceOrientationRequestUpdateData request) = 74; + void iglms65(in PendingIntent pendingIntent, IStatusCallback callback) = 64; + void iglms66(in PendingIntent pendingIntent, IStatusCallback callback) = 65; + + void iglms68(in PendingIntent pendingIntent, IStatusCallback callback) = 67; +// void iglms70(in ActivityRecognitionRequest request, in PendingIntent pendingIntent, IStatusCallback callback) = 69; + void iglms71(IStatusCallback callback) = 70; + void iglms76(in PendingIntent pendingIntent) = 75; + int iglms78() = 77; } diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/ActivityRecognitionResult.java b/play-services-location-api/src/main/java/com/google/android/gms/location/ActivityRecognitionResult.java index 614c8552..4b67ed85 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/ActivityRecognitionResult.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/ActivityRecognitionResult.java @@ -46,19 +46,19 @@ public class ActivityRecognitionResult extends AutoSafeParcelable { public static final String EXTRA_ACTIVITY_RESULT_LIST = "com.google.android.location.internal.EXTRA_ACTIVITY_RESULT_LIST"; @SafeParceled(1000) - private int versionCode = 2; + private final int versionCode = 2; @SafeParceled(value = 1, subClass = DetectedActivity.class) - private List probableActivities; + private final List probableActivities; @SafeParceled(2) - private long time; + private final long time; @SafeParceled(3) - private long elapsedRealtimeMillis; + private final long elapsedRealtimeMillis; @SafeParceled(5) - private Bundle extras; + private final Bundle extras; /** * Constructs an ActivityRecognitionResult. diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/DeviceOrientation.java b/play-services-location-api/src/main/java/com/google/android/gms/location/DeviceOrientation.java new file mode 100644 index 00000000..2a17e926 --- /dev/null +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/DeviceOrientation.java @@ -0,0 +1,118 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.location; + +import org.microg.safeparcel.AutoSafeParcelable; + +import java.util.Arrays; + +public class DeviceOrientation extends AutoSafeParcelable { + @Field(1) + private float[] attitude = new float[4]; + @Field(2) + private int attitudeConfidence = -1; + @Field(3) + private int magConfidence = -1; + @Field(4) + private float headingDegrees = Float.NaN; + @Field(5) + private float headingErrorDegrees = Float.NaN; + @Field(6) + private final long elapsedRealtimeNanos = 0; + @Field(7) + private byte flags = 0; + @Field(8) + private float conservativeHeadingErrorVonMisesKappa = Float.NaN; + + public float[] getAttitude() { + if ((flags & 0x10) != 0) return attitude; + return new float[4]; + } + + public void setAttitude(float[] attitude) { + if (attitude.length != 4) throw new IllegalArgumentException(); + this.attitude = attitude; + flags = (byte) (flags | 0x10); + } + + public int getAttitudeConfidence() { + if ((flags & 0x1) != 0) return attitudeConfidence; + return -1; + } + + public void setAttitudeConfidence(int attitudeConfidence) { + this.attitudeConfidence = attitudeConfidence; + flags = (byte) (flags | 0x1); + } + + public int getMagConfidence() { + if ((flags & 0x2) != 0) return magConfidence; + return -1; + } + + public void setMagConfidence(int magConfidence) { + this.magConfidence = magConfidence; + flags = (byte) (flags | 0x2); + } + + public float getHeadingDegrees() { + if ((flags & 0x4) != 0) return headingDegrees; + return Float.NaN; + } + + public void setHeadingDegrees(float headingDegrees) { + this.headingDegrees = headingDegrees; + flags = (byte) (flags | 0x4); + } + + public float getHeadingErrorDegrees() { + if ((flags & 0x8) != 0) return headingErrorDegrees; + return Float.NaN; + } + + public void setHeadingErrorDegrees(float headingErrorDegrees) { + this.headingErrorDegrees = headingErrorDegrees; + flags = (byte) (flags | 0x8); + } + + public float getConservativeHeadingErrorVonMisesKappa() { + if ((flags & 0x20) != 0) return conservativeHeadingErrorVonMisesKappa; + return Float.NaN; + } + + public void setConservativeHeadingErrorVonMisesKappa(float conservativeHeadingErrorVonMisesKappa) { + this.conservativeHeadingErrorVonMisesKappa = conservativeHeadingErrorVonMisesKappa; + flags = (byte) (flags | 0x20); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("DeviceOrientation{"); + if ((flags & 0x10) != 0) + sb.append("attitude=").append(Arrays.toString(attitude)); + if ((flags & 0x1) != 0) + sb.append(", attitudeConfidence=").append(attitudeConfidence); + if ((flags & 0x2) != 0) + sb.append(", magConfidence=").append(magConfidence); + if ((flags & 0x4) != 0) + sb.append(", headingDegrees=").append(headingDegrees); + if ((flags & 0x8) != 0) + sb.append(", headingErrorDegrees=").append(headingErrorDegrees); + return "DeviceOrientation{" + + "attitude=" + Arrays.toString(attitude) + + ", attitudeConfidence=" + attitudeConfidence + + ", magConfidence=" + magConfidence + + ", headingDegrees=" + headingDegrees + + ", headingErrorDegrees=" + headingErrorDegrees + + ", elapsedRealtimeNanos=" + elapsedRealtimeNanos + + ", flags=" + flags + + ", conservativeHeadingErrorVonMisesKappa=" + conservativeHeadingErrorVonMisesKappa + + '}'; + } + + public static final Creator CREATOR = new AutoCreator(DeviceOrientation.class); +} diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/DeviceOrientationRequest.java b/play-services-location-api/src/main/java/com/google/android/gms/location/DeviceOrientationRequest.java new file mode 100644 index 00000000..14ce93c1 --- /dev/null +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/DeviceOrientationRequest.java @@ -0,0 +1,39 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.location; + +import android.os.SystemClock; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class DeviceOrientationRequest extends AutoSafeParcelable { + @Field(1) + public boolean shouldUseMag; + @Field(2) + public long minimumSamplingPeriodMs; + @Field(3) + public float smallesAngleChangeRadians; + @Field(4) + public long expirationTime; + @Field(5) + public int numUpdates; + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("Request[shouldUseMag=").append(shouldUseMag); + sb.append(" minimumSamplingPeriod=").append(minimumSamplingPeriodMs).append("ms"); + sb.append(" smallesAngleChange=").append(smallesAngleChangeRadians).append("rad"); + if (expirationTime != Long.MAX_VALUE) + sb.append(" expireIn=").append(SystemClock.elapsedRealtime() - expirationTime).append("ms"); + if (numUpdates != Integer.MAX_VALUE) + sb.append(" num=").append(numUpdates); + sb.append("]"); + return sb.toString(); + } + + public static final Creator CREATOR = new AutoCreator(DeviceOrientationRequest.class); +} diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/GeofencingEvent.java b/play-services-location-api/src/main/java/com/google/android/gms/location/GeofencingEvent.java index 3c014f94..82b3a107 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/GeofencingEvent.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/GeofencingEvent.java @@ -33,7 +33,6 @@ import java.util.List; * A geofence triggering event generated when a geofence transition happens. * An error happens after geofences are registered and being monitored. */ -@SuppressWarnings("unchecked") @PublicApi public class GeofencingEvent { @PublicApi(exclude = true) diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/LocationAvailability.java b/play-services-location-api/src/main/java/com/google/android/gms/location/LocationAvailability.java index c24c5bbc..629be5e1 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/LocationAvailability.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/LocationAvailability.java @@ -55,7 +55,7 @@ public class LocationAvailability extends AutoSafeParcelable { public static final int STATUS_IN_PROGRESS = 8; @SafeParceled(1000) - private int versionCode = 2; + private final int versionCode = 2; @SafeParceled(1) @PublicApi(exclude = true) diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/LocationRequest.java b/play-services-location-api/src/main/java/com/google/android/gms/location/LocationRequest.java index 15d159e8..beeda85d 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/LocationRequest.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/LocationRequest.java @@ -17,8 +17,8 @@ package com.google.android.gms.location; import android.os.SystemClock; + import org.microg.safeparcel.AutoSafeParcelable; -import org.microg.safeparcel.SafeParceled; import java.util.Arrays; @@ -101,24 +101,26 @@ public class LocationRequest extends AutoSafeParcelable { */ public static final int PRIORITY_NO_POWER = 105; - @SafeParceled(1000) - private int versionCode = 1; - @SafeParceled(1) + @Field(1000) + private final int versionCode = 1; + @Field(1) private int priority; - @SafeParceled(2) + @Field(2) private long interval; - @SafeParceled(3) + @Field(3) private long fastestInterval; - @SafeParceled(4) + @Field(4) private boolean explicitFastestInterval; - @SafeParceled(5) + @Field(5) private long expirationTime; - @SafeParceled(6) + @Field(6) private int numUpdates; - @SafeParceled(7) - private float smallestDesplacement; - @SafeParceled(8) + @Field(7) + private float smallestDisplacement; + @Field(8) private long maxWaitTime; + @Field(9) + private boolean waitForAccurateLocation; public LocationRequest() { this.priority = PRIORITY_BALANCED_POWER_ACCURACY; @@ -127,7 +129,7 @@ public class LocationRequest extends AutoSafeParcelable { this.explicitFastestInterval = false; this.expirationTime = Long.MAX_VALUE; this.numUpdates = Integer.MAX_VALUE; - this.smallestDesplacement = 0; + this.smallestDisplacement = 0; this.maxWaitTime = 0; } @@ -176,6 +178,17 @@ public class LocationRequest extends AutoSafeParcelable { return interval; } + /** + * Gets the maximum wait time in milliseconds for location updates. If the wait time is smaller than the interval + * requested with {@link #setInterval(long)}, then the interval will be used instead. + * + * @return maximum wait time in milliseconds, inexact + * @see #setMaxWaitTime(long) + */ + public long getMaxWaitTime() { + return maxWaitTime; + } + /** * Get the number of updates requested. *

@@ -204,8 +217,8 @@ public class LocationRequest extends AutoSafeParcelable { * * @return minimum displacement between location updates in meters */ - public float getSmallestDesplacement() { - return smallestDesplacement; + public float getSmallestDisplacement() { + return smallestDisplacement; } @Override @@ -231,20 +244,34 @@ public class LocationRequest extends AutoSafeParcelable { return false; if (priority != that.priority) return false; - if (Float.compare(that.smallestDesplacement, smallestDesplacement) != 0) - return false; - - return true; + return Float.compare(that.smallestDisplacement, smallestDisplacement) == 0; } @Override public int hashCode() { return Arrays.hashCode( - new Object[] { priority, interval, fastestInterval, explicitFastestInterval, - explicitFastestInterval, numUpdates, smallestDesplacement, maxWaitTime + new Object[]{priority, interval, fastestInterval, explicitFastestInterval, + explicitFastestInterval, numUpdates, smallestDisplacement, maxWaitTime }); } + /** + * Returns whether or not the fastest interval was explicitly specified for the location request. + * + * @return True if the fastest interval was explicitly set for the location request; false otherwise + */ + public boolean isFastestIntervalExplicitlySet() { + return explicitFastestInterval; + } + + /** + * Returns whether the location services will wait a few seconds initially for accurate locations, if accurate + * locations cannot be computed on the device for {@link #PRIORITY_HIGH_ACCURACY} requests. + */ + public boolean isWaitForAccurateLocation() { + return waitForAccurateLocation; + } + /** * Set the duration of this request, in milliseconds. *

@@ -312,6 +339,7 @@ public class LocationRequest extends AutoSafeParcelable { if (millis < 0) throw new IllegalArgumentException("interval must not be negative"); fastestInterval = millis; + explicitFastestInterval = true; return this; } @@ -348,6 +376,27 @@ public class LocationRequest extends AutoSafeParcelable { return this; } + /** + * Sets the maximum wait time in milliseconds for location updates. + *

+ * If you pass a value at least 2x larger than the interval specified with {@link #setInterval(long)}, then + * location delivery may be delayed and multiple locations can be delivered at once. Locations are determined at + * the {@link #setInterval(long)} rate, but can be delivered in batch after the interval you set in this method. + * This can consume less battery and give more accurate locations, depending on the device's hardware capabilities. + * You should set this value to be as large as possible for your needs if you don't need immediate location + * delivery. + * + * @param millis desired maximum wait time in millisecond, inexact + * @return the same object, so that setters can be chained + * @throws IllegalArgumentException if the interval is less than zero + */ + public LocationRequest setMaxWaitTime(long millis) throws IllegalArgumentException { + if (millis < 0) + throw new IllegalArgumentException("interval must not be negative"); + maxWaitTime = millis; + return this; + } + /** * Set the number of location updates. *

@@ -417,22 +466,58 @@ public class LocationRequest extends AutoSafeParcelable { public LocationRequest setSmallestDisplacement(float smallestDisplacementMeters) { if (smallestDisplacementMeters < 0) throw new IllegalArgumentException("smallestDisplacementMeters must not be negative"); - this.smallestDesplacement = smallestDisplacementMeters; + this.smallestDisplacement = smallestDisplacementMeters; return this; } + /** + * Sets whether the client wants the locations services to wait a few seconds for accurate locations initially, + * when accurate locations could not be computed on the device immediately after {@link #PRIORITY_HIGH_ACCURACY} + * request is made. By default the location services will wait for accurate locations. + *

+ * Note that this only applies to clients with {@link #PRIORITY_HIGH_ACCURACY} requests. + *

+ * Also note this only applies to the initial locations computed right after the location request is added. The + * following inaccurate locations may still be delivered to the clients without delay. + */ + public LocationRequest setWaitForAccurateLocation(boolean waitForAccurateLocation) { + this.waitForAccurateLocation = waitForAccurateLocation; + return this; + } + + private static String priorityToString(int priority) { + switch (priority) { + case PRIORITY_HIGH_ACCURACY: + return "PRIORITY_HIGH_ACCURACY"; + case PRIORITY_BALANCED_POWER_ACCURACY: + return "PRIORITY_BALANCED_POWER_ACCURACY"; + case PRIORITY_LOW_POWER: + return "PRIORITY_LOW_POWER"; + case PRIORITY_NO_POWER: + return "PRIORITY_NO_POWER"; + default: + return "???"; + } + } + @Override public String toString() { - return "LocationRequest{" + - "priority=" + priority + - ", interval=" + interval + - ", fastestInterval=" + fastestInterval + - ", explicitFastestInterval=" + explicitFastestInterval + - ", expirationTime=" + expirationTime + - ", numUpdates=" + numUpdates + - ", smallestDesplacement=" + smallestDesplacement + - ", maxWaitTime=" + maxWaitTime + - '}'; + StringBuilder sb = new StringBuilder(); + sb.append("Request["); + sb.append(priorityToString(priority)); + if (priority != PRIORITY_NO_POWER) + sb.append(" requested=").append(interval).append("ms"); + sb.append(" fastest=").append(fastestInterval).append("ms"); + if (maxWaitTime > interval) + sb.append(" maxWait=").append(maxWaitTime).append("ms"); + if (smallestDisplacement > 0) + sb.append(" smallestDisplacement=").append(smallestDisplacement).append("m"); + if (expirationTime != Long.MAX_VALUE) + sb.append(" expireIn=").append(SystemClock.elapsedRealtime() - expirationTime).append("ms"); + if (numUpdates != Integer.MAX_VALUE) + sb.append(" num=").append(numUpdates); + sb.append("]"); + return sb.toString(); } public static final Creator CREATOR = new AutoCreator(LocationRequest.class); diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/LocationResult.java b/play-services-location-api/src/main/java/com/google/android/gms/location/LocationResult.java index d09109fe..60c11544 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/LocationResult.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/LocationResult.java @@ -28,7 +28,7 @@ import java.util.List; public class LocationResult extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 2; + private final int versionCode = 2; @SafeParceled(value = 1, subClass = Location.class) public final List locations; diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/LocationSettingsConfiguration.java b/play-services-location-api/src/main/java/com/google/android/gms/location/LocationSettingsConfiguration.java new file mode 100644 index 00000000..29dabea9 --- /dev/null +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/LocationSettingsConfiguration.java @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.location; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class LocationSettingsConfiguration extends AutoSafeParcelable { + @Field(1) + public String justificationText; + @Field(2) + public String experimentId; + @Field(5) + public String titleText; + + public static final Creator CREATOR = new AutoCreator<>(LocationSettingsConfiguration.class); +} diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/LocationSettingsRequest.java b/play-services-location-api/src/main/java/com/google/android/gms/location/LocationSettingsRequest.java index 517ab1c8..60f376cf 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/LocationSettingsRequest.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/LocationSettingsRequest.java @@ -1,24 +1,12 @@ /* - * 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. + * SPDX-FileCopyrightText: 2015, microG Project Team + * SPDX-License-Identifier: Apache-2.0 */ package com.google.android.gms.location; import org.microg.gms.common.PublicApi; import org.microg.safeparcel.AutoSafeParcelable; -import org.microg.safeparcel.SafeParceled; import java.util.ArrayList; import java.util.Collection; @@ -26,34 +14,40 @@ import java.util.List; @PublicApi public class LocationSettingsRequest extends AutoSafeParcelable { - @SafeParceled(1000) - private int versionCode = 2; + @Field(1000) + private final int versionCode = 2; - @SafeParceled(value = 1, subClass = LocationRequest.class) + @Field(value = 1, subClass = LocationRequest.class) @PublicApi(exclude = true) public List requests; - @SafeParceled(2) + @Field(2) @PublicApi(exclude = true) public boolean alwaysShow; + @Field(3) @PublicApi(exclude = true) public boolean needBle; + @Field(5) + @PublicApi(exclude = true) + public LocationSettingsConfiguration configuration; + private LocationSettingsRequest() { } - private LocationSettingsRequest(List requests, boolean alwaysShow, boolean needBle) { + private LocationSettingsRequest(List requests, boolean alwaysShow, boolean needBle, LocationSettingsConfiguration configuration) { this.requests = requests; this.alwaysShow = alwaysShow; this.needBle = needBle; + this.configuration = configuration; } /** * A builder that builds {@link LocationSettingsRequest}. */ public static class Builder { - private List requests = new ArrayList(); + private final List requests = new ArrayList(); private boolean alwaysShow = false; private boolean needBle = false; @@ -79,7 +73,7 @@ public class LocationSettingsRequest extends AutoSafeParcelable { * Creates a LocationSettingsRequest that can be used with SettingsApi. */ public LocationSettingsRequest build() { - return new LocationSettingsRequest(requests, alwaysShow, needBle); + return new LocationSettingsRequest(requests, alwaysShow, needBle, null); } /** diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/LocationSettingsResult.java b/play-services-location-api/src/main/java/com/google/android/gms/location/LocationSettingsResult.java index 4269b429..f5f55e85 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/LocationSettingsResult.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/LocationSettingsResult.java @@ -36,10 +36,10 @@ import org.microg.safeparcel.SafeParceled; public class LocationSettingsResult extends AutoSafeParcelable implements Result { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) - private Status status; + private final Status status; @SafeParceled(2) private LocationSettingsStates settings; diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/LocationSettingsStates.java b/play-services-location-api/src/main/java/com/google/android/gms/location/LocationSettingsStates.java index 194982b2..092666a4 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/LocationSettingsStates.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/LocationSettingsStates.java @@ -27,25 +27,25 @@ import org.microg.safeparcel.SafeParceled; public class LocationSettingsStates extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 2; + private final int versionCode = 2; @SafeParceled(1) - private boolean gpsUsable; + private final boolean gpsUsable; @SafeParceled(2) - private boolean networkLocationUsable; + private final boolean networkLocationUsable; @SafeParceled(3) - private boolean bleUsable; + private final boolean bleUsable; @SafeParceled(4) - private boolean gpsPresent; + private final boolean gpsPresent; @SafeParceled(5) - private boolean networkLocationPresent; + private final boolean networkLocationPresent; @SafeParceled(6) - private boolean blePresent; + private final boolean blePresent; public boolean isBlePresent() { return blePresent; diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/LocationStatus.java b/play-services-location-api/src/main/java/com/google/android/gms/location/LocationStatus.java index 6cd2060a..ba82860d 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/LocationStatus.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/LocationStatus.java @@ -32,7 +32,7 @@ public class LocationStatus extends AutoSafeParcelable { public static final int STATUS_LOCATION_DISABLED_IN_SETTINGS = 7; public static final int STATUS_IN_PROGRESS = 8; @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) int cellStatus; @SafeParceled(2) @@ -53,10 +53,7 @@ public class LocationStatus extends AutoSafeParcelable { return false; if (elapsedRealtimeNanos != that.elapsedRealtimeNanos) return false; - if (wifiStatus != that.wifiStatus) - return false; - - return true; + return wifiStatus == that.wifiStatus; } @Override diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/internal/DeviceOrientationRequestInternal.java b/play-services-location-api/src/main/java/com/google/android/gms/location/internal/DeviceOrientationRequestInternal.java new file mode 100644 index 00000000..5b66feaa --- /dev/null +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/internal/DeviceOrientationRequestInternal.java @@ -0,0 +1,35 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.location.internal; + +import com.google.android.gms.location.DeviceOrientationRequest; + +import org.microg.safeparcel.AutoSafeParcelable; + +import java.util.List; + +public class DeviceOrientationRequestInternal extends AutoSafeParcelable { + + @Field(1) + public DeviceOrientationRequest request; + + @Field(value = 2, subClass = ClientIdentity.class) + public List clients; + + @Field(3) + public String tag; + + @Override + public String toString() { + return "DeviceOrientationRequestInternal{" + + "request=" + request + + ", clients=" + clients + + ", tag='" + tag + '\'' + + '}'; + } + + public static final Creator CREATOR = new AutoCreator(DeviceOrientationRequestInternal.class); +} diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/internal/DeviceOrientationRequestUpdateData.java b/play-services-location-api/src/main/java/com/google/android/gms/location/internal/DeviceOrientationRequestUpdateData.java new file mode 100644 index 00000000..5a2e759e --- /dev/null +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/internal/DeviceOrientationRequestUpdateData.java @@ -0,0 +1,39 @@ +/* + * SPDX-FileCopyrightText: 2022 microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.location.internal; + +import com.google.android.gms.location.IDeviceOrientationListener; + +import org.microg.safeparcel.AutoSafeParcelable; + +public class DeviceOrientationRequestUpdateData extends AutoSafeParcelable { + public static final int REQUEST_UPDATES = 1; + public static final int REMOVE_UPDATES = 2; + + @Field(1) + public int opCode; + + @Field(2) + public DeviceOrientationRequestInternal request; + + @Field(3) + public IDeviceOrientationListener listener; + + @Field(4) + public IFusedLocationProviderCallback fusedLocationProviderCallback; + + @Override + public String toString() { + return "DeviceOrientationRequestUpdateData{" + + "opCode=" + opCode + + ", request=" + request + + ", listener=" + (listener != null ? listener.asBinder() : null) + + ", fusedLocationProviderCallback=" + (fusedLocationProviderCallback != null ? fusedLocationProviderCallback.asBinder() : null) + + '}'; + } + + public static final Creator CREATOR = new AutoCreator(DeviceOrientationRequestUpdateData.class); +} diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/internal/FusedLocationProviderResult.java b/play-services-location-api/src/main/java/com/google/android/gms/location/internal/FusedLocationProviderResult.java index b4b6516d..1dfbedde 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/internal/FusedLocationProviderResult.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/internal/FusedLocationProviderResult.java @@ -25,7 +25,7 @@ public class FusedLocationProviderResult extends AutoSafeParcelable { public static final FusedLocationProviderResult SUCCESS = FusedLocationProviderResult.create(Status.SUCCESS); @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) public Status status; diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/internal/LocationRequestInternal.java b/play-services-location-api/src/main/java/com/google/android/gms/location/internal/LocationRequestInternal.java index dd70d96a..7d5fc3ad 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/internal/LocationRequestInternal.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/internal/LocationRequestInternal.java @@ -19,45 +19,53 @@ package com.google.android.gms.location.internal; import com.google.android.gms.location.LocationRequest; import org.microg.safeparcel.AutoSafeParcelable; -import org.microg.safeparcel.SafeParceled; import java.util.List; public class LocationRequestInternal extends AutoSafeParcelable { - @SafeParceled(1000) - private int versionCode = 1; + @Field(1000) + private final int versionCode = 1; - @SafeParceled(1) + @Field(1) public LocationRequest request; - @SafeParceled(2) + @Field(2) @Deprecated public boolean requestNlpDebugInfo; - @SafeParceled(3) + @Field(3) @Deprecated public boolean restorePendingIntentListeners; - @SafeParceled(4) + @Field(4) @Deprecated public boolean triggerUpdate; - @SafeParceled(value = 5, subClass = ClientIdentity.class) + @Field(value = 5, subClass = ClientIdentity.class) public List clients; - @SafeParceled(6) + @Field(6) public String tag; - @SafeParceled(7) + @Field(7) public boolean hideFromAppOps; - @SafeParceled(8) + @Field(8) public boolean forceCoarseLocation; - @SafeParceled(9) + @Field(9) public boolean exemptFromThrottle; - @SafeParceled(10) + @Field(10) public String moduleId; + @Field(11) + public boolean locationSettingsIgnored; + + @Field(12) + public boolean inaccurateLocationsDelayed; + + @Field(13) + public String contextAttributeTag; + @Override public String toString() { return "LocationRequestInternal{" + @@ -71,6 +79,9 @@ public class LocationRequestInternal extends AutoSafeParcelable { ", forceCoarseLocation=" + forceCoarseLocation + ", exemptFromThrottle=" + exemptFromThrottle + ", moduleId=" + moduleId + + ", locationSettingsIgnored=" + locationSettingsIgnored + + ", inaccurateLocationsDelayed=" + inaccurateLocationsDelayed + + ", contextAttributeTag=" + contextAttributeTag + '}'; } diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/internal/LocationRequestUpdateData.java b/play-services-location-api/src/main/java/com/google/android/gms/location/internal/LocationRequestUpdateData.java index f364e16a..6da81cc3 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/internal/LocationRequestUpdateData.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/internal/LocationRequestUpdateData.java @@ -30,25 +30,25 @@ public class LocationRequestUpdateData extends AutoSafeParcelable { public static final int REQUEST_UPDATES = 1; public static final int REMOVE_UPDATES = 2; - @Field(1000) + @SafeParceled(1000) private int versionCode; - @Field(1) + @SafeParceled(1) public int opCode; - @Field(2) + @SafeParceled(2) public LocationRequestInternal request; - @Field(3) + @SafeParceled(3) public ILocationListener listener; - @Field(4) + @SafeParceled(4) public PendingIntent pendingIntent; - @Field(5) + @SafeParceled(5) public ILocationCallback callback; - @Field(6) + @SafeParceled(6) public IFusedLocationProviderCallback fusedLocationProviderCallback; @Override diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/internal/ParcelableGeofence.java b/play-services-location-api/src/main/java/com/google/android/gms/location/internal/ParcelableGeofence.java index 3abc611c..d21c02b6 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/internal/ParcelableGeofence.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/internal/ParcelableGeofence.java @@ -24,7 +24,7 @@ import org.microg.safeparcel.SafeParceled; public class ParcelableGeofence extends AutoSafeParcelable implements Geofence { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) public String requestId; diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/places/AutocompleteFilter.java b/play-services-location-api/src/main/java/com/google/android/gms/location/places/AutocompleteFilter.java index cf0f9238..6ad8c792 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/places/AutocompleteFilter.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/places/AutocompleteFilter.java @@ -25,7 +25,7 @@ import org.microg.safeparcel.SafeParceled; public class AutocompleteFilter extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; public static final Creator CREATOR = new AutoCreator(AutocompleteFilter.class); } diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/places/UserAddedPlace.java b/play-services-location-api/src/main/java/com/google/android/gms/location/places/UserAddedPlace.java index eb916696..e844f20a 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/places/UserAddedPlace.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/places/UserAddedPlace.java @@ -25,7 +25,7 @@ import org.microg.safeparcel.SafeParceled; public class UserAddedPlace extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; public static final Creator CREATOR = new AutoCreator(UserAddedPlace.class); } diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/places/internal/PlaceImpl.java b/play-services-location-api/src/main/java/com/google/android/gms/location/places/internal/PlaceImpl.java index dbc23035..3836a93d 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/places/internal/PlaceImpl.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/places/internal/PlaceImpl.java @@ -33,7 +33,7 @@ import java.util.Locale; public class PlaceImpl extends AutoSafeParcelable implements Place { @SafeParceled(1000) - private int versionCode = 2; + private final int versionCode = 2; @SafeParceled(1) public String id; @SafeParceled(2) diff --git a/play-services-location-api/src/main/java/com/google/android/gms/location/places/internal/PlacesParams.java b/play-services-location-api/src/main/java/com/google/android/gms/location/places/internal/PlacesParams.java index eb365fa3..c87ae3d3 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/location/places/internal/PlacesParams.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/location/places/internal/PlacesParams.java @@ -22,7 +22,7 @@ import org.microg.safeparcel.SafeParceled; public class PlacesParams extends AutoSafeParcelable { @SafeParceled(1000) - private int versionCode = 1; + private final int versionCode = 1; @SafeParceled(1) public final String clientPackageName; @SafeParceled(2) diff --git a/play-services-location-api/src/main/java/com/google/android/gms/maps/model/LatLng.java b/play-services-location-api/src/main/java/com/google/android/gms/maps/model/LatLng.java index 545d8b46..12ff93a5 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/maps/model/LatLng.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/maps/model/LatLng.java @@ -26,7 +26,7 @@ import org.microg.safeparcel.SafeParceled; @PublicApi public final class LatLng extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; /** * Latitude, in degrees. This value is in the range [-90, 90]. */ @@ -81,10 +81,7 @@ public final class LatLng extends AutoSafeParcelable { if (Double.compare(latLng.latitude, latitude) != 0) return false; - if (Double.compare(latLng.longitude, longitude) != 0) - return false; - - return true; + return Double.compare(latLng.longitude, longitude) == 0; } @Override diff --git a/play-services-location-api/src/main/java/com/google/android/gms/maps/model/LatLngBounds.java b/play-services-location-api/src/main/java/com/google/android/gms/maps/model/LatLngBounds.java index 21177235..9aa4c12e 100644 --- a/play-services-location-api/src/main/java/com/google/android/gms/maps/model/LatLngBounds.java +++ b/play-services-location-api/src/main/java/com/google/android/gms/maps/model/LatLngBounds.java @@ -28,7 +28,7 @@ import java.util.Arrays; @PublicApi public final class LatLngBounds extends AutoSafeParcelable { @SafeParceled(1) - private int versionCode = 1; + private final int versionCode = 1; /** * Southwest corner of the bound. */ @@ -114,10 +114,7 @@ public final class LatLngBounds extends AutoSafeParcelable { if (!northeast.equals(that.northeast)) return false; - if (!southwest.equals(that.southwest)) - return false; - - return true; + return southwest.equals(that.southwest); } /** diff --git a/play-services-location/build.gradle b/play-services-location/build.gradle index 3c1b7047..4e439ddd 100644 --- a/play-services-location/build.gradle +++ b/play-services-location/build.gradle @@ -18,7 +18,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion androidCompileSdk - buildToolsVersion "$androidBuildVersionTools" + buildToolsVersion "30.0.3" defaultConfig { minSdkVersion androidMinSdk @@ -35,5 +35,5 @@ dependencies { api project(':play-services-base') api project(':play-services-location-api') - implementation 'androidx.annotation:annotation:1.2.0' + implementation 'androidx.annotation:annotation:1.3.0' } \ No newline at end of file diff --git a/play-services-location/gradle.properties b/play-services-location/gradle.properties index 0b02e4ed..bfc9b4b2 100644 --- a/play-services-location/gradle.properties +++ b/play-services-location/gradle.properties @@ -30,4 +30,5 @@ POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt POM_LICENCE_DIST=repo POM_DEVELOPER_ID=mar-v-in -POM_DEVELOPER_NAME=Marvin W \ No newline at end of file +POM_DEVELOPER_NAME=Marvin W + diff --git a/play-services-location/src/main/java/com/google/android/gms/location/LocationClient.java b/play-services-location/src/main/java/com/google/android/gms/location/LocationClient.java index 47ec9568..bc8b00ce 100644 --- a/play-services-location/src/main/java/com/google/android/gms/location/LocationClient.java +++ b/play-services-location/src/main/java/com/google/android/gms/location/LocationClient.java @@ -22,7 +22,6 @@ import android.location.Location; import android.os.Looper; import com.google.android.gms.common.api.GoogleApiClient; -import com.google.android.gms.common.api.PendingResult; import org.microg.gms.common.ForwardConnectionCallbacks; import org.microg.gms.common.ForwardConnectionFailedListener; diff --git a/play-services-location/src/main/java/com/google/android/gms/location/LocationListener.java b/play-services-location/src/main/java/com/google/android/gms/location/LocationListener.java index 59c9585c..9e204ccf 100644 --- a/play-services-location/src/main/java/com/google/android/gms/location/LocationListener.java +++ b/play-services-location/src/main/java/com/google/android/gms/location/LocationListener.java @@ -30,5 +30,5 @@ public interface LocationListener { * * @param location The updated location. */ - public void onLocationChanged(Location location); + void onLocationChanged(Location location); } diff --git a/play-services-location/src/main/java/org/microg/gms/location/ActivityRecognitionApiClientBuilder.java b/play-services-location/src/main/java/org/microg/gms/location/ActivityRecognitionApiClientBuilder.java index 1d22bd14..6c9461b4 100644 --- a/play-services-location/src/main/java/org/microg/gms/location/ActivityRecognitionApiClientBuilder.java +++ b/play-services-location/src/main/java/org/microg/gms/location/ActivityRecognitionApiClientBuilder.java @@ -21,9 +21,9 @@ import android.os.Looper; import com.google.android.gms.common.api.Api.ApiOptions.NoOptions; +import org.microg.gms.common.api.ApiClient; import org.microg.gms.common.api.ApiClientBuilder; import org.microg.gms.common.api.ApiClientSettings; -import org.microg.gms.common.api.ApiClient; import org.microg.gms.common.api.ConnectionCallbacks; import org.microg.gms.common.api.OnConnectionFailedListener; diff --git a/play-services-location/src/main/java/org/microg/gms/location/ActivityRecognitionApiImpl.java b/play-services-location/src/main/java/org/microg/gms/location/ActivityRecognitionApiImpl.java index 5c09eefd..7635c826 100644 --- a/play-services-location/src/main/java/org/microg/gms/location/ActivityRecognitionApiImpl.java +++ b/play-services-location/src/main/java/org/microg/gms/location/ActivityRecognitionApiImpl.java @@ -18,7 +18,6 @@ package org.microg.gms.location; import android.app.PendingIntent; import android.os.RemoteException; -import android.util.Log; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.PendingResult; diff --git a/play-services-location/src/main/java/org/microg/gms/location/LocationClientImpl.java b/play-services-location/src/main/java/org/microg/gms/location/LocationClientImpl.java index b2464774..2e4634d4 100644 --- a/play-services-location/src/main/java/org/microg/gms/location/LocationClientImpl.java +++ b/play-services-location/src/main/java/org/microg/gms/location/LocationClientImpl.java @@ -44,7 +44,7 @@ import java.util.Map; public class LocationClientImpl extends GoogleLocationManagerClient { private static final String TAG = "GmsLocationClientImpl"; private NativeLocationClientImpl nativeLocation = null; - private Map listenerMap = new HashMap(); + private final Map listenerMap = new HashMap(); public LocationClientImpl(Context context, ConnectionCallbacks callbacks, diff --git a/play-services-location/src/main/java/org/microg/gms/location/LocationServicesApiClientBuilder.java b/play-services-location/src/main/java/org/microg/gms/location/LocationServicesApiClientBuilder.java index 504bcc46..1984419d 100644 --- a/play-services-location/src/main/java/org/microg/gms/location/LocationServicesApiClientBuilder.java +++ b/play-services-location/src/main/java/org/microg/gms/location/LocationServicesApiClientBuilder.java @@ -21,9 +21,9 @@ import android.os.Looper; import com.google.android.gms.common.api.Api.ApiOptions.NoOptions; +import org.microg.gms.common.api.ApiClient; import org.microg.gms.common.api.ApiClientBuilder; import org.microg.gms.common.api.ApiClientSettings; -import org.microg.gms.common.api.ApiClient; import org.microg.gms.common.api.ConnectionCallbacks; import org.microg.gms.common.api.OnConnectionFailedListener; diff --git a/play-services-location/src/main/java/org/microg/gms/location/NativeLocationClientImpl.java b/play-services-location/src/main/java/org/microg/gms/location/NativeLocationClientImpl.java index 17a017d9..b8634708 100644 --- a/play-services-location/src/main/java/org/microg/gms/location/NativeLocationClientImpl.java +++ b/play-services-location/src/main/java/org/microg/gms/location/NativeLocationClientImpl.java @@ -16,6 +16,9 @@ package org.microg.gms.location; +import static android.location.LocationManager.KEY_LOCATION_CHANGED; +import static android.location.LocationManager.KEY_PROXIMITY_ENTERING; + import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; @@ -45,9 +48,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import static android.location.LocationManager.KEY_LOCATION_CHANGED; -import static android.location.LocationManager.KEY_PROXIMITY_ENTERING; - @SuppressWarnings("MissingPermission") public class NativeLocationClientImpl { private final static String TAG = "GmsToNativeLocClient"; @@ -135,7 +135,7 @@ public class NativeLocationClientImpl { i.putExtras(bundle); pendingCount.put(pendingIntent, request.getNumUpdates()); nativePendingMap.put(pendingIntent, PendingIntent.getActivity(context, 0, i, 0)); - locationManager.requestLocationUpdates(request.getInterval(), request.getSmallestDesplacement(), + locationManager.requestLocationUpdates(request.getInterval(), request.getSmallestDisplacement(), makeNativeCriteria(request), nativePendingMap.get(pendingIntent)); } @@ -147,7 +147,7 @@ public class NativeLocationClientImpl { } nativeListenerMap.put(listener, new NativeListener(listener, request.getNumUpdates())); locationManager.requestLocationUpdates(request.getInterval(), - request.getSmallestDesplacement(), makeNativeCriteria(request), + request.getSmallestDisplacement(), makeNativeCriteria(request), nativeListenerMap.get(listener), looper); } @@ -251,9 +251,7 @@ public class NativeLocationClientImpl { NativeListener that = (NativeListener) o; - if (!listener.equals(that.listener)) return false; - - return true; + return listener.equals(that.listener); } @Override diff --git a/play-services-tasks/build.gradle b/play-services-tasks/build.gradle index 271759f8..f4000187 100644 --- a/play-services-tasks/build.gradle +++ b/play-services-tasks/build.gradle @@ -4,16 +4,23 @@ */ apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' +apply plugin: 'maven-publish' +apply plugin: 'signing' android { compileSdkVersion androidCompileSdk - buildToolsVersion "$androidBuildVersionTools" + buildToolsVersion "30.0.3" defaultConfig { minSdkVersion androidMinSdk targetSdkVersion androidTargetSdk } + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + compileOptions { sourceCompatibility = 1.8 targetCompatibility = 1.8 @@ -22,4 +29,8 @@ android { dependencies { api project(':play-services-basement') + + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.10" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.0" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0" } \ No newline at end of file diff --git a/play-services-tasks/src/main/java/com/google/android/gms/tasks/CancellationTokenSource.java b/play-services-tasks/src/main/java/com/google/android/gms/tasks/CancellationTokenSource.java index 044b0466..e704d8f3 100644 --- a/play-services-tasks/src/main/java/com/google/android/gms/tasks/CancellationTokenSource.java +++ b/play-services-tasks/src/main/java/com/google/android/gms/tasks/CancellationTokenSource.java @@ -20,7 +20,7 @@ import org.microg.gms.tasks.CancellationTokenImpl; */ @PublicApi public class CancellationTokenSource { - private CancellationTokenImpl token = new CancellationTokenImpl(); + private final CancellationTokenImpl token = new CancellationTokenImpl(); /** * Creates a new {@link CancellationTokenSource} instance. diff --git a/play-services-tasks/src/main/java/com/google/android/gms/tasks/TaskCompletionSource.java b/play-services-tasks/src/main/java/com/google/android/gms/tasks/TaskCompletionSource.java index 00c4a972..58fa1e00 100644 --- a/play-services-tasks/src/main/java/com/google/android/gms/tasks/TaskCompletionSource.java +++ b/play-services-tasks/src/main/java/com/google/android/gms/tasks/TaskCompletionSource.java @@ -17,7 +17,7 @@ import org.microg.gms.tasks.TaskImpl; */ @PublicApi public class TaskCompletionSource { - private TaskImpl task = new TaskImpl<>(); + private final TaskImpl task = new TaskImpl<>(); /** * Creates an instance of {@link TaskCompletionSource}. diff --git a/play-services-tasks/src/main/java/com/google/android/gms/tasks/TaskExecutors.java b/play-services-tasks/src/main/java/com/google/android/gms/tasks/TaskExecutors.java index c4947e13..7abfa6a7 100644 --- a/play-services-tasks/src/main/java/com/google/android/gms/tasks/TaskExecutors.java +++ b/play-services-tasks/src/main/java/com/google/android/gms/tasks/TaskExecutors.java @@ -24,7 +24,7 @@ public final class TaskExecutors { * An Executor that uses the main application thread. */ public static final Executor MAIN_THREAD = new Executor() { - private Handler handler = new Handler(Looper.getMainLooper()); + private final Handler handler = new Handler(Looper.getMainLooper()); @Override public void execute(Runnable command) { handler.post(command); diff --git a/play-services-tasks/src/main/java/org/microg/gms/tasks/CancellationTokenImpl.java b/play-services-tasks/src/main/java/org/microg/gms/tasks/CancellationTokenImpl.java index b2a69096..d9a2fe95 100644 --- a/play-services-tasks/src/main/java/org/microg/gms/tasks/CancellationTokenImpl.java +++ b/play-services-tasks/src/main/java/org/microg/gms/tasks/CancellationTokenImpl.java @@ -10,7 +10,7 @@ import com.google.android.gms.tasks.DuplicateTaskCompletionException; import com.google.android.gms.tasks.OnTokenCanceledListener; public class CancellationTokenImpl extends CancellationToken { - private TaskImpl task = new TaskImpl<>(); + private final TaskImpl task = new TaskImpl<>(); @Override public boolean isCancellationRequested() { diff --git a/play-services-tasks/src/main/java/org/microg/gms/tasks/TaskImpl.java b/play-services-tasks/src/main/java/org/microg/gms/tasks/TaskImpl.java index ae5c42f1..da62ad3e 100644 --- a/play-services-tasks/src/main/java/org/microg/gms/tasks/TaskImpl.java +++ b/play-services-tasks/src/main/java/org/microg/gms/tasks/TaskImpl.java @@ -5,6 +5,8 @@ package org.microg.gms.tasks; +import static com.google.android.gms.tasks.TaskExecutors.MAIN_THREAD; + import android.app.Activity; import com.google.android.gms.tasks.Continuation; @@ -22,15 +24,13 @@ import java.util.concurrent.CancellationException; import java.util.concurrent.Executor; import java.util.concurrent.LinkedBlockingQueue; -import static com.google.android.gms.tasks.TaskExecutors.MAIN_THREAD; - public class TaskImpl extends Task { private final Object lock = new Object(); private boolean completed; private boolean cancelled; private TResult result; private Exception exception; - private Queue> completionQueue = new LinkedBlockingQueue<>(); + private final Queue> completionQueue = new LinkedBlockingQueue<>(); @Override public Task addOnCanceledListener(OnCanceledListener listener) { diff --git a/play-services-tasks/src/main/java/org/microg/gms/tasks/UpdateListenerLifecycleObserver.java b/play-services-tasks/src/main/java/org/microg/gms/tasks/UpdateListenerLifecycleObserver.java index dd307c50..bc31d183 100644 --- a/play-services-tasks/src/main/java/org/microg/gms/tasks/UpdateListenerLifecycleObserver.java +++ b/play-services-tasks/src/main/java/org/microg/gms/tasks/UpdateListenerLifecycleObserver.java @@ -15,9 +15,9 @@ import java.util.List; import java.util.WeakHashMap; public class UpdateListenerLifecycleObserver { - private static WeakHashMap> map = new WeakHashMap<>(); + private static final WeakHashMap> map = new WeakHashMap<>(); private static boolean activityLifecycleCallbacksRegistered = false; - private List>> list = new ArrayList<>(); + private final List>> list = new ArrayList<>(); public synchronized static UpdateListenerLifecycleObserver getObserverForActivity(Activity activity) { WeakReference ref = map.get(activity); diff --git a/play-services-tasks/src/main/kotlin/com/google/android/gms/tasks/Tasks.kt b/play-services-tasks/src/main/kotlin/com/google/android/gms/tasks/Tasks.kt new file mode 100644 index 00000000..d002f7f9 --- /dev/null +++ b/play-services-tasks/src/main/kotlin/com/google/android/gms/tasks/Tasks.kt @@ -0,0 +1,153 @@ +/* + * SPDX-FileCopyrightText: 2016, JetBrains s.r.o. + * SPDX-FileCopyrightText: 2021, microG Project Team + * SPDX-License-Identifier: Apache-2.0 + */ + +package com.google.android.gms.tasks + +import com.google.android.gms.tasks.* +import kotlinx.coroutines.* +import kotlin.coroutines.* + +/** + * Converts this deferred to the instance of [Task]. + * If deferred is cancelled then resulting task will be cancelled as well. + */ +@kotlinx.coroutines.ExperimentalCoroutinesApi +fun Deferred.asTask(): Task { + val cancellation = CancellationTokenSource() + val source = TaskCompletionSource(cancellation.token) + + invokeOnCompletion callback@{ + if (it is CancellationException) { + cancellation.cancel() + return@callback + } + + val t = getCompletionExceptionOrNull() + if (t == null) { + source.setResult(getCompleted()) + } else { + source.setException(t as? Exception ?: RuntimeExecutionException(t)) + } + } + + return source.task +} + +/** + * Converts this task to an instance of [Deferred]. + * If task is cancelled then resulting deferred will be cancelled as well. + * However, the opposite is not true: if the deferred is cancelled, the [Task] will not be cancelled. + * For bi-directional cancellation, an overload that accepts [CancellationTokenSource] can be used. + */ +fun Task.asDeferred(): Deferred = asDeferredImpl(null) + +/** + * Converts this task to an instance of [Deferred] with a [CancellationTokenSource] to control cancellation. + * The cancellation of this function is bi-directional: + * * If the given task is cancelled, the resulting deferred will be cancelled. + * * If the resulting deferred is cancelled, the provided [cancellationTokenSource] will be cancelled. + * + * Providing a [CancellationTokenSource] that is unrelated to the receiving [Task] is not supported and + * leads to an unspecified behaviour. + */ +@ExperimentalCoroutinesApi // Since 1.5.1, tentatively until 1.6.0 +fun Task.asDeferred(cancellationTokenSource: CancellationTokenSource): Deferred = + asDeferredImpl(cancellationTokenSource) + +private fun Task.asDeferredImpl(cancellationTokenSource: CancellationTokenSource?): Deferred { + val deferred = CompletableDeferred() + if (isComplete) { + val e = exception + if (e == null) { + if (isCanceled) { + deferred.cancel() + } else { + @Suppress("UNCHECKED_CAST") + deferred.complete(result as T) + } + } else { + deferred.completeExceptionally(e) + } + } else { + addOnCompleteListener { + val e = it.exception + if (e == null) { + @Suppress("UNCHECKED_CAST") + if (it.isCanceled) deferred.cancel() else deferred.complete(it.result as T) + } else { + deferred.completeExceptionally(e) + } + } + } + + if (cancellationTokenSource != null) { + deferred.invokeOnCompletion { + cancellationTokenSource.cancel() + } + } + // Prevent casting to CompletableDeferred and manual completion. + return object : Deferred by deferred {} +} + +/** + * Awaits the completion of the task without blocking a thread. + * + * This suspending function is cancellable. + * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function + * stops waiting for the completion stage and immediately resumes with [CancellationException]. + * + * For bi-directional cancellation, an overload that accepts [CancellationTokenSource] can be used. + */ +suspend fun Task.await(): T = awaitImpl(null) + +/** + * Awaits the completion of the task that is linked to the given [CancellationTokenSource] to control cancellation. + * + * This suspending function is cancellable and cancellation is bi-directional: + * * If the [Job] of the current coroutine is cancelled or completed while this suspending function is waiting, this function + * cancels the [cancellationTokenSource] and throws a [CancellationException]. + * * If the task is cancelled, then this function will throw a [CancellationException]. + * + * Providing a [CancellationTokenSource] that is unrelated to the receiving [Task] is not supported and + * leads to an unspecified behaviour. + */ +@ExperimentalCoroutinesApi // Since 1.5.1, tentatively until 1.6.0 +suspend fun Task.await(cancellationTokenSource: CancellationTokenSource): T = awaitImpl(cancellationTokenSource) + +private suspend fun Task.awaitImpl(cancellationTokenSource: CancellationTokenSource?): T { + // fast path + if (isComplete) { + val e = exception + return if (e == null) { + if (isCanceled) { + throw CancellationException("Task $this was cancelled normally.") + } else { + @Suppress("UNCHECKED_CAST") + result as T + } + } else { + throw e + } + } + + return suspendCancellableCoroutine { cont -> + addOnCompleteListener { + val e = it.exception + if (e == null) { + @Suppress("UNCHECKED_CAST") + if (it.isCanceled) cont.cancel() else cont.resume(it.result as T) + } else { + cont.resumeWithException(e) + } + } + + if (cancellationTokenSource != null) { + cont.invokeOnCancellation { + cancellationTokenSource.cancel() + } + } + } +} diff --git a/settings.gradle b/settings.gradle index 9ce0de99..089ba776 100644 --- a/settings.gradle +++ b/settings.gradle @@ -19,4 +19,4 @@ include ':play-services-core' include ':play-services-base' include ':play-services-cast' -include ':play-services-location' +include ':play-services-location' \ No newline at end of file