package org.geometerplus.android.util.eink; /** * This code is derived from * Nook Touch EPD controller interface wrapper. * @author DairyKnight <dairyknight@gmail.com> * http://forum.xda-developers.com/showthread.php?t=1183173 */ import java.lang.reflect.Constructor; import java.lang.reflect.Method; import android.app.Activity; import org.geometerplus.android.util.DeviceType; public class Nook2Util { private static Class epdControllerClass; private static Class epdControllerRegionClass; private static Class epdControllerRegionParamsClass; private static Class epdControllerWaveClass; private static Class epdControllerModeClass; private static Object[] waveEnums; private static Object[] regionEnums; private static Object[] modeEnums; private static boolean successful = false; static { try { /* * Loading the Epson EPD Controller Classes */ epdControllerClass = Class .forName("android.hardware.EpdController"); epdControllerRegionClass = Class .forName("android.hardware.EpdController$Region"); if (DeviceType.Instance() == DeviceType.NOOK12) { epdControllerRegionParamsClass = Class .forName("android.hardware.EpdRegionParams"); epdControllerWaveClass = Class .forName("android.hardware.EpdRegionParams$Wave"); } else { epdControllerRegionParamsClass = Class .forName("android.hardware.EpdController$RegionParams"); epdControllerWaveClass = Class .forName("android.hardware.EpdController$Wave"); } epdControllerModeClass = Class .forName("android.hardware.EpdController$Mode"); if (epdControllerWaveClass.isEnum()) { System.err.println("EpdController Wave Enum successfully retrived."); waveEnums = epdControllerWaveClass.getEnumConstants(); } if (epdControllerRegionClass.isEnum()) { System.err.println("EpdController Region Enum successfully retrived."); regionEnums = epdControllerRegionClass.getEnumConstants(); } if (epdControllerModeClass.isEnum()) { System.err.println("EpdController Region Enum successfully retrived."); modeEnums = epdControllerModeClass.getEnumConstants(); System.err.println(modeEnums); } successful = true; } catch (Exception e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } private static Object mEpdController = null; static void setGL16Mode(Activity a) { System.err.println("setGL16Mode"); try { if (successful) { if (DeviceType.Instance() == DeviceType.NOOK12 && mEpdController == null) { Constructor[] EpdControllerConstructors = epdControllerClass.getConstructors(); mEpdController = EpdControllerConstructors[0].newInstance(new Object[] { a }); } Constructor RegionParamsConstructor = epdControllerRegionParamsClass .getConstructor(new Class[] { Integer.TYPE, Integer.TYPE, Integer.TYPE, Integer.TYPE, epdControllerWaveClass}); Object localRegionParams = RegionParamsConstructor .newInstance(new Object[] { 0, 0, 600, 800, waveEnums[1]}); // Wave = GU Method epdControllerSetRegionMethod = epdControllerClass.getMethod( "setRegion", new Class[] { String.class, epdControllerRegionClass, epdControllerRegionParamsClass, epdControllerModeClass }); if (DeviceType.Instance() == DeviceType.NOOK12) { epdControllerSetRegionMethod .invoke(mEpdController, new Object[] { "FBReaderJ", regionEnums[2], localRegionParams, modeEnums[2] }); // Mode = ONESHOT_ALL } else { epdControllerSetRegionMethod .invoke(null, new Object[] { "FBReaderJ", regionEnums[2], localRegionParams, modeEnums[2] }); // Mode = ONESHOT_ALL } } } catch (Exception e) { e.printStackTrace(); } } }