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