api-impl: stubs and fixes for latest WhatsApp version

This commit is contained in:
Pierre-Hugues Husson 2024-10-28 19:06:17 +01:00 committed by Julian Winkler
parent 09a38f9a28
commit c81442321e
35 changed files with 261 additions and 1 deletions

View file

@ -109,6 +109,7 @@ libtranslationlayer_so = shared_library('translation_layer_main', [
'src/api-impl-jni/media/android_media_MediaCodec.c', 'src/api-impl-jni/media/android_media_MediaCodec.c',
'src/api-impl-jni/media/android_media_session_MediaSession.c', 'src/api-impl-jni/media/android_media_session_MediaSession.c',
'src/api-impl-jni/net/android_net_ConnectivityManager.c', 'src/api-impl-jni/net/android_net_ConnectivityManager.c',
'src/api-impl-jni/os/android_os_Process.c',
'src/api-impl-jni/sensors/android_hardware_SensorManager.c', 'src/api-impl-jni/sensors/android_hardware_SensorManager.c',
'src/api-impl-jni/util.c', 'src/api-impl-jni/util.c',
'src/api-impl-jni/views/AndroidLayout.c', 'src/api-impl-jni/views/AndroidLayout.c',

View file

@ -297,6 +297,14 @@ JNIEXPORT jintArray JNICALL Java_android_os_Process_getPidsForCommands
JNIEXPORT jlong JNICALL Java_android_os_Process_getPss JNIEXPORT jlong JNICALL Java_android_os_Process_getPss
(JNIEnv *, jclass, jint); (JNIEnv *, jclass, jint);
/*
* Class: android_os_Process
* Method: is64Bit
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_android_os_Process_is64Bit
(JNIEnv *, jclass);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View file

@ -0,0 +1,10 @@
#include "../generated_headers/android_os_Process.h"
JNIEXPORT jboolean JNICALL Java_android_os_Process_is64Bit(JNIEnv *env, jclass this)
{
#ifdef __LP64__
return 1;
#else
return 0;
#endif
}

View file

@ -576,4 +576,14 @@ public class Activity extends ContextThemeWrapper implements Window.Callback {
public void setDefaultKeyMode(int flag) {} public void setDefaultKeyMode(int flag) {}
public void registerForContextMenu(View view) {} public void registerForContextMenu(View view) {}
public native boolean isInMultiWindowMode(); public native boolean isInMultiWindowMode();
public void registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callback) {}
public void setDisablePreviewScreenshots(boolean disable) {}
public final View requireViewById(int id) {
View view = findViewById(id);
if (view == null)
throw new IllegalArgumentException("ID does not reference a View inside this View");
return view;
}
} }

View file

@ -8,6 +8,7 @@ import android.os.Parcelable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Collections;
public class ActivityManager { public class ActivityManager {
@ -80,4 +81,8 @@ public class ActivityManager {
} }
public int getLargeMemoryClass() {return getMemoryClass();} public int getLargeMemoryClass() {return getMemoryClass();}
public List<ApplicationExitInfo> getHistoricalProcessExitReasons(String pkgname, int pid, int maxNum) {
return Collections.emptyList();
}
} }

View file

@ -8,4 +8,6 @@ public class AlarmManager {
public void setExact(int type, long triggerTime, PendingIntent operation) {} public void setExact(int type, long triggerTime, PendingIntent operation) {}
public void set(int type, long triggerTime, PendingIntent operation) {} public void set(int type, long triggerTime, PendingIntent operation) {}
public void setExactAndAllowWhileIdle(int type, long triggerAtMillis, PendingIntent operation) {}
} }

View file

@ -96,4 +96,8 @@ public class Application extends ContextWrapper {
} }
public void unregisterOnProvideAssistDataListener(OnProvideAssistDataListener callback) { public void unregisterOnProvideAssistDataListener(OnProvideAssistDataListener callback) {
} }
public static String getProcessName() {
// note: we currently don't set the process name
return Context.this_application.getPackageName();
}
} }

View file

@ -0,0 +1,4 @@
package android.app;
public class ApplicationExitInfo {
}

View file

@ -1,6 +1,22 @@
package android.app; package android.app;
import android.net.Uri;
import android.media.AudioAttributes;
public class NotificationChannel { public class NotificationChannel {
public NotificationChannel(String id, CharSequence name, int importance) {} public NotificationChannel(String id, CharSequence name, int importance) {}
public void setLockscreenVisibility(int a) {}
public void setShowBadge(boolean a) {}
public void setGroup(String grp) {}
public void enableLights(boolean en) {}
public void setLightColor(int color) {}
public void setVibrationPattern(long[] pattern) {}
public void enableVibration(boolean en) {}
public void setSound(Uri uri, AudioAttributes attrs) {}
public boolean shouldShowLights() { return false; }
public int getLightColor() { return 0; }
public boolean shouldVibrate() { return false; }
public Uri getSound() { return null; }
} }

View file

@ -0,0 +1,6 @@
package android.app;
public class NotificationChannelGroup {
public NotificationChannelGroup(String a, CharSequence b) {
}
}

View file

@ -1,6 +1,8 @@
package android.app; package android.app;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@ -106,4 +108,14 @@ public class NotificationManager {
protected native void nativeShowMPRIS(String packageName, String identiy); protected native void nativeShowMPRIS(String packageName, String identiy);
protected native void nativeCancel(int id); protected native void nativeCancel(int id);
protected native void nativeCancelMPRIS(); protected native void nativeCancelMPRIS();
public void createNotificationChannelGroup(NotificationChannelGroup v) {}
public List<NotificationChannel> getNotificationChannels() {
return Collections.emptyList();
}
public List<NotificationChannelGroup> getNotificationChannelGroups() {
return Collections.emptyList();
}
} }

View file

@ -3,6 +3,9 @@ package android.app.job;
import android.content.ComponentName; import android.content.ComponentName;
public class JobInfo { public class JobInfo {
public JobInfo() {}
public static final class Builder { public static final class Builder {
public Builder(int jobId, ComponentName jobService) {} public Builder(int jobId, ComponentName jobService) {}
@ -13,5 +16,13 @@ public class JobInfo {
public Builder setRequiredNetworkType(int networkType) { public Builder setRequiredNetworkType(int networkType) {
return this; return this;
} }
public Builder setOverrideDeadline(long a) {
return this;
}
public JobInfo build() {
return new JobInfo();
}
} }
} }

View file

@ -13,4 +13,8 @@ public class JobScheduler {
public List<JobInfo> getAllPendingJobs() { public List<JobInfo> getAllPendingJobs() {
return new ArrayList<JobInfo>(); return new ArrayList<JobInfo>();
}; };
public int enqueue(JobInfo job, JobWorkItem work) {
return 1; //RESULT_SUCCESS
}
} }

View file

@ -0,0 +1,9 @@
package android.app.job;
import android.content.Intent;
final public class JobWorkItem {
public JobWorkItem(Intent intent) {
}
}

View file

@ -15,6 +15,7 @@ import android.bluetooth.BluetoothManager;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.PackageParser; import android.content.pm.PackageParser;
import android.content.pm.ShortcutManager;
import android.content.res.AssetManager; import android.content.res.AssetManager;
import android.content.res.Configuration; import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
@ -39,6 +40,7 @@ import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.UserManager;
import android.os.Vibrator; import android.os.Vibrator;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.util.AttributeSet; import android.util.AttributeSet;
@ -386,6 +388,10 @@ public class Context extends Object {
return prefs_dir; return prefs_dir;
} }
public File[] getExternalMediaDirs() {
return getExternalFilesDirs("media");
}
public File getDir(String name, int mode) { public File getDir(String name, int mode) {
File dir = new File(getFilesDir(), name); File dir = new File(getFilesDir(), name);
if (!dir.exists()) { if (!dir.exists()) {
@ -656,4 +662,11 @@ public class Context extends Object {
public void revokeUriPermission(Uri uri, int mode) { public void revokeUriPermission(Uri uri, int mode) {
System.out.println("revokeUriPermission(" + uri + ", " + mode + ") called"); System.out.println("revokeUriPermission(" + uri + ", " + mode + ") called");
} }
public String getAttributionTag() {
return null;
}
public boolean isDeviceProtectedStorage() {
return false;
}
} }

View file

@ -364,4 +364,8 @@ public class Intent implements Parcelable {
public byte[] getByteArrayExtra(String name) { public byte[] getByteArrayExtra(String name) {
return extras.getByteArray(name); return extras.getByteArray(name);
} }
public void removeExtra(String name) {
extras.remove(name);
}
} }

View file

@ -243,4 +243,10 @@ public class PackageInfo {
public int describeContents() { public int describeContents() {
return 0; return 0;
} }
public long getLongVersionCode() {
return versionCode;
}
public SigningInfo signingInfo = new SigningInfo();
} }

View file

@ -0,0 +1,15 @@
package android.content.pm;
import java.util.Collections;
import java.util.List;
public class ShortcutManager {
public void removeAllDynamicShortcuts() {
}
public List getShortcuts(int matchFlags) {
return Collections.emptyList();
}
public void removeLongLivedShortcuts(List<String> shortcutIds) {
}
}

View file

@ -0,0 +1,7 @@
package android.content.pm;
public final class SigningInfo {
public Signature[] getApkContentsSigners() {
return null;
}
}

View file

@ -1471,6 +1471,8 @@ public class Resources {
} }
private final AssetManager mAssets; private final AssetManager mAssets;
public void rebase() {}
} }
/** /**

View file

@ -0,0 +1,18 @@
package android.graphics.drawable;
import android.graphics.Canvas;
public class ColorStateListDrawable extends Drawable implements Drawable.Callback {
@Override
public void draw(Canvas c) {
}
@Override
public void unscheduleDrawable(Drawable who, Runnable what) {
}
@Override
public void scheduleDrawable(Drawable who, Runnable what, long when) {
}
@Override
public void invalidateDrawable(Drawable who) {
}
}

View file

@ -1,6 +1,6 @@
package android.net; package android.net;
class Network {} import android.os.Handler;
public class ConnectivityManager { public class ConnectivityManager {
@ -26,4 +26,11 @@ public class ConnectivityManager {
public NetworkInfo[] getAllNetworkInfo() { public NetworkInfo[] getAllNetworkInfo() {
return new NetworkInfo[] { getActiveNetworkInfo() }; return new NetworkInfo[] { getActiveNetworkInfo() };
} }
public Network getActiveNetwork() {
return new Network();
}
public void registerDefaultNetworkCallback(NetworkCallback cb, Handler hdl) {}
} }

View file

@ -0,0 +1,8 @@
package android.net;
public class Network {
public long getNetworkHandle() {
return 1L;
}
}

View file

@ -795,4 +795,8 @@ public class Environment {
// Unable to translate to internal path; use original // Unable to translate to internal path; use original
return path; return path;
} }
public static boolean isExternalStorageLegacy() {
return true;
}
} }

View file

@ -230,6 +230,10 @@ public class Handler {
mAsynchronous = async; mAsynchronous = async;
} }
public static Handler createAsync(Looper looper) {
return new Handler(looper, null, true);
}
/** /**
* Returns a string representing the name of the specified message. * Returns a string representing the name of the specified message.
* The default implementation will either return the class name of the * The default implementation will either return the class name of the

View file

@ -830,4 +830,6 @@ public class Process {
*/ */
public boolean usingWrapper; public boolean usingWrapper;
} }
public static final native boolean is64Bit();
} }

View file

@ -76,6 +76,9 @@ public final class StrictMode {
public ThreadPolicy build() { public ThreadPolicy build() {
return new ThreadPolicy(mask, listener, executor); return new ThreadPolicy(mask, listener, executor);
} }
public Builder detectUnbufferedIo() {
return this;
}
} }
} }
public static final class VmPolicy { public static final class VmPolicy {

View file

@ -0,0 +1,13 @@
package android.os;
public class SystemProperties {
public static String get(String prop) {
android.util.Log.i("SystemProperties", "Grabbing prop " + prop);
return null;
}
public boolean getBoolean(String prop, boolean def) {
android.util.Log.i("SystemProperties", "Grabbing prop " + prop + ", default " + def);
return def;
}
}

View file

@ -4,4 +4,7 @@ public class UserManager {
public boolean isUserUnlocked() { public boolean isUserUnlocked() {
return true; return true;
} }
public static boolean supportsMultipleUsers() {
return false;
}
} }

View file

@ -0,0 +1,7 @@
package android.os.ext;
public class SdkExtensions {
public static int getExtensionVersion(int extension) {
return 0;
}
}

View file

@ -0,0 +1,6 @@
package android.telecom;
import android.app.Service;
public abstract class ConnectionService extends Service {
}

View file

@ -2100,4 +2100,16 @@ public class View implements Drawable.Callback {
public int getVerticalFadingEdgeLength() {return 0;} public int getVerticalFadingEdgeLength() {return 0;}
public int getVerticalScrollbarWidth() {return 0;} public int getVerticalScrollbarWidth() {return 0;}
public void saveAttributeDataForStyleable(Context ctxt, int[] styleable, AttributeSet attrs, TypedArray t, int defStyleAttr, int defStyleRes) {}
public final View requireViewById(int id) {
View view = findViewById(id);
if (view == null)
throw new IllegalArgumentException("ID does not reference a View inside this View");
return view;
}
public float getTransitionAlpha() {
return 1.0f;
}
} }

View file

@ -70,4 +70,8 @@ public class ViewConfiguration {
public static int getScrollDefaultDelay() { public static int getScrollDefaultDelay() {
return 16; return 16;
} }
public boolean shouldShowMenuShortcutsWhenKeyboardPresent() {
return true;
}
} }

View file

@ -356,4 +356,14 @@ public class TextView extends View {
public int getLineHeight() { public int getLineHeight() {
return 10; // FIXME return 10; // FIXME
} }
public boolean isAllCaps() { return false; }
public int getAutoSizeStepGranularity() {
return -1;
}
public void setAutoSizeTextTypeUniformWithPresetSizes(int[] presetSizes, int unit) {}
public void setCompoundDrawableTintList(ColorStateList tint) {}
} }

View file

@ -30,6 +30,7 @@ srcs = [
'android/app/DatePickerDialog.java', 'android/app/DatePickerDialog.java',
'android/app/Application.java', 'android/app/Application.java',
'android/app/ApplicationErrorReport.java', 'android/app/ApplicationErrorReport.java',
'android/app/ApplicationExitInfo.java',
'android/app/Dialog.java', 'android/app/Dialog.java',
'android/app/DownloadManager.java', 'android/app/DownloadManager.java',
'android/app/Fragment.java', 'android/app/Fragment.java',
@ -42,6 +43,7 @@ srcs = [
'android/app/NativeActivity.java', 'android/app/NativeActivity.java',
'android/app/Notification.java', 'android/app/Notification.java',
'android/app/NotificationChannel.java', 'android/app/NotificationChannel.java',
'android/app/NotificationChannelGroup.java',
'android/app/NotificationManager.java', 'android/app/NotificationManager.java',
'android/app/PendingIntent.java', 'android/app/PendingIntent.java',
'android/app/ProgressDialog.java', 'android/app/ProgressDialog.java',
@ -56,6 +58,7 @@ srcs = [
'android/app/job/JobInfo.java', 'android/app/job/JobInfo.java',
'android/app/job/JobScheduler.java', 'android/app/job/JobScheduler.java',
'android/app/job/JobService.java', 'android/app/job/JobService.java',
'android/app/job/JobWorkItem.java',
'android/app/usage/UsageStatsManager.java', 'android/app/usage/UsageStatsManager.java',
'android/appwidget/AppWidgetManager.java', 'android/appwidget/AppWidgetManager.java',
'android/appwidget/AppWidgetProvider.java', 'android/appwidget/AppWidgetProvider.java',
@ -106,6 +109,8 @@ srcs = [
'android/content/pm/ResolveInfo.java', 'android/content/pm/ResolveInfo.java',
'android/content/pm/ServiceInfo.java', 'android/content/pm/ServiceInfo.java',
'android/content/pm/Signature.java', 'android/content/pm/Signature.java',
'android/content/pm/SigningInfo.java',
'android/content/pm/ShortcutManager.java',
'android/content/pm/VerifierInfo.java', 'android/content/pm/VerifierInfo.java',
'android/content/res/AssetFileDescriptor.java', 'android/content/res/AssetFileDescriptor.java',
'android/content/res/AssetManager.java', 'android/content/res/AssetManager.java',
@ -209,6 +214,7 @@ srcs = [
'android/graphics/drawable/AnimationDrawable.java', 'android/graphics/drawable/AnimationDrawable.java',
'android/graphics/drawable/BitmapDrawable.java', 'android/graphics/drawable/BitmapDrawable.java',
'android/graphics/drawable/ColorDrawable.java', 'android/graphics/drawable/ColorDrawable.java',
'android/graphics/drawable/ColorStateListDrawable.java',
'android/graphics/drawable/Drawable.java', 'android/graphics/drawable/Drawable.java',
'android/graphics/drawable/DrawableContainer.java', 'android/graphics/drawable/DrawableContainer.java',
'android/graphics/drawable/DrawableWrapper.java', 'android/graphics/drawable/DrawableWrapper.java',
@ -261,6 +267,7 @@ srcs = [
'android/media/session/PlaybackState.java', 'android/media/session/PlaybackState.java',
'android/media/tv/TvInputManager.java', 'android/media/tv/TvInputManager.java',
'android/net/ConnectivityManager.java', 'android/net/ConnectivityManager.java',
'android/net/Network.java',
'android/net/NetworkInfo.java', 'android/net/NetworkInfo.java',
'android/net/NetworkRequest.java', 'android/net/NetworkRequest.java',
'android/net/SSLCertificateSocketFactory.java', 'android/net/SSLCertificateSocketFactory.java',
@ -320,11 +327,13 @@ srcs = [
'android/os/StatFs.java', 'android/os/StatFs.java',
'android/os/StrictMode.java', 'android/os/StrictMode.java',
'android/os/SystemClock.java', 'android/os/SystemClock.java',
'android/os/SystemProperties.java',
'android/os/Trace.java', 'android/os/Trace.java',
'android/os/UserHandle.java', 'android/os/UserHandle.java',
'android/os/UserManager.java', 'android/os/UserManager.java',
'android/os/VibrationEffect.java', 'android/os/VibrationEffect.java',
'android/os/Vibrator.java', 'android/os/Vibrator.java',
'android/os/ext/SdkExtensions.java',
'android/os/storage/StorageManager.java', 'android/os/storage/StorageManager.java',
'android/preference/PreferenceActivity.java', 'android/preference/PreferenceActivity.java',
'android/preference/PreferenceManager.java', 'android/preference/PreferenceManager.java',
@ -333,6 +342,7 @@ srcs = [
'android/provider/CalendarContract.java', 'android/provider/CalendarContract.java',
'android/provider/ContactsContract.java', 'android/provider/ContactsContract.java',
'android/provider/Settings.java', 'android/provider/Settings.java',
'android/telecom/ConnectionService.java',
'android/telecom/TelecomManager.java', 'android/telecom/TelecomManager.java',
'android/telephony/CellLocation.java', 'android/telephony/CellLocation.java',
'android/telephony/PhoneNumberUtils.java', 'android/telephony/PhoneNumberUtils.java',