api-impl: add some methods to make the WhatsApp video player functional

This commit is contained in:
Julian Winkler
2025-10-18 21:18:19 +02:00
parent 72e86cba13
commit 82477865ad
14 changed files with 116 additions and 5 deletions

View File

@@ -6,6 +6,7 @@ import java.util.Map;
import android.content.pm.PackageParser; import android.content.pm.PackageParser;
import android.content.pm.ProviderInfo; import android.content.pm.ProviderInfo;
import android.content.res.AssetFileDescriptor;
import android.database.Cursor; import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
@@ -55,6 +56,8 @@ public abstract class ContentProvider {
public abstract ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException; public abstract ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException;
public abstract AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException;
public void attachInfo(Context context, ProviderInfo provider) {} public void attachInfo(Context context, ProviderInfo provider) {}
} }

View File

@@ -4,6 +4,7 @@ import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import android.accounts.Account; import android.accounts.Account;
import android.content.res.AssetFileDescriptor;
import android.database.ContentObserver; import android.database.ContentObserver;
import android.database.Cursor; import android.database.Cursor;
import android.database.MatrixCursor; import android.database.MatrixCursor;
@@ -39,6 +40,18 @@ public class ContentResolver {
} }
} }
public AssetFileDescriptor openAssetFileDescriptor(Uri uri, String mode) throws FileNotFoundException {
if ("file".equals(uri.getScheme())) {
return new AssetFileDescriptor(ParcelFileDescriptor.open(new File(uri.getPath()), ParcelFileDescriptor.parseMode(mode)), 0, AssetFileDescriptor.UNKNOWN_LENGTH);
} else {
ContentProvider provider = ContentProvider.providers.get(uri.getAuthority());
if (provider != null)
return provider.openAssetFile(uri, mode);
else
return null;
}
}
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
ContentProvider provider = ContentProvider.providers.get(uri.getAuthority()); ContentProvider provider = ContentProvider.providers.get(uri.getAuthority());
if (provider != null) { if (provider != null) {

View File

@@ -54,6 +54,7 @@ import android.view.Display;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.WindowManagerImpl; import android.view.WindowManagerImpl;
import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.CaptioningManager;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
@@ -257,6 +258,8 @@ public class Context extends Object {
return new AppOpsManager(); return new AppOpsManager();
case "user": case "user":
return new UserManager(); return new UserManager();
case "captioning":
return new CaptioningManager();
default: default:
Slog.e(TAG, "!!!!!!! getSystemService: case >" + name + "< is not implemented yet"); Slog.e(TAG, "!!!!!!! getSystemService: case >" + name + "< is not implemented yet");
return null; return null;

View File

@@ -424,4 +424,8 @@ public class Intent implements Parcelable {
&& Objects.equals(this.data, other.data) && Objects.equals(this.data, other.data)
&& Objects.equals(this.type, other.type); && Objects.equals(this.type, other.type);
} }
public long[] getLongArrayExtra(String name) {
return extras.getLongArray(name);
}
} }

View File

@@ -20,4 +20,8 @@ public class PathMeasure {
public boolean getPosTan(float distance, float[] pos, float[] tan) { public boolean getPosTan(float distance, float[] pos, float[] tan) {
return false; return false;
} }
public boolean nextContour() {
return false;
}
} }

View File

@@ -13,6 +13,8 @@ public final class DisplayManager {
public void registerDisplayListener(DisplayListener listener, Handler handler) { public void registerDisplayListener(DisplayListener listener, Handler handler) {
} }
public void unregisterDisplayListener(DisplayListener listener) {}
public Display[] getDisplays() { public Display[] getDisplays() {
return new Display[0]; return new Display[0];
} }

View File

@@ -78,10 +78,18 @@ public class MediaCodec {
return inputBuffers; return inputBuffers;
} }
public ByteBuffer getInputBuffer(int index) {
return inputBuffers[index];
}
public ByteBuffer[] getOutputBuffers() { public ByteBuffer[] getOutputBuffers() {
return outputBuffers; return outputBuffers;
} }
public ByteBuffer getOutputBuffer(int index) {
return outputBuffers[index];
}
public int dequeueOutputBuffer(BufferInfo info, long timeoutUs) { public int dequeueOutputBuffer(BufferInfo info, long timeoutUs) {
if (!outputFormatSet) { if (!outputFormatSet) {
outputFormatSet = true; outputFormatSet = true;
@@ -107,6 +115,11 @@ public class MediaCodec {
freeOutputBuffers.add(index); freeOutputBuffers.add(index);
} }
public void releaseOutputBuffer(int index, long presentationTimeUs) {
native_releaseOutputBuffer(native_codec, outputBuffers[index], true);
freeOutputBuffers.add(index);
}
public MediaFormat getOutputFormat() { public MediaFormat getOutputFormat() {
return mediaFormat; return mediaFormat;
} }
@@ -155,6 +168,8 @@ public class MediaCodec {
System.out.println("MediaCodec.setVideoScalingMode(" + mode + "): codecName=" + codecName); System.out.println("MediaCodec.setVideoScalingMode(" + mode + "): codecName=" + codecName);
} }
public void stop() {}
public void release() { public void release() {
System.out.println("MediaCodec.release(): codecName=" + codecName); System.out.println("MediaCodec.release(): codecName=" + codecName);
if (native_codec != 0) { if (native_codec != 0) {

View File

@@ -23,10 +23,23 @@ public class MediaCodecInfo {
} }
public CodecCapabilities getCapabilitiesForType(String type) { public CodecCapabilities getCapabilitiesForType(String type) {
return null; return new CodecCapabilities();
} }
public static class CodecCapabilities {} public static class CodecCapabilities {
public CodecProfileLevel[] profileLevels;
public boolean isFeatureSupported(String feature) {
System.out.println("CodecCapabilities.isFeatureSupported("+feature+")");
return false;
}
public boolean isFeatureRequired(String feature) {
System.out.println("CodecCapabilities.isFeatureRequired("+feature+")");
return false;
}
}
public static class CodecProfileLevel {} public static class CodecProfileLevel {}
} }

View File

@@ -2,6 +2,8 @@ package android.media;
public class MediaCodecList { public class MediaCodecList {
public MediaCodecList(int kind) {}
public static int getCodecCount() { public static int getCodecCount() {
return 6; return 6;
} }
@@ -25,4 +27,11 @@ public class MediaCodecList {
} }
} }
public MediaCodecInfo[] getCodecInfos() {
MediaCodecInfo[] infos = new MediaCodecInfo[getCodecCount()];
for (int i=0; i<infos.length; i++)
infos[i] = getCodecInfoAt(i);
return infos;
}
} }

View File

@@ -1,6 +1,7 @@
package android.media; package android.media;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri; import android.net.Uri;
public class MediaMetadataRetriever { public class MediaMetadataRetriever {
@@ -34,4 +35,12 @@ public class MediaMetadataRetriever {
return null; return null;
} }
} }
public Bitmap getFrameAtTime(long time) {
return null;
}
public Bitmap getFrameAtTime() {
return null;
}
} }

View File

@@ -5,6 +5,8 @@ import android.util.AttributeSet;
public class TextureView extends View { public class TextureView extends View {
private SurfaceTextureListener surfaceTextureListener;
public TextureView(Context context) { public TextureView(Context context) {
super(context); super(context);
} }
@@ -15,8 +17,18 @@ public class TextureView extends View {
public interface SurfaceTextureListener {} public interface SurfaceTextureListener {}
public void setSurfaceTextureListener(SurfaceTextureListener surfaceTextureListener) {} public void setSurfaceTextureListener(SurfaceTextureListener surfaceTextureListener) {
this.surfaceTextureListener = surfaceTextureListener;
}
public void setOpaque(boolean opaque) {} public void setOpaque(boolean opaque) {}
public SurfaceTextureListener getSurfaceTextureListener() {
return surfaceTextureListener;
}
public boolean isAvailable() {
return false;
}
} }

View File

@@ -4,8 +4,10 @@ import android.R;
import android.animation.StateListAnimator; import android.animation.StateListAnimator;
import android.content.Context; import android.content.Context;
import android.content.res.ColorStateList; import android.content.res.ColorStateList;
import android.content.res.Configuration;
import android.content.res.Resources; import android.content.res.Resources;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.GskCanvas; import android.graphics.GskCanvas;
import android.graphics.Matrix; import android.graphics.Matrix;
@@ -1765,6 +1767,8 @@ public class View implements Drawable.Callback {
protected void onAnimationEnd() {} protected void onAnimationEnd() {}
public void startAnimation(Animation animation) { public void startAnimation(Animation animation) {
if (animation == null)
return;
onAnimationStart(); onAnimationStart();
animation.start(); animation.start();
onAnimationEnd(); onAnimationEnd();
@@ -2211,4 +2215,16 @@ public class View implements Drawable.Callback {
public void setNextFocusDownId(int id) {} public void setNextFocusDownId(int id) {}
public void setNextFocusUpId(int id) {} public void setNextFocusUpId(int id) {}
public void setHasTransientState(boolean hasTransientState) {}
protected void onConfigurationChanged(Configuration newConfig) {}
public boolean isDrawingCacheEnabled() { return false; }
public void setDrawingCacheEnabled(boolean enabled) {}
public void buildDrawingCache(boolean autoScale) {}
public Bitmap getDrawingCache() { return null; }
} }

View File

@@ -1,4 +1,12 @@
package android.view.accessibility; package android.view.accessibility;
public class CaptioningManager { public class CaptioningManager {
public boolean isEnabled() {
return false;
}
public float getFontScale() {
return 1.0f;
}
} }

View File

@@ -407,7 +407,7 @@ public class RelativeLayout extends ViewGroup {
myWidth = DEFAULT_WIDTH; myWidth = DEFAULT_WIDTH;
} }
View[] views = mSortedHorizontalChildren; View[] views = mSortedHorizontalChildren;
int count = views.length; int count = views == null ? 0 : views.length;
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
View child = views[i]; View child = views[i];
if (child.getVisibility() != GONE) { if (child.getVisibility() != GONE) {
@@ -421,7 +421,7 @@ public class RelativeLayout extends ViewGroup {
} }
} }
views = mSortedVerticalChildren; views = mSortedVerticalChildren;
count = views.length; count = views == null ? 0 : views.length;
final int targetSdkVersion = getContext().getApplicationInfo().targetSdkVersion; final int targetSdkVersion = getContext().getApplicationInfo().targetSdkVersion;
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
final View child = views[i]; final View child = views[i];