From c48df4b0f0eccf1a9201540097a06abf388fb226 Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 17 Jun 2011 02:47:36 +0100 Subject: [PATCH] first version of API --- AndroidManifest.xml | 6 ++ .../android/fbreader/api/ApiException.java | 30 +++++++ .../fbreader/api/ApiImplementation.java | 57 +++++++++++++ .../android/fbreader/api/ApiInterface.aidl | 28 +++++++ .../android/fbreader/api/ApiService.java | 31 +++++++ .../fbreader/api/ApiServiceConnection.java | 84 +++++++++++++++++++ 6 files changed, 236 insertions(+) create mode 100644 src/org/geometerplus/android/fbreader/api/ApiException.java create mode 100644 src/org/geometerplus/android/fbreader/api/ApiImplementation.java create mode 100644 src/org/geometerplus/android/fbreader/api/ApiInterface.aidl create mode 100644 src/org/geometerplus/android/fbreader/api/ApiService.java create mode 100644 src/org/geometerplus/android/fbreader/api/ApiServiceConnection.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 2e3105cc0..24c0864d9 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -7,6 +7,12 @@ + + + + + + diff --git a/src/org/geometerplus/android/fbreader/api/ApiException.java b/src/org/geometerplus/android/fbreader/api/ApiException.java new file mode 100644 index 000000000..397546a6d --- /dev/null +++ b/src/org/geometerplus/android/fbreader/api/ApiException.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2010-2011 Geometer Plus + * + * 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 program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.android.fbreader.api; + +public class ApiException extends Exception { + ApiException(String message) { + super(message); + } + + ApiException(Exception parent) { + super(parent); + } +} diff --git a/src/org/geometerplus/android/fbreader/api/ApiImplementation.java b/src/org/geometerplus/android/fbreader/api/ApiImplementation.java new file mode 100644 index 000000000..8486d421f --- /dev/null +++ b/src/org/geometerplus/android/fbreader/api/ApiImplementation.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2009-2011 Geometer Plus + * + * 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 program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.android.fbreader.api; + +import org.geometerplus.zlibrary.text.view.*; + +import org.geometerplus.fbreader.fbreader.FBReaderApp; + +public class ApiImplementation extends ApiInterface.Stub { + private final FBReaderApp myReader = (FBReaderApp)FBReaderApp.Instance(); + + @Override + public int getPageStartParagraphIndex() { + // TODO: check for NPE + return myReader.getTextView().getStartCursor().getParagraphIndex(); + } + + @Override + public int getMaxParagraphIndex() { + // TODO: check for NPE + return myReader.Model.BookTextModel.getParagraphsNumber() - 1; + } + + @Override + public String getParagraphText(int paragraphIndex) { + // TODO: check for NPEs + final StringBuffer sb = new StringBuffer(); + final ZLTextWordCursor cursor = new ZLTextWordCursor(myReader.getTextView().getStartCursor()); + cursor.moveToParagraph(paragraphIndex); + cursor.moveToParagraphStart(); + while (!cursor.isEndOfParagraph()) { + ZLTextElement element = cursor.getElement(); + if (element instanceof ZLTextWord) { + sb.append(element.toString() + " "); + } + cursor.nextWord(); + } + return sb.toString(); + } +} diff --git a/src/org/geometerplus/android/fbreader/api/ApiInterface.aidl b/src/org/geometerplus/android/fbreader/api/ApiInterface.aidl new file mode 100644 index 000000000..9873005fc --- /dev/null +++ b/src/org/geometerplus/android/fbreader/api/ApiInterface.aidl @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2010-2011 Geometer Plus + * + * 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 program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.android.fbreader.api; + +interface ApiInterface { + int getPageStartParagraphIndex(); + + int getMaxParagraphIndex(); + + String getParagraphText(int paragraphIndex); +} diff --git a/src/org/geometerplus/android/fbreader/api/ApiService.java b/src/org/geometerplus/android/fbreader/api/ApiService.java new file mode 100644 index 000000000..8f0e2c230 --- /dev/null +++ b/src/org/geometerplus/android/fbreader/api/ApiService.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2009-2011 Geometer Plus + * + * 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 program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.android.fbreader.api; + +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; + +public class ApiService extends Service { + @Override + public IBinder onBind(Intent intent) { + return new ApiImplementation(); + } +} diff --git a/src/org/geometerplus/android/fbreader/api/ApiServiceConnection.java b/src/org/geometerplus/android/fbreader/api/ApiServiceConnection.java new file mode 100644 index 000000000..571107515 --- /dev/null +++ b/src/org/geometerplus/android/fbreader/api/ApiServiceConnection.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2010-2011 Geometer Plus + * + * 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 program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.geometerplus.android.fbreader.api; + +import android.content.*; +import android.os.IBinder; + +public class ApiServiceConnection implements ServiceConnection { + private static String ACTION_API = "android.fbreader.action.API"; + + private final Context myContext; + private volatile ApiInterface myInterface; + + public ApiServiceConnection(Context context) { + myContext = context; + connect(); + } + + public synchronized void connect() { + if (myInterface == null) { + myContext.bindService(new Intent(ACTION_API), this, Context.BIND_AUTO_CREATE); + } + } + + public synchronized void onServiceConnected(ComponentName className, IBinder service) { + System.err.println("onServiceConnected call"); + myInterface = ApiInterface.Stub.asInterface(service); + } + + public synchronized void onServiceDisconnected(ComponentName name) { + System.err.println("onServiceDisconnected call"); + myInterface = null; + } + + private void checkConnection() throws ApiException { + if (myInterface == null) { + throw new ApiException("No connection with FBReader"); + } + } + + public synchronized int getPageStartParagraphIndex() throws ApiException { + checkConnection(); + try { + return myInterface.getPageStartParagraphIndex(); + } catch (android.os.RemoteException e) { + throw new ApiException(e); + } + } + + public synchronized int getMaxParagraphIndex() throws ApiException { + checkConnection(); + try { + return myInterface.getMaxParagraphIndex(); + } catch (android.os.RemoteException e) { + throw new ApiException(e); + } + } + + public synchronized String getParagraphText(int paragraphIndex) throws ApiException { + checkConnection(); + try { + return myInterface.getParagraphText(paragraphIndex); + } catch (android.os.RemoteException e) { + throw new ApiException(e); + } + } +}