| /* |
| * Copyright 2012 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| package com.skia; |
| |
| import android.app.ActionBar; |
| import android.app.Activity; |
| import android.app.DownloadManager; |
| import android.content.Context; |
| import android.os.Build; |
| import android.os.Bundle; |
| import android.os.Handler; |
| import android.os.Message; |
| import android.view.KeyEvent; |
| import android.view.Menu; |
| import android.view.MenuItem; |
| import android.view.ViewGroup; |
| import android.widget.ArrayAdapter; |
| import android.widget.LinearLayout; |
| import android.widget.TextView; |
| import android.widget.Toast; |
| |
| import java.io.File; |
| |
| public class SkiaSampleActivity extends Activity |
| { |
| private TextView mTitle; |
| private SkiaSampleView mSampleView; |
| |
| private ArrayAdapter<String> mSlideList; |
| |
| @Override |
| public void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| |
| setContentView(R.layout.layout); |
| mTitle = (TextView) findViewById(R.id.title_view); |
| mSlideList = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1); |
| |
| try { |
| System.loadLibrary("skia_android"); |
| } catch (UnsatisfiedLinkError e) { |
| // This might be because skia was linked to SampleApp statically. |
| } |
| |
| try { |
| System.loadLibrary("SampleApp"); |
| |
| createSampleView(false, 0); |
| |
| setupActionBar(); |
| } catch (UnsatisfiedLinkError e) { |
| mTitle.setText("ERROR: native library could not be loaded"); |
| } |
| } |
| |
| private void createSampleView(boolean useOpenGLAPI, int msaaSampleCount) { |
| if (mSampleView != null) { |
| ViewGroup viewGroup = (ViewGroup) mSampleView.getParent(); |
| viewGroup.removeView(mSampleView); |
| mSampleView.terminate(); |
| } |
| |
| mSampleView = new SkiaSampleView(this, useOpenGLAPI, msaaSampleCount); |
| LinearLayout holder = (LinearLayout) findViewById(R.id.holder); |
| holder.addView(mSampleView, new LinearLayout.LayoutParams( |
| ViewGroup.LayoutParams.MATCH_PARENT, |
| ViewGroup.LayoutParams.MATCH_PARENT)); |
| } |
| |
| private void setupActionBar() { |
| ActionBar.OnNavigationListener navigationCallback = new ActionBar.OnNavigationListener() { |
| @Override |
| public boolean onNavigationItemSelected(int position, long itemId) { |
| mSampleView.goToSample(position); |
| return true; |
| } |
| }; |
| |
| ActionBar actionBar = getActionBar(); |
| actionBar.setDisplayShowHomeEnabled(false); |
| actionBar.setDisplayShowTitleEnabled(false); |
| actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); |
| actionBar.setListNavigationCallbacks(mSlideList, navigationCallback); |
| } |
| |
| @Override |
| protected void onResume () { |
| super.onResume(); |
| if (mSampleView != null && mSampleView.getWidth() > 0 && mSampleView.getHeight() > 0) { |
| //TODO try mSampleView.requestRender() instead |
| mSampleView.inval(); |
| } |
| } |
| |
| @Override |
| public void onDestroy() { |
| if (mSampleView != null) { |
| mSampleView.terminate(); |
| } |
| super.onDestroy(); |
| } |
| |
| @Override |
| public boolean onCreateOptionsMenu(Menu menu) { |
| getMenuInflater().inflate(R.menu.action_bar, menu); |
| return true; |
| } |
| |
| @Override |
| public boolean onPrepareOptionsMenu(Menu menu) { |
| if (mSampleView != null) { |
| if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { |
| ((MenuItem) menu.findItem(R.id.glcontext_menu)) |
| .setEnabled(false); |
| |
| } else { |
| boolean usesOpenGLAPI = mSampleView.getUsesOpenGLAPI(); |
| boolean isMSAA4 = mSampleView.getMSAASampleCount() == 4; |
| |
| ((MenuItem) menu.findItem(R.id.glcontext_opengles)) |
| .setChecked(!usesOpenGLAPI && !isMSAA4); |
| |
| ((MenuItem) menu.findItem(R.id.glcontext_msaa4_opengles)) |
| .setChecked(!usesOpenGLAPI && isMSAA4); |
| |
| ((MenuItem) menu.findItem(R.id.glcontext_opengl)) |
| .setChecked(usesOpenGLAPI && !isMSAA4); |
| |
| ((MenuItem) menu.findItem(R.id.glcontext_msaa4_opengl)) |
| .setChecked(usesOpenGLAPI && isMSAA4); |
| } |
| } |
| return true; |
| } |
| |
| @Override |
| public boolean onOptionsItemSelected(MenuItem item) { |
| if (mSampleView == null) { |
| return false; |
| } |
| |
| switch (item.getItemId()) { |
| case R.id.overview: |
| mSampleView.showOverview(); |
| return true; |
| case R.id.prev: |
| mSampleView.previousSample(); |
| return true; |
| case R.id.next: |
| mSampleView.nextSample(); |
| return true; |
| case R.id.toggle_rendering: |
| mSampleView.toggleRenderingMode(); |
| return true; |
| case R.id.slideshow: |
| mSampleView.toggleSlideshow(); |
| return true; |
| case R.id.fps: |
| mSampleView.toggleFPS(); |
| return true; |
| case R.id.tiling: |
| mSampleView.toggleTiling(); |
| return true; |
| case R.id.bbox: |
| mSampleView.toggleBBox(); |
| return true; |
| case R.id.save_to_pdf: |
| mSampleView.saveToPDF(); |
| return true; |
| case R.id.glcontext_opengles: |
| return setOpenGLContextSettings(false, 0); |
| case R.id.glcontext_msaa4_opengles: |
| return setOpenGLContextSettings(false, 4); |
| case R.id.glcontext_opengl: |
| return setOpenGLContextSettings(true, 0); |
| case R.id.glcontext_msaa4_opengl: |
| return setOpenGLContextSettings(true, 4); |
| default: |
| return false; |
| } |
| } |
| |
| @Override |
| public boolean dispatchKeyEvent(KeyEvent event) { |
| final int keycode = event.getKeyCode(); |
| if (keycode == KeyEvent.KEYCODE_BACK) { |
| if (event.getAction() == KeyEvent.ACTION_UP) { |
| finish(); |
| } |
| return true; |
| } |
| return false; |
| } |
| |
| private static final int SET_TITLE = 1; |
| private static final int SET_SLIDES = 2; |
| private static final int TOAST_DOWNLOAD = 3; |
| |
| private Handler mHandler = new Handler() { |
| @Override |
| public void handleMessage(Message msg) { |
| switch (msg.what) { |
| case SET_TITLE: |
| mTitle.setText((String) msg.obj); |
| SkiaSampleActivity.this.getActionBar().setSubtitle((String) msg.obj); |
| break; |
| case SET_SLIDES: |
| mSlideList.addAll((String[]) msg.obj); |
| break; |
| case TOAST_DOWNLOAD: |
| Toast.makeText(SkiaSampleActivity.this, (String) msg.obj, |
| Toast.LENGTH_SHORT).show(); |
| break; |
| default: |
| break; |
| } |
| } |
| }; |
| |
| // Called by JNI |
| @Override |
| public void setTitle(CharSequence title) { |
| mHandler.obtainMessage(SET_TITLE, title).sendToTarget(); |
| } |
| |
| // Called by JNI |
| public void setSlideList(String[] slideList) { |
| mHandler.obtainMessage(SET_SLIDES, slideList).sendToTarget(); |
| } |
| |
| // Called by JNI |
| public 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.save_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() { |
| final String mimeType = "application/pdf"; |
| manager.addCompletedDownload(title, desc, true, mimeType, path, length, true); |
| } |
| }.start(); |
| } |
| |
| private boolean setOpenGLContextSettings(boolean requestedOpenGLAPI, int requestedSampleCount) { |
| if (mSampleView != null && |
| mSampleView.getMSAASampleCount() == requestedSampleCount && |
| mSampleView.getUsesOpenGLAPI() == requestedOpenGLAPI) { |
| return true; |
| } |
| |
| createSampleView(requestedOpenGLAPI, requestedSampleCount); |
| |
| return true; |
| } |
| } |