summaryrefslogtreecommitdiff
path: root/android
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2010-08-02 20:34:47 +0000
committerThomas Martitz <kugel@rockbox.org>2010-08-02 20:34:47 +0000
commit240923a801382c86545d10be167a15892a556fb6 (patch)
tree3c0e07ec3abf0c493a0b24b0b57e8bbd0200f7f6 /android
parent850efead04f10488b478a0f255a2464a01156a7f (diff)
downloadrockbox-240923a801382c86545d10be167a15892a556fb6.tar.gz
rockbox-240923a801382c86545d10be167a15892a556fb6.zip
Rockbox as an application: Commit current Android port progress.
General state is: Rockbox is usable (plays music, saves configuration, touchscreen works too). Problems: - Playing music in the background (i.e. when switching to another app) doesn't work reliably, but I'm working on that now. - no cabbiev2 (only some preliminary files for it), no other default theme. - screen flickers sometimes if the updates are too frequent - no multi screen apk/package - strange behavior when a phone call comes in The java files (and the eclipse project) resides in android/, which is also supposed to be the build folder. I've put a small README in there for instructions. There are some steps needed after the make part, which are described there, and which eclipse mostly handles. But there ought to be some script/makefile rules which do that instead in the future. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27668 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'android')
-rw-r--r--android/.classpath7
-rw-r--r--android/.project33
-rw-r--r--android/AndroidManifest.xml18
-rw-r--r--android/README34
-rw-r--r--android/default.properties11
-rw-r--r--android/gen/org/rockbox/R.java22
-rw-r--r--android/res/drawable-hdpi/icon.pngbin0 -> 4147 bytes
-rw-r--r--android/res/drawable-ldpi/icon.pngbin0 -> 1723 bytes
-rw-r--r--android/res/drawable-mdpi/icon.pngbin0 -> 2574 bytes
-rw-r--r--android/res/layout/main.xml7
-rw-r--r--android/res/values/strings.xml5
-rw-r--r--android/src/org/rockbox/RockboxActivity.java148
-rw-r--r--android/src/org/rockbox/RockboxFramebuffer.java98
-rw-r--r--android/src/org/rockbox/RockboxPCM.java155
-rw-r--r--android/src/org/rockbox/RockboxTimer.java93
15 files changed, 631 insertions, 0 deletions
diff --git a/android/.classpath b/android/.classpath
new file mode 100644
index 0000000000..6efcbb739a
--- /dev/null
+++ b/android/.classpath
@@ -0,0 +1,7 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<classpath>
3 <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
4 <classpathentry kind="src" path="src"/>
5 <classpathentry kind="src" path="gen"/>
6 <classpathentry kind="output" path="bin"/>
7</classpath>
diff --git a/android/.project b/android/.project
new file mode 100644
index 0000000000..7e8d136317
--- /dev/null
+++ b/android/.project
@@ -0,0 +1,33 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<projectDescription>
3 <name>Rockbox</name>
4 <comment></comment>
5 <projects>
6 </projects>
7 <buildSpec>
8 <buildCommand>
9 <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
10 <arguments>
11 </arguments>
12 </buildCommand>
13 <buildCommand>
14 <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
15 <arguments>
16 </arguments>
17 </buildCommand>
18 <buildCommand>
19 <name>org.eclipse.jdt.core.javabuilder</name>
20 <arguments>
21 </arguments>
22 </buildCommand>
23 <buildCommand>
24 <name>com.android.ide.eclipse.adt.ApkBuilder</name>
25 <arguments>
26 </arguments>
27 </buildCommand>
28 </buildSpec>
29 <natures>
30 <nature>com.android.ide.eclipse.adt.AndroidNature</nature>
31 <nature>org.eclipse.jdt.core.javanature</nature>
32 </natures>
33</projectDescription>
diff --git a/android/AndroidManifest.xml b/android/AndroidManifest.xml
new file mode 100644
index 0000000000..a22c393379
--- /dev/null
+++ b/android/AndroidManifest.xml
@@ -0,0 +1,18 @@
1<?xml version="1.0" encoding="utf-8"?>
2<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3 package="org.rockbox"
4 android:versionCode="1"
5 android:versionName="1.0">
6 <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
7 <activity android:name=".RockboxActivity"
8 android:label="@string/app_name">
9 <intent-filter>
10 <action android:name="android.intent.action.MAIN" />
11 <category android:name="android.intent.category.LAUNCHER" />
12 </intent-filter>
13 </activity>
14
15 </application>
16<uses-sdk android:minSdkVersion="4" />
17<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
18</manifest> \ No newline at end of file
diff --git a/android/README b/android/README
new file mode 100644
index 0000000000..e41bfa6c0c
--- /dev/null
+++ b/android/README
@@ -0,0 +1,34 @@
1This folder contains the java parts needed to build an Rockbox as an
2application for android.
3
4* Build instructions
5
6Until there's a script which does all the work the procedure is documented here.
7
8First, make sure you have the ANDROID_NDK_PATH environment variable set up,
9otherwise configure will fail to find the compiler.
10
11Use this as your build folder, using '../tools/configure' etc.
12 $ ../tools/configure
13 $ make
14
15After the build finished, you need to copy librockbox.so to libs/armeabi/.
16 $ cp librockbox.so libs/armeabi
17
18For the other files (codecs, themes), you execute 'make zip'. Then you copy the
19zip to libs/armeabi, using the name libmisc.so. This is needed, since there's no
20way to bundle stuff into apk's and have access to them from native code other
21than pretending it was a library.
22 $ make zip
23 $ cp rockbox.zip lib/armeabi/libmisc.so
24
25rockbox.zip..err, libmisc.so will be unpacked at runtime.
26
27To finish, you can follow this guide [1], or use eclipse. Simply install eclipse
28and the android plugins, then import this folder as a new Android project and run it.
29See [2] for a guide on how to set up eclipse for android development.
30
31
32
33[1]: http://asantoso.wordpress.com/2009/09/15/how-to-build-android-application-package-apk-from-the-command-line-using-the-sdk-tools-continuously-integrated-using-cruisecontrol/
34[2]: http://developer.android.com/sdk/installing.html
diff --git a/android/default.properties b/android/default.properties
new file mode 100644
index 0000000000..9d79b12c71
--- /dev/null
+++ b/android/default.properties
@@ -0,0 +1,11 @@
1# This file is automatically generated by Android Tools.
2# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
3#
4# This file must be checked in Version Control Systems.
5#
6# To customize properties used by the Ant build system use,
7# "build.properties", and override values to adapt the script to your
8# project structure.
9
10# Project target.
11target=android-4
diff --git a/android/gen/org/rockbox/R.java b/android/gen/org/rockbox/R.java
new file mode 100644
index 0000000000..38c177ef36
--- /dev/null
+++ b/android/gen/org/rockbox/R.java
@@ -0,0 +1,22 @@
1/* AUTO-GENERATED FILE. DO NOT MODIFY.
2 *
3 * This class was automatically generated by the
4 * aapt tool from the resource data it found. It
5 * should not be modified by hand.
6 */
7
8package org.rockbox;
9
10public final class R {
11 public static final class attr {
12 }
13 public static final class drawable {
14 public static final int icon=0x7f020000;
15 }
16 public static final class layout {
17 public static final int main=0x7f030000;
18 }
19 public static final class string {
20 public static final int app_name=0x7f040000;
21 }
22}
diff --git a/android/res/drawable-hdpi/icon.png b/android/res/drawable-hdpi/icon.png
new file mode 100644
index 0000000000..8074c4c571
--- /dev/null
+++ b/android/res/drawable-hdpi/icon.png
Binary files differ
diff --git a/android/res/drawable-ldpi/icon.png b/android/res/drawable-ldpi/icon.png
new file mode 100644
index 0000000000..1095584ec2
--- /dev/null
+++ b/android/res/drawable-ldpi/icon.png
Binary files differ
diff --git a/android/res/drawable-mdpi/icon.png b/android/res/drawable-mdpi/icon.png
new file mode 100644
index 0000000000..a07c69fa5a
--- /dev/null
+++ b/android/res/drawable-mdpi/icon.png
Binary files differ
diff --git a/android/res/layout/main.xml b/android/res/layout/main.xml
new file mode 100644
index 0000000000..4361cfe8aa
--- /dev/null
+++ b/android/res/layout/main.xml
@@ -0,0 +1,7 @@
1<?xml version="1.0" encoding="utf-8"?>
2<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="vertical"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent"
6 >
7</LinearLayout>
diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml
new file mode 100644
index 0000000000..6c3c8464fd
--- /dev/null
+++ b/android/res/values/strings.xml
@@ -0,0 +1,5 @@
1<?xml version="1.0" encoding="utf-8"?>
2<resources>
3
4 <string name="app_name">Rockbox</string>
5</resources>
diff --git a/android/src/org/rockbox/RockboxActivity.java b/android/src/org/rockbox/RockboxActivity.java
new file mode 100644
index 0000000000..791cad90ff
--- /dev/null
+++ b/android/src/org/rockbox/RockboxActivity.java
@@ -0,0 +1,148 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2010 Thomas Martitz
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22package org.rockbox;
23
24import java.io.BufferedInputStream;
25import java.io.BufferedOutputStream;
26import java.io.File;
27import java.io.FileOutputStream;
28import java.util.Enumeration;
29import java.util.zip.ZipEntry;
30import java.util.zip.ZipFile;
31
32import android.app.Activity;
33import android.graphics.Rect;
34import android.os.Bundle;
35import android.util.Log;
36import android.view.Window;
37import android.view.WindowManager;
38
39public class RockboxActivity extends Activity {
40 /** Called when the activity is first created. */
41 public RockboxFramebuffer fb;
42 private Thread rb;
43 static final int BUFFER = 2048;
44 /** Called when the activity is first created. */
45 @Override
46 public void onCreate(Bundle savedInstanceState) {
47 super.onCreate(savedInstanceState);
48 LOG("start rb");
49 requestWindowFeature(Window.FEATURE_NO_TITLE);
50 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
51 ,WindowManager.LayoutParams.FLAG_FULLSCREEN);
52 fb = new RockboxFramebuffer(this);
53 if (true) {
54 try
55 {
56 BufferedOutputStream dest = null;
57 BufferedInputStream is = null;
58 ZipEntry entry;
59 File file = new File("/data/data/org.rockbox/lib/libmisc.so");
60 /* use arbitary file to determine whether extracting is needed */
61 File file2 = new File("/data/data/org.rockbox/app_rockbox/rockbox/codecs/mpa.codec");
62 if (!file2.exists() || (file.lastModified() > file2.lastModified()))
63 {
64 ZipFile zipfile = new ZipFile(file);
65 Enumeration<? extends ZipEntry> e = zipfile.entries();
66 File folder;
67 while(e.hasMoreElements()) {
68 entry = (ZipEntry) e.nextElement();
69 LOG("Extracting: " +entry);
70 if (entry.isDirectory())
71 {
72 folder = new File(entry.getName());
73 LOG("mkdir "+ entry);
74 try {
75 folder.mkdirs();
76 } catch (SecurityException ex){
77 LOG(ex.getMessage());
78 }
79 continue;
80 }
81 is = new BufferedInputStream(zipfile.getInputStream(entry));
82 int count;
83 byte data[] = new byte[BUFFER];
84 folder = new File(new File(entry.getName()).getParent());
85 LOG("" + folder.getAbsolutePath());
86 if (!folder.exists())
87 folder.mkdirs();
88 FileOutputStream fos = new FileOutputStream(entry.getName());
89 dest = new BufferedOutputStream(fos, BUFFER);
90 while ((count = is.read(data, 0, BUFFER)) != -1) {
91 dest.write(data, 0, count);
92 }
93 dest.flush();
94 dest.close();
95 is.close();
96 }
97 }
98 } catch(Exception e) {
99 e.printStackTrace();
100 }}
101 Rect r = new Rect();
102 fb.getDrawingRect(r);
103 LOG(r.left + " " + r.top + " " + r.right + " " + r.bottom);
104 rb = new Thread(new Runnable()
105 {
106 public void run()
107 {
108 main();
109 }
110 },"Rockbox thread");
111 System.loadLibrary("rockbox");
112 rb.setDaemon(false);
113 setContentView(fb);
114 }
115
116 private void LOG(CharSequence text)
117 {
118 Log.d("RockboxBootloader", (String) text);
119 }
120
121 public synchronized void onStart()
122 {
123 super.onStart();
124 if (!rb.isAlive())
125 rb.start();
126 }
127
128 public void onPause()
129 {
130 super.onPause();
131 }
132
133 public void onResume()
134 {
135 super.onResume();
136 switch (rb.getState()) {
137 case BLOCKED: LOG("BLOCKED"); break;
138 case RUNNABLE: LOG("RUNNABLE"); break;
139 case NEW: LOG("NEW"); break;
140 case TERMINATED: LOG("TERMINATED"); break;
141 case TIMED_WAITING: LOG("TIMED_WAITING"); break;
142 case WAITING: LOG("WAITING"); break;
143 }
144 }
145
146
147 private native void main();
148} \ No newline at end of file
diff --git a/android/src/org/rockbox/RockboxFramebuffer.java b/android/src/org/rockbox/RockboxFramebuffer.java
new file mode 100644
index 0000000000..f947806bb4
--- /dev/null
+++ b/android/src/org/rockbox/RockboxFramebuffer.java
@@ -0,0 +1,98 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2010 Thomas Martitz
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22package org.rockbox;
23
24import java.nio.ByteBuffer;
25import android.content.Context;
26import android.graphics.Bitmap;
27import android.graphics.Canvas;
28import android.os.Handler;
29import android.util.Log;
30import android.view.MotionEvent;
31import android.view.View;
32
33public class RockboxFramebuffer extends View
34{
35 private Bitmap btm;
36 private ByteBuffer native_buf;
37 private Handler update_handler;
38 private Runnable cb;
39
40
41 public RockboxFramebuffer(Context c)
42 {
43 super(c);
44 update_handler = new Handler();
45 cb = new Runnable() {
46 public void run()
47 {
48 btm.copyPixelsFromBuffer(native_buf);
49 invalidate();
50 }
51 };
52 btm = null;
53 }
54
55 public void onDraw(Canvas c)
56 {
57 if (btm != null)
58 c.drawBitmap(btm, 0.0f, 0.0f, null);
59 }
60
61 public void java_lcd_init(int lcd_width, int lcd_height, ByteBuffer native_fb)
62 {
63 btm = Bitmap.createBitmap(lcd_width, lcd_height, Bitmap.Config.RGB_565);
64 native_buf = native_fb;
65 }
66
67 public void java_lcd_update()
68 {
69 update_handler.post(cb);
70 }
71
72 private void LOG(CharSequence text)
73 {
74 Log.d("RockboxBootloader", (String) text);
75 }
76
77 public boolean onTouchEvent(MotionEvent me)
78 {
79 LOG("onTouchEvent");
80 switch (me.getAction())
81 {
82 case MotionEvent.ACTION_CANCEL:
83 case MotionEvent.ACTION_UP:
84 touchHandler(0);
85 break;
86 case MotionEvent.ACTION_MOVE:
87 case MotionEvent.ACTION_DOWN:
88 touchHandler(1);
89 break;
90
91 }
92 pixelHandler((int)me.getX(), (int)me.getY());
93 return true;
94 }
95
96 public native void pixelHandler(int x, int y);
97 public native void touchHandler(int down);
98}
diff --git a/android/src/org/rockbox/RockboxPCM.java b/android/src/org/rockbox/RockboxPCM.java
new file mode 100644
index 0000000000..f098df6991
--- /dev/null
+++ b/android/src/org/rockbox/RockboxPCM.java
@@ -0,0 +1,155 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2010 Thomas Martitz
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22package org.rockbox;
23
24import android.media.AudioFormat;
25import android.media.AudioManager;
26import android.media.AudioTrack;
27import android.util.Log;
28
29public class RockboxPCM extends AudioTrack
30{
31 byte[] raw_data;
32
33 private void LOG(CharSequence text)
34 {
35 Log.d("RockboxBootloader", (String) text);
36 }
37
38 public RockboxPCM()
39 {
40 super(AudioManager.STREAM_MUSIC,
41 44100,
42 /* should be CHANNEL_OUT_STEREO in 2.0 and above */
43 AudioFormat.CHANNEL_CONFIGURATION_STEREO,
44 AudioFormat.ENCODING_PCM_16BIT,
45 24<<10,
46 AudioTrack.MODE_STREAM);
47 int buf_len = 24<<10;
48
49 raw_data = new byte[buf_len*2];
50 for(int i = 0; i < raw_data.length; i++) raw_data[i] = (byte) 0x00;
51 /* fill with silence */
52 write(raw_data, 0, raw_data.length);
53 if (getState() == AudioTrack.STATE_INITIALIZED)
54 {
55 if (setNotificationMarkerPosition(bytes2frames(buf_len*2)/4) != AudioTrack.SUCCESS)
56 LOG("setNotificationMarkerPosition Error");
57 setPlaybackPositionUpdateListener(new PCMListener(buf_len*2));
58 }
59 }
60
61
62
63 int bytes2frames(int bytes) {
64 /* 1 sample is 2 bytes, 2 samples are 1 frame */
65 return (bytes/4);
66 }
67
68 int frames2bytes(int frames) {
69 /* 1 frame is 2 samples, 1 sample is 2 bytes */
70 return (frames*4);
71 }
72
73 @SuppressWarnings("unused")
74 private void play_pause(boolean pause) {
75 LOG("play_pause()");
76 if (pause)
77 pause();
78 else
79 {
80 if (getPlayState() == AudioTrack.PLAYSTATE_STOPPED)
81 {
82 for(int i = 0; i < raw_data.length; i++) raw_data[i] = (byte) 0x00;
83 LOG("Writing silence");
84 /* fill with silence */
85 write(raw_data, 0, raw_data.length);
86 }
87 play();
88 }
89 LOG("play_pause() return");
90 }
91
92 @SuppressWarnings("unused")
93 private void set_volume(int volume)
94 {
95 /* volume comes from 0..-990 from Rockbox */
96 /* TODO volume is in dB, but this code acts as if it were in %, convert? */
97 float fvolume;
98 /* special case min and max volume to not suffer from floating point accuracy */
99 if (volume == 0)
100 fvolume = 1.0f;
101 else if (volume == -990)
102 fvolume = 0.0f;
103 else
104 fvolume = (volume + 990)/990.0f;
105 setStereoVolume(fvolume, fvolume);
106 }
107
108 public native void pcmSamplesToByteArray(byte[] dest);
109
110 private class PCMListener implements OnPlaybackPositionUpdateListener {
111 int max_len;
112 byte[] buf;
113 public PCMListener(int len) {
114 max_len = len;
115 buf = new byte[len/2];
116 }
117 @Override
118 public void onMarkerReached(AudioTrack track) {
119 // push new data to the hardware
120 int result = 1;
121 pcmSamplesToByteArray(buf);
122 //LOG("Trying to write " + buf.length + " bytes");
123 result = track.write(buf, 0, buf.length);
124 if (result > 0)
125 {
126 //LOG(result + " bytes written");
127 track.setPlaybackPositionUpdateListener(this);
128 track.setNotificationMarkerPosition(bytes2frames(max_len)/4);
129 switch(track.getPlayState())
130 {
131 case AudioTrack.PLAYSTATE_PLAYING:
132 //LOG("State PLAYING");
133 break;
134 case AudioTrack.PLAYSTATE_PAUSED:
135 LOG("State PAUSED");
136 break;
137 case AudioTrack.PLAYSTATE_STOPPED:
138 LOG("State STOPPED");
139 break;
140 }
141 }
142 else
143 {
144 LOG("Error in onMarkerReached");
145 track.stop();
146 }
147 }
148
149 @Override
150 public void onPeriodicNotification(AudioTrack track) {
151 // TODO Auto-generated method stub
152
153 }
154 }
155}
diff --git a/android/src/org/rockbox/RockboxTimer.java b/android/src/org/rockbox/RockboxTimer.java
new file mode 100644
index 0000000000..c7239b4ee6
--- /dev/null
+++ b/android/src/org/rockbox/RockboxTimer.java
@@ -0,0 +1,93 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2010 Thomas Martitz
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22package org.rockbox;
23
24import java.util.Timer;
25import java.util.TimerTask;
26
27import android.util.Log;
28
29public class RockboxTimer extends Timer
30{
31 RockboxTimerTask task;
32 long interval;
33
34 private class RockboxTimerTask extends TimerTask {
35 private RockboxTimer t;
36 public RockboxTimerTask(RockboxTimer parent) {
37 super();
38 t = parent;
39 }
40
41 @Override
42 public void run() {
43 timerTask();
44 synchronized(t) {
45 t.notify();
46 }
47 }
48 }
49
50 public void pause()
51 {
52 cancel();
53 }
54 public void resume()
55 {
56 try {
57 schedule(task, 0, interval);
58 } catch (IllegalStateException e) {
59 /* not an error */
60 } catch (Exception e) {
61 LOG(e.toString());
62 }
63 }
64
65 public RockboxTimer(long period_inverval_in_ms)
66 {
67 super("tick timer", false);
68 task = new RockboxTimerTask(this);
69 schedule(task, 0, period_inverval_in_ms);
70 interval = period_inverval_in_ms;
71 }
72
73 private void LOG(CharSequence text)
74 {
75 Log.d("RockboxBootloader", (String) text);
76 }
77
78
79 /* methods called from native, keep them simple */
80 public void java_wait_for_interrupt()
81 {
82 synchronized(this) {
83 try {
84 this.wait();
85 } catch (InterruptedException e) {
86 /* wakeup and return */
87 } catch (Exception e) {
88 LOG(e.toString());
89 }
90 }
91 }
92 public native void timerTask();
93}