The new build is allowing me to compile and proceed. I ran into this new problem, and I’ll add others (if any) as I continue to import java code.
The java code I was trying to import (sans namespace):
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.internal.view.menu.ActionMenuItemView;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import java.util.ArrayList;
public class ColorizeTheToolBar
{
static public void colorizeToolBarItem(AppCompatActivity myActivity, final String description, boolean bIsBlue)
{ int theColor;
if (bIsBlue)
theColor = myActivity.getResources().getColor(R.color.colorAccent);
else
theColor = myActivity.getResources().getColor(R.color.colorGreyToolbarIcons);
final ViewGroup decorView = (ViewGroup) myActivity.getWindow().getDecorView();
final ViewTreeObserver viewTreeObserver = decorView.getViewTreeObserver();
final String myOverflowDescription = myActivity.getString(R.string.overflow_image);
final PorterDuffColorFilter colorFilter = new PorterDuffColorFilter(theColor, PorterDuff.Mode.SRC_ATOP);
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
{ @Override
public void onGlobalLayout()
{ final ArrayList<View> outViews = new ArrayList<>();
decorView.findViewsWithText(outViews, description, View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
if (outViews.isEmpty())
return;
if (description == myOverflowDescription)
{ ImageView overflow = (ImageView) outViews.get(0);
overflow.setColorFilter(colorFilter);
}
else
{ ActionMenuItemView overflow = (ActionMenuItemView) outViews.get(0);
overflow.getCompoundDrawables()[0].setColorFilter(colorFilter);
}
removeOnGlobalLayoutListener(decorView, this);
}
});
}
private static void removeOnGlobalLayoutListener(View myView, ViewTreeObserver.OnGlobalLayoutListener myListener)
{ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
myView.getViewTreeObserver().removeGlobalOnLayoutListener(myListener);
else
myView.getViewTreeObserver().removeOnGlobalLayoutListener(myListener);
}
}
The imported code (cleaned up a bit: removed ‘internal’, unsure why, and changed viewTreeObserver to myViewTreeObserver because of the case insensitivity on the Pascal side):
interface
uses
android.graphics,
android.os,
android.support.v7.app,
android.support.v7.view.menu,
android.view,
android.widget,
java.util;
type
ColorizeTheToolBar = public class
private
class method removeOnGlobalLayoutListener(myView: View; myListener: ViewTreeObserver.OnGlobalLayoutListener);
public
class method colorizeToolBarItem(myActivity: AppCompatActivity; description: String; bIsBlue: Boolean);
end;
implementation
class method ColorizeTheToolBar.colorizeToolBarItem(myActivity: AppCompatActivity; description: String; bIsBlue: Boolean);
begin
var theColor: Integer;
if bIsBlue then begin
theColor := myActivity.getResources().getColor(R.color.colorAccent);
end
else begin
theColor := myActivity.getResources().getColor(R.color.colorGreyToolbarIcons);
end;
var decorView: ViewGroup := ViewGroup(myActivity.getWindow().getDecorView());
var myViewTreeObserver: ViewTreeObserver := decorView.getViewTreeObserver();
var myOverflowDescription: String := myActivity.getString(R.string.overflow_image);
var colorFilter: PorterDuffColorFilter := new PorterDuffColorFilter(theColor, PorterDuff.Mode.SRC_ATOP);
myViewTreeObserver.addOnGlobalLayoutListener(new class ViewTreeObserver.OnGlobalLayoutListener (onGlobalLayout := method
begin
var outViews: ArrayList<View> := new ArrayList<View>();
decorView.findViewsWithText(outViews, description, View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
if outViews.isEmpty() then
begin
exit;
end;
if description = myOverflowDescription then
begin
var overflow: ImageView := ImageView(outViews.get(0));
overflow.setColorFilter(colorFilter);
end
else
begin
var overflow: ActionMenuItemView := ActionMenuItemView(outViews.get(0));
overflow.getCompoundDrawables()[0].setColorFilter(colorFilter);
end;
removeOnGlobalLayoutListener(decorView, self);
end));
end;
class method ColorizeTheToolBar.removeOnGlobalLayoutListener(myView: View; myListener: ViewTreeObserver.OnGlobalLayoutListener);
begin
if Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN then begin
myView.getViewTreeObserver().removeGlobalOnLayoutListener(myListener);
end
else begin
myView.getViewTreeObserver().removeOnGlobalLayoutListener(myListener);
end;
end;
end.
The problem is the converted line:
removeOnGlobalLayoutListener(decorView, self);
on the 2nd parameter. In the Java version, the ‘self’ refers to the new ViewTreeObserver.OnGlobalLayoutListener() created in-line. But as best I can figure, after the Oxidizer conversion, the ‘self’ refers to something else, probably the ColorizeTheToolbar class itself. The error I get is:
Error (E486) Parameter 2 is "<type reference>", should be "ViewTreeObserver.OnGlobalLayoutListener", in call to class method ColorizeTheToolBar.removeOnGlobalLayoutListener(myView: View; myListener: ViewTreeObserver.OnGlobalLayoutListener)
I’m not sure if this is a bug in the Oxidizer process, a limitation of the syntax, or what. Any insight would be appreciated. I can comment this out and continue importing.