Home | History | Annotate | Download | only in view
      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.ActionBar;
     20 import android.app.Activity;
     21 import android.app.FragmentTransaction;
     22 import android.app.ActionBar.Tab;
     23 import android.content.Context;
     24 import android.content.Intent;
     25 import android.net.Uri;
     26 import android.os.Bundle;
     27 import android.util.AttributeSet;
     28 import android.util.DisplayMetrics;
     29 import android.view.ActionMode;
     30 import android.view.Menu;
     31 import android.view.MenuInflater;
     32 import android.view.MenuItem;
     33 import android.view.View;
     34 import android.view.Window;
     35 import android.view.WindowManager;
     36 import android.widget.CheckBox;
     37 import android.widget.CompoundButton;
     38 import android.widget.ImageView;
     39 import android.widget.SearchView;
     40 import android.widget.ShareActionProvider;
     41 import android.widget.TextView;
     42 import android.widget.Toast;
     43 import android.widget.SearchView.OnQueryTextListener;
     44 
     45 import com.example.android.apis.R;
     46 
     47 /**
     48  * This activity demonstrates some of the available ways to reduce the size or visual contrast of
     49  * the system decor, in order to better focus the user's attention or use available screen real
     50  * estate on the task at hand.
     51  */
     52 public class SystemUIModes extends Activity
     53         implements OnQueryTextListener, ActionBar.TabListener {
     54     public static class IV extends ImageView implements View.OnSystemUiVisibilityChangeListener {
     55         private SystemUIModes mActivity;
     56         private ActionMode mActionMode;
     57         public IV(Context context) {
     58             super(context);
     59         }
     60         public IV(Context context, AttributeSet attrs) {
     61             super(context, attrs);
     62         }
     63         public void setActivity(SystemUIModes act) {
     64             setOnSystemUiVisibilityChangeListener(this);
     65             mActivity = act;
     66         }
     67         @Override
     68         public void onSizeChanged(int w, int h, int oldw, int oldh) {
     69             mActivity.refreshSizes();
     70         }
     71         @Override
     72         public void onSystemUiVisibilityChange(int visibility) {
     73             mActivity.updateCheckControls();
     74             mActivity.refreshSizes();
     75         }
     76 
     77         private class MyActionModeCallback implements ActionMode.Callback {
     78             @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) {
     79                 mode.setTitle("My Action Mode!");
     80                 mode.setSubtitle(null);
     81                 mode.setTitleOptionalHint(false);
     82                 menu.add("Sort By Size").setIcon(android.R.drawable.ic_menu_sort_by_size);
     83                 menu.add("Sort By Alpha").setIcon(android.R.drawable.ic_menu_sort_alphabetically);
     84                 return true;
     85             }
     86 
     87             @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
     88                 return true;
     89             }
     90 
     91             @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
     92                 return true;
     93             }
     94 
     95             @Override public void onDestroyActionMode(ActionMode mode) {
     96                 mActionMode = null;
     97                 mActivity.clearActionMode();
     98             }
     99         }
    100 
    101         public void startActionMode() {
    102             if (mActionMode == null) {
    103                 ActionMode.Callback cb = new MyActionModeCallback();
    104                 mActionMode = startActionMode(cb);
    105             }
    106         }
    107 
    108         public void stopActionMode() {
    109             if (mActionMode != null) {
    110                 mActionMode.finish();
    111             }
    112         }
    113     }
    114 
    115     private void setFullscreen(boolean on) {
    116         Window win = getWindow();
    117         WindowManager.LayoutParams winParams = win.getAttributes();
    118         final int bits = WindowManager.LayoutParams.FLAG_FULLSCREEN;
    119         if (on) {
    120             winParams.flags |=  bits;
    121         } else {
    122             winParams.flags &= ~bits;
    123         }
    124         win.setAttributes(winParams);
    125     }
    126 
    127     private void setOverscan(boolean on) {
    128         Window win = getWindow();
    129         WindowManager.LayoutParams winParams = win.getAttributes();
    130         final int bits = WindowManager.LayoutParams.FLAG_LAYOUT_IN_OVERSCAN;
    131         if (on) {
    132             winParams.flags |=  bits;
    133         } else {
    134             winParams.flags &= ~bits;
    135         }
    136         win.setAttributes(winParams);
    137     }
    138 
    139     private void setTranslucentStatus(boolean on) {
    140         Window win = getWindow();
    141         WindowManager.LayoutParams winParams = win.getAttributes();
    142         final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
    143         if (on) {
    144             winParams.flags |=  bits;
    145         } else {
    146             winParams.flags &= ~bits;
    147         }
    148         win.setAttributes(winParams);
    149     }
    150 
    151     private void setTranslucentNavigation(boolean on) {
    152         Window win = getWindow();
    153         WindowManager.LayoutParams winParams = win.getAttributes();
    154         final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
    155         if (on) {
    156             winParams.flags |=  bits;
    157         } else {
    158             winParams.flags &= ~bits;
    159         }
    160         win.setAttributes(winParams);
    161     }
    162 
    163     private String getDisplaySize() {
    164         DisplayMetrics dm = getResources().getDisplayMetrics();
    165         return String.format("DisplayMetrics = (%d x %d)", dm.widthPixels, dm.heightPixels);
    166     }
    167     private String getViewSize() {
    168         return String.format("View = (%d,%d - %d,%d)",
    169                 mImage.getLeft(), mImage.getTop(),
    170                 mImage.getRight(), mImage.getBottom());
    171     }
    172     void refreshSizes() {
    173         mMetricsText.setText(getDisplaySize() + " " + getViewSize());
    174     }
    175 
    176     static int TOAST_LENGTH = 500;
    177     IV mImage;
    178     CheckBox[] mCheckControls = new CheckBox[8];
    179     int[] mCheckFlags = new int[] { View.SYSTEM_UI_FLAG_LOW_PROFILE,
    180             View.SYSTEM_UI_FLAG_FULLSCREEN, View.SYSTEM_UI_FLAG_HIDE_NAVIGATION,
    181             View.SYSTEM_UI_FLAG_IMMERSIVE, View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY,
    182             View.SYSTEM_UI_FLAG_LAYOUT_STABLE, View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN,
    183             View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    184     };
    185     TextView mMetricsText;
    186 
    187     public SystemUIModes() {
    188     }
    189 
    190     @Override
    191     public void onCreate(Bundle savedInstanceState) {
    192         super.onCreate(savedInstanceState);
    193 
    194         setContentView(R.layout.system_ui_modes);
    195         mImage = (IV) findViewById(R.id.image);
    196         mImage.setActivity(this);
    197 
    198         CompoundButton.OnCheckedChangeListener checkChangeListener
    199                 = new CompoundButton.OnCheckedChangeListener() {
    200             @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    201                 updateSystemUi();
    202             }
    203         };
    204         mCheckControls[0] = (CheckBox) findViewById(R.id.modeLowProfile);
    205         mCheckControls[1] = (CheckBox) findViewById(R.id.modeFullscreen);
    206         mCheckControls[2] = (CheckBox) findViewById(R.id.modeHideNavigation);
    207         mCheckControls[3] = (CheckBox) findViewById(R.id.modeImmersive);
    208         mCheckControls[4] = (CheckBox) findViewById(R.id.modeImmersiveSticky);
    209         mCheckControls[5] = (CheckBox) findViewById(R.id.layoutStable);
    210         mCheckControls[6] = (CheckBox) findViewById(R.id.layoutFullscreen);
    211         mCheckControls[7] = (CheckBox) findViewById(R.id.layoutHideNavigation);
    212         for (int i=0; i<mCheckControls.length; i++) {
    213             mCheckControls[i].setOnCheckedChangeListener(checkChangeListener);
    214         }
    215         ((CheckBox) findViewById(R.id.windowFullscreen)).setOnCheckedChangeListener(
    216                 new CompoundButton.OnCheckedChangeListener() {
    217                     @Override
    218                     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    219                         setFullscreen(isChecked);
    220                     }
    221                 }
    222         );
    223         ((CheckBox) findViewById(R.id.windowOverscan)).setOnCheckedChangeListener(
    224                 new CompoundButton.OnCheckedChangeListener() {
    225                     @Override
    226                     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    227                         setOverscan(isChecked);
    228                     }
    229                 }
    230         );
    231         ((CheckBox) findViewById(R.id.windowTranslucentStatus)).setOnCheckedChangeListener(
    232                 new CompoundButton.OnCheckedChangeListener() {
    233                     @Override
    234                     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    235                         setTranslucentStatus(isChecked);
    236                     }
    237                 }
    238         );
    239         ((CheckBox) findViewById(R.id.windowTranslucentNav)).setOnCheckedChangeListener(
    240                 new CompoundButton.OnCheckedChangeListener() {
    241                     @Override
    242                     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    243                         setTranslucentNavigation(isChecked);
    244                     }
    245                 }
    246         );
    247         ((CheckBox) findViewById(R.id.windowHideActionBar)).setOnCheckedChangeListener(
    248                 new CompoundButton.OnCheckedChangeListener() {
    249                     @Override
    250                     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    251                         if (isChecked) {
    252                             getActionBar().hide();
    253                         } else {
    254                             getActionBar().show();
    255                         }
    256                     }
    257                 }
    258         );
    259         ((CheckBox) findViewById(R.id.windowActionMode)).setOnCheckedChangeListener(
    260                 new CompoundButton.OnCheckedChangeListener() {
    261                     @Override
    262                     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    263                         if (isChecked) {
    264                             mImage.startActionMode();
    265                         } else {
    266                             mImage.stopActionMode();
    267                         }
    268                     }
    269                 }
    270         );
    271         mMetricsText = (TextView) findViewById(R.id.metricsText);
    272     }
    273 
    274     @Override
    275     public boolean onCreateOptionsMenu(Menu menu) {
    276         MenuInflater inflater = getMenuInflater();
    277         inflater.inflate(R.menu.content_actions, menu);
    278         SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    279         searchView.setOnQueryTextListener(this);
    280 
    281         // Set file with share history to the provider and set the share intent.
    282         MenuItem actionItem = menu.findItem(R.id.menu_item_share_action_provider_action_bar);
    283         ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider();
    284         actionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
    285         // Note that you can set/change the intent any time,
    286         // say when the user has selected an image.
    287         Intent shareIntent = new Intent(Intent.ACTION_SEND);
    288         shareIntent.setType("image/*");
    289         Uri uri = Uri.fromFile(getFileStreamPath("shared.png"));
    290         shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
    291         actionProvider.setShareIntent(shareIntent);
    292         return true;
    293     }
    294 
    295     @Override
    296     public void onAttachedToWindow() {
    297         updateCheckControls();
    298     }
    299 
    300     @Override
    301     protected void onResume() {
    302         super.onResume();
    303     }
    304 
    305     public void onSort(MenuItem item) {
    306     }
    307 
    308     @Override
    309     public boolean onQueryTextChange(String newText) {
    310         return true;
    311     }
    312 
    313     @Override
    314     public boolean onQueryTextSubmit(String query) {
    315         Toast.makeText(this, "Searching for: " + query + "...", Toast.LENGTH_SHORT).show();
    316         return true;
    317     }
    318 
    319     @Override
    320     public boolean onOptionsItemSelected(MenuItem item) {
    321         switch (item.getItemId()) {
    322             case R.id.show_tabs:
    323                 getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    324                 item.setChecked(true);
    325                 return true;
    326             case R.id.hide_tabs:
    327                 getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    328                 item.setChecked(true);
    329                 return true;
    330         }
    331         return false;
    332     }
    333 
    334     @Override
    335     public void onTabSelected(Tab tab, FragmentTransaction ft) {
    336     }
    337 
    338     @Override
    339     public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    340     }
    341 
    342     @Override
    343     public void onTabReselected(Tab tab, FragmentTransaction ft) {
    344     }
    345 
    346     public void updateCheckControls() {
    347         int visibility = mImage.getSystemUiVisibility();
    348         for (int i=0; i<mCheckControls.length; i++) {
    349             mCheckControls[i].setChecked((visibility&mCheckFlags[i]) != 0);
    350         }
    351     }
    352 
    353     public void updateSystemUi() {
    354         int visibility = 0;
    355         for (int i=0; i<mCheckControls.length; i++) {
    356             if (mCheckControls[i].isChecked()) {
    357                 visibility |= mCheckFlags[i];
    358             }
    359         }
    360         mImage.setSystemUiVisibility(visibility);
    361     }
    362 
    363     public void clearActionMode() {
    364         ((CheckBox) findViewById(R.id.windowActionMode)).setChecked(false);
    365     }
    366 }
    367