diff options
author | Scroggo <Scroggo@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-06-21 14:44:57 +0000 |
---|---|---|
committer | Scroggo <Scroggo@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-06-21 14:44:57 +0000 |
commit | 8ac0d542b0226e68b0faa935b3402ffc91409a02 (patch) | |
tree | 0d4eca1c5c49361c036b368fd6affd3c53e55a3d /android_sample/SampleApp | |
parent | ccb74eabccf19f66b6bf31f4acae89b62baa16c3 (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.mk | 13 | ||||
-rw-r--r-- | android_sample/SampleApp/AndroidManifest.xml | 4 | ||||
-rw-r--r-- | android_sample/SampleApp/jni/sample-jni.cpp | 30 | ||||
-rw-r--r-- | android_sample/SampleApp/res/menu/sample.xml | 7 | ||||
-rw-r--r-- | android_sample/SampleApp/res/values/strings.xml | 5 | ||||
-rw-r--r-- | android_sample/SampleApp/src/com/skia/sampleapp/SampleApp.java | 43 |
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"); |