Update actionbarsherlock from 4.2 to 4.4
@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="100" android:versionName="4.2.0" package="com.actionbarsherlock">
|
||||
|
||||
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="16"/>
|
||||
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="440" android:versionName="4.4.0" package="com.actionbarsherlock">
|
||||
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="17"/>
|
||||
<application/>
|
||||
</manifest>
|
||||
|
@ -1,21 +1,12 @@
|
||||
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 {
|
||||
|
@ -1,92 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project name="MainActivity" default="help">
|
||||
|
||||
<!-- The local.properties file is created and updated by the 'android' tool.
|
||||
It contains the path to the SDK. It should *NOT* be checked into
|
||||
Version Control Systems. -->
|
||||
<property file="local.properties" />
|
||||
|
||||
<!-- The ant.properties file can be created by you. It is only edited by the
|
||||
'android' tool to add properties to it.
|
||||
This is the place to change some Ant specific build properties.
|
||||
Here are some properties you may want to change/update:
|
||||
|
||||
source.dir
|
||||
The name of the source directory. Default is 'src'.
|
||||
out.dir
|
||||
The name of the output directory. Default is 'bin'.
|
||||
|
||||
For other overridable properties, look at the beginning of the rules
|
||||
files in the SDK, at tools/ant/build.xml
|
||||
|
||||
Properties related to the SDK location or the project target should
|
||||
be updated using the 'android' tool with the 'update' action.
|
||||
|
||||
This file is an integral part of the build system for your
|
||||
application and should be checked into Version Control Systems.
|
||||
|
||||
-->
|
||||
<property file="ant.properties" />
|
||||
|
||||
<!-- if sdk.dir was not set from one of the property file, then
|
||||
get it from the ANDROID_HOME env var.
|
||||
This must be done before we load project.properties since
|
||||
the proguard config can use sdk.dir -->
|
||||
<property environment="env" />
|
||||
<condition property="sdk.dir" value="${env.ANDROID_HOME}">
|
||||
<isset property="env.ANDROID_HOME" />
|
||||
</condition>
|
||||
|
||||
<!-- The project.properties file is created and updated by the 'android'
|
||||
tool, as well as ADT.
|
||||
|
||||
This contains project specific properties such as project target, and library
|
||||
dependencies. Lower level build properties are stored in ant.properties
|
||||
(or in .classpath for Eclipse projects).
|
||||
|
||||
This file is an integral part of the build system for your
|
||||
application and should be checked into Version Control Systems. -->
|
||||
<loadproperties srcFile="project.properties" />
|
||||
|
||||
<!-- quick check on sdk.dir -->
|
||||
<fail
|
||||
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
|
||||
unless="sdk.dir"
|
||||
/>
|
||||
|
||||
<!--
|
||||
Import per project custom build rules if present at the root of the project.
|
||||
This is the place to put custom intermediary targets such as:
|
||||
-pre-build
|
||||
-pre-compile
|
||||
-post-compile (This is typically used for code obfuscation.
|
||||
Compiled code location: ${out.classes.absolute.dir}
|
||||
If this is not done in place, override ${out.dex.input.absolute.dir})
|
||||
-post-package
|
||||
-post-build
|
||||
-pre-clean
|
||||
-->
|
||||
<import file="custom_rules.xml" optional="true" />
|
||||
|
||||
<!-- Import the actual build file.
|
||||
|
||||
To customize existing targets, there are two options:
|
||||
- Customize only one target:
|
||||
- copy/paste the target into this file, *before* the
|
||||
<import> task.
|
||||
- customize it to your needs.
|
||||
- Customize the whole content of build.xml
|
||||
- copy/paste the content of the rules files (minus the top node)
|
||||
into this file, replacing the <import> task.
|
||||
- customize to your needs.
|
||||
|
||||
***********************
|
||||
****** IMPORTANT ******
|
||||
***********************
|
||||
In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
|
||||
in order to avoid having your file be overridden by tools such as "android update project"
|
||||
-->
|
||||
<!-- version-tag: 1 -->
|
||||
<import file="${sdk.dir}/tools/ant/build.xml" />
|
||||
|
||||
</project>
|
@ -3,17 +3,17 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>actionbarsherlock</artifactId>
|
||||
<name>ActionBarSherlock</name>
|
||||
<packaging>apklib</packaging>
|
||||
|
||||
<parent>
|
||||
<groupId>com.actionbarsherlock</groupId>
|
||||
<artifactId>parent</artifactId>
|
||||
<version>4.2.0</version>
|
||||
<version>4.4.0</version>
|
||||
<relativePath>../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
<artifactId>actionbarsherlock</artifactId>
|
||||
<name>ActionBarSherlock</name>
|
||||
<packaging>apklib</packaging>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.google.android</groupId>
|
||||
@ -30,6 +30,16 @@
|
||||
<artifactId>junit</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.easytesting</groupId>
|
||||
<artifactId>fest-assert-core</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.robolectric</groupId>
|
||||
<artifactId>robolectric</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
@ -41,9 +51,6 @@
|
||||
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
|
||||
<artifactId>android-maven-plugin</artifactId>
|
||||
<extensions>true</extensions>
|
||||
<configuration>
|
||||
<nativeLibrariesDirectory>ignored</nativeLibrariesDirectory>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
@ -57,7 +64,6 @@
|
||||
<plugin>
|
||||
<groupId>com.google.code.maven-replacer-plugin</groupId>
|
||||
<artifactId>maven-replacer-plugin</artifactId>
|
||||
<version>1.4.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>process-sources</phase>
|
||||
@ -76,26 +82,9 @@
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||
<configuration>
|
||||
<configLocation>../checkstyle.xml</configLocation>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>verify</phase>
|
||||
<goals>
|
||||
<goal>checkstyle</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
<plugin>
|
||||
<groupId>org.codehaus.mojo</groupId>
|
||||
<artifactId>build-helper-maven-plugin</artifactId>
|
||||
<version>1.7</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
@ -108,6 +97,10 @@
|
||||
<type>jar</type>
|
||||
<file>${project.build.directory}/${project.build.finalName}.jar</file>
|
||||
</artifact>
|
||||
<artifact>
|
||||
<type>aar</type>
|
||||
<file>${project.basedir}/build/libs/${project.artifactId}-${gradle.version}.aar</file>
|
||||
</artifact>
|
||||
</artifacts>
|
||||
</configuration>
|
||||
</execution>
|
||||
|
@ -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 *;
|
||||
#}
|
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 597 B |
After Width: | Height: | Size: 616 B |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 882 B |
Before Width: | Height: | Size: 1003 B |
After Width: | Height: | Size: 511 B |
After Width: | Height: | Size: 532 B |
After Width: | Height: | Size: 839 B |
Before Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 703 B |
After Width: | Height: | Size: 712 B |
After Width: | Height: | Size: 1.9 KiB |
@ -21,6 +21,7 @@ This is an optimized layout for a screen with the Action Bar enabled.
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:fitsSystemWindows="true"
|
||||
android:splitMotionEvents="false"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent">
|
||||
<com.actionbarsherlock.internal.widget.ActionBarContainer
|
||||
|
@ -20,7 +20,8 @@ the Action Bar enabled overlaying application content.
|
||||
-->
|
||||
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:fitsSystemWindows="true">
|
||||
android:fitsSystemWindows="true"
|
||||
android:splitMotionEvents="false">
|
||||
<com.actionbarsherlock.internal.nineoldandroids.widget.NineFrameLayout android:id="@+id/abs__content"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent" />
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<com.actionbarsherlock.internal.widget.IcsLinearLayout
|
||||
<com.actionbarsherlock.internal.widget.TabsLinearLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
style="?attr/actionBarTabBarStyle"
|
||||
/>
|
@ -1,46 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
/*
|
||||
** Copyright 2011, The Android Open Source Project
|
||||
**
|
||||
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||
** you may not use this file except in compliance with the License.
|
||||
** You may obtain a copy of the License at
|
||||
**
|
||||
** http://www.apache.org/licenses/LICENSE-2.0
|
||||
**
|
||||
** Unless required by applicable law or agreed to in writing, software
|
||||
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
** See the License for the specific language governing permissions and
|
||||
** limitations under the License.
|
||||
*/
|
||||
|
||||
This is an optimized layout for a screen, with the minimum set of features
|
||||
enabled.
|
||||
-->
|
||||
|
||||
<com.actionbarsherlock.internal.widget.FakeDialogPhoneWindow xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:fitsSystemWindows="true">
|
||||
<TextView android:id="@android:id/title" style="?android:attr/windowTitleStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:minHeight="@dimen/abs__alert_dialog_title_height"
|
||||
android:paddingLeft="16dip"
|
||||
android:paddingRight="16dip"
|
||||
android:gravity="center_vertical|left" />
|
||||
<View android:id="@+id/abs__titleDivider"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="2dip"
|
||||
android:background="@color/abs__holo_blue_light" />
|
||||
<FrameLayout
|
||||
android:layout_width="match_parent" android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
android:orientation="vertical"
|
||||
android:foreground="?attr/windowContentOverlay">
|
||||
<FrameLayout android:id="@+id/abs__content"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent" />
|
||||
</FrameLayout>
|
||||
</com.actionbarsherlock.internal.widget.FakeDialogPhoneWindow>
|
@ -1,59 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright (C) 2007 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<com.actionbarsherlock.internal.view.menu.ListMenuItemView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="?attr/listPreferredItemHeightSmall">
|
||||
|
||||
<!-- Icon will be inserted here. -->
|
||||
|
||||
<!-- The title and summary have some gap between them, and this 'group' should be centered vertically. -->
|
||||
<RelativeLayout
|
||||
android:layout_width="0dip"
|
||||
android:layout_weight="1"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="center_vertical"
|
||||
android:layout_marginLeft="?attr/listPreferredItemPaddingLeft"
|
||||
android:layout_marginRight="?attr/listPreferredItemPaddingRight"
|
||||
android:duplicateParentState="true">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/abs__title"
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentTop="true"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:textAppearance="?attr/textAppearanceListItemSmall"
|
||||
android:singleLine="true"
|
||||
android:duplicateParentState="true"
|
||||
android:ellipsize="marquee"
|
||||
android:fadingEdge="horizontal" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/abs__shortcut"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_below="@id/abs__title"
|
||||
android:layout_alignParentLeft="true"
|
||||
android:textAppearance="?attr/textAppearanceSmall"
|
||||
android:singleLine="true"
|
||||
android:duplicateParentState="true" />
|
||||
|
||||
</RelativeLayout>
|
||||
|
||||
<!-- Checkbox, and/or radio button will be inserted here. -->
|
||||
|
||||
</com.actionbarsherlock.internal.view.menu.ListMenuItemView>
|
@ -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">
|
||||
<com.actionbarsherlock.internal.widget.ActionBarContainer
|
||||
android:id="@+id/abs__action_bar_container"
|
||||
android:layout_width="fill_parent"
|
||||
|
@ -22,7 +22,8 @@ the Action Bar enabled overlaying application content.
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:fitsSystemWindows="true">
|
||||
android:fitsSystemWindows="true"
|
||||
android:splitMotionEvents="false">
|
||||
<com.actionbarsherlock.internal.nineoldandroids.widget.NineFrameLayout android:id="@+id/abs__content"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent" />
|
||||
|
@ -40,7 +40,7 @@
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/abs__search_button"
|
||||
style="?android:attr/actionButtonStyle"
|
||||
style="?attr/actionButtonStyle"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_gravity="center_vertical"
|
||||
|
@ -19,7 +19,7 @@
|
||||
-->
|
||||
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@android:id/text1"
|
||||
android:textAppearance="?android:attr/dropDownHintAppearance"
|
||||
android:textAppearance="?attr/dropDownHintAppearance"
|
||||
android:singleLine="true"
|
||||
android:layout_marginLeft="3dip"
|
||||
android:layout_marginTop="3dip"
|
||||
|
@ -32,5 +32,5 @@
|
||||
<dimen name="abs__action_bar_subtitle_bottom_margin">9dip</dimen>
|
||||
|
||||
<!-- Minimum width for an action button in the menu area of an action bar -->
|
||||
<dimen name="action_button_min_width">64dip</dimen>
|
||||
<dimen name="abs__action_button_min_width">64dip</dimen>
|
||||
</resources>
|
||||
|
@ -1,29 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
/* //device/apps/common/assets/res/any/dimens.xml
|
||||
**
|
||||
** Copyright 2006, The Android Open Source Project
|
||||
**
|
||||
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||
** you may not use this file except in compliance with the License.
|
||||
** You may obtain a copy of the License at
|
||||
**
|
||||
** http://www.apache.org/licenses/LICENSE-2.0
|
||||
**
|
||||
** Unless required by applicable law or agreed to in writing, software
|
||||
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
** See the License for the specific language governing permissions and
|
||||
** limitations under the License.
|
||||
*/
|
||||
-->
|
||||
<resources>
|
||||
<!-- The platform's desired minimum size for a dialog's width when it
|
||||
is along the major axis (that is the screen is landscape). This may
|
||||
be either a fraction or a dimension. -->
|
||||
<item type="dimen" name="abs__dialog_min_width_major">55%</item>
|
||||
<!-- The platform's desired minimum size for a dialog's width when it
|
||||
is along the minor axis (that is the screen is portrait). This may
|
||||
be either a fraction or a dimension. -->
|
||||
<item type="dimen" name="abs__dialog_min_width_minor">80%</item>
|
||||
</resources>
|
@ -34,5 +34,5 @@
|
||||
<integer name="abs__max_action_buttons">5</integer>
|
||||
|
||||
<!-- Minimum width for an action button in the menu area of an action bar -->
|
||||
<dimen name="action_button_min_width">64dip</dimen>
|
||||
<dimen name="abs__action_button_min_width">64dip</dimen>
|
||||
</resources>
|
||||
|
@ -26,9 +26,4 @@
|
||||
<item name="android:windowActionBar">false</item>
|
||||
<item name="android:windowNoTitle">true</item>
|
||||
</style>
|
||||
|
||||
<style name="Theme.Sherlock.Dialog" parent="android:Theme.Holo.Dialog">
|
||||
</style>
|
||||
<style name="Theme.Sherlock.Light.Dialog" parent="android:Theme.Holo.Light.Dialog">
|
||||
</style>
|
||||
</resources>
|
||||
|
@ -181,7 +181,7 @@
|
||||
<!-- Drawable used as a background for activated items. -->
|
||||
<attr name="activatedBackgroundIndicator" format="reference" />
|
||||
|
||||
<attr name="android:windowIsFloating" />
|
||||
<attr name="dropDownHintAppearance" format="reference" />
|
||||
</declare-styleable>
|
||||
|
||||
|
||||
|
@ -21,7 +21,4 @@
|
||||
<color name="abs__bright_foreground_holo_light">@color/abs__background_holo_dark</color>
|
||||
<color name="abs__bright_foreground_disabled_holo_dark">#ff4c4c4c</color>
|
||||
<color name="abs__bright_foreground_disabled_holo_light">#ffb2b2b2</color>
|
||||
<color name="abs__bright_foreground_inverse_holo_dark">@color/abs__bright_foreground_holo_light</color>
|
||||
<color name="abs__bright_foreground_inverse_holo_light">@color/abs__bright_foreground_holo_dark</color>
|
||||
<color name="abs__holo_blue_light">#ff33b5e5</color>
|
||||
</resources>
|
||||
|
@ -36,18 +36,6 @@
|
||||
<!-- Minimum width for an action button in the menu area of an action bar -->
|
||||
<dimen name="abs__action_button_min_width">56dip</dimen>
|
||||
|
||||
<!-- Dialog title height -->
|
||||
<dimen name="abs__alert_dialog_title_height">64dip</dimen>
|
||||
|
||||
<!-- The platform's desired minimum size for a dialog's width when it
|
||||
is along the major axis (that is the screen is landscape). This may
|
||||
be either a fraction or a dimension. -->
|
||||
<item type="dimen" name="abs__dialog_min_width_major">65%</item>
|
||||
<!-- The platform's desired minimum size for a dialog's width when it
|
||||
is along the minor axis (that is the screen is portrait). This may
|
||||
be either a fraction or a dimension. -->
|
||||
<item type="dimen" name="abs__dialog_min_width_minor">95%</item>
|
||||
|
||||
|
||||
<!-- Text padding for dropdown items -->
|
||||
<dimen name="abs__dropdownitem_text_padding_left">8dip</dimen>
|
||||
|
@ -29,10 +29,6 @@
|
||||
|
||||
<!-- Title for a button to expand the list of activities in ActivityChooserView [CHAR LIMIT=25] -->
|
||||
<string name="abs__activity_chooser_view_see_all">See all...</string>
|
||||
<!-- Title default for a dialog showing possible activities in ActivityChooserView [CHAR LIMIT=25] -->
|
||||
<string name="abs__activity_chooser_view_dialog_title_default">Select activity</string>
|
||||
<!-- Title for a dialog showing possible activities for sharing in ShareActionProvider [CHAR LIMIT=25] -->
|
||||
<string name="abs__share_action_provider_share_with">Share with...</string>
|
||||
<!-- Description of the shwoing of a popup window with activities to choose from. [CHAR LIMIT=NONE] -->
|
||||
<string name="abs__activitychooserview_choose_application">Choose an application</string>
|
||||
<!-- Description of the choose target button in a ShareActionProvider (share UI). [CHAR LIMIT=NONE] -->
|
||||
|
@ -302,25 +302,6 @@
|
||||
|
||||
|
||||
|
||||
<style name="DialogWindowTitle.Sherlock" parent="Widget">
|
||||
<item name="android:maxLines">1</item>
|
||||
<item name="android:scrollHorizontally">true</item>
|
||||
<item name="android:textAppearance">@style/TextAppearance.Sherlock.DialogWindowTitle</item>
|
||||
<item name="android:minHeight">@dimen/abs__alert_dialog_title_height</item>
|
||||
<item name="android:paddingLeft">16dip</item>
|
||||
<item name="android:paddingRight">16dip</item>
|
||||
</style>
|
||||
<style name="DialogWindowTitle.Sherlock.Light" parent="Widget">
|
||||
<item name="android:maxLines">1</item>
|
||||
<item name="android:scrollHorizontally">true</item>
|
||||
<item name="android:textAppearance">@style/TextAppearance.Sherlock.Light.DialogWindowTitle</item>
|
||||
<item name="android:minHeight">@dimen/abs__alert_dialog_title_height</item>
|
||||
<item name="android:paddingLeft">16dip</item>
|
||||
<item name="android:paddingRight">16dip</item>
|
||||
</style>
|
||||
|
||||
|
||||
|
||||
<style name="TextAppearance.Sherlock.Widget.ActionBar.Menu" parent="Widget">
|
||||
<item name="android:textSize">12sp</item>
|
||||
<item name="android:textStyle">bold</item>
|
||||
@ -387,15 +368,6 @@
|
||||
<item name="android:textStyle">normal</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Sherlock.DialogWindowTitle" parent="Widget">
|
||||
<item name="android:textSize">22sp</item>
|
||||
<item name="android:textColor">@color/abs__holo_blue_light</item>
|
||||
</style>
|
||||
<style name="TextAppearance.Sherlock.Light.DialogWindowTitle" parent="Widget">
|
||||
<item name="android:textSize">22sp</item>
|
||||
<item name="android:textColor">@color/abs__holo_blue_light</item>
|
||||
</style>
|
||||
|
||||
<style name="Sherlock.__TextAppearance.Small" parent="Widget">
|
||||
<item name="android:textSize">14sp</item>
|
||||
<item name="android:textColor">?android:attr/textColorSecondary</item>
|
||||
@ -409,4 +381,32 @@
|
||||
<item name="android:textColor">?textColorPrimary</item>
|
||||
<item name="android:textSize">14sp</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Sherlock" parent="@android:style/TextAppearance"/>
|
||||
|
||||
<style name="TextAppearance.Sherlock.SearchResult">
|
||||
<item name="android:textStyle">normal</item>
|
||||
<item name="android:textColor">?android:attr/textColorPrimary</item>
|
||||
<item name="android:textColorHint">?android:attr/textColorHint</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Sherlock.SearchResult.Title">
|
||||
<item name="android:textSize">18sp</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Sherlock.SearchResult.Subtitle">
|
||||
<item name="android:textSize">14sp</item>
|
||||
<item name="android:textColor">?android:attr/textColorSecondary</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Sherlock.Light.SearchResult" parent="TextAppearance.Sherlock.SearchResult"/>
|
||||
|
||||
<style name="TextAppearance.Sherlock.Light.SearchResult.Title">
|
||||
<item name="android:textSize">18sp</item>
|
||||
</style>
|
||||
|
||||
<style name="TextAppearance.Sherlock.Light.SearchResult.Subtitle">
|
||||
<item name="android:textSize">14sp</item>
|
||||
<item name="android:textColor">?android:attr/textColorSecondary</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
@ -9,8 +9,6 @@
|
||||
</style>
|
||||
<style name="Sherlock.__Theme.DarkActionBar" parent="Theme.Sherlock.Light">
|
||||
</style>
|
||||
<style name="Sherlock.__Theme.Dialog" parent="android:Theme.Dialog">
|
||||
</style>
|
||||
|
||||
<style name="Theme.Sherlock" parent="Sherlock.__Theme">
|
||||
<!-- Action bar styles (from Theme.Holo) -->
|
||||
@ -62,6 +60,8 @@
|
||||
<item name="textAppearanceSmall">@style/TextAppearance.Sherlock.Small</item>
|
||||
<item name="textAppearanceLargePopupMenu">@style/TextAppearance.Sherlock.Widget.PopupMenu.Large</item>
|
||||
<item name="textAppearanceSmallPopupMenu">@style/TextAppearance.Sherlock.Widget.PopupMenu.Small</item>
|
||||
<item name="textAppearanceSearchResultTitle">@style/TextAppearance.Sherlock.SearchResult.Title</item>
|
||||
<item name="textAppearanceSearchResultSubtitle">@style/TextAppearance.Sherlock.SearchResult.Subtitle</item>
|
||||
|
||||
<item name="popupMenuStyle">@style/Widget.Sherlock.PopupMenu</item>
|
||||
<!-- Internal --><item name="listPopupWindowStyle">@style/Widget.Sherlock.ListPopupWindow</item>
|
||||
@ -74,8 +74,12 @@
|
||||
<item name="searchViewGoIcon">@drawable/abs__ic_go</item>
|
||||
<item name="searchViewVoiceIcon">@drawable/abs__ic_voice_search</item>
|
||||
<item name="searchAutoCompleteTextView">@style/Widget.Sherlock.SearchAutoCompleteTextView</item>
|
||||
<item name="android:dropDownHintAppearance">@style/TextAppearance.Sherlock.Widget.DropDownHint</item>
|
||||
<item name="dropDownHintAppearance">@style/TextAppearance.Sherlock.Widget.DropDownHint</item>
|
||||
<item name="searchViewEditQuery">@drawable/abs__ic_commit_search_api_holo_dark</item>
|
||||
<item name="searchViewEditQueryBackground">?selectableItemBackground</item>
|
||||
<item name="searchResultListItemHeight">58dp</item>
|
||||
|
||||
<item name="windowNoTitle">false</item>
|
||||
<item name="windowActionBar">true</item>
|
||||
<item name="windowActionModeOverlay">false</item>
|
||||
<item name="windowContentOverlay">@null</item>
|
||||
@ -130,6 +134,8 @@
|
||||
<item name="textAppearanceSmall">@style/TextAppearance.Sherlock.Light.Small</item>
|
||||
<item name="textAppearanceLargePopupMenu">@style/TextAppearance.Sherlock.Light.Widget.PopupMenu.Large</item>
|
||||
<item name="textAppearanceSmallPopupMenu">@style/TextAppearance.Sherlock.Light.Widget.PopupMenu.Small</item>
|
||||
<item name="textAppearanceSearchResultTitle">@style/TextAppearance.Sherlock.Light.SearchResult.Title</item>
|
||||
<item name="textAppearanceSearchResultSubtitle">@style/TextAppearance.Sherlock.Light.SearchResult.Subtitle</item>
|
||||
|
||||
<item name="popupMenuStyle">@style/Widget.Sherlock.Light.PopupMenu</item>
|
||||
<!-- Internal --><item name="listPopupWindowStyle">@style/Widget.Sherlock.Light.ListPopupWindow</item>
|
||||
@ -142,8 +148,12 @@
|
||||
<item name="searchViewGoIcon">@drawable/abs__ic_go_search_api_holo_light</item>
|
||||
<item name="searchViewVoiceIcon">@drawable/abs__ic_voice_search_api_holo_light</item>
|
||||
<item name="searchAutoCompleteTextView">@style/Widget.Sherlock.Light.SearchAutoCompleteTextView</item>
|
||||
<item name="android:dropDownHintAppearance">@style/TextAppearance.Sherlock.Widget.DropDownHint</item>
|
||||
<item name="dropDownHintAppearance">@style/TextAppearance.Sherlock.Widget.DropDownHint</item>
|
||||
<item name="searchViewEditQuery">@drawable/abs__ic_commit_search_api_holo_light</item>
|
||||
<item name="searchViewEditQueryBackground">?selectableItemBackground</item>
|
||||
<item name="searchResultListItemHeight">58dp</item>
|
||||
|
||||
<item name="windowNoTitle">false</item>
|
||||
<item name="windowActionBar">true</item>
|
||||
<item name="windowActionModeOverlay">false</item>
|
||||
<item name="windowContentOverlay">@null</item>
|
||||
@ -171,6 +181,18 @@
|
||||
<item name="actionModePopupWindowStyle">@style/Widget.Sherlock.PopupWindow.ActionMode</item>
|
||||
|
||||
<item name="actionModeShareDrawable">@drawable/abs__ic_menu_share_holo_dark</item>
|
||||
|
||||
<!-- We want the dark action bar SearchView stuff -->
|
||||
<item name="searchDropdownBackground">@drawable/abs__search_dropdown_dark</item>
|
||||
<item name="searchViewTextField">@drawable/abs__textfield_searchview_holo_dark</item>
|
||||
<item name="searchViewTextFieldRight">@drawable/abs__textfield_searchview_right_holo_dark</item>
|
||||
<item name="searchViewCloseIcon">@drawable/abs__ic_clear</item>
|
||||
<item name="searchViewSearchIcon">@drawable/abs__ic_search</item>
|
||||
<item name="searchViewGoIcon">@drawable/abs__ic_go</item>
|
||||
<item name="searchViewVoiceIcon">@drawable/abs__ic_voice_search</item>
|
||||
<item name="searchAutoCompleteTextView">@style/Widget.Sherlock.SearchAutoCompleteTextView</item>
|
||||
<item name="dropDownHintAppearance">@style/TextAppearance.Sherlock.Widget.DropDownHint</item>
|
||||
<item name="searchViewEditQuery">@drawable/abs__ic_commit_search_api_holo_dark</item>
|
||||
</style>
|
||||
|
||||
|
||||
@ -182,58 +204,4 @@
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowNoTitle">true</item>
|
||||
</style>
|
||||
|
||||
|
||||
<style name="Theme.Sherlock.Dialog" parent="android:Theme">
|
||||
<item name="android:windowFrame">@null</item>
|
||||
<item name="android:windowTitleStyle">@style/DialogWindowTitle.Sherlock</item>
|
||||
<item name="android:windowBackground">@drawable/abs__dialog_full_holo_dark</item>
|
||||
<item name="android:windowIsFloating">true</item>
|
||||
<item name="android:windowContentOverlay">@null</item>
|
||||
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
|
||||
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
|
||||
|
||||
<item name="android:windowActionBar">false</item>
|
||||
<item name="android:windowActionModeOverlay">true</item>
|
||||
<item name="android:windowCloseOnTouchOutside">true</item>
|
||||
<item name="android:windowNoTitle">true</item>
|
||||
<item name="android:backgroundDimAmount">0.6</item>
|
||||
|
||||
<item name="android:colorBackgroundCacheHint">@null</item>
|
||||
|
||||
<item name="android:textColorPrimary">@color/abs__primary_text_holo_dark</item>
|
||||
<item name="android:textColorPrimaryInverse">@color/abs__primary_text_holo_light</item>
|
||||
|
||||
<item name="windowMinWidthMajor">@dimen/abs__dialog_min_width_major</item>
|
||||
<item name="windowMinWidthMinor">@dimen/abs__dialog_min_width_minor</item>
|
||||
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowContentOverlay">@null</item>
|
||||
</style>
|
||||
<style name="Theme.Sherlock.Light.Dialog" parent="android:Theme.Light">
|
||||
<item name="android:windowFrame">@null</item>
|
||||
<item name="android:windowTitleStyle">@style/DialogWindowTitle.Sherlock.Light</item>
|
||||
<item name="android:windowBackground">@drawable/abs__dialog_full_holo_light</item>
|
||||
<item name="android:windowIsFloating">true</item>
|
||||
<item name="android:windowContentOverlay">@null</item>
|
||||
<item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
|
||||
<item name="android:windowSoftInputMode">stateUnspecified|adjustPan</item>
|
||||
|
||||
<item name="android:windowActionBar">false</item>
|
||||
<item name="android:windowActionModeOverlay">true</item>
|
||||
<item name="android:windowCloseOnTouchOutside">true</item>
|
||||
<item name="android:windowNoTitle">true</item>
|
||||
<item name="android:backgroundDimAmount">0.6</item>
|
||||
|
||||
<item name="android:colorBackgroundCacheHint">@null</item>
|
||||
|
||||
<item name="android:textColorPrimary">@color/abs__primary_text_holo_light</item>
|
||||
<item name="android:textColorPrimaryInverse">@color/abs__primary_text_holo_dark</item>
|
||||
|
||||
<item name="windowMinWidthMajor">@dimen/abs__dialog_min_width_major</item>
|
||||
<item name="windowMinWidthMinor">@dimen/abs__dialog_min_width_minor</item>
|
||||
|
||||
<item name="windowActionBar">false</item>
|
||||
<item name="windowContentOverlay">@null</item>
|
||||
</style>
|
||||
</resources>
|
||||
|
@ -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)) {
|
||||
|
@ -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;
|
||||
|
||||
/**
|
||||
* <p>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<Implementation, Class<? extends ActionBarSherlock>> 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() {}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
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,17 +908,6 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
|
||||
}
|
||||
}
|
||||
|
||||
mTitleView = (TextView)mDecor.findViewById(android.R.id.title);
|
||||
if (mTitleView != null) {
|
||||
if (hasFeature(Window.FEATURE_NO_TITLE)) {
|
||||
mTitleView.setVisibility(View.GONE);
|
||||
if (mContentParent instanceof FrameLayout) {
|
||||
((FrameLayout)mContentParent).setForeground(null);
|
||||
}
|
||||
} else {
|
||||
mTitleView.setText(mTitle);
|
||||
}
|
||||
} else {
|
||||
wActionBar = (ActionBarView)mDecor.findViewById(R.id.abs__action_bar);
|
||||
if (wActionBar != null) {
|
||||
wActionBar.setWindowCallback(this);
|
||||
@ -988,17 +964,14 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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,26 +995,18 @@ 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;
|
||||
} else {
|
||||
if (hasFeature(Window.FEATURE_ACTION_BAR_OVERLAY)) {
|
||||
layoutResource = R.layout.abs__screen_action_bar_overlay;
|
||||
} else {
|
||||
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;
|
||||
} else {
|
||||
layoutResource = R.layout.abs__screen_simple;
|
||||
}
|
||||
|
||||
if (DEBUG) Log.d(TAG, "[generateLayout] using screen XML " + mActivity.getResources().getString(layoutResource));
|
||||
if (ActionBarSherlock.DEBUG) Log.d(TAG, "[generateLayout] using screen XML " + mActivity.getResources().getString(layoutResource));
|
||||
View in = mActivity.getLayoutInflater().inflate(layoutResource, null);
|
||||
mDecor.addView(in, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
|
||||
|
||||
@ -1086,7 +1051,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
|
||||
int uiOptions = 0;
|
||||
try {
|
||||
final String thisPackage = activity.getClass().getName();
|
||||
if (DEBUG) Log.i(TAG, "Parsing AndroidManifest.xml for " + thisPackage);
|
||||
if (ActionBarSherlock.DEBUG) Log.i(TAG, "Parsing AndroidManifest.xml for " + thisPackage);
|
||||
|
||||
final String packageName = activity.getApplicationInfo().packageName;
|
||||
final AssetManager am = activity.createPackageContext(packageName, 0).getAssets();
|
||||
@ -1099,10 +1064,10 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
|
||||
|
||||
if ("application".equals(name)) {
|
||||
//Check if the <application> has the attribute
|
||||
if (DEBUG) Log.d(TAG, "Got <application>");
|
||||
if (ActionBarSherlock.DEBUG) Log.d(TAG, "Got <application>");
|
||||
|
||||
for (int i = xml.getAttributeCount() - 1; i >= 0; i--) {
|
||||
if (DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i));
|
||||
if (ActionBarSherlock.DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i));
|
||||
|
||||
if ("uiOptions".equals(xml.getAttributeName(i))) {
|
||||
uiOptions = xml.getAttributeIntValue(i, 0);
|
||||
@ -1111,13 +1076,13 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
|
||||
}
|
||||
} else if ("activity".equals(name)) {
|
||||
//Check if the <activity> is us and has the attribute
|
||||
if (DEBUG) Log.d(TAG, "Got <activity>");
|
||||
if (ActionBarSherlock.DEBUG) Log.d(TAG, "Got <activity>");
|
||||
Integer activityUiOptions = null;
|
||||
String activityPackage = null;
|
||||
boolean isOurActivity = false;
|
||||
|
||||
for (int i = xml.getAttributeCount() - 1; i >= 0; i--) {
|
||||
if (DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i));
|
||||
if (ActionBarSherlock.DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i));
|
||||
|
||||
//We need both uiOptions and name attributes
|
||||
String attrName = xml.getAttributeName(i);
|
||||
@ -1149,7 +1114,7 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (DEBUG) Log.i(TAG, "Returning " + Integer.toHexString(uiOptions));
|
||||
if (ActionBarSherlock.DEBUG) Log.i(TAG, "Returning " + Integer.toHexString(uiOptions));
|
||||
return uiOptions;
|
||||
}
|
||||
|
||||
@ -1200,4 +1165,13 @@ public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBu
|
||||
mActionMode = null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ensureActionBar() {
|
||||
if (ActionBarSherlock.DEBUG) Log.d(TAG, "[ensureActionBar]");
|
||||
|
||||
if (mDecor == null) {
|
||||
initActionBar();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -1,11 +1,19 @@
|
||||
package com.actionbarsherlock.internal;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.res.AssetManager;
|
||||
import android.content.res.XmlResourceParser;
|
||||
import android.os.Build;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.util.Log;
|
||||
import com.actionbarsherlock.ActionBarSherlock;
|
||||
import com.actionbarsherlock.R;
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
|
||||
public final class ResourcesCompat {
|
||||
private static final String TAG = "ResourcesCompat";
|
||||
|
||||
//No instances
|
||||
private ResourcesCompat() {}
|
||||
|
||||
@ -15,14 +23,14 @@ public final class ResourcesCompat {
|
||||
* can use to simulate filtering based on width and smallest width
|
||||
* qualifiers on pre-3.2.
|
||||
*
|
||||
* @param context Context to load booleans from on 3.2+ and to fetch the
|
||||
* @param context Context to load booleans from on 4.0+ and to fetch the
|
||||
* display metrics.
|
||||
* @param id Id of boolean to load.
|
||||
* @return Associated boolean value as reflected by the current display
|
||||
* metrics.
|
||||
*/
|
||||
public static boolean getResources_getBoolean(Context context, int id) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
|
||||
return context.getResources().getBoolean(id);
|
||||
}
|
||||
|
||||
@ -92,4 +100,83 @@ public final class ResourcesCompat {
|
||||
|
||||
throw new IllegalArgumentException("Unknown integer resource ID " + id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to programmatically load the logo from the manifest file of an
|
||||
* activity by using an XML pull parser. This should allow us to read the
|
||||
* logo attribute regardless of the platform it is being run on.
|
||||
*
|
||||
* @param activity Activity instance.
|
||||
* @return Logo resource ID.
|
||||
*/
|
||||
public static int loadLogoFromManifest(Activity activity) {
|
||||
int logo = 0;
|
||||
try {
|
||||
final String thisPackage = activity.getClass().getName();
|
||||
if (ActionBarSherlock.DEBUG) Log.i(TAG, "Parsing AndroidManifest.xml for " + thisPackage);
|
||||
|
||||
final String packageName = activity.getApplicationInfo().packageName;
|
||||
final AssetManager am = activity.createPackageContext(packageName, 0).getAssets();
|
||||
final XmlResourceParser xml = am.openXmlResourceParser("AndroidManifest.xml");
|
||||
|
||||
int eventType = xml.getEventType();
|
||||
while (eventType != XmlPullParser.END_DOCUMENT) {
|
||||
if (eventType == XmlPullParser.START_TAG) {
|
||||
String name = xml.getName();
|
||||
|
||||
if ("application".equals(name)) {
|
||||
//Check if the <application> has the attribute
|
||||
if (ActionBarSherlock.DEBUG) Log.d(TAG, "Got <application>");
|
||||
|
||||
for (int i = xml.getAttributeCount() - 1; i >= 0; i--) {
|
||||
if (ActionBarSherlock.DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i));
|
||||
|
||||
if ("logo".equals(xml.getAttributeName(i))) {
|
||||
logo = xml.getAttributeResourceValue(i, 0);
|
||||
break; //out of for loop
|
||||
}
|
||||
}
|
||||
} else if ("activity".equals(name)) {
|
||||
//Check if the <activity> is us and has the attribute
|
||||
if (ActionBarSherlock.DEBUG) Log.d(TAG, "Got <activity>");
|
||||
Integer activityLogo = null;
|
||||
String activityPackage = null;
|
||||
boolean isOurActivity = false;
|
||||
|
||||
for (int i = xml.getAttributeCount() - 1; i >= 0; i--) {
|
||||
if (ActionBarSherlock.DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i));
|
||||
|
||||
//We need both uiOptions and name attributes
|
||||
String attrName = xml.getAttributeName(i);
|
||||
if ("logo".equals(attrName)) {
|
||||
activityLogo = xml.getAttributeResourceValue(i, 0);
|
||||
} else if ("name".equals(attrName)) {
|
||||
activityPackage = ActionBarSherlockCompat.cleanActivityName(packageName, xml.getAttributeValue(i));
|
||||
if (!thisPackage.equals(activityPackage)) {
|
||||
break; //on to the next
|
||||
}
|
||||
isOurActivity = true;
|
||||
}
|
||||
|
||||
//Make sure we have both attributes before processing
|
||||
if ((activityLogo != null) && (activityPackage != null)) {
|
||||
//Our activity, logo specified, override with our value
|
||||
logo = activityLogo.intValue();
|
||||
}
|
||||
}
|
||||
if (isOurActivity) {
|
||||
//If we matched our activity but it had no logo don't
|
||||
//do any more processing of the manifest
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
eventType = xml.nextToken();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (ActionBarSherlock.DEBUG) Log.i(TAG, "Returning " + Integer.toHexString(logo));
|
||||
return logo;
|
||||
}
|
||||
}
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -582,6 +582,7 @@ public class ValueAnimator extends Animator {
|
||||
* active animations to process.
|
||||
*/
|
||||
@Override
|
||||
@SuppressWarnings("fallthrough")
|
||||
public void handleMessage(Message msg) {
|
||||
boolean callAgain = true;
|
||||
ArrayList<ValueAnimator> animations = sAnimations.get();
|
||||
|
@ -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,
|
||||
|
@ -31,6 +31,7 @@ import android.content.pm.ResolveInfo;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Build;
|
||||
import android.os.Bundle;
|
||||
import android.os.Parcelable;
|
||||
import android.util.SparseArray;
|
||||
@ -353,6 +354,11 @@ public class MenuBuilder implements Menu {
|
||||
SparseArray<Parcelable> viewStates = states.getSparseParcelableArray(
|
||||
getActionViewStatesKey());
|
||||
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB && viewStates == null) {
|
||||
//Fixes Issue #652 with sdk <= 2.3.6
|
||||
return;
|
||||
}
|
||||
|
||||
final int itemCount = size();
|
||||
for (int i = 0; i < itemCount; i++) {
|
||||
final MenuItem item = getItem(i);
|
||||
|
@ -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);
|
||||
// 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,12 +151,12 @@ 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);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isShowing() {
|
||||
return mPopup != null && mPopup.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
|
||||
|
@ -94,11 +94,18 @@ public class MenuWrapper implements Menu {
|
||||
|
||||
@Override
|
||||
public void removeItem(int id) {
|
||||
mNativeMap.remove(mNativeMenu.findItem(id));
|
||||
mNativeMenu.removeItem(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeGroup(int groupId) {
|
||||
for (int i = 0; i < mNativeMenu.size(); i++) {
|
||||
final android.view.MenuItem item = mNativeMenu.getItem(i);
|
||||
if (item.getGroupId() == groupId) {
|
||||
mNativeMap.remove(item);
|
||||
}
|
||||
}
|
||||
mNativeMenu.removeGroup(groupId);
|
||||
}
|
||||
|
||||
@ -108,6 +115,20 @@ public class MenuWrapper implements Menu {
|
||||
mNativeMenu.clear();
|
||||
}
|
||||
|
||||
public void invalidate() {
|
||||
if (mNativeMap.isEmpty()) return;
|
||||
|
||||
final WeakHashMap<android.view.MenuItem, MenuItem> menuMapCopy = new WeakHashMap<android.view.MenuItem, MenuItem>(mNativeMap.size());
|
||||
|
||||
for (int i = 0; i < mNativeMenu.size(); i++) {
|
||||
final android.view.MenuItem item = mNativeMenu.getItem(i);
|
||||
menuMapCopy.put(item, mNativeMap.get(item));
|
||||
}
|
||||
|
||||
mNativeMap.clear();
|
||||
mNativeMap.putAll(menuMapCopy);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setGroupCheckable(int group, boolean checkable, boolean exclusive) {
|
||||
mNativeMenu.setGroupCheckable(group, checkable, exclusive);
|
||||
|
@ -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) {
|
||||
|
@ -16,16 +16,14 @@
|
||||
|
||||
package com.actionbarsherlock.internal.widget;
|
||||
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
import com.actionbarsherlock.internal.ResourcesCompat;
|
||||
import android.app.Activity;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.PackageManager.NameNotFoundException;
|
||||
import android.content.res.AssetManager;
|
||||
import android.content.res.Configuration;
|
||||
import android.content.res.TypedArray;
|
||||
import android.content.res.XmlResourceParser;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Build;
|
||||
import android.os.Parcel;
|
||||
@ -49,7 +47,6 @@ import android.widget.TextView;
|
||||
import com.actionbarsherlock.R;
|
||||
import com.actionbarsherlock.app.ActionBar;
|
||||
import com.actionbarsherlock.app.ActionBar.OnNavigationListener;
|
||||
import com.actionbarsherlock.internal.ActionBarSherlockCompat;
|
||||
import com.actionbarsherlock.internal.view.menu.ActionMenuItem;
|
||||
import com.actionbarsherlock.internal.view.menu.ActionMenuPresenter;
|
||||
import com.actionbarsherlock.internal.view.menu.ActionMenuView;
|
||||
@ -70,7 +67,6 @@ import static com.actionbarsherlock.internal.ResourcesCompat.getResources_getBoo
|
||||
*/
|
||||
public class ActionBarView extends AbsActionBarView {
|
||||
private static final String TAG = "ActionBarView";
|
||||
private static final boolean DEBUG = false;
|
||||
|
||||
/**
|
||||
* Display options applied by default
|
||||
@ -190,7 +186,7 @@ public class ActionBarView extends AbsActionBarView {
|
||||
if (context instanceof Activity) {
|
||||
//Even though native methods existed in API 9 and 10 they don't work
|
||||
//so just parse the manifest to look for the logo pre-Honeycomb
|
||||
final int resId = loadLogoFromManifest((Activity) context);
|
||||
final int resId = ResourcesCompat.loadLogoFromManifest((Activity) context);
|
||||
if (resId != 0) {
|
||||
mLogo = context.getResources().getDrawable(resId);
|
||||
}
|
||||
@ -265,85 +261,6 @@ public class ActionBarView extends AbsActionBarView {
|
||||
mHomeLayout.setFocusable(true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to programmatically load the logo from the manifest file of an
|
||||
* activity by using an XML pull parser. This should allow us to read the
|
||||
* logo attribute regardless of the platform it is being run on.
|
||||
*
|
||||
* @param activity Activity instance.
|
||||
* @return Logo resource ID.
|
||||
*/
|
||||
private static int loadLogoFromManifest(Activity activity) {
|
||||
int logo = 0;
|
||||
try {
|
||||
final String thisPackage = activity.getClass().getName();
|
||||
if (DEBUG) Log.i(TAG, "Parsing AndroidManifest.xml for " + thisPackage);
|
||||
|
||||
final String packageName = activity.getApplicationInfo().packageName;
|
||||
final AssetManager am = activity.createPackageContext(packageName, 0).getAssets();
|
||||
final XmlResourceParser xml = am.openXmlResourceParser("AndroidManifest.xml");
|
||||
|
||||
int eventType = xml.getEventType();
|
||||
while (eventType != XmlPullParser.END_DOCUMENT) {
|
||||
if (eventType == XmlPullParser.START_TAG) {
|
||||
String name = xml.getName();
|
||||
|
||||
if ("application".equals(name)) {
|
||||
//Check if the <application> has the attribute
|
||||
if (DEBUG) Log.d(TAG, "Got <application>");
|
||||
|
||||
for (int i = xml.getAttributeCount() - 1; i >= 0; i--) {
|
||||
if (DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i));
|
||||
|
||||
if ("logo".equals(xml.getAttributeName(i))) {
|
||||
logo = xml.getAttributeResourceValue(i, 0);
|
||||
break; //out of for loop
|
||||
}
|
||||
}
|
||||
} else if ("activity".equals(name)) {
|
||||
//Check if the <activity> is us and has the attribute
|
||||
if (DEBUG) Log.d(TAG, "Got <activity>");
|
||||
Integer activityLogo = null;
|
||||
String activityPackage = null;
|
||||
boolean isOurActivity = false;
|
||||
|
||||
for (int i = xml.getAttributeCount() - 1; i >= 0; i--) {
|
||||
if (DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i));
|
||||
|
||||
//We need both uiOptions and name attributes
|
||||
String attrName = xml.getAttributeName(i);
|
||||
if ("logo".equals(attrName)) {
|
||||
activityLogo = xml.getAttributeResourceValue(i, 0);
|
||||
} else if ("name".equals(attrName)) {
|
||||
activityPackage = ActionBarSherlockCompat.cleanActivityName(packageName, xml.getAttributeValue(i));
|
||||
if (!thisPackage.equals(activityPackage)) {
|
||||
break; //on to the next
|
||||
}
|
||||
isOurActivity = true;
|
||||
}
|
||||
|
||||
//Make sure we have both attributes before processing
|
||||
if ((activityLogo != null) && (activityPackage != null)) {
|
||||
//Our activity, logo specified, override with our value
|
||||
logo = activityLogo.intValue();
|
||||
}
|
||||
}
|
||||
if (isOurActivity) {
|
||||
//If we matched our activity but it had no logo don't
|
||||
//do any more processing of the manifest
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
eventType = xml.nextToken();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
if (DEBUG) Log.i(TAG, "Returning " + Integer.toHexString(logo));
|
||||
return logo;
|
||||
}
|
||||
|
||||
/*
|
||||
* Must be public so we can dispatch pre-2.2 via ActionBarImpl.
|
||||
*/
|
||||
|
@ -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) {
|
||||
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());
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,178 @@
|
||||
|
||||
package com.actionbarsherlock.internal.widget;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.view.ViewTreeObserver;
|
||||
import android.view.ViewTreeObserver.OnScrollChangedListener;
|
||||
import android.widget.PopupWindow;
|
||||
|
||||
/**
|
||||
* Works around bugs in the handling of {@link ViewTreeObserver} by
|
||||
* {@link PopupWindow}.
|
||||
* <p>
|
||||
* <code>PopupWindow</code> registers an {@link OnScrollChangedListener} with
|
||||
* {@link ViewTreeObserver}, but does not keep a reference to the observer
|
||||
* instance that it has registers on. This is problematic when the anchor view
|
||||
* used by <code>PopupWindow</code> to access the observer is detached from the
|
||||
* window, as it will revert from the shared <code>ViewTreeObserver</code> owned
|
||||
* by the <code>ViewRoot</code> to a floating one, meaning
|
||||
* <code>PopupWindow</code> cannot unregister it's listener anymore and has
|
||||
* leaked it into the global observer.
|
||||
* <p>
|
||||
* This class works around this issue by
|
||||
* <ul>
|
||||
* <li>replacing <code>PopupWindow.mOnScrollChangedListener</code> with a no-op
|
||||
* listener so that any registration or unregistration performed by
|
||||
* <code>PopupWindow</code> itself has no effect and causes no leaks.
|
||||
* <li>registering the real listener only with the shared
|
||||
* <code>ViewTreeObserver</code> and keeping a reference to it to facilitate
|
||||
* correct unregistration. The reason for not registering on a floating observer
|
||||
* (before a view is attached) is that there is no safe way to get a reference
|
||||
* to the shared observer that the floating one will be merged into. This would
|
||||
* again cause the listener to leak.
|
||||
* </ul>
|
||||
*/
|
||||
public class PopupWindowCompat extends PopupWindow {
|
||||
|
||||
private static final Field superListenerField;
|
||||
static {
|
||||
Field f = null;
|
||||
try {
|
||||
f = PopupWindow.class.getDeclaredField("mOnScrollChangedListener");
|
||||
f.setAccessible(true);
|
||||
} catch (NoSuchFieldException e) {
|
||||
/* ignored */
|
||||
}
|
||||
superListenerField = f;
|
||||
}
|
||||
|
||||
private static final OnScrollChangedListener NOP = new OnScrollChangedListener() {
|
||||
@Override
|
||||
public void onScrollChanged() {
|
||||
/* do nothing */
|
||||
}
|
||||
};
|
||||
|
||||
private OnScrollChangedListener mSuperScrollListener;
|
||||
private ViewTreeObserver mViewTreeObserver;
|
||||
|
||||
public PopupWindowCompat() {
|
||||
super();
|
||||
init();
|
||||
}
|
||||
|
||||
public PopupWindowCompat(Context context) {
|
||||
super(context);
|
||||
init();
|
||||
}
|
||||
|
||||
public PopupWindowCompat(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
init();
|
||||
}
|
||||
|
||||
public PopupWindowCompat(Context context, AttributeSet attrs, int defStyle) {
|
||||
super(context, attrs, defStyle);
|
||||
init();
|
||||
}
|
||||
|
||||
// @TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||
public PopupWindowCompat(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
||||
super(context, attrs, defStyleAttr, defStyleRes);
|
||||
init();
|
||||
}
|
||||
|
||||
public PopupWindowCompat(int width, int height) {
|
||||
super(width, height);
|
||||
init();
|
||||
}
|
||||
|
||||
public PopupWindowCompat(View contentView) {
|
||||
super(contentView);
|
||||
init();
|
||||
}
|
||||
|
||||
public PopupWindowCompat(View contentView, int width, int height, boolean focusable) {
|
||||
super(contentView, width, height, focusable);
|
||||
init();
|
||||
}
|
||||
|
||||
public PopupWindowCompat(View contentView, int width, int height) {
|
||||
super(contentView, width, height);
|
||||
init();
|
||||
}
|
||||
|
||||
private void init() {
|
||||
if (superListenerField != null) {
|
||||
try {
|
||||
mSuperScrollListener = (OnScrollChangedListener) superListenerField.get(this);
|
||||
superListenerField.set(this, NOP);
|
||||
} catch (Exception e) {
|
||||
mSuperScrollListener = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void unregisterListener() {
|
||||
// Don't do anything if we haven't managed to patch the super listener
|
||||
if (mSuperScrollListener != null && mViewTreeObserver != null) {
|
||||
if (mViewTreeObserver.isAlive()) {
|
||||
mViewTreeObserver.removeOnScrollChangedListener(mSuperScrollListener);
|
||||
}
|
||||
mViewTreeObserver = null;
|
||||
}
|
||||
}
|
||||
|
||||
private void registerListener(View anchor) {
|
||||
// Don't do anything if we haven't managed to patch the super listener.
|
||||
// And don't bother attaching the listener if the anchor view isn't
|
||||
// attached. This means we'll only have to deal with the real VTO owned
|
||||
// by the ViewRoot.
|
||||
if (mSuperScrollListener != null) {
|
||||
ViewTreeObserver vto = (anchor.getWindowToken() != null) ? anchor.getViewTreeObserver()
|
||||
: null;
|
||||
if (vto != mViewTreeObserver) {
|
||||
if (mViewTreeObserver != null && mViewTreeObserver.isAlive()) {
|
||||
mViewTreeObserver.removeOnScrollChangedListener(mSuperScrollListener);
|
||||
}
|
||||
if ((mViewTreeObserver = vto) != null) {
|
||||
vto.addOnScrollChangedListener(mSuperScrollListener);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showAsDropDown(View anchor, int xoff, int yoff) {
|
||||
super.showAsDropDown(anchor, xoff, yoff);
|
||||
registerListener(anchor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(View anchor, int xoff, int yoff, int width, int height) {
|
||||
super.update(anchor, xoff, yoff, width, height);
|
||||
registerListener(anchor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(View anchor, int width, int height) {
|
||||
super.update(anchor, width, height);
|
||||
registerListener(anchor);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showAtLocation(View parent, int gravity, int x, int y) {
|
||||
super.showAtLocation(parent, gravity, x, y);
|
||||
unregisterListener();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dismiss() {
|
||||
super.dismiss();
|
||||
unregisterListener();
|
||||
}
|
||||
}
|
@ -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(
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
@ -395,7 +395,11 @@ class ActivityChooserView extends ViewGroup implements ActivityChooserModelClien
|
||||
super.onAttachedToWindow();
|
||||
ActivityChooserModel dataModel = mAdapter.getDataModel();
|
||||
if (dataModel != null) {
|
||||
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()) {
|
||||
try {
|
||||
dataModel.registerObserver(mModelDataSetOberver);
|
||||
} catch (IllegalStateException e) {
|
||||
// Related to #557.
|
||||
}
|
||||
}
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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<String, Drawable.ConstantState> 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<String, Drawable.ConstantState> outsideDrawablesCache) {
|
||||
SearchableInfo searchable, WeakHashMap<String, Drawable.ConstantState> 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
|
||||
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() {
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
@ -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");
|
||||
}
|
||||
}
|