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