aboutsummaryrefslogtreecommitdiffstats
path: root/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal
diff options
context:
space:
mode:
authorDominik Schürmann <dominik@dominikschuermann.de>2013-09-09 13:19:43 +0200
committerDominik Schürmann <dominik@dominikschuermann.de>2013-09-09 13:19:43 +0200
commitaae87b894f72a719a850ec32ad6944bd5c743331 (patch)
treeb5a221fcb529c07b309f5bde0563155df28a472c /libraries/ActionBarSherlock/src/com/actionbarsherlock/internal
parent5b6880d2e34f4c8a4bfba87b5ce53d3c6727b744 (diff)
downloadopen-keychain-aae87b894f72a719a850ec32ad6944bd5c743331.tar.gz
open-keychain-aae87b894f72a719a850ec32ad6944bd5c743331.tar.bz2
open-keychain-aae87b894f72a719a850ec32ad6944bd5c743331.zip
Update actionbarsherlock from 4.2 to 4.4
Diffstat (limited to 'libraries/ActionBarSherlock/src/com/actionbarsherlock/internal')
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java258
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java79
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java91
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarImpl.java9
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java12
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java1
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java3
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java6
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java35
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java21
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java9
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarView.java87
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java23
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java64
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java12
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java150
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java25
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsToast.java60
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/PopupWindowCompat.java178
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java2
-rw-r--r--libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/TabsLinearLayout.java113
21 files changed, 741 insertions, 497 deletions
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java
index 5e69275c7..e89850203 100644
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java
@@ -1,11 +1,5 @@
package com.actionbarsherlock.internal;
-import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
-import static com.actionbarsherlock.internal.ResourcesCompat.getResources_getBoolean;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import org.xmlpull.v1.XmlPullParser;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
@@ -28,9 +22,8 @@ import android.view.Window;
import android.view.accessibility.AccessibilityEvent;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
-import android.widget.FrameLayout;
-import android.widget.TextView;
import com.actionbarsherlock.ActionBarSherlock;
+import com.actionbarsherlock.BuildConfig;
import com.actionbarsherlock.R;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.internal.app.ActionBarImpl;
@@ -46,6 +39,13 @@ import com.actionbarsherlock.internal.widget.IcsProgressBar;
import com.actionbarsherlock.view.ActionMode;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import org.xmlpull.v1.XmlPullParser;
+
+import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+import static com.actionbarsherlock.internal.ResourcesCompat.getResources_getBoolean;
@ActionBarSherlock.Implementation(api = 7)
public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBuilder.Callback, com.actionbarsherlock.view.Window.Callback, MenuPresenter.Callback, android.view.MenuItem.OnMenuItemClickListener {
@@ -108,13 +108,6 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
/** Parent view in which the context action bar is displayed. */
private ActionBarContextView mActionModeView;
- /** Title view used with dialogs. */
- private TextView mTitleView;
- /** Current activity title. */
- private CharSequence mTitle = null;
- /** Whether or not this "activity" is floating (i.e., a dialog) */
- private boolean mIsFloating;
-
///////////////////////////////////////////////////////////////////////////
@@ -123,14 +116,14 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public ActionBar getActionBar() {
- if (DEBUG) Log.d(TAG, "[getActionBar]");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[getActionBar]");
initActionBar();
return aActionBar;
}
private void initActionBar() {
- if (DEBUG) Log.d(TAG, "[initActionBar]");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[initActionBar]");
// Initializing the window decor can change window feature flags.
// Make sure that we have the correct set before performing the test below.
@@ -157,14 +150,14 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public void setTitle(CharSequence title) {
- if (DEBUG) Log.d(TAG, "[setTitle] title: " + title);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setTitle] title: " + title);
dispatchTitleChanged(title, 0);
}
@Override
public ActionMode startActionMode(ActionMode.Callback callback) {
- if (DEBUG) Log.d(TAG, "[startActionMode] callback: " + callback);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[startActionMode] callback: " + callback);
if (mActionMode != null) {
mActionMode.finish();
@@ -215,7 +208,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public void dispatchConfigurationChanged(Configuration newConfig) {
- if (DEBUG) Log.d(TAG, "[dispatchConfigurationChanged] newConfig: " + newConfig);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchConfigurationChanged] newConfig: " + newConfig);
if (aActionBar != null) {
aActionBar.onConfigurationChanged(newConfig);
@@ -224,7 +217,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public void dispatchPostResume() {
- if (DEBUG) Log.d(TAG, "[dispatchPostResume]");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchPostResume]");
if (aActionBar != null) {
aActionBar.setShowHideAnimationEnabled(true);
@@ -233,7 +226,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public void dispatchPause() {
- if (DEBUG) Log.d(TAG, "[dispatchPause]");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchPause]");
if (wActionBar != null && wActionBar.isOverflowMenuShowing()) {
wActionBar.hideOverflowMenu();
@@ -242,7 +235,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public void dispatchStop() {
- if (DEBUG) Log.d(TAG, "[dispatchStop]");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchStop]");
if (aActionBar != null) {
aActionBar.setShowHideAnimationEnabled(false);
@@ -251,7 +244,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public void dispatchInvalidateOptionsMenu() {
- if (DEBUG) Log.d(TAG, "[dispatchInvalidateOptionsMenu]");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchInvalidateOptionsMenu]");
Bundle savedActionViewStates = null;
if (mMenu != null) {
@@ -275,7 +268,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public boolean dispatchOpenOptionsMenu() {
- if (DEBUG) Log.d(TAG, "[dispatchOpenOptionsMenu]");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchOpenOptionsMenu]");
if (!isReservingOverflow()) {
return false;
@@ -286,7 +279,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public boolean dispatchCloseOptionsMenu() {
- if (DEBUG) Log.d(TAG, "[dispatchCloseOptionsMenu]");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchCloseOptionsMenu]");
if (!isReservingOverflow()) {
return false;
@@ -300,7 +293,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public void dispatchPostCreate(Bundle savedInstanceState) {
- if (DEBUG) Log.d(TAG, "[dispatchOnPostCreate]");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchOnPostCreate]");
if (mIsDelegate) {
mIsTitleReady = true;
@@ -313,7 +306,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public boolean dispatchCreateOptionsMenu(android.view.Menu menu) {
- if (DEBUG) {
+ if (BuildConfig.DEBUG) {
Log.d(TAG, "[dispatchCreateOptionsMenu] android.view.Menu: " + menu);
Log.d(TAG, "[dispatchCreateOptionsMenu] returning true");
}
@@ -322,7 +315,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public boolean dispatchPrepareOptionsMenu(android.view.Menu menu) {
- if (DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] android.view.Menu: " + menu);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] android.view.Menu: " + menu);
if (mActionMode != null) {
return false;
@@ -348,7 +341,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
}
boolean result = mMenu.bindNativeOverflow(menu, this, mNativeItemMap);
- if (DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] returning " + result);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] returning " + result);
return result;
}
@@ -359,7 +352,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public boolean dispatchMenuOpened(int featureId, android.view.Menu menu) {
- if (DEBUG) Log.d(TAG, "[dispatchMenuOpened] featureId: " + featureId + ", menu: " + menu);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchMenuOpened] featureId: " + featureId + ", menu: " + menu);
if (featureId == Window.FEATURE_ACTION_BAR || featureId == Window.FEATURE_OPTIONS_PANEL) {
if (aActionBar != null) {
@@ -373,7 +366,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public void dispatchPanelClosed(int featureId, android.view.Menu menu){
- if (DEBUG) Log.d(TAG, "[dispatchPanelClosed] featureId: " + featureId + ", menu: " + menu);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchPanelClosed] featureId: " + featureId + ", menu: " + menu);
if (featureId == Window.FEATURE_ACTION_BAR || featureId == Window.FEATURE_OPTIONS_PANEL) {
if (aActionBar != null) {
@@ -384,22 +377,16 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public void dispatchTitleChanged(CharSequence title, int color) {
- if (DEBUG) Log.d(TAG, "[dispatchTitleChanged] title: " + title + ", color: " + color);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchTitleChanged] title: " + title + ", color: " + color);
- if (!mIsDelegate || mIsTitleReady) {
- if (mTitleView != null) {
- mTitleView.setText(title);
- } else if (wActionBar != null) {
- wActionBar.setWindowTitle(title);
- }
+ if ((!mIsDelegate || mIsTitleReady) && (wActionBar != null)) {
+ wActionBar.setWindowTitle(title);
}
-
- mTitle = title;
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
- if (DEBUG) Log.d(TAG, "[dispatchKeyEvent] event: " + event);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchKeyEvent] event: " + event);
final int keyCode = event.getKeyCode();
@@ -412,7 +399,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
if (action == KeyEvent.ACTION_UP) {
mActionMode.finish();
}
- if (DEBUG) Log.d(TAG, "[dispatchKeyEvent] returning true");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchKeyEvent] returning true");
return true;
}
@@ -421,12 +408,12 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
if (action == KeyEvent.ACTION_UP) {
wActionBar.collapseActionView();
}
- if (DEBUG) Log.d(TAG, "[dispatchKeyEvent] returning true");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchKeyEvent] returning true");
return true;
}
}
- if (DEBUG) Log.d(TAG, "[dispatchKeyEvent] returning false");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchKeyEvent] returning false");
return false;
}
@@ -596,7 +583,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public boolean onMenuItemClick(android.view.MenuItem item) {
- if (DEBUG) Log.d(TAG, "[mNativeItemListener.onMenuItemClick] item: " + item);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[mNativeItemListener.onMenuItemClick] item: " + item);
final MenuItemImpl sherlockItem = mNativeItemMap.get(item);
if (sherlockItem != null) {
@@ -620,7 +607,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public void setProgressBarVisibility(boolean visible) {
- if (DEBUG) Log.d(TAG, "[setProgressBarVisibility] visible: " + visible);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setProgressBarVisibility] visible: " + visible);
setFeatureInt(Window.FEATURE_PROGRESS, visible ? Window.PROGRESS_VISIBILITY_ON :
Window.PROGRESS_VISIBILITY_OFF);
@@ -628,7 +615,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public void setProgressBarIndeterminateVisibility(boolean visible) {
- if (DEBUG) Log.d(TAG, "[setProgressBarIndeterminateVisibility] visible: " + visible);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setProgressBarIndeterminateVisibility] visible: " + visible);
setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS,
visible ? Window.PROGRESS_VISIBILITY_ON : Window.PROGRESS_VISIBILITY_OFF);
@@ -636,7 +623,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public void setProgressBarIndeterminate(boolean indeterminate) {
- if (DEBUG) Log.d(TAG, "[setProgressBarIndeterminate] indeterminate: " + indeterminate);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setProgressBarIndeterminate] indeterminate: " + indeterminate);
setFeatureInt(Window.FEATURE_PROGRESS,
indeterminate ? Window.PROGRESS_INDETERMINATE_ON : Window.PROGRESS_INDETERMINATE_OFF);
@@ -644,14 +631,14 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public void setProgress(int progress) {
- if (DEBUG) Log.d(TAG, "[setProgress] progress: " + progress);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setProgress] progress: " + progress);
setFeatureInt(Window.FEATURE_PROGRESS, progress + Window.PROGRESS_START);
}
@Override
public void setSecondaryProgress(int secondaryProgress) {
- if (DEBUG) Log.d(TAG, "[setSecondaryProgress] secondaryProgress: " + secondaryProgress);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setSecondaryProgress] secondaryProgress: " + secondaryProgress);
setFeatureInt(Window.FEATURE_PROGRESS,
secondaryProgress + Window.PROGRESS_SECONDARY_START);
@@ -790,23 +777,23 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
///////////////////////////////////////////////////////////////////////////
private int getFeatures() {
- if (DEBUG) Log.d(TAG, "[getFeatures] returning " + mFeatures);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[getFeatures] returning " + mFeatures);
return mFeatures;
}
@Override
public boolean hasFeature(int featureId) {
- if (DEBUG) Log.d(TAG, "[hasFeature] featureId: " + featureId);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[hasFeature] featureId: " + featureId);
boolean result = (mFeatures & (1 << featureId)) != 0;
- if (DEBUG) Log.d(TAG, "[hasFeature] returning " + result);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[hasFeature] returning " + result);
return result;
}
@Override
public boolean requestFeature(int featureId) {
- if (DEBUG) Log.d(TAG, "[requestFeature] featureId: " + featureId);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[requestFeature] featureId: " + featureId);
if (mContentParent != null) {
throw new AndroidRuntimeException("requestFeature() must be called before adding content");
@@ -829,21 +816,21 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public void setUiOptions(int uiOptions) {
- if (DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions);
mUiOptions = uiOptions;
}
@Override
public void setUiOptions(int uiOptions, int mask) {
- if (DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions + ", mask: " + mask);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions + ", mask: " + mask);
mUiOptions = (mUiOptions & ~mask) | (uiOptions & mask);
}
@Override
public void setContentView(int layoutResId) {
- if (DEBUG) Log.d(TAG, "[setContentView] layoutResId: " + layoutResId);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setContentView] layoutResId: " + layoutResId);
if (mContentParent == null) {
installDecor();
@@ -862,7 +849,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public void setContentView(View view, ViewGroup.LayoutParams params) {
- if (DEBUG) Log.d(TAG, "[setContentView] view: " + view + ", params: " + params);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setContentView] view: " + view + ", params: " + params);
if (mContentParent == null) {
installDecor();
@@ -881,7 +868,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
@Override
public void addContentView(View view, ViewGroup.LayoutParams params) {
- if (DEBUG) Log.d(TAG, "[addContentView] view: " + view + ", params: " + params);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[addContentView] view: " + view + ", params: " + params);
if (mContentParent == null) {
installDecor();
@@ -892,7 +879,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
}
private void installDecor() {
- if (DEBUG) Log.d(TAG, "[installDecor]");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[installDecor]");
if (mDecor == null) {
mDecor = (ViewGroup)mActivity.getWindow().getDecorView().findViewById(android.R.id.content);
@@ -921,84 +908,70 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
}
}
- mTitleView = (TextView)mDecor.findViewById(android.R.id.title);
- if (mTitleView != null) {
- if (hasFeature(Window.FEATURE_NO_TITLE)) {
- mTitleView.setVisibility(View.GONE);
- if (mContentParent instanceof FrameLayout) {
- ((FrameLayout)mContentParent).setForeground(null);
- }
- } else {
- mTitleView.setText(mTitle);
+ wActionBar = (ActionBarView)mDecor.findViewById(R.id.abs__action_bar);
+ if (wActionBar != null) {
+ wActionBar.setWindowCallback(this);
+ if (wActionBar.getTitle() == null) {
+ wActionBar.setWindowTitle(mActivity.getTitle());
+ }
+ if (hasFeature(Window.FEATURE_PROGRESS)) {
+ wActionBar.initProgress();
+ }
+ if (hasFeature(Window.FEATURE_INDETERMINATE_PROGRESS)) {
+ wActionBar.initIndeterminateProgress();
}
- } else {
- wActionBar = (ActionBarView)mDecor.findViewById(R.id.abs__action_bar);
- if (wActionBar != null) {
- wActionBar.setWindowCallback(this);
- if (wActionBar.getTitle() == null) {
- wActionBar.setWindowTitle(mActivity.getTitle());
- }
- if (hasFeature(Window.FEATURE_PROGRESS)) {
- wActionBar.initProgress();
- }
- if (hasFeature(Window.FEATURE_INDETERMINATE_PROGRESS)) {
- wActionBar.initIndeterminateProgress();
- }
- //Since we don't require onCreate dispatching, parse for uiOptions here
- int uiOptions = loadUiOptionsFromManifest(mActivity);
- if (uiOptions != 0) {
- mUiOptions = uiOptions;
- }
+ //Since we don't require onCreate dispatching, parse for uiOptions here
+ int uiOptions = loadUiOptionsFromManifest(mActivity);
+ if (uiOptions != 0) {
+ mUiOptions = uiOptions;
+ }
- boolean splitActionBar = false;
- final boolean splitWhenNarrow = (mUiOptions & ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW) != 0;
- if (splitWhenNarrow) {
- splitActionBar = getResources_getBoolean(mActivity, R.bool.abs__split_action_bar_is_narrow);
- } else {
- splitActionBar = mActivity.getTheme()
- .obtainStyledAttributes(R.styleable.SherlockTheme)
- .getBoolean(R.styleable.SherlockTheme_windowSplitActionBar, false);
- }
- final ActionBarContainer splitView = (ActionBarContainer)mDecor.findViewById(R.id.abs__split_action_bar);
- if (splitView != null) {
- wActionBar.setSplitView(splitView);
- wActionBar.setSplitActionBar(splitActionBar);
- wActionBar.setSplitWhenNarrow(splitWhenNarrow);
-
- mActionModeView = (ActionBarContextView)mDecor.findViewById(R.id.abs__action_context_bar);
- mActionModeView.setSplitView(splitView);
- mActionModeView.setSplitActionBar(splitActionBar);
- mActionModeView.setSplitWhenNarrow(splitWhenNarrow);
- } else if (splitActionBar) {
- Log.e(TAG, "Requested split action bar with incompatible window decor! Ignoring request.");
- }
+ boolean splitActionBar = false;
+ final boolean splitWhenNarrow = (mUiOptions & ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW) != 0;
+ if (splitWhenNarrow) {
+ splitActionBar = getResources_getBoolean(mActivity, R.bool.abs__split_action_bar_is_narrow);
+ } else {
+ splitActionBar = mActivity.getTheme()
+ .obtainStyledAttributes(R.styleable.SherlockTheme)
+ .getBoolean(R.styleable.SherlockTheme_windowSplitActionBar, false);
+ }
+ final ActionBarContainer splitView = (ActionBarContainer)mDecor.findViewById(R.id.abs__split_action_bar);
+ if (splitView != null) {
+ wActionBar.setSplitView(splitView);
+ wActionBar.setSplitActionBar(splitActionBar);
+ wActionBar.setSplitWhenNarrow(splitWhenNarrow);
+
+ mActionModeView = (ActionBarContextView)mDecor.findViewById(R.id.abs__action_context_bar);
+ mActionModeView.setSplitView(splitView);
+ mActionModeView.setSplitActionBar(splitActionBar);
+ mActionModeView.setSplitWhenNarrow(splitWhenNarrow);
+ } else if (splitActionBar) {
+ Log.e(TAG, "Requested split action bar with incompatible window decor! Ignoring request.");
+ }
- // Post the panel invalidate for later; avoid application onCreateOptionsMenu
- // being called in the middle of onCreate or similar.
- mDecor.post(new Runnable() {
- @Override
- public void run() {
- //Invalidate if the panel menu hasn't been created before this.
- if (!mIsDestroyed && !mActivity.isFinishing() && mMenu == null) {
- dispatchInvalidateOptionsMenu();
- }
+ // Post the panel invalidate for later; avoid application onCreateOptionsMenu
+ // being called in the middle of onCreate or similar.
+ mDecor.post(new Runnable() {
+ @Override
+ public void run() {
+ //Invalidate if the panel menu hasn't been created before this.
+ if (!mIsDestroyed && !mActivity.isFinishing() && mMenu == null) {
+ dispatchInvalidateOptionsMenu();
}
- });
- }
+ }
+ });
}
}
}
private ViewGroup generateLayout() {
- if (DEBUG) Log.d(TAG, "[generateLayout]");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[generateLayout]");
// Apply data from current theme.
TypedArray a = mActivity.getTheme().obtainStyledAttributes(R.styleable.SherlockTheme);
- mIsFloating = a.getBoolean(R.styleable.SherlockTheme_android_windowIsFloating, false);
-
if (!a.hasValue(R.styleable.SherlockTheme_windowActionBar)) {
throw new IllegalStateException("You must use Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar, or a derivative.");
}
@@ -1022,18 +995,10 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
int layoutResource;
if (!hasFeature(Window.FEATURE_NO_TITLE)) {
- if (mIsFloating) {
- //Trash original dialog LinearLayout
- mDecor = (ViewGroup)mDecor.getParent();
- mDecor.removeAllViews();
-
- layoutResource = R.layout.abs__dialog_title_holo;
+ if (hasFeature(Window.FEATURE_ACTION_BAR_OVERLAY)) {
+ layoutResource = R.layout.abs__screen_action_bar_overlay;
} else {
- if (hasFeature(Window.FEATURE_ACTION_BAR_OVERLAY)) {
- layoutResource = R.layout.abs__screen_action_bar_overlay;
- } else {
- layoutResource = R.layout.abs__screen_action_bar;
- }
+ layoutResource = R.layout.abs__screen_action_bar;
}
} else if (hasFeature(Window.FEATURE_ACTION_MODE_OVERLAY) && !hasFeature(Window.FEATURE_NO_TITLE)) {
layoutResource = R.layout.abs__screen_simple_overlay_action_mode;
@@ -1041,7 +1006,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
layoutResource = R.layout.abs__screen_simple;
}
- if (DEBUG) Log.d(TAG, "[generateLayout] using screen XML " + mActivity.getResources().getString(layoutResource));
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[generateLayout] using screen XML " + mActivity.getResources().getString(layoutResource));
View in = mActivity.getLayoutInflater().inflate(layoutResource, null);
mDecor.addView(in, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
@@ -1086,7 +1051,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
int uiOptions = 0;
try {
final String thisPackage = activity.getClass().getName();
- if (DEBUG) Log.i(TAG, "Parsing AndroidManifest.xml for " + thisPackage);
+ if (ActionBarSherlock.DEBUG) Log.i(TAG, "Parsing AndroidManifest.xml for " + thisPackage);
final String packageName = activity.getApplicationInfo().packageName;
final AssetManager am = activity.createPackageContext(packageName, 0).getAssets();
@@ -1099,10 +1064,10 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
if ("application".equals(name)) {
//Check if the <application> has the attribute
- if (DEBUG) Log.d(TAG, "Got <application>");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "Got <application>");
for (int i = xml.getAttributeCount() - 1; i >= 0; i--) {
- if (DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i));
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i));
if ("uiOptions".equals(xml.getAttributeName(i))) {
uiOptions = xml.getAttributeIntValue(i, 0);
@@ -1111,13 +1076,13 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
}
} else if ("activity".equals(name)) {
//Check if the <activity> is us and has the attribute
- if (DEBUG) Log.d(TAG, "Got <activity>");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "Got <activity>");
Integer activityUiOptions = null;
String activityPackage = null;
boolean isOurActivity = false;
for (int i = xml.getAttributeCount() - 1; i >= 0; i--) {
- if (DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i));
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i));
//We need both uiOptions and name attributes
String attrName = xml.getAttributeName(i);
@@ -1149,7 +1114,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
} catch (Exception e) {
e.printStackTrace();
}
- if (DEBUG) Log.i(TAG, "Returning " + Integer.toHexString(uiOptions));
+ if (ActionBarSherlock.DEBUG) Log.i(TAG, "Returning " + Integer.toHexString(uiOptions));
return uiOptions;
}
@@ -1200,4 +1165,13 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
mActionMode = null;
}
}
+
+ @Override
+ public void ensureActionBar() {
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[ensureActionBar]");
+
+ if (mDecor == null) {
+ initActionBar();
+ }
+ }
}
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java
index 0824d3848..5a47e0c37 100644
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java
@@ -1,19 +1,21 @@
package com.actionbarsherlock.internal;
-import com.actionbarsherlock.ActionBarSherlock;
-import com.actionbarsherlock.app.ActionBar;
-import com.actionbarsherlock.internal.app.ActionBarWrapper;
-import com.actionbarsherlock.internal.view.menu.MenuWrapper;
-import com.actionbarsherlock.view.ActionMode;
-import com.actionbarsherlock.view.MenuInflater;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.util.TypedValue;
import android.view.ContextThemeWrapper;
import android.view.View;
-import android.view.Window;
import android.view.ViewGroup.LayoutParams;
+import android.view.Window;
+import com.actionbarsherlock.ActionBarSherlock;
+import com.actionbarsherlock.app.ActionBar;
+import com.actionbarsherlock.internal.app.ActionBarWrapper;
+import com.actionbarsherlock.internal.view.menu.MenuItemWrapper;
+import com.actionbarsherlock.internal.view.menu.MenuWrapper;
+import com.actionbarsherlock.view.ActionMode;
+import com.actionbarsherlock.view.MenuInflater;
+import com.actionbarsherlock.view.MenuItem;
@ActionBarSherlock.Implementation(api = 14)
public class ActionBarSherlockNative extends ActionBarSherlock {
@@ -28,7 +30,7 @@ public class ActionBarSherlockNative extends ActionBarSherlock {
@Override
public ActionBar getActionBar() {
- if (DEBUG) Log.d(TAG, "[getActionBar]");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[getActionBar]");
initActionBar();
return mActionBar;
@@ -44,77 +46,89 @@ public class ActionBarSherlockNative extends ActionBarSherlock {
@Override
public void dispatchInvalidateOptionsMenu() {
- if (DEBUG) Log.d(TAG, "[dispatchInvalidateOptionsMenu]");
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchInvalidateOptionsMenu]");
mActivity.getWindow().invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL);
+
+ if (mMenu != null) mMenu.invalidate();
}
@Override
public boolean dispatchCreateOptionsMenu(android.view.Menu menu) {
- if (DEBUG) Log.d(TAG, "[dispatchCreateOptionsMenu] menu: " + menu);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchCreateOptionsMenu] menu: " + menu);
if (mMenu == null || menu != mMenu.unwrap()) {
mMenu = new MenuWrapper(menu);
}
final boolean result = callbackCreateOptionsMenu(mMenu);
- if (DEBUG) Log.d(TAG, "[dispatchCreateOptionsMenu] returning " + result);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchCreateOptionsMenu] returning " + result);
return result;
}
@Override
public boolean dispatchPrepareOptionsMenu(android.view.Menu menu) {
- if (DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] menu: " + menu);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] menu: " + menu);
final boolean result = callbackPrepareOptionsMenu(mMenu);
- if (DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] returning " + result);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] returning " + result);
return result;
}
@Override
public boolean dispatchOptionsItemSelected(android.view.MenuItem item) {
- if (DEBUG) Log.d(TAG, "[dispatchOptionsItemSelected] item: " + item.getTitleCondensed());
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchOptionsItemSelected] item: " + item.getTitleCondensed());
- final boolean result = callbackOptionsItemSelected(mMenu.findItem(item));
- if (DEBUG) Log.d(TAG, "[dispatchOptionsItemSelected] returning " + result);
+ MenuItem wrapped;
+ if (mMenu == null) {
+ if (item.getItemId() != android.R.id.home) {
+ throw new IllegalStateException("Non-home action item clicked before onCreateOptionsMenu with ID " + item.getItemId());
+ }
+ // Create a throw-away wrapper for now.
+ wrapped = new MenuItemWrapper(item);
+ } else {
+ wrapped = mMenu.findItem(item);
+ }
+ final boolean result = callbackOptionsItemSelected(wrapped);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[dispatchOptionsItemSelected] returning " + result);
return result;
}
@Override
public boolean hasFeature(int feature) {
- if (DEBUG) Log.d(TAG, "[hasFeature] feature: " + feature);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[hasFeature] feature: " + feature);
final boolean result = mActivity.getWindow().hasFeature(feature);
- if (DEBUG) Log.d(TAG, "[hasFeature] returning " + result);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[hasFeature] returning " + result);
return result;
}
@Override
public boolean requestFeature(int featureId) {
- if (DEBUG) Log.d(TAG, "[requestFeature] featureId: " + featureId);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[requestFeature] featureId: " + featureId);
final boolean result = mActivity.getWindow().requestFeature(featureId);
- if (DEBUG) Log.d(TAG, "[requestFeature] returning " + result);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[requestFeature] returning " + result);
return result;
}
@Override
public void setUiOptions(int uiOptions) {
- if (DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions);
mActivity.getWindow().setUiOptions(uiOptions);
}
@Override
public void setUiOptions(int uiOptions, int mask) {
- if (DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions + ", mask: " + mask);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setUiOptions] uiOptions: " + uiOptions + ", mask: " + mask);
mActivity.getWindow().setUiOptions(uiOptions, mask);
}
@Override
public void setContentView(int layoutResId) {
- if (DEBUG) Log.d(TAG, "[setContentView] layoutResId: " + layoutResId);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setContentView] layoutResId: " + layoutResId);
mActivity.getWindow().setContentView(layoutResId);
initActionBar();
@@ -122,7 +136,7 @@ public class ActionBarSherlockNative extends ActionBarSherlock {
@Override
public void setContentView(View view, LayoutParams params) {
- if (DEBUG) Log.d(TAG, "[setContentView] view: " + view + ", params: " + params);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setContentView] view: " + view + ", params: " + params);
mActivity.getWindow().setContentView(view, params);
initActionBar();
@@ -130,7 +144,7 @@ public class ActionBarSherlockNative extends ActionBarSherlock {
@Override
public void addContentView(View view, LayoutParams params) {
- if (DEBUG) Log.d(TAG, "[addContentView] view: " + view + ", params: " + params);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[addContentView] view: " + view + ", params: " + params);
mActivity.getWindow().addContentView(view, params);
initActionBar();
@@ -138,42 +152,42 @@ public class ActionBarSherlockNative extends ActionBarSherlock {
@Override
public void setTitle(CharSequence title) {
- if (DEBUG) Log.d(TAG, "[setTitle] title: " + title);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setTitle] title: " + title);
mActivity.getWindow().setTitle(title);
}
@Override
public void setProgressBarVisibility(boolean visible) {
- if (DEBUG) Log.d(TAG, "[setProgressBarVisibility] visible: " + visible);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setProgressBarVisibility] visible: " + visible);
mActivity.setProgressBarVisibility(visible);
}
@Override
public void setProgressBarIndeterminateVisibility(boolean visible) {
- if (DEBUG) Log.d(TAG, "[setProgressBarIndeterminateVisibility] visible: " + visible);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setProgressBarIndeterminateVisibility] visible: " + visible);
mActivity.setProgressBarIndeterminateVisibility(visible);
}
@Override
public void setProgressBarIndeterminate(boolean indeterminate) {
- if (DEBUG) Log.d(TAG, "[setProgressBarIndeterminate] indeterminate: " + indeterminate);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setProgressBarIndeterminate] indeterminate: " + indeterminate);
mActivity.setProgressBarIndeterminate(indeterminate);
}
@Override
public void setProgress(int progress) {
- if (DEBUG) Log.d(TAG, "[setProgress] progress: " + progress);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setProgress] progress: " + progress);
mActivity.setProgress(progress);
}
@Override
public void setSecondaryProgress(int secondaryProgress) {
- if (DEBUG) Log.d(TAG, "[setSecondaryProgress] secondaryProgress: " + secondaryProgress);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[setSecondaryProgress] secondaryProgress: " + secondaryProgress);
mActivity.setSecondaryProgress(secondaryProgress);
}
@@ -194,7 +208,7 @@ public class ActionBarSherlockNative extends ActionBarSherlock {
@Override
public ActionMode startActionMode(com.actionbarsherlock.view.ActionMode.Callback callback) {
- if (DEBUG) Log.d(TAG, "[startActionMode] callback: " + callback);
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "[startActionMode] callback: " + callback);
if (mActionMode != null) {
mActionMode.finish();
@@ -288,6 +302,7 @@ public class ActionBarSherlockNative extends ActionBarSherlock {
@Override
public void invalidate() {
mActionMode.invalidate();
+ if (mMenu != null) mMenu.invalidate();
}
@Override
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java
index 8e1efe8c5..4a3a1ca26 100644
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/ResourcesCompat.java
@@ -1,11 +1,19 @@
package com.actionbarsherlock.internal;
+import android.app.Activity;
import android.content.Context;
+import android.content.res.AssetManager;
+import android.content.res.XmlResourceParser;
import android.os.Build;
import android.util.DisplayMetrics;
+import android.util.Log;
+import com.actionbarsherlock.ActionBarSherlock;
import com.actionbarsherlock.R;
+import org.xmlpull.v1.XmlPullParser;
public final class ResourcesCompat {
+ private static final String TAG = "ResourcesCompat";
+
//No instances
private ResourcesCompat() {}
@@ -15,14 +23,14 @@ public final class ResourcesCompat {
* can use to simulate filtering based on width and smallest width
* qualifiers on pre-3.2.
*
- * @param context Context to load booleans from on 3.2+ and to fetch the
+ * @param context Context to load booleans from on 4.0+ and to fetch the
* display metrics.
* @param id Id of boolean to load.
* @return Associated boolean value as reflected by the current display
* metrics.
*/
public static boolean getResources_getBoolean(Context context, int id) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
return context.getResources().getBoolean(id);
}
@@ -92,4 +100,83 @@ public final class ResourcesCompat {
throw new IllegalArgumentException("Unknown integer resource ID " + id);
}
+
+ /**
+ * Attempt to programmatically load the logo from the manifest file of an
+ * activity by using an XML pull parser. This should allow us to read the
+ * logo attribute regardless of the platform it is being run on.
+ *
+ * @param activity Activity instance.
+ * @return Logo resource ID.
+ */
+ public static int loadLogoFromManifest(Activity activity) {
+ int logo = 0;
+ try {
+ final String thisPackage = activity.getClass().getName();
+ if (ActionBarSherlock.DEBUG) Log.i(TAG, "Parsing AndroidManifest.xml for " + thisPackage);
+
+ final String packageName = activity.getApplicationInfo().packageName;
+ final AssetManager am = activity.createPackageContext(packageName, 0).getAssets();
+ final XmlResourceParser xml = am.openXmlResourceParser("AndroidManifest.xml");
+
+ int eventType = xml.getEventType();
+ while (eventType != XmlPullParser.END_DOCUMENT) {
+ if (eventType == XmlPullParser.START_TAG) {
+ String name = xml.getName();
+
+ if ("application".equals(name)) {
+ //Check if the <application> has the attribute
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "Got <application>");
+
+ for (int i = xml.getAttributeCount() - 1; i >= 0; i--) {
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i));
+
+ if ("logo".equals(xml.getAttributeName(i))) {
+ logo = xml.getAttributeResourceValue(i, 0);
+ break; //out of for loop
+ }
+ }
+ } else if ("activity".equals(name)) {
+ //Check if the <activity> is us and has the attribute
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, "Got <activity>");
+ Integer activityLogo = null;
+ String activityPackage = null;
+ boolean isOurActivity = false;
+
+ for (int i = xml.getAttributeCount() - 1; i >= 0; i--) {
+ if (ActionBarSherlock.DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i));
+
+ //We need both uiOptions and name attributes
+ String attrName = xml.getAttributeName(i);
+ if ("logo".equals(attrName)) {
+ activityLogo = xml.getAttributeResourceValue(i, 0);
+ } else if ("name".equals(attrName)) {
+ activityPackage = ActionBarSherlockCompat.cleanActivityName(packageName, xml.getAttributeValue(i));
+ if (!thisPackage.equals(activityPackage)) {
+ break; //on to the next
+ }
+ isOurActivity = true;
+ }
+
+ //Make sure we have both attributes before processing
+ if ((activityLogo != null) && (activityPackage != null)) {
+ //Our activity, logo specified, override with our value
+ logo = activityLogo.intValue();
+ }
+ }
+ if (isOurActivity) {
+ //If we matched our activity but it had no logo don't
+ //do any more processing of the manifest
+ break;
+ }
+ }
+ }
+ eventType = xml.nextToken();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ if (ActionBarSherlock.DEBUG) Log.i(TAG, "Returning " + Integer.toHexString(logo));
+ return logo;
+ }
}
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarImpl.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarImpl.java
index d022a2465..14dc5a7c5 100644
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarImpl.java
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarImpl.java
@@ -170,7 +170,12 @@ public class ActionBarImpl extends ActionBar {
// Older apps get the home button interaction enabled by default.
// Newer apps need to enable it explicitly.
- setHomeButtonEnabled(mContext.getApplicationInfo().targetSdkVersion < 14);
+ boolean homeButtonEnabled = mContext.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.ICE_CREAM_SANDWICH;
+
+ // If the homeAsUp display option is set, always enable the home button.
+ homeButtonEnabled |= (mActionView.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != 0;
+
+ setHomeButtonEnabled(homeButtonEnabled);
setHasEmbeddedTabs(getResources_getBoolean(mContext,
R.bool.abs__action_bar_embed_tabs));
@@ -321,7 +326,7 @@ public class ActionBarImpl extends ActionBar {
break;
default:
throw new IllegalStateException(
- "setSelectedNavigationIndex not valid for current navigation mode");
+ "setSelectedNavigationItem not valid for current navigation mode");
}
}
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java
index 840cb3d27..fe479d0b8 100644
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java
@@ -26,6 +26,10 @@ public class ActionBarWrapper extends ActionBar implements android.app.ActionBar
mActionBar = activity.getActionBar();
if (mActionBar != null) {
mActionBar.addOnMenuVisibilityListener(this);
+
+ // Fixes issue #746
+ int displayOptions = mActionBar.getDisplayOptions();
+ mActionBar.setHomeButtonEnabled((displayOptions & DISPLAY_HOME_AS_UP) != 0);
}
}
@@ -132,11 +136,19 @@ public class ActionBarWrapper extends ActionBar implements android.app.ActionBar
@Override
public void setDisplayOptions(int options) {
mActionBar.setDisplayOptions(options);
+
+ // Fixes issue #746
+ mActionBar.setHomeButtonEnabled((options & DISPLAY_HOME_AS_UP) != 0);
}
@Override
public void setDisplayOptions(int options, int mask) {
mActionBar.setDisplayOptions(options, mask);
+
+ // Fixes issue #746
+ if ((mask & DISPLAY_HOME_AS_UP) != 0) {
+ mActionBar.setHomeButtonEnabled((options & DISPLAY_HOME_AS_UP) != 0);
+ }
}
@Override
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java
index d8a12c688..7f0f93efd 100644
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java
@@ -582,6 +582,7 @@ public class ValueAnimator extends Animator {
* active animations to process.
*/
@Override
+ @SuppressWarnings("fallthrough")
public void handleMessage(Message msg) {
boolean callAgain = true;
ArrayList<ValueAnimator> animations = sAnimations.get();
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java
index dcb50f362..7d36c3b22 100644
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java
@@ -37,6 +37,7 @@ import com.actionbarsherlock.R;
import com.actionbarsherlock.internal.view.View_HasStateListenerSupport;
import com.actionbarsherlock.internal.view.View_OnAttachStateChangeListener;
import com.actionbarsherlock.internal.widget.CapitalizingButton;
+import com.actionbarsherlock.internal.widget.IcsToast;
import static com.actionbarsherlock.internal.ResourcesCompat.getResources_getBoolean;
@@ -263,7 +264,7 @@ public class ActionMenuItemView extends LinearLayout
final int midy = screenPos[1] + height / 2;
final int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
- Toast cheatSheet = Toast.makeText(context, mItemData.getTitle(), Toast.LENGTH_SHORT);
+ Toast cheatSheet = IcsToast.makeText(context, mItemData.getTitle(), IcsToast.LENGTH_SHORT);
if (midy < displayFrame.height()) {
// Show along the top; follow action buttons
cheatSheet.setGravity(Gravity.TOP | Gravity.RIGHT,
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java
index 179b8f037..51bacd7be 100644
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java
@@ -31,6 +31,7 @@ import android.content.pm.ResolveInfo;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
+import android.os.Build;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.SparseArray;
@@ -353,6 +354,11 @@ public class MenuBuilder implements Menu {
SparseArray<Parcelable> viewStates = states.getSparseParcelableArray(
getActionViewStatesKey());
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB && viewStates == null) {
+ //Fixes Issue #652 with sdk <= 2.3.6
+ return;
+ }
+
final int itemCount = size();
for (int i = 0; i < itemCount; i++) {
final MenuItem item = getItem(i);
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java
index f030de310..e49cd3190 100644
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java
@@ -115,10 +115,20 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On
View anchor = mAnchorView;
if (anchor != null) {
- final boolean addGlobalListener = mTreeObserver == null;
- mTreeObserver = anchor.getViewTreeObserver(); // Refresh to latest
- if (addGlobalListener) mTreeObserver.addOnGlobalLayoutListener(this);
- ((View_HasStateListenerSupport)anchor).addOnAttachStateChangeListener(this);
+ // Don't attach to the VTO unless the anchor itself is attached to avoid VTO-related leaks.
+ if (anchor.getWindowToken() != null) {
+ ViewTreeObserver vto = anchor.getViewTreeObserver();
+ if (vto != mTreeObserver) {
+ if (mTreeObserver != null && mTreeObserver.isAlive()) {
+ mTreeObserver.removeGlobalOnLayoutListener(this);
+ }
+ if ((mTreeObserver = vto) != null) {
+ vto.addOnGlobalLayoutListener(this);
+ }
+ }
+ } else if (anchor instanceof View_HasStateListenerSupport) {
+ ((View_HasStateListenerSupport) anchor).addOnAttachStateChangeListener(this);
+ }
mPopup.setAnchorView(anchor);
} else {
return false;
@@ -141,11 +151,11 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On
mPopup = null;
mMenu.close();
if (mTreeObserver != null) {
- if (!mTreeObserver.isAlive()) mTreeObserver = mAnchorView.getViewTreeObserver();
- mTreeObserver.removeGlobalOnLayoutListener(this);
+ if (mTreeObserver.isAlive()) mTreeObserver.removeGlobalOnLayoutListener(this);
mTreeObserver = null;
+ } else if (mAnchorView instanceof View_HasStateListenerSupport) {
+ ((View_HasStateListenerSupport) mAnchorView).removeOnAttachStateChangeListener(this);
}
- ((View_HasStateListenerSupport)mAnchorView).removeOnAttachStateChangeListener(this);
}
public boolean isShowing() {
@@ -207,15 +217,16 @@ public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.On
@Override
public void onViewAttachedToWindow(View v) {
+ ((View_HasStateListenerSupport) v).removeOnAttachStateChangeListener(this);
+
+ // The anchor wasn't attached in tryShow(), attach to the ViewRoot VTO now.
+ if (mPopup != null && mTreeObserver == null) {
+ (mTreeObserver = v.getViewTreeObserver()).addOnGlobalLayoutListener(this);
+ }
}
@Override
public void onViewDetachedFromWindow(View v) {
- if (mTreeObserver != null) {
- if (!mTreeObserver.isAlive()) mTreeObserver = v.getViewTreeObserver();
- mTreeObserver.removeGlobalOnLayoutListener(this);
- }
- ((View_HasStateListenerSupport)v).removeOnAttachStateChangeListener(this);
}
@Override
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java
index 3d4dd42fd..4eb8d09f4 100644
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java
@@ -94,11 +94,18 @@ public class MenuWrapper implements Menu {
@Override
public void removeItem(int id) {
+ mNativeMap.remove(mNativeMenu.findItem(id));
mNativeMenu.removeItem(id);
}
@Override
public void removeGroup(int groupId) {
+ for (int i = 0; i < mNativeMenu.size(); i++) {
+ final android.view.MenuItem item = mNativeMenu.getItem(i);
+ if (item.getGroupId() == groupId) {
+ mNativeMap.remove(item);
+ }
+ }
mNativeMenu.removeGroup(groupId);
}
@@ -108,6 +115,20 @@ public class MenuWrapper implements Menu {
mNativeMenu.clear();
}
+ public void invalidate() {
+ if (mNativeMap.isEmpty()) return;
+
+ final WeakHashMap<android.view.MenuItem, MenuItem> menuMapCopy = new WeakHashMap<android.view.MenuItem, MenuItem>(mNativeMap.size());
+
+ for (int i = 0; i < mNativeMenu.size(); i++) {
+ final android.view.MenuItem item = mNativeMenu.getItem(i);
+ menuMapCopy.put(item, mNativeMap.get(item));
+ }
+
+ mNativeMap.clear();
+ mNativeMap.putAll(menuMapCopy);
+ }
+
@Override
public void setGroupCheckable(int group, boolean checkable, boolean exclusive) {
mNativeMenu.setGroupCheckable(group, checkable, exclusive);
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java
index 1d9c68b37..0889825c0 100644
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java
@@ -18,7 +18,6 @@ package com.actionbarsherlock.internal.widget;
import android.content.Context;
import android.content.res.TypedArray;
-import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
@@ -27,7 +26,6 @@ import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
-
import com.actionbarsherlock.R;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.internal.nineoldandroids.widget.NineFrameLayout;
@@ -65,12 +63,7 @@ public class ActionBarContainer extends NineFrameLayout {
//Fix for issue #379
if (mStackedBackground instanceof ColorDrawable && Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
- Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
- Canvas c = new Canvas(bitmap);
- mStackedBackground.draw(c);
- int color = bitmap.getPixel(0, 0);
- bitmap.recycle();
- mStackedBackground = new IcsColorDrawable(color);
+ mStackedBackground = new IcsColorDrawable((ColorDrawable) mStackedBackground);
}
if (getId() == R.id.abs__split_action_bar) {
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarView.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarView.java
index 4636de17f..61e55b0a2 100644
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarView.java
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ActionBarView.java
@@ -16,16 +16,14 @@
package com.actionbarsherlock.internal.widget;
-import org.xmlpull.v1.XmlPullParser;
+import com.actionbarsherlock.internal.ResourcesCompat;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.res.AssetManager;
import android.content.res.Configuration;
import android.content.res.TypedArray;
-import android.content.res.XmlResourceParser;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Parcel;
@@ -49,7 +47,6 @@ import android.widget.TextView;
import com.actionbarsherlock.R;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.OnNavigationListener;
-import com.actionbarsherlock.internal.ActionBarSherlockCompat;
import com.actionbarsherlock.internal.view.menu.ActionMenuItem;
import com.actionbarsherlock.internal.view.menu.ActionMenuPresenter;
import com.actionbarsherlock.internal.view.menu.ActionMenuView;
@@ -70,7 +67,6 @@ import static com.actionbarsherlock.internal.ResourcesCompat.getResources_getBoo
*/
public class ActionBarView extends AbsActionBarView {
private static final String TAG = "ActionBarView";
- private static final boolean DEBUG = false;
/**
* Display options applied by default
@@ -190,7 +186,7 @@ public class ActionBarView extends AbsActionBarView {
if (context instanceof Activity) {
//Even though native methods existed in API 9 and 10 they don't work
//so just parse the manifest to look for the logo pre-Honeycomb
- final int resId = loadLogoFromManifest((Activity) context);
+ final int resId = ResourcesCompat.loadLogoFromManifest((Activity) context);
if (resId != 0) {
mLogo = context.getResources().getDrawable(resId);
}
@@ -265,85 +261,6 @@ public class ActionBarView extends AbsActionBarView {
mHomeLayout.setFocusable(true);
}
- /**
- * Attempt to programmatically load the logo from the manifest file of an
- * activity by using an XML pull parser. This should allow us to read the
- * logo attribute regardless of the platform it is being run on.
- *
- * @param activity Activity instance.
- * @return Logo resource ID.
- */
- private static int loadLogoFromManifest(Activity activity) {
- int logo = 0;
- try {
- final String thisPackage = activity.getClass().getName();
- if (DEBUG) Log.i(TAG, "Parsing AndroidManifest.xml for " + thisPackage);
-
- final String packageName = activity.getApplicationInfo().packageName;
- final AssetManager am = activity.createPackageContext(packageName, 0).getAssets();
- final XmlResourceParser xml = am.openXmlResourceParser("AndroidManifest.xml");
-
- int eventType = xml.getEventType();
- while (eventType != XmlPullParser.END_DOCUMENT) {
- if (eventType == XmlPullParser.START_TAG) {
- String name = xml.getName();
-
- if ("application".equals(name)) {
- //Check if the <application> has the attribute
- if (DEBUG) Log.d(TAG, "Got <application>");
-
- for (int i = xml.getAttributeCount() - 1; i >= 0; i--) {
- if (DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i));
-
- if ("logo".equals(xml.getAttributeName(i))) {
- logo = xml.getAttributeResourceValue(i, 0);
- break; //out of for loop
- }
- }
- } else if ("activity".equals(name)) {
- //Check if the <activity> is us and has the attribute
- if (DEBUG) Log.d(TAG, "Got <activity>");
- Integer activityLogo = null;
- String activityPackage = null;
- boolean isOurActivity = false;
-
- for (int i = xml.getAttributeCount() - 1; i >= 0; i--) {
- if (DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i));
-
- //We need both uiOptions and name attributes
- String attrName = xml.getAttributeName(i);
- if ("logo".equals(attrName)) {
- activityLogo = xml.getAttributeResourceValue(i, 0);
- } else if ("name".equals(attrName)) {
- activityPackage = ActionBarSherlockCompat.cleanActivityName(packageName, xml.getAttributeValue(i));
- if (!thisPackage.equals(activityPackage)) {
- break; //on to the next
- }
- isOurActivity = true;
- }
-
- //Make sure we have both attributes before processing
- if ((activityLogo != null) && (activityPackage != null)) {
- //Our activity, logo specified, override with our value
- logo = activityLogo.intValue();
- }
- }
- if (isOurActivity) {
- //If we matched our activity but it had no logo don't
- //do any more processing of the manifest
- break;
- }
- }
- }
- eventType = xml.nextToken();
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- if (DEBUG) Log.i(TAG, "Returning " + Integer.toHexString(logo));
- return logo;
- }
-
/*
* Must be public so we can dispatch pre-2.2 via ActionBarImpl.
*/
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java
index fa3698f3b..9c658d561 100644
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java
@@ -12,9 +12,14 @@ public class CapitalizingButton extends Button {
private static final boolean IS_GINGERBREAD = Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD;
private static final int[] R_styleable_Button = new int[] {
+ android.R.attr.textAppearance
+ };
+ private static final int R_styleable_Button_textAppearance = 0;
+
+ private static final int[] R_styleable_TextAppearance = new int[] {
android.R.attr.textAllCaps
};
- private static final int R_styleable_Button_textAllCaps = 0;
+ private static final int R_styleable_TextAppearance_textAllCaps = 0;
private boolean mAllCaps;
@@ -22,14 +27,26 @@ public class CapitalizingButton extends Button {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R_styleable_Button);
- mAllCaps = a.getBoolean(R_styleable_Button_textAllCaps, true);
+ int ap = a.getResourceId(R_styleable_Button_textAppearance, -1);
a.recycle();
+ if (ap != -1) {
+ TypedArray appearance = context.obtainStyledAttributes(ap, R_styleable_TextAppearance);
+ if (appearance != null) {
+ mAllCaps = appearance.getBoolean(R_styleable_TextAppearance_textAllCaps, true);
+ appearance.recycle();
+ }
+ }
}
public void setTextCompat(CharSequence text) {
if (SANS_ICE_CREAM && mAllCaps && text != null) {
if (IS_GINGERBREAD) {
- setText(text.toString().toUpperCase(Locale.ROOT));
+ try {
+ setText(text.toString().toUpperCase(Locale.ROOT));
+ } catch (NoSuchFieldError e) {
+ //Some manufacturer broke Locale.ROOT. See #572.
+ setText(text.toString().toUpperCase());
+ }
} else {
setText(text.toString().toUpperCase());
}
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java
deleted file mode 100644
index ad1b4f0a8..000000000
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.actionbarsherlock.internal.widget;
-
-import static android.view.View.MeasureSpec.EXACTLY;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.util.TypedValue;
-import android.widget.LinearLayout;
-import com.actionbarsherlock.R;
-
-public class FakeDialogPhoneWindow extends LinearLayout {
- final TypedValue mMinWidthMajor = new TypedValue();
- final TypedValue mMinWidthMinor = new TypedValue();
-
- public FakeDialogPhoneWindow(Context context, AttributeSet attrs) {
- super(context, attrs);
-
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SherlockTheme);
-
- a.getValue(R.styleable.SherlockTheme_windowMinWidthMajor, mMinWidthMajor);
- a.getValue(R.styleable.SherlockTheme_windowMinWidthMinor, mMinWidthMinor);
-
- a.recycle();
- }
-
- /* Stolen from PhoneWindow */
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- final DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();
- final boolean isPortrait = metrics.widthPixels < metrics.heightPixels;
-
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
- int width = getMeasuredWidth();
- boolean measure = false;
-
- widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, EXACTLY);
-
- final TypedValue tv = isPortrait ? mMinWidthMinor : mMinWidthMajor;
-
- if (tv.type != TypedValue.TYPE_NULL) {
- final int min;
- if (tv.type == TypedValue.TYPE_DIMENSION) {
- min = (int)tv.getDimension(metrics);
- } else if (tv.type == TypedValue.TYPE_FRACTION) {
- min = (int)tv.getFraction(metrics.widthPixels, metrics.widthPixels);
- } else {
- min = 0;
- }
-
- if (width < min) {
- widthMeasureSpec = MeasureSpec.makeMeasureSpec(min, EXACTLY);
- measure = true;
- }
- }
-
- // TODO: Support height?
-
- if (measure) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
- }
- }
-}
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java
index a78b3f71b..3e022e63a 100644
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java
@@ -1,8 +1,10 @@
package com.actionbarsherlock.internal.widget;
+import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
+import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
/**
@@ -12,6 +14,14 @@ public class IcsColorDrawable extends Drawable {
private int color;
private final Paint paint = new Paint();
+ public IcsColorDrawable(ColorDrawable drawable) {
+ Bitmap bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
+ Canvas c = new Canvas(bitmap);
+ drawable.draw(c);
+ this.color = bitmap.getPixel(0, 0);
+ bitmap.recycle();
+ }
+
public IcsColorDrawable(int color) {
this.color = color;
}
@@ -26,7 +36,7 @@ public class IcsColorDrawable extends Drawable {
@Override
public void setAlpha(int alpha) {
if (alpha != (color >>> 24)) {
- color = (color & 0x00FFFFFF) & (alpha << 24);
+ color = (color & 0x00FFFFFF) | (alpha << 24);
invalidateSelf();
}
}
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java
index 4947c41df..b7c6ff318 100644
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java
@@ -3,10 +3,11 @@ package com.actionbarsherlock.internal.widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
+import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
+import android.os.Build;
import android.util.AttributeSet;
import android.view.View;
-import android.widget.LinearLayout;
import com.actionbarsherlock.internal.nineoldandroids.widget.NineLinearLayout;
@@ -20,14 +21,12 @@ import com.actionbarsherlock.internal.nineoldandroids.widget.NineLinearLayout;
public class IcsLinearLayout extends NineLinearLayout {
private static final int[] R_styleable_LinearLayout = new int[] {
/* 0 */ android.R.attr.divider,
- /* 1 */ android.R.attr.measureWithLargestChild,
/* 2 */ android.R.attr.showDividers,
/* 3 */ android.R.attr.dividerPadding,
};
private static final int LinearLayout_divider = 0;
- private static final int LinearLayout_measureWithLargestChild = 1;
- private static final int LinearLayout_showDividers = 2;
- private static final int LinearLayout_dividerPadding = 3;
+ private static final int LinearLayout_showDividers = 1;
+ private static final int LinearLayout_dividerPadding = 2;
/**
* Don't show any dividers.
@@ -53,8 +52,6 @@ public class IcsLinearLayout extends NineLinearLayout {
private int mShowDividers;
private int mDividerPadding;
- private boolean mUseLargestChild;
-
public IcsLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -63,7 +60,6 @@ public class IcsLinearLayout extends NineLinearLayout {
setDividerDrawable(a.getDrawable(/*com.android.internal.R.styleable.*/LinearLayout_divider));
mShowDividers = a.getInt(/*com.android.internal.R.styleable.*/LinearLayout_showDividers, SHOW_DIVIDER_NONE);
mDividerPadding = a.getDimensionPixelSize(/*com.android.internal.R.styleable.*/LinearLayout_dividerPadding, 0);
- mUseLargestChild = a.getBoolean(/*com.android.internal.R.styleable.*/LinearLayout_measureWithLargestChild, false);
a.recycle();
}
@@ -100,6 +96,12 @@ public class IcsLinearLayout extends NineLinearLayout {
if (divider == mDivider) {
return;
}
+
+ //Fix for issue #379
+ if (divider instanceof ColorDrawable && Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
+ divider = new IcsColorDrawable((ColorDrawable) divider);
+ }
+
mDivider = divider;
if (divider != null) {
mDividerWidth = divider.getIntrinsicWidth();
@@ -275,136 +277,4 @@ public class IcsLinearLayout extends NineLinearLayout {
}
return false;
}
-
- /**
- * When true, all children with a weight will be considered having
- * the minimum size of the largest child. If false, all children are
- * measured normally.
- *
- * @return True to measure children with a weight using the minimum
- * size of the largest child, false otherwise.
- *
- * @attr ref android.R.styleable#LinearLayout_measureWithLargestChild
- */
- public boolean isMeasureWithLargestChildEnabled() {
- return mUseLargestChild;
- }
-
- /**
- * When set to true, all children with a weight will be considered having
- * the minimum size of the largest child. If false, all children are
- * measured normally.
- *
- * Disabled by default.
- *
- * @param enabled True to measure children with a weight using the
- * minimum size of the largest child, false otherwise.
- *
- * @attr ref android.R.styleable#LinearLayout_measureWithLargestChild
- */
- public void setMeasureWithLargestChildEnabled(boolean enabled) {
- mUseLargestChild = enabled;
- }
-
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
- if (mUseLargestChild) {
- final int orientation = getOrientation();
- switch (orientation) {
- case HORIZONTAL:
- useLargestChildHorizontal();
- break;
-
- case VERTICAL:
- useLargestChildVertical();
- break;
- }
- }
- }
-
- private void useLargestChildHorizontal() {
- final int childCount = getChildCount();
-
- // Find largest child width
- int largestChildWidth = 0;
- for (int i = 0; i < childCount; i++) {
- final View child = getChildAt(i);
- largestChildWidth = Math.max(child.getMeasuredWidth(), largestChildWidth);
- }
-
- int totalWidth = 0;
- // Re-measure childs
- for (int i = 0; i < childCount; i++) {
- final View child = getChildAt(i);
-
- if (child == null || child.getVisibility() == View.GONE) {
- continue;
- }
-
- final LinearLayout.LayoutParams lp =
- (LinearLayout.LayoutParams) child.getLayoutParams();
-
- float childExtra = lp.weight;
- if (childExtra > 0) {
- child.measure(
- MeasureSpec.makeMeasureSpec(largestChildWidth,
- MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(child.getMeasuredHeight(),
- MeasureSpec.EXACTLY));
- totalWidth += largestChildWidth;
-
- } else {
- totalWidth += child.getMeasuredWidth();
- }
-
- totalWidth += lp.leftMargin + lp.rightMargin;
- }
-
- totalWidth += getPaddingLeft() + getPaddingRight();
- setMeasuredDimension(totalWidth, getMeasuredHeight());
- }
-
- private void useLargestChildVertical() {
- final int childCount = getChildCount();
-
- // Find largest child width
- int largestChildHeight = 0;
- for (int i = 0; i < childCount; i++) {
- final View child = getChildAt(i);
- largestChildHeight = Math.max(child.getMeasuredHeight(), largestChildHeight);
- }
-
- int totalHeight = 0;
- // Re-measure childs
- for (int i = 0; i < childCount; i++) {
- final View child = getChildAt(i);
-
- if (child == null || child.getVisibility() == View.GONE) {
- continue;
- }
-
- final LinearLayout.LayoutParams lp =
- (LinearLayout.LayoutParams) child.getLayoutParams();
-
- float childExtra = lp.weight;
- if (childExtra > 0) {
- child.measure(
- MeasureSpec.makeMeasureSpec(child.getMeasuredWidth(),
- MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(largestChildHeight,
- MeasureSpec.EXACTLY));
- totalHeight += largestChildHeight;
-
- } else {
- totalHeight += child.getMeasuredHeight();
- }
-
- totalHeight += lp.leftMargin + lp.rightMargin;
- }
-
- totalHeight += getPaddingLeft() + getPaddingRight();
- setMeasuredDimension(getMeasuredWidth(), totalHeight);
- }
}
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java
index d13c6cea9..9ed87db2f 100644
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java
@@ -36,7 +36,7 @@ public class IcsListPopupWindow {
private static final int EXPAND_LIST_TIMEOUT = 250;
private Context mContext;
- private PopupWindow mPopup;
+ private final PopupWindowCompat mPopup;
private ListAdapter mAdapter;
private DropDownListView mDropDownList;
@@ -80,7 +80,7 @@ public class IcsListPopupWindow {
public IcsListPopupWindow(Context context, AttributeSet attrs, int defStyleAttr) {
mContext = context;
- mPopup = new PopupWindow(context, attrs, defStyleAttr);
+ mPopup = new PopupWindowCompat(context, attrs, defStyleAttr);
mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
}
@@ -88,9 +88,9 @@ public class IcsListPopupWindow {
mContext = context;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
Context wrapped = new ContextThemeWrapper(context, defStyleRes);
- mPopup = new PopupWindow(wrapped, attrs, defStyleAttr);
+ mPopup = new PopupWindowCompat(wrapped, attrs, defStyleAttr);
} else {
- mPopup = new PopupWindow(context, attrs, defStyleAttr, defStyleRes);
+ mPopup = new PopupWindowCompat(context, attrs, defStyleAttr, defStyleRes);
}
mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
}
@@ -258,6 +258,23 @@ public class IcsListPopupWindow {
mPopup.setInputMethodMode(mode);
}
+ /**
+ * Set the selected position of the list.
+ * Only valid when {@link #isShowing()} == {@code true}.
+ *
+ * @param position List position to set as selected.
+ */
+ public void setSelection(int position) {
+ DropDownListView list = mDropDownList;
+ if (isShowing() && list != null) {
+ list.mListSelectionHidden = false;
+ list.setSelection(position);
+ if (list.getChoiceMode() != ListView.CHOICE_MODE_NONE) {
+ list.setItemChecked(position, true);
+ }
+ }
+ }
+
public void clearListSelection() {
final DropDownListView list = mDropDownList;
if (list != null) {
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsToast.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsToast.java
new file mode 100644
index 000000000..042648b24
--- /dev/null
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/IcsToast.java
@@ -0,0 +1,60 @@
+
+package com.actionbarsherlock.internal.widget;
+
+import android.content.Context;
+import android.util.Log;
+import android.view.Gravity;
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.actionbarsherlock.R;
+
+public class IcsToast extends Toast {
+ public static final int LENGTH_LONG = Toast.LENGTH_LONG;
+ public static final int LENGTH_SHORT = Toast.LENGTH_SHORT;
+ private static final String TAG = "Toast";
+
+ public static Toast makeText(Context context, CharSequence s, int duration) {
+ if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) {
+ return Toast.makeText(context, s, duration);
+ }
+ IcsToast toast = new IcsToast(context);
+ toast.setDuration(duration);
+ TextView view = new TextView(context);
+ view.setText(s);
+ // Original AOSP using reference on @android:color/bright_foreground_dark
+ // bright_foreground_dark - reference on @android:color/background_light
+ // background_light - 0xffffffff
+ view.setTextColor(0xffffffff);
+ view.setGravity(Gravity.CENTER);
+ view.setBackgroundResource(R.drawable.abs__toast_frame);
+ toast.setView(view);
+ return toast;
+ }
+
+ public static Toast makeText(Context context, int resId, int duration) {
+ return makeText(context, context.getResources().getString(resId), duration);
+ }
+
+ public IcsToast(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void setText(CharSequence s) {
+ if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) {
+ super.setText(s);
+ return;
+ }
+ if (getView() == null) {
+ return;
+ }
+ try {
+ ((TextView) getView()).setText(s);
+ } catch (ClassCastException e) {
+ Log.e(TAG, "This Toast was not created with IcsToast.makeText", e);
+ }
+ }
+}
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/PopupWindowCompat.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/PopupWindowCompat.java
new file mode 100644
index 000000000..4c6e3720c
--- /dev/null
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/PopupWindowCompat.java
@@ -0,0 +1,178 @@
+
+package com.actionbarsherlock.internal.widget;
+
+import java.lang.reflect.Field;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewTreeObserver;
+import android.view.ViewTreeObserver.OnScrollChangedListener;
+import android.widget.PopupWindow;
+
+/**
+ * Works around bugs in the handling of {@link ViewTreeObserver} by
+ * {@link PopupWindow}.
+ * <p>
+ * <code>PopupWindow</code> registers an {@link OnScrollChangedListener} with
+ * {@link ViewTreeObserver}, but does not keep a reference to the observer
+ * instance that it has registers on. This is problematic when the anchor view
+ * used by <code>PopupWindow</code> to access the observer is detached from the
+ * window, as it will revert from the shared <code>ViewTreeObserver</code> owned
+ * by the <code>ViewRoot</code> to a floating one, meaning
+ * <code>PopupWindow</code> cannot unregister it's listener anymore and has
+ * leaked it into the global observer.
+ * <p>
+ * This class works around this issue by
+ * <ul>
+ * <li>replacing <code>PopupWindow.mOnScrollChangedListener</code> with a no-op
+ * listener so that any registration or unregistration performed by
+ * <code>PopupWindow</code> itself has no effect and causes no leaks.
+ * <li>registering the real listener only with the shared
+ * <code>ViewTreeObserver</code> and keeping a reference to it to facilitate
+ * correct unregistration. The reason for not registering on a floating observer
+ * (before a view is attached) is that there is no safe way to get a reference
+ * to the shared observer that the floating one will be merged into. This would
+ * again cause the listener to leak.
+ * </ul>
+ */
+public class PopupWindowCompat extends PopupWindow {
+
+ private static final Field superListenerField;
+ static {
+ Field f = null;
+ try {
+ f = PopupWindow.class.getDeclaredField("mOnScrollChangedListener");
+ f.setAccessible(true);
+ } catch (NoSuchFieldException e) {
+ /* ignored */
+ }
+ superListenerField = f;
+ }
+
+ private static final OnScrollChangedListener NOP = new OnScrollChangedListener() {
+ @Override
+ public void onScrollChanged() {
+ /* do nothing */
+ }
+ };
+
+ private OnScrollChangedListener mSuperScrollListener;
+ private ViewTreeObserver mViewTreeObserver;
+
+ public PopupWindowCompat() {
+ super();
+ init();
+ }
+
+ public PopupWindowCompat(Context context) {
+ super(context);
+ init();
+ }
+
+ public PopupWindowCompat(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init();
+ }
+
+ public PopupWindowCompat(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ init();
+ }
+
+ // @TargetApi(Build.VERSION_CODES.HONEYCOMB)
+ public PopupWindowCompat(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ init();
+ }
+
+ public PopupWindowCompat(int width, int height) {
+ super(width, height);
+ init();
+ }
+
+ public PopupWindowCompat(View contentView) {
+ super(contentView);
+ init();
+ }
+
+ public PopupWindowCompat(View contentView, int width, int height, boolean focusable) {
+ super(contentView, width, height, focusable);
+ init();
+ }
+
+ public PopupWindowCompat(View contentView, int width, int height) {
+ super(contentView, width, height);
+ init();
+ }
+
+ private void init() {
+ if (superListenerField != null) {
+ try {
+ mSuperScrollListener = (OnScrollChangedListener) superListenerField.get(this);
+ superListenerField.set(this, NOP);
+ } catch (Exception e) {
+ mSuperScrollListener = null;
+ }
+ }
+ }
+
+ private void unregisterListener() {
+ // Don't do anything if we haven't managed to patch the super listener
+ if (mSuperScrollListener != null && mViewTreeObserver != null) {
+ if (mViewTreeObserver.isAlive()) {
+ mViewTreeObserver.removeOnScrollChangedListener(mSuperScrollListener);
+ }
+ mViewTreeObserver = null;
+ }
+ }
+
+ private void registerListener(View anchor) {
+ // Don't do anything if we haven't managed to patch the super listener.
+ // And don't bother attaching the listener if the anchor view isn't
+ // attached. This means we'll only have to deal with the real VTO owned
+ // by the ViewRoot.
+ if (mSuperScrollListener != null) {
+ ViewTreeObserver vto = (anchor.getWindowToken() != null) ? anchor.getViewTreeObserver()
+ : null;
+ if (vto != mViewTreeObserver) {
+ if (mViewTreeObserver != null && mViewTreeObserver.isAlive()) {
+ mViewTreeObserver.removeOnScrollChangedListener(mSuperScrollListener);
+ }
+ if ((mViewTreeObserver = vto) != null) {
+ vto.addOnScrollChangedListener(mSuperScrollListener);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void showAsDropDown(View anchor, int xoff, int yoff) {
+ super.showAsDropDown(anchor, xoff, yoff);
+ registerListener(anchor);
+ }
+
+ @Override
+ public void update(View anchor, int xoff, int yoff, int width, int height) {
+ super.update(anchor, xoff, yoff, width, height);
+ registerListener(anchor);
+ }
+
+ @Override
+ public void update(View anchor, int width, int height) {
+ super.update(anchor, width, height);
+ registerListener(anchor);
+ }
+
+ @Override
+ public void showAtLocation(View parent, int gravity, int x, int y) {
+ super.showAtLocation(parent, gravity, x, y);
+ unregisterListener();
+ }
+
+ @Override
+ public void dismiss() {
+ super.dismiss();
+ unregisterListener();
+ }
+}
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java
index 48fb5d8b4..eb178e0de 100644
--- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java
@@ -186,7 +186,7 @@ public class ScrollingTabContainerView extends NineHorizontalScrollView
}
private IcsLinearLayout createTabLayout() {
- final IcsLinearLayout tabLayout = (IcsLinearLayout) LayoutInflater.from(getContext())
+ final TabsLinearLayout tabLayout = (TabsLinearLayout) LayoutInflater.from(getContext())
.inflate(R.layout.abs__action_bar_tab_bar_view, null);
tabLayout.setMeasureWithLargestChildEnabled(true);
tabLayout.setLayoutParams(new LinearLayout.LayoutParams(
diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/TabsLinearLayout.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/TabsLinearLayout.java
new file mode 100644
index 000000000..03d09b1f6
--- /dev/null
+++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/internal/widget/TabsLinearLayout.java
@@ -0,0 +1,113 @@
+package com.actionbarsherlock.internal.widget;
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.LinearLayout;
+
+public class TabsLinearLayout extends IcsLinearLayout {
+ private static final int[] R_styleable_LinearLayout = new int[] {
+ /* 0 */ android.R.attr.measureWithLargestChild,
+ };
+ private static final int LinearLayout_measureWithLargestChild = 0;
+
+ private boolean mUseLargestChild;
+
+ public TabsLinearLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+
+ TypedArray a = context.obtainStyledAttributes(attrs, /*com.android.internal.R.styleable.*/R_styleable_LinearLayout);
+ mUseLargestChild = a.getBoolean(/*com.android.internal.R.styleable.*/LinearLayout_measureWithLargestChild, false);
+
+ a.recycle();
+ }
+
+ /**
+ * When true, all children with a weight will be considered having
+ * the minimum size of the largest child. If false, all children are
+ * measured normally.
+ *
+ * @return True to measure children with a weight using the minimum
+ * size of the largest child, false otherwise.
+ *
+ * @attr ref android.R.styleable#LinearLayout_measureWithLargestChild
+ */
+ public boolean isMeasureWithLargestChildEnabled() {
+ return mUseLargestChild;
+ }
+
+ /**
+ * When set to true, all children with a weight will be considered having
+ * the minimum size of the largest child. If false, all children are
+ * measured normally.
+ *
+ * Disabled by default.
+ *
+ * @param enabled True to measure children with a weight using the
+ * minimum size of the largest child, false otherwise.
+ *
+ * @attr ref android.R.styleable#LinearLayout_measureWithLargestChild
+ */
+ public void setMeasureWithLargestChildEnabled(boolean enabled) {
+ mUseLargestChild = enabled;
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+
+ final int childCount = getChildCount();
+ if (childCount <= 2) return;
+
+ final int mode = MeasureSpec.getMode(widthMeasureSpec);
+ if (mUseLargestChild && mode == MeasureSpec.UNSPECIFIED) {
+ final int orientation = getOrientation();
+ if (orientation == HORIZONTAL) {
+ useLargestChildHorizontal();
+ }
+ }
+ }
+
+ private void useLargestChildHorizontal() {
+ final int childCount = getChildCount();
+
+ // Find largest child width
+ int largestChildWidth = 0;
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ largestChildWidth = Math.max(child.getMeasuredWidth(), largestChildWidth);
+ }
+
+ int totalWidth = 0;
+ // Re-measure childs
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+
+ if (child == null || child.getVisibility() == View.GONE) {
+ continue;
+ }
+
+ final LinearLayout.LayoutParams lp =
+ (LinearLayout.LayoutParams) child.getLayoutParams();
+
+ float childExtra = lp.weight;
+ if (childExtra > 0) {
+ child.measure(
+ MeasureSpec.makeMeasureSpec(largestChildWidth,
+ MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(child.getMeasuredHeight(),
+ MeasureSpec.EXACTLY));
+ totalWidth += largestChildWidth;
+
+ } else {
+ totalWidth += child.getMeasuredWidth();
+ }
+
+ totalWidth += lp.leftMargin + lp.rightMargin;
+ }
+
+ totalWidth += getPaddingLeft() + getPaddingRight();
+ setMeasuredDimension(totalWidth, getMeasuredHeight());
+ }
+}