1 /*
2  * Copyright (C) 2019 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.view;
18 
19 import static android.view.View.NAVIGATION_BAR_TRANSLUCENT;
20 import static android.view.View.NAVIGATION_BAR_TRANSPARENT;
21 import static android.view.View.STATUS_BAR_TRANSLUCENT;
22 import static android.view.View.STATUS_BAR_TRANSPARENT;
23 import static android.view.View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
24 import static android.view.View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
25 import static android.view.View.SYSTEM_UI_FLAG_LOW_PROFILE;
26 import static android.view.WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS;
27 import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
28 import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS;
29 import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_NAVIGATION_BARS;
30 import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_STATUS_BARS;
31 import static android.view.WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE;
32 import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
33 
34 import android.view.WindowInsetsController.Appearance;
35 import android.view.WindowInsetsController.Behavior;
36 
37 /**
38  * Contains the information about {@link Appearance} and {@link Behavior} of system windows which
39  * can produce insets. This is for carrying the request from a client to the system server.
40  * @hide
41  */
42 public class InsetsFlags {
43 
44     @ViewDebug.ExportedProperty(flagMapping = {
45             @ViewDebug.FlagToString(
46                     mask = APPEARANCE_OPAQUE_STATUS_BARS,
47                     equals = APPEARANCE_OPAQUE_STATUS_BARS,
48                     name = "OPAQUE_STATUS_BARS"),
49             @ViewDebug.FlagToString(
50                     mask = APPEARANCE_OPAQUE_NAVIGATION_BARS,
51                     equals = APPEARANCE_OPAQUE_NAVIGATION_BARS,
52                     name = "OPAQUE_NAVIGATION_BARS"),
53             @ViewDebug.FlagToString(
54                     mask = APPEARANCE_LOW_PROFILE_BARS,
55                     equals = APPEARANCE_LOW_PROFILE_BARS,
56                     name = "LOW_PROFILE_BARS"),
57             @ViewDebug.FlagToString(
58                     mask = APPEARANCE_LIGHT_STATUS_BARS,
59                     equals = APPEARANCE_LIGHT_STATUS_BARS,
60                     name = "LIGHT_STATUS_BARS"),
61             @ViewDebug.FlagToString(
62                     mask = APPEARANCE_LIGHT_NAVIGATION_BARS,
63                     equals = APPEARANCE_LIGHT_NAVIGATION_BARS,
64                     name = "LIGHT_NAVIGATION_BARS")
65     })
66     public @Appearance int appearance;
67 
68     @ViewDebug.ExportedProperty(flagMapping = {
69             @ViewDebug.FlagToString(
70                     mask = BEHAVIOR_SHOW_BARS_BY_SWIPE,
71                     equals = BEHAVIOR_SHOW_BARS_BY_SWIPE,
72                     name = "SHOW_BARS_BY_SWIPE"),
73             @ViewDebug.FlagToString(
74                     mask = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE,
75                     equals = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE,
76                     name = "SHOW_TRANSIENT_BARS_BY_SWIPE")
77     })
78     public @Behavior int behavior;
79 
80     /**
81      * Converts system UI visibility to appearance.
82      *
83      * @param systemUiVisibility the system UI visibility to be converted.
84      * @return the outcome {@link Appearance}
85      */
getAppearance(int systemUiVisibility)86     public static @Appearance int getAppearance(int systemUiVisibility) {
87         int appearance = 0;
88         appearance |= convertFlag(systemUiVisibility, SYSTEM_UI_FLAG_LOW_PROFILE,
89                 APPEARANCE_LOW_PROFILE_BARS);
90         appearance |= convertFlag(systemUiVisibility, SYSTEM_UI_FLAG_LIGHT_STATUS_BAR,
91                 APPEARANCE_LIGHT_STATUS_BARS);
92         appearance |= convertFlag(systemUiVisibility, SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR,
93                 APPEARANCE_LIGHT_NAVIGATION_BARS);
94         appearance |= convertNoFlag(systemUiVisibility,
95                 STATUS_BAR_TRANSLUCENT | STATUS_BAR_TRANSPARENT, APPEARANCE_OPAQUE_STATUS_BARS);
96         appearance |= convertNoFlag(systemUiVisibility,
97                 NAVIGATION_BAR_TRANSLUCENT | NAVIGATION_BAR_TRANSPARENT,
98                 APPEARANCE_OPAQUE_NAVIGATION_BARS);
99         return appearance;
100     }
101 
102     /**
103      * Converts the system UI visibility into an appearance flag if the given visibility contains
104      * the given system UI flag.
105      */
convertFlag(int systemUiVisibility, int systemUiFlag, @Appearance int appearance)106     private static @Appearance int convertFlag(int systemUiVisibility, int systemUiFlag,
107             @Appearance int appearance) {
108         return (systemUiVisibility & systemUiFlag) != 0 ? appearance : 0;
109     }
110 
111     /**
112      * Converts the system UI visibility into an appearance flag if the given visibility doesn't
113      * contains the given system UI flag.
114      */
convertNoFlag(int systemUiVisibility, int systemUiFlag, @Appearance int appearance)115     private static @Appearance int convertNoFlag(int systemUiVisibility, int systemUiFlag,
116             @Appearance int appearance) {
117         return (systemUiVisibility & systemUiFlag) == 0 ? appearance : 0;
118     }
119 }
120