Home | History | Annotate | Download | only in view
      1 /*
      2  * Copyright (C) 2013 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.ActionBar.Tab;
     21 import android.app.Activity;
     22 import android.app.FragmentTransaction;
     23 import android.content.Context;
     24 import android.content.Intent;
     25 import android.net.Uri;
     26 import android.os.Bundle;
     27 import android.os.Handler;
     28 import android.util.AttributeSet;
     29 import android.util.TypedValue;
     30 import android.view.Menu;
     31 import android.view.MenuInflater;
     32 import android.view.MenuItem;
     33 import android.view.View;
     34 import android.view.ViewGroup;
     35 import android.view.Window;
     36 import android.widget.Button;
     37 import android.widget.ScrollView;
     38 import android.widget.SearchView;
     39 import android.widget.SeekBar;
     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 how to use system UI flags to implement
     49  * a content browser style of UI (such as a book reader) that hides the
     50  * nav bar as well as the status bar.
     51  */
     52 public class ContentBrowserNavActivity extends Activity
     53         implements OnQueryTextListener, ActionBar.TabListener {
     54 
     55     /**
     56      * Implementation of a view for displaying immersive content, using system UI
     57      * flags to transition in and out of modes where the user is focused on that
     58      * content.
     59      */
     60 //BEGIN_INCLUDE(content)
     61     public static class Content extends ScrollView
     62             implements View.OnSystemUiVisibilityChangeListener, View.OnClickListener {
     63         TextView mText;
     64         TextView mTitleView;
     65         SeekBar mSeekView;
     66         boolean mNavVisible;
     67         int mBaseSystemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
     68                 | SYSTEM_UI_FLAG_LAYOUT_STABLE | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
     69         int mLastSystemUiVis;
     70 
     71         Runnable mNavHider = new Runnable() {
     72             @Override public void run() {
     73                 setNavVisibility(false);
     74             }
     75         };
     76 
     77         public Content(Context context, AttributeSet attrs) {
     78             super(context, attrs);
     79 
     80             mText = new TextView(context);
     81             mText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
     82             mText.setText(context.getString(R.string.alert_dialog_two_buttons2ultra_msg));
     83             mText.setClickable(false);
     84             mText.setOnClickListener(this);
     85             mText.setTextIsSelectable(true);
     86             addView(mText, new ViewGroup.LayoutParams(
     87                     ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
     88 
     89             setOnSystemUiVisibilityChangeListener(this);
     90         }
     91 
     92         public void init(TextView title, SeekBar seek) {
     93             // This called by the containing activity to supply the surrounding
     94             // state of the content browser that it will interact with.
     95             mTitleView = title;
     96             mSeekView = seek;
     97             setNavVisibility(true);
     98         }
     99 
    100         @Override public void onSystemUiVisibilityChange(int visibility) {
    101             // Detect when we go out of low-profile mode, to also go out
    102             // of full screen.  We only do this when the low profile mode
    103             // is changing from its last state, and turning off.
    104             int diff = mLastSystemUiVis ^ visibility;
    105             mLastSystemUiVis = visibility;
    106             if ((diff&SYSTEM_UI_FLAG_LOW_PROFILE) != 0
    107                     && (visibility&SYSTEM_UI_FLAG_LOW_PROFILE) == 0) {
    108                 setNavVisibility(true);
    109             }
    110         }
    111 
    112         @Override protected void onWindowVisibilityChanged(int visibility) {
    113             super.onWindowVisibilityChanged(visibility);
    114 
    115             // When we become visible, we show our navigation elements briefly
    116             // before hiding them.
    117             setNavVisibility(true);
    118             getHandler().postDelayed(mNavHider, 2000);
    119         }
    120 
    121         @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) {
    122             super.onScrollChanged(l, t, oldl, oldt);
    123 
    124             // When the user scrolls, we hide navigation elements.
    125             setNavVisibility(false);
    126         }
    127 
    128         @Override public void onClick(View v) {
    129             // When the user clicks, we toggle the visibility of navigation elements.
    130             int curVis = getSystemUiVisibility();
    131             setNavVisibility((curVis&SYSTEM_UI_FLAG_LOW_PROFILE) != 0);
    132         }
    133 
    134         void setBaseSystemUiVisibility(int visibility) {
    135             mBaseSystemUiVisibility = visibility;
    136         }
    137 
    138         void setNavVisibility(boolean visible) {
    139             int newVis = mBaseSystemUiVisibility;
    140             if (!visible) {
    141                 newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN
    142                         | SYSTEM_UI_FLAG_HIDE_NAVIGATION | SYSTEM_UI_FLAG_IMMERSIVE;
    143             }
    144             final boolean changed = newVis == getSystemUiVisibility();
    145 
    146             // Unschedule any pending event to hide navigation if we are
    147             // changing the visibility, or making the UI visible.
    148             if (changed || visible) {
    149                 Handler h = getHandler();
    150                 if (h != null) {
    151                     h.removeCallbacks(mNavHider);
    152                 }
    153             }
    154 
    155             // Set the new desired visibility.
    156             setSystemUiVisibility(newVis);
    157             mTitleView.setVisibility(visible ? VISIBLE : INVISIBLE);
    158             mSeekView.setVisibility(visible ? VISIBLE : INVISIBLE);
    159         }
    160     }
    161 //END_INCLUDE(content)
    162 
    163     Content mContent;
    164 
    165     public ContentBrowserNavActivity() {
    166     }
    167 
    168     @Override
    169     public void onCreate(Bundle savedInstanceState) {
    170         super.onCreate(savedInstanceState);
    171 
    172         getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
    173 
    174         setContentView(R.layout.content_browser_nav);
    175         mContent = (Content)findViewById(R.id.content);
    176         mContent.init((TextView)findViewById(R.id.title),
    177                 (SeekBar)findViewById(R.id.seekbar));
    178 
    179         ActionBar bar = getActionBar();
    180         bar.addTab(bar.newTab().setText("Tab 1").setTabListener(this));
    181         bar.addTab(bar.newTab().setText("Tab 2").setTabListener(this));
    182         bar.addTab(bar.newTab().setText("Tab 3").setTabListener(this));
    183     }
    184 
    185     @Override
    186     public boolean onCreateOptionsMenu(Menu menu) {
    187         MenuInflater inflater = getMenuInflater();
    188         inflater.inflate(R.menu.content_actions, menu);
    189         SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
    190         searchView.setOnQueryTextListener(this);
    191 
    192         // Set file with share history to the provider and set the share intent.
    193         MenuItem actionItem = menu.findItem(R.id.menu_item_share_action_provider_action_bar);
    194         ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider();
    195         actionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
    196         // Note that you can set/change the intent any time,
    197         // say when the user has selected an image.
    198         Intent shareIntent = new Intent(Intent.ACTION_SEND);
    199         shareIntent.setType("image/*");
    200         Uri uri = Uri.fromFile(getFileStreamPath("shared.png"));
    201         shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
    202         actionProvider.setShareIntent(shareIntent);
    203         return true;
    204     }
    205 
    206     @Override
    207     public void onAttachedToWindow() {
    208         super.onAttachedToWindow();
    209     }
    210 
    211     @Override
    212     protected void onResume() {
    213         super.onResume();
    214     }
    215 
    216     /**
    217      * This method is declared in the menu.
    218      */
    219     public void onSort(MenuItem item) {
    220     }
    221 
    222     @Override
    223     public boolean onOptionsItemSelected(MenuItem item) {
    224         switch (item.getItemId()) {
    225             case R.id.show_tabs:
    226                 getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
    227                 item.setChecked(true);
    228                 return true;
    229             case R.id.hide_tabs:
    230                 getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
    231                 item.setChecked(true);
    232                 return true;
    233             case R.id.stable_layout:
    234                 item.setChecked(!item.isChecked());
    235                 mContent.setBaseSystemUiVisibility(item.isChecked()
    236                         ? View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    237                                 | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    238                         : View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    239                 return true;
    240         }
    241         return false;
    242     }
    243 
    244     @Override
    245     public boolean onQueryTextChange(String newText) {
    246         return true;
    247     }
    248 
    249     @Override
    250     public boolean onQueryTextSubmit(String query) {
    251         Toast.makeText(this, "Searching for: " + query + "...", Toast.LENGTH_SHORT).show();
    252         return true;
    253     }
    254 
    255     @Override
    256     public void onTabSelected(Tab tab, FragmentTransaction ft) {
    257     }
    258 
    259     @Override
    260     public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    261     }
    262 
    263     @Override
    264     public void onTabReselected(Tab tab, FragmentTransaction ft) {
    265     }
    266 }
    267