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