From 13386dd177e72e9447550858099d89316f4fde9d Mon Sep 17 00:00:00 2001 From: inotia00 Date: Fri, 23 Dec 2022 16:32:37 +0900 Subject: [PATCH] a little cleanup --- .../android/gms/common/data/DataHolder.java | 187 +----------------- .../gms/common/DeviceConfiguration.java | 10 +- .../gms/common/ForegroundServiceContext.java | 11 +- .../org/microg/gms/common/PackageUtils.java | 22 +-- .../gms/common/MultiConnectionKeeper.java | 11 +- .../android/gms/dynamic/ObjectWrapper.java | 33 +++- .../java/org/microg/gms/common/Constants.java | 2 + .../microg-ui-tools/build.gradle | 6 +- .../java/org/microg/tools/ui/SwitchBar.java | 46 +---- .../gms/auth/AccountContentProvider.java | 10 +- .../org/microg/gms/checkin/CheckinClient.java | 5 +- .../microg/gms/checkin/CheckinManager.java | 2 +- .../java/org/microg/gms/gcm/McsService.java | 46 ++--- .../gms/gservices/GServicesProvider.java | 7 +- .../ui/PushNotificationPreferencesFragment.kt | 6 +- .../org/microg/gms/ui/SettingsFragment.kt | 10 +- .../main/kotlin/org/microg/gms/ui/Utils.kt | 3 - .../android/gms/iid/MessengerCompat.java | 22 +-- 18 files changed, 84 insertions(+), 355 deletions(-) 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 c154b3e4..f7b8e46a 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 @@ -18,12 +18,8 @@ package com.google.android.gms.common.data; import android.annotation.SuppressLint; import android.content.ContentValues; -import android.database.AbstractWindowedCursor; -import android.database.CharArrayBuffer; import android.database.Cursor; import android.database.CursorWindow; -import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.os.Parcel; @@ -45,9 +41,6 @@ import java.util.Map; */ @PublicApi(until = "1") public class DataHolder extends AutoSafeParcelable implements Closeable { - @SafeParceled(1000) - private final int versionCode = 1; - @SafeParceled(1) private final String[] columns; @@ -69,13 +62,6 @@ public class DataHolder extends AutoSafeParcelable implements Closeable { protected static final int FIELD_TYPE_STRING = 3; protected static final int FIELD_TYPE_BLOB = 4; - private DataHolder() { - columns = null; - windows = null; - statusCode = 0; - metadata = null; - } - /** * Creates a data holder with the specified data. * @@ -92,17 +78,6 @@ public class DataHolder extends AutoSafeParcelable implements Closeable { validateContents(); } - /** - * Creates a data holder wrapping the provided cursor, with provided status code and metadata. - * - * @param cursor The cursor containing the data. - * @param statusCode The status code of this {@link DataHolder}. - * @param metadata The metadata associated with this {@link DataHolder} (may be null). - */ - public DataHolder(AbstractWindowedCursor cursor, int statusCode, Bundle metadata) { - this(cursor.getColumnNames(), createCursorWindows(cursor), statusCode, metadata); - } - /** * Creates a data holder wrapping the provided cursor, with provided status code and metadata. * @@ -135,48 +110,10 @@ public class DataHolder extends AutoSafeParcelable implements Closeable { return builder(columns, null); } - /** - * @param statusCode The status code of this {@link DataHolder}. - * @param metadata The metadata associated with this {@link DataHolder} (may be null). - * @return An empty {@link DataHolder} object with the given status and metadata. - */ - public static DataHolder empty(int statusCode, Bundle metadata) { - return new DataHolder(new String[0], new CursorWindow[0], statusCode, metadata); - } - - /** - * @param statusCode The status code of this {@link DataHolder}. - * @return An empty {@link DataHolder} object with the given status and null metadata. - */ - public static DataHolder empty(int statusCode) { - return empty(statusCode, null); - } - @SuppressWarnings("deprecation") @SuppressLint({"NewApi", "ObsoleteSdkInt"}) static int getCursorType(Cursor cursor, int i) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { - return cursor.getType(i); - } - if (cursor instanceof AbstractWindowedCursor) { - CursorWindow cursorWindow = ((AbstractWindowedCursor) cursor).getWindow(); - int pos = cursor.getPosition(); - int type = -1; - if (cursorWindow.isNull(pos, i)) { - type = FIELD_TYPE_NULL; - } else if (cursorWindow.isLong(pos, i)) { - type = FIELD_TYPE_INTEGER; - } else if (cursorWindow.isFloat(pos, i)) { - type = FIELD_TYPE_FLOAT; - } else if (cursorWindow.isString(pos, i)) { - type = FIELD_TYPE_STRING; - } else if (cursorWindow.isBlob(pos, i)) { - type = FIELD_TYPE_BLOB; - } - - return type; - } - throw new RuntimeException("Unsupported cursor on this platform!"); + return cursor.getType(i); } /** @@ -194,20 +131,6 @@ public class DataHolder extends AutoSafeParcelable implements Closeable { } } - /** - * Copies the String content in the given column at the provided position into a {@link CharArrayBuffer}. - * This will throw an {@link IllegalArgumentException} if the column does not exist, the - * position is invalid, or the data holder has been closed. - * - * @param column The column to retrieve. - * @param row The row to retrieve the data from. - * @param windowIndex Index of the cursor window to extract the data from. - * @param dataOut The {@link CharArrayBuffer} to copy into. - */ - public void copyToBuffer(String column, int row, int windowIndex, CharArrayBuffer dataOut) { - throw new RuntimeException("Not yet available"); - } - @SuppressWarnings("deprecation") private static CursorWindow[] createCursorWindows(Builder builder) { if (builder.columns.length == 0) return new CursorWindow[0]; @@ -300,34 +223,6 @@ public class DataHolder extends AutoSafeParcelable implements Closeable { return windows.toArray(new CursorWindow[0]); } - /** - * Retrieves the boolean value for a given column at the provided position. - * This will throw an {@link IllegalArgumentException} if the column does not exist, the - * position is invalid, or the data holder has been closed. - * - * @param column The column to retrieve. - * @param row The row to retrieve the data from. - * @param windowIndex Index of the cursor window to extract the data from. - * @return The boolean value in that column. - */ - public boolean getBoolean(String column, int row, int windowIndex) { - return windows[windowIndex].getLong(row, columnIndices.get(column)) == 1; - } - - /** - * Retrieves the byte array value for a given column at the provided position. - * This will throw an {@link IllegalArgumentException} if the column does not exist, the - * position is invalid, or the data holder has been closed. - * - * @param column The column to retrieve. - * @param row The row to retrieve the data from. - * @param windowIndex Index of the cursor window to extract the data from. - * @return The byte array value in that column. - */ - public byte[] getByteArray(String column, int row, int windowIndex) { - return windows[windowIndex].getBlob(row, columnIndices.get(column)); - } - /** * Gets the number of rows in the data holder. * @@ -343,38 +238,6 @@ public class DataHolder extends AutoSafeParcelable implements Closeable { return c; } - /** - * Retrieves the integer value for a given column at the provided position. - * This will throw an {@link IllegalArgumentException} if the column does not exist, the - * position is invalid, or the data holder has been closed. - * - * @param column The column to retrieve. - * @param row The row to retrieve the data from. - * @param windowIndex Index of the cursor window to extract the data from. - * @return The integer value in that column. - */ - public int getInteger(String column, int row, int windowIndex) { - return windows[windowIndex].getInt(row, columnIndices.get(column)); - } - - /** - * Retrieves the long value for a given column at the provided position. - * This will throw an {@link IllegalArgumentException} if the column does not exist, the - * position is invalid, or the data holder has been closed. - * - * @param column The column to retrieve. - * @param row The row to retrieve the data from. - * @param windowIndex Index of the cursor window to extract the data from. - * @return The long value in that column. - */ - public long getLong(String column, int row, int windowIndex) { - return windows[windowIndex].getLong(row, columnIndices.get(column)); - } - - public int getStatusCode() { - return statusCode; - } - /** * Retrieves the string value for a given column at the provided position. * This will throw an {@link IllegalArgumentException} if the column does not exist, the @@ -389,42 +252,6 @@ public class DataHolder extends AutoSafeParcelable implements Closeable { return windows[windowIndex].getString(row, columnIndices.get(column)); } - /** - * Returns whether the given column at the provided position contains null. - * This will throw an {@link IllegalArgumentException} if the column does not exist, the - * position is invalid, or the data holder has been closed. - * - * @param column The column to retrieve. - * @param row The row to retrieve the data from. - * @param windowIndex Index of the cursor window to extract the data from. - * @return Whether the column value is null at this position. - */ - public boolean isNull(String column, int row, int windowIndex) { - return windows[windowIndex].isNull(row, columnIndices.get(column)); - } - - public boolean isClosed() { - synchronized (this) { - return closed; - } - } - - /** - * Retrieves the column data at the provided position as a URI if possible, checking for null values. - * This will throw an {@link IllegalArgumentException} if the column does not exist, the - * position is invalid, or the data holder has been closed. - * - * @param column The column to retrieve. - * @param row The row to retrieve the data from. - * @param windowIndex Index of the cursor window to extract the data from. - * @return The column data as a URI, or null if not present. - */ - public Uri parseUri(String column, int row, int windowIndex) { - String string = getString(column, row, windowIndex); - if (string != null) return Uri.parse(string); - return null; - } - @Override public String toString() { return "DataHolder{" + @@ -488,18 +315,6 @@ public class DataHolder extends AutoSafeParcelable implements Closeable { return rows.size(); } - /** - * Sort the rows in this builder based on the standard data type comparisons for the value in the provided column. - * Calling this multiple times with the same column will not change the sort order of the builder. - * Note that any data which is added after this call will not be sorted. - * - * @param sortColumn The column to sort the rows in this builder by. - * @return {@link DataHolder.Builder} to continue construction. - */ - public Builder sort(String sortColumn) { - throw new RuntimeException("Not yet implemented"); - } - /** * Add a new row of data to the {@link DataHolder} this {@link DataHolder.Builder} will create. Note that the data must contain an entry for all columns *

diff --git a/play-services-base-core/src/main/java/org/microg/gms/common/DeviceConfiguration.java b/play-services-base-core/src/main/java/org/microg/gms/common/DeviceConfiguration.java index 99fed5ef..d4ab5940 100644 --- a/play-services-base-core/src/main/java/org/microg/gms/common/DeviceConfiguration.java +++ b/play-services-base-core/src/main/java/org/microg/gms/common/DeviceConfiguration.java @@ -101,15 +101,7 @@ public class DeviceConfiguration { @SuppressWarnings({"deprecation", "InlinedApi"}) private static List getNativePlatforms() { List nativePlatforms; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - return Arrays.asList(Build.SUPPORTED_ABIS); - } else { - nativePlatforms = new ArrayList<>(); - nativePlatforms.add(Build.CPU_ABI); - if (Build.CPU_ABI2 != null && !Build.CPU_ABI2.equals("unknown")) - nativePlatforms.add(Build.CPU_ABI2); - return nativePlatforms; - } + return Arrays.asList(Build.SUPPORTED_ABIS); } private static void addEglExtensions(Set glExtensions) { diff --git a/play-services-base-core/src/main/java/org/microg/gms/common/ForegroundServiceContext.java b/play-services-base-core/src/main/java/org/microg/gms/common/ForegroundServiceContext.java index 132f230f..c7a2ff52 100644 --- a/play-services-base-core/src/main/java/org/microg/gms/common/ForegroundServiceContext.java +++ b/play-services-base-core/src/main/java/org/microg/gms/common/ForegroundServiceContext.java @@ -1,5 +1,6 @@ package org.microg.gms.common; +import android.annotation.SuppressLint; import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; @@ -15,7 +16,6 @@ import android.os.PowerManager; import android.provider.Settings; import android.util.Log; -import androidx.annotation.RequiresApi; import androidx.core.app.NotificationCompat; import org.microg.gms.base.core.R; @@ -30,8 +30,7 @@ public class ForegroundServiceContext extends ContextWrapper { @Override public ComponentName startService(Intent service) { - if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M - && !isIgnoringBatteryOptimizations()) { + if (!isIgnoringBatteryOptimizations()) { Log.d(TAG, "Starting in foreground mode."); service.putExtra(EXTRA_FOREGROUND, true); if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { @@ -43,7 +42,6 @@ public class ForegroundServiceContext extends ContextWrapper { return super.startService(service); } - @RequiresApi(api = Build.VERSION_CODES.M) private boolean isIgnoringBatteryOptimizations() { PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); return powerManager.isIgnoringBatteryOptimizations(getPackageName()); @@ -73,9 +71,7 @@ public class ForegroundServiceContext extends ContextWrapper { } public static void completeForegroundService(Service service, Intent intent, String tag) { - if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M - && intent != null - && intent.getBooleanExtra(EXTRA_FOREGROUND, false)) { + if (intent != null && intent.getBooleanExtra(EXTRA_FOREGROUND, false)) { String serviceName = getServiceName(service); Log.d(tag, "Started " + serviceName + " in foreground mode."); try { @@ -88,6 +84,7 @@ public class ForegroundServiceContext extends ContextWrapper { } } + @SuppressLint("BatteryLife") private static Notification buildForegroundNotification(Context context, String serviceName) { Intent notificationIntent = new Intent(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { diff --git a/play-services-base-core/src/main/java/org/microg/gms/common/PackageUtils.java b/play-services-base-core/src/main/java/org/microg/gms/common/PackageUtils.java index d6bdb4f2..50d112d0 100644 --- a/play-services-base-core/src/main/java/org/microg/gms/common/PackageUtils.java +++ b/play-services-base-core/src/main/java/org/microg/gms/common/PackageUtils.java @@ -16,10 +16,6 @@ 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; @@ -40,11 +36,17 @@ 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; +import static org.microg.gms.common.Constants.GMS_SECONDARY_PACKAGE_SIGNATURE_SHA1; + public class PackageUtils { private static final String GOOGLE_PLATFORM_KEY = GMS_PACKAGE_SIGNATURE_SHA1; - private static final String GOOGLE_LEGACY_KEY = "58e1c4133f7441ec3d2c270270a14802da47ba0e"; // Seems to be no longer used. - private static final String[] GOOGLE_PRIMARY_KEYS = {GOOGLE_PLATFORM_KEY, "24bb24c05e47e0aefa68a58a766179d9b613a600", "afb0fed5eeaebdd86f56a97742f4b6b33ef59875", "61226bdb57cc32c8a2a9ef71f7bc9548e95dcc0b", "3a82b5ee26bc46bf68113d920e610cd090198d4a"}; + private static final String GOOGLE_PLATFORM_KEY_2 = GMS_SECONDARY_PACKAGE_SIGNATURE_SHA1; + private static final String GOOGLE_APP_KEY = "24bb24c05e47e0aefa68a58a766179d9b613a600"; + private static final String[] GOOGLE_PRIMARY_KEYS = {GOOGLE_PLATFORM_KEY, GOOGLE_PLATFORM_KEY_2, GOOGLE_APP_KEY}; private static final Map KNOWN_GOOGLE_PACKAGES; @@ -278,11 +280,7 @@ public class PackageUtils { @SuppressWarnings("deprecation") public static String packageFromPendingIntent(PendingIntent pi) { if (pi == null) return null; - if (SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { - return pi.getTargetPackage(); - } else { - return pi.getCreatorPackage(); - } + return pi.getCreatorPackage(); } public static String getProcessName() { @@ -290,7 +288,7 @@ public class PackageUtils { return Application.getProcessName(); try { Class activityThread = Class.forName("android.app.ActivityThread"); - String methodName = android.os.Build.VERSION.SDK_INT >= 18 ? "currentProcessName" : "currentPackageName"; + String methodName = "currentProcessName"; Method getProcessName = activityThread.getDeclaredMethod(methodName); return (String) getProcessName.invoke(null); } catch (Exception e) { 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 57f63efc..913291f4 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,8 +16,6 @@ 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; @@ -36,6 +34,7 @@ import java.util.Set; public class MultiConnectionKeeper { private static final String TAG = "GmsMultiConKeeper"; + @SuppressLint("StaticFieldLeak") private static MultiConnectionKeeper INSTANCE; private final Context context; @@ -137,9 +136,7 @@ public class MultiConnectionKeeper { intent = gmsIntent; } int flags = Context.BIND_AUTO_CREATE; - if (SDK_INT >= ICE_CREAM_SANDWICH) { - flags |= Context.BIND_ADJUST_WITH_ACTIVITY; - } + flags |= Context.BIND_ADJUST_WITH_ACTIVITY; bound = context.bindService(intent, serviceConnection, flags); if (!bound) { context.unbindService(serviceConnection); @@ -150,10 +147,6 @@ public class MultiConnectionKeeper { return bound; } - public IBinder getBinder() { - return binder; - } - public void unbind() { Log.d(TAG, "Connection(" + actionString + ") : unbind()"); try { diff --git a/play-services-basement/src/main/java/com/google/android/gms/dynamic/ObjectWrapper.java b/play-services-basement/src/main/java/com/google/android/gms/dynamic/ObjectWrapper.java index 967d8cc6..649af71b 100644 --- a/play-services-basement/src/main/java/com/google/android/gms/dynamic/ObjectWrapper.java +++ b/play-services-basement/src/main/java/com/google/android/gms/dynamic/ObjectWrapper.java @@ -39,10 +39,33 @@ public class ObjectWrapper extends IObjectWrapper.Stub { } IBinder binder = obj.asBinder(); Field[] fields = binder.getClass().getDeclaredFields(); - if (fields.length != 1) { - throw new IllegalArgumentException(); + + if (fields.length < 1) { + throw new IllegalArgumentException("No fields were found"); } - Field field = fields[0]; + + // Ignore synthetic field(s) from JaCoCo or elsewhere + // https://www.jacoco.org/jacoco/trunk/doc/faq.html + + @Nullable + Field field = null; + + for (Field currentField : fields) { + if (currentField.isSynthetic()) { + continue; + } + + if (field == null) { + field = currentField; + } else { + throw new IllegalArgumentException("Too many non-synthetic fields were found"); + } + } + + if (field == null) { + throw new IllegalArgumentException("No non-synthetic fields were found"); + } + if (!field.isAccessible()) { field.setAccessible(true); try { @@ -72,6 +95,6 @@ public class ObjectWrapper extends IObjectWrapper.Stub { } public static ObjectWrapper wrap(T t) { - return new ObjectWrapper<>(t); + return new ObjectWrapper(t); } -} +} \ No newline at end of file diff --git a/play-services-basement/src/main/java/org/microg/gms/common/Constants.java b/play-services-basement/src/main/java/org/microg/gms/common/Constants.java index 881ac540..217ea437 100644 --- a/play-services-basement/src/main/java/org/microg/gms/common/Constants.java +++ b/play-services-basement/src/main/java/org/microg/gms/common/Constants.java @@ -23,6 +23,8 @@ public class Constants { public static final String GMS_PACKAGE_NAME = "com.google.android.gms"; public static final String GSF_PACKAGE_NAME = "com.mgoogle.android.gsf"; public static final String GMS_PACKAGE_SIGNATURE_SHA1 = "38918a453d07199354f8b19af05ec6562ced5788"; + public static final String GMS_SECONDARY_PACKAGE_SIGNATURE_SHA1 = "bd32424203e0fb25f36b57e5aa356f9bdd1da998"; + @Deprecated public static final int MAX_REFERENCE_VERSION = GMS_VERSION_CODE; } diff --git a/play-services-core/microg-ui-tools/build.gradle b/play-services-core/microg-ui-tools/build.gradle index c5813f04..d3d14c01 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 '30.0.3' + buildToolsVersion androidBuildVersionTools defaultConfig { minSdkVersion androidMinSdk @@ -37,7 +37,7 @@ android { } dependencies { - implementation 'androidx.appcompat:appcompat:1.5.1' - implementation 'androidx.preference:preference:1.2.0' + implementation "androidx.appcompat:appcompat:$appcompatVersion" + implementation "androidx.preference:preference:$preferenceVersion" } 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 b404bcbc..90f7b92a 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,10 +17,7 @@ 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; import android.os.Parcelable; import android.text.SpannableStringBuilder; @@ -70,9 +67,7 @@ public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedC LayoutInflater.from(context).inflate(R.layout.switch_bar, this); mTextView = (TextView) findViewById(R.id.switch_text); - if (SDK_INT > Build.VERSION_CODES.JELLY_BEAN) { - mTextView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); - } + mTextView.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); mLabel = getResources().getString(R.string.abc_capital_off); mSummarySpan = new TextAppearanceSpan(context, androidx.appcompat.R.style.TextAppearance_AppCompat_Widget_Switch); updateText(); @@ -81,9 +76,7 @@ public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedC // Prevent onSaveInstanceState() to be called as we are managing the state of the Switch // on our own mSwitch.setSaveEnabled(false); - if (SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - mSwitch.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); - } + mSwitch.setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO); addOnSwitchChangeListener((switchView, isChecked) -> setTextViewLabel(isChecked)); @@ -121,39 +114,12 @@ public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedC mSwitch.setChecked(checked); } - public void setCheckedInternal(boolean checked) { - setTextViewLabel(checked); - mSwitch.setCheckedInternal(checked); - } - - public boolean isChecked() { - return mSwitch.isChecked(); - } - public void setEnabled(boolean enabled) { super.setEnabled(enabled); mTextView.setEnabled(enabled); mSwitch.setEnabled(enabled); } - public final ToggleSwitch getSwitch() { - return mSwitch; - } - - public void show() { - if (!isShowing()) { - setVisibility(View.VISIBLE); - mSwitch.setOnCheckedChangeListener(this); - } - } - - public void hide() { - if (isShowing()) { - setVisibility(View.GONE); - mSwitch.setOnCheckedChangeListener(null); - } - } - public boolean isShowing() { return (getVisibility() == View.VISIBLE); } @@ -183,13 +149,6 @@ public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedC mSwitchChangeListeners.add(listener); } - public void removeOnSwitchChangeListener(OnSwitchChangeListener listener) { - if (!mSwitchChangeListeners.contains(listener)) { - throw new IllegalStateException("Cannot remove OnSwitchChangeListener"); - } - mSwitchChangeListeners.remove(listener); - } - static class SavedState extends BaseSavedState { boolean checked; boolean visible; @@ -214,6 +173,7 @@ public class SwitchBar extends LinearLayout implements CompoundButton.OnCheckedC out.writeValue(visible); } + @NonNull @Override public String toString() { return "SwitchBar.SavedState{" 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 bba39ab5..9c96646b 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 @@ -54,10 +54,8 @@ public class AccountContentProvider extends ContentProvider { @Nullable @Override public Bundle call(String method, String arg, Bundle extras) { - String suggestedPackageName = null; - if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { - suggestedPackageName = getCallingPackage(); - } + String suggestedPackageName; + suggestedPackageName = getCallingPackage(); String packageName = PackageUtils.getAndCheckCallingPackage(getContext(), suggestedPackageName); Log.d(TAG, "Call " + method + " from " + packageName + " with arg " + arg); if (!PackageUtils.callerHasExtendedAccess(getContext())) { @@ -73,9 +71,7 @@ public class AccountContentProvider extends ContentProvider { Account[] accounts = null; if (arg != null && (arg.equals(DEFAULT_ACCOUNT_TYPE) || arg.startsWith(DEFAULT_ACCOUNT_TYPE + "."))) { AccountManager am = AccountManager.get(getContext()); - if (Build.VERSION.SDK_INT >= 18) { - accounts = am.getAccountsByTypeForPackage(arg, packageName); - } + accounts = am.getAccountsByTypeForPackage(arg, packageName); if (accounts == null || accounts.length == 0) { accounts = am.getAccountsByType(arg); } 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 ea031218..98598a09 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 @@ -80,7 +80,8 @@ public class CheckinClient { DeviceIdentifier deviceIdent, PhoneInfo phoneInfo, LastCheckinInfo checkinInfo, Locale locale, List accounts, Boolean brandSpoof) { - CheckinRequest.Builder builder = new CheckinRequest.Builder() + CheckinRequest.Builder builder; + builder = new CheckinRequest.Builder() .accountCookie(new ArrayList<>()) .androidId(checkinInfo.getAndroidId()) .checkin(new CheckinRequest.Checkin.Builder() @@ -102,7 +103,7 @@ public class CheckinClient { .cellOperator(phoneInfo.cellOperator) .event(Collections.singletonList(new CheckinRequest.Checkin.Event.Builder() .tag(checkinInfo.getAndroidId() == 0 ? "event_log_start" : "system_update") - .value(checkinInfo.getAndroidId() == 0 ? null : "1536,0,-1,NULL") + .value_(checkinInfo.getAndroidId() == 0 ? null : "1536,0,-1,NULL") .timeMs(new Date().getTime()) .build())) .lastCheckinMs(checkinInfo.getLastCheckin()) 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 9252bb19..355800d1 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 @@ -71,7 +71,7 @@ public class CheckinManager { ContentResolver resolver = context.getContentResolver(); for (CheckinResponse.GservicesSetting setting : response.setting) { - GServices.setString(resolver, setting.name.utf8(), setting.value.utf8()); + GServices.setString(resolver, setting.name.utf8(), setting.value_.utf8()); } return info; 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 b5e4c39a..6a6889ff 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 @@ -39,7 +39,6 @@ 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; @@ -178,7 +177,7 @@ public class McsService extends Service implements Handler.Callback { heartbeatIntent = PendingIntent.getService(this, 0, new Intent(ACTION_HEARTBEAT, null, this, McsService.class), 0); alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); powerManager = (PowerManager) getSystemService(POWER_SERVICE); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission("android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST") == PackageManager.PERMISSION_GRANTED) { + if (checkSelfPermission("android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST") == PackageManager.PERMISSION_GRANTED) { try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { Class powerExemptionManagerClass = Class.forName("android.os.PowerExemptionManager"); @@ -267,11 +266,7 @@ public class McsService extends Service implements Handler.Callback { long delay = getCurrentDelay(); logd(context, "Scheduling reconnect in " + delay / 1000 + " seconds..."); PendingIntent pi = PendingIntent.getBroadcast(context, 1, new Intent(ACTION_RECONNECT, null, context, TriggerReceiver.class), 0); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - alarmManager.setExactAndAllowWhileIdle(ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + delay, pi); - } else { - alarmManager.set(ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + delay, pi); - } + alarmManager.setExactAndAllowWhileIdle(ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + delay, pi); } public void scheduleHeartbeat(Context context) { @@ -282,18 +277,8 @@ public class McsService extends Service implements Handler.Callback { closeAll(); } logd(context, "Scheduling heartbeat in " + heartbeatMs / 1000 + " seconds..."); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - // This is supposed to work even when running in idle and without battery optimization disabled - alarmManager.setExactAndAllowWhileIdle(ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + heartbeatMs, heartbeatIntent); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - // With KitKat, the alarms become inexact by default, but with the newly available setWindow we can get inexact alarms with guarantees. - // Schedule the alarm to fire within the interval [heartbeatMs/3*4, heartbeatMs] - alarmManager.setWindow(ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + heartbeatMs / 4 * 3, heartbeatMs / 4, - heartbeatIntent); - } else { - alarmManager.set(ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + heartbeatMs, heartbeatIntent); - } - + // This is supposed to work even when running in idle and without battery optimization disabled + alarmManager.setExactAndAllowWhileIdle(ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + heartbeatMs, heartbeatIntent); } public synchronized static long getCurrentDelay() { @@ -339,7 +324,6 @@ public class McsService extends Service implements Handler.Callback { String messageId = intent.getStringExtra(EXTRA_MESSAGE_ID); String collapseKey = intent.getStringExtra(EXTRA_COLLAPSE_KEY); - Messenger messenger = intent.getParcelableExtra(EXTRA_MESSENGER); intent.removeExtra(EXTRA_MESSENGER); Parcelable app = intent.getParcelableExtra(EXTRA_APP); @@ -357,16 +341,8 @@ public class McsService extends Service implements Handler.Callback { } intent.removeExtra(EXTRA_APP); - int ttl; try { - if (intent.hasExtra(EXTRA_TTL)) { - ttl = Integer.parseInt(intent.getStringExtra(EXTRA_TTL)); - if (ttl < 0 || ttl > maxTtl) { - ttl = maxTtl; - } - } else { - ttl = maxTtl; - } + intent.hasExtra(EXTRA_TTL); } catch (NumberFormatException e) { // TODO: error TtlUnsupported Log.w(TAG, e); @@ -404,7 +380,7 @@ public class McsService extends Service implements Handler.Callback { if (!key.startsWith("google.")) { Object val = extras.get(key); if (val instanceof String) { - appData.add(new AppData.Builder().key(key).value((String) val).build()); + appData.add(new AppData.Builder().key(key).value_((String) val).build()); } } } @@ -545,7 +521,7 @@ public class McsService extends Service implements Handler.Callback { .resource(Long.toString(info.getAndroidId())) .user(Long.toString(info.getAndroidId())) .use_rmq2(true) - .setting(Collections.singletonList(new Setting.Builder().name("new_vc").value("1").build())) + .setting(Collections.singletonList(new Setting.Builder().name("new_vc").value_("1").build())) .received_persistent_id(GcmPrefs.get(this).getLastPersistedIds()) .build(); } @@ -569,7 +545,7 @@ public class McsService extends Service implements Handler.Callback { } if (msg.token != null) intent.putExtra(EXTRA_COLLAPSE_KEY, msg.token); for (AppData appData : msg.app_data) { - intent.putExtra(appData.key, appData.value); + intent.putExtra(appData.key, appData.value_); } String receiverPermission = null; @@ -622,7 +598,7 @@ public class McsService extends Service implements Handler.Callback { } catch (Exception e) { Log.e(TAG, "Error adding app" + packageName + " to the temp allowlist.", e); } - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + } else { try { if (getUserIdMethod != null && addPowerSaveTempWhitelistAppMethod != null && deviceIdleController != null) { int userId = (int) getUserIdMethod.invoke(null, getPackageManager().getApplicationInfo(packageName, 0).uid); @@ -644,7 +620,7 @@ public class McsService extends Service implements Handler.Callback { .sent(System.currentTimeMillis() / 1000) .ttl(0) .category(SELF_CATEGORY) - .app_data(Collections.singletonList(new AppData.Builder().key(IDLE_NOTIFICATION).value("false").build())); + .app_data(Collections.singletonList(new AppData.Builder().key(IDLE_NOTIFICATION).value_("false").build())); if (inputStream.newStreamIdAvailable()) { msgResponse.last_stream_id_received(inputStream.getStreamId()); } @@ -717,7 +693,7 @@ public class McsService extends Service implements Handler.Callback { IqStanza.Builder iq = new IqStanza.Builder() .type(IqStanza.IqType.SET) .id("") - .extension(new Extension.Builder().id(13).data(ByteString.EMPTY).build()) // StreamAck + .extension(new Extension.Builder().id(13).data_(ByteString.EMPTY).build()) // StreamAck .status(0L); if (inputStream.newStreamIdAvailable()) { iq.last_stream_id_received(inputStream.getStreamId()); 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 ea2cf938..2a95655b 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 @@ -21,7 +21,6 @@ import android.content.ContentValues; import android.database.Cursor; import android.database.MatrixCursor; import android.net.Uri; -import android.os.Build; import android.util.Log; import java.util.HashMap; @@ -56,11 +55,7 @@ public class GServicesProvider extends ContentProvider { } private String getCallingPackageName() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - return getCallingPackage(); - } else { - return "unknown"; - } + return getCallingPackage(); } @Override 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 79f6d575..1a5caae1 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 @@ -72,11 +72,11 @@ class PushNotificationPreferencesFragment : PreferenceFragmentCompat() { val appContext = requireContext().applicationContext lifecycleScope.launchWhenStarted { val statusInfo = getGcmServiceInfo(appContext) - pushStatusCategory.isVisible = statusInfo.configuration.enabled + pushStatusCategory.isVisible = statusInfo != null && statusInfo.configuration.enabled pushStatus.summary = if (statusInfo.connected) { - getString(R.string.gcm_network_state_connected, DateUtils.getRelativeTimeSpanString(statusInfo.startTimestamp, System.currentTimeMillis(), 0)) + appContext.getString(R.string.gcm_network_state_connected, DateUtils.getRelativeTimeSpanString(statusInfo.startTimestamp, System.currentTimeMillis(), 0)) } else { - getString(R.string.gcm_network_state_disconnected) + appContext.getString(R.string.gcm_network_state_disconnected) } } } catch (e: Exception) {} 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 a404862b..848e702b 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 @@ -42,13 +42,9 @@ class SettingsFragment : ResourceSettingsFragment() { findPreference(PREF_ABOUT)?.summary = getString(R.string.about_version_str, AboutFragment.getSelfVersion(context)) findPreference(SettingsContract.CheckIn.HIDE_LAUNCHER_ICON)?.apply { - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { - setOnPreferenceChangeListener { _, newValue -> - requireActivity().hideIcon(newValue as Boolean) - true - } - } else { - preferenceScreen.removePreference(this) + setOnPreferenceChangeListener { _, newValue -> + requireActivity().hideIcon(newValue as Boolean) + true } } 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 26ce8110..998770e3 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 @@ -11,12 +11,10 @@ import android.content.ComponentName import android.content.Context import android.content.pm.ApplicationInfo import android.content.pm.PackageManager -import android.os.Build import android.os.Bundle import android.provider.Settings import android.util.Log import androidx.annotation.IdRes -import androidx.annotation.RequiresApi import androidx.navigation.NavController import androidx.navigation.navOptions import androidx.navigation.ui.R @@ -41,7 +39,6 @@ fun NavController.navigate(context: Context, @IdRes resId: Int, args: Bundle? = } else null) } -@RequiresApi(Build.VERSION_CODES.M) fun Context.hideIcon(hide: Boolean) { packageManager.setComponentEnabledSetting( ComponentName.createRelative(this, "org.microg.gms.ui.SettingsActivityLauncher"), 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 0e51092f..1cc87ae3 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,9 +16,6 @@ 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; @@ -29,23 +26,15 @@ import android.os.Parcelable; import android.os.RemoteException; public class MessengerCompat implements Parcelable { - private Messenger messenger; + private final Messenger messenger; private IMessengerCompat messengerCompat; public MessengerCompat(IBinder binder) { - if (SDK_INT >= LOLLIPOP) { - messenger = new Messenger(binder); - } else { - messengerCompat = IMessengerCompat.Stub.asInterface(binder); - } + messenger = new Messenger(binder); } public MessengerCompat(Handler handler) { - if (SDK_INT >= LOLLIPOP) { - messenger = new Messenger(handler); - } else { - messengerCompat = new IMessengerCompatImpl(handler); - } + messenger = new Messenger(handler); } @Override @@ -59,7 +48,7 @@ public class MessengerCompat implements Parcelable { } public IBinder getBinder() { - return messenger != null ? messenger.getBinder() : messengerCompat.asBinder(); + return messenger.getBinder(); } @Override @@ -68,8 +57,7 @@ public class MessengerCompat implements Parcelable { } public void send(Message message) throws RemoteException { - if (messenger != null) messenger.send(message); - else messengerCompat.send(message); + messenger.send(message); } @Override