From f3332b7201a8be32c0decd6246d6facd0768462c Mon Sep 17 00:00:00 2001 From: Mis012 Date: Wed, 26 Mar 2025 21:01:57 +0100 Subject: [PATCH] api-impl: misc stubs and fixes --- src/api-impl/android/app/KeyguardManager.java | 4 + .../android/app/backup/BackupAgent.java | 9 ++ .../android/app/backup/BackupAgentHelper.java | 5 ++ .../android/app/backup/BackupManager.java | 8 ++ src/api-impl/android/app/job/JobInfo.java | 28 ++++--- .../android/app/job/JobScheduler.java | 3 + src/api-impl/android/content/Context.java | 7 ++ .../android/content/IntentFilter.java | 4 + .../android/graphics/PathMeasure.java | 4 + .../graphics/drawable/DrawableContainer.java | 10 ++- .../android/net/ConnectivityManager.java | 8 +- .../android/net/NetworkCapabilities.java | 7 ++ src/api-impl/android/os/BaseBundle.java | 7 +- src/api-impl/android/os/Bundle.java | 2 +- src/api-impl/android/os/SystemProperties.java | 21 ++++- .../android/provider/BaseColumns.java | 5 +- .../android/provider/ContactsContract.java | 6 +- src/api-impl/android/provider/Settings.java | 8 ++ src/api-impl/android/text/AutoText.java | 10 +++ src/api-impl/android/text/TextUtils.java | 84 ++++++++++++++++++- .../text/style/BackgroundColorSpan.java | 2 +- .../android/text/style/UnderlineSpan.java | 2 +- src/api-impl/android/util/TypedValue.java | 21 ++++- src/api-impl/android/view/LayoutInflater.java | 2 +- src/api-impl/meson.build | 4 + 25 files changed, 234 insertions(+), 37 deletions(-) create mode 100644 src/api-impl/android/app/backup/BackupAgent.java create mode 100644 src/api-impl/android/app/backup/BackupAgentHelper.java create mode 100644 src/api-impl/android/app/backup/BackupManager.java create mode 100644 src/api-impl/android/net/NetworkCapabilities.java create mode 100644 src/api-impl/android/text/AutoText.java diff --git a/src/api-impl/android/app/KeyguardManager.java b/src/api-impl/android/app/KeyguardManager.java index 81c1f195..084c22f7 100644 --- a/src/api-impl/android/app/KeyguardManager.java +++ b/src/api-impl/android/app/KeyguardManager.java @@ -8,4 +8,8 @@ public class KeyguardManager { public boolean isKeyguardLocked() { return false; } + + public boolean isKeyguardSecure() { + return true; + } } diff --git a/src/api-impl/android/app/backup/BackupAgent.java b/src/api-impl/android/app/backup/BackupAgent.java new file mode 100644 index 00000000..288a9bd6 --- /dev/null +++ b/src/api-impl/android/app/backup/BackupAgent.java @@ -0,0 +1,9 @@ +package android.app.backup; + +import android.content.ContextWrapper; + +public abstract class BackupAgent extends ContextWrapper { + public BackupAgent() { + super(null); + } +} diff --git a/src/api-impl/android/app/backup/BackupAgentHelper.java b/src/api-impl/android/app/backup/BackupAgentHelper.java new file mode 100644 index 00000000..19f8488d --- /dev/null +++ b/src/api-impl/android/app/backup/BackupAgentHelper.java @@ -0,0 +1,5 @@ +package android.app.backup; + +public class BackupAgentHelper extends BackupAgent { + +} diff --git a/src/api-impl/android/app/backup/BackupManager.java b/src/api-impl/android/app/backup/BackupManager.java new file mode 100644 index 00000000..d5dc2c46 --- /dev/null +++ b/src/api-impl/android/app/backup/BackupManager.java @@ -0,0 +1,8 @@ +package android.app.backup; + +import android.content.Context; + +public class BackupManager { + public BackupManager(Context context) { + } +} diff --git a/src/api-impl/android/app/job/JobInfo.java b/src/api-impl/android/app/job/JobInfo.java index 4ea88201..bae373cc 100644 --- a/src/api-impl/android/app/job/JobInfo.java +++ b/src/api-impl/android/app/job/JobInfo.java @@ -10,15 +10,7 @@ public class JobInfo { public static final class Builder { public Builder(int jobId, ComponentName jobService) {} - public Builder setMinimumLatency(long minLatencyMillis) { - return this; - } - - public Builder setRequiredNetworkType(int networkType) { - return this; - } - - public Builder setOverrideDeadline(long a) { + public Builder setBackoffCriteria(long initialBackoffMillis, int backoffPolicy) { return this; } @@ -26,15 +18,15 @@ public class JobInfo { return this; } - public Builder setRequiresCharging(boolean requiresCharging) { + public Builder setMinimumLatency(long minLatencyMillis) { return this; } - public Builder setRequiresDeviceIdle(boolean requiresDeviceIdle) { + public Builder setOverrideDeadline(long a) { return this; } - public Builder setBackoffCriteria(long initialBackoffMillis, int backoffPolicy) { + public Builder setPeriodic(long dummy) { return this; } @@ -42,6 +34,18 @@ public class JobInfo { return this; } + public Builder setRequiredNetworkType(int networkType) { + return this; + } + + public Builder setRequiresCharging(boolean requires_charging) { + return this; + } + + public Builder setRequiresDeviceIdle(boolean requires_device_idle) { + return this; + } + public JobInfo build() { return new JobInfo(); } diff --git a/src/api-impl/android/app/job/JobScheduler.java b/src/api-impl/android/app/job/JobScheduler.java index 22225937..2f4c2325 100644 --- a/src/api-impl/android/app/job/JobScheduler.java +++ b/src/api-impl/android/app/job/JobScheduler.java @@ -21,4 +21,7 @@ public class JobScheduler { public int schedule(JobInfo job) { return 1; //RESULT_SUCCESS } + + public void cancel(int dummy) { + } } diff --git a/src/api-impl/android/content/Context.java b/src/api-impl/android/content/Context.java index 97926655..de6484c1 100644 --- a/src/api-impl/android/content/Context.java +++ b/src/api-impl/android/content/Context.java @@ -238,6 +238,8 @@ public class Context extends Object { return new JobScheduler(); case "appops": return new AppOpsManager(); + case "user": + return new UserManager(); default: Slog.e(TAG, "!!!!!!! getSystemService: case >" + name + "< is not implemented yet"); return null; @@ -717,4 +719,9 @@ public class Context extends Object { return new String[0]; } } + + public Context createDeviceProtectedStorageContext() { + /* FIXME: should be a different context, and return different storage locations */ + return this; + } } diff --git a/src/api-impl/android/content/IntentFilter.java b/src/api-impl/android/content/IntentFilter.java index 9c677c56..99df3f3e 100644 --- a/src/api-impl/android/content/IntentFilter.java +++ b/src/api-impl/android/content/IntentFilter.java @@ -56,6 +56,10 @@ public class IntentFilter { public void addDataPath(String path, int type) {} + public final void addDataSchemeSpecificPart(String ssp, int type) { + /* FIXME */ + } + public boolean hasDataScheme(String dataScheme) { return dataSchemes.contains(dataScheme); } diff --git a/src/api-impl/android/graphics/PathMeasure.java b/src/api-impl/android/graphics/PathMeasure.java index ef95e19e..265d2160 100644 --- a/src/api-impl/android/graphics/PathMeasure.java +++ b/src/api-impl/android/graphics/PathMeasure.java @@ -16,4 +16,8 @@ public class PathMeasure { public boolean getSegment(float start, float end, Path dst, boolean forceClosed) { return false; } + + public boolean getPosTan(float distance, float[] pos, float[] tan) { + return false; + } } diff --git a/src/api-impl/android/graphics/drawable/DrawableContainer.java b/src/api-impl/android/graphics/drawable/DrawableContainer.java index 77f0e4c8..5d60bb19 100644 --- a/src/api-impl/android/graphics/drawable/DrawableContainer.java +++ b/src/api-impl/android/graphics/drawable/DrawableContainer.java @@ -66,22 +66,24 @@ public class DrawableContainer extends Drawable { @Override public void draw(Canvas canvas) { - state.drawables[curIndex].draw(canvas); + if (curIndex != -1) + state.drawables[curIndex].draw(canvas); } @Override public int getIntrinsicHeight() { - return state.drawables[curIndex].getIntrinsicHeight(); + return curIndex != -1 ? state.drawables[curIndex].getIntrinsicHeight() : -1; } @Override public int getIntrinsicWidth() { - return state.drawables[curIndex].getIntrinsicWidth(); + return curIndex != -1 ? state.drawables[curIndex].getIntrinsicWidth() : -1; } @Override public void setBounds(int left, int top, int right, int bottom) { - state.drawables[curIndex].setBounds(left, top, right, bottom); + if (curIndex != -1) + state.drawables[curIndex].setBounds(left, top, right, bottom); } public void setEnterFadeDuration(int duration) {} diff --git a/src/api-impl/android/net/ConnectivityManager.java b/src/api-impl/android/net/ConnectivityManager.java index 6994b29b..28635752 100644 --- a/src/api-impl/android/net/ConnectivityManager.java +++ b/src/api-impl/android/net/ConnectivityManager.java @@ -2,8 +2,6 @@ package android.net; import android.os.Handler; -class NetworkCapabilities {} - public class ConnectivityManager { public class NetworkCallback { @@ -35,10 +33,14 @@ public class ConnectivityManager { return new Network(); } - public void registerDefaultNetworkCallback(NetworkCallback cb, Handler hdl) {} + public Network[] getAllNetworks() { + return new Network[] { getActiveNetwork() }; + } public NetworkCapabilities getNetworkCapabilities(Network network) { return null; } + public void registerDefaultNetworkCallback(NetworkCallback cb, Handler hdl) {} + } diff --git a/src/api-impl/android/net/NetworkCapabilities.java b/src/api-impl/android/net/NetworkCapabilities.java new file mode 100644 index 00000000..2d0f9bc2 --- /dev/null +++ b/src/api-impl/android/net/NetworkCapabilities.java @@ -0,0 +1,7 @@ +package android.net; + +public final class NetworkCapabilities { + public boolean hasCapability(int capability) { + return false; + } +} diff --git a/src/api-impl/android/os/BaseBundle.java b/src/api-impl/android/os/BaseBundle.java index c9cd835a..f83fbb10 100644 --- a/src/api-impl/android/os/BaseBundle.java +++ b/src/api-impl/android/os/BaseBundle.java @@ -12,7 +12,12 @@ public class BaseBundle { // Invariant - exactly one of mMap / mParcelledData will be null // (except inside a call to unparcel) - /* package */ ArrayMap mMap = new ArrayMap<>(); + /* package */ ArrayMap mMap; + + public BaseBundle() { + mMap = new ArrayMap(); + } + // Log a message if the value was non-null but not of the expected type void typeWarning(String key, Object value, String className, diff --git a/src/api-impl/android/os/Bundle.java b/src/api-impl/android/os/Bundle.java index 0f126bea..866c0435 100644 --- a/src/api-impl/android/os/Bundle.java +++ b/src/api-impl/android/os/Bundle.java @@ -57,7 +57,7 @@ public final class Bundle extends BaseBundle implements Cloneable, Parcelable { * Constructs a new, empty Bundle. */ public Bundle() { - mMap = new ArrayMap(); + super(); mClassLoader = getClass().getClassLoader(); } diff --git a/src/api-impl/android/os/SystemProperties.java b/src/api-impl/android/os/SystemProperties.java index 56c89447..ce8d4cf7 100644 --- a/src/api-impl/android/os/SystemProperties.java +++ b/src/api-impl/android/os/SystemProperties.java @@ -2,12 +2,27 @@ package android.os; public class SystemProperties { public static String get(String prop) { - android.util.Log.i("SystemProperties", "Grabbing prop " + prop); - return null; + android.util.Log.i("SystemProperties", "Grabbing String prop " + prop); + return ""; + } + + public static String get(String prop, String def) { + android.util.Log.i("SystemProperties", "Grabbing String prop " + prop + ", default " + def); + return def; } public boolean getBoolean(String prop, boolean def) { - android.util.Log.i("SystemProperties", "Grabbing prop " + prop + ", default " + def); + android.util.Log.i("SystemProperties", "Grabbing boolean prop " + prop + ", default " + def); + return def; + } + + public static int getInt(String prop, int def) { + android.util.Log.i("SystemProperties", "Grabbing int prop " + prop + ", default " + def); + return def; + } + + public static long getLong(String prop, long def) { + android.util.Log.i("SystemProperties", "Grabbing long prop " + prop + ", default " + def); return def; } } diff --git a/src/api-impl/android/provider/BaseColumns.java b/src/api-impl/android/provider/BaseColumns.java index 06aecd2d..65bd5fe9 100644 --- a/src/api-impl/android/provider/BaseColumns.java +++ b/src/api-impl/android/provider/BaseColumns.java @@ -1,3 +1,6 @@ package android.provider; -public interface BaseColumns {} +public interface BaseColumns { + public static final String _ID = "_id"; + public static final String _COUNT = "_count"; +} diff --git a/src/api-impl/android/provider/ContactsContract.java b/src/api-impl/android/provider/ContactsContract.java index 67297015..e525e538 100644 --- a/src/api-impl/android/provider/ContactsContract.java +++ b/src/api-impl/android/provider/ContactsContract.java @@ -6,9 +6,13 @@ public class ContactsContract { public static final class CommonDataKinds { - public static class Phone { + public static final class Phone { public static final Uri CONTENT_URI = Uri.parse("content://com.android.contacts/phones"); } + + public static final class Email { + public static final Uri CONTENT_URI = Uri.parse("content://com.android.contacts/emails"); + } } public static final class Profile { diff --git a/src/api-impl/android/provider/Settings.java b/src/api-impl/android/provider/Settings.java index 51008722..b2d31d39 100644 --- a/src/api-impl/android/provider/Settings.java +++ b/src/api-impl/android/provider/Settings.java @@ -6,6 +6,12 @@ import android.util.AndroidException; public class Settings { public static final class Secure { + public static final Uri CONTENT_URI = Uri.parse("content://settings/secure"); + + public static Uri getUriFor(String name) { + return Uri.withAppendedPath(CONTENT_URI, name); + } + public static String getString(ContentResolver content_resolver, String key) { switch (key) { case "android_id": @@ -25,6 +31,8 @@ public class Settings { switch (key) { case "limit_ad_tracking": return 1; // obviously, duh + case "user_setup_complete": + return 1; default: java.lang.System.out.println("!!!! Settings$Secure.getInt: unknown key: >" + key + "<"); return def; diff --git a/src/api-impl/android/text/AutoText.java b/src/api-impl/android/text/AutoText.java new file mode 100644 index 00000000..00b904b7 --- /dev/null +++ b/src/api-impl/android/text/AutoText.java @@ -0,0 +1,10 @@ +package android.text; + +import android.view.View; + +public class AutoText { + + public static String get(CharSequence src, final int start, final int end, View view) { + return null; + } +} diff --git a/src/api-impl/android/text/TextUtils.java b/src/api-impl/android/text/TextUtils.java index f30badfb..f56b7c17 100644 --- a/src/api-impl/android/text/TextUtils.java +++ b/src/api-impl/android/text/TextUtils.java @@ -1,6 +1,6 @@ /* * most of this file: - * + * * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -18,11 +18,11 @@ package android.text; +import com.android.internal.util.ArrayUtils; +import java.util.Iterator; import java.util.Locale; import java.util.regex.Pattern; -import com.android.internal.util.ArrayUtils; - public class TextUtils { public static int getLayoutDirectionFromLocale(Locale locale) { return 0 /*LTR*/; // FIXME @@ -255,7 +255,7 @@ public class TextUtils { } if (buf == null || buf.length < len) - buf = ArrayUtils.newUnpaddedCharArray(len); + buf = ArrayUtils.newUnpaddedCharArray(len); return buf; } @@ -377,4 +377,80 @@ public class TextUtils { } return true; } + + /** + * An interface for splitting strings according to rules that are opaque to the user of this + * interface. This also has less overhead than split, which uses regular expressions and + * allocates an array to hold the results. + * + *

The most efficient way to use this class is: + * + *

+	 * // Once
+	 * TextUtils.StringSplitter splitter = new TextUtils.SimpleStringSplitter(delimiter);
+	 *
+	 * // Once per string to split
+	 * splitter.setString(string);
+	 * for (String s : splitter) {
+	 *     ...
+	 * }
+	 * 
+ */ + public interface StringSplitter extends Iterable { + public void setString(String string); + } + + /** + * A simple string splitter. + * + *

If the final character in the string to split is the delimiter then no empty string will + * be returned for the empty string after that delimeter. That is, splitting "a,b," on + * comma will return "a", "b", not "a", "b", "". + */ + public static class SimpleStringSplitter implements StringSplitter, Iterator { + private String mString; + private char mDelimiter; + private int mPosition; + private int mLength; + + /** + * Initializes the splitter. setString may be called later. + * @param delimiter the delimeter on which to split + */ + public SimpleStringSplitter(char delimiter) { + mDelimiter = delimiter; + } + + /** + * Sets the string to split + * @param string the string to split + */ + public void setString(String string) { + mString = string; + mPosition = 0; + mLength = mString.length(); + } + + public Iterator iterator() { + return this; + } + + public boolean hasNext() { + return mPosition < mLength; + } + + public String next() { + int end = mString.indexOf(mDelimiter, mPosition); + if (end == -1) { + end = mLength; + } + String nextString = mString.substring(mPosition, end); + mPosition = end + 1; // Skip the delimiter. + return nextString; + } + + public void remove() { + throw new UnsupportedOperationException(); + } + } } diff --git a/src/api-impl/android/text/style/BackgroundColorSpan.java b/src/api-impl/android/text/style/BackgroundColorSpan.java index 7c590470..791e954d 100644 --- a/src/api-impl/android/text/style/BackgroundColorSpan.java +++ b/src/api-impl/android/text/style/BackgroundColorSpan.java @@ -1,5 +1,5 @@ package android.text.style; -public class BackgroundColorSpan { +public class BackgroundColorSpan extends CharacterStyle { public BackgroundColorSpan(int color) {} } diff --git a/src/api-impl/android/text/style/UnderlineSpan.java b/src/api-impl/android/text/style/UnderlineSpan.java index 157ddcb6..17b84c03 100644 --- a/src/api-impl/android/text/style/UnderlineSpan.java +++ b/src/api-impl/android/text/style/UnderlineSpan.java @@ -1,4 +1,4 @@ package android.text.style; -public class UnderlineSpan { +public class UnderlineSpan extends CharacterStyle { } diff --git a/src/api-impl/android/util/TypedValue.java b/src/api-impl/android/util/TypedValue.java index b70bb245..c4f3c621 100644 --- a/src/api-impl/android/util/TypedValue.java +++ b/src/api-impl/android/util/TypedValue.java @@ -398,6 +398,23 @@ public class TypedValue { return res; } + public int getComplexUnit() { + return (data >> COMPLEX_UNIT_SHIFT) & COMPLEX_UNIT_MASK; + } + + /** + * Return the complex unit type for the given complex dimension. For example, a dimen type + * with value 12sp will return {@link #COMPLEX_UNIT_SP}. Use with values created with {@link + * #createComplexDimension(int, int)} etc. + * + * @return The complex unit type. + * + * @hide + */ + public static int getUnitFromComplexDimension(int complexDimension) { + return COMPLEX_UNIT_MASK & (complexDimension >> TypedValue.COMPLEX_UNIT_SHIFT); + } + /** * Converts an unpacked complex data value holding a dimension to its final floating * point value. The two parameters unit and value @@ -572,8 +589,4 @@ public class TypedValue { sb.append("}"); return sb.toString(); } - - public int getComplexUnit() { - return (data >> COMPLEX_UNIT_SHIFT) & COMPLEX_UNIT_MASK; - } }; diff --git a/src/api-impl/android/view/LayoutInflater.java b/src/api-impl/android/view/LayoutInflater.java index 3a0257b4..92b85e5e 100644 --- a/src/api-impl/android/view/LayoutInflater.java +++ b/src/api-impl/android/view/LayoutInflater.java @@ -60,7 +60,7 @@ public class LayoutInflater { return mFactory; } - public final void setFactory(LayoutInflater.Factory factory){ + public void setFactory(LayoutInflater.Factory factory){ mFactory = factory; } diff --git a/src/api-impl/meson.build b/src/api-impl/meson.build index 265ffa8d..a162887e 100644 --- a/src/api-impl/meson.build +++ b/src/api-impl/meson.build @@ -60,6 +60,8 @@ srcs = [ 'android/app/UiModeManager.java', 'android/app/WallpaperManager.java', 'android/app/admin/DevicePolicyManager.java', + 'android/app/backup/BackupAgentHelper.java', + 'android/app/backup/BackupManager.java', 'android/app/job/JobInfo.java', 'android/app/job/JobScheduler.java', 'android/app/job/JobService.java', @@ -283,6 +285,7 @@ srcs = [ 'android/media/tv/TvInputManager.java', 'android/net/ConnectivityManager.java', 'android/net/Network.java', + 'android/net/NetworkCapabilities.java', 'android/net/NetworkInfo.java', 'android/net/NetworkRequest.java', 'android/net/SSLCertificateSocketFactory.java', @@ -368,6 +371,7 @@ srcs = [ 'android/telephony/PhoneStateListener.java', 'android/telephony/SubscriptionManager.java', 'android/telephony/TelephonyManager.java', + 'android/text/AutoText.java', 'android/text/BoringLayout.java', 'android/text/ClipboardManager.java', 'android/text/Editable.java',