blob: 746f9c548222385eb98bf532e8d3f46ee5d2c9d7 [file] [log] [blame]
Romain Guy44da1782009-08-28 11:03:21 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Romain Guy44da1782009-08-28 11:03:21 -070017package com.android.wallpaper;
18
19import android.service.wallpaper.WallpaperService;
Mike Cleronc9e42c22009-10-23 16:54:59 -070020import android.os.Bundle;
Jason Samsb418c5c2010-02-09 16:01:16 -080021import android.renderscript.RenderScriptGL;
Romain Guy44da1782009-08-28 11:03:21 -070022import android.renderscript.RenderScript;
23import android.view.SurfaceHolder;
24import android.view.Surface;
25
26public abstract class RenderScriptWallpaper<T extends RenderScriptScene> extends WallpaperService {
27 public Engine onCreateEngine() {
28 return new RenderScriptEngine();
29 }
30
31 protected abstract T createScene(int width, int height);
32
33 private class RenderScriptEngine extends Engine {
Jason Samsb418c5c2010-02-09 16:01:16 -080034 private RenderScriptGL mRs;
Romain Guy44da1782009-08-28 11:03:21 -070035 private T mRenderer;
36
37 @Override
38 public void onCreate(SurfaceHolder surfaceHolder) {
39 super.onCreate(surfaceHolder);
40 setTouchEventsEnabled(false);
41 surfaceHolder.setSizeFromLayout();
42 }
43
44 @Override
45 public void onDestroy() {
46 super.onDestroy();
47 destroyRenderer();
48 }
49
50 private void destroyRenderer() {
51 if (mRenderer != null) {
52 mRenderer.stop();
53 mRenderer = null;
54 }
55 if (mRs != null) {
56 mRs.destroy();
57 mRs = null;
Jason Sams9182eb02009-11-12 14:11:28 -080058 }
Romain Guy44da1782009-08-28 11:03:21 -070059 }
60
61 @Override
62 public void onVisibilityChanged(boolean visible) {
63 super.onVisibilityChanged(visible);
Romain Guyd1151902009-09-16 12:35:46 -070064 if (mRenderer != null) {
65 if (visible) {
Jason Sams9182eb02009-11-12 14:11:28 -080066 mRenderer.start();
Romain Guyd1151902009-09-16 12:35:46 -070067 } else {
68 mRenderer.stop();
69 }
Romain Guy44da1782009-08-28 11:03:21 -070070 }
71 }
72
73 @Override
74 public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
75 super.onSurfaceChanged(holder, format, width, height);
Jason Sams9182eb02009-11-12 14:11:28 -080076 if (mRs != null) {
77 mRs.contextSetSurface(width, height, holder.getSurface());
78 }
Romain Guy44da1782009-08-28 11:03:21 -070079 if (mRenderer == null) {
80 mRenderer = createScene(width, height);
Romain Guy0ac0b3f2009-09-13 03:40:04 -070081 mRenderer.init(mRs, getResources(), isPreview());
Romain Guy44da1782009-08-28 11:03:21 -070082 mRenderer.start();
83 } else {
84 mRenderer.resize(width, height);
85 }
86 }
87
88 @Override
Jason Sams9182eb02009-11-12 14:11:28 -080089 public void onOffsetsChanged(float xOffset, float yOffset,
Marco Nelissen06d20762009-11-09 15:40:07 -080090 float xStep, float yStep, int xPixels, int yPixels) {
Romain Guy44da1782009-08-28 11:03:21 -070091 mRenderer.setOffset(xOffset, yOffset, xPixels, yPixels);
92 }
93
94 @Override
95 public void onSurfaceCreated(SurfaceHolder holder) {
96 super.onSurfaceCreated(holder);
97
98 Surface surface = null;
99 while (surface == null) {
100 surface = holder.getSurface();
101 }
Jason Samsb418c5c2010-02-09 16:01:16 -0800102 mRs = new RenderScriptGL(false, false);
Jason Samsecf51762009-11-12 17:48:44 -0800103 mRs.contextSetPriority(RenderScript.Priority.LOW);
Romain Guy44da1782009-08-28 11:03:21 -0700104 }
105
106 @Override
107 public void onSurfaceDestroyed(SurfaceHolder holder) {
108 super.onSurfaceDestroyed(holder);
109 destroyRenderer();
110 }
Mike Cleronc9e42c22009-10-23 16:54:59 -0700111
112 @Override
113 public Bundle onCommand(String action, int x, int y, int z,
114 Bundle extras, boolean resultRequested) {
115 return mRenderer.onCommand(action, x, y, z, extras, resultRequested);
116 }
Jason Sams9182eb02009-11-12 14:11:28 -0800117
Romain Guy44da1782009-08-28 11:03:21 -0700118 }
119}