1 /* 2 * Copyright (C) 2011 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.example.android.apis.view; 18 19 import android.app.Activity; 20 import android.content.Context; 21 import android.os.Bundle; 22 import android.util.AttributeSet; 23 import android.util.DisplayMetrics; 24 import android.view.KeyEvent; 25 import android.view.Menu; 26 import android.view.MenuItem; 27 import android.view.View; 28 import android.view.View.OnClickListener; 29 import android.view.Window; 30 import android.view.WindowManager; 31 import android.widget.ImageView; 32 import android.widget.TextView; 33 34 import com.example.android.apis.R; 35 36 /** 37 * This activity demonstrates some of the available ways to reduce the size or visual contrast of 38 * the system decor, in order to better focus the user's attention or use available screen real 39 * estate on the task at hand. 40 */ 41 public class OverscanActivity extends Activity { 42 public static class IV extends ImageView { 43 private OverscanActivity mActivity; IV(Context context)44 public IV(Context context) { 45 super(context); 46 } IV(Context context, AttributeSet attrs)47 public IV(Context context, AttributeSet attrs) { 48 super(context, attrs); 49 } setActivity(OverscanActivity act)50 public void setActivity(OverscanActivity act) { 51 mActivity = act; 52 } onSizeChanged(int w, int h, int oldw, int oldh)53 public void onSizeChanged(int w, int h, int oldw, int oldh) { 54 mActivity.refreshSizes(); 55 } onSystemUiVisibilityChanged(int visibility)56 public void onSystemUiVisibilityChanged(int visibility) { 57 mActivity.getState().onSystemUiVisibilityChanged(visibility); 58 } 59 } 60 61 private interface State { apply()62 void apply(); next()63 State next(); onSystemUiVisibilityChanged(int visibility)64 void onSystemUiVisibilityChanged(int visibility); 65 } 66 private class NormalState implements State { apply()67 public void apply() { 68 display("Normal"); 69 setFullscreen(false); 70 mImage.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); 71 } next()72 public State next() { 73 return new FullscreenState(); 74 } onSystemUiVisibilityChanged(int visibility)75 public void onSystemUiVisibilityChanged(int visibility) { 76 } 77 } 78 private class FullscreenState implements State { apply()79 public void apply() { 80 display("FULLSCREEN"); 81 setFullscreen(true); 82 } next()83 public State next() { 84 return new FullscreenLightsOutState(); 85 } onSystemUiVisibilityChanged(int visibility)86 public void onSystemUiVisibilityChanged(int visibility) { 87 } 88 } 89 private class FullscreenLightsOutState implements State { apply()90 public void apply() { 91 display("FULLSCREEN + LOW_PROFILE"); 92 mImage.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); 93 } next()94 public State next() { 95 return new OverscanState(); 96 } onSystemUiVisibilityChanged(int visibility)97 public void onSystemUiVisibilityChanged(int visibility) { 98 } 99 } 100 private class OverscanState implements State { apply()101 public void apply() { 102 display("FULLSCREEN + HIDE_NAVIGATION"); 103 mImage.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); 104 } next()105 public State next() { 106 return new NormalState(); 107 } onSystemUiVisibilityChanged(int visibility)108 public void onSystemUiVisibilityChanged(int visibility) { 109 } 110 } 111 setFullscreen(boolean on)112 private void setFullscreen(boolean on) { 113 Window win = getWindow(); 114 WindowManager.LayoutParams winParams = win.getAttributes(); 115 final int bits = WindowManager.LayoutParams.FLAG_FULLSCREEN; 116 if (on) { 117 winParams.flags |= bits; 118 } else { 119 winParams.flags &= ~bits; 120 } 121 win.setAttributes(winParams); 122 } 123 getDisplaySize()124 private String getDisplaySize() { 125 DisplayMetrics dm = getResources().getDisplayMetrics(); 126 return String.format("DisplayMetrics = (%d x %d)", dm.widthPixels, dm.heightPixels); 127 } getViewSize()128 private String getViewSize() { 129 return String.format("View = (%d,%d - %d,%d)", 130 mImage.getLeft(), mImage.getTop(), 131 mImage.getRight(), mImage.getBottom()); 132 } refreshSizes()133 void refreshSizes() { 134 mText2.setText(getDisplaySize() + " " + getViewSize()); 135 } display(String text)136 private void display(String text) { 137 mText1.setText(text); 138 refreshSizes(); 139 } getState()140 State getState() { 141 return mState; 142 } 143 144 static int TOAST_LENGTH = 500; 145 IV mImage; 146 TextView mText1, mText2; 147 State mState; 148 OverscanActivity()149 public OverscanActivity() { 150 } 151 152 @Override onCreate(Bundle savedInstanceState)153 public void onCreate(Bundle savedInstanceState) { 154 super.onCreate(savedInstanceState); 155 156 // we need to ask for LAYOUT_IN_SCREEN before the window decor appears 157 Window win = getWindow(); 158 WindowManager.LayoutParams winParams = win.getAttributes(); 159 winParams.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; 160 win.setAttributes(winParams); 161 162 setContentView(R.layout.overscan); 163 mImage = (IV) findViewById(R.id.image); 164 mImage.setActivity(this); 165 mText1 = (TextView) findViewById(R.id.text1); 166 mText2 = (TextView) findViewById(R.id.text2); 167 } 168 169 @Override onAttachedToWindow()170 public void onAttachedToWindow() { 171 mState = new NormalState(); 172 mState.apply(); 173 } 174 175 @Override onResume()176 protected void onResume() { 177 super.onResume(); 178 } 179 clicked(View v)180 public void clicked(View v) { 181 mState = mState.next(); 182 mState.apply(); 183 } 184 } 185