diff --git a/src/api-impl/android/animation/ArgbEvaluator.java b/src/api-impl/android/animation/ArgbEvaluator.java index f79eda26..5983a94d 100644 --- a/src/api-impl/android/animation/ArgbEvaluator.java +++ b/src/api-impl/android/animation/ArgbEvaluator.java @@ -1,9 +1,20 @@ package android.animation; -public class ArgbEvaluator implements TypeEvaluator { +import android.graphics.Color; + +public class ArgbEvaluator implements TypeEvaluator { public static ArgbEvaluator getInstance() { return null; } + @Override + public Integer evaluate(float fraction, Integer startValue, Integer endValue) { + return Color.argb( + (int)(fraction * Color.alpha(endValue) + (1 - fraction) * Color.alpha(startValue)+.5f), + (int)(fraction * Color.red(endValue) + (1 - fraction) * Color.red(startValue)+.5f), + (int)(fraction * Color.green(endValue) + (1 - fraction) * Color.green(startValue)+.5f), + (int)(fraction * Color.blue(endValue) + (1 - fraction) * Color.blue(startValue)+.5f)); + } + } diff --git a/src/api-impl/android/animation/FloatEvaluator.java b/src/api-impl/android/animation/FloatEvaluator.java index 97cc77c8..b17d9186 100644 --- a/src/api-impl/android/animation/FloatEvaluator.java +++ b/src/api-impl/android/animation/FloatEvaluator.java @@ -19,7 +19,7 @@ package android.animation; /** * This evaluator can be used to perform type interpolation between float values. */ -public class FloatEvaluator /*implements TypeEvaluator*/ { +public class FloatEvaluator implements TypeEvaluator { /** * This function returns the result of linearly interpolating the start and end values, with diff --git a/src/api-impl/android/animation/PropertyValuesHolder.java b/src/api-impl/android/animation/PropertyValuesHolder.java index 4310c1d8..cc87f297 100644 --- a/src/api-impl/android/animation/PropertyValuesHolder.java +++ b/src/api-impl/android/animation/PropertyValuesHolder.java @@ -13,6 +13,7 @@ public class PropertyValuesHolder { private String property_name; private Method setter; Property property; + private TypeEvaluator evaluator; public static PropertyValuesHolder ofFloat(String propertyName, float... values) { PropertyValuesHolder propertyValuesHolder = new PropertyValuesHolder(); @@ -27,6 +28,7 @@ public class PropertyValuesHolder { propertyValuesHolder.values_object = values; propertyValuesHolder.property_name = propertyName; propertyValuesHolder.value = values[0]; + propertyValuesHolder.evaluator = evaluator; return propertyValuesHolder; } @@ -53,6 +55,7 @@ public class PropertyValuesHolder { propertyValuesHolder.property_name = property.getName(); propertyValuesHolder.property = property; propertyValuesHolder.value = values[0]; + propertyValuesHolder.evaluator = evaluator; return propertyValuesHolder; } @@ -97,14 +100,20 @@ public class PropertyValuesHolder { return value; } - public void setEvaluator(TypeEvaluator value) {} + public void setEvaluator(TypeEvaluator evaluator) { + this.evaluator = evaluator; + } public void calculateValue(float fraction) { if (fraction < 0f) fraction = 0f; if (fraction > 1f) fraction = 1f; - if (values_object != null) { + if (values_object != null && evaluator != null) { + int i = (int) (fraction * (values_object.length - 1)); + float f = fraction * (values_object.length - 1) - i; + value = evaluator.evaluate(f, values_object[i], values_object[i >= values_object.length - 1 ? i : i+1]); + } else if (values_object != null) { value = values_object[(int) (fraction * (values_object.length - 1) + 0.5f)]; } else if (values_float != null) { int i = (int) (fraction * (values_float.length - 1)); diff --git a/src/api-impl/android/animation/TypeEvaluator.java b/src/api-impl/android/animation/TypeEvaluator.java index f6a29330..c1537fd1 100644 --- a/src/api-impl/android/animation/TypeEvaluator.java +++ b/src/api-impl/android/animation/TypeEvaluator.java @@ -1,5 +1,7 @@ package android.animation; -public interface TypeEvaluator { +public interface TypeEvaluator { + + public T evaluate(float fraction, T startValue, T endValue); } diff --git a/src/api-impl/android/app/NotificationChannel.java b/src/api-impl/android/app/NotificationChannel.java index 7992380e..1befd1d5 100644 --- a/src/api-impl/android/app/NotificationChannel.java +++ b/src/api-impl/android/app/NotificationChannel.java @@ -19,4 +19,5 @@ public class NotificationChannel { public int getLightColor() { return 0; } public boolean shouldVibrate() { return false; } public Uri getSound() { return null; } + public void setDescription(String description) {} } diff --git a/src/api-impl/android/app/NotificationChannelGroup.java b/src/api-impl/android/app/NotificationChannelGroup.java index 92512c11..77c51df9 100644 --- a/src/api-impl/android/app/NotificationChannelGroup.java +++ b/src/api-impl/android/app/NotificationChannelGroup.java @@ -3,4 +3,6 @@ package android.app; public class NotificationChannelGroup { public NotificationChannelGroup(String a, CharSequence b) { } + + public void setDescription(String description) {} } diff --git a/src/api-impl/android/app/NotificationManager.java b/src/api-impl/android/app/NotificationManager.java index c333b391..7b49bc81 100644 --- a/src/api-impl/android/app/NotificationManager.java +++ b/src/api-impl/android/app/NotificationManager.java @@ -90,4 +90,10 @@ public class NotificationManager { public boolean areNotificationsEnabled() { return true; } + + public void deleteNotificationChannel(String channelId) {} + + public void createNotificationChannelGroups(List groups) {} + + public void createNotificationChannels(List channels) {} } diff --git a/src/api-impl/android/app/UiModeManager.java b/src/api-impl/android/app/UiModeManager.java index be664d35..3cdf2813 100644 --- a/src/api-impl/android/app/UiModeManager.java +++ b/src/api-impl/android/app/UiModeManager.java @@ -1,10 +1,15 @@ package android.app; +import android.content.Context; import android.content.res.Configuration; public class UiModeManager { public int getCurrentModeType() { - return Configuration.UI_MODE_TYPE_NORMAL; + return Context.r.getConfiguration().uiMode & Configuration.UI_MODE_TYPE_MASK; + } + + public int getNightMode() { + return Context.r.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; } } diff --git a/src/api-impl/android/content/pm/PackageManager.java b/src/api-impl/android/content/pm/PackageManager.java index 674135bd..f0045638 100644 --- a/src/api-impl/android/content/pm/PackageManager.java +++ b/src/api-impl/android/content/pm/PackageManager.java @@ -1612,7 +1612,12 @@ public class PackageManager { */ public ActivityInfo getActivityInfo(ComponentName component, int flags) throws NameNotFoundException { - return new ActivityInfo(); + ActivityInfo info = new ActivityInfo(); + /* Breeze Weather tries to override the night mode setting, but we don't implement configuration overriding yet. + * AppCompatDelegateImpl.updateAppConfiguration() checks if the setting is correctly overridden and otherwise recreates the activity. + * To prevent infinite recreation, we set the CONFIG_UI_MODE flag, indicating that the activity can handle night mode change without recreation. */ + info.configChanges = ActivityInfo.CONFIG_UI_MODE; + return info; } /** diff --git a/src/api-impl/android/graphics/Canvas.java b/src/api-impl/android/graphics/Canvas.java index e760880c..6705123f 100644 --- a/src/api-impl/android/graphics/Canvas.java +++ b/src/api-impl/android/graphics/Canvas.java @@ -475,6 +475,10 @@ public class Canvas { return save(); } + public int saveLayer(float left, float top, float right, float bottom, Paint paint) { + return save(); + } + public void drawOval(RectF oval, Paint paint) { Log.w("Canvas", "STUB: drawOval"); } @@ -542,4 +546,8 @@ public class Canvas { } public void drawPaint(Paint paint) {} + + public void drawPicture(Picture picture) { + Log.w("Canvas", "STUB: drawPicture"); + } } diff --git a/src/api-impl/android/location/Geocoder.java b/src/api-impl/android/location/Geocoder.java new file mode 100644 index 00000000..9f5b1185 --- /dev/null +++ b/src/api-impl/android/location/Geocoder.java @@ -0,0 +1,8 @@ +package android.location; + +public class Geocoder { + + public static boolean isPresent() { + return false; + } +} diff --git a/src/api-impl/android/os/StatFs.java b/src/api-impl/android/os/StatFs.java index 219c146f..fda95b8c 100644 --- a/src/api-impl/android/os/StatFs.java +++ b/src/api-impl/android/os/StatFs.java @@ -45,6 +45,9 @@ public class StatFs { * @throws IllegalArgumentException if the file system access fails */ private static StructStatVfs doStat(String path) { + /* applications use this method to query free space on the data partition. /home should be most equivalent on Linux Desktop */ + if ("/data".equals(path)) + path = "/home"; try { return Os.statvfs(path); } catch (ErrnoException e) { diff --git a/src/api-impl/android/os/StrictMode.java b/src/api-impl/android/os/StrictMode.java index 3734bc40..53ec6585 100644 --- a/src/api-impl/android/os/StrictMode.java +++ b/src/api-impl/android/os/StrictMode.java @@ -15,6 +15,8 @@ public final class StrictMode { return new ThreadPolicy(); } + public static void noteSlowCall(String tag) {} + public interface OnThreadViolationListener { } diff --git a/src/api-impl/android/view/OrientationEventListener.java b/src/api-impl/android/view/OrientationEventListener.java new file mode 100644 index 00000000..ca290feb --- /dev/null +++ b/src/api-impl/android/view/OrientationEventListener.java @@ -0,0 +1,14 @@ +package android.view; + +import android.content.Context; + +public class OrientationEventListener { + + public OrientationEventListener(Context context) {} + + public boolean canDetectOrientation() { + return false; + } + + public void disable() {} +} diff --git a/src/api-impl/android/view/View.java b/src/api-impl/android/view/View.java index 65e539be..d4850411 100644 --- a/src/api-impl/android/view/View.java +++ b/src/api-impl/android/view/View.java @@ -2219,4 +2219,6 @@ public class View implements Drawable.Callback { public void setAccessibilityHeading(boolean heading) {} public WindowInsets computeSystemWindowInsets(WindowInsets insets, Rect contentInsets) { return insets; } + + public boolean isDuplicateParentStateEnabled() { return false; } } diff --git a/src/api-impl/android/view/Window.java b/src/api-impl/android/view/Window.java index dcb17ed5..eaa44d28 100644 --- a/src/api-impl/android/view/Window.java +++ b/src/api-impl/android/view/Window.java @@ -160,4 +160,6 @@ public class Window { public void setReturnTransition(Transition transition) {} public void setEnterTransition(Transition transition) {} + + public void setGravity(int gravity) {} } diff --git a/src/api-impl/android/view/accessibility/AccessibilityManager.java b/src/api-impl/android/view/accessibility/AccessibilityManager.java index a7f0feed..99710b3f 100644 --- a/src/api-impl/android/view/accessibility/AccessibilityManager.java +++ b/src/api-impl/android/view/accessibility/AccessibilityManager.java @@ -25,4 +25,12 @@ public class AccessibilityManager { return false; } + public boolean removeAccessibilityStateChangeListener(AccessibilityStateChangeListener listener) { + return false; + } + + public boolean removeTouchExplorationStateChangeListener(TouchExplorationStateChangeListener listener) { + return false; + } + } diff --git a/src/api-impl/android/widget/CompoundButton.java b/src/api-impl/android/widget/CompoundButton.java index 2aeb88de..c0627b03 100644 --- a/src/api-impl/android/widget/CompoundButton.java +++ b/src/api-impl/android/widget/CompoundButton.java @@ -2,6 +2,7 @@ package android.widget; import android.content.Context; import android.content.res.ColorStateList; +import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.util.AttributeSet; @@ -75,4 +76,8 @@ public abstract class CompoundButton extends Button implements Checkable { @Override public void setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom) {} + + public PorterDuff.Mode getButtonTintMode() { + return null; + } } diff --git a/src/api-impl/android/widget/RatingBar.java b/src/api-impl/android/widget/RatingBar.java index 9ed43fd1..a2bca25a 100644 --- a/src/api-impl/android/widget/RatingBar.java +++ b/src/api-impl/android/widget/RatingBar.java @@ -13,4 +13,7 @@ public class RatingBar extends AbsSeekBar { super(context, attributeSet); } + public void setRating(float rating) { + setProgress((int)rating); + } } diff --git a/src/api-impl/meson.build b/src/api-impl/meson.build index 4efaaeec..2bdb8446 100644 --- a/src/api-impl/meson.build +++ b/src/api-impl/meson.build @@ -268,6 +268,7 @@ srcs = [ 'android/inputmethodservice/InputMethodService.java', 'android/inputmethodservice/ATLKeyboardViewer.java', 'android/location/Criteria.java', + 'android/location/Geocoder.java', 'android/location/GnssStatus.java', 'android/location/Location.java', 'android/location/LocationListener.java', @@ -512,6 +513,7 @@ srcs = [ 'android/view/MenuInflater.java', 'android/view/MenuItem.java', 'android/view/MotionEvent.java', + 'android/view/OrientationEventListener.java', 'android/view/PointerIcon.java', 'android/view/ScaleGestureDetector.java', 'android/view/SoundEffectConstants.java',