You've already forked android_translation_layer
mirror of
https://gitlab.com/android_translation_layer/android_translation_layer.git
synced 2025-10-27 11:48:10 -07:00
API stubs and fixes for composeUI
This commit is contained in:
@@ -85,6 +85,9 @@ JNIEXPORT void JNICALL Java_android_graphics_GskCanvas_native_1restore(JNIEnv *e
|
|||||||
|
|
||||||
JNIEXPORT void JNICALL Java_android_graphics_GskCanvas_native_1drawLine(JNIEnv *env, jclass this_class, jlong snapshot_ptr, jfloat x0, jfloat y0, jfloat x1, jfloat y1, jlong paint_ptr)
|
JNIEXPORT void JNICALL Java_android_graphics_GskCanvas_native_1drawLine(JNIEnv *env, jclass this_class, jlong snapshot_ptr, jfloat x0, jfloat y0, jfloat x1, jfloat y1, jlong paint_ptr)
|
||||||
{
|
{
|
||||||
|
if (isnan(x0) || isnan(y0) || isnan(x1) || isnan(y1)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
GdkSnapshot *snapshot = GTK_SNAPSHOT(_PTR(snapshot_ptr));
|
GdkSnapshot *snapshot = GTK_SNAPSHOT(_PTR(snapshot_ptr));
|
||||||
sk_paint_t *paint = (sk_paint_t *)_PTR(paint_ptr);
|
sk_paint_t *paint = (sk_paint_t *)_PTR(paint_ptr);
|
||||||
GdkRGBA gdk_color;
|
GdkRGBA gdk_color;
|
||||||
|
|||||||
@@ -119,6 +119,7 @@ void set_up_handle_cache(JNIEnv *env)
|
|||||||
if((*env)->ExceptionCheck(env))
|
if((*env)->ExceptionCheck(env))
|
||||||
(*env)->ExceptionDescribe(env);
|
(*env)->ExceptionDescribe(env);
|
||||||
handle_cache.view.onDraw = _METHOD(handle_cache.view.class, "onDraw", "(Landroid/graphics/Canvas;)V");
|
handle_cache.view.onDraw = _METHOD(handle_cache.view.class, "onDraw", "(Landroid/graphics/Canvas;)V");
|
||||||
|
handle_cache.view.dispatchDraw = _METHOD(handle_cache.view.class, "dispatchDraw", "(Landroid/graphics/Canvas;)V");
|
||||||
handle_cache.view.draw = _METHOD(handle_cache.view.class, "draw", "(Landroid/graphics/Canvas;)V");
|
handle_cache.view.draw = _METHOD(handle_cache.view.class, "draw", "(Landroid/graphics/Canvas;)V");
|
||||||
handle_cache.view.onMeasure = _METHOD(handle_cache.view.class, "onMeasure", "(II)V");
|
handle_cache.view.onMeasure = _METHOD(handle_cache.view.class, "onMeasure", "(II)V");
|
||||||
handle_cache.view.onLayout = _METHOD(handle_cache.view.class, "onLayout", "(ZIIII)V");
|
handle_cache.view.onLayout = _METHOD(handle_cache.view.class, "onLayout", "(ZIIII)V");
|
||||||
@@ -133,6 +134,7 @@ void set_up_handle_cache(JNIEnv *env)
|
|||||||
handle_cache.view.getScrollY = _METHOD(handle_cache.view.class, "getScrollY", "()I");
|
handle_cache.view.getScrollY = _METHOD(handle_cache.view.class, "getScrollY", "()I");
|
||||||
handle_cache.view.performClick = _METHOD(handle_cache.view.class, "performClick", "()Z");
|
handle_cache.view.performClick = _METHOD(handle_cache.view.class, "performClick", "()Z");
|
||||||
handle_cache.view.onTouchEvent = _METHOD(handle_cache.view.class, "onTouchEvent", "(Landroid/view/MotionEvent;)Z");
|
handle_cache.view.onTouchEvent = _METHOD(handle_cache.view.class, "onTouchEvent", "(Landroid/view/MotionEvent;)Z");
|
||||||
|
handle_cache.view.dispatchTouchEvent = _METHOD(handle_cache.view.class, "dispatchTouchEvent", "(Landroid/view/MotionEvent;)Z");
|
||||||
handle_cache.view.onInterceptTouchEvent = _METHOD(handle_cache.view.class, "onInterceptTouchEvent", "(Landroid/view/MotionEvent;)Z");
|
handle_cache.view.onInterceptTouchEvent = _METHOD(handle_cache.view.class, "onInterceptTouchEvent", "(Landroid/view/MotionEvent;)Z");
|
||||||
handle_cache.view.layoutInternal = _METHOD(handle_cache.view.class, "layoutInternal", "(II)V");
|
handle_cache.view.layoutInternal = _METHOD(handle_cache.view.class, "layoutInternal", "(II)V");
|
||||||
handle_cache.view.measure = _METHOD(handle_cache.view.class, "measure", "(II)V");
|
handle_cache.view.measure = _METHOD(handle_cache.view.class, "measure", "(II)V");
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ struct handle_cache {
|
|||||||
jclass class;
|
jclass class;
|
||||||
jmethodID setLayoutParams;
|
jmethodID setLayoutParams;
|
||||||
jmethodID onDraw;
|
jmethodID onDraw;
|
||||||
|
jmethodID dispatchDraw;
|
||||||
jmethodID draw;
|
jmethodID draw;
|
||||||
jmethodID onMeasure;
|
jmethodID onMeasure;
|
||||||
jmethodID onLayout;
|
jmethodID onLayout;
|
||||||
@@ -79,6 +80,7 @@ struct handle_cache {
|
|||||||
jmethodID getScrollY;
|
jmethodID getScrollY;
|
||||||
jmethodID performClick;
|
jmethodID performClick;
|
||||||
jmethodID onTouchEvent;
|
jmethodID onTouchEvent;
|
||||||
|
jmethodID dispatchTouchEvent;
|
||||||
jmethodID onInterceptTouchEvent;
|
jmethodID onInterceptTouchEvent;
|
||||||
jmethodID layoutInternal;
|
jmethodID layoutInternal;
|
||||||
jmethodID measure;
|
jmethodID measure;
|
||||||
|
|||||||
@@ -279,8 +279,9 @@ void wrapper_widget_set_jobject(WrapperWidget *wrapper, JNIEnv *env, jobject job
|
|||||||
wrapper->jvm = jvm;
|
wrapper->jvm = jvm;
|
||||||
wrapper->jobj = _WEAK_REF(jobj);
|
wrapper->jobj = _WEAK_REF(jobj);
|
||||||
jmethodID on_draw_method = _METHOD(_CLASS(jobj), "onDraw", "(Landroid/graphics/Canvas;)V");
|
jmethodID on_draw_method = _METHOD(_CLASS(jobj), "onDraw", "(Landroid/graphics/Canvas;)V");
|
||||||
|
jmethodID dispatch_draw_method = _METHOD(_CLASS(jobj), "dispatchDraw", "(Landroid/graphics/Canvas;)V");
|
||||||
jmethodID draw_method = _METHOD(_CLASS(jobj), "draw", "(Landroid/graphics/Canvas;)V");
|
jmethodID draw_method = _METHOD(_CLASS(jobj), "draw", "(Landroid/graphics/Canvas;)V");
|
||||||
if (on_draw_method != handle_cache.view.onDraw || draw_method != handle_cache.view.draw) {
|
if (on_draw_method != handle_cache.view.onDraw || draw_method != handle_cache.view.draw || dispatch_draw_method != handle_cache.view.dispatchDraw) {
|
||||||
wrapper->draw_method = draw_method;
|
wrapper->draw_method = draw_method;
|
||||||
jclass canvas_class = (*env)->FindClass(env, "android/graphics/GskCanvas");
|
jclass canvas_class = (*env)->FindClass(env, "android/graphics/GskCanvas");
|
||||||
jmethodID canvas_constructor = _METHOD(canvas_class, "<init>", "(J)V");
|
jmethodID canvas_constructor = _METHOD(canvas_class, "<init>", "(J)V");
|
||||||
@@ -289,7 +290,8 @@ void wrapper_widget_set_jobject(WrapperWidget *wrapper, JNIEnv *env, jobject job
|
|||||||
}
|
}
|
||||||
|
|
||||||
jmethodID ontouchevent_method = _METHOD(_CLASS(jobj), "onTouchEvent", "(Landroid/view/MotionEvent;)Z");
|
jmethodID ontouchevent_method = _METHOD(_CLASS(jobj), "onTouchEvent", "(Landroid/view/MotionEvent;)Z");
|
||||||
if (ontouchevent_method != handle_cache.view.onTouchEvent) {
|
jmethodID dispatchtouchevent_method = _METHOD(_CLASS(jobj), "dispatchTouchEvent", "(Landroid/view/MotionEvent;)Z");
|
||||||
|
if (ontouchevent_method != handle_cache.view.onTouchEvent || dispatchtouchevent_method != handle_cache.view.dispatchTouchEvent) {
|
||||||
_setOnTouchListener(env, jobj, GTK_WIDGET(wrapper));
|
_setOnTouchListener(env, jobj, GTK_WIDGET(wrapper));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -478,6 +478,8 @@ public class Context extends Object {
|
|||||||
|
|
||||||
public void registerComponentCallbacks(ComponentCallbacks callbacks) {}
|
public void registerComponentCallbacks(ComponentCallbacks callbacks) {}
|
||||||
|
|
||||||
|
public void unregisterComponentCallbacks(ComponentCallbacks callbacks) {}
|
||||||
|
|
||||||
public boolean bindService(final Intent intent, final ServiceConnection serviceConnection, int dummy3) {
|
public boolean bindService(final Intent intent, final ServiceConnection serviceConnection, int dummy3) {
|
||||||
if (intent.getComponent() == null) {
|
if (intent.getComponent() == null) {
|
||||||
Slog.w(TAG, "Context.bindService: intent.getComponent() is null");
|
Slog.w(TAG, "Context.bindService: intent.getComponent() is null");
|
||||||
|
|||||||
@@ -16,6 +16,12 @@
|
|||||||
|
|
||||||
package android.content.pm;
|
package android.content.pm;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import android.annotation.SdkConstant;
|
import android.annotation.SdkConstant;
|
||||||
import android.annotation.SdkConstant.SdkConstantType;
|
import android.annotation.SdkConstant.SdkConstantType;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
@@ -23,6 +29,8 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.content.IntentSender;
|
import android.content.IntentSender;
|
||||||
|
import android.content.pm.PackageParser.Service;
|
||||||
|
import android.content.pm.PackageParser.ServiceIntentInfo;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.content.res.XmlResourceParser;
|
import android.content.res.XmlResourceParser;
|
||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
@@ -32,11 +40,6 @@ import android.os.UserHandle;
|
|||||||
import android.util.AndroidException;
|
import android.util.AndroidException;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
import java.io.File;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
class IPackageInstallObserver {}
|
class IPackageInstallObserver {}
|
||||||
class VerificationParams {}
|
class VerificationParams {}
|
||||||
@@ -2321,7 +2324,17 @@ public class PackageManager {
|
|||||||
*/
|
*/
|
||||||
public List<ResolveInfo> queryIntentServices(Intent intent,
|
public List<ResolveInfo> queryIntentServices(Intent intent,
|
||||||
int flags) {
|
int flags) {
|
||||||
return new ArrayList<ResolveInfo>();
|
List<ResolveInfo> list = new ArrayList<ResolveInfo>(1);
|
||||||
|
for (Service s: Context.pkg.services) {
|
||||||
|
for (ServiceIntentInfo intentinfo: s.intents) {
|
||||||
|
if (s.getComponentName().equals(intent.getComponent()) || intentinfo.matchAction(intent.getAction())) {
|
||||||
|
ResolveInfo ri = new ResolveInfo();
|
||||||
|
ri.serviceInfo = s.info;
|
||||||
|
list.add(ri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -3031,7 +3031,20 @@ public class PackageParser {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parser.getName().equals("meta-data")) {
|
if (parser.getName().equals("intent-filter")) {
|
||||||
|
ServiceIntentInfo intent = new ServiceIntentInfo(s);
|
||||||
|
if (!parseIntent(res, parser, attrs, true /*allowGlobs*/, true /*allowAutoVerify*/,
|
||||||
|
intent, outError)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (intent.countActions() == 0) {
|
||||||
|
Slog.w(TAG, "No actions in intent filter at "
|
||||||
|
+ mArchiveSourcePath + " "
|
||||||
|
+ parser.getPositionDescription());
|
||||||
|
} else {
|
||||||
|
s.intents.add(intent);
|
||||||
|
}
|
||||||
|
} else if (parser.getName().equals("meta-data")) {
|
||||||
if ((s.metaData = parseMetaData(res, parser, attrs, s.metaData,
|
if ((s.metaData = parseMetaData(res, parser, attrs, s.metaData,
|
||||||
outError)) == null) {
|
outError)) == null) {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package android.content.pm;
|
|||||||
|
|
||||||
public class ResolveInfo {
|
public class ResolveInfo {
|
||||||
public ActivityInfo activityInfo = new ActivityInfo();
|
public ActivityInfo activityInfo = new ActivityInfo();
|
||||||
|
public ServiceInfo serviceInfo = new ServiceInfo();
|
||||||
|
|
||||||
public static class DisplayNameComparator {
|
public static class DisplayNameComparator {
|
||||||
|
|
||||||
|
|||||||
@@ -470,6 +470,27 @@ public class Canvas {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean clipRect(float left, float top, float right, float bottom) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isHardwareAccelerated() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean clipRect(float left, float top, float right, float bottom, Region.Op op) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean includeCenter, Paint paint) {}
|
||||||
|
|
||||||
|
public void drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint) {}
|
||||||
|
|
||||||
|
public boolean getClipBounds(Rect outRect) {
|
||||||
|
outRect.set(0, 0, 100, 100);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private static native long native_canvas_from_bitmap(long pixbuf);
|
private static native long native_canvas_from_bitmap(long pixbuf);
|
||||||
|
|
||||||
private static native void native_save(long skia_canvas, long widget);
|
private static native void native_save(long skia_canvas, long widget);
|
||||||
|
|||||||
10
src/api-impl/android/graphics/Outline.java
Normal file
10
src/api-impl/android/graphics/Outline.java
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package android.graphics;
|
||||||
|
|
||||||
|
public class Outline {
|
||||||
|
|
||||||
|
public void setAlpha(float alpha) {}
|
||||||
|
|
||||||
|
public void setEmpty() {}
|
||||||
|
|
||||||
|
public void setRoundRect(int left, int top, int right, int bottom, float r) {}
|
||||||
|
}
|
||||||
@@ -284,6 +284,12 @@ public class Paint {
|
|||||||
|
|
||||||
public void set(Paint paint) {}
|
public void set(Paint paint) {}
|
||||||
|
|
||||||
|
public boolean isFilterBitmap() { return false; }
|
||||||
|
|
||||||
|
public Cap getStrokeCap() { return Cap.BUTT; }
|
||||||
|
|
||||||
|
public Join getStrokeJoin() { return Join.MITER; }
|
||||||
|
|
||||||
private native long native_constructor();
|
private native long native_constructor();
|
||||||
private native void native_set_antialias(long skia_paint, boolean aa);
|
private native void native_set_antialias(long skia_paint, boolean aa);
|
||||||
private native void native_set_color(long skia_paint, int color);
|
private native void native_set_color(long skia_paint, int color);
|
||||||
|
|||||||
@@ -59,4 +59,8 @@ public class Typeface {
|
|||||||
public int getStyle() {
|
public int getStyle() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Typeface defaultFromStyle(int style) {
|
||||||
|
return create((String)null, style);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -299,6 +299,8 @@ public class Drawable {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setHotspot(float x, float y) {}
|
||||||
|
|
||||||
protected static native long native_paintable_from_path(String path);
|
protected static native long native_paintable_from_path(String path);
|
||||||
protected native long native_constructor();
|
protected native long native_constructor();
|
||||||
protected native void native_invalidate(long paintable);
|
protected native void native_invalidate(long paintable);
|
||||||
|
|||||||
@@ -8,4 +8,6 @@ public class RippleDrawable extends LayerDrawable {
|
|||||||
super(drawable == null ? new Drawable[] {} : new Drawable[] {drawable});
|
super(drawable == null ? new Drawable[] {} : new Drawable[] {drawable});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setColor(ColorStateList colorStateList) {}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,14 @@ public class AudioAttributes {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder setFlags(int flags) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder setLegacyStreamType(int legacy_stream_type) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public AudioAttributes build() {
|
public AudioAttributes build() {
|
||||||
return new AudioAttributes();
|
return new AudioAttributes();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,4 +10,8 @@ public class MediaController {
|
|||||||
public MediaMetadata getMetadata() {
|
public MediaMetadata getMetadata() {
|
||||||
return new MediaMetadata();
|
return new MediaMetadata();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public CharSequence getQueueTitle() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.media.AudioAttributes;
|
||||||
import android.media.MediaDescription;
|
import android.media.MediaDescription;
|
||||||
import android.media.MediaMetadata;
|
import android.media.MediaMetadata;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@@ -54,7 +55,7 @@ public class MediaSession {
|
|||||||
if (item.id == state.activeQueueItemId) {
|
if (item.id == state.activeQueueItemId) {
|
||||||
title = item.description.title.toString();
|
title = item.description.title.toString();
|
||||||
subTitle = item.description.subtitle.toString();
|
subTitle = item.description.subtitle.toString();
|
||||||
artUrl = item.description.iconUri.toString();
|
artUrl = item.description.iconUri == null ? null : item.description.iconUri.toString();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -69,6 +70,8 @@ public class MediaSession {
|
|||||||
|
|
||||||
public void release() {}
|
public void release() {}
|
||||||
|
|
||||||
|
public void setPlaybackToLocal(AudioAttributes audioAttributes) {}
|
||||||
|
|
||||||
protected native void nativeSetState(int state, long actions, long position, long updateTime, String title, String subTitle, String artUrl);
|
protected native void nativeSetState(int state, long actions, long position, long updateTime, String title, String subTitle, String artUrl);
|
||||||
protected native void nativeSetCallback(Callback callback);
|
protected native void nativeSetCallback(Callback callback);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package android.os;
|
package android.os;
|
||||||
|
|
||||||
public class Binder extends IBinder {
|
public class Binder implements IBinder {
|
||||||
|
|
||||||
public void attachInterface(IInterface owner, String descriptor) {}
|
public void attachInterface(IInterface owner, String descriptor) {}
|
||||||
|
|
||||||
@@ -9,4 +9,10 @@ public class Binder extends IBinder {
|
|||||||
public static long clearCallingIdentity() { return 0; }
|
public static long clearCallingIdentity() { return 0; }
|
||||||
|
|
||||||
public static void restoreCallingIdentity(long identityToken) {}
|
public static void restoreCallingIdentity(long identityToken) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IInterface queryLocalInterface(String descriptor) { return null; }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean transact(int code, Parcel data, Parcel reply, int flags) { return false; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
package android.os;
|
package android.os;
|
||||||
|
|
||||||
public class IBinder {
|
public interface IBinder {
|
||||||
|
|
||||||
public interface DeathRecipient {}
|
public interface DeathRecipient {}
|
||||||
|
|
||||||
|
public IInterface queryLocalInterface(String descriptor);
|
||||||
|
|
||||||
|
public boolean transact(int code, Parcel data, Parcel reply, int flags);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,4 +43,16 @@ public class Parcel {
|
|||||||
public void writeParcelable(Parcelable p, int flags) {
|
public void writeParcelable(Parcelable p, int flags) {
|
||||||
System.out.println("Parcel.writeParcelable(" + p + ", " + flags + ")");
|
System.out.println("Parcel.writeParcelable(" + p + ", " + flags + ")");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void writeInterfaceToken(String s) {
|
||||||
|
System.out.println("Parcel.writeInterfaceToken(" + s + ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writeStrongInterface(IInterface i) {
|
||||||
|
System.out.println("Parcel.writeStrongInterface(" + i + ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
public int dataSize() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user