Example 3: Using Java on Android

This example shows how to access Androidâ„¢ components through Java, it includes:
  • Access to the JDK API to get the number of cores on your device.
  • Access to Android APIs to get the screen dimension, the device manufacturer and model (with no need for any additional authorization)
  • Access to the Bluetooth stack to list the paired devices.
    Note: In your GM project, you need to ask for BLUETOOTH authorization.
Form file formJavaStandard.per:
LAYOUT (TEXT="Access to Android API")
GROUP group1(TEXT="Using standard JDK API...")
GRID grid1
{
[l1                        |f1                                  ]    
}
END
END

ATTRIBUTES
LABEL l1 : label1, TEXT="Number of processors available";
LABEL f1 = FORMONLY.nb_proc;
END
Form file formAndroidSimple.per:
LAYOUT (TEXT="Access to Android API")
GROUP group1(TEXT="Using simple Android API...")
GRID grid1
{
[l1                        |f1                                  ]
[l2                        |f2                                  ]
[l3                        |f3                                  ]
[l4                        |f4                                  ]
}
END
END

ATTRIBUTES
LABEL l1 : label1, TEXT="Device manufacturer";
LABEL f1 = FORMONLY.manufacturer;
LABEL l2 : label2, TEXT="Device model";
LABEL f2 = FORMONLY.model;
LABEL l3 : label3, TEXT="Device serial number";
LABEL f3 = FORMONLY.serial;
LABEL l4 : label4, TEXT="Device screen dimension";
LABEL f4 = FORMONLY.diagonal;
END
Form file formAndroidBluetooth.per:
LAYOUT (TEXT="Access to Android API")
GROUP group1(TEXT="Using Bluetooth Android API...")
GRID grid1
{
[l1                            |f1                                       ]
<TABLE t                                                                 >
[c1                            |c2                                       ]
[c1                            |c2                                       ]
[c1                            |c2                                       ]
<                                                                        >
}
END
END

ATTRIBUTES
LABEL l1 : label1, TEXT="Bluetooth adapter name";
LABEL f1 = FORMONLY.ba_name;
LABEL c1 = FORMONLY.name;
LABEL c2 = FORMONLY.comment;
END

INSTRUCTIONS
SCREEN RECORD list(FORMONLY.name, FORMONLY.comment);
END

Program file:

IMPORT util

IMPORT JAVA java.lang.Runtime
IMPORT JAVA java.util.Iterator
IMPORT JAVA java.lang.Class
IMPORT JAVA java.lang.Math

IMPORT JAVA android.bluetooth.BluetoothAdapter
IMPORT JAVA android.bluetooth.BluetoothDevice
IMPORT JAVA android.content.Context
IMPORT JAVA android.os.Build
IMPORT JAVA android.util.DisplayMetrics
IMPORT JAVA android.view.WindowManager

IMPORT JAVA com.fourjs.gma.vm.FglRun

MAIN
	MENU "Samples"
		COMMAND "Android API access"
			CALL androidApiAccess()
		COMMAND "Quit"
			EXIT MENU
		ON ACTION close
			EXIT MENU
	END MENU
END MAIN

FUNCTION androidApiAccess()

	MENU "Android API access"
		COMMAND "Accessing Java standard API"
			CALL androidApiAccess_java_standard()
		COMMAND "Accessing simple android information"
			CALL androidApiAccess_android_simple()
		COMMAND "Accessing sophisticated APIs : bluetooth"
			CALL androidApiAccess_bluetooth()
		ON ACTION CANCEL
			EXIT MENU
	END MENU
END FUNCTION

FUNCTION androidApiAccess_java_standard()
	DEFINE r Runtime

	OPEN WINDOW w WITH FORM "formJavaStandard"

	LET r = java.lang.Runtime.getRuntime()
	DISPLAY r.availableProcessors() TO nb_proc

	MENU
		ON ACTION QUIT
			EXIT MENU
		ON ACTION close
			EXIT MENU
	END MENU

	CLOSE WINDOW w
END FUNCTION

FUNCTION androidApiAccess_android_simple()
	DEFINE s STRING
	DEFINE dm DisplayMetrics
	DEFINE c Context
	DEFINE width, height, dens, wi, hi, x, y FLOAT
	DEFINE screenInches FLOAT
	DEFINE wm android.view.WindowManager

	OPEN WINDOW w WITH FORM "formAndroidSimple"

	LET s = android.os.Build.MANUFACTURER
	DISPLAY s TO manufacturer
	LET s = android.os.Build.MODEL
	DISPLAY s TO model
	LET s = android.os.Build.SERIAL
	DISPLAY s TO serial

	# Get the FglRun Context
	LET c = com.fourjs.gma.vm.FglRun.getContext()

	# Compute display dimension (diagonal)
	LET dm = android.util.DisplayMetrics.create()
	LET wm = CAST ( c.getSystemService("window") AS android.view.WindowManager )
	CALL wm.getDefaultDisplay().getMetrics(dm)
	LET width = dm.widthPixels
	LET height = dm.heightPixels
	LET dens = dm.densityDpi
	LET wi = width/dens
	LET hi = height/dens
	LET x = util.Math.pow(wi,2)
	LET y = util.Math.pow(hi,2);
	LET screenInches = util.Math.sqrt(x+y);

	DISPLAY screenInches TO diagonal
	MENU
		ON ACTION QUIT
			EXIT MENU
		ON ACTION close
			EXIT MENU
	END MENU

	CLOSE WINDOW w
END FUNCTION

FUNCTION androidApiAccess_bluetooth()
	DEFINE ba  BluetoothAdapter
	DEFINE sbd Iterator
	DEFINE bd  BluetoothDevice
	DEFINE bds DYNAMIC ARRAY OF RECORD
		name STRING,
		comment STRING
	END RECORD
	DEFINE i INTEGER
	DEFINE s STRING

	OPEN WINDOW w WITH FORM "formAndroidBluetooth"

	LET ba = android.bluetooth.BluetoothAdapter.getDefaultAdapter()
	LET s = ba.getName()
	DISPLAY s TO ba_name

	LET sbd = ba.getBondedDevices().iterator()
	LET i = 0
	WHILE sbd.hasNext()
		LET bd = CAST(sbd.next() AS BluetoothDevice)
		LET i = i + 1
		LET bds[i].name = bd.getName()
		LET bds[i].comment = bd.getBluetoothClass().toString()
	END WHILE

	DISPLAY ARRAY bds TO list.*
		ON ACTION QUIT
			EXIT DISPLAY
		ON ACTION close
			EXIT DISPLAY
	END DISPLAY

	CLOSE WINDOW w
END FUNCTION