/* * 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.google.tv.leftnavbar.demo; import com.example.google.tv.leftnavbar.LeftNavBar; import com.example.google.tv.leftnavbar.LeftNavBarService; import com.example.google.tv.leftnavbar.R; import android.app.ActionBar; import android.app.Activity; import android.app.ActionBar.LayoutParams; import android.app.ActionBar.Tab; import android.app.FragmentTransaction; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.text.TextUtils; import android.view.Gravity; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.TextView; /** * Exercises the LeftNavBar API. */ public class LeftNavbarActivity extends BaseActivity { private static final ActionBar.TabListener BLANK_LISTENER = new ActionBar.TabListener() { @Override public void onTabSelected(Tab tab, FragmentTransaction ft) {} @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) {} @Override public void onTabReselected(Tab tab, FragmentTransaction ft) {} }; private boolean mHasOptionsMenu; private boolean mHasShowAlwaysItems; private boolean mHasCustomTabs; private LeftNavBar mLeftNavBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LeftNavBar bar = (LeftNavBarService.instance()).getLeftNavBar((Activity) this); setContentView(R.layout.api_controls); bar.setBackgroundDrawable(getResources().getDrawable(R.drawable.leftnav_bar_background_dark)); setupButtons(); // Prepare the left navigation bar. setupBar(); } private LeftNavBar getLeftNavBar() { if (mLeftNavBar == null) { mLeftNavBar = new LeftNavBar(this); mLeftNavBar.setOnClickHomeListener(new View.OnClickListener() { @Override public void onClick(View v) { // This is called when the app icon is selected in the left navigation bar // Doing nothing. } }); } return mLeftNavBar; } private void setupBar() { ActionBar bar = getLeftNavBar(); bar.setTitle(R.string.title_text); setupCustomView(); // Tabs. setupTabs(mHasCustomTabs); // Navigation list. SpinnerListAdapter adapter = new SpinnerListAdapter(this); bar.setListNavigationCallbacks(adapter, new ActionBar.OnNavigationListener() { @Override public boolean onNavigationItemSelected(int itemPosition, long itemId) { postMessage("Item selected: " + itemPosition); return true; } }); } private void setupCustomView() { getLeftNavBar().setCustomView(R.layout.custom_view); LayoutParams params = new LayoutParams(0); params.width = params.height = nextDimension(0); params.gravity = nextGravity(nextGravity(0, true), false); applyCustomParams(params); } private LayoutParams getCustomParams() { return (LayoutParams) getLeftNavBar().getCustomView().getLayoutParams(); } private void applyCustomParams(LayoutParams params) { ActionBar bar = getLeftNavBar(); bar.setCustomView(bar.getCustomView(), params); } private static int nextDimension(int dimension) { switch (dimension) { case 40: return 100; case 100: return LayoutParams.MATCH_PARENT; case LayoutParams.MATCH_PARENT: default: return 40; } } private static int nextGravity(int gravity, boolean horizontal) { int hGravity = gravity & Gravity.HORIZONTAL_GRAVITY_MASK; int vGravity = gravity & Gravity.VERTICAL_GRAVITY_MASK; if (horizontal) { switch (hGravity) { case Gravity.LEFT: hGravity = Gravity.CENTER_HORIZONTAL; break; case Gravity.CENTER_HORIZONTAL: hGravity = Gravity.RIGHT; break; case Gravity.RIGHT: default: hGravity = Gravity.LEFT; break; } } else { switch (vGravity) { case Gravity.TOP: vGravity = Gravity.CENTER_VERTICAL; break; case Gravity.CENTER_VERTICAL: vGravity = Gravity.BOTTOM; break; case Gravity.BOTTOM: default: vGravity = Gravity.TOP; break; } } return hGravity | vGravity; } private void setupTabs(boolean custom) { ActionBar bar = getLeftNavBar(); bar.removeAllTabs(); if (custom) { addCustomTab(bar, R.string.tab_a); addCustomTab(bar, R.string.tab_b); addCustomTab(bar, R.string.tab_c); addCustomTab(bar, R.string.tab_d); } else { bar.addTab(bar.newTab().setText(R.string.tab_b).setIcon(R.drawable.tab_b) .setTabListener(BLANK_LISTENER), false); ActionBar.Tab tab = bar.newTab().setText(R.string.tab_a).setIcon(R.drawable.tab_a) .setTabListener(new ActionBar.TabListener() { @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { postMessage("Unselected " + tab); } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { postMessage("Selected " + tab); } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { postMessage("Reselected " + tab); } }); bar.addTab(tab, 0, true); bar.addTab(bar.newTab().setText(R.string.tab_c).setIcon(R.drawable.tab_c) .setTabListener(BLANK_LISTENER), false); bar.addTab(bar.newTab().setText(R.string.tab_d).setIcon(R.drawable.tab_d) .setTabListener(BLANK_LISTENER), false); } } private void addCustomTab(ActionBar bar, int title) { ActionBar.Tab tab = bar.newTab().setCustomView(R.layout.custom_tab) .setTabListener(BLANK_LISTENER); ((Button) tab.getCustomView()).setText(title); bar.addTab(tab); } @Override public boolean onCreateOptionsMenu(Menu menu) { if (!mHasOptionsMenu) { return false; } getMenuInflater().inflate(R.menu.bar, menu); if (mHasShowAlwaysItems) { menu.findItem(R.id.option_a).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); menu.findItem(R.id.option_b).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); } return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) { postMessage("Going home"); } return true; } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { ActionBar bar = getLeftNavBar(); View fakeContent = findViewById(R.id.simulated_background); View controls = findViewById(R.id.controls); switch (keyCode) { case KeyEvent.KEYCODE_ESCAPE: setBackground(0 /* controls */); return true; case KeyEvent.KEYCODE_1: setBackground(R.drawable.content_img_1); return true; case KeyEvent.KEYCODE_2: setBackground(R.drawable.content_img_2); return true; case KeyEvent.KEYCODE_N: bar.show(); return true; case KeyEvent.KEYCODE_M: bar.hide(); return true; default: return super.onKeyUp(keyCode, event); } } private void setBackground(int image) { View fakeContent = findViewById(R.id.simulated_background); View controls = findViewById(R.id.controls); if (image != 0) { fakeContent.setBackgroundResource(image); fakeContent.setVisibility(View.VISIBLE); controls.setVisibility(View.GONE); } else { controls.setVisibility(View.VISIBLE); fakeContent.setVisibility(View.GONE); } } private void flipOption(int option) { ActionBar bar = getLeftNavBar(); int options = bar.getDisplayOptions(); boolean hadOption = (options & option) != 0; bar.setDisplayOptions(hadOption ? 0 : option, option); } private void setupButtons() { final ActionBar bar = getLeftNavBar(); findViewById(R.id.button_home_show).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { flipOption(ActionBar.DISPLAY_SHOW_HOME); } }); findViewById(R.id.button_home_use_logo).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { flipOption(ActionBar.DISPLAY_USE_LOGO); } }); findViewById(R.id.button_home_as_up).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { flipOption(ActionBar.DISPLAY_HOME_AS_UP); } }); findViewById(R.id.button_home_logo_expand).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { flipOption(LeftNavBar.DISPLAY_USE_LOGO_WHEN_EXPANDED); } }); findViewById(R.id.button_title_show).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { flipOption(ActionBar.DISPLAY_SHOW_TITLE); } }); findViewById(R.id.button_subtitle).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { CharSequence subtitle = bar.getSubtitle(); bar.setSubtitle( TextUtils.isEmpty(subtitle) ? getString(R.string.subtitle_text) : null); } }); findViewById(R.id.button_navigation_standard).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { bar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); } }); findViewById(R.id.button_navigation_tabs).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); } }); findViewById(R.id.button_navigation_list).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { bar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); } }); findViewById(R.id.button_options_show).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mHasOptionsMenu = !mHasOptionsMenu; invalidateOptionsMenu(); } }); findViewById(R.id.button_options_always).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mHasShowAlwaysItems = !mHasShowAlwaysItems; invalidateOptionsMenu(); } }); findViewById(R.id.button_behavior_expanded).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { flipOption(LeftNavBar.DISPLAY_ALWAYS_EXPANDED); } }); findViewById(R.id.button_behavior_focus).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { flipOption(LeftNavBar.DISPLAY_AUTO_EXPAND); } }); findViewById(R.id.button_misc_background).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { bar.setBackgroundDrawable(new ColorDrawable(Color.DKGRAY)); } }); findViewById(R.id.button_misc_custom_view).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { flipOption(ActionBar.DISPLAY_SHOW_CUSTOM); } }); findViewById(R.id.button_custom_tabs).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mHasCustomTabs = !mHasCustomTabs; setupTabs(mHasCustomTabs); } }); findViewById(R.id.button_show_progress).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { flipOption(LeftNavBar.DISPLAY_SHOW_INDETERMINATE_PROGRESS); } }); findViewById(R.id.button_post_messages).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mMessagesEnabled = ((CheckBox) v).isChecked(); } }); findViewById(R.id.button_cv_size).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LayoutParams params = getCustomParams(); int dimension = nextDimension(params.width); params.width = dimension; params.height = dimension; applyCustomParams(params); } }); findViewById(R.id.button_cv_hgravity).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LayoutParams params = getCustomParams(); params.gravity = nextGravity(params.gravity, true); applyCustomParams(params); } }); findViewById(R.id.button_cv_vgravity).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LayoutParams params = getCustomParams(); params.gravity = nextGravity(params.gravity, false); applyCustomParams(params); } }); } private static final class SpinnerListAdapter extends BaseAdapter { private static final int[] NAMES = { R.string.list_a, R.string.list_b, R.string.list_c }; private static final int[] PICTURES = { R.drawable.list_a, R.drawable.list_b, R.drawable.list_c }; private final Context mContext; SpinnerListAdapter(Context context) { mContext = context; } @Override public int getCount() { return NAMES.length; } @Override public long getItemId(int position) { return position; } @Override public Object getItem(int position) { return null; } @Override public View getView(int position, View convertView, ViewGroup parent) { return createView(position, convertView, parent, false); } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { return createView(position, convertView, parent, true); } private View createView(int position, View convertView, ViewGroup parent, boolean inList) { if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate( R.layout.spinner_item, parent, false); } ImageView picture = (ImageView) convertView.findViewById(R.id.picture); TextView name = (TextView) convertView.findViewById(R.id.name); picture.setImageResource(PICTURES[position]); if (inList) { picture.setBackgroundResource(R.drawable.spinner_list_item_background); name.setVisibility(View.VISIBLE); name.setText(NAMES[position]); } else { picture.setBackgroundResource(R.drawable.spinner_item_background); name.setVisibility(View.GONE); } return convertView; } } }