1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 package com.skia; 9 10 import android.app.ActionBar; 11 import android.app.Activity; 12 import android.app.DownloadManager; 13 import android.content.Intent; 14 import android.content.Context; 15 import android.os.Build; 16 import android.os.Bundle; 17 import android.os.Handler; 18 import android.os.Message; 19 import android.view.KeyEvent; 20 import android.view.Menu; 21 import android.view.MenuItem; 22 import android.view.ViewGroup; 23 import android.widget.ArrayAdapter; 24 import android.widget.LinearLayout; 25 import android.widget.TextView; 26 27 import java.io.File; 28 29 public class SkiaSampleActivity extends Activity 30 { 31 private TextView mTitle; 32 private SkiaSampleView mSampleView; 33 34 private ArrayAdapter<String> mSlideList; 35 36 @Override onCreate(Bundle savedInstanceState)37 public void onCreate(Bundle savedInstanceState) { 38 super.onCreate(savedInstanceState); 39 40 setContentView(R.layout.layout); 41 mTitle = (TextView) findViewById(R.id.title_view); 42 mSlideList = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1); 43 44 try { 45 System.loadLibrary("skia_android"); 46 } catch (UnsatisfiedLinkError e) { 47 // This might be because skia was linked to SampleApp statically. 48 } 49 50 try { 51 System.loadLibrary("SampleApp"); 52 53 createSampleView(false, 0); 54 55 setupActionBar(); 56 } catch (UnsatisfiedLinkError e) { 57 mTitle.setText("ERROR: native library could not be loaded"); 58 } 59 } 60 createSampleView(boolean useOpenGLAPI, int msaaSampleCount)61 private void createSampleView(boolean useOpenGLAPI, int msaaSampleCount) { 62 if (mSampleView != null) { 63 ViewGroup viewGroup = (ViewGroup) mSampleView.getParent(); 64 viewGroup.removeView(mSampleView); 65 mSampleView.terminate(); 66 } 67 68 // intent get intent extras if triggered from the command line 69 Intent intent = this.getIntent(); 70 String flags = intent.getStringExtra("cmdLineFlags"); 71 72 if (flags == null || flags.isEmpty()) { 73 flags = "--pictureDir /data/local/tmp/skia_skp "; 74 flags += "--resourcePath /data/local/tmp/skia_resources "; 75 } 76 77 mSampleView = new SkiaSampleView(this, flags, useOpenGLAPI, msaaSampleCount); 78 LinearLayout holder = (LinearLayout) findViewById(R.id.holder); 79 holder.addView(mSampleView, new LinearLayout.LayoutParams( 80 ViewGroup.LayoutParams.MATCH_PARENT, 81 ViewGroup.LayoutParams.MATCH_PARENT)); 82 } 83 setupActionBar()84 private void setupActionBar() { 85 ActionBar.OnNavigationListener navigationCallback = new ActionBar.OnNavigationListener() { 86 @Override 87 public boolean onNavigationItemSelected(int position, long itemId) { 88 mSampleView.goToSample(position); 89 return true; 90 } 91 }; 92 93 ActionBar actionBar = getActionBar(); 94 actionBar.setDisplayShowHomeEnabled(false); 95 actionBar.setDisplayShowTitleEnabled(false); 96 actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); 97 actionBar.setListNavigationCallbacks(mSlideList, navigationCallback); 98 } 99 100 @Override onResume()101 protected void onResume () { 102 super.onResume(); 103 if (mSampleView != null && mSampleView.getWidth() > 0 && mSampleView.getHeight() > 0) { 104 //TODO try mSampleView.requestRender() instead 105 mSampleView.inval(); 106 } 107 } 108 109 @Override onDestroy()110 public void onDestroy() { 111 if (mSampleView != null) { 112 mSampleView.terminate(); 113 } 114 super.onDestroy(); 115 } 116 117 @Override onCreateOptionsMenu(Menu menu)118 public boolean onCreateOptionsMenu(Menu menu) { 119 getMenuInflater().inflate(R.menu.action_bar, menu); 120 return true; 121 } 122 123 @Override onPrepareOptionsMenu(Menu menu)124 public boolean onPrepareOptionsMenu(Menu menu) { 125 if (mSampleView != null) { 126 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { 127 ((MenuItem) menu.findItem(R.id.glcontext_menu)) 128 .setEnabled(false); 129 130 } else { 131 boolean usesOpenGLAPI = mSampleView.getUsesOpenGLAPI(); 132 boolean isMSAA4 = mSampleView.getMSAASampleCount() == 4; 133 134 ((MenuItem) menu.findItem(R.id.glcontext_opengles)) 135 .setChecked(!usesOpenGLAPI && !isMSAA4); 136 137 ((MenuItem) menu.findItem(R.id.glcontext_msaa4_opengles)) 138 .setChecked(!usesOpenGLAPI && isMSAA4); 139 140 ((MenuItem) menu.findItem(R.id.glcontext_opengl)) 141 .setChecked(usesOpenGLAPI && !isMSAA4); 142 143 ((MenuItem) menu.findItem(R.id.glcontext_msaa4_opengl)) 144 .setChecked(usesOpenGLAPI && isMSAA4); 145 } 146 } 147 return true; 148 } 149 150 @Override onOptionsItemSelected(MenuItem item)151 public boolean onOptionsItemSelected(MenuItem item) { 152 if (mSampleView == null) { 153 return false; 154 } 155 156 switch (item.getItemId()) { 157 case R.id.overview: 158 mSampleView.showOverview(); 159 return true; 160 case R.id.prev: 161 mSampleView.previousSample(); 162 return true; 163 case R.id.next: 164 mSampleView.nextSample(); 165 return true; 166 case R.id.toggle_rendering: 167 mSampleView.toggleRenderingMode(); 168 return true; 169 case R.id.slideshow: 170 mSampleView.toggleSlideshow(); 171 return true; 172 case R.id.fps: 173 mSampleView.toggleFPS(); 174 return true; 175 case R.id.tiling: 176 mSampleView.toggleTiling(); 177 return true; 178 case R.id.bbox: 179 mSampleView.toggleBBox(); 180 return true; 181 case R.id.save_to_pdf: 182 mSampleView.saveToPDF(); 183 return true; 184 case R.id.glcontext_opengles: 185 return setOpenGLContextSettings(false, 0); 186 case R.id.glcontext_msaa4_opengles: 187 return setOpenGLContextSettings(false, 4); 188 case R.id.glcontext_opengl: 189 return setOpenGLContextSettings(true, 0); 190 case R.id.glcontext_msaa4_opengl: 191 return setOpenGLContextSettings(true, 4); 192 default: 193 return false; 194 } 195 } 196 197 @Override dispatchKeyEvent(KeyEvent event)198 public boolean dispatchKeyEvent(KeyEvent event) { 199 final int keycode = event.getKeyCode(); 200 if (keycode == KeyEvent.KEYCODE_BACK) { 201 if (event.getAction() == KeyEvent.ACTION_UP) { 202 finish(); 203 } 204 return true; 205 } 206 return false; 207 } 208 209 private static final int SET_TITLE = 1; 210 private static final int SET_SLIDES = 2; 211 212 private Handler mHandler = new Handler() { 213 @Override 214 public void handleMessage(Message msg) { 215 switch (msg.what) { 216 case SET_TITLE: 217 mTitle.setText((String) msg.obj); 218 SkiaSampleActivity.this.getActionBar().setSubtitle((String) msg.obj); 219 break; 220 case SET_SLIDES: 221 mSlideList.addAll((String[]) msg.obj); 222 break; 223 default: 224 break; 225 } 226 } 227 }; 228 229 // Called by JNI 230 @Override setTitle(CharSequence title)231 public void setTitle(CharSequence title) { 232 mHandler.obtainMessage(SET_TITLE, title).sendToTarget(); 233 } 234 235 // Called by JNI setSlideList(String[] slideList)236 public void setSlideList(String[] slideList) { 237 mHandler.obtainMessage(SET_SLIDES, slideList).sendToTarget(); 238 } 239 setOpenGLContextSettings(boolean requestedOpenGLAPI, int requestedSampleCount)240 private boolean setOpenGLContextSettings(boolean requestedOpenGLAPI, int requestedSampleCount) { 241 if (mSampleView != null && 242 mSampleView.getMSAASampleCount() == requestedSampleCount && 243 mSampleView.getUsesOpenGLAPI() == requestedOpenGLAPI) { 244 return true; 245 } 246 247 createSampleView(requestedOpenGLAPI, requestedSampleCount); 248 249 return true; 250 } 251 } 252