11fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi/* 21fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi * Copyright (C) 2015 The Android Open Source Project 31fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi * 41fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi * Licensed under the Apache License, Version 2.0 (the "License"); 51fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi * you may not use this file except in compliance with the License. 61fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi * You may obtain a copy of the License at 71fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi * 81fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi * http://www.apache.org/licenses/LICENSE-2.0 91fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi * 101fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi * Unless required by applicable law or agreed to in writing, software 111fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi * distributed under the License is distributed on an "AS IS" BASIS, 121fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi * See the License for the specific language governing permissions and 141fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi * limitations under the License. 151fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi */ 161fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi 171fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggipackage com.android.systemui.stackdivider; 181fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi 191fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggiimport android.content.Context; 201fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggiimport android.graphics.PixelFormat; 211fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggiimport android.view.View; 221fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggiimport android.view.WindowManager; 231fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi 241fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggiimport static android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; 2542625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggiimport static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; 261fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggiimport static android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; 271fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggiimport static android.view.WindowManager.LayoutParams.FLAG_SLIPPERY; 281fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggiimport static android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH; 291fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggiimport static android.view.WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH; 302e95a488e0a12d4263d101e888fdd89fd123aec3Jorim Jaggiimport static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION; 311fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggiimport static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; 321fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi 331fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi/** 341fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi * Manages the window parameters of the docked stack divider. 351fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi */ 361fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggipublic class DividerWindowManager { 371fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi 381fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi private static final String WINDOW_TITLE = "DockedStackDivider"; 391fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi 401fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi private final WindowManager mWindowManager; 411fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi private WindowManager.LayoutParams mLp; 421fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi private View mView; 431fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi 441fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi public DividerWindowManager(Context ctx) { 451fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi mWindowManager = ctx.getSystemService(WindowManager.class); 461fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi } 471fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi 481fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi public void add(View view, int width, int height) { 491fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi mLp = new WindowManager.LayoutParams( 501fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi width, height, TYPE_DOCK_DIVIDER, 511fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL 521fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi | FLAG_WATCH_OUTSIDE_TOUCH | FLAG_SPLIT_TOUCH | FLAG_SLIPPERY, 531fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi PixelFormat.TRANSLUCENT); 541fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi mLp.setTitle(WINDOW_TITLE); 552e95a488e0a12d4263d101e888fdd89fd123aec3Jorim Jaggi mLp.privateFlags |= PRIVATE_FLAG_NO_MOVE_ANIMATION; 5681fe2d1f0adc9e752d7f1a410d66af6a326fd6e2Jorim Jaggi view.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 5781fe2d1f0adc9e752d7f1a410d66af6a326fd6e2Jorim Jaggi | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 5881fe2d1f0adc9e752d7f1a410d66af6a326fd6e2Jorim Jaggi | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); 591fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi mWindowManager.addView(view, mLp); 601fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi mView = view; 611fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi } 621fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi 631fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi public void remove() { 641fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi if (mView != null) { 651fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi mWindowManager.removeView(mView); 661fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi } 671fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi mView = null; 681fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi } 691fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi 701fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi public void setSlippery(boolean slippery) { 711fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi boolean changed = false; 721fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi if (slippery && (mLp.flags & FLAG_SLIPPERY) == 0) { 731fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi mLp.flags |= FLAG_SLIPPERY; 741fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi changed = true; 751fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi } else if (!slippery && (mLp.flags & FLAG_SLIPPERY) != 0) { 761fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi mLp.flags &= ~FLAG_SLIPPERY; 771fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi changed = true; 781fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi } 791fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi if (changed) { 801fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi mWindowManager.updateViewLayout(mView, mLp); 811fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi } 821fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi } 8342625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi 8442625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi public void setTouchable(boolean touchable) { 8542625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi boolean changed = false; 8642625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi if (!touchable && (mLp.flags & FLAG_NOT_TOUCHABLE) == 0) { 8742625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi mLp.flags |= FLAG_NOT_TOUCHABLE; 8842625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi changed = true; 8942625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi } else if (touchable && (mLp.flags & FLAG_NOT_TOUCHABLE) != 0) { 9042625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi mLp.flags &= ~FLAG_NOT_TOUCHABLE; 9142625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi changed = true; 9242625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi } 9342625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi if (changed) { 9442625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi mWindowManager.updateViewLayout(mView, mLp); 9542625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi } 9642625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi } 971fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi} 98