1 package js.kbars; 2 3 import android.animation.Animator; 4 import android.animation.Animator.AnimatorListener; 5 import android.app.Activity; 6 import android.content.Context; 7 import android.content.Intent; 8 import android.content.res.Configuration; 9 import android.graphics.drawable.ColorDrawable; 10 import android.os.Bundle; 11 import android.os.Handler; 12 import android.util.DisplayMetrics; 13 import android.view.Menu; 14 import android.view.MenuItem; 15 import android.view.MenuItem.OnMenuItemClickListener; 16 import android.view.View; 17 import android.view.View.OnClickListener; 18 import android.view.Window; 19 import android.widget.Button; 20 import android.widget.EditText; 21 import android.widget.FrameLayout.LayoutParams; 22 import android.widget.LinearLayout; 23 import android.widget.Toast; 24 import java.util.ArrayList; 25 import java.util.List; 26 27 public class KBarsActivity extends Activity { 28 public static final int BASE_FLAGS = 1792; 29 static final boolean DEBUG = true; 30 public static final int FLAG_TRANSLUCENT_NAVIGATION = 134217728; 31 public static final int FLAG_TRANSLUCENT_STATUS = 67108864; 32 private static final int IMMERSIVE_FLAGS = 3846; 33 private static final int IMMERSIVE_FLAGS_STICKY = 5894; 34 private static final int SYSTEM_UI_FLAG_IMMERSIVE = 2048; 35 private static final int SYSTEM_UI_FLAG_IMMERSIVE_STICKY = 4096; 36 static final String TAG = Util.logTag(KBarsActivity.class); 37 private List<View> mButtons = new ArrayList(); 38 private CameraBackgroundMenuItem mCameraBackgroundMenuItem; 39 private final Context mContext = this; 40 private EditText mEditText; 41 private TouchTrackingLayout mFrame; 42 private ImageBackgroundMenuItem mImageBackgroundMenuItem; 43 44 private static final class DebugButton extends Button { 45 private final Handler mHandler = new Handler(); 46 private final Runnable mNavTransOff = new Runnable() { 47 public void run() { 48 DebugButton.this.setNavTrans(false); 49 } 50 }; 51 private final Runnable mNavTransOn = new Runnable() { 52 public void run() { 53 DebugButton.this.setNavTrans(true); 54 DebugButton.this.cancelTrans(); 55 DebugButton.this.mHandler.postDelayed(DebugButton.this.mNavTransOff, 5000); 56 } 57 }; 58 59 public DebugButton(Context context) { 60 super(context); 61 setText("Debug"); 62 setOnClickListener(new OnClickListener() { 63 public void onClick(View v) { 64 DebugButton.this.fallingToast(); 65 } 66 }); 67 } 68 69 private void cancelTrans() { 70 this.mHandler.removeCallbacks(this.mNavTransOn); 71 this.mHandler.removeCallbacks(this.mNavTransOff); 72 } 73 74 private void setNavTrans(boolean trans) { 75 Window w = ((Activity) getContext()).getWindow(); 76 if (trans) { 77 w.addFlags(KBarsActivity.FLAG_TRANSLUCENT_STATUS); 78 } else { 79 w.clearFlags(KBarsActivity.FLAG_TRANSLUCENT_STATUS); 80 } 81 } 82 83 public void fallingToast() { 84 this.mNavTransOff.run(); 85 Toast.makeText(getContext(), "Here is a toast", 1).show(); 86 cancelTrans(); 87 this.mHandler.postDelayed(this.mNavTransOn, 1000); 88 } 89 } 90 91 private static final class InvisibleButton extends Button { 92 public InvisibleButton(Context context) { 93 super(context); 94 super.setVisibility(4); 95 } 96 97 public void setVisibility(int visibility) { 98 } 99 } 100 101 protected void onCreate(Bundle savedInstanceState) { 102 boolean portrait; 103 int i = 0; 104 super.onCreate(savedInstanceState); 105 getWindow().requestFeature(9); 106 DisplayMetrics dm = new DisplayMetrics(); 107 getWindowManager().getDefaultDisplay().getRealMetrics(dm); 108 Toast.makeText(this.mContext, dm.widthPixels + "x" + dm.heightPixels + " supported=" + areTranslucentBarsSupported(), 0).show(); 109 getActionBar().setTitle("kbars " + Util.getVersionName(this.mContext)); 110 getActionBar().setBackgroundDrawable(new ColorDrawable(0)); 111 this.mFrame = new TouchTrackingLayout(this.mContext); 112 LinearLayout allButtons = new LinearLayout(this.mContext); 113 Configuration config = getResources().getConfiguration(); 114 if (((float) config.screenWidthDp) / ((float) config.screenHeightDp) < 1.0f) { 115 portrait = true; 116 } else { 117 portrait = false; 118 } 119 if (portrait) { 120 i = 1; 121 } 122 allButtons.setOrientation(i); 123 LinearLayout buttons1 = new LinearLayout(this.mContext); 124 buttons1.setOrientation(1); 125 LinearLayout buttons2 = new LinearLayout(this.mContext); 126 buttons2.setOrientation(1); 127 allButtons.addView(buttons1); 128 allButtons.addView(buttons2); 129 LayoutParams buttonsLP = new LayoutParams(-2, -2); 130 buttonsLP.gravity = 17; 131 this.mFrame.addView(allButtons, buttonsLP); 132 this.mEditText = new EditText(this.mContext); 133 this.mEditText.setVisibility(8); 134 buttons1.addView(this.mEditText, -1, -2); 135 buttons1.addView(new TransparencyToggleButton(this.mContext, "status bar", FLAG_TRANSLUCENT_STATUS)); 136 buttons1.addView(new TransparencyToggleButton(this.mContext, "navigation bar", FLAG_TRANSLUCENT_NAVIGATION)); 137 buttons1.addView(new InvisibleButton(this.mContext)); 138 buttons2.addView(new ImmersiveModeToggleButton(this, "immersive", IMMERSIVE_FLAGS)); 139 buttons2.addView(new ImmersiveModeToggleButton(this, "sticky immersive", IMMERSIVE_FLAGS_STICKY)); 140 buttons2.addView(new LightsOutModeToggleButton(this.mContext)); 141 buttons2.addView(new MediaModeToggleButton(this.mContext, this.mFrame)); 142 buttons2.addView(new InvisibleButton(this.mContext)); 143 setContentView(this.mFrame); 144 addButtons(buttons1); 145 addButtons(buttons2); 146 } 147 148 private void addButtons(LinearLayout buttons) { 149 for (int i = 0; i < buttons.getChildCount(); i++) { 150 this.mButtons.add(buttons.getChildAt(i)); 151 } 152 } 153 154 private boolean areTranslucentBarsSupported() { 155 int id = getResources().getIdentifier("config_enableTranslucentDecor", "bool", "android"); 156 if (id == 0) { 157 return false; 158 } 159 return getResources().getBoolean(id); 160 } 161 162 public boolean onCreateOptionsMenu(Menu menu) { 163 RandomColorBackgroundMenuItem randomColorBackgroundMenuItem = new RandomColorBackgroundMenuItem(menu, this.mFrame); 164 this.mImageBackgroundMenuItem = new ImageBackgroundMenuItem(menu, this, this.mFrame); 165 this.mCameraBackgroundMenuItem = new CameraBackgroundMenuItem(menu, this, this.mFrame); 166 createDebugMenuItem(menu); 167 createEditTextMenuItem(menu); 168 createOrientationMenuItem(menu, R.string.action_portrait, 1); 169 createOrientationMenuItem(menu, R.string.action_landscape, 0); 170 createOrientationMenuItem(menu, R.string.action_reverse_portrait, 9); 171 createOrientationMenuItem(menu, R.string.action_reverse_landscape, 8); 172 return true; 173 } 174 175 private void createOrientationMenuItem(Menu menu, int text, final int orientation) { 176 MenuItem mi = menu.add(text); 177 mi.setShowAsAction(0); 178 mi.setOnMenuItemClickListener(new OnMenuItemClickListener() { 179 public boolean onMenuItemClick(MenuItem item) { 180 KBarsActivity.this.setRequestedOrientation(orientation); 181 return true; 182 } 183 }); 184 } 185 186 private void createDebugMenuItem(Menu menu) { 187 final MenuItem mi = menu.add("Show gesture debugging"); 188 mi.setShowAsActionFlags(0); 189 mi.setOnMenuItemClickListener(new OnMenuItemClickListener() { 190 public boolean onMenuItemClick(MenuItem item) { 191 boolean debug; 192 if (KBarsActivity.this.mFrame.getDebug()) { 193 debug = false; 194 } else { 195 debug = true; 196 } 197 KBarsActivity.this.mFrame.setDebug(debug); 198 mi.setTitle(new StringBuilder(String.valueOf(debug ? "Hide" : "Show")).append(" gesture debugging").toString()); 199 return true; 200 } 201 }); 202 } 203 204 private void createEditTextMenuItem(Menu menu) { 205 final MenuItem mi = menu.add("Show EditText"); 206 mi.setShowAsActionFlags(0); 207 mi.setOnMenuItemClickListener(new OnMenuItemClickListener() { 208 public boolean onMenuItemClick(MenuItem item) { 209 boolean isVisible; 210 int i = 0; 211 if (KBarsActivity.this.mEditText.getVisibility() == 0) { 212 isVisible = true; 213 } else { 214 isVisible = false; 215 } 216 EditText access$1 = KBarsActivity.this.mEditText; 217 if (isVisible) { 218 i = 8; 219 } 220 access$1.setVisibility(i); 221 mi.setTitle(new StringBuilder(String.valueOf(isVisible ? "Show" : "Hide")).append(" EditText").toString()); 222 return true; 223 } 224 }); 225 } 226 227 public void setSoloButton(boolean visible, View solo, boolean animate) { 228 int i; 229 int vis = 0; 230 if (visible) { 231 i = 1; 232 } else { 233 i = 0; 234 } 235 float alpha = (float) i; 236 if (!visible) { 237 vis = 4; 238 } 239 final int _vis = vis; 240 for (final View view : this.mButtons) { 241 if (!(view == solo || (view instanceof EditText))) { 242 view.setEnabled(visible); 243 if (animate) { 244 view.animate().alpha(alpha).setListener(new AnimatorListener() { 245 public void onAnimationCancel(Animator animation) { 246 } 247 248 public void onAnimationEnd(Animator animation) { 249 view.setVisibility(_vis); 250 } 251 252 public void onAnimationRepeat(Animator animation) { 253 } 254 255 public void onAnimationStart(Animator animation) { 256 } 257 }).start(); 258 } else { 259 view.setVisibility(vis); 260 } 261 } 262 } 263 } 264 265 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 266 if (requestCode == CameraBackgroundMenuItem.REQUEST_CODE) { 267 this.mCameraBackgroundMenuItem.onActivityResult(resultCode, data); 268 } 269 if (requestCode == ImageBackgroundMenuItem.REQUEST_CODE) { 270 this.mImageBackgroundMenuItem.onActivityResult(resultCode, data); 271 } 272 } 273 } 274