diff --git a/libraries/ActionBarSherlock/AndroidManifest.xml b/libraries/ActionBarSherlock/AndroidManifest.xml index 7b8a84824..ca0fb7cee 100644 --- a/libraries/ActionBarSherlock/AndroidManifest.xml +++ b/libraries/ActionBarSherlock/AndroidManifest.xml @@ -1,6 +1,5 @@ - - - - + + + diff --git a/libraries/ActionBarSherlock/build.gradle b/libraries/ActionBarSherlock/build.gradle index 102d66946..41bbe1d9b 100644 --- a/libraries/ActionBarSherlock/build.gradle +++ b/libraries/ActionBarSherlock/build.gradle @@ -1,27 +1,18 @@ -buildscript { - repositories { - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:0.4.1' - } -} - apply plugin: 'android-library' dependencies { - compile files('libs/android-support-v4.jar') + compile 'com.android.support:support-v4:18.0.+' } android { - compileSdkVersion 17 - buildToolsVersion '17' + compileSdkVersion 14 + buildToolsVersion '17.0.0' - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = ['src'] - res.srcDirs = ['res'] - } + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + res.srcDirs = ['res'] } + } } diff --git a/libraries/ActionBarSherlock/build.xml b/libraries/ActionBarSherlock/build.xml deleted file mode 100644 index a10a91491..000000000 --- a/libraries/ActionBarSherlock/build.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ActionBarSherlock/pom.xml b/libraries/ActionBarSherlock/pom.xml index 3b6ce40ce..57d8d7c1c 100644 --- a/libraries/ActionBarSherlock/pom.xml +++ b/libraries/ActionBarSherlock/pom.xml @@ -1,148 +1,141 @@ - 4.0.0 + 4.0.0 - actionbarsherlock - ActionBarSherlock - apklib + + com.actionbarsherlock + parent + 4.4.0 + ../pom.xml + - - com.actionbarsherlock - parent - 4.2.0 - ../pom.xml - + actionbarsherlock + ActionBarSherlock + apklib - - - com.google.android - android - provided - - - com.google.android - support-v4 - + + + com.google.android + android + provided + + + com.google.android + support-v4 + - - junit - junit - test - - + + junit + junit + test + + + org.easytesting + fest-assert-core + test + + + org.robolectric + robolectric + test + + - - src - test + + src + test - - - com.jayway.maven.plugins.android.generation2 - android-maven-plugin - true - - ignored - - + + + com.jayway.maven.plugins.android.generation2 + android-maven-plugin + true + - - org.apache.maven.plugins - maven-javadoc-plugin - - true - - + + org.apache.maven.plugins + maven-javadoc-plugin + + true + + - - com.google.code.maven-replacer-plugin - maven-replacer-plugin - 1.4.0 - - - process-sources - - replace - - - - - false - target/generated-sources/r/com/actionbarsherlock/R.java - target/generated-sources/r/com/actionbarsherlock/R.java - false - static final int - static int - - + + com.google.code.maven-replacer-plugin + maven-replacer-plugin + + + process-sources + + replace + + + + + false + target/generated-sources/r/com/actionbarsherlock/R.java + target/generated-sources/r/com/actionbarsherlock/R.java + false + static final int + static int + + - - org.apache.maven.plugins - maven-checkstyle-plugin - - ../checkstyle.xml - - - - verify - - checkstyle - - - - + + org.codehaus.mojo + build-helper-maven-plugin + + + package + + attach-artifact + + + + + jar + ${project.build.directory}/${project.build.finalName}.jar + + + aar + ${project.basedir}/build/libs/${project.artifactId}-${gradle.version}.aar + + + + + + + - - org.codehaus.mojo - build-helper-maven-plugin - 1.7 - - - package - - attach-artifact - - - - - jar - ${project.build.directory}/${project.build.finalName}.jar - - - - - - - - - - - - - org.eclipse.m2e - lifecycle-mapping - 1.0.0 - - - - - - com.google.code.maven-replacer-plugin - maven-replacer-plugin - [1.4.0,) - - replace - - - - - - - - - - - - - + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + com.google.code.maven-replacer-plugin + maven-replacer-plugin + [1.4.0,) + + replace + + + + + + + + + + + + + diff --git a/libraries/ActionBarSherlock/proguard-project.txt b/libraries/ActionBarSherlock/proguard-project.txt deleted file mode 100644 index f2fe1559a..000000000 --- a/libraries/ActionBarSherlock/proguard-project.txt +++ /dev/null @@ -1,20 +0,0 @@ -# To enable ProGuard in your project, edit project.properties -# to define the proguard.config property as described in that file. -# -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in ${sdk.dir}/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the ProGuard -# include property in project.properties. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/libraries/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png b/libraries/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png deleted file mode 100644 index 79e56f522..000000000 Binary files a/libraries/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png and /dev/null differ diff --git a/libraries/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_light.9.png b/libraries/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_light.9.png deleted file mode 100644 index e029f210b..000000000 Binary files a/libraries/ActionBarSherlock/res/drawable-hdpi/abs__dialog_full_holo_light.9.png and /dev/null differ diff --git a/libraries/ActionBarSherlock/res/drawable-hdpi/abs__ic_commit_search_api_holo_dark.png b/libraries/ActionBarSherlock/res/drawable-hdpi/abs__ic_commit_search_api_holo_dark.png new file mode 100644 index 000000000..83f36a94c Binary files /dev/null and b/libraries/ActionBarSherlock/res/drawable-hdpi/abs__ic_commit_search_api_holo_dark.png differ diff --git a/libraries/ActionBarSherlock/res/drawable-hdpi/abs__ic_commit_search_api_holo_light.png b/libraries/ActionBarSherlock/res/drawable-hdpi/abs__ic_commit_search_api_holo_light.png new file mode 100644 index 000000000..a3cc21e6b Binary files /dev/null and b/libraries/ActionBarSherlock/res/drawable-hdpi/abs__ic_commit_search_api_holo_light.png differ diff --git a/libraries/ActionBarSherlock/res/drawable-hdpi/abs__ic_search.png b/libraries/ActionBarSherlock/res/drawable-hdpi/abs__ic_search.png index 4be72f108..bf8bd6670 100644 Binary files a/libraries/ActionBarSherlock/res/drawable-hdpi/abs__ic_search.png and b/libraries/ActionBarSherlock/res/drawable-hdpi/abs__ic_search.png differ diff --git a/libraries/ActionBarSherlock/res/drawable-hdpi/abs__toast_frame.9.png b/libraries/ActionBarSherlock/res/drawable-hdpi/abs__toast_frame.9.png new file mode 100644 index 000000000..ad2cb5a96 Binary files /dev/null and b/libraries/ActionBarSherlock/res/drawable-hdpi/abs__toast_frame.9.png differ diff --git a/libraries/ActionBarSherlock/res/drawable-mdpi/abs__dialog_full_holo_dark.9.png b/libraries/ActionBarSherlock/res/drawable-mdpi/abs__dialog_full_holo_dark.9.png deleted file mode 100644 index fb3660eab..000000000 Binary files a/libraries/ActionBarSherlock/res/drawable-mdpi/abs__dialog_full_holo_dark.9.png and /dev/null differ diff --git a/libraries/ActionBarSherlock/res/drawable-mdpi/abs__dialog_full_holo_light.9.png b/libraries/ActionBarSherlock/res/drawable-mdpi/abs__dialog_full_holo_light.9.png deleted file mode 100644 index f18050ea5..000000000 Binary files a/libraries/ActionBarSherlock/res/drawable-mdpi/abs__dialog_full_holo_light.9.png and /dev/null differ diff --git a/libraries/ActionBarSherlock/res/drawable-mdpi/abs__ic_commit_search_api_holo_dark.png b/libraries/ActionBarSherlock/res/drawable-mdpi/abs__ic_commit_search_api_holo_dark.png new file mode 100644 index 000000000..844c99c22 Binary files /dev/null and b/libraries/ActionBarSherlock/res/drawable-mdpi/abs__ic_commit_search_api_holo_dark.png differ diff --git a/libraries/ActionBarSherlock/res/drawable-mdpi/abs__ic_commit_search_api_holo_light.png b/libraries/ActionBarSherlock/res/drawable-mdpi/abs__ic_commit_search_api_holo_light.png new file mode 100644 index 000000000..86c170e97 Binary files /dev/null and b/libraries/ActionBarSherlock/res/drawable-mdpi/abs__ic_commit_search_api_holo_light.png differ diff --git a/libraries/ActionBarSherlock/res/drawable-mdpi/abs__toast_frame.9.png b/libraries/ActionBarSherlock/res/drawable-mdpi/abs__toast_frame.9.png new file mode 100644 index 000000000..b9105deee Binary files /dev/null and b/libraries/ActionBarSherlock/res/drawable-mdpi/abs__toast_frame.9.png differ diff --git a/libraries/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png b/libraries/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png deleted file mode 100644 index f4970ad1c..000000000 Binary files a/libraries/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png and /dev/null differ diff --git a/libraries/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png b/libraries/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png deleted file mode 100644 index 172fc3b5e..000000000 Binary files a/libraries/ActionBarSherlock/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png and /dev/null differ diff --git a/libraries/ActionBarSherlock/res/drawable-xhdpi/abs__ic_commit_search_api_holo_dark.png b/libraries/ActionBarSherlock/res/drawable-xhdpi/abs__ic_commit_search_api_holo_dark.png new file mode 100644 index 000000000..d8faf900a Binary files /dev/null and b/libraries/ActionBarSherlock/res/drawable-xhdpi/abs__ic_commit_search_api_holo_dark.png differ diff --git a/libraries/ActionBarSherlock/res/drawable-xhdpi/abs__ic_commit_search_api_holo_light.png b/libraries/ActionBarSherlock/res/drawable-xhdpi/abs__ic_commit_search_api_holo_light.png new file mode 100644 index 000000000..e7c7280ad Binary files /dev/null and b/libraries/ActionBarSherlock/res/drawable-xhdpi/abs__ic_commit_search_api_holo_light.png differ diff --git a/libraries/ActionBarSherlock/res/drawable-xhdpi/abs__toast_frame.9.png b/libraries/ActionBarSherlock/res/drawable-xhdpi/abs__toast_frame.9.png new file mode 100644 index 000000000..9f39a7746 Binary files /dev/null and b/libraries/ActionBarSherlock/res/drawable-xhdpi/abs__toast_frame.9.png differ diff --git a/libraries/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar.xml b/libraries/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar.xml index 040df44ab..ab4fa28d8 100644 --- a/libraries/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar.xml +++ b/libraries/ActionBarSherlock/res/layout-xlarge/abs__screen_action_bar.xml @@ -21,6 +21,7 @@ This is an optimized layout for a screen with the Action Bar enabled. + android:fitsSystemWindows="true" + android:splitMotionEvents="false"> diff --git a/libraries/ActionBarSherlock/res/layout/abs__action_bar_tab_bar_view.xml b/libraries/ActionBarSherlock/res/layout/abs__action_bar_tab_bar_view.xml index 0d51220c9..9d8f759bc 100644 --- a/libraries/ActionBarSherlock/res/layout/abs__action_bar_tab_bar_view.xml +++ b/libraries/ActionBarSherlock/res/layout/abs__action_bar_tab_bar_view.xml @@ -1,6 +1,6 @@ - \ No newline at end of file +/> diff --git a/libraries/ActionBarSherlock/res/layout/abs__dialog_title_holo.xml b/libraries/ActionBarSherlock/res/layout/abs__dialog_title_holo.xml deleted file mode 100644 index ab2b0ee6c..000000000 --- a/libraries/ActionBarSherlock/res/layout/abs__dialog_title_holo.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - diff --git a/libraries/ActionBarSherlock/res/layout/abs__list_menu_item_layout.xml b/libraries/ActionBarSherlock/res/layout/abs__list_menu_item_layout.xml deleted file mode 100644 index 147f36fe8..000000000 --- a/libraries/ActionBarSherlock/res/layout/abs__list_menu_item_layout.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/libraries/ActionBarSherlock/res/layout/abs__screen_action_bar.xml b/libraries/ActionBarSherlock/res/layout/abs__screen_action_bar.xml index 1fb82fe9a..68dc7dfe5 100644 --- a/libraries/ActionBarSherlock/res/layout/abs__screen_action_bar.xml +++ b/libraries/ActionBarSherlock/res/layout/abs__screen_action_bar.xml @@ -22,7 +22,8 @@ This is an optimized layout for a screen with the Action Bar enabled. android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:fitsSystemWindows="true"> + android:fitsSystemWindows="true" + android:splitMotionEvents="false"> + android:fitsSystemWindows="true" + android:splitMotionEvents="false"> diff --git a/libraries/ActionBarSherlock/res/layout/abs__search_view.xml b/libraries/ActionBarSherlock/res/layout/abs__search_view.xml index 6ba319121..55d2c7345 100644 --- a/libraries/ActionBarSherlock/res/layout/abs__search_view.xml +++ b/libraries/ActionBarSherlock/res/layout/abs__search_view.xml @@ -40,7 +40,7 @@ 9dip - 64dip + 64dip diff --git a/libraries/ActionBarSherlock/res/values-large/abs__dimens.xml b/libraries/ActionBarSherlock/res/values-large/abs__dimens.xml deleted file mode 100644 index 63b12f7f3..000000000 --- a/libraries/ActionBarSherlock/res/values-large/abs__dimens.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - 55% - - 80% - diff --git a/libraries/ActionBarSherlock/res/values-sw600dp/abs__dimens.xml b/libraries/ActionBarSherlock/res/values-sw600dp/abs__dimens.xml index f67853817..175a47fec 100644 --- a/libraries/ActionBarSherlock/res/values-sw600dp/abs__dimens.xml +++ b/libraries/ActionBarSherlock/res/values-sw600dp/abs__dimens.xml @@ -34,5 +34,5 @@ 5 - 64dip + 64dip diff --git a/libraries/ActionBarSherlock/res/values-v14/abs__themes.xml b/libraries/ActionBarSherlock/res/values-v14/abs__themes.xml index 5fac1ab58..75e317b4a 100644 --- a/libraries/ActionBarSherlock/res/values-v14/abs__themes.xml +++ b/libraries/ActionBarSherlock/res/values-v14/abs__themes.xml @@ -26,9 +26,4 @@ false true - - - diff --git a/libraries/ActionBarSherlock/res/values/abs__attrs.xml b/libraries/ActionBarSherlock/res/values/abs__attrs.xml index 32631ca8d..af5873d90 100644 --- a/libraries/ActionBarSherlock/res/values/abs__attrs.xml +++ b/libraries/ActionBarSherlock/res/values/abs__attrs.xml @@ -181,7 +181,7 @@ - + diff --git a/libraries/ActionBarSherlock/res/values/abs__colors.xml b/libraries/ActionBarSherlock/res/values/abs__colors.xml index 625c632ff..b189e727a 100644 --- a/libraries/ActionBarSherlock/res/values/abs__colors.xml +++ b/libraries/ActionBarSherlock/res/values/abs__colors.xml @@ -21,7 +21,4 @@ @color/abs__background_holo_dark #ff4c4c4c #ffb2b2b2 - @color/abs__bright_foreground_holo_light - @color/abs__bright_foreground_holo_dark - #ff33b5e5 diff --git a/libraries/ActionBarSherlock/res/values/abs__dimens.xml b/libraries/ActionBarSherlock/res/values/abs__dimens.xml index 831289e07..9ded21978 100644 --- a/libraries/ActionBarSherlock/res/values/abs__dimens.xml +++ b/libraries/ActionBarSherlock/res/values/abs__dimens.xml @@ -36,18 +36,6 @@ 56dip - - 64dip - - - 65% - - 95% - 8dip diff --git a/libraries/ActionBarSherlock/res/values/abs__strings.xml b/libraries/ActionBarSherlock/res/values/abs__strings.xml index 06a2a2af4..cf0235922 100644 --- a/libraries/ActionBarSherlock/res/values/abs__strings.xml +++ b/libraries/ActionBarSherlock/res/values/abs__strings.xml @@ -29,10 +29,6 @@ See all... - - Select activity - - Share with... Choose an application diff --git a/libraries/ActionBarSherlock/res/values/abs__styles.xml b/libraries/ActionBarSherlock/res/values/abs__styles.xml index 45a18c183..f86c1b823 100644 --- a/libraries/ActionBarSherlock/res/values/abs__styles.xml +++ b/libraries/ActionBarSherlock/res/values/abs__styles.xml @@ -302,25 +302,6 @@ - - - - - - - - + + + + + + + + + + diff --git a/libraries/ActionBarSherlock/res/values/abs__themes.xml b/libraries/ActionBarSherlock/res/values/abs__themes.xml index 634fa798b..6215e048f 100644 --- a/libraries/ActionBarSherlock/res/values/abs__themes.xml +++ b/libraries/ActionBarSherlock/res/values/abs__themes.xml @@ -9,8 +9,6 @@ - @@ -182,58 +204,4 @@ false true - - - - diff --git a/libraries/ActionBarSherlock/src/android/support/v4/app/Watson.java b/libraries/ActionBarSherlock/src/android/support/v4/app/Watson.java index d93de4c6a..8c8ffb018 100644 --- a/libraries/ActionBarSherlock/src/android/support/v4/app/Watson.java +++ b/libraries/ActionBarSherlock/src/android/support/v4/app/Watson.java @@ -3,18 +3,17 @@ package android.support.v4.app; import android.util.Log; import android.view.View; import android.view.Window; +import com.actionbarsherlock.ActionBarSherlock; import com.actionbarsherlock.ActionBarSherlock.OnCreatePanelMenuListener; import com.actionbarsherlock.ActionBarSherlock.OnMenuItemSelectedListener; import com.actionbarsherlock.ActionBarSherlock.OnPreparePanelListener; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; - import java.util.ArrayList; /** I'm in ur package. Stealing ur variables. */ public abstract class Watson extends FragmentActivity implements OnCreatePanelMenuListener, OnPreparePanelListener, OnMenuItemSelectedListener { - private static final boolean DEBUG = false; private static final String TAG = "Watson"; /** Fragment interface for menu creation callback. */ @@ -39,11 +38,11 @@ public abstract class Watson extends FragmentActivity implements OnCreatePanelMe @Override public boolean onCreatePanelMenu(int featureId, Menu menu) { - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] featureId: " + featureId + ", menu: " + menu); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onCreatePanelMenu] featureId: " + featureId + ", menu: " + menu); if (featureId == Window.FEATURE_OPTIONS_PANEL) { boolean result = onCreateOptionsMenu(menu); - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] activity create result: " + result); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onCreatePanelMenu] activity create result: " + result); MenuInflater inflater = getSupportMenuInflater(); boolean show = false; @@ -73,10 +72,10 @@ public abstract class Watson extends FragmentActivity implements OnCreatePanelMe mCreatedMenus = newMenus; - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] fragments create result: " + show); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onCreatePanelMenu] fragments create result: " + show); result |= show; - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] returning " + result); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onCreatePanelMenu] returning " + result); return result; } return false; @@ -84,11 +83,11 @@ public abstract class Watson extends FragmentActivity implements OnCreatePanelMe @Override public boolean onPreparePanel(int featureId, View view, Menu menu) { - if (DEBUG) Log.d(TAG, "[onPreparePanel] featureId: " + featureId + ", view: " + view + " menu: " + menu); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onPreparePanel] featureId: " + featureId + ", view: " + view + " menu: " + menu); if (featureId == Window.FEATURE_OPTIONS_PANEL) { boolean result = onPrepareOptionsMenu(menu); - if (DEBUG) Log.d(TAG, "[onPreparePanel] activity prepare result: " + result); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onPreparePanel] activity prepare result: " + result); boolean show = false; if (mFragments.mAdded != null) { @@ -101,11 +100,11 @@ public abstract class Watson extends FragmentActivity implements OnCreatePanelMe } } - if (DEBUG) Log.d(TAG, "[onPreparePanel] fragments prepare result: " + show); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onPreparePanel] fragments prepare result: " + show); result |= show; result &= menu.hasVisibleItems(); - if (DEBUG) Log.d(TAG, "[onPreparePanel] returning " + result); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onPreparePanel] returning " + result); return result; } return false; @@ -113,7 +112,7 @@ public abstract class Watson extends FragmentActivity implements OnCreatePanelMe @Override public boolean onMenuItemSelected(int featureId, MenuItem item) { - if (DEBUG) Log.d(TAG, "[onMenuItemSelected] featureId: " + featureId + ", item: " + item); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onMenuItemSelected] featureId: " + featureId + ", item: " + item); if (featureId == Window.FEATURE_OPTIONS_PANEL) { if (onOptionsItemSelected(item)) { diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/ActionBarSherlock.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/ActionBarSherlock.java index ab160f836..2c0312725 100644 --- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/ActionBarSherlock.java +++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/ActionBarSherlock.java @@ -1,14 +1,5 @@ package com.actionbarsherlock; -import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.util.HashMap; -import java.util.Iterator; import android.app.Activity; import android.content.Context; import android.content.res.Configuration; @@ -27,6 +18,16 @@ import com.actionbarsherlock.view.ActionMode; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Iterator; + +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; /** *

Helper for implementing the action bar design pattern across all versions @@ -40,7 +41,7 @@ import com.actionbarsherlock.view.MenuItem; */ public abstract class ActionBarSherlock { protected static final String TAG = "ActionBarSherlock"; - protected static final boolean DEBUG = false; + public static final boolean DEBUG = false; private static final Class[] CONSTRUCTOR_ARGS = new Class[] { Activity.class, int.class }; private static final HashMap> IMPLEMENTATIONS = @@ -791,4 +792,9 @@ public abstract class ActionBarSherlock { * @see ActionMode */ public abstract ActionMode startActionMode(ActionMode.Callback callback); + + /** + * Ensure that the action bar is attached. + */ + public void ensureActionBar() {} } diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockActivity.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockActivity.java index 7b4543640..48a92da65 100644 --- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockActivity.java +++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockActivity.java @@ -243,6 +243,12 @@ public abstract class SherlockActivity extends Activity implements OnCreatePanel getSherlock().requestFeature((int)featureId); } + @Override + public View findViewById(int id) { + getSherlock().ensureActionBar(); + return super.findViewById(id); + } + /////////////////////////////////////////////////////////////////////////// // Progress Indication diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockDialogFragment.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockDialogFragment.java index a7c856bf0..c139325cd 100644 --- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockDialogFragment.java +++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockDialogFragment.java @@ -8,9 +8,9 @@ import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnCreateOptionsMenuListener; -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnOptionsItemSelectedListener; -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnPrepareOptionsMenuListener; +import static android.support.v4.app.Watson.OnCreateOptionsMenuListener; +import static android.support.v4.app.Watson.OnOptionsItemSelectedListener; +import static android.support.v4.app.Watson.OnPrepareOptionsMenuListener; public class SherlockDialogFragment extends DialogFragment implements OnCreateOptionsMenuListener, OnPrepareOptionsMenuListener, OnOptionsItemSelectedListener { private SherlockFragmentActivity mActivity; diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java index 078f9b0ca..9f4e81d14 100644 --- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java +++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java @@ -232,6 +232,12 @@ public abstract class SherlockExpandableListActivity extends ExpandableListActiv getSherlock().requestFeature((int)featureId); } + @Override + public View findViewById(int id) { + getSherlock().ensureActionBar(); + return super.findViewById(id); + } + /////////////////////////////////////////////////////////////////////////// // Progress Indication diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragment.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragment.java index 0f24e9c85..0bdd068a6 100644 --- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragment.java +++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragment.java @@ -8,9 +8,9 @@ import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnCreateOptionsMenuListener; -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnOptionsItemSelectedListener; -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnPrepareOptionsMenuListener; +import static android.support.v4.app.Watson.OnCreateOptionsMenuListener; +import static android.support.v4.app.Watson.OnOptionsItemSelectedListener; +import static android.support.v4.app.Watson.OnPrepareOptionsMenuListener; public class SherlockFragment extends Fragment implements OnCreateOptionsMenuListener, OnPrepareOptionsMenuListener, OnOptionsItemSelectedListener { private SherlockFragmentActivity mActivity; diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragmentActivity.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragmentActivity.java index 3d092f033..e764c170b 100644 --- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragmentActivity.java +++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockFragmentActivity.java @@ -19,7 +19,6 @@ import static com.actionbarsherlock.ActionBarSherlock.OnActionModeStartedListene /** @see {@link android.support.v4.app.Watson} */ public class SherlockFragmentActivity extends Watson implements OnActionModeStartedListener, OnActionModeFinishedListener { - private static final boolean DEBUG = false; private static final String TAG = "SherlockFragmentActivity"; private ActionBarSherlock mSherlock; @@ -139,33 +138,33 @@ public class SherlockFragmentActivity extends Watson implements OnActionModeStar /////////////////////////////////////////////////////////////////////////// public MenuInflater getSupportMenuInflater() { - if (DEBUG) Log.d(TAG, "[getSupportMenuInflater]"); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[getSupportMenuInflater]"); return getSherlock().getMenuInflater(); } public void invalidateOptionsMenu() { - if (DEBUG) Log.d(TAG, "[invalidateOptionsMenu]"); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[invalidateOptionsMenu]"); getSherlock().dispatchInvalidateOptionsMenu(); } public void supportInvalidateOptionsMenu() { - if (DEBUG) Log.d(TAG, "[supportInvalidateOptionsMenu]"); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[supportInvalidateOptionsMenu]"); invalidateOptionsMenu(); } @Override public final boolean onCreatePanelMenu(int featureId, android.view.Menu menu) { - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] featureId: " + featureId + ", menu: " + menu); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onCreatePanelMenu] featureId: " + featureId + ", menu: " + menu); if (featureId == Window.FEATURE_OPTIONS_PANEL && !mIgnoreNativeCreate) { mIgnoreNativeCreate = true; boolean result = getSherlock().dispatchCreateOptionsMenu(menu); mIgnoreNativeCreate = false; - if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] returning " + result); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onCreatePanelMenu] returning " + result); return result; } return super.onCreatePanelMenu(featureId, menu); @@ -178,14 +177,14 @@ public class SherlockFragmentActivity extends Watson implements OnActionModeStar @Override public final boolean onPreparePanel(int featureId, View view, android.view.Menu menu) { - if (DEBUG) Log.d(TAG, "[onPreparePanel] featureId: " + featureId + ", view: " + view + ", menu: " + menu); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onPreparePanel] featureId: " + featureId + ", view: " + view + ", menu: " + menu); if (featureId == Window.FEATURE_OPTIONS_PANEL && !mIgnoreNativePrepare) { mIgnoreNativePrepare = true; boolean result = getSherlock().dispatchPrepareOptionsMenu(menu); mIgnoreNativePrepare = false; - if (DEBUG) Log.d(TAG, "[onPreparePanel] returning " + result); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onPreparePanel] returning " + result); return result; } return super.onPreparePanel(featureId, view, menu); @@ -198,14 +197,14 @@ public class SherlockFragmentActivity extends Watson implements OnActionModeStar @Override public final boolean onMenuItemSelected(int featureId, android.view.MenuItem item) { - if (DEBUG) Log.d(TAG, "[onMenuItemSelected] featureId: " + featureId + ", item: " + item); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onMenuItemSelected] featureId: " + featureId + ", item: " + item.getTitle()); if (featureId == Window.FEATURE_OPTIONS_PANEL && !mIgnoreNativeSelected) { mIgnoreNativeSelected = true; boolean result = getSherlock().dispatchOptionsItemSelected(item); mIgnoreNativeSelected = false; - if (DEBUG) Log.d(TAG, "[onMenuItemSelected] returning " + result); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "[onMenuItemSelected] returning " + result); return result; } return super.onMenuItemSelected(featureId, item); @@ -276,6 +275,12 @@ public class SherlockFragmentActivity extends Watson implements OnActionModeStar getSherlock().requestFeature((int)featureId); } + @Override + public View findViewById(int id) { + getSherlock().ensureActionBar(); + return super.findViewById(id); + } + /////////////////////////////////////////////////////////////////////////// // Progress Indication diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListActivity.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListActivity.java index aba6d85e8..7ced7812a 100644 --- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListActivity.java +++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListActivity.java @@ -243,6 +243,12 @@ public abstract class SherlockListActivity extends ListActivity implements OnCre getSherlock().requestFeature((int)featureId); } + @Override + public View findViewById(int id) { + getSherlock().ensureActionBar(); + return super.findViewById(id); + } + /////////////////////////////////////////////////////////////////////////// // Progress Indication diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListFragment.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListFragment.java index 13ca3c49f..7c4d09511 100644 --- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListFragment.java +++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockListFragment.java @@ -8,9 +8,9 @@ import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnCreateOptionsMenuListener; -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnOptionsItemSelectedListener; -import static com.actionbarsherlock.app.SherlockFragmentActivity.OnPrepareOptionsMenuListener; +import static android.support.v4.app.Watson.OnCreateOptionsMenuListener; +import static android.support.v4.app.Watson.OnOptionsItemSelectedListener; +import static android.support.v4.app.Watson.OnPrepareOptionsMenuListener; public class SherlockListFragment extends ListFragment implements OnCreateOptionsMenuListener, OnPrepareOptionsMenuListener, OnOptionsItemSelectedListener { private SherlockFragmentActivity mActivity; diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java index bee72cb25..85c6ab214 100644 --- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java +++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java @@ -243,6 +243,12 @@ public abstract class SherlockPreferenceActivity extends PreferenceActivity impl getSherlock().requestFeature((int)featureId); } + @Override + public View findViewById(int id) { + getSherlock().ensureActionBar(); + return super.findViewById(id); + } + /////////////////////////////////////////////////////////////////////////// // Progress Indication 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); - } + 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; + } + + 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 { - mTitleView.setText(mTitle); + splitActionBar = mActivity.getTheme() + .obtainStyledAttributes(R.styleable.SherlockTheme) + .getBoolean(R.styleable.SherlockTheme_windowSplitActionBar, false); } - } 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(); - } + final ActionBarContainer splitView = (ActionBarContainer)mDecor.findViewById(R.id.abs__split_action_bar); + if (splitView != null) { + wActionBar.setSplitView(splitView); + wActionBar.setSplitActionBar(splitActionBar); + wActionBar.setSplitWhenNarrow(splitWhenNarrow); - //Since we don't require onCreate dispatching, parse for uiOptions here - int uiOptions = loadUiOptionsFromManifest(mActivity); - if (uiOptions != 0) { - mUiOptions = uiOptions; - } + 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 has the attribute - if (DEBUG) Log.d(TAG, "Got "); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "Got "); 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 is us and has the attribute - if (DEBUG) Log.d(TAG, "Got "); + if (ActionBarSherlock.DEBUG) Log.d(TAG, "Got "); 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 has the attribute + if (ActionBarSherlock.DEBUG) Log.d(TAG, "Got "); + + 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 is us and has the attribute + if (ActionBarSherlock.DEBUG) Log.d(TAG, "Got "); + 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 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 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 menuMapCopy = new WeakHashMap(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 has the attribute - if (DEBUG) Log.d(TAG, "Got "); - - 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 is us and has the attribute - if (DEBUG) Log.d(TAG, "Got "); - 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}. + *

+ * PopupWindow 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 PopupWindow to access the observer is detached from the + * window, as it will revert from the shared ViewTreeObserver owned + * by the ViewRoot to a floating one, meaning + * PopupWindow cannot unregister it's listener anymore and has + * leaked it into the global observer. + *

+ * This class works around this issue by + *

    + *
  • replacing PopupWindow.mOnScrollChangedListener with a no-op + * listener so that any registration or unregistration performed by + * PopupWindow itself has no effect and causes no leaks. + *
  • registering the real listener only with the shared + * ViewTreeObserver 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. + *
+ */ +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()); + } +} diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/widget/ActivityChooserView.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/widget/ActivityChooserView.java index e19ea9e9e..7eb7330e4 100644 --- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/widget/ActivityChooserView.java +++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/widget/ActivityChooserView.java @@ -395,7 +395,11 @@ class ActivityChooserView extends ViewGroup implements ActivityChooserModelClien super.onAttachedToWindow(); ActivityChooserModel dataModel = mAdapter.getDataModel(); if (dataModel != null) { - dataModel.registerObserver(mModelDataSetOberver); + try { + dataModel.registerObserver(mModelDataSetOberver); + } catch (IllegalStateException e) { + // Related to #557. + } } mIsAttachedToWindow = true; } @@ -522,6 +526,9 @@ class ActivityChooserView extends ViewGroup implements ActivityChooserModelClien mDefaultActionButtonContentDescription, label); mDefaultActivityButton.setContentDescription(contentDescription); } + + // Work-around for #415. + mAdapter.setShowDefaultActivity(false, false); } else { mDefaultActivityButton.setVisibility(View.GONE); } @@ -644,7 +651,8 @@ class ActivityChooserView extends ViewGroup implements ActivityChooserModelClien private int mMaxActivityCount = MAX_ACTIVITY_COUNT_DEFAULT; - private boolean mShowDefaultActivity; + // Work-around for #415. + private boolean mShowDefaultActivity = true; private boolean mHighlightDefaultActivity; @@ -661,7 +669,11 @@ class ActivityChooserView extends ViewGroup implements ActivityChooserModelClien } mDataModel = dataModel; if (dataModel != null && isShown()) { - dataModel.registerObserver(mModelDataSetOberver); + try { + dataModel.registerObserver(mModelDataSetOberver); + } catch (IllegalStateException e) { + // Related to #557. + } } notifyDataSetChanged(); } diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/widget/SearchView.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/widget/SearchView.java index c9e7897d4..fb8319645 100644 --- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/widget/SearchView.java +++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/widget/SearchView.java @@ -1623,8 +1623,8 @@ public class SearchView extends LinearLayout implements CollapsibleActionView { private void forceSuggestionQuery() { try { - Method before = SearchAutoComplete.class.getMethod("doBeforeTextChanged"); - Method after = SearchAutoComplete.class.getMethod("doAfterTextChanged"); + Method before = AutoCompleteTextView.class.getDeclaredMethod("doBeforeTextChanged"); + Method after = AutoCompleteTextView.class.getDeclaredMethod("doAfterTextChanged"); before.setAccessible(true); after.setAccessible(true); before.invoke(mQueryTextView); diff --git a/libraries/ActionBarSherlock/src/com/actionbarsherlock/widget/SuggestionsAdapter.java b/libraries/ActionBarSherlock/src/com/actionbarsherlock/widget/SuggestionsAdapter.java index bd5cbd718..82d4f0c42 100644 --- a/libraries/ActionBarSherlock/src/com/actionbarsherlock/widget/SuggestionsAdapter.java +++ b/libraries/ActionBarSherlock/src/com/actionbarsherlock/widget/SuggestionsAdapter.java @@ -66,6 +66,7 @@ class SuggestionsAdapter extends ResourceCursorAdapter implements OnClickListene static final int REFINE_ALL = 2; private SearchManager mSearchManager; + private SearchableInfo mSearchable; private SearchView mSearchView; private Context mProviderContext; private WeakHashMap mOutsideDrawablesCache; @@ -94,12 +95,13 @@ class SuggestionsAdapter extends ResourceCursorAdapter implements OnClickListene //private static final long DELETE_KEY_POST_DELAY = 500L; public SuggestionsAdapter(Context context, SearchView searchView, - SearchableInfo mSearchable, WeakHashMap outsideDrawablesCache) { + SearchableInfo searchable, WeakHashMap outsideDrawablesCache) { super(context, R.layout.abs__search_dropdown_item_icons_2line, null, // no initial cursor true); // auto-requery mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE); + mSearchable = searchable; mProviderContext = mContext; mSearchView = searchView; @@ -199,25 +201,48 @@ class SuggestionsAdapter extends ResourceCursorAdapter implements OnClickListene } public Cursor getSuggestions(String query, int limit) { + if (mSearchable == null) { + return null; + } + + String authority = mSearchable.getSuggestAuthority(); + if (authority == null) { + return null; + } + Uri.Builder uriBuilder = new Uri.Builder() .scheme(ContentResolver.SCHEME_CONTENT) + .authority(authority) .query("") // TODO: Remove, workaround for a bug in Uri.writeToParcel() .fragment(""); // TODO: Remove, workaround for a bug in Uri.writeToParcel() + // if content path provided, insert it now + final String contentPath = mSearchable.getSuggestPath(); + if (contentPath != null) { + uriBuilder.appendEncodedPath(contentPath); + } + // append standard suggestion query path uriBuilder.appendPath(SearchManager.SUGGEST_URI_PATH_QUERY); + // get the query selection, may be null + String selection = mSearchable.getSuggestSelection(); // inject query, either as selection args or inline - uriBuilder.appendPath(query); + String[] selArgs = null; + if (selection != null) { // use selection if provided + selArgs = new String[] { query }; + } else { // no selection, use REST pattern + uriBuilder.appendPath(query); + } if (limit > 0) { - uriBuilder.appendQueryParameter(SearchManager.SUGGEST_PARAMETER_LIMIT, String.valueOf(limit)); + uriBuilder.appendQueryParameter("limit", String.valueOf(limit)); } Uri uri = uriBuilder.build(); // finally, make the query - return mContext.getContentResolver().query(uri, null, null, null, null); + return mContext.getContentResolver().query(uri, null, selection, selArgs, null); } public void close() { diff --git a/libraries/ActionBarSherlock/test/com/actionbarsherlock/internal/ManifestParsingTest.java b/libraries/ActionBarSherlock/test/com/actionbarsherlock/internal/ManifestParsingTest.java deleted file mode 100644 index 47475c574..000000000 --- a/libraries/ActionBarSherlock/test/com/actionbarsherlock/internal/ManifestParsingTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.actionbarsherlock.internal; - -import org.junit.Test; - -import static com.actionbarsherlock.internal.ActionBarSherlockCompat.cleanActivityName; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.junit.Assert.assertThat; - -public class ManifestParsingTest { - @Test - public void testFullyQualifiedClassName() { - String expected = "com.other.package.SomeClass"; - String actual = cleanActivityName("com.jakewharton.test", "com.other.package.SomeClass"); - assertThat(expected, equalTo(actual)); - } - - @Test - public void testFullyQualifiedClassNameSamePackage() { - String expected = "com.jakewharton.test.SomeClass"; - String actual = cleanActivityName("com.jakewharton.test", "com.jakewharton.test.SomeClass"); - assertThat(expected, equalTo(actual)); - } - - @Test - public void testUnqualifiedClassName() { - String expected = "com.jakewharton.test.SomeClass"; - String actual = cleanActivityName("com.jakewharton.test", "SomeClass"); - assertThat(expected, equalTo(actual)); - } - - @Test - public void testRelativeClassName() { - String expected = "com.jakewharton.test.ui.SomeClass"; - String actual = cleanActivityName("com.jakewharton.test", ".ui.SomeClass"); - assertThat(expected, equalTo(actual)); - } -} \ No newline at end of file diff --git a/libraries/ActionBarSherlock/test/com/actionbarsherlock/internal/ResourcesCompatTest.java b/libraries/ActionBarSherlock/test/com/actionbarsherlock/internal/ResourcesCompatTest.java new file mode 100644 index 000000000..f621d3a96 --- /dev/null +++ b/libraries/ActionBarSherlock/test/com/actionbarsherlock/internal/ResourcesCompatTest.java @@ -0,0 +1,23 @@ +package com.actionbarsherlock.internal; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +import static com.actionbarsherlock.internal.ActionBarSherlockCompat.cleanActivityName; +import static org.fest.assertions.api.Assertions.assertThat; + +@RunWith(RobolectricTestRunner.class) +public class ResourcesCompatTest { + @Test + public void testCleanActivityName() { + assertThat(cleanActivityName("com.jakewharton.test", "com.other.package.SomeClass")) // + .isEqualTo("com.other.package.SomeClass"); + assertThat(cleanActivityName("com.jakewharton.test", "com.jakewharton.test.SomeClass")) // + .isEqualTo("com.jakewharton.test.SomeClass"); + assertThat(cleanActivityName("com.jakewharton.test", "SomeClass")) // + .isEqualTo("com.jakewharton.test.SomeClass"); + assertThat(cleanActivityName("com.jakewharton.test", ".ui.SomeClass")) // + .isEqualTo("com.jakewharton.test.ui.SomeClass"); + } +} \ No newline at end of file