16804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick/*
26804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick * Copyright (C) 2010 The Android Open Source Project
36804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick *
46804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick * Licensed under the Apache License, Version 2.0 (the "License");
56804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick * you may not use this file except in compliance with the License.
66804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick * You may obtain a copy of the License at
76804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick *
86804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick *      http://www.apache.org/licenses/LICENSE-2.0
96804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick *
106804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick * Unless required by applicable law or agreed to in writing, software
116804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick * distributed under the License is distributed on an "AS IS" BASIS,
126804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick * See the License for the specific language governing permissions and
146804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick * limitations under the License.
156804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick */
166804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornpackage com.android.server.wm;
18a924dc0db952fe32509435fdb8dc9c84a9e181f3Dianne Hackborn
196804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
206804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrickimport android.graphics.Canvas;
216804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrickimport android.graphics.Color;
226804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrickimport android.graphics.PixelFormat;
236804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrickimport android.graphics.Rect;
246804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrickimport android.graphics.Region;
256804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrickimport android.view.Display;
26a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkinimport android.view.Surface.OutOfResourcesException;
276804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrickimport android.view.Surface;
283866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopianimport android.view.SurfaceControl;
296804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrickimport android.view.SurfaceSession;
306804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
316804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrickclass StrictModeFlash {
326804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    private static final String TAG = "StrictModeFlash";
336804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
343866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    private final SurfaceControl mSurfaceControl;
353866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    private final Surface mSurface = new Surface();
363866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    private int mLastDW;
373866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    private int mLastDH;
383866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    private boolean mDrawNeeded;
393866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian    private final int mThickness = 20;
406804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
416804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    public StrictModeFlash(Display display, SurfaceSession session) {
423866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        SurfaceControl ctrl = null;
436804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        try {
443866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            ctrl = new SurfaceControl(session, "StrictModeFlash",
453866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian                1, 1, PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN);
463866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            ctrl.setLayerStack(display.getLayerStack());
473866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            ctrl.setLayer(WindowManagerService.TYPE_LAYER_MULTIPLIER * 101);  // one more than Watermark? arbitrary.
483866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            ctrl.setPosition(0, 0);
493866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            ctrl.show();
503866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            mSurface.copyFrom(ctrl);
51a86ab640f7bb0bf3cb4eaed80473ca8c5d131903Igor Murashkin        } catch (OutOfResourcesException e) {
526804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        }
533866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        mSurfaceControl = ctrl;
546804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        mDrawNeeded = true;
556804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    }
566804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
576804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    private void drawIfNeeded() {
586804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        if (!mDrawNeeded) {
596804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            return;
606804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        }
616804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        mDrawNeeded = false;
626804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        final int dw = mLastDW;
636804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        final int dh = mLastDH;
646804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
656804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        Rect dirty = new Rect(0, 0, dw, dh);
666804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        Canvas c = null;
676804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        try {
686804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            c = mSurface.lockCanvas(dirty);
696804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        } catch (IllegalArgumentException e) {
706804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        } catch (Surface.OutOfResourcesException e) {
716804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        }
726804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        if (c == null) {
736804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            return;
746804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        }
756804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
766804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        // Top
776804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        c.clipRect(new Rect(0, 0, dw, mThickness), Region.Op.REPLACE);
786804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        c.drawColor(Color.RED);
796804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        // Left
806804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        c.clipRect(new Rect(0, 0, mThickness, dh), Region.Op.REPLACE);
816804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        c.drawColor(Color.RED);
826804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        // Right
836804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        c.clipRect(new Rect(dw - mThickness, 0, dw, dh), Region.Op.REPLACE);
846804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        c.drawColor(Color.RED);
856804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        // Bottom
866804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        c.clipRect(new Rect(0, dh - mThickness, dw, dh), Region.Op.REPLACE);
876804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        c.drawColor(Color.RED);
886804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
896804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        mSurface.unlockCanvasAndPost(c);
906804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    }
916804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
926804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    // Note: caller responsible for being inside
936804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    // Surface.openTransaction() / closeTransaction()
946804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    public void setVisibility(boolean on) {
953866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        if (mSurfaceControl == null) {
966804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            return;
976804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        }
986804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        drawIfNeeded();
996804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        if (on) {
1003866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            mSurfaceControl.show();
1016804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        } else {
1023866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian            mSurfaceControl.hide();
1036804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        }
1046804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    }
1056804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
1066804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    void positionSurface(int dw, int dh) {
1076804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        if (mLastDW == dw && mLastDH == dh) {
1086804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick            return;
1096804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        }
1106804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        mLastDW = dw;
1116804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        mLastDH = dh;
1123866f0d581ceaa165710feeee9f37fe1b0d7067dMathias Agopian        mSurfaceControl.setSize(dw, dh);
1136804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick        mDrawNeeded = true;
1146804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick    }
1156804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick
1166804433b0af50f33a338307ae8ddb50bc49e886bBrad Fitzpatrick}
117