Update Full Screen Modes to demostrate more modes.

UI is now a set of check boxes to toggle the various modes.

Also add new API demos for two typical implementations using
system UI flags: a content browser and a video player.

Change-Id: If93659343cfc42b903b18997a5a0a04ee10e8343
This commit is contained in:
Dianne Hackborn
2012-03-27 10:35:02 -07:00
parent 8d83be988a
commit adee1fdf63
10 changed files with 901 additions and 99 deletions

View File

@@ -2204,7 +2204,29 @@
</intent-filter>
</activity>
<activity android:name=".view.OverscanActivity" android:label="Views/Full Screen Modes">
<activity android:name=".view.OverscanActivity"
android:label="Views/System UI Visibility/System UI Modes"
android:uiOptions="splitActionBarWhenNarrow">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.SAMPLE_CODE" />
</intent-filter>
</activity>
<activity android:name=".view.ContentBrowserActivity"
android:label="Views/System UI Visibility/Content Browser"
android:theme="@android:style/Theme.Holo.Light"
android:uiOptions="splitActionBarWhenNarrow">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.SAMPLE_CODE" />
</intent-filter>
</activity>
<activity android:name=".view.VideoPlayerActivity"
android:label="Views/System UI Visibility/Video Player"
android:theme="@android:style/Theme.Holo.Light"
android:uiOptions="splitActionBarWhenNarrow">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.SAMPLE_CODE" />

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 KiB

After

Width:  |  Height:  |  Size: 188 KiB

View File

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2012 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
>
<view class="com.example.android.apis.view.ContentBrowserActivity$Content"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top|center_horizontal"
android:textColor="#ff000000"
android:background="#ffa0a0a0"
android:textSize="16dp"
android:textStyle="bold"
android:gravity="center"
android:text="You Could Put Controls Here"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:textColor="#ff000000"
android:background="#ffa0a0a0"
android:textSize="16dp"
android:textStyle="bold"
android:gravity="center"
android:text="Or Put Them Here, Too"
/>
</FrameLayout>
</FrameLayout>

View File

@@ -33,47 +33,119 @@
android:layout_gravity="bottom|center"
android:background="#60000000"
android:padding="8dp"
android:orientation="horizontal"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:baselineAligned="true"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="#FFFFFFFF"
android:textSize="16dp"
android:textStyle="bold"
android:gravity="left"
android:text="Mode:"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:baselineAlignedChildIndex="0"
>
<TextView
android:id="@+id/text1"
<CheckBox
android:id="@+id/modeLowProfile"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFFFF"
android:textSize="16dp"
android:textStyle="bold"
android:gravity="left"
android:text="LOW_PROFILE"
/>
<TextView
android:id="@+id/text2"
<CheckBox
android:id="@+id/modeFullscreen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFFFF"
android:textSize="11dp"
android:textSize="16dp"
android:textStyle="bold"
android:gravity="left"
android:text="FULLSCREEN"
/>
<CheckBox
android:id="@+id/modeHideNavigation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFFFF"
android:textSize="16dp"
android:textStyle="bold"
android:text="HIDE_NAVIGATION"
/>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="horizontal"
android:baselineAligned="true"
>
<TextView
android:id="@+id/switchy"
android:background="#C0000000"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginTop="4dp"
android:padding="10dp"
android:layout_weight="1"
android:textColor="#FFFFFFFF"
android:textSize="16dp"
android:textStyle="bold"
android:gravity="left"
android:text="Layout:"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:baselineAlignedChildIndex="0"
>
<CheckBox
android:id="@+id/layoutStable"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFFFF"
android:textSize="16dp"
android:textStyle="bold"
android:text="STABLE"
/>
<CheckBox
android:id="@+id/layoutFullscreen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFFFF"
android:textSize="16dp"
android:textStyle="bold"
android:text="FULLSCREEN"
/>
<CheckBox
android:id="@+id/layoutHideNavigation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFFFF"
android:textSize="16dp"
android:textStyle="bold"
android:text="HIDE_NAVIGATION"
/>
</LinearLayout>
</LinearLayout>
<TextView
android:id="@+id/metricsText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#FFFFFFFF"
android:textSize="11dp"
android:textStyle="bold"
android:clickable="true"
android:onClick="clicked"
android:text="Switch"
android:gravity="center"
/>
</LinearLayout>
</FrameLayout>

View File

@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2012 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent"
>
<view class="com.example.android.apis.view.VideoPlayerActivity$Content"
android:id="@+id/image"
android:src="@drawable/frantic"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="center"
/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top|center_horizontal"
android:textColor="#ff000000"
android:background="#ffa0a0a0"
android:textSize="16dp"
android:textStyle="bold"
android:gravity="center"
android:text="You Could Put Controls Here"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center_horizontal"
android:textColor="#ff000000"
android:background="#ffa0a0a0"
android:textSize="16dp"
android:textStyle="bold"
android:gravity="center"
android:text="Or Put Them Here, Too"
/>
</FrameLayout>
</FrameLayout>

View File

@@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2012 Google Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/action_search"
android:icon="@android:drawable/ic_menu_search"
android:title="@string/action_bar_search"
android:showAsAction="always"
android:actionViewClass="android.widget.SearchView" />
<item android:id="@+id/menu_item_share_action_provider_action_bar"
android:showAsAction="always"
android:title="@string/action_bar_share_with"
android:actionProviderClass="android.widget.ShareActionProvider" />
<group android:id="@+id/show_tabs_group"
android:checkableBehavior="single">
<item android:id="@+id/show_tabs"
android:title="Show Tabs"
android:showAsAction="never" />
<item android:id="@+id/hide_tabs"
android:title="Hide Tabs"
android:checked="true"
android:showAsAction="never" />
</group>
<group android:id="@+id/stable_layout_group"
android:checkableBehavior="all">
<item android:id="@+id/stable_layout"
android:title="Stable Layout"
android:checked="true"
android:showAsAction="never" />
</group>
<item android:id="@+id/action_share"
android:icon="@android:drawable/ic_menu_share"
android:title="@string/action_bar_share"
android:showAsAction="ifRoom" />
<item android:id="@+id/action_sort"
android:icon="@android:drawable/ic_menu_sort_by_size"
android:title="@string/action_bar_sort"
android:showAsAction="ifRoom">
<menu>
<item android:id="@+id/action_sort_size"
android:icon="@android:drawable/ic_menu_sort_by_size"
android:title="@string/action_bar_sort_size"
android:onClick="onSort" />
<item android:id="@+id/action_sort_alpha"
android:icon="@android:drawable/ic_menu_sort_alphabetically"
android:title="@string/action_bar_sort_alpha"
android:onClick="onSort" />
</menu>
</item>
</menu>

View File

@@ -23,6 +23,8 @@ import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.Spinner;
@@ -86,6 +88,15 @@ public class MenuInflateFromXml extends Activity {
// so it will automatically save its instance state
mSpinner.setId(R.id.spinner);
mSpinner.setAdapter(adapter);
mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
invalidateOptionsMenu();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
// Add the spinner
layout.addView(mSpinner,
@@ -118,10 +129,6 @@ public class MenuInflateFromXml extends Activity {
MenuInflater inflater = getMenuInflater();
inflater.inflate(sMenuExampleResources[mSpinner.getSelectedItemPosition()], menu);
// Disable the spinner since we've already created the menu and the user
// can no longer pick a different menu XML.
mSpinner.setEnabled(false);
// Change instructions
mInstructionsText.setText(getResources().getString(
R.string.menu_from_xml_instructions_go_back));
@@ -136,6 +143,7 @@ public class MenuInflateFromXml extends Activity {
// the XML
case R.id.jump:
Toast.makeText(this, "Jump up in the air!", Toast.LENGTH_SHORT).show();
invalidateOptionsMenu();
return true;
case R.id.dive:

View File

@@ -0,0 +1,247 @@
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.apis.view;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ScrollView;
import android.widget.SearchView;
import android.widget.ShareActionProvider;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.SearchView.OnQueryTextListener;
import com.example.android.apis.R;
/**
* This activity demonstrates how to use system UI flags to implement
* a content browser style of UI (such as a book reader).
*/
public class ContentBrowserActivity extends Activity
implements OnQueryTextListener, ActionBar.TabListener {
/**
* Implementation of a view for displaying immersive content, using system UI
* flags to transition in and out of modes where the user is focused on that
* content.
*/
//BEGIN_INCLUDE(content)
public static class Content extends ScrollView
implements View.OnSystemUiVisibilityChangeListener, View.OnClickListener {
TextView mText;
boolean mNavVisible;
int mBaseSystemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| SYSTEM_UI_FLAG_LAYOUT_STABLE;
int mLastSystemUiVis;
Runnable mNavHider = new Runnable() {
@Override public void run() {
setNavVisibility(false);
}
};
public Content(Context context, AttributeSet attrs) {
super(context, attrs);
mText = new TextView(context);
mText.setText(context.getString(R.string.alert_dialog_two_buttons2ultra_msg));
mText.setClickable(false);
mText.setLongClickable(false);
mText.setOnClickListener(this);
addView(mText, new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
setOnSystemUiVisibilityChangeListener(this);
setNavVisibility(true);
}
@Override public void onSystemUiVisibilityChange(int visibility) {
// Detect when we go out of low-profile mode, to also go out
// of full screen. We only do this when the low profile mode
// is changing from its last state, and turning off.
int diff = mLastSystemUiVis ^ visibility;
mLastSystemUiVis = visibility;
if ((diff&SYSTEM_UI_FLAG_LOW_PROFILE) != 0
&& (visibility&SYSTEM_UI_FLAG_LOW_PROFILE) == 0) {
setNavVisibility(true);
}
}
@Override protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
// When we become visible, we show our navigation elements briefly
// before hiding them.
setNavVisibility(true);
getHandler().postDelayed(mNavHider, 2000);
}
@Override protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
// When the user scrolls, we hide navigation elements.
setNavVisibility(false);
}
@Override public void onClick(View v) {
// When the user clicks, we toggle the visibility of navigation elements.
int curVis = getSystemUiVisibility();
setNavVisibility((curVis&SYSTEM_UI_FLAG_LOW_PROFILE) != 0);
}
void setBaseSystemUiVisibility(int visibility) {
mBaseSystemUiVisibility = visibility;
}
void setNavVisibility(boolean visible) {
int newVis = mBaseSystemUiVisibility;
if (!visible) {
newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN;
}
final boolean changed = newVis == getSystemUiVisibility();
// Unschedule any pending event to hide navigation if we are
// changing the visibility, or making the UI visible.
if (changed || visible) {
Handler h = getHandler();
if (h != null) {
h.removeCallbacks(mNavHider);
}
}
// Set the new desired visibility.
setSystemUiVisibility(newVis);
}
}
//END_INCLUDE(content)
Content mContent;
public ContentBrowserActivity() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R.layout.content_browser);
mContent = (Content)findViewById(R.id.content);
ActionBar bar = getActionBar();
bar.addTab(bar.newTab().setText("Tab 1").setTabListener(this));
bar.addTab(bar.newTab().setText("Tab 2").setTabListener(this));
bar.addTab(bar.newTab().setText("Tab 3").setTabListener(this));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.content_actions, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setOnQueryTextListener(this);
// Set file with share history to the provider and set the share intent.
MenuItem actionItem = menu.findItem(R.id.menu_item_share_action_provider_action_bar);
ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider();
actionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
// Note that you can set/change the intent any time,
// say when the user has selected an image.
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/*");
Uri uri = Uri.fromFile(getFileStreamPath("shared.png"));
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
actionProvider.setShareIntent(shareIntent);
return true;
}
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
}
@Override
protected void onResume() {
super.onResume();
}
/**
* This method is declared in the menu.
*/
public void onSort(MenuItem item) {
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.show_tabs:
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
item.setChecked(true);
return true;
case R.id.hide_tabs:
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
item.setChecked(true);
return true;
case R.id.stable_layout:
item.setChecked(!item.isChecked());
mContent.setBaseSystemUiVisibility(item.isChecked()
? View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
: View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
return true;
}
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
Toast.makeText(this, "Searching for: " + query + "...", Toast.LENGTH_SHORT).show();
return true;
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}

View File

@@ -16,20 +16,32 @@
package com.example.android.apis.view;
import android.app.ActionBar;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.app.ActionBar.Tab;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.SearchView;
import android.widget.ShareActionProvider;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.SearchView.OnQueryTextListener;
import com.example.android.apis.R;
@@ -38,8 +50,9 @@ import com.example.android.apis.R;
* the system decor, in order to better focus the user's attention or use available screen real
* estate on the task at hand.
*/
public class OverscanActivity extends Activity {
public static class IV extends ImageView {
public class OverscanActivity extends Activity
implements OnQueryTextListener, ActionBar.TabListener {
public static class IV extends ImageView implements View.OnSystemUiVisibilityChangeListener {
private OverscanActivity mActivity;
public IV(Context context) {
super(context);
@@ -48,64 +61,16 @@ public class OverscanActivity extends Activity {
super(context, attrs);
}
public void setActivity(OverscanActivity act) {
setOnSystemUiVisibilityChangeListener(this);
mActivity = act;
}
@Override
public void onSizeChanged(int w, int h, int oldw, int oldh) {
mActivity.refreshSizes();
}
public void onSystemUiVisibilityChanged(int visibility) {
mActivity.getState().onSystemUiVisibilityChanged(visibility);
}
}
private interface State {
void apply();
State next();
void onSystemUiVisibilityChanged(int visibility);
}
private class NormalState implements State {
public void apply() {
display("Normal");
setFullscreen(false);
mImage.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
}
public State next() {
return new FullscreenState();
}
public void onSystemUiVisibilityChanged(int visibility) {
}
}
private class FullscreenState implements State {
public void apply() {
display("FULLSCREEN");
setFullscreen(true);
}
public State next() {
return new FullscreenLightsOutState();
}
public void onSystemUiVisibilityChanged(int visibility) {
}
}
private class FullscreenLightsOutState implements State {
public void apply() {
display("FULLSCREEN + LOW_PROFILE");
mImage.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
}
public State next() {
return new OverscanState();
}
public void onSystemUiVisibilityChanged(int visibility) {
}
}
private class OverscanState implements State {
public void apply() {
display("FULLSCREEN + HIDE_NAVIGATION");
mImage.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}
public State next() {
return new NormalState();
}
public void onSystemUiVisibilityChanged(int visibility) {
@Override
public void onSystemUiVisibilityChange(int visibility) {
mActivity.updateCheckControls();
}
}
@@ -131,20 +96,18 @@ public class OverscanActivity extends Activity {
mImage.getRight(), mImage.getBottom());
}
void refreshSizes() {
mText2.setText(getDisplaySize() + " " + getViewSize());
}
private void display(String text) {
mText1.setText(text);
refreshSizes();
}
State getState() {
return mState;
mMetricsText.setText(getDisplaySize() + " " + getViewSize());
}
static int TOAST_LENGTH = 500;
IV mImage;
TextView mText1, mText2;
State mState;
CheckBox[] mCheckControls = new CheckBox[6];
int[] mCheckFlags = new int[] { View.SYSTEM_UI_FLAG_LOW_PROFILE,
View.SYSTEM_UI_FLAG_FULLSCREEN, View.SYSTEM_UI_FLAG_HIDE_NAVIGATION,
View.SYSTEM_UI_FLAG_LAYOUT_STABLE, View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN,
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
};
TextView mMetricsText;
public OverscanActivity() {
}
@@ -153,23 +116,54 @@ public class OverscanActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// we need to ask for LAYOUT_IN_SCREEN before the window decor appears
Window win = getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
winParams.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
win.setAttributes(winParams);
getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R.layout.overscan);
mImage = (IV) findViewById(R.id.image);
mImage.setActivity(this);
mText1 = (TextView) findViewById(R.id.text1);
mText2 = (TextView) findViewById(R.id.text2);
CompoundButton.OnCheckedChangeListener checkChangeListener
= new CompoundButton.OnCheckedChangeListener() {
@Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
updateSystemUi();
}
};
mCheckControls[0] = (CheckBox) findViewById(R.id.modeLowProfile);
mCheckControls[1] = (CheckBox) findViewById(R.id.modeFullscreen);
mCheckControls[2] = (CheckBox) findViewById(R.id.modeHideNavigation);
mCheckControls[3] = (CheckBox) findViewById(R.id.layoutStable);
mCheckControls[4] = (CheckBox) findViewById(R.id.layoutFullscreen);
mCheckControls[5] = (CheckBox) findViewById(R.id.layoutHideNavigation);
for (int i=0; i<mCheckControls.length; i++) {
mCheckControls[i].setOnCheckedChangeListener(checkChangeListener);
}
mMetricsText = (TextView) findViewById(R.id.metricsText);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.content_actions, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setOnQueryTextListener(this);
// Set file with share history to the provider and set the share intent.
MenuItem actionItem = menu.findItem(R.id.menu_item_share_action_provider_action_bar);
ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider();
actionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
// Note that you can set/change the intent any time,
// say when the user has selected an image.
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/*");
Uri uri = Uri.fromFile(getFileStreamPath("shared.png"));
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
actionProvider.setShareIntent(shareIntent);
return true;
}
@Override
public void onAttachedToWindow() {
mState = new NormalState();
mState.apply();
updateCheckControls();
}
@Override
@@ -177,8 +171,61 @@ public class OverscanActivity extends Activity {
super.onResume();
}
public void clicked(View v) {
mState = mState.next();
mState.apply();
public void onSort(MenuItem item) {
}
@Override
public boolean onQueryTextChange(String newText) {
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
Toast.makeText(this, "Searching for: " + query + "...", Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.show_tabs:
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
item.setChecked(true);
return true;
case R.id.hide_tabs:
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
item.setChecked(true);
return true;
}
return false;
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
public void updateCheckControls() {
int visibility = mImage.getSystemUiVisibility();
for (int i=0; i<mCheckControls.length; i++) {
mCheckControls[i].setChecked((visibility&mCheckFlags[i]) != 0);
}
}
public void updateSystemUi() {
int visibility = 0;
for (int i=0; i<mCheckControls.length; i++) {
if (mCheckControls[i].isChecked()) {
visibility |= mCheckFlags[i];
}
}
mImage.setSystemUiVisibility(visibility);
}
}

View File

@@ -0,0 +1,236 @@
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.apis.view;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.SearchView;
import android.widget.ShareActionProvider;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.SearchView.OnQueryTextListener;
import com.example.android.apis.R;
/**
* This activity demonstrates how to use system UI flags to implement
* a video player style of UI (where the navigation bar should be hidden
* when the user isn't interacting with the screen to achieve full screen
* video playback).
*/
public class VideoPlayerActivity extends Activity
implements OnQueryTextListener, ActionBar.TabListener {
/**
* Implementation of a view for displaying full-screen video playback,
* using system UI flags to transition in and out of modes where the entire
* screen can be filled with content (at the expense of no user interaction).
*/
//BEGIN_INCLUDE(content)
public static class Content extends ImageView implements
View.OnSystemUiVisibilityChangeListener, View.OnClickListener {
TextView mText;
boolean mNavVisible;
int mBaseSystemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | SYSTEM_UI_FLAG_LAYOUT_STABLE;
int mLastSystemUiVis;
Runnable mNavHider = new Runnable() {
@Override public void run() {
setNavVisibility(false);
}
};
public Content(Context context, AttributeSet attrs) {
super(context, attrs);
setOnSystemUiVisibilityChangeListener(this);
setOnClickListener(this);
setNavVisibility(true);
}
@Override public void onSystemUiVisibilityChange(int visibility) {
// Detect when we go out of low-profile mode, to also go out
// of full screen. We only do this when the low profile mode
// is changing from its last state, and turning off.
int diff = mLastSystemUiVis ^ visibility;
mLastSystemUiVis = visibility;
if ((diff&SYSTEM_UI_FLAG_LOW_PROFILE) != 0
&& (visibility&SYSTEM_UI_FLAG_LOW_PROFILE) == 0) {
setNavVisibility(true);
}
}
@Override protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
// When we become visible, we show our navigation elements briefly
// before hiding them.
setNavVisibility(true);
}
@Override public void onClick(View v) {
// When the user clicks, we make the navigation visible. In a real
// implementation, this would probably toggle between pause/play.
setNavVisibility(true);
}
void setBaseSystemUiVisibility(int visibility) {
mBaseSystemUiVisibility = visibility;
}
void setNavVisibility(boolean visible) {
int newVis = mBaseSystemUiVisibility;
if (!visible) {
newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN
| SYSTEM_UI_FLAG_HIDE_NAVIGATION;
}
// If we are now visible, schedule a timer for us to go invisible.
if (visible) {
Handler h = getHandler();
if (h != null) {
h.removeCallbacks(mNavHider);
h.postDelayed(mNavHider, 3000);
}
}
// Set the new desired visibility.
setSystemUiVisibility(newVis);
}
}
//END_INCLUDE(content)
Content mContent;
public VideoPlayerActivity() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
setContentView(R.layout.video_player);
mContent = (Content)findViewById(R.id.content);
ActionBar bar = getActionBar();
bar.addTab(bar.newTab().setText("Tab 1").setTabListener(this));
bar.addTab(bar.newTab().setText("Tab 2").setTabListener(this));
bar.addTab(bar.newTab().setText("Tab 3").setTabListener(this));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.content_actions, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
searchView.setOnQueryTextListener(this);
// Set file with share history to the provider and set the share intent.
MenuItem actionItem = menu.findItem(R.id.menu_item_share_action_provider_action_bar);
ShareActionProvider actionProvider = (ShareActionProvider) actionItem.getActionProvider();
actionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
// Note that you can set/change the intent any time,
// say when the user has selected an image.
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/*");
Uri uri = Uri.fromFile(getFileStreamPath("shared.png"));
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
actionProvider.setShareIntent(shareIntent);
return true;
}
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
}
@Override
protected void onResume() {
super.onResume();
}
/**
* This method is declared in the menu.
*/
public void onSort(MenuItem item) {
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.show_tabs:
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
item.setChecked(true);
return true;
case R.id.hide_tabs:
getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
item.setChecked(true);
return true;
case R.id.stable_layout:
item.setChecked(!item.isChecked());
mContent.setBaseSystemUiVisibility(item.isChecked()
? View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
: View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
return true;
}
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return true;
}
@Override
public boolean onQueryTextSubmit(String query) {
Toast.makeText(this, "Searching for: " + query + "...", Toast.LENGTH_SHORT).show();
return true;
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}