• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 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 com.android.cts.verifier.displaycutout;
18 
19 import android.graphics.Color;
20 import android.graphics.Insets;
21 import android.graphics.Rect;
22 import android.os.Bundle;
23 import android.view.DisplayCutout;
24 import android.view.View;
25 import android.view.ViewGroup;
26 import android.view.Window;
27 import android.view.WindowInsets;
28 import android.view.WindowInsetsController;
29 import android.view.WindowManager;
30 import android.widget.Button;
31 import android.widget.Toast;
32 
33 import com.android.cts.verifier.PassFailButtons;
34 import com.android.cts.verifier.R;
35 
36 public class DisplayCutoutTestActivity extends PassFailButtons.Activity {
37 
38     private View mDescription;
39     private View mLeftButtons;
40     private View mTopButtons;
41     private View mRightButtons;
42     private View mBottomButtons;
43     private View mPassFailButton;
44 
45     private Toast mToast;
46     private int mButtonSize;
47 
48     final private static int FLAG_PASS_BUTTON_ENABLE = 0xFFFF;
49     private int mPassButtonEnableFlag = 0;
50 
51     @Override
onCreate(Bundle savedInstanceState)52     protected void onCreate(Bundle savedInstanceState) {
53         super.onCreate(savedInstanceState);
54 
55         getWindow().requestFeature(Window.FEATURE_NO_TITLE);
56         WindowManager.LayoutParams lp = getWindow().getAttributes();
57         lp.layoutInDisplayCutoutMode =
58                 WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
59         getWindow().setAttributes(lp);
60         getWindow().getDecorView().getWindowInsetsController().hide(WindowInsets.Type.systemBars());
61         getWindow().getDecorView().getWindowInsetsController().setSystemBarsBehavior(
62                 WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
63 
64         setContentView(R.layout.display_cutout);
65 
66         mDescription = findViewById(R.id.enable_buttons_desc);
67         mPassFailButton = findViewById(R.id.pass_fail_buttons);
68         mLeftButtons = findViewById(R.id.left_buttons);
69         mTopButtons = findViewById(R.id.top_buttons);
70         mRightButtons = findViewById(R.id.right_buttons);
71         mBottomButtons = findViewById(R.id.bottom_buttons);
72         mButtonSize = getResources().getDimensionPixelSize(R.dimen.display_cutout_test_button_size);
73 
74         setPassFailButtonClickListeners();
75         // only enable pass button when all test buttons are clicked.
76         getPassButton().setEnabled(false);
77 
78         getWindow().getDecorView().setOnApplyWindowInsetsListener((v, insets) -> {
79             insets = new WindowInsets.Builder(insets).setInsets(
80                     WindowInsets.Type.displayCutout(), Insets.NONE).build();
81             updateButtons(insets.getDisplayCutout());
82             return v.onApplyWindowInsets(insets);
83         });
84     }
85 
updateButtons(DisplayCutout cutout)86     public void updateButtons(DisplayCutout cutout) {
87         Rect safeInsets = new Rect();
88         if (cutout != null) {
89             safeInsets.set(cutout.getSafeInsetLeft(),
90                     cutout.getSafeInsetTop(),
91                     cutout.getSafeInsetRight(),
92                     cutout.getSafeInsetBottom());
93         }
94 
95         // update left buttons
96         ViewGroup.MarginLayoutParams lp =
97                 (ViewGroup.MarginLayoutParams) mLeftButtons.getLayoutParams();
98         lp.leftMargin = safeInsets.left;
99         lp.topMargin = safeInsets.top + mButtonSize;
100         lp.bottomMargin = safeInsets.bottom + mButtonSize;
101         mLeftButtons.setLayoutParams(lp);
102         mLeftButtons.setVisibility(View.VISIBLE);
103 
104         // update top buttons
105         lp = (ViewGroup.MarginLayoutParams) mTopButtons.getLayoutParams();
106         lp.leftMargin = safeInsets.left + mButtonSize;
107         lp.topMargin = safeInsets.top;
108         lp.rightMargin = safeInsets.right + mButtonSize;
109         mTopButtons.setLayoutParams(lp);
110         mTopButtons.setVisibility(View.VISIBLE);
111 
112         // update right buttons
113         lp = (ViewGroup.MarginLayoutParams) mRightButtons.getLayoutParams();
114         lp.topMargin = safeInsets.top + mButtonSize;;
115         lp.rightMargin = safeInsets.right;
116         lp.bottomMargin = safeInsets.bottom + mButtonSize;;
117         mRightButtons.setLayoutParams(lp);
118         mRightButtons.setVisibility(View.VISIBLE);
119 
120         // update bottom buttons
121         lp = (ViewGroup.MarginLayoutParams) mBottomButtons.getLayoutParams();
122         lp.leftMargin = safeInsets.left + mButtonSize;
123         lp.rightMargin = safeInsets.right + mButtonSize;
124         lp.bottomMargin = safeInsets.bottom;
125         mBottomButtons.setLayoutParams(lp);
126         mBottomButtons.setVisibility(View.VISIBLE);
127 
128         // update description view
129         lp = (ViewGroup.MarginLayoutParams) mDescription.getLayoutParams();
130         lp.leftMargin = safeInsets.left + mButtonSize * 2;
131         lp.rightMargin = safeInsets.right + mButtonSize * 2;
132         mDescription.setLayoutParams(lp);
133 
134         // update pass fail button view
135         lp = (ViewGroup.MarginLayoutParams) mPassFailButton.getLayoutParams();
136         lp.leftMargin = safeInsets.left+ mButtonSize * 2;
137         lp.rightMargin = safeInsets.right + mButtonSize * 2;
138         mPassFailButton.setLayoutParams(lp);
139     }
140 
onButtonClicked(View v)141     public void onButtonClicked(View v) {
142         final Button button = (Button) v;
143         final int buttonNumber = Integer.valueOf((button.getText()).toString());
144         String toastText = "Button #" + buttonNumber + "  clicked";
145         if (mToast != null) {
146             mToast.cancel();
147         }
148         mToast = Toast.makeText(getApplicationContext(), toastText, Toast.LENGTH_SHORT);
149         mToast.show();
150 
151         // Indicate this button has been clicked.
152         button.setTextColor(Color.BLUE);
153 
154         enablePassButtonIfNeeded(buttonNumber);
155     }
156 
enablePassButtonIfNeeded(int buttonNumber)157     private void enablePassButtonIfNeeded(int buttonNumber) {
158         mPassButtonEnableFlag |= (1 << buttonNumber);
159         if (mPassButtonEnableFlag == FLAG_PASS_BUTTON_ENABLE) {
160             getPassButton().setEnabled(true);
161         }
162     }
163 }
164