2

My e-book reader (tolino shine 3) allows you to configure what the e-ink display should show when the screen is turned off. How can I do this programatically?

I wrote a little app, that turns on wifi every 10 minutes to fetch and display the latest weather report and then turns off wifi again. Since e-ink dipslays do not use power when nothing changes, I figured that the battery would last very long (my goal is 1 week) - but not so. Apparently Android keeps sucking the battery dry as long as the device is officially "on". After 2 days the show was over. If I could turn off the screen without clearing it I guess this would dramatically improve the run-time.

Any help would be appreciated. There's very little out there regarding e-ink APIs on Android.

The tolino shine 3 runs on Android 4.4.

Clarenze
  • 41
  • 4

1 Answers1

2

In logcat I found the following lines:

06-12 13:22:09.250 2484-2510/system_process I/Terry-FB: strSuspendImgFileName = /storage/sdcard1/suspend_others.jpg
06-12 13:22:09.250 2484-2510/system_process I/Terry-FB: strEPubFolder + "/" + strDefaultImgFileName = /data/data/de.telekom.epub/files//suspend_others.jpg
06-12 13:22:09.250 2484-2510/system_process I/Terry-FB: strLocaleImgFolder + "/" + strDefaultImgFileName = /system/usr/sleep/drawable-de-nodpi/suspend_others.jpg
06-12 13:22:09.250 2484-2510/system_process I/Terry-FB: strEPubFolder + "/" + strChargeImgFileName = /data/data/de.telekom.epub/files//suspend_charging_others.jpg
06-12 13:22:09.250 2484-2510/system_process I/Terry-FB: strLocaleImgFolder + "/" + strChargeImgFileName = /system/usr/sleep/drawable-de-nodpi/suspend_charging_others.jpg
06-12 13:22:09.250 2484-2510/system_process I/Terry-FB: strLocaleImgFolder + "/" + strFullImgFileName = /system/usr/sleep/drawable-de-nodpi/suspend_batteryfull_others.jpg

Apparently this is where it loads the image that is shown during sleep. Using grep I found the code in /system/framework/android.policy.jar. So I decompiled this file using JADX and found the lines where the screen is cleared and overwritten in ShowSleepScreenEx(). Since recompiling code that was decompiled with JADX is rather cumbersome I used apktool to decompile the jar into smali code, where I removed the call to ShowSleepScreenEx(). Using "apktool build" I recreated the jar file and pushed it back to the device. Voila: the screen is no longer cleared when the device goes to sleep.

I did not find a way to turn the screen off programmatically, so I simply set the screen timeout to a low value using

adb shell settings put system screen_off_timeout 1000

(Well, it turns out the minimum is 10s, but stubborn as I am I still set it to 1s :-)) Using ALarmManager I wake up every minute to update the time. The usual methods for turning on the screen (SCREEN_DIM_WAKE_LOCK, WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON) did not work on this device for some reason, so I found a different one: I cross-compiled libevdev and evemu and simulate pressing the power button:

public class AlarmWorker extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            Process proc = Runtime.getRuntime().exec(new String[]{"/system/bin/evemu-event",
                    "--sync", "/dev/input/event0", "--type", "EV_KEY", "--code", "KEY_POWER", "--value", "1"});
            proc.waitFor();
            SystemClock.sleep(50);
            proc = Runtime.getRuntime().exec(new String[]{ "/system/bin/evemu-event",
                    "--sync", "/dev/input/event0", "--type", "EV_KEY", "--code", "KEY_POWER", "--value", "0" });
            proc.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Instead of 2 days the battery now lasts 5 days on one charge.

Clarenze
  • 41
  • 4
  • Thank you! I was able to recreate this on a tolino Vision 1. I also had to remove the android.policy.odex file to make the system recognize the new jar file. – Matthias Kuhn Apr 22 '23 at 11:33