Thank you Taifun, I got much the same from an online conversion tool.
OK, moving on to item 2. Does it work ?
I created a new extension for just this, here is the following java code after much substitution and replacement:
JAVA UiUtils
package uk.co.metricrat.uiutils;
import android.app.*;
import androidx.core.graphics.*;
import com.google.appinventor.components.annotations.DesignerComponent;
import com.google.appinventor.components.runtime.AndroidNonvisibleComponent;
import com.google.appinventor.components.runtime.ComponentContainer;
import com.google.appinventor.components.annotations.SimpleFunction;
import android.content.Context;
import android.os.Build;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowInsets;
import android.view.ViewGroup.MarginLayoutParams;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.core.view.updateLayoutParams; // << not available for Java - Kotlin function
@DesignerComponent(
version = 1,
versionName = "1.0",
description = "Developed by TIMAI2 using Fast.",
iconName = "icon.png"
)
public class UiUtils extends AndroidNonvisibleComponent{
private ComponentContainer container;
private Context context;
private static Context ctx;
private final Activity activity;
private static AppCompatActivity act;
private static View rootLayout;
private static Window window;
public UiUtils(ComponentContainer container) {
super(container.$form());
this.container = container;
context = container.$context();
this.activity = container.$context();
}
@SimpleFunction(description="test function")
public static void setStatusBarColor(int statusColour, int navColour) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { // Renamed from VANILLA_ICE_CREAM
// Below code is for giving the background color to the Navigation Bar
window.getDecorView().setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
@Override
public WindowInsets onApplyWindowInsets(View view, WindowInsets insets) {
view.setBackgroundColor(navColour);
return insets;
}
});
ViewCompat.setOnApplyWindowInsetsListener(rootLayout, (v, windowInsets) -> {
WindowInsetsCompat.getInsets(windowInsets, WindowInsetsCompat.Type.systemBars());
Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
int height = insets.top;
// Below code is for adding padding top and bottom
v.updateLayoutParams(params -> {
if (params instanceof MarginLayoutParams) {
MarginLayoutParams marginParams = (MarginLayoutParams) params;
marginParams.topMargin = insets.top;
marginParams.bottomMargin = insets.bottom;
}
});
View statusBarView = new View(ctx);
// Below code is for setting color and height to the notification bar
statusBarView.setLayoutParams(new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
height
));
statusBarView.setBackgroundColor(ContextCompat.getColor(ctx, statusColour));
act.addContentView(statusBarView, statusBarView.getLayoutParams());
return WindowInsetsCompat.CONSUMED;
});
} else {
// For Android 14 and below
window.setStatusBarColor(ContextCompat.getColor(ctx, statusColour));
}
}
}
Issues:
import androidx.core.view.updateLayoutParams;
not available for Java - Kotlin function
Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
getInsets - Non-static method 'getInsets(int)' cannot be referenced from a static context
v.updateLayoutParams(params -> { if (params instanceof MarginLayoutParams) { MarginLayoutParams marginParams = (MarginLayoutParams) params;
generates errors because we cannot use "updateLayoutParams"
Dead end, or light at the end of the tunnel ?