114d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung/*
214d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung * Copyright (C) 2010 The Android Open Source Project
314d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung *
414d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung * Licensed under the Apache License, Version 2.0 (the "License");
514d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung * you may not use this file except in compliance with the License.
614d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung * You may obtain a copy of the License at
714d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung *
814d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung *      http://www.apache.org/licenses/LICENSE-2.0
914d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung *
1014d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung * Unless required by applicable law or agreed to in writing, software
1114d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung * distributed under the License is distributed on an "AS IS" BASIS,
1214d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1314d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung * See the License for the specific language governing permissions and
1414d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung * limitations under the License.
1514d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung */
1614d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
1714d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chungpackage com.android.galaxy4;
1814d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
1914d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chungimport android.graphics.PixelFormat;
2014d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chungimport android.os.Bundle;
2114d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chungimport android.os.Handler;
2214d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chungimport android.os.Message;
2314d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chungimport android.renderscript.RenderScript;
2414d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chungimport android.renderscript.RenderScriptGL;
25a5a0fb88861b6ada41bad777f42421cbebd193fdLeon Hongimport android.util.DisplayMetrics;
2614d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chungimport android.service.wallpaper.WallpaperService;
2714d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chungimport android.view.Surface;
2814d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chungimport android.view.SurfaceHolder;
29a5a0fb88861b6ada41bad777f42421cbebd193fdLeon Hongimport android.view.WindowManager;
30a5a0fb88861b6ada41bad777f42421cbebd193fdLeon Hongimport android.app.Service;
3114d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
3214d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chungpublic class Galaxy4Wallpaper extends WallpaperService {
3314d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
3414d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung    @Override
3514d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung    public Engine onCreateEngine() {
3614d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        return new RenderScriptEngine();
3714d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung    }
3814d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
3914d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung    private class RenderScriptEngine extends Engine {
4014d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        private RenderScriptGL mRenderScript = null;
4114d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        private GalaxyRS mWallpaperRS = null;
42a5a0fb88861b6ada41bad777f42421cbebd193fdLeon Hong        private int mDensityDPI;
4314d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
4414d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        @Override
4514d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        public void onCreate(SurfaceHolder surfaceHolder) {
4614d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            super.onCreate(surfaceHolder);
4714d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            setTouchEventsEnabled(true);
4814d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            surfaceHolder.setSizeFromLayout();
4914d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            surfaceHolder.setFormat(PixelFormat.RGBA_8888);
50a5a0fb88861b6ada41bad777f42421cbebd193fdLeon Hong
51a5a0fb88861b6ada41bad777f42421cbebd193fdLeon Hong            DisplayMetrics metrics = new DisplayMetrics();
52a5a0fb88861b6ada41bad777f42421cbebd193fdLeon Hong            ((WindowManager) getApplication().getSystemService(Service.WINDOW_SERVICE))
53a5a0fb88861b6ada41bad777f42421cbebd193fdLeon Hong                    .getDefaultDisplay().getMetrics(metrics);
54a5a0fb88861b6ada41bad777f42421cbebd193fdLeon Hong            mDensityDPI = metrics.densityDpi;
5514d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        }
5614d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
5714d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        @Override
5814d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        public void onDestroy() {
5914d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            super.onDestroy();
6014d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            destroyRenderer();
6114d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        }
6214d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
6314d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        public void destroyRenderer() {
6414d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            if (mWallpaperRS != null) {
6514d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung                mWallpaperRS.stop();
6614d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung                mWallpaperRS = null;
6714d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            }
6814d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
6914d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            if (mRenderScript != null) {
7014d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung                mRenderScript.setSurface(null, 0, 0);
7114d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung                mRenderScript.destroy();
7214d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung                mRenderScript = null;
7314d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            }
7414d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        }
7514d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
7614d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        @Override
7714d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        public void onSurfaceCreated(SurfaceHolder surfaceHolder) {
7814d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            super.onSurfaceCreated(surfaceHolder);
7914d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
8014d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig();
8114d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            mRenderScript = new RenderScriptGL(Galaxy4Wallpaper.this, sc);
8214d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            mRenderScript.setPriority(RenderScript.Priority.LOW);
8314d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        }
8414d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
8514d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        @Override
8614d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        public void onSurfaceDestroyed(SurfaceHolder surfaceHolder) {
8714d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            super.onSurfaceDestroyed(surfaceHolder);
8814d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            destroyRenderer();
8914d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        }
9014d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
9114d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        @Override
92a5a0fb88861b6ada41bad777f42421cbebd193fdLeon Hong        public void onSurfaceChanged(SurfaceHolder surfaceHolder,
93a5a0fb88861b6ada41bad777f42421cbebd193fdLeon Hong                                     int format, int width, int height) {
9414d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            super.onSurfaceChanged(surfaceHolder, format, width, height);
9514d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
9614d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            if (mRenderScript != null) {
9714d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung                mRenderScript.setSurface(surfaceHolder, width, height);
9814d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            }
9914d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
10014d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            if (mWallpaperRS == null) {
10114d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung                mWallpaperRS = new GalaxyRS();
102a5a0fb88861b6ada41bad777f42421cbebd193fdLeon Hong                mWallpaperRS.init(mDensityDPI, mRenderScript, getResources(), width, height);
10314d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung                mWallpaperRS.start();
104a5a0fb88861b6ada41bad777f42421cbebd193fdLeon Hong            } else {
105a5a0fb88861b6ada41bad777f42421cbebd193fdLeon Hong                mWallpaperRS.resize(width, height);
10614d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            }
10714d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
10814d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        }
10914d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
11014d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        @Override
11114d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        public Bundle onCommand(String action, int x, int y, int z, Bundle extras,
11214d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung                boolean resultRequested) {
11314d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            if (mWallpaperRS != null) {
11414d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung                // return mWallpaperRS.onCommand(action, x, y, z, extras, resultRequested);
11514d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            }
11614d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            return null;
11714d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        }
11814d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung
11914d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        @Override
12014d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        public void onVisibilityChanged(boolean visible) {
12114d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            super.onVisibilityChanged(visible);
12214d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            if (mWallpaperRS != null) {
12314d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung                if (visible) {
12414d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung                    mWallpaperRS.start();
12514d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung                } else {
12614d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung                    mWallpaperRS.stop();
12714d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung                }
12814d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung            }
12914d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung        }
13014d79ccc9f72e86d9119faa979923cc191a8ca25Winson Chung    }
131a5a0fb88861b6ada41bad777f42421cbebd193fdLeon Hong}