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