aboutsummaryrefslogtreecommitdiffhomepage
path: root/android_sample/SampleApp
diff options
context:
space:
mode:
authorGravatar Scroggo <Scroggo@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-06-21 14:44:57 +0000
committerGravatar Scroggo <Scroggo@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-06-21 14:44:57 +0000
commit8ac0d542b0226e68b0faa935b3402ffc91409a02 (patch)
tree0d4eca1c5c49361c036b368fd6affd3c53e55a3d /android_sample/SampleApp
parentccb74eabccf19f66b6bf31f4acae89b62baa16c3 (diff)
Add a way to save to PDF in SampleApp on Android and elsewhere.
In Android, add the PDF file to downloads, so it can be opened. Reviewed at http://codereview.appspot.com/4638052/ git-svn-id: http://skia.googlecode.com/svn/trunk@1659 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'android_sample/SampleApp')
-rw-r--r--android_sample/SampleApp/Android.mk13
-rw-r--r--android_sample/SampleApp/AndroidManifest.xml4
-rw-r--r--android_sample/SampleApp/jni/sample-jni.cpp30
-rw-r--r--android_sample/SampleApp/res/menu/sample.xml7
-rw-r--r--android_sample/SampleApp/res/values/strings.xml5
-rw-r--r--android_sample/SampleApp/src/com/skia/sampleapp/SampleApp.java43
6 files changed, 98 insertions, 4 deletions
diff --git a/android_sample/SampleApp/Android.mk b/android_sample/SampleApp/Android.mk
index 6054235283..4952316a04 100644
--- a/android_sample/SampleApp/Android.mk
+++ b/android_sample/SampleApp/Android.mk
@@ -40,6 +40,7 @@ LOCAL_C_INCLUDES += \
external/skia/src/core \
external/skia/gpu/include \
frameworks/base/opengl/include/GLES2 \
+ external/skia/include/pdf \
$(LOCAL_PATH)/jni
LOCAL_SHARED_LIBRARIES := \
@@ -60,6 +61,18 @@ LOCAL_MODULE := libskia-sample
LOCAL_SRC_FILES := \
../../src/ports/SkXMLParser_empty.cpp \
+ ../../src/pdf/SkPDFCatalog.cpp \
+ ../../src/pdf/SkPDFDevice.cpp \
+ ../../src/pdf/SkPDFDocument.cpp \
+ ../../src/pdf/SkPDFFont.cpp \
+ ../../src/pdf/SkPDFFormXObject.cpp \
+ ../../src/pdf/SkPDFGraphicState.cpp \
+ ../../src/pdf/SkPDFImage.cpp \
+ ../../src/pdf/SkPDFPage.cpp \
+ ../../src/pdf/SkPDFShader.cpp \
+ ../../src/pdf/SkPDFStream.cpp \
+ ../../src/pdf/SkPDFTypes.cpp \
+ ../../src/pdf/SkPDFUtils.cpp \
jni/sample-jni.cpp
include external/skia/src/views/views_files.mk
diff --git a/android_sample/SampleApp/AndroidManifest.xml b/android_sample/SampleApp/AndroidManifest.xml
index 5980d298d0..cf6e5a712b 100644
--- a/android_sample/SampleApp/AndroidManifest.xml
+++ b/android_sample/SampleApp/AndroidManifest.xml
@@ -17,6 +17,10 @@
package="com.skia.sampleapp"
android:versionCode="1"
android:versionName="1.0">
+ <!-- Needed to save a file to the file system. -->
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+ <!-- Needed to add to the download manager. -->
+ <uses-permission android:name="android.permission.INTERNET" />
<uses-sdk android:minSdkVersion="3" />
<application android:label="@string/app_name"
android:debuggable="true">
diff --git a/android_sample/SampleApp/jni/sample-jni.cpp b/android_sample/SampleApp/jni/sample-jni.cpp
index 4ba3b9dba2..a82256c31d 100644
--- a/android_sample/SampleApp/jni/sample-jni.cpp
+++ b/android_sample/SampleApp/jni/sample-jni.cpp
@@ -38,11 +38,13 @@ struct ActivityGlue {
jweak m_obj;
jmethodID m_setTitle;
jmethodID m_startTimer;
+ jmethodID m_addToDownloads;
ActivityGlue() {
m_env = NULL;
m_obj = NULL;
m_setTitle = NULL;
m_startTimer = NULL;
+ m_addToDownloads = NULL;
}
} gActivityGlue;
@@ -82,6 +84,24 @@ void SkOSWindow::onHandleInval(const SkIRect& rect)
gActivityGlue.m_env->CallVoidMethod(gWindowGlue.m_obj, gWindowGlue.m_inval);
}
+void SkOSWindow::onPDFSaved(const char title[], const char desc[],
+ const char path[])
+{
+ if (gActivityGlue.m_env) {
+ JNIEnv* env = gActivityGlue.m_env;
+ jstring jtitle = env->NewStringUTF(title);
+ jstring jdesc = env->NewStringUTF(desc);
+ jstring jpath = env->NewStringUTF(path);
+
+ env->CallVoidMethod(gActivityGlue.m_obj, gActivityGlue.m_addToDownloads,
+ jtitle, jdesc, jpath);
+
+ env->DeleteLocalRef(jtitle);
+ env->DeleteLocalRef(jdesc);
+ env->DeleteLocalRef(jpath);
+ }
+}
+
///////////////////////////////////////////
/////////////// SkEvent impl //////////////
///////////////////////////////////////////
@@ -151,6 +171,8 @@ JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_processSkEvent(
JNIEnv* env, jobject thiz);
JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_serviceQueueTimer(
JNIEnv* env, jobject thiz);
+JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_saveToPdf(
+ JNIEnv* env, jobject thiz);
};
JNIEXPORT bool JNICALL Java_com_skia_sampleapp_SampleApp_handleKeyDown(
@@ -217,6 +239,8 @@ JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_init(JNIEnv* env,
gActivityGlue.m_obj = env->NewWeakGlobalRef(thiz);
gActivityGlue.m_setTitle = GetJMethod(env, clazz, "setTitle",
"(Ljava/lang/CharSequence;)V");
+ gActivityGlue.m_addToDownloads = GetJMethod(env, clazz, "addToDownloads",
+ "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
gActivityGlue.m_startTimer = GetJMethod(gActivityGlue.m_env, clazz,
"startTimer", "(I)V");
env->DeleteLocalRef(clazz);
@@ -343,3 +367,9 @@ JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_serviceQueueTimer(
{
SkEvent::ServiceQueueTimer();
}
+
+JNIEXPORT void JNICALL Java_com_skia_sampleapp_SampleApp_saveToPdf(
+ JNIEnv* env, jobject thiz)
+{
+ gWindow->saveToPdf();
+}
diff --git a/android_sample/SampleApp/res/menu/sample.xml b/android_sample/SampleApp/res/menu/sample.xml
index 193f277762..96399bd94a 100644
--- a/android_sample/SampleApp/res/menu/sample.xml
+++ b/android_sample/SampleApp/res/menu/sample.xml
@@ -43,7 +43,8 @@
android:id="@+id/slideshow"
android:title="@string/slideshow"
/>
-<!--
- android:icon="@drawable/ic_menu_new_window"
--->
+ <item
+ android:id="@+id/save_to_pdf"
+ android:title="@string/save_to_pdf"
+ />
</menu>
diff --git a/android_sample/SampleApp/res/values/strings.xml b/android_sample/SampleApp/res/values/strings.xml
index 810ff41386..487f33576a 100644
--- a/android_sample/SampleApp/res/values/strings.xml
+++ b/android_sample/SampleApp/res/values/strings.xml
@@ -13,10 +13,13 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<resources>
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="app_name">SampleApp</string>
<string name="overview">Overview</string>
<string name="toggle_rendering">Toggle rendering</string>
<string name="slideshow">Slideshow</string>
<string name="fps">FPS</string>
+ <string name="file_saved"><xliff:g id="title">%s1</xliff:g> saved!</string>
+ <string name="failed">PDF creation failed</string>
+ <string name="save_to_pdf">Save as PDF</string>
</resources>
diff --git a/android_sample/SampleApp/src/com/skia/sampleapp/SampleApp.java b/android_sample/SampleApp/src/com/skia/sampleapp/SampleApp.java
index 370e143cc3..bdd9f2b5e6 100644
--- a/android_sample/SampleApp/src/com/skia/sampleapp/SampleApp.java
+++ b/android_sample/SampleApp/src/com/skia/sampleapp/SampleApp.java
@@ -17,6 +17,7 @@
package com.skia.sampleapp;
import android.app.Activity;
+import android.app.DownloadManager;
import android.content.Context;
import android.graphics.Canvas;
import android.opengl.GLSurfaceView;
@@ -32,10 +33,13 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
+import android.widget.Toast;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
+import java.io.File;
+
public class SampleApp extends Activity
{
private TextView mTitle;
@@ -126,6 +130,15 @@ public class SampleApp extends Activity
}
});
return true;
+ case R.id.save_to_pdf:
+ mView.queueEvent(new Runnable() {
+ @Override
+ public void run() {
+ saveToPdf();
+ }
+ });
+ return true;
+
default:
return false;
}
@@ -164,6 +177,7 @@ public class SampleApp extends Activity
}
private static final int SET_TITLE = 1;
+ private static final int TOAST_DOWNLOAD = 2;
private Handler mHandler = new Handler() {
@Override
@@ -173,6 +187,10 @@ public class SampleApp extends Activity
mTitle.setText((String) msg.obj);
SampleApp.this.getActionBar().setSubtitle((String) msg.obj);
break;
+ case TOAST_DOWNLOAD:
+ Toast.makeText(SampleApp.this, (String) msg.obj,
+ Toast.LENGTH_SHORT).show();
+ break;
default:
break;
}
@@ -186,6 +204,30 @@ public class SampleApp extends Activity
// Called by JNI
@SuppressWarnings("unused")
+ private void addToDownloads(final String title, final String desc,
+ final String path) {
+ File file = new File(path);
+ final long length = file.exists() ? file.length() : 0;
+ if (length == 0) {
+ String failed = getString(R.string.failed);
+ mHandler.obtainMessage(TOAST_DOWNLOAD, failed).sendToTarget();
+ return;
+ }
+ String toast = getString(R.string.file_saved).replace("%s", title);
+ mHandler.obtainMessage(TOAST_DOWNLOAD, toast).sendToTarget();
+ final DownloadManager manager = (DownloadManager) getSystemService(
+ Context.DOWNLOAD_SERVICE);
+ new Thread("Add pdf to downloads") {
+ @Override
+ public void run() {
+ manager.addCompletedDownload(title, desc, true,
+ "application/pdf", path, length, true);
+ }
+ }.start();
+ }
+
+ // Called by JNI
+ @SuppressWarnings("unused")
private void startTimer(int ms) {
// After the delay, queue an event to the Renderer's thread
// to handle the event on the timer queue
@@ -217,6 +259,7 @@ public class SampleApp extends Activity
native void toggleFps();
native void processSkEvent();
native void serviceQueueTimer();
+ native void saveToPdf();
static {
System.loadLibrary("skia-sample");