1
0
Fork 0
forked from len0rd/rockbox

Use a Native keyboard GUI instead of rockbox's internal one on android

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28407 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Jonathan Gordon 2010-10-31 10:35:55 +00:00
parent 26f7ee13ce
commit eaff333bf5
11 changed files with 261 additions and 4 deletions

View file

@ -0,0 +1,7 @@
package org.rockbox;
import android.content.Intent;
public interface HostCallback {
public void onComplete(int resultCode, Intent data);
}

View file

@ -0,0 +1,41 @@
package org.rockbox;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.text.Editable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
public class KeyboardActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater inflater=LayoutInflater.from(this);
View addView=inflater.inflate(R.layout.keyboardinput, null);
EditText input = (EditText) addView.findViewById(R.id.KbdInput);
input.setText(getIntent().getStringExtra("value"));
new AlertDialog.Builder(this)
.setTitle(R.string.KbdInputTitle)
.setView(addView)
.setIcon(R.drawable.icon)
.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
EditText input = (EditText)((Dialog)dialog).findViewById(R.id.KbdInput);
Editable s = input.getText();
getIntent().putExtra("value", s.toString());
setResult(RESULT_OK, getIntent());
finish();
}
})
.setNegativeButton(R.string.Cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
setResult(RESULT_CANCELED, getIntent());
finish();
}
})
.show();
}
}

View file

@ -24,7 +24,9 @@ package org.rockbox;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
@ -41,6 +43,7 @@ public class RockboxActivity extends Activity
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
,WindowManager.LayoutParams.FLAG_FULLSCREEN);
final Activity thisActivity = this;
final Intent intent = new Intent(this, RockboxService.class);
/* prepare a please wait dialog in case we need
* to wait for unzipping libmisc.so
@ -95,7 +98,8 @@ public class RockboxActivity extends Activity
loadingdialog.dismiss();
if (rbservice.get_fb() == null)
throw new IllegalStateException("FB NULL");
setContentView(rbservice.get_fb());
rbservice.set_activity(thisActivity);
setContentView(rbservice.get_fb());
rbservice.get_fb().invalidate();
}
});
@ -111,6 +115,7 @@ public class RockboxActivity extends Activity
public void onResume()
{
super.onResume();
if (isRockboxRunning())
{
@ -123,6 +128,7 @@ public class RockboxActivity extends Activity
g.removeView(rbservice.get_fb());
setContentView(rbservice.get_fb());
} finally {
rbservice.set_activity(this);
rbservice.get_fb().resume();
}
}
@ -135,6 +141,7 @@ public class RockboxActivity extends Activity
protected void onPause()
{
super.onPause();
rbservice.set_activity(null);
rbservice.get_fb().suspend();
}
@ -142,6 +149,7 @@ public class RockboxActivity extends Activity
protected void onStop()
{
super.onStop();
rbservice.set_activity(null);
rbservice.get_fb().suspend();
}
@ -149,6 +157,29 @@ public class RockboxActivity extends Activity
protected void onDestroy()
{
super.onDestroy();
rbservice.set_activity(null);
rbservice.get_fb().suspend();
}
private HostCallback hostcallback = null;
public void waitForActivity(Intent i, HostCallback callback)
{
if (hostcallback != null)
{
LOG("Something has gone wrong");
}
hostcallback = callback;
startActivityForResult(i, 0);
}
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
hostcallback.onComplete(resultCode, data);
hostcallback = null;
}
private void LOG(CharSequence text)
{
Log.d("Rockbox", (String) text);
}
}

View file

@ -118,12 +118,11 @@ public class RockboxFramebuffer extends View
setFocusableInTouchMode(true);
setClickable(true);
requestFocus();
/* make updates again, the underlying function will
* send an event */
set_lcd_active(1);
}
public native void set_lcd_active(int active);
public native void touchHandler(boolean down, int x, int y);
public native boolean buttonHandler(int keycode, boolean state);
}

View file

@ -0,0 +1,69 @@
/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2010 Jonathan Gordon
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
package org.rockbox;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.util.Log;
public class RockboxKeyboardInput
{
private BroadcastReceiver b;
private String result;
public RockboxKeyboardInput()
{
result = null;
}
public void kbd_input(String text)
{
RockboxActivity a = (RockboxActivity) RockboxService.get_instance().get_activity();
Intent kbd = new Intent(a, KeyboardActivity.class);
kbd.putExtra("value", text);
a.waitForActivity(kbd, new HostCallback(){
@Override
public void onComplete(int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK)
{
result = data.getStringExtra("value");
}
else {
result = "";
}
}
});
}
public String get_result()
{
return result;
}
public boolean is_usable()
{
return RockboxService.get_instance().get_activity() != null;
}
}

View file

@ -35,6 +35,7 @@ import java.util.TimerTask;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
@ -61,6 +62,7 @@ public class RockboxService extends Service
/* locals needed for the c code and rockbox state */
private RockboxFramebuffer fb = null;
private boolean mRockboxRunning = false;
private Activity current_activity = null;
private Notification notification;
private static final Class<?>[] mStartForegroundSignature =
@ -113,6 +115,16 @@ public class RockboxService extends Service
fb = newfb;
mRockboxRunning = true;
}
public Activity get_activity()
{
return current_activity;
}
public void set_activity(Activity a)
{
current_activity = a;
}
private void do_start(Intent intent)
{