10b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger/* 20b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * Copyright (C) 2011 Skia 30b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * 40b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * Licensed under the Apache License, Version 2.0 (the "License"); 50b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * you may not use this file except in compliance with the License. 60b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * You may obtain a copy of the License at 70b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * 80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * http://www.apache.org/licenses/LICENSE-2.0 90b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * 100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * Unless required by applicable law or agreed to in writing, software 110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * distributed under the License is distributed on an "AS IS" BASIS, 120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * See the License for the specific language governing permissions and 140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger * limitations under the License. 150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger */ 160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpackage com.skia.sampleapp; 180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerimport android.app.Activity; 200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerimport android.content.Context; 210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerimport android.graphics.Canvas; 220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerimport android.os.Bundle; 230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerimport android.util.AttributeSet; 240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerimport android.view.KeyEvent; 250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerimport android.view.MotionEvent; 260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerimport android.view.View; 270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerimport android.view.ViewGroup; 280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerimport android.widget.LinearLayout; 290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerimport android.widget.TextView; 300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic class SampleApp extends Activity 320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger{ 330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger private TextView mTitle; 340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger public class SampleView extends View { 360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger public SampleView(Context context) { 370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger super(context); 380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger createOSWindow(this); 390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger @Override 420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger protected void onDraw(Canvas canvas) { 430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger drawToCanvas(canvas); 440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger @Override 470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger protected void onSizeChanged(int w, int h, int oldw, int oldh) { 480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger updateSize(w, h); 490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger @Override 520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger public boolean onTouchEvent(MotionEvent event) { 530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger final int x = (int) event.getX(); 540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger final int y = (int) event.getY(); 550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger final int action = event.getAction(); 560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger handleClick(x, y, action); 570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return true; 580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger @Override 620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger public void onCreate(Bundle savedInstanceState) 630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger super.onCreate(savedInstanceState); 650b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 660b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger init(); 670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger setContentView(R.layout.layout); 680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger mTitle = (TextView) findViewById(R.id.title_view); 690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger LinearLayout holder = (LinearLayout) findViewById(R.id.holder); 700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger View view = new SampleView(this); 710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger holder.addView(view, new LinearLayout.LayoutParams( 720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ViewGroup.LayoutParams.MATCH_PARENT, 730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger ViewGroup.LayoutParams.MATCH_PARENT)); 740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger @Override 770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger public void onDestroy() 780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger { 790b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger term(); 800b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger super.onDestroy(); 810b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 820b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 830b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger @Override 840b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger public boolean dispatchKeyEvent(KeyEvent event) { 850b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger switch (event.getAction()) { 860b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger case KeyEvent.ACTION_DOWN: 870b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger int uni = event.getUnicodeChar(event.getMetaState()); 880b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return handleKeyDown(event.getKeyCode(), uni); 890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger case KeyEvent.ACTION_UP: 900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return handleKeyUp(event.getKeyCode()); 910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger default: 920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger return false; 930b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 960b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger @Override 970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger public void setTitle(CharSequence title) { 980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger mTitle.setText(title); 990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger private native void drawToCanvas(Canvas canvas); 1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger private native void init(); 1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger private native void term(); 1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger // Currently depends on init having already been called. 1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger private native void createOSWindow(SampleView view); 1060b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger private native void updateSize(int w, int h); 1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger private native void handleClick(int x, int y, int state); 1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger private native boolean handleKeyDown(int key, int uni); 1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger private native boolean handleKeyUp(int key); 1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger 1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger static { 1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger System.loadLibrary("skia-sample"); 1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger } 1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} 115