/* * Copyright 2011 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. */ package com.bigpupdev.synodroid.utils; import com.bigpupdev.synodroid.R; import com.bigpupdev.synodroid.ui.BaseActivity; import com.bigpupdev.synodroid.ui.DetailActivity; import com.bigpupdev.synodroid.ui.HomeActivity; import com.slidingmenu.lib.SlidingMenu; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.view.View.OnClickListener; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; /** * A class that handles some common activity-related functionality in the app, such as setting up * the action bar. This class provides functioanlity useful for both phones and tablets, and does * not require any Android 3.0-specific features. */ public class ActivityHelper { protected Activity mActivity; private SlidingMenu menu = null; /** * Factory method for creating {@link ActivityHelper} objects for a given activity. Depending * on which device the app is running, either a basic helper or Honeycomb-specific helper will * be returned. */ public static ActivityHelper createInstance(Activity activity) { return UIUtils.isHoneycomb() ? new ActivityHelperHoneycomb(activity) : new ActivityHelper(activity); } public void setupSearch(Activity ctx, Menu menu){} public boolean startSearch(){return true;} public void stopSearch(){} protected ActivityHelper(Activity activity) { mActivity = activity; } public void triggerDDNavigationMode(){} public void invalidateOptionMenu(){} public void onPostCreate(Bundle savedInstanceState) { // Create the action bar SimpleMenu menu = new SimpleMenu(mActivity); mActivity.onCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu); // TODO: call onPreparePanelMenu here as well for (int i = 0; i < menu.size(); i++) { MenuItem item = menu.getItem(i); if (item.getOrder() == 0) addActionButtonCompatFromMenuItem(item); } //ActionMode menus ViewGroup actionMode = (ViewGroup) mActivity.findViewById(R.id.actionmode_compat); if (actionMode != null){ SimpleMenu actionMenu = new SimpleMenu(mActivity); if (mActivity instanceof HomeActivity){ mActivity.getMenuInflater().inflate(R.menu.action_mode_menu, actionMenu); } else if (mActivity instanceof DetailActivity) { mActivity.getMenuInflater().inflate(R.menu.action_mode_file_menu, actionMenu); } for (int i = 0; i < actionMenu.size(); i++) { MenuItem item = actionMenu.getItem(i); addActionButtonCompatFromMenuItem(actionMode, item, null); } } } public boolean onCreateOptionsMenu(Menu menu) { return false; } public boolean onOptionsItemSelected(MenuItem item) { return false; } public boolean onKeyDown(int keyCode, KeyEvent event) { return false; } /** * Method, to be called in <code>onPostCreate</code>, that sets up this activity as the * home activity for the app. */ public void setupHomeActivity() { } /** * Method, to be called in <code>onPostCreate</code>, that sets up this activity as a * sub-activity in the app. */ public void setupSubActivity() { } /** * Invoke "home" action, returning to {@link com.google.android.apps.iosched.ui.HomeActivity}. */ public void goHome() { if (menu != null){ menu.toggle(); } else{ if (mActivity instanceof HomeActivity) { return; } final Intent intent = new Intent(mActivity, HomeActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); mActivity.startActivity(intent); } } public void setTitleOnClickListener(OnClickListener ocl){ if (menu != null){ ((BaseActivity) mActivity).setServerChangeListener(ocl); } else{ ViewGroup actionBar = getActionBarCompat(); if (actionBar == null) { return; } ImageButton logo = (ImageButton) actionBar.findViewById(R.id.actionbar_compat_logo); if (logo != null) { logo.setOnClickListener(ocl); } } } /** * Sets up the action bar with the given title and accent color. If title is null, then * the app logo will be shown instead of a title. Otherwise, a home button and title are * visible. If color is null, then the default colorstrip is visible. */ public void setupActionBar(CharSequence title, boolean is_home, SlidingMenu pmenu) { final ViewGroup actionBarCompat = getActionBarCompat(); if (actionBarCompat == null) { return; } LinearLayout.LayoutParams springLayoutParams = new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT); springLayoutParams.weight = 1; LinearLayout.LayoutParams secLayoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); secLayoutParams.gravity = 0x10; secLayoutParams.leftMargin = 4; OnClickListener homeClickListener = new OnClickListener() { public void onClick(View view) { goHome(); } }; if (!is_home || menu == null){ // Add Home button addActionButtonCompat(R.drawable.ic_title_home, R.string.description_home, homeClickListener, true); } else{ ImageButton logo = new ImageButton(mActivity, null, R.attr.actionbarCompatLogoStyle); logo.setLayoutParams(secLayoutParams); actionBarCompat.addView(logo); } // Add title text TextView titleText = new TextView(mActivity, null, R.attr.actionbarCompatTextStyle); titleText.setLayoutParams(springLayoutParams); titleText.setText(title); actionBarCompat.addView(titleText); //ACTION MODE STUFF ViewGroup actionMode = (ViewGroup) mActivity.findViewById(R.id.actionmode_compat); if (actionMode != null){ addActionButtonCompat(actionMode, R.attr.actionmodeCompatLogoStyle, R.drawable.actionmode_compat_logo, R.string.description_home, null, true); // Add title text TextView actionText = new TextView(mActivity, null, R.attr.actionmodeCompatTextStyle); actionText.setLayoutParams(springLayoutParams); actionText.setText(""); actionMode.addView(actionText); } menu = pmenu; } /** * Sets the action bar title to the given string. */ public void setActionBarTitle(CharSequence title, boolean is_secure) { ViewGroup actionBar = getActionBarCompat(); if (actionBar == null || title.equals("")) { return; } TextView titleText = (TextView) actionBar.findViewById(R.id.actionbar_compat_text); if (titleText != null) { titleText.setText(title); } ImageButton sec = (ImageButton) actionBar.findViewById(R.id.actionbar_compat_logo); if (sec != null) { sec.setImageResource(is_secure ? R.drawable.actionbar_compat_logo_https : R.drawable.actionbar_compat_logo); } } /** * Returns the {@link ViewGroup} for the action bar on phones (compatibility action bar). * Can return null, and will return null on Honeycomb. */ public ViewGroup getActionBarCompat() { return (ViewGroup) mActivity.findViewById(R.id.actionbar_compat); } /** * Adds an action bar button to the compatibility action bar (on phones). */ private View addActionButtonCompat(ViewGroup actionBar, int style, int iconResId, int textResId, OnClickListener clickListener, boolean separatorAfter) { // Create the button ImageButton actionButton = new ImageButton(mActivity, null, style); actionButton.setLayoutParams(new ViewGroup.LayoutParams( (int) mActivity.getResources().getDimension(R.dimen.actionbar_compat_height), ViewGroup.LayoutParams.MATCH_PARENT)); actionButton.setImageResource(iconResId); actionButton.setScaleType(ImageView.ScaleType.CENTER); actionButton.setContentDescription(mActivity.getResources().getString(textResId)); if (clickListener != null) actionButton.setOnClickListener(clickListener); // Add separator and button to the action bar in the desired order actionBar.addView(actionButton); return actionButton; } private View addActionButtonCompat(int iconResId, int textResId, OnClickListener clickListener, boolean separatorAfter) { final ViewGroup actionBar = getActionBarCompat(); if (actionBar == null) { return null; } return addActionButtonCompat(actionBar, R.attr.actionbarCompatButtonStyle, iconResId, textResId, clickListener, separatorAfter); } /** * Adds an action button to the compatibility action bar, using menu information from a * {@link MenuItem}. If the menu item ID is <code>menu_refresh</code>, the menu item's state * can be changed to show a loading spinner using * {@link ActivityHelper#setRefreshActionButtonCompatState(boolean)}. */ private View addActionButtonCompatFromMenuItem(final MenuItem item) { final ViewGroup actionBar = getActionBarCompat(); if (actionBar == null) { return null; } OnClickListener ocl = new View.OnClickListener() { public void onClick(View view) { mActivity.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item); } }; return addActionButtonCompatFromMenuItem(actionBar, item, ocl); } private View addActionButtonCompatFromMenuItem(ViewGroup actionBar, final MenuItem item, OnClickListener l) { // Create the button ImageButton actionButton = new ImageButton(mActivity, null, R.attr.actionbarCompatButtonStyle); actionButton.setId(item.getItemId()); actionButton.setLayoutParams(new ViewGroup.LayoutParams( (int) mActivity.getResources().getDimension(R.dimen.actionbar_compat_height), ViewGroup.LayoutParams.MATCH_PARENT)); actionButton.setImageDrawable(item.getIcon()); actionButton.setScaleType(ImageView.ScaleType.CENTER); actionButton.setContentDescription(item.getTitle()); if (l != null) actionButton.setOnClickListener(l); actionBar.addView(actionButton); if (item.getItemId() == R.id.menu_refresh) { // Refresh buttons should be stateful, and allow for indeterminate progress indicators, // so add those. int buttonWidth = mActivity.getResources() .getDimensionPixelSize(R.dimen.actionbar_compat_height); int buttonWidthDiv3 = buttonWidth / 3; ProgressBar indicator = new ProgressBar(mActivity, null, R.attr.actionbarCompatProgressIndicatorStyle); LinearLayout.LayoutParams indicatorLayoutParams = new LinearLayout.LayoutParams( buttonWidthDiv3, buttonWidthDiv3); indicatorLayoutParams.setMargins(buttonWidthDiv3-1, buttonWidthDiv3, buttonWidth - 2 * buttonWidthDiv3, 0); indicator.setLayoutParams(indicatorLayoutParams); indicator.setVisibility(View.GONE); indicator.setId(R.id.menu_refresh_progress); actionBar.addView(indicator); } return actionButton; } /** * Sets the indeterminate loading state of a refresh button added with * {@link ActivityHelper#addActionButtonCompatFromMenuItem(android.view.MenuItem)} * (where the item ID was menu_refresh). */ public void setRefreshActionButtonCompatState(boolean refreshing) { View refreshButton = mActivity.findViewById(R.id.menu_refresh); View refreshIndicator = mActivity.findViewById(R.id.menu_refresh_progress); if (refreshButton != null) { refreshButton.setVisibility(refreshing ? View.GONE : View.VISIBLE); } if (refreshIndicator != null) { refreshIndicator.setVisibility(refreshing ? View.VISIBLE : View.GONE); } } public void stopActionMode(){ View actionBar = mActivity.findViewById(R.id.actionbar_compat); View actionMode = mActivity.findViewById(R.id.actionmode_compat); if (actionBar != null){ actionBar.setVisibility(View.VISIBLE); } if (actionMode != null){ actionMode.setVisibility(View.GONE); } } public void startActionMode(OnClickListener cancelClickListener, OnClickListener clearClickListener, OnClickListener resumeClickListener, OnClickListener pauseClickListener){ ViewGroup actionBar = (ViewGroup) mActivity.findViewById(R.id.actionbar_compat); ViewGroup actionMode = (ViewGroup) mActivity.findViewById(R.id.actionmode_compat); if (actionBar != null){ actionBar.setVisibility(View.GONE); } if (actionMode != null){ actionMode.setVisibility(View.VISIBLE); ImageButton logo = (ImageButton) actionMode.findViewById(R.id.actionmode_compat_logo); logo.setOnClickListener(cancelClickListener); ImageButton clear = (ImageButton) actionMode.findViewById(R.id.menu_clear); ImageButton pause = (ImageButton) actionMode.findViewById(R.id.menu_pause); ImageButton resume = (ImageButton) actionMode.findViewById(R.id.menu_resume); clear.setOnClickListener(clearClickListener); pause.setOnClickListener(pauseClickListener); resume.setOnClickListener(resumeClickListener); } } public void setActionModeTitle(String title){ ViewGroup actionMode = (ViewGroup) mActivity.findViewById(R.id.actionmode_compat); if (actionMode != null){ TextView titleText = (TextView) actionMode.findViewById(R.id.actionmode_compat_text); titleText.setText(title); } } public void startActionMode(OnClickListener cancelClickListener, OnClickListener highClickListener, OnClickListener normalClickListener, OnClickListener lowClickListener, OnClickListener skipClickListener){ ViewGroup actionBar = (ViewGroup) mActivity.findViewById(R.id.actionbar_compat); ViewGroup actionMode = (ViewGroup) mActivity.findViewById(R.id.actionmode_compat); if (actionBar != null){ actionBar.setVisibility(View.GONE); } if (actionMode != null){ actionMode.setVisibility(View.VISIBLE); ImageButton logo = (ImageButton) actionMode.findViewById(R.id.actionmode_compat_logo); logo.setOnClickListener(cancelClickListener); ImageButton high = (ImageButton) actionMode.findViewById(R.id.menu_high); ImageButton normal = (ImageButton) actionMode.findViewById(R.id.menu_normal); ImageButton low = (ImageButton) actionMode.findViewById(R.id.menu_low); ImageButton skip = (ImageButton) actionMode.findViewById(R.id.menu_skip); high.setOnClickListener(highClickListener); normal.setOnClickListener(normalClickListener); low.setOnClickListener(lowClickListener); skip.setOnClickListener(skipClickListener); } } }