Home | History | Annotate | Download | only in kbars
      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