From 983ca1562f960d3d6aab0e4a2c35d7cba9ded37f Mon Sep 17 00:00:00 2001 From: prabathabey Date: Fri, 5 Dec 2014 13:26:42 +0530 Subject: [PATCH 1/8] Introducing DeviceIdentifier bean wrapping id and the type of a particular device. This includes other formatting related improvments too brought up during the code reviews --- .../device/mgt/common/DeviceIdentifier.java | 40 +++++++++++++++++++ .../mgt/common/spi/DeviceManagerService.java | 29 +++++++------- .../mgt/core/DeviceManagementRepository.java | 22 ++++++++++ 3 files changed, 76 insertions(+), 15 deletions(-) create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceIdentifier.java create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/DeviceManagementRepository.java diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceIdentifier.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceIdentifier.java new file mode 100644 index 0000000000..e9f7ca5110 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/DeviceIdentifier.java @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.wso2.carbon.device.mgt.common; + +public class DeviceIdentifier { + + private String type; + + private String id; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + +} diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/spi/DeviceManagerService.java b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/spi/DeviceManagerService.java index c64c0ad0f5..50ccacfc9e 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/spi/DeviceManagerService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.common/src/main/java/org/wso2/carbon/device/mgt/common/spi/DeviceManagerService.java @@ -16,6 +16,7 @@ package org.wso2.carbon.device.mgt.common.spi; import org.wso2.carbon.device.mgt.common.Device; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.DeviceManagementException; import java.util.List; @@ -31,6 +32,7 @@ public interface DeviceManagerService { * @return Returns provider type */ String getProviderType(); + /** * Method to enrolling a particular device of type mobile, IoT, etc within CDM. * @@ -51,31 +53,28 @@ public interface DeviceManagerService { /** * Method to disenroll a particular device from CDM. * - * @param type Device Type - * @param deviceId Device Identifier - * @throws DeviceManagementException + * @param deviceId Fully qualified device identifier + * @throws DeviceManagementException If some unusual behaviour is observed while disenrolling a device */ - void disEnrollDevice(String type, String deviceId) throws DeviceManagementException; + void disenrollDevice(DeviceIdentifier deviceId) throws DeviceManagementException; /** * Method to retrieve the status of the registration process of a particular device. * - * @param type Device Type - * @param deviceId Device Identifier + * @param deviceId Fully qualified device identifier * @return Status of enrollment * @throws DeviceManagementException If some unusual behaviour is observed while enrolling a device */ - boolean isRegistered(String type, String deviceId) throws DeviceManagementException; + boolean isRegistered(DeviceIdentifier deviceId) throws DeviceManagementException; /** * Method to retrieve the status of a particular device. * - * @param type Device Type - * @param deviceId Device Identifier + * @param deviceId Fully qualified device identifier * @return Returns if the device is active * @throws DeviceManagementException If some unusual behaviour is observed while enrolling a device */ - boolean isActive(String type, String deviceId) throws DeviceManagementException; + boolean isActive(DeviceIdentifier deviceId) throws DeviceManagementException; /** * Method to set the status indicating whether a particular device registered within CDM is enabled at a given @@ -92,24 +91,24 @@ public interface DeviceManagerService { * @param type Device Type * @return List of metadata corresponding to all devices registered within CDM */ - List getAllDeviceInfo(String type) throws DeviceManagementException; + List getAllDevices(String type) throws DeviceManagementException; /** * Method to retrieve metadata of a device corresponding to a particular type that carries a specific identifier. * - * @param type Device Type - * @param deviceId Device Identifier + * @param deviceId Fully qualified device identifier * @return Metadata corresponding to a particular device * @throws DeviceManagementException If some unusual behaviour is observed while enrolling a device */ - Device getDeviceInfo(String type, String deviceId) throws DeviceManagementException; + Device getDevice(DeviceIdentifier deviceId) throws DeviceManagementException; /** * Method to set the ownership type of a particular device. i.e. BYOD, COPE * + * @param deviceId Fully qualified device identifier * @param ownershipType Type of ownership * @throws DeviceManagementException If some unusual behaviour is observed while enrolling a device */ - void setOwnership(String ownershipType) throws DeviceManagementException; + void setOwnership(DeviceIdentifier deviceId, String ownershipType) throws DeviceManagementException; } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/DeviceManagementRepository.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/DeviceManagementRepository.java new file mode 100644 index 0000000000..fb7e0a32e9 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/main/java/org/wso2/carbon/device/mgt/core/DeviceManagementRepository.java @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.wso2.carbon.device.mgt.core; + +public class DeviceManagementRepository { + + + +} From ef95ac4621dd98aafc97b8ba74242e8d6869ed83 Mon Sep 17 00:00:00 2001 From: prabathabey Date: Fri, 5 Dec 2014 13:28:32 +0530 Subject: [PATCH 2/8] Making all the implementations of DeviceManagerService interface compatible with the changes introduced into the same --- .../android/AndroidDeviceManagerService.java | 56 +++++++++---------- .../impl/ios/IOSDeviceManagerService.java | 56 +++++++++---------- .../windows/WindowsDeviceManagerService.java | 56 +++++++++---------- 3 files changed, 81 insertions(+), 87 deletions(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/android/AndroidDeviceManagerService.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/android/AndroidDeviceManagerService.java index aa10e18869..754a0a1bba 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/android/AndroidDeviceManagerService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/android/AndroidDeviceManagerService.java @@ -17,6 +17,7 @@ package org.wso2.carbon.device.mgt.mobile.impl.android; import org.wso2.carbon.device.mgt.common.Device; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.DeviceManagementException; import org.wso2.carbon.device.mgt.common.spi.DeviceManagerService; @@ -44,42 +45,39 @@ public class AndroidDeviceManagerService implements DeviceManagerService { } - @Override - public void disEnrollDevice(String type, String deviceId) - throws DeviceManagementException { + @Override + public void disenrollDevice(DeviceIdentifier deviceId) throws DeviceManagementException { - } + } - @Override - public boolean isRegistered(String type, String deviceId) - throws DeviceManagementException { - return false; - } + @Override + public boolean isRegistered(DeviceIdentifier deviceId) throws DeviceManagementException { + return false; + } - @Override - public boolean isActive(String type, String deviceId) - throws DeviceManagementException { - return false; - } + @Override + public boolean isActive(DeviceIdentifier deviceId) throws DeviceManagementException { + return false; + } - @Override - public void setActive(boolean status) throws DeviceManagementException { + @Override + public void setActive(boolean status) throws DeviceManagementException { - } + } - @Override - public List getAllDeviceInfo(String type) throws DeviceManagementException { - return null; - } + @Override + public List getAllDevices(String type) throws DeviceManagementException { + return null; + } - @Override - public Device getDeviceInfo(String type, String deviceId) - throws DeviceManagementException { - return null; - } + @Override + public Device getDevice(DeviceIdentifier deviceId) throws DeviceManagementException { + return null; + } - @Override - public void setOwnership(String ownershipType) throws DeviceManagementException { + @Override + public void setOwnership(DeviceIdentifier deviceId, String ownershipType) throws DeviceManagementException { + + } - } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/ios/IOSDeviceManagerService.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/ios/IOSDeviceManagerService.java index cf174c5cf2..7f2226d713 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/ios/IOSDeviceManagerService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/ios/IOSDeviceManagerService.java @@ -17,6 +17,7 @@ package org.wso2.carbon.device.mgt.mobile.impl.ios; import org.wso2.carbon.device.mgt.common.Device; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.DeviceManagementException; import org.wso2.carbon.device.mgt.common.spi.DeviceManagerService; @@ -44,42 +45,39 @@ public class IOSDeviceManagerService implements DeviceManagerService { } - @Override - public void disEnrollDevice(String type, String deviceId) - throws DeviceManagementException { + @Override + public void disenrollDevice(DeviceIdentifier deviceId) throws DeviceManagementException { - } + } - @Override - public boolean isRegistered(String type, String deviceId) - throws DeviceManagementException { - return false; - } + @Override + public boolean isRegistered(DeviceIdentifier deviceId) throws DeviceManagementException { + return false; + } - @Override - public boolean isActive(String type, String deviceId) - throws DeviceManagementException { - return false; - } + @Override + public boolean isActive(DeviceIdentifier deviceId) throws DeviceManagementException { + return false; + } - @Override - public void setActive(boolean status) throws DeviceManagementException { + @Override + public void setActive(boolean status) throws DeviceManagementException { - } + } - @Override - public List getAllDeviceInfo(String type) throws DeviceManagementException { - return null; - } + @Override + public List getAllDevices(String type) throws DeviceManagementException { + return null; + } - @Override - public Device getDeviceInfo(String type, String deviceId) - throws DeviceManagementException { - return null; - } + @Override + public Device getDevice(DeviceIdentifier deviceId) throws DeviceManagementException { + return null; + } - @Override - public void setOwnership(String ownershipType) throws DeviceManagementException { + @Override + public void setOwnership(DeviceIdentifier deviceId, String ownershipType) throws DeviceManagementException { + + } - } } diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/windows/WindowsDeviceManagerService.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/windows/WindowsDeviceManagerService.java index 9efa62bb02..575219c901 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/windows/WindowsDeviceManagerService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/windows/WindowsDeviceManagerService.java @@ -17,6 +17,7 @@ package org.wso2.carbon.device.mgt.mobile.impl.windows; import org.wso2.carbon.device.mgt.common.Device; +import org.wso2.carbon.device.mgt.common.DeviceIdentifier; import org.wso2.carbon.device.mgt.common.DeviceManagementException; import org.wso2.carbon.device.mgt.common.spi.DeviceManagerService; @@ -44,42 +45,39 @@ public class WindowsDeviceManagerService implements DeviceManagerService { } - @Override - public void disEnrollDevice(String type, String deviceId) - throws DeviceManagementException { + @Override + public void disenrollDevice(DeviceIdentifier deviceId) throws DeviceManagementException { - } + } - @Override - public boolean isRegistered(String type, String deviceId) - throws DeviceManagementException { - return false; - } + @Override + public boolean isRegistered(DeviceIdentifier deviceId) throws DeviceManagementException { + return false; + } - @Override - public boolean isActive(String type, String deviceId) - throws DeviceManagementException { - return false; - } + @Override + public boolean isActive(DeviceIdentifier deviceId) throws DeviceManagementException { + return false; + } - @Override - public void setActive(boolean status) throws DeviceManagementException { + @Override + public void setActive(boolean status) throws DeviceManagementException { - } + } - @Override - public List getAllDeviceInfo(String type) throws DeviceManagementException { - return null; - } + @Override + public List getAllDevices(String type) throws DeviceManagementException { + return null; + } - @Override - public Device getDeviceInfo(String type, String deviceId) - throws DeviceManagementException { - return null; - } + @Override + public Device getDevice(DeviceIdentifier deviceId) throws DeviceManagementException { + return null; + } - @Override - public void setOwnership(String ownershipType) throws DeviceManagementException { + @Override + public void setOwnership(DeviceIdentifier deviceId, String ownershipType) throws DeviceManagementException { + + } - } } From 7b30fc964235af7f341ebe642785afffd1a1996b Mon Sep 17 00:00:00 2001 From: Geeth Munasinghe Date: Fri, 5 Dec 2014 13:49:01 +0530 Subject: [PATCH 3/8] Fixing mobile implementations --- .../mobile/impl/windows/WindowsDeviceManagerService.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/windows/WindowsDeviceManagerService.java b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/windows/WindowsDeviceManagerService.java index 9f6410c565..bebeb972e6 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/windows/WindowsDeviceManagerService.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.mobile.impl/src/main/java/org/wso2/carbon/device/mgt/mobile/impl/windows/WindowsDeviceManagerService.java @@ -75,19 +75,15 @@ public class WindowsDeviceManagerService implements DeviceManagerService { return null; } -<<<<<<< HEAD + @Override public void setOwnership(DeviceIdentifier deviceId, String ownershipType) throws DeviceManagementException { } -======= + @Override public void updateDeviceInfo(Device device) throws DeviceManagementException{ } - @Override - public void setOwnership(String ownershipType) throws DeviceManagementException { ->>>>>>> cc9417d8eba5a0e432e8cc9c87f3e4b64951e520 - } From 28a2cec61553500a1d71875671855fc8144d920c Mon Sep 17 00:00:00 2001 From: Geeth Munasinghe Date: Fri, 5 Dec 2014 14:41:43 +0530 Subject: [PATCH 4/8] adding the test case class, no implementation is done --- .../org.wso2.carbon.device.mgt.core/pom.xml | 5 +++ .../mgt/core/DeviceManagementTestCase.java | 40 +++++++++++++++++++ pom.xml | 11 ++++- 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/DeviceManagementTestCase.java diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml index a1995bccee..3c7d6f1fc1 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/pom.xml @@ -90,6 +90,11 @@ org.wso2.carbon org.wso2.carbon.logging + + junit + junit + test + diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/DeviceManagementTestCase.java b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/DeviceManagementTestCase.java new file mode 100644 index 0000000000..c096f0bd42 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.core/src/test/java/org/wso2/carbon/device/mgt/core/DeviceManagementTestCase.java @@ -0,0 +1,40 @@ +/* +* Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. +* +* WSO2 Inc. licenses this file to you under the Apache License, +* Version 2.0 (the "License"); you may not use this file except +* in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +package org.wso2.carbon.device.mgt.core; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +public class DeviceManagementTestCase extends TestCase { + + private static final Log log = LogFactory.getLog(DeviceManagementTestCase.class); + + /** + * @return the suite of tests being tested + */ + public static Test suite() { + return new TestSuite(DeviceManagementTestCase.class); + } + + + +} diff --git a/pom.xml b/pom.xml index e9c30ba26d..3628d9a93c 100644 --- a/pom.xml +++ b/pom.xml @@ -99,7 +99,7 @@ ${project.version} - + org.eclipse.osgi org.eclipse.osgi @@ -111,6 +111,15 @@ ${eclipse.equinox.common.version} + + + + junit + junit + 4.12-beta-3 + test + + From df00f34bb07e764fde6c0b15a02d2318da51f959 Mon Sep 17 00:00:00 2001 From: inosh-perera Date: Fri, 5 Dec 2014 14:46:00 +0530 Subject: [PATCH 5/8] andoid registration refactor and jax-rs basic implementation --- .../agents/android/client/AndroidManifest.xml | 183 ++ .../modules/agents/android/client/README.md | 18 + .../android/client/assets/config.properties | 1 + .../android/client/bin/AndroidManifest.xml | 183 ++ .../modules/agents/android/client/bin/R.txt | 903 ++++++++ .../agents/android/client/bin/jarlist.cache | 5 + .../client/libs/android-support-v4.jar | Bin 0 -> 484258 bytes .../android/client/libs/commons-codec-1.2.jar | Bin 0 -> 30085 bytes .../agents/android/client/libs/gcm.jar | Bin 0 -> 13662 bytes .../android/client/libs/json-simple-1.1.1.jar | Bin 0 -> 23737 bytes .../plugins/ActionBarSherlock/.gitignore | 34 + .../plugins/ActionBarSherlock/.travis.yml | 11 + .../plugins/ActionBarSherlock/CHANGELOG.md | 469 +++++ .../plugins/ActionBarSherlock/CONTRIBUTING.md | 11 + .../plugins/ActionBarSherlock/LICENSE.txt | 202 ++ .../plugins/ActionBarSherlock/README.md | 60 + .../plugins/ActionBarSherlock/checkstyle.xml | 121 ++ .../library/AndroidManifest.xml | 6 + .../ActionBarSherlock/library/README.md | 15 + .../ActionBarSherlock/library/build.gradle | 32 + .../library/libs/android-support-v4.jar | Bin 0 -> 484258 bytes .../plugins/ActionBarSherlock/library/pom.xml | 148 ++ .../library/project.properties | 12 + ...s__primary_text_disable_only_holo_dark.xml | 20 + ...__primary_text_disable_only_holo_light.xml | 21 + .../res/color/abs__primary_text_holo_dark.xml | 24 + .../color/abs__primary_text_holo_light.xml | 26 + .../abs__ab_bottom_solid_dark_holo.9.png | Bin 0 -> 144 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 0 -> 138 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 0 -> 144 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 0 -> 135 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 0 -> 134 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 0 -> 2863 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 0 -> 2859 bytes .../abs__ab_solid_dark_holo.9.png | Bin 0 -> 146 bytes .../abs__ab_solid_light_holo.9.png | Bin 0 -> 145 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 0 -> 192 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 0 -> 146 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 0 -> 146 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 0 -> 139 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 0 -> 133 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 0 -> 155 bytes .../abs__ab_transparent_light_holo.9.png | Bin 0 -> 145 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 0 -> 104 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 0 -> 102 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 0 -> 112 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 0 -> 108 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 0 -> 110 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 0 -> 108 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 0 -> 149 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 0 -> 145 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 0 -> 147 bytes .../abs__cab_background_top_holo_light.9.png | Bin 0 -> 147 bytes .../abs__dialog_full_holo_dark.9.png | Bin 0 -> 1414 bytes .../abs__dialog_full_holo_light.9.png | Bin 0 -> 1537 bytes .../abs__ic_ab_back_holo_dark.png | Bin 0 -> 602 bytes .../abs__ic_ab_back_holo_light.png | Bin 0 -> 546 bytes .../abs__ic_cab_done_holo_dark.png | Bin 0 -> 713 bytes .../abs__ic_cab_done_holo_light.png | Bin 0 -> 737 bytes .../drawable-hdpi/abs__ic_clear_disabled.png | Bin 0 -> 1774 bytes .../drawable-hdpi/abs__ic_clear_normal.png | Bin 0 -> 1945 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 0 -> 1504 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 0 -> 1540 bytes .../library/res/drawable-hdpi/abs__ic_go.png | Bin 0 -> 1415 bytes .../abs__ic_go_search_api_holo_light.png | Bin 0 -> 1252 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 0 -> 144 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 0 -> 148 bytes .../abs__ic_menu_share_holo_dark.png | Bin 0 -> 467 bytes .../abs__ic_menu_share_holo_light.png | Bin 0 -> 505 bytes .../res/drawable-hdpi/abs__ic_search.png | Bin 0 -> 2280 bytes .../abs__ic_search_api_holo_light.png | Bin 0 -> 2271 bytes .../drawable-hdpi/abs__ic_voice_search.png | Bin 0 -> 2070 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 0 -> 1833 bytes .../abs__list_activated_holo.9.png | Bin 0 -> 154 bytes .../abs__list_divider_holo_dark.9.png | Bin 0 -> 78 bytes .../abs__list_divider_holo_light.9.png | Bin 0 -> 76 bytes .../abs__list_focused_holo.9.png | Bin 0 -> 159 bytes .../abs__list_longpressed_holo.9.png | Bin 0 -> 154 bytes .../abs__list_pressed_holo_dark.9.png | Bin 0 -> 159 bytes .../abs__list_pressed_holo_light.9.png | Bin 0 -> 159 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 0 -> 189 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 0 -> 189 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 0 -> 922 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 0 -> 1061 bytes .../abs__progress_bg_holo_dark.9.png | Bin 0 -> 178 bytes .../abs__progress_bg_holo_light.9.png | Bin 0 -> 174 bytes .../abs__progress_primary_holo_dark.9.png | Bin 0 -> 917 bytes .../abs__progress_primary_holo_light.9.png | Bin 0 -> 917 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 0 -> 188 bytes .../abs__progress_secondary_holo_light.9.png | Bin 0 -> 188 bytes .../abs__spinner_48_inner_holo.png | Bin 0 -> 2081 bytes .../abs__spinner_48_outer_holo.png | Bin 0 -> 1811 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 0 -> 311 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 0 -> 312 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 0 -> 306 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 0 -> 306 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 0 -> 524 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 0 -> 523 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 0 -> 464 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 0 -> 458 bytes .../abs__tab_selected_focused_holo.9.png | Bin 0 -> 147 bytes .../abs__tab_selected_holo.9.png | Bin 0 -> 148 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 0 -> 147 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 0 -> 145 bytes ...__textfield_search_default_holo_dark.9.png | Bin 0 -> 110 bytes ..._textfield_search_default_holo_light.9.png | Bin 0 -> 105 bytes ...field_search_right_default_holo_dark.9.png | Bin 0 -> 108 bytes ...ield_search_right_default_holo_light.9.png | Bin 0 -> 103 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 0 -> 114 bytes ...eld_search_right_selected_holo_light.9.png | Bin 0 -> 111 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 0 -> 114 bytes ...textfield_search_selected_holo_light.9.png | Bin 0 -> 112 bytes .../abs__ab_bottom_solid_dark_holo.9.png | Bin 0 -> 134 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 0 -> 129 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 0 -> 134 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 0 -> 123 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 0 -> 123 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 0 -> 2849 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 0 -> 191 bytes .../abs__ab_solid_dark_holo.9.png | Bin 0 -> 133 bytes .../abs__ab_solid_light_holo.9.png | Bin 0 -> 133 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 0 -> 168 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 0 -> 134 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 0 -> 133 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 0 -> 127 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 0 -> 123 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 0 -> 139 bytes .../abs__ab_transparent_light_holo.9.png | Bin 0 -> 133 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 0 -> 101 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 0 -> 99 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 0 -> 109 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 0 -> 105 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 0 -> 107 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 0 -> 105 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 0 -> 127 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 0 -> 124 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 0 -> 130 bytes .../abs__cab_background_top_holo_light.9.png | Bin 0 -> 128 bytes .../abs__dialog_full_holo_dark.9.png | Bin 0 -> 882 bytes .../abs__dialog_full_holo_light.9.png | Bin 0 -> 1003 bytes .../abs__ic_ab_back_holo_dark.png | Bin 0 -> 466 bytes .../abs__ic_ab_back_holo_light.png | Bin 0 -> 438 bytes .../abs__ic_cab_done_holo_dark.png | Bin 0 -> 566 bytes .../abs__ic_cab_done_holo_light.png | Bin 0 -> 552 bytes .../drawable-mdpi/abs__ic_clear_disabled.png | Bin 0 -> 1775 bytes .../drawable-mdpi/abs__ic_clear_normal.png | Bin 0 -> 1869 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 0 -> 740 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 0 -> 743 bytes .../library/res/drawable-mdpi/abs__ic_go.png | Bin 0 -> 1538 bytes .../abs__ic_go_search_api_holo_light.png | Bin 0 -> 570 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 0 -> 122 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 0 -> 131 bytes .../abs__ic_menu_share_holo_dark.png | Bin 0 -> 332 bytes .../abs__ic_menu_share_holo_light.png | Bin 0 -> 355 bytes .../res/drawable-mdpi/abs__ic_search.png | Bin 0 -> 2280 bytes .../abs__ic_search_api_holo_light.png | Bin 0 -> 1541 bytes .../drawable-mdpi/abs__ic_voice_search.png | Bin 0 -> 1937 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 0 -> 794 bytes .../abs__list_activated_holo.9.png | Bin 0 -> 151 bytes .../abs__list_divider_holo_dark.9.png | Bin 0 -> 78 bytes .../abs__list_divider_holo_light.9.png | Bin 0 -> 76 bytes .../abs__list_focused_holo.9.png | Bin 0 -> 158 bytes .../abs__list_longpressed_holo.9.png | Bin 0 -> 151 bytes .../abs__list_pressed_holo_dark.9.png | Bin 0 -> 158 bytes .../abs__list_pressed_holo_light.9.png | Bin 0 -> 158 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 0 -> 172 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 0 -> 171 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 0 -> 651 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 0 -> 720 bytes .../abs__progress_bg_holo_dark.9.png | Bin 0 -> 165 bytes .../abs__progress_bg_holo_light.9.png | Bin 0 -> 159 bytes .../abs__progress_primary_holo_dark.9.png | Bin 0 -> 572 bytes .../abs__progress_primary_holo_light.9.png | Bin 0 -> 572 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 0 -> 170 bytes .../abs__progress_secondary_holo_light.9.png | Bin 0 -> 170 bytes .../abs__spinner_48_inner_holo.png | Bin 0 -> 1336 bytes .../abs__spinner_48_outer_holo.png | Bin 0 -> 1165 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 0 -> 254 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 0 -> 255 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 0 -> 249 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 0 -> 249 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 0 -> 417 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 0 -> 424 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 0 -> 370 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 0 -> 370 bytes .../abs__tab_selected_focused_holo.9.png | Bin 0 -> 148 bytes .../abs__tab_selected_holo.9.png | Bin 0 -> 151 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 0 -> 150 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 0 -> 155 bytes ...__textfield_search_default_holo_dark.9.png | Bin 0 -> 106 bytes ..._textfield_search_default_holo_light.9.png | Bin 0 -> 100 bytes ...field_search_right_default_holo_dark.9.png | Bin 0 -> 105 bytes ...ield_search_right_default_holo_light.9.png | Bin 0 -> 98 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 0 -> 107 bytes ...eld_search_right_selected_holo_light.9.png | Bin 0 -> 107 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 0 -> 109 bytes ...textfield_search_selected_holo_light.9.png | Bin 0 -> 109 bytes .../abs__progress_medium_holo.xml | 34 + .../abs__ab_bottom_solid_dark_holo.9.png | Bin 0 -> 165 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 0 -> 157 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 0 -> 166 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 0 -> 153 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 0 -> 152 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 0 -> 2878 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 0 -> 2873 bytes .../abs__ab_solid_dark_holo.9.png | Bin 0 -> 163 bytes .../abs__ab_solid_light_holo.9.png | Bin 0 -> 163 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 0 -> 290 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 0 -> 163 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 0 -> 163 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 0 -> 158 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 0 -> 152 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 0 -> 171 bytes .../abs__ab_transparent_light_holo.9.png | Bin 0 -> 160 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 0 -> 109 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 0 -> 108 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 0 -> 112 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 0 -> 113 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 0 -> 115 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 0 -> 113 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 0 -> 166 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 0 -> 161 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 0 -> 174 bytes .../abs__cab_background_top_holo_light.9.png | Bin 0 -> 161 bytes .../abs__dialog_full_holo_dark.9.png | Bin 0 -> 2159 bytes .../abs__dialog_full_holo_light.9.png | Bin 0 -> 2302 bytes .../abs__ic_ab_back_holo_dark.png | Bin 0 -> 741 bytes .../abs__ic_ab_back_holo_light.png | Bin 0 -> 661 bytes .../abs__ic_cab_done_holo_dark.png | Bin 0 -> 970 bytes .../abs__ic_cab_done_holo_light.png | Bin 0 -> 915 bytes .../drawable-xhdpi/abs__ic_clear_disabled.png | Bin 0 -> 2531 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 0 -> 1315 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 0 -> 1447 bytes .../library/res/drawable-xhdpi/abs__ic_go.png | Bin 0 -> 1983 bytes .../abs__ic_go_search_api_holo_light.png | Bin 0 -> 836 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 0 -> 167 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 0 -> 184 bytes .../abs__ic_menu_share_holo_dark.png | Bin 0 -> 699 bytes .../abs__ic_menu_share_holo_light.png | Bin 0 -> 935 bytes .../res/drawable-xhdpi/abs__ic_search.png | Bin 0 -> 3784 bytes .../abs__ic_search_api_holo_light.png | Bin 0 -> 3037 bytes .../drawable-xhdpi/abs__ic_voice_search.png | Bin 0 -> 3053 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 0 -> 1414 bytes .../abs__list_activated_holo.9.png | Bin 0 -> 158 bytes .../abs__list_divider_holo_dark.9.png | Bin 0 -> 83 bytes .../abs__list_divider_holo_light.9.png | Bin 0 -> 83 bytes .../abs__list_focused_holo.9.png | Bin 0 -> 163 bytes .../abs__list_longpressed_holo.9.png | Bin 0 -> 158 bytes .../abs__list_pressed_holo_dark.9.png | Bin 0 -> 163 bytes .../abs__list_pressed_holo_light.9.png | Bin 0 -> 163 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 0 -> 190 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 0 -> 188 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 0 -> 1362 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 0 -> 1551 bytes .../abs__progress_bg_holo_dark.9.png | Bin 0 -> 174 bytes .../abs__progress_bg_holo_light.9.png | Bin 0 -> 172 bytes .../abs__progress_primary_holo_dark.9.png | Bin 0 -> 1309 bytes .../abs__progress_primary_holo_light.9.png | Bin 0 -> 1309 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 0 -> 184 bytes .../abs__progress_secondary_holo_light.9.png | Bin 0 -> 184 bytes .../abs__spinner_48_inner_holo.png | Bin 0 -> 2769 bytes .../abs__spinner_48_outer_holo.png | Bin 0 -> 2432 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 0 -> 395 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 0 -> 394 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 0 -> 381 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 0 -> 381 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 0 -> 680 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 0 -> 671 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 0 -> 609 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 0 -> 602 bytes .../abs__tab_selected_focused_holo.9.png | Bin 0 -> 147 bytes .../abs__tab_selected_holo.9.png | Bin 0 -> 153 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 0 -> 147 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 0 -> 149 bytes ...__textfield_search_default_holo_dark.9.png | Bin 0 -> 126 bytes ..._textfield_search_default_holo_light.9.png | Bin 0 -> 126 bytes ...field_search_right_default_holo_dark.9.png | Bin 0 -> 125 bytes ...ield_search_right_default_holo_light.9.png | Bin 0 -> 127 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 0 -> 128 bytes ...eld_search_right_selected_holo_light.9.png | Bin 0 -> 128 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 0 -> 114 bytes ...textfield_search_selected_holo_light.9.png | Bin 0 -> 126 bytes .../abs__activated_background_holo_dark.xml | 20 + .../abs__activated_background_holo_light.xml | 20 + .../drawable/abs__btn_cab_done_holo_dark.xml | 24 + .../drawable/abs__btn_cab_done_holo_light.xml | 24 + .../library/res/drawable/abs__ic_clear.xml | 22 + .../res/drawable/abs__ic_clear_holo_light.xml | 22 + .../abs__ic_menu_moreoverflow_holo_dark.xml | 18 + .../abs__ic_menu_moreoverflow_holo_light.xml | 18 + .../abs__item_background_holo_dark.xml | 26 + .../abs__item_background_holo_light.xml | 26 + ...lector_background_transition_holo_dark.xml | 20 + ...ector_background_transition_holo_light.xml | 20 + .../drawable/abs__list_selector_holo_dark.xml | 27 + .../abs__list_selector_holo_light.xml | 28 + .../abs__progress_horizontal_holo_dark.xml | 32 + .../abs__progress_horizontal_holo_light.xml | 32 + .../drawable/abs__progress_medium_holo.xml | 34 + .../drawable/abs__search_dropdown_dark.xml | 22 + .../drawable/abs__search_dropdown_light.xml | 22 + .../drawable/abs__spinner_ab_holo_dark.xml | 25 + .../drawable/abs__spinner_ab_holo_light.xml | 25 + .../drawable/abs__tab_indicator_ab_holo.xml | 34 + .../abs__textfield_searchview_holo_dark.xml | 22 + .../abs__textfield_searchview_holo_light.xml | 22 + ...__textfield_searchview_right_holo_dark.xml | 22 + ..._textfield_searchview_right_holo_light.xml | 22 + .../abs__action_mode_close_item.xml | 40 + .../sherlock_spinner_dropdown_item.xml | 26 + .../res/layout-v14/sherlock_spinner_item.xml | 26 + .../layout-xlarge/abs__screen_action_bar.xml | 50 + .../abs__screen_action_bar_overlay.xml | 49 + .../res/layout/abs__action_bar_home.xml | 38 + .../res/layout/abs__action_bar_tab.xml | 7 + .../layout/abs__action_bar_tab_bar_view.xml | 6 + .../res/layout/abs__action_bar_title_item.xml | 50 + .../layout/abs__action_menu_item_layout.xml | 56 + .../res/layout/abs__action_menu_layout.xml | 23 + .../res/layout/abs__action_mode_bar.xml | 24 + .../layout/abs__action_mode_close_item.xml | 31 + .../res/layout/abs__activity_chooser_view.xml | 70 + .../abs__activity_chooser_view_list_item.xml | 53 + .../res/layout/abs__dialog_title_holo.xml | 46 + .../layout/abs__list_menu_item_checkbox.xml | 26 + .../res/layout/abs__list_menu_item_icon.xml | 28 + .../res/layout/abs__list_menu_item_layout.xml | 59 + .../res/layout/abs__list_menu_item_radio.xml | 24 + .../layout/abs__popup_menu_item_layout.xml | 60 + .../res/layout/abs__screen_action_bar.xml | 57 + .../layout/abs__screen_action_bar_overlay.xml | 59 + .../library/res/layout/abs__screen_simple.xml | 38 + ...abs__screen_simple_overlay_action_mode.xml | 38 + .../abs__search_dropdown_item_icons_2line.xml | 89 + .../library/res/layout/abs__search_view.xml | 159 ++ .../res/layout/abs__simple_dropdown_hint.xml | 29 + .../layout/sherlock_spinner_dropdown_item.xml | 26 + .../res/layout/sherlock_spinner_item.xml | 26 + .../library/res/values-land/abs__dimens.xml | 33 + .../abs__dimens.xml | 33 + .../abs__dimens.xml | 33 + .../abs__dimens.xml | 33 + .../abs__dimens.xml | 36 + .../library/res/values-large/abs__dimens.xml | 29 + .../library/res/values-sw600dp/abs__bools.xml | 19 + .../res/values-sw600dp/abs__dimens.xml | 38 + .../library/res/values-v11/abs__themes.xml | 12 + .../library/res/values-v14/abs__styles.xml | 123 ++ .../library/res/values-v14/abs__themes.xml | 34 + .../library/res/values-w360dp/abs__dimens.xml | 22 + .../library/res/values-w480dp/abs__bools.xml | 22 + .../library/res/values-w480dp/abs__config.xml | 29 + .../library/res/values-w500dp/abs__dimens.xml | 22 + .../library/res/values-w600dp/abs__dimens.xml | 22 + .../library/res/values-xlarge/abs__dimens.xml | 45 + .../library/res/values/abs__attrs.xml | 432 ++++ .../library/res/values/abs__bools.xml | 22 + .../library/res/values/abs__colors.xml | 27 + .../library/res/values/abs__config.xml | 43 + .../library/res/values/abs__dimens.xml | 67 + .../library/res/values/abs__ids.xml | 26 + .../library/res/values/abs__strings.xml | 53 + .../library/res/values/abs__styles.xml | 412 ++++ .../library/res/values/abs__themes.xml | 239 +++ .../src/android/support/v4/app/Watson.java | 144 ++ .../actionbarsherlock/ActionBarSherlock.java | 794 +++++++ .../com/actionbarsherlock/app/ActionBar.java | 956 +++++++++ .../app/SherlockActivity.java | 270 +++ .../app/SherlockDialogFragment.java | 68 + .../app/SherlockExpandableListActivity.java | 259 +++ .../app/SherlockFragment.java | 68 + .../app/SherlockFragmentActivity.java | 303 +++ .../app/SherlockListActivity.java | 270 +++ .../app/SherlockListFragment.java | 68 + .../app/SherlockPreferenceActivity.java | 270 +++ .../internal/ActionBarSherlockCompat.java | 1203 +++++++++++ .../internal/ActionBarSherlockNative.java | 336 +++ .../internal/ResourcesCompat.java | 95 + .../internal/app/ActionBarImpl.java | 1026 +++++++++ .../internal/app/ActionBarWrapper.java | 468 +++++ .../nineoldandroids/animation/Animator.java | 278 +++ .../animation/AnimatorListenerAdapter.java | 54 + .../animation/AnimatorSet.java | 1111 ++++++++++ .../animation/FloatEvaluator.java | 42 + .../animation/FloatKeyframeSet.java | 136 ++ .../animation/IntEvaluator.java | 42 + .../animation/IntKeyframeSet.java | 135 ++ .../nineoldandroids/animation/Keyframe.java | 361 ++++ .../animation/KeyframeSet.java | 227 ++ .../animation/ObjectAnimator.java | 491 +++++ .../animation/PropertyValuesHolder.java | 1012 +++++++++ .../animation/TypeEvaluator.java | 44 + .../animation/ValueAnimator.java | 1265 +++++++++++ .../nineoldandroids/view/NineViewGroup.java | 79 + .../view/animation/AnimatorProxy.java | 212 ++ .../widget/NineFrameLayout.java | 57 + .../widget/NineHorizontalScrollView.java | 41 + .../widget/NineLinearLayout.java | 57 + .../internal/view/ActionProviderWrapper.java | 40 + .../internal/view/StandaloneActionMode.java | 148 ++ .../view/View_HasStateListenerSupport.java | 6 + .../View_OnAttachStateChangeListener.java | 8 + .../internal/view/menu/ActionMenu.java | 264 +++ .../internal/view/menu/ActionMenuItem.java | 278 +++ .../view/menu/ActionMenuItemView.java | 295 +++ .../view/menu/ActionMenuPresenter.java | 714 +++++++ .../internal/view/menu/ActionMenuView.java | 575 +++++ .../internal/view/menu/BaseMenuPresenter.java | 231 ++ .../internal/view/menu/ListMenuItemView.java | 278 +++ .../internal/view/menu/MenuBuilder.java | 1335 ++++++++++++ .../internal/view/menu/MenuItemImpl.java | 647 ++++++ .../internal/view/menu/MenuItemWrapper.java | 310 +++ .../internal/view/menu/MenuPopupHelper.java | 376 ++++ .../internal/view/menu/MenuPresenter.java | 148 ++ .../internal/view/menu/MenuView.java | 120 ++ .../internal/view/menu/MenuWrapper.java | 185 ++ .../internal/view/menu/SubMenuBuilder.java | 134 ++ .../internal/view/menu/SubMenuWrapper.java | 72 + .../internal/widget/AbsActionBarView.java | 291 +++ .../internal/widget/ActionBarContainer.java | 258 +++ .../internal/widget/ActionBarContextView.java | 518 +++++ .../internal/widget/ActionBarView.java | 1548 ++++++++++++++ .../internal/widget/CapitalizingButton.java | 40 + .../internal/widget/CapitalizingTextView.java | 50 + .../widget/CollapsibleActionViewWrapper.java | 30 + .../widget/FakeDialogPhoneWindow.java | 64 + .../internal/widget/IcsAbsSpinner.java | 479 +++++ .../internal/widget/IcsAdapterView.java | 1160 ++++++++++ .../internal/widget/IcsColorDrawable.java | 41 + .../internal/widget/IcsLinearLayout.java | 410 ++++ .../internal/widget/IcsListPopupWindow.java | 644 ++++++ .../internal/widget/IcsProgressBar.java | 1193 +++++++++++ .../internal/widget/IcsSpinner.java | 703 +++++++ .../internal/widget/IcsView.java | 21 + .../widget/ScrollingTabContainerView.java | 546 +++++ .../actionbarsherlock/view/ActionMode.java | 224 ++ .../view/ActionProvider.java | 170 ++ .../view/CollapsibleActionView.java | 39 + .../src/com/actionbarsherlock/view/Menu.java | 447 ++++ .../actionbarsherlock/view/MenuInflater.java | 495 +++++ .../com/actionbarsherlock/view/MenuItem.java | 598 ++++++ .../com/actionbarsherlock/view/SubMenu.java | 110 + .../com/actionbarsherlock/view/Window.java | 65 + .../widget/ActivityChooserModel.java | 1104 ++++++++++ .../widget/ActivityChooserView.java | 827 ++++++++ .../actionbarsherlock/widget/SearchView.java | 1811 ++++++++++++++++ .../widget/ShareActionProvider.java | 316 +++ .../widget/SuggestionsAdapter.java | 733 +++++++ .../internal/ManifestParsingTest.java | 37 + .../client/plugins/ActionBarSherlock/pom.xml | 191 ++ .../android/client/proguard-project.txt | 20 + .../agents/android/client/project.properties | 15 + .../client/res/drawable-hdpi/ic_bookmark.png | Bin 0 -> 4960 bytes .../res/drawable-hdpi/ic_check_default.png | Bin 0 -> 5701 bytes .../res/drawable-hdpi/ic_check_selected.png | Bin 0 -> 8100 bytes .../client/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 4327 bytes .../client/res/drawable-hdpi/ic_logo.png | Bin 0 -> 4699 bytes .../client/res/drawable-hdpi/ic_logo_dark.png | Bin 0 -> 4699 bytes .../client/res/drawable-hdpi/ic_stat_gcm.png | Bin 0 -> 1135 bytes .../client/res/drawable-hdpi/option_icon.png | Bin 0 -> 5344 bytes .../client/res/drawable-hdpi/repeat_bg.png | Bin 0 -> 7114 bytes .../client/res/drawable-hdpi/top_bar.png | Bin 0 -> 34395 bytes .../client/res/drawable-mdpi/ic_bookmark.png | Bin 0 -> 2919 bytes .../res/drawable-mdpi/ic_check_default.png | Bin 0 -> 3090 bytes .../res/drawable-mdpi/ic_check_selected.png | Bin 0 -> 4182 bytes .../client/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 2425 bytes .../client/res/drawable-mdpi/ic_logo.png | Bin 0 -> 3104 bytes .../client/res/drawable-mdpi/ic_logo_dark.png | Bin 0 -> 3104 bytes .../client/res/drawable-mdpi/option_icon.png | Bin 0 -> 2894 bytes .../client/res/drawable-mdpi/top_bar.png | Bin 0 -> 20898 bytes .../client/res/drawable-xhdpi/appinstall.png | Bin 0 -> 11231 bytes .../client/res/drawable-xhdpi/applist.png | Bin 0 -> 11689 bytes .../res/drawable-xhdpi/appuninstall.png | Bin 0 -> 10092 bytes .../client/res/drawable-xhdpi/camera.png | Bin 0 -> 15565 bytes .../res/drawable-xhdpi/changepassword.png | Bin 0 -> 15692 bytes .../client/res/drawable-xhdpi/encrypt.png | Bin 0 -> 9196 bytes .../client/res/drawable-xhdpi/ic_bookmark.png | Bin 0 -> 7078 bytes .../res/drawable-xhdpi/ic_check_default.png | Bin 0 -> 8569 bytes .../res/drawable-xhdpi/ic_check_selected.png | Bin 0 -> 12609 bytes .../client/res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 5994 bytes .../client/res/drawable-xhdpi/ic_logo.png | Bin 0 -> 6475 bytes .../res/drawable-xhdpi/ic_logo_dark.png | Bin 0 -> 6475 bytes .../client/res/drawable-xhdpi/info.png | Bin 0 -> 12733 bytes .../client/res/drawable-xhdpi/location.png | Bin 0 -> 13926 bytes .../client/res/drawable-xhdpi/lock.png | Bin 0 -> 7210 bytes .../client/res/drawable-xhdpi/mute.png | Bin 0 -> 18880 bytes .../res/drawable-xhdpi/notification.png | Bin 0 -> 10763 bytes .../client/res/drawable-xhdpi/repeat_bg.png | Bin 0 -> 16939 bytes .../client/res/drawable-xhdpi/wifi.png | Bin 0 -> 8153 bytes .../client/res/drawable-xhdpi/wipe.png | Bin 0 -> 14301 bytes .../res/drawable-xxhdpi/ic_bookmark.png | Bin 0 -> 11958 bytes .../res/drawable-xxhdpi/ic_check_default.png | Bin 0 -> 15668 bytes .../res/drawable-xxhdpi/ic_check_selected.png | Bin 0 -> 23206 bytes .../res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 9581 bytes .../client/res/drawable-xxhdpi/ic_logo.png | Bin 0 -> 10459 bytes .../res/drawable-xxhdpi/ic_logo_dark.png | Bin 0 -> 10459 bytes .../client/res/drawable-xxhdpi/repeat_bg.png | Bin 0 -> 18591 bytes .../android/client/res/drawable/btn_grey.xml | 37 + .../client/res/drawable/btn_orange.xml | 37 + .../client/res/drawable/custom_checkbox.xml | 5 + .../android/client/res/drawable/dot.png | Bin 0 -> 85 bytes .../android/client/res/drawable/mdm_logo.xml | 10 + .../res/layout/activity_agent_settings.xml | 26 + .../client/res/layout/activity_alert.xml | 35 + .../layout/activity_already_registered.xml | 96 + .../res/layout/activity_authentication.xml | 123 ++ .../layout/activity_authentication_error.xml | 91 + .../layout/activity_available_operations.xml | 25 + .../layout/activity_display_device_info.xml | 110 + .../client/res/layout/activity_entry.xml | 55 + .../client/res/layout/activity_log.xml | 37 + .../client/res/layout/activity_main.xml | 130 ++ .../res/layout/activity_notification.xml | 30 + .../client/res/layout/activity_pin_code.xml | 123 ++ .../layout/activity_register_successful.xml | 100 + .../client/res/layout/activity_settings.xml | 122 ++ .../client/res/layout/custom_sherlock_bar.xml | 14 + .../client/res/layout/custom_terms_popup.xml | 55 + .../client/res/layout/footer_repeat.xml | 4 + .../client/res/layout/header_gradient.xml | 9 + .../android/client/res/layout/login.xml | 77 + .../agents/android/client/res/layout/main.xml | 12 + .../android/client/res/layout/notify.xml | 93 + .../client/res/layout/row_with_icon.xml | 26 + .../android/client/res/layout/simplerow.xml | 8 + .../client/res/menu/agent_settings.xml | 9 + .../agents/android/client/res/menu/alert.xml | 9 + .../client/res/menu/all_ready_registered.xml | 9 + .../client/res/menu/auth_sherlock_menu.xml | 15 + .../client/res/menu/authentication.xml | 9 + .../client/res/menu/authentication_error.xml | 9 + .../client/res/menu/available_operations.xml | 9 + .../client/res/menu/display_device_info.xml | 9 + .../agents/android/client/res/menu/entry.xml | 9 + .../agents/android/client/res/menu/log.xml | 9 + .../agents/android/client/res/menu/main.xml | 9 + .../android/client/res/menu/notification.xml | 9 + .../agents/android/client/res/menu/notify.xml | 9 + .../android/client/res/menu/options_menu.xml | 5 + .../android/client/res/menu/pin_code.xml | 9 + .../client/res/menu/register_successful.xml | 9 + .../android/client/res/menu/settings.xml | 9 + .../android/client/res/menu/sherlock_menu.xml | 19 + .../client/res/menu/sherlock_menu_debug.xml | 28 + .../android/client/res/raw/emm_truststore.bks | Bin 0 -> 29 bytes .../client/res/values-sw600dp/dimens.xml | 8 + .../client/res/values-sw720dp-land/dimens.xml | 9 + .../android/client/res/values-v11/styles.xml | 11 + .../android/client/res/values-v14/styles.xml | 12 + .../android/client/res/values/colors.xml | 7 + .../android/client/res/values/dimens.xml | 7 + .../agents/android/client/res/values/ids.xml | 65 + .../android/client/res/values/strings.xml | 174 ++ .../android/client/res/values/styles.xml | 64 + .../client/res/xml/wso2_device_admin.xml | 12 + .../src/org/wso2/cdm/agent/AlertActivity.java | 63 + .../cdm/agent/AlreadyRegisteredActivity.java | 533 +++++ .../cdm/agent/AuthenticationActivity.java | 934 +++++++++ .../agent/AuthenticationErrorActivity.java | 130 ++ .../cdm/agent/DisplayDeviceInfoActivity.java | 138 ++ .../org/wso2/cdm/agent/GCMIntentService.java | 146 ++ .../src/org/wso2/cdm/agent/LogActivity.java | 76 + .../org/wso2/cdm/agent/NotifyActivity.java | 69 + .../org/wso2/cdm/agent/PinCodeActivity.java | 308 +++ .../wso2/cdm/agent/RegistrationActivity.java | 283 +++ .../src/org/wso2/cdm/agent/ServerDetails.java | 333 +++ .../cdm/agent/api/ApplicationManager.java | 243 +++ .../src/org/wso2/cdm/agent/api/Battery.java | 59 + .../org/wso2/cdm/agent/api/DeviceInfo.java | 348 +++ .../src/org/wso2/cdm/agent/api/ExecShell.java | 74 + .../org/wso2/cdm/agent/api/GPSTracker.java | 213 ++ .../wso2/cdm/agent/api/LocationServices.java | 44 + .../org/wso2/cdm/agent/api/PhoneState.java | 252 +++ .../src/org/wso2/cdm/agent/api/Root.java | 80 + .../org/wso2/cdm/agent/api/TrackCallSMS.java | 138 ++ .../org/wso2/cdm/agent/api/TrafficRecord.java | 36 + .../wso2/cdm/agent/api/TrafficSnapshot.java | 43 + .../org/wso2/cdm/agent/api/WiFiConfig.java | 798 +++++++ .../src/org/wso2/cdm/agent/models/PInfo.java | 30 + .../wso2/cdm/agent/parser/PayloadParser.java | 74 + .../cdm/agent/proxy/APIAccessCallBack.java | 12 + .../wso2/cdm/agent/proxy/APIController.java | 93 + .../cdm/agent/proxy/APIResultCallBack.java | 8 + .../wso2/cdm/agent/proxy/APIUtilities.java | 27 + .../cdm/agent/proxy/AccessTokenHandler.java | 135 ++ .../org/wso2/cdm/agent/proxy/CallBack.java | 26 + .../wso2/cdm/agent/proxy/IdentityProxy.java | 148 ++ .../cdm/agent/proxy/RefreshTokenHandler.java | 122 ++ .../wso2/cdm/agent/proxy/ServerUtilities.java | 235 +++ .../cdm/agent/proxy/ServerUtilitiesTemp.java | 315 +++ .../src/org/wso2/cdm/agent/proxy/Token.java | 94 + .../wso2/cdm/agent/proxy/TokenCallBack.java | 6 + .../agent/security/APIResultCallBackImpl.java | 100 + .../cdm/agent/services/AlarmReceiver.java | 45 + .../org/wso2/cdm/agent/services/Config.java | 22 + .../services/DeviceStartupIntentReceiver.java | 74 + .../wso2/cdm/agent/services/Operation.java | 1857 +++++++++++++++++ .../wso2/cdm/agent/services/PolicyTester.java | 740 +++++++ .../cdm/agent/services/ProcessMessage.java | 249 +++ .../wso2/cdm/agent/services/SMSReceiver.java | 66 + .../services/WSO2DeviceAdminReceiver.java | 137 ++ .../cdm/agent/utils/CommonDialogUtils.java | 159 ++ .../wso2/cdm/agent/utils/CommonUtilities.java | 194 ++ .../src/org/wso2/cdm/agent/utils/Errors.java | 45 + .../cdm/agent/utils/HTTPConnectorUtils.java | 288 +++ .../wso2/cdm/agent/utils/LoggerCustom.java | 62 + .../org/wso2/cdm/agent/utils/Preference.java | 30 + .../org/wso2/cdm/agent/utils/ServerUtils.java | 141 ++ .../cdm/agent/utils/WSO2SSLSocketFactory.java | 64 + .../modules/agents/android/jax-rs/build.xml | 75 + product/modules/agents/android/jax-rs/pom.xml | 146 ++ .../agents/android/jax-rs/run-client.bat | 81 + .../agents/android/jax-rs/run-client.sh | 90 + .../java/cdm/api/android/Authentication.java | 113 + .../webapp/META-INF/webapp-classloading.xml | 33 + .../src/main/webapp/WEB-INF/cxf-servlet.xml | 34 + .../jax-rs/src/main/webapp/WEB-INF/web.xml | 39 + .../jax-rs/src/main/webapp/servicelist.css | 117 ++ .../agents/ios/android/AndroidManifest.xml | 183 ++ product/modules/agents/ios/android/README.md | 18 + .../ios/android/assets/config.properties | 1 + .../ios/android/bin/AndroidManifest.xml | 183 ++ product/modules/agents/ios/android/bin/R.txt | 903 ++++++++ .../agents/ios/android/bin/cdm-agent.apk | Bin 0 -> 1236003 bytes .../agents/ios/android/bin/classes.dex | Bin 0 -> 1114648 bytes ...rt-v4-7b0b3238976555cb6d251e95cc30748f.jar | Bin 0 -> 189224 bytes ...c-1.2-b63678973161d34ef8e3f1b4d2d5e356.jar | Bin 0 -> 18665 bytes .../gcm-d481818bb64b84c38624bd6717ade0cb.jar | Bin 0 -> 10002 bytes ...1.1.1-1244001980bc7a37a2d614fb8d7dae09.jar | Bin 0 -> 13665 bytes ...brary-5073d48b3ca9a828720ba02b7fdaed24.jar | Bin 0 -> 177631 bytes .../agents/ios/android/bin/jarlist.cache | 5 + .../res/crunch/drawable-hdpi/ic_bookmark.png | Bin 0 -> 3633 bytes .../crunch/drawable-hdpi/ic_check_default.png | Bin 0 -> 5210 bytes .../drawable-hdpi/ic_check_selected.png | Bin 0 -> 7372 bytes .../res/crunch/drawable-hdpi/ic_launcher.png | Bin 0 -> 3287 bytes .../bin/res/crunch/drawable-hdpi/ic_logo.png | Bin 0 -> 3800 bytes .../res/crunch/drawable-hdpi/ic_logo_dark.png | Bin 0 -> 3800 bytes .../res/crunch/drawable-hdpi/ic_stat_gcm.png | Bin 0 -> 1015 bytes .../res/crunch/drawable-hdpi/option_icon.png | Bin 0 -> 5304 bytes .../res/crunch/drawable-hdpi/repeat_bg.png | Bin 0 -> 7043 bytes .../bin/res/crunch/drawable-hdpi/top_bar.png | Bin 0 -> 33996 bytes .../res/crunch/drawable-mdpi/ic_bookmark.png | Bin 0 -> 2056 bytes .../crunch/drawable-mdpi/ic_check_default.png | Bin 0 -> 2903 bytes .../drawable-mdpi/ic_check_selected.png | Bin 0 -> 3874 bytes .../res/crunch/drawable-mdpi/ic_launcher.png | Bin 0 -> 1877 bytes .../bin/res/crunch/drawable-mdpi/ic_logo.png | Bin 0 -> 2199 bytes .../res/crunch/drawable-mdpi/ic_logo_dark.png | Bin 0 -> 2199 bytes .../res/crunch/drawable-mdpi/option_icon.png | Bin 0 -> 2854 bytes .../bin/res/crunch/drawable-mdpi/top_bar.png | Bin 0 -> 19781 bytes .../res/crunch/drawable-xhdpi/appinstall.png | Bin 0 -> 10014 bytes .../bin/res/crunch/drawable-xhdpi/applist.png | Bin 0 -> 11634 bytes .../crunch/drawable-xhdpi/appuninstall.png | Bin 0 -> 10038 bytes .../bin/res/crunch/drawable-xhdpi/camera.png | Bin 0 -> 17109 bytes .../crunch/drawable-xhdpi/changepassword.png | Bin 0 -> 12986 bytes .../bin/res/crunch/drawable-xhdpi/encrypt.png | Bin 0 -> 9142 bytes .../res/crunch/drawable-xhdpi/ic_bookmark.png | Bin 0 -> 5158 bytes .../drawable-xhdpi/ic_check_default.png | Bin 0 -> 7579 bytes .../drawable-xhdpi/ic_check_selected.png | Bin 0 -> 11052 bytes .../res/crunch/drawable-xhdpi/ic_launcher.png | Bin 0 -> 4528 bytes .../bin/res/crunch/drawable-xhdpi/ic_logo.png | Bin 0 -> 5569 bytes .../crunch/drawable-xhdpi/ic_logo_dark.png | Bin 0 -> 5569 bytes .../bin/res/crunch/drawable-xhdpi/info.png | Bin 0 -> 11465 bytes .../res/crunch/drawable-xhdpi/location.png | Bin 0 -> 13198 bytes .../bin/res/crunch/drawable-xhdpi/lock.png | Bin 0 -> 6628 bytes .../bin/res/crunch/drawable-xhdpi/mute.png | Bin 0 -> 18821 bytes .../crunch/drawable-xhdpi/notification.png | Bin 0 -> 9665 bytes .../res/crunch/drawable-xhdpi/repeat_bg.png | Bin 0 -> 16868 bytes .../bin/res/crunch/drawable-xhdpi/wifi.png | Bin 0 -> 8087 bytes .../bin/res/crunch/drawable-xhdpi/wipe.png | Bin 0 -> 13370 bytes .../crunch/drawable-xxhdpi/ic_bookmark.png | Bin 0 -> 8784 bytes .../drawable-xxhdpi/ic_check_default.png | Bin 0 -> 13474 bytes .../drawable-xxhdpi/ic_check_selected.png | Bin 0 -> 20172 bytes .../crunch/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 8976 bytes .../res/crunch/drawable-xxhdpi/ic_logo.png | Bin 0 -> 9547 bytes .../crunch/drawable-xxhdpi/ic_logo_dark.png | Bin 0 -> 9547 bytes .../res/crunch/drawable-xxhdpi/repeat_bg.png | Bin 0 -> 18538 bytes .../android/bin/res/crunch/drawable/dot.png | Bin 0 -> 110 bytes .../agents/ios/android/bin/resources.ap_ | Bin 0 -> 734314 bytes .../ios/android/libs/android-support-v4.jar | Bin 0 -> 484258 bytes .../ios/android/libs/commons-codec-1.2.jar | Bin 0 -> 30085 bytes .../modules/agents/ios/android/libs/gcm.jar | Bin 0 -> 13662 bytes .../ios/android/libs/json-simple-1.1.1.jar | Bin 0 -> 23737 bytes .../plugins/ActionBarSherlock/.gitignore | 34 + .../plugins/ActionBarSherlock/.travis.yml | 11 + .../plugins/ActionBarSherlock/CHANGELOG.md | 469 +++++ .../plugins/ActionBarSherlock/CONTRIBUTING.md | 11 + .../plugins/ActionBarSherlock/LICENSE.txt | 202 ++ .../plugins/ActionBarSherlock/README.md | 60 + .../plugins/ActionBarSherlock/checkstyle.xml | 121 ++ .../library/AndroidManifest.xml | 6 + .../ActionBarSherlock/library/README.md | 15 + .../ActionBarSherlock/library/build.gradle | 32 + .../library/libs/android-support-v4.jar | Bin 0 -> 484258 bytes .../plugins/ActionBarSherlock/library/pom.xml | 148 ++ .../library/project.properties | 12 + ...s__primary_text_disable_only_holo_dark.xml | 20 + ...__primary_text_disable_only_holo_light.xml | 21 + .../res/color/abs__primary_text_holo_dark.xml | 24 + .../color/abs__primary_text_holo_light.xml | 26 + .../abs__ab_bottom_solid_dark_holo.9.png | Bin 0 -> 144 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 0 -> 138 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 0 -> 144 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 0 -> 135 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 0 -> 134 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 0 -> 2863 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 0 -> 2859 bytes .../abs__ab_solid_dark_holo.9.png | Bin 0 -> 146 bytes .../abs__ab_solid_light_holo.9.png | Bin 0 -> 145 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 0 -> 192 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 0 -> 146 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 0 -> 146 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 0 -> 139 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 0 -> 133 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 0 -> 155 bytes .../abs__ab_transparent_light_holo.9.png | Bin 0 -> 145 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 0 -> 104 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 0 -> 102 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 0 -> 112 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 0 -> 108 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 0 -> 110 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 0 -> 108 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 0 -> 149 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 0 -> 145 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 0 -> 147 bytes .../abs__cab_background_top_holo_light.9.png | Bin 0 -> 147 bytes .../abs__dialog_full_holo_dark.9.png | Bin 0 -> 1414 bytes .../abs__dialog_full_holo_light.9.png | Bin 0 -> 1537 bytes .../abs__ic_ab_back_holo_dark.png | Bin 0 -> 602 bytes .../abs__ic_ab_back_holo_light.png | Bin 0 -> 546 bytes .../abs__ic_cab_done_holo_dark.png | Bin 0 -> 713 bytes .../abs__ic_cab_done_holo_light.png | Bin 0 -> 737 bytes .../drawable-hdpi/abs__ic_clear_disabled.png | Bin 0 -> 1774 bytes .../drawable-hdpi/abs__ic_clear_normal.png | Bin 0 -> 1945 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 0 -> 1504 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 0 -> 1540 bytes .../library/res/drawable-hdpi/abs__ic_go.png | Bin 0 -> 1415 bytes .../abs__ic_go_search_api_holo_light.png | Bin 0 -> 1252 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 0 -> 144 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 0 -> 148 bytes .../abs__ic_menu_share_holo_dark.png | Bin 0 -> 467 bytes .../abs__ic_menu_share_holo_light.png | Bin 0 -> 505 bytes .../res/drawable-hdpi/abs__ic_search.png | Bin 0 -> 2280 bytes .../abs__ic_search_api_holo_light.png | Bin 0 -> 2271 bytes .../drawable-hdpi/abs__ic_voice_search.png | Bin 0 -> 2070 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 0 -> 1833 bytes .../abs__list_activated_holo.9.png | Bin 0 -> 154 bytes .../abs__list_divider_holo_dark.9.png | Bin 0 -> 78 bytes .../abs__list_divider_holo_light.9.png | Bin 0 -> 76 bytes .../abs__list_focused_holo.9.png | Bin 0 -> 159 bytes .../abs__list_longpressed_holo.9.png | Bin 0 -> 154 bytes .../abs__list_pressed_holo_dark.9.png | Bin 0 -> 159 bytes .../abs__list_pressed_holo_light.9.png | Bin 0 -> 159 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 0 -> 189 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 0 -> 189 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 0 -> 922 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 0 -> 1061 bytes .../abs__progress_bg_holo_dark.9.png | Bin 0 -> 178 bytes .../abs__progress_bg_holo_light.9.png | Bin 0 -> 174 bytes .../abs__progress_primary_holo_dark.9.png | Bin 0 -> 917 bytes .../abs__progress_primary_holo_light.9.png | Bin 0 -> 917 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 0 -> 188 bytes .../abs__progress_secondary_holo_light.9.png | Bin 0 -> 188 bytes .../abs__spinner_48_inner_holo.png | Bin 0 -> 2081 bytes .../abs__spinner_48_outer_holo.png | Bin 0 -> 1811 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 0 -> 311 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 0 -> 312 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 0 -> 306 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 0 -> 306 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 0 -> 524 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 0 -> 523 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 0 -> 464 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 0 -> 458 bytes .../abs__tab_selected_focused_holo.9.png | Bin 0 -> 147 bytes .../abs__tab_selected_holo.9.png | Bin 0 -> 148 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 0 -> 147 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 0 -> 145 bytes ...__textfield_search_default_holo_dark.9.png | Bin 0 -> 110 bytes ..._textfield_search_default_holo_light.9.png | Bin 0 -> 105 bytes ...field_search_right_default_holo_dark.9.png | Bin 0 -> 108 bytes ...ield_search_right_default_holo_light.9.png | Bin 0 -> 103 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 0 -> 114 bytes ...eld_search_right_selected_holo_light.9.png | Bin 0 -> 111 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 0 -> 114 bytes ...textfield_search_selected_holo_light.9.png | Bin 0 -> 112 bytes .../abs__ab_bottom_solid_dark_holo.9.png | Bin 0 -> 134 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 0 -> 129 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 0 -> 134 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 0 -> 123 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 0 -> 123 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 0 -> 2849 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 0 -> 191 bytes .../abs__ab_solid_dark_holo.9.png | Bin 0 -> 133 bytes .../abs__ab_solid_light_holo.9.png | Bin 0 -> 133 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 0 -> 168 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 0 -> 134 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 0 -> 133 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 0 -> 127 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 0 -> 123 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 0 -> 139 bytes .../abs__ab_transparent_light_holo.9.png | Bin 0 -> 133 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 0 -> 101 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 0 -> 99 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 0 -> 109 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 0 -> 105 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 0 -> 107 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 0 -> 105 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 0 -> 127 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 0 -> 124 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 0 -> 130 bytes .../abs__cab_background_top_holo_light.9.png | Bin 0 -> 128 bytes .../abs__dialog_full_holo_dark.9.png | Bin 0 -> 882 bytes .../abs__dialog_full_holo_light.9.png | Bin 0 -> 1003 bytes .../abs__ic_ab_back_holo_dark.png | Bin 0 -> 466 bytes .../abs__ic_ab_back_holo_light.png | Bin 0 -> 438 bytes .../abs__ic_cab_done_holo_dark.png | Bin 0 -> 566 bytes .../abs__ic_cab_done_holo_light.png | Bin 0 -> 552 bytes .../drawable-mdpi/abs__ic_clear_disabled.png | Bin 0 -> 1775 bytes .../drawable-mdpi/abs__ic_clear_normal.png | Bin 0 -> 1869 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 0 -> 740 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 0 -> 743 bytes .../library/res/drawable-mdpi/abs__ic_go.png | Bin 0 -> 1538 bytes .../abs__ic_go_search_api_holo_light.png | Bin 0 -> 570 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 0 -> 122 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 0 -> 131 bytes .../abs__ic_menu_share_holo_dark.png | Bin 0 -> 332 bytes .../abs__ic_menu_share_holo_light.png | Bin 0 -> 355 bytes .../res/drawable-mdpi/abs__ic_search.png | Bin 0 -> 2280 bytes .../abs__ic_search_api_holo_light.png | Bin 0 -> 1541 bytes .../drawable-mdpi/abs__ic_voice_search.png | Bin 0 -> 1937 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 0 -> 794 bytes .../abs__list_activated_holo.9.png | Bin 0 -> 151 bytes .../abs__list_divider_holo_dark.9.png | Bin 0 -> 78 bytes .../abs__list_divider_holo_light.9.png | Bin 0 -> 76 bytes .../abs__list_focused_holo.9.png | Bin 0 -> 158 bytes .../abs__list_longpressed_holo.9.png | Bin 0 -> 151 bytes .../abs__list_pressed_holo_dark.9.png | Bin 0 -> 158 bytes .../abs__list_pressed_holo_light.9.png | Bin 0 -> 158 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 0 -> 172 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 0 -> 171 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 0 -> 651 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 0 -> 720 bytes .../abs__progress_bg_holo_dark.9.png | Bin 0 -> 165 bytes .../abs__progress_bg_holo_light.9.png | Bin 0 -> 159 bytes .../abs__progress_primary_holo_dark.9.png | Bin 0 -> 572 bytes .../abs__progress_primary_holo_light.9.png | Bin 0 -> 572 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 0 -> 170 bytes .../abs__progress_secondary_holo_light.9.png | Bin 0 -> 170 bytes .../abs__spinner_48_inner_holo.png | Bin 0 -> 1336 bytes .../abs__spinner_48_outer_holo.png | Bin 0 -> 1165 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 0 -> 254 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 0 -> 255 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 0 -> 249 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 0 -> 249 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 0 -> 417 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 0 -> 424 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 0 -> 370 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 0 -> 370 bytes .../abs__tab_selected_focused_holo.9.png | Bin 0 -> 148 bytes .../abs__tab_selected_holo.9.png | Bin 0 -> 151 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 0 -> 150 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 0 -> 155 bytes ...__textfield_search_default_holo_dark.9.png | Bin 0 -> 106 bytes ..._textfield_search_default_holo_light.9.png | Bin 0 -> 100 bytes ...field_search_right_default_holo_dark.9.png | Bin 0 -> 105 bytes ...ield_search_right_default_holo_light.9.png | Bin 0 -> 98 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 0 -> 107 bytes ...eld_search_right_selected_holo_light.9.png | Bin 0 -> 107 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 0 -> 109 bytes ...textfield_search_selected_holo_light.9.png | Bin 0 -> 109 bytes .../abs__progress_medium_holo.xml | 34 + .../abs__ab_bottom_solid_dark_holo.9.png | Bin 0 -> 165 bytes .../abs__ab_bottom_solid_inverse_holo.9.png | Bin 0 -> 157 bytes .../abs__ab_bottom_solid_light_holo.9.png | Bin 0 -> 166 bytes ...abs__ab_bottom_transparent_dark_holo.9.png | Bin 0 -> 153 bytes ...bs__ab_bottom_transparent_light_holo.9.png | Bin 0 -> 152 bytes .../abs__ab_share_pack_holo_dark.9.png | Bin 0 -> 2878 bytes .../abs__ab_share_pack_holo_light.9.png | Bin 0 -> 2873 bytes .../abs__ab_solid_dark_holo.9.png | Bin 0 -> 163 bytes .../abs__ab_solid_light_holo.9.png | Bin 0 -> 163 bytes .../abs__ab_solid_shadow_holo.9.png | Bin 0 -> 290 bytes .../abs__ab_stacked_solid_dark_holo.9.png | Bin 0 -> 163 bytes .../abs__ab_stacked_solid_light_holo.9.png | Bin 0 -> 163 bytes ...bs__ab_stacked_transparent_dark_holo.9.png | Bin 0 -> 158 bytes ...s__ab_stacked_transparent_light_holo.9.png | Bin 0 -> 152 bytes .../abs__ab_transparent_dark_holo.9.png | Bin 0 -> 171 bytes .../abs__ab_transparent_light_holo.9.png | Bin 0 -> 160 bytes .../abs__btn_cab_done_default_holo_dark.9.png | Bin 0 -> 109 bytes ...abs__btn_cab_done_default_holo_light.9.png | Bin 0 -> 108 bytes .../abs__btn_cab_done_focused_holo_dark.9.png | Bin 0 -> 112 bytes ...abs__btn_cab_done_focused_holo_light.9.png | Bin 0 -> 113 bytes .../abs__btn_cab_done_pressed_holo_dark.9.png | Bin 0 -> 115 bytes ...abs__btn_cab_done_pressed_holo_light.9.png | Bin 0 -> 113 bytes ...abs__cab_background_bottom_holo_dark.9.png | Bin 0 -> 166 bytes ...bs__cab_background_bottom_holo_light.9.png | Bin 0 -> 161 bytes .../abs__cab_background_top_holo_dark.9.png | Bin 0 -> 174 bytes .../abs__cab_background_top_holo_light.9.png | Bin 0 -> 161 bytes .../abs__dialog_full_holo_dark.9.png | Bin 0 -> 2159 bytes .../abs__dialog_full_holo_light.9.png | Bin 0 -> 2302 bytes .../abs__ic_ab_back_holo_dark.png | Bin 0 -> 741 bytes .../abs__ic_ab_back_holo_light.png | Bin 0 -> 661 bytes .../abs__ic_cab_done_holo_dark.png | Bin 0 -> 970 bytes .../abs__ic_cab_done_holo_light.png | Bin 0 -> 915 bytes .../drawable-xhdpi/abs__ic_clear_disabled.png | Bin 0 -> 2531 bytes ...c_clear_search_api_disabled_holo_light.png | Bin 0 -> 1315 bytes .../abs__ic_clear_search_api_holo_light.png | Bin 0 -> 1447 bytes .../library/res/drawable-xhdpi/abs__ic_go.png | Bin 0 -> 1983 bytes .../abs__ic_go_search_api_holo_light.png | Bin 0 -> 836 bytes ..._ic_menu_moreoverflow_normal_holo_dark.png | Bin 0 -> 167 bytes ...ic_menu_moreoverflow_normal_holo_light.png | Bin 0 -> 184 bytes .../abs__ic_menu_share_holo_dark.png | Bin 0 -> 699 bytes .../abs__ic_menu_share_holo_light.png | Bin 0 -> 935 bytes .../res/drawable-xhdpi/abs__ic_search.png | Bin 0 -> 3784 bytes .../abs__ic_search_api_holo_light.png | Bin 0 -> 3037 bytes .../drawable-xhdpi/abs__ic_voice_search.png | Bin 0 -> 3053 bytes .../abs__ic_voice_search_api_holo_light.png | Bin 0 -> 1414 bytes .../abs__list_activated_holo.9.png | Bin 0 -> 158 bytes .../abs__list_divider_holo_dark.9.png | Bin 0 -> 83 bytes .../abs__list_divider_holo_light.9.png | Bin 0 -> 83 bytes .../abs__list_focused_holo.9.png | Bin 0 -> 163 bytes .../abs__list_longpressed_holo.9.png | Bin 0 -> 158 bytes .../abs__list_pressed_holo_dark.9.png | Bin 0 -> 163 bytes .../abs__list_pressed_holo_light.9.png | Bin 0 -> 163 bytes ...bs__list_selector_disabled_holo_dark.9.png | Bin 0 -> 190 bytes ...s__list_selector_disabled_holo_light.9.png | Bin 0 -> 188 bytes .../abs__menu_dropdown_panel_holo_dark.9.png | Bin 0 -> 1362 bytes .../abs__menu_dropdown_panel_holo_light.9.png | Bin 0 -> 1551 bytes .../abs__progress_bg_holo_dark.9.png | Bin 0 -> 174 bytes .../abs__progress_bg_holo_light.9.png | Bin 0 -> 172 bytes .../abs__progress_primary_holo_dark.9.png | Bin 0 -> 1309 bytes .../abs__progress_primary_holo_light.9.png | Bin 0 -> 1309 bytes .../abs__progress_secondary_holo_dark.9.png | Bin 0 -> 184 bytes .../abs__progress_secondary_holo_light.9.png | Bin 0 -> 184 bytes .../abs__spinner_48_inner_holo.png | Bin 0 -> 2769 bytes .../abs__spinner_48_outer_holo.png | Bin 0 -> 2432 bytes .../abs__spinner_ab_default_holo_dark.9.png | Bin 0 -> 395 bytes .../abs__spinner_ab_default_holo_light.9.png | Bin 0 -> 394 bytes .../abs__spinner_ab_disabled_holo_dark.9.png | Bin 0 -> 381 bytes .../abs__spinner_ab_disabled_holo_light.9.png | Bin 0 -> 381 bytes .../abs__spinner_ab_focused_holo_dark.9.png | Bin 0 -> 680 bytes .../abs__spinner_ab_focused_holo_light.9.png | Bin 0 -> 671 bytes .../abs__spinner_ab_pressed_holo_dark.9.png | Bin 0 -> 609 bytes .../abs__spinner_ab_pressed_holo_light.9.png | Bin 0 -> 602 bytes .../abs__tab_selected_focused_holo.9.png | Bin 0 -> 147 bytes .../abs__tab_selected_holo.9.png | Bin 0 -> 153 bytes .../abs__tab_selected_pressed_holo.9.png | Bin 0 -> 147 bytes .../abs__tab_unselected_pressed_holo.9.png | Bin 0 -> 149 bytes ...__textfield_search_default_holo_dark.9.png | Bin 0 -> 126 bytes ..._textfield_search_default_holo_light.9.png | Bin 0 -> 126 bytes ...field_search_right_default_holo_dark.9.png | Bin 0 -> 125 bytes ...ield_search_right_default_holo_light.9.png | Bin 0 -> 127 bytes ...ield_search_right_selected_holo_dark.9.png | Bin 0 -> 128 bytes ...eld_search_right_selected_holo_light.9.png | Bin 0 -> 128 bytes ..._textfield_search_selected_holo_dark.9.png | Bin 0 -> 114 bytes ...textfield_search_selected_holo_light.9.png | Bin 0 -> 126 bytes .../abs__activated_background_holo_dark.xml | 20 + .../abs__activated_background_holo_light.xml | 20 + .../drawable/abs__btn_cab_done_holo_dark.xml | 24 + .../drawable/abs__btn_cab_done_holo_light.xml | 24 + .../library/res/drawable/abs__ic_clear.xml | 22 + .../res/drawable/abs__ic_clear_holo_light.xml | 22 + .../abs__ic_menu_moreoverflow_holo_dark.xml | 18 + .../abs__ic_menu_moreoverflow_holo_light.xml | 18 + .../abs__item_background_holo_dark.xml | 26 + .../abs__item_background_holo_light.xml | 26 + ...lector_background_transition_holo_dark.xml | 20 + ...ector_background_transition_holo_light.xml | 20 + .../drawable/abs__list_selector_holo_dark.xml | 27 + .../abs__list_selector_holo_light.xml | 28 + .../abs__progress_horizontal_holo_dark.xml | 32 + .../abs__progress_horizontal_holo_light.xml | 32 + .../drawable/abs__progress_medium_holo.xml | 34 + .../drawable/abs__search_dropdown_dark.xml | 22 + .../drawable/abs__search_dropdown_light.xml | 22 + .../drawable/abs__spinner_ab_holo_dark.xml | 25 + .../drawable/abs__spinner_ab_holo_light.xml | 25 + .../drawable/abs__tab_indicator_ab_holo.xml | 34 + .../abs__textfield_searchview_holo_dark.xml | 22 + .../abs__textfield_searchview_holo_light.xml | 22 + ...__textfield_searchview_right_holo_dark.xml | 22 + ..._textfield_searchview_right_holo_light.xml | 22 + .../abs__action_mode_close_item.xml | 40 + .../sherlock_spinner_dropdown_item.xml | 26 + .../res/layout-v14/sherlock_spinner_item.xml | 26 + .../layout-xlarge/abs__screen_action_bar.xml | 50 + .../abs__screen_action_bar_overlay.xml | 49 + .../res/layout/abs__action_bar_home.xml | 38 + .../res/layout/abs__action_bar_tab.xml | 7 + .../layout/abs__action_bar_tab_bar_view.xml | 6 + .../res/layout/abs__action_bar_title_item.xml | 50 + .../layout/abs__action_menu_item_layout.xml | 56 + .../res/layout/abs__action_menu_layout.xml | 23 + .../res/layout/abs__action_mode_bar.xml | 24 + .../layout/abs__action_mode_close_item.xml | 31 + .../res/layout/abs__activity_chooser_view.xml | 70 + .../abs__activity_chooser_view_list_item.xml | 53 + .../res/layout/abs__dialog_title_holo.xml | 46 + .../layout/abs__list_menu_item_checkbox.xml | 26 + .../res/layout/abs__list_menu_item_icon.xml | 28 + .../res/layout/abs__list_menu_item_layout.xml | 59 + .../res/layout/abs__list_menu_item_radio.xml | 24 + .../layout/abs__popup_menu_item_layout.xml | 60 + .../res/layout/abs__screen_action_bar.xml | 57 + .../layout/abs__screen_action_bar_overlay.xml | 59 + .../library/res/layout/abs__screen_simple.xml | 38 + ...abs__screen_simple_overlay_action_mode.xml | 38 + .../abs__search_dropdown_item_icons_2line.xml | 89 + .../library/res/layout/abs__search_view.xml | 159 ++ .../res/layout/abs__simple_dropdown_hint.xml | 29 + .../layout/sherlock_spinner_dropdown_item.xml | 26 + .../res/layout/sherlock_spinner_item.xml | 26 + .../library/res/values-land/abs__dimens.xml | 33 + .../abs__dimens.xml | 33 + .../abs__dimens.xml | 33 + .../abs__dimens.xml | 33 + .../abs__dimens.xml | 36 + .../library/res/values-large/abs__dimens.xml | 29 + .../library/res/values-sw600dp/abs__bools.xml | 19 + .../res/values-sw600dp/abs__dimens.xml | 38 + .../library/res/values-v11/abs__themes.xml | 12 + .../library/res/values-v14/abs__styles.xml | 123 ++ .../library/res/values-v14/abs__themes.xml | 34 + .../library/res/values-w360dp/abs__dimens.xml | 22 + .../library/res/values-w480dp/abs__bools.xml | 22 + .../library/res/values-w480dp/abs__config.xml | 29 + .../library/res/values-w500dp/abs__dimens.xml | 22 + .../library/res/values-w600dp/abs__dimens.xml | 22 + .../library/res/values-xlarge/abs__dimens.xml | 45 + .../library/res/values/abs__attrs.xml | 432 ++++ .../library/res/values/abs__bools.xml | 22 + .../library/res/values/abs__colors.xml | 27 + .../library/res/values/abs__config.xml | 43 + .../library/res/values/abs__dimens.xml | 67 + .../library/res/values/abs__ids.xml | 26 + .../library/res/values/abs__strings.xml | 53 + .../library/res/values/abs__styles.xml | 412 ++++ .../library/res/values/abs__themes.xml | 239 +++ .../src/android/support/v4/app/Watson.java | 144 ++ .../actionbarsherlock/ActionBarSherlock.java | 794 +++++++ .../com/actionbarsherlock/app/ActionBar.java | 956 +++++++++ .../app/SherlockActivity.java | 270 +++ .../app/SherlockDialogFragment.java | 68 + .../app/SherlockExpandableListActivity.java | 259 +++ .../app/SherlockFragment.java | 68 + .../app/SherlockFragmentActivity.java | 303 +++ .../app/SherlockListActivity.java | 270 +++ .../app/SherlockListFragment.java | 68 + .../app/SherlockPreferenceActivity.java | 270 +++ .../internal/ActionBarSherlockCompat.java | 1203 +++++++++++ .../internal/ActionBarSherlockNative.java | 336 +++ .../internal/ResourcesCompat.java | 95 + .../internal/app/ActionBarImpl.java | 1026 +++++++++ .../internal/app/ActionBarWrapper.java | 468 +++++ .../nineoldandroids/animation/Animator.java | 278 +++ .../animation/AnimatorListenerAdapter.java | 54 + .../animation/AnimatorSet.java | 1111 ++++++++++ .../animation/FloatEvaluator.java | 42 + .../animation/FloatKeyframeSet.java | 136 ++ .../animation/IntEvaluator.java | 42 + .../animation/IntKeyframeSet.java | 135 ++ .../nineoldandroids/animation/Keyframe.java | 361 ++++ .../animation/KeyframeSet.java | 227 ++ .../animation/ObjectAnimator.java | 491 +++++ .../animation/PropertyValuesHolder.java | 1012 +++++++++ .../animation/TypeEvaluator.java | 44 + .../animation/ValueAnimator.java | 1265 +++++++++++ .../nineoldandroids/view/NineViewGroup.java | 79 + .../view/animation/AnimatorProxy.java | 212 ++ .../widget/NineFrameLayout.java | 57 + .../widget/NineHorizontalScrollView.java | 41 + .../widget/NineLinearLayout.java | 57 + .../internal/view/ActionProviderWrapper.java | 40 + .../internal/view/StandaloneActionMode.java | 148 ++ .../view/View_HasStateListenerSupport.java | 6 + .../View_OnAttachStateChangeListener.java | 8 + .../internal/view/menu/ActionMenu.java | 264 +++ .../internal/view/menu/ActionMenuItem.java | 278 +++ .../view/menu/ActionMenuItemView.java | 295 +++ .../view/menu/ActionMenuPresenter.java | 714 +++++++ .../internal/view/menu/ActionMenuView.java | 575 +++++ .../internal/view/menu/BaseMenuPresenter.java | 231 ++ .../internal/view/menu/ListMenuItemView.java | 278 +++ .../internal/view/menu/MenuBuilder.java | 1335 ++++++++++++ .../internal/view/menu/MenuItemImpl.java | 647 ++++++ .../internal/view/menu/MenuItemWrapper.java | 310 +++ .../internal/view/menu/MenuPopupHelper.java | 376 ++++ .../internal/view/menu/MenuPresenter.java | 148 ++ .../internal/view/menu/MenuView.java | 120 ++ .../internal/view/menu/MenuWrapper.java | 185 ++ .../internal/view/menu/SubMenuBuilder.java | 134 ++ .../internal/view/menu/SubMenuWrapper.java | 72 + .../internal/widget/AbsActionBarView.java | 291 +++ .../internal/widget/ActionBarContainer.java | 258 +++ .../internal/widget/ActionBarContextView.java | 518 +++++ .../internal/widget/ActionBarView.java | 1548 ++++++++++++++ .../internal/widget/CapitalizingButton.java | 40 + .../internal/widget/CapitalizingTextView.java | 50 + .../widget/CollapsibleActionViewWrapper.java | 30 + .../widget/FakeDialogPhoneWindow.java | 64 + .../internal/widget/IcsAbsSpinner.java | 479 +++++ .../internal/widget/IcsAdapterView.java | 1160 ++++++++++ .../internal/widget/IcsColorDrawable.java | 41 + .../internal/widget/IcsLinearLayout.java | 410 ++++ .../internal/widget/IcsListPopupWindow.java | 644 ++++++ .../internal/widget/IcsProgressBar.java | 1193 +++++++++++ .../internal/widget/IcsSpinner.java | 703 +++++++ .../internal/widget/IcsView.java | 21 + .../widget/ScrollingTabContainerView.java | 546 +++++ .../actionbarsherlock/view/ActionMode.java | 224 ++ .../view/ActionProvider.java | 170 ++ .../view/CollapsibleActionView.java | 39 + .../src/com/actionbarsherlock/view/Menu.java | 447 ++++ .../actionbarsherlock/view/MenuInflater.java | 495 +++++ .../com/actionbarsherlock/view/MenuItem.java | 598 ++++++ .../com/actionbarsherlock/view/SubMenu.java | 110 + .../com/actionbarsherlock/view/Window.java | 65 + .../widget/ActivityChooserModel.java | 1104 ++++++++++ .../widget/ActivityChooserView.java | 827 ++++++++ .../actionbarsherlock/widget/SearchView.java | 1811 ++++++++++++++++ .../widget/ShareActionProvider.java | 316 +++ .../widget/SuggestionsAdapter.java | 733 +++++++ .../internal/ManifestParsingTest.java | 37 + .../android/plugins/ActionBarSherlock/pom.xml | 191 ++ .../agents/ios/android/proguard-project.txt | 20 + .../agents/ios/android/project.properties | 15 + .../android/res/drawable-hdpi/ic_bookmark.png | Bin 0 -> 4960 bytes .../res/drawable-hdpi/ic_check_default.png | Bin 0 -> 5701 bytes .../res/drawable-hdpi/ic_check_selected.png | Bin 0 -> 8100 bytes .../android/res/drawable-hdpi/ic_launcher.png | Bin 0 -> 4327 bytes .../ios/android/res/drawable-hdpi/ic_logo.png | Bin 0 -> 4699 bytes .../res/drawable-hdpi/ic_logo_dark.png | Bin 0 -> 4699 bytes .../android/res/drawable-hdpi/ic_stat_gcm.png | Bin 0 -> 1135 bytes .../android/res/drawable-hdpi/option_icon.png | Bin 0 -> 5344 bytes .../android/res/drawable-hdpi/repeat_bg.png | Bin 0 -> 7114 bytes .../ios/android/res/drawable-hdpi/top_bar.png | Bin 0 -> 34395 bytes .../android/res/drawable-mdpi/ic_bookmark.png | Bin 0 -> 2919 bytes .../res/drawable-mdpi/ic_check_default.png | Bin 0 -> 3090 bytes .../res/drawable-mdpi/ic_check_selected.png | Bin 0 -> 4182 bytes .../android/res/drawable-mdpi/ic_launcher.png | Bin 0 -> 2425 bytes .../ios/android/res/drawable-mdpi/ic_logo.png | Bin 0 -> 3104 bytes .../res/drawable-mdpi/ic_logo_dark.png | Bin 0 -> 3104 bytes .../android/res/drawable-mdpi/option_icon.png | Bin 0 -> 2894 bytes .../ios/android/res/drawable-mdpi/top_bar.png | Bin 0 -> 20898 bytes .../android/res/drawable-xhdpi/appinstall.png | Bin 0 -> 11231 bytes .../android/res/drawable-xhdpi/applist.png | Bin 0 -> 11689 bytes .../res/drawable-xhdpi/appuninstall.png | Bin 0 -> 10092 bytes .../ios/android/res/drawable-xhdpi/camera.png | Bin 0 -> 15565 bytes .../res/drawable-xhdpi/changepassword.png | Bin 0 -> 15692 bytes .../android/res/drawable-xhdpi/encrypt.png | Bin 0 -> 9196 bytes .../res/drawable-xhdpi/ic_bookmark.png | Bin 0 -> 7078 bytes .../res/drawable-xhdpi/ic_check_default.png | Bin 0 -> 8569 bytes .../res/drawable-xhdpi/ic_check_selected.png | Bin 0 -> 12609 bytes .../res/drawable-xhdpi/ic_launcher.png | Bin 0 -> 5994 bytes .../android/res/drawable-xhdpi/ic_logo.png | Bin 0 -> 6475 bytes .../res/drawable-xhdpi/ic_logo_dark.png | Bin 0 -> 6475 bytes .../ios/android/res/drawable-xhdpi/info.png | Bin 0 -> 12733 bytes .../android/res/drawable-xhdpi/location.png | Bin 0 -> 13926 bytes .../ios/android/res/drawable-xhdpi/lock.png | Bin 0 -> 7210 bytes .../ios/android/res/drawable-xhdpi/mute.png | Bin 0 -> 18880 bytes .../res/drawable-xhdpi/notification.png | Bin 0 -> 10763 bytes .../android/res/drawable-xhdpi/repeat_bg.png | Bin 0 -> 16939 bytes .../ios/android/res/drawable-xhdpi/wifi.png | Bin 0 -> 8153 bytes .../ios/android/res/drawable-xhdpi/wipe.png | Bin 0 -> 14301 bytes .../res/drawable-xxhdpi/ic_bookmark.png | Bin 0 -> 11958 bytes .../res/drawable-xxhdpi/ic_check_default.png | Bin 0 -> 15668 bytes .../res/drawable-xxhdpi/ic_check_selected.png | Bin 0 -> 23206 bytes .../res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 9581 bytes .../android/res/drawable-xxhdpi/ic_logo.png | Bin 0 -> 10459 bytes .../res/drawable-xxhdpi/ic_logo_dark.png | Bin 0 -> 10459 bytes .../android/res/drawable-xxhdpi/repeat_bg.png | Bin 0 -> 18591 bytes .../ios/android/res/drawable/btn_grey.xml | 37 + .../ios/android/res/drawable/btn_orange.xml | 37 + .../android/res/drawable/custom_checkbox.xml | 5 + .../agents/ios/android/res/drawable/dot.png | Bin 0 -> 85 bytes .../ios/android/res/drawable/mdm_logo.xml | 10 + .../res/layout/activity_agent_settings.xml | 26 + .../ios/android/res/layout/activity_alert.xml | 35 + .../layout/activity_already_registered.xml | 96 + .../res/layout/activity_authentication.xml | 123 ++ .../layout/activity_authentication_error.xml | 91 + .../layout/activity_available_operations.xml | 25 + .../layout/activity_display_device_info.xml | 110 + .../ios/android/res/layout/activity_entry.xml | 55 + .../ios/android/res/layout/activity_log.xml | 37 + .../ios/android/res/layout/activity_main.xml | 130 ++ .../res/layout/activity_notification.xml | 30 + .../android/res/layout/activity_pin_code.xml | 123 ++ .../layout/activity_register_successful.xml | 100 + .../android/res/layout/activity_settings.xml | 122 ++ .../res/layout/custom_sherlock_bar.xml | 14 + .../android/res/layout/custom_terms_popup.xml | 55 + .../ios/android/res/layout/footer_repeat.xml | 4 + .../android/res/layout/header_gradient.xml | 9 + .../agents/ios/android/res/layout/login.xml | 77 + .../agents/ios/android/res/layout/main.xml | 12 + .../agents/ios/android/res/layout/notify.xml | 93 + .../ios/android/res/layout/row_with_icon.xml | 26 + .../ios/android/res/layout/simplerow.xml | 8 + .../ios/android/res/menu/agent_settings.xml | 9 + .../agents/ios/android/res/menu/alert.xml | 9 + .../android/res/menu/all_ready_registered.xml | 9 + .../android/res/menu/auth_sherlock_menu.xml | 15 + .../ios/android/res/menu/authentication.xml | 9 + .../android/res/menu/authentication_error.xml | 9 + .../android/res/menu/available_operations.xml | 9 + .../android/res/menu/display_device_info.xml | 9 + .../agents/ios/android/res/menu/entry.xml | 9 + .../agents/ios/android/res/menu/log.xml | 9 + .../agents/ios/android/res/menu/main.xml | 9 + .../ios/android/res/menu/notification.xml | 9 + .../agents/ios/android/res/menu/notify.xml | 9 + .../ios/android/res/menu/options_menu.xml | 5 + .../agents/ios/android/res/menu/pin_code.xml | 9 + .../android/res/menu/register_successful.xml | 9 + .../agents/ios/android/res/menu/settings.xml | 9 + .../ios/android/res/menu/sherlock_menu.xml | 19 + .../android/res/menu/sherlock_menu_debug.xml | 28 + .../ios/android/res/raw/emm_truststore.bks | Bin 0 -> 29 bytes .../ios/android/res/values-sw600dp/dimens.xml | 8 + .../res/values-sw720dp-land/dimens.xml | 9 + .../ios/android/res/values-v11/styles.xml | 11 + .../ios/android/res/values-v14/styles.xml | 12 + .../agents/ios/android/res/values/colors.xml | 7 + .../agents/ios/android/res/values/dimens.xml | 7 + .../agents/ios/android/res/values/ids.xml | 65 + .../agents/ios/android/res/values/strings.xml | 174 ++ .../agents/ios/android/res/values/styles.xml | 64 + .../ios/android/res/xml/wso2_device_admin.xml | 12 + .../src/org/wso2/cdm/agent/AlertActivity.java | 63 + .../cdm/agent/AlreadyRegisteredActivity.java | 533 +++++ .../cdm/agent/AuthenticationActivity.java | 934 +++++++++ .../agent/AuthenticationErrorActivity.java | 130 ++ .../cdm/agent/DisplayDeviceInfoActivity.java | 138 ++ .../org/wso2/cdm/agent/GCMIntentService.java | 146 ++ .../src/org/wso2/cdm/agent/LogActivity.java | 76 + .../org/wso2/cdm/agent/NotifyActivity.java | 69 + .../org/wso2/cdm/agent/PinCodeActivity.java | 308 +++ .../wso2/cdm/agent/RegistrationActivity.java | 283 +++ .../src/org/wso2/cdm/agent/ServerDetails.java | 333 +++ .../cdm/agent/api/ApplicationManager.java | 243 +++ .../src/org/wso2/cdm/agent/api/Battery.java | 59 + .../org/wso2/cdm/agent/api/DeviceInfo.java | 348 +++ .../src/org/wso2/cdm/agent/api/ExecShell.java | 74 + .../org/wso2/cdm/agent/api/GPSTracker.java | 213 ++ .../wso2/cdm/agent/api/LocationServices.java | 44 + .../org/wso2/cdm/agent/api/PhoneState.java | 252 +++ .../src/org/wso2/cdm/agent/api/Root.java | 80 + .../org/wso2/cdm/agent/api/TrackCallSMS.java | 138 ++ .../org/wso2/cdm/agent/api/TrafficRecord.java | 36 + .../wso2/cdm/agent/api/TrafficSnapshot.java | 43 + .../org/wso2/cdm/agent/api/WiFiConfig.java | 798 +++++++ .../src/org/wso2/cdm/agent/models/PInfo.java | 30 + .../wso2/cdm/agent/parser/PayloadParser.java | 74 + .../cdm/agent/proxy/APIAccessCallBack.java | 12 + .../wso2/cdm/agent/proxy/APIController.java | 93 + .../cdm/agent/proxy/APIResultCallBack.java | 8 + .../wso2/cdm/agent/proxy/APIUtilities.java | 27 + .../cdm/agent/proxy/AccessTokenHandler.java | 135 ++ .../org/wso2/cdm/agent/proxy/CallBack.java | 26 + .../wso2/cdm/agent/proxy/IdentityProxy.java | 148 ++ .../cdm/agent/proxy/RefreshTokenHandler.java | 122 ++ .../wso2/cdm/agent/proxy/ServerUtilities.java | 235 +++ .../cdm/agent/proxy/ServerUtilitiesTemp.java | 315 +++ .../src/org/wso2/cdm/agent/proxy/Token.java | 94 + .../wso2/cdm/agent/proxy/TokenCallBack.java | 6 + .../agent/security/APIResultCallBackImpl.java | 100 + .../cdm/agent/services/AlarmReceiver.java | 45 + .../org/wso2/cdm/agent/services/Config.java | 22 + .../services/DeviceStartupIntentReceiver.java | 74 + .../wso2/cdm/agent/services/Operation.java | 1857 +++++++++++++++++ .../wso2/cdm/agent/services/PolicyTester.java | 740 +++++++ .../cdm/agent/services/ProcessMessage.java | 249 +++ .../wso2/cdm/agent/services/SMSReceiver.java | 66 + .../services/WSO2DeviceAdminReceiver.java | 137 ++ .../cdm/agent/utils/CommonDialogUtils.java | 159 ++ .../wso2/cdm/agent/utils/CommonUtilities.java | 194 ++ .../src/org/wso2/cdm/agent/utils/Errors.java | 45 + .../cdm/agent/utils/HTTPConnectorUtils.java | 288 +++ .../wso2/cdm/agent/utils/LoggerCustom.java | 62 + .../org/wso2/cdm/agent/utils/Preference.java | 30 + .../org/wso2/cdm/agent/utils/ServerUtils.java | 141 ++ .../cdm/agent/utils/WSO2SSLSocketFactory.java | 64 + 1281 files changed, 106710 insertions(+) create mode 100644 product/modules/agents/android/client/AndroidManifest.xml create mode 100644 product/modules/agents/android/client/README.md create mode 100644 product/modules/agents/android/client/assets/config.properties create mode 100644 product/modules/agents/android/client/bin/AndroidManifest.xml create mode 100644 product/modules/agents/android/client/bin/R.txt create mode 100644 product/modules/agents/android/client/bin/jarlist.cache create mode 100644 product/modules/agents/android/client/libs/android-support-v4.jar create mode 100644 product/modules/agents/android/client/libs/commons-codec-1.2.jar create mode 100644 product/modules/agents/android/client/libs/gcm.jar create mode 100644 product/modules/agents/android/client/libs/json-simple-1.1.1.jar create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/.gitignore create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/.travis.yml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/CHANGELOG.md create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/CONTRIBUTING.md create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/LICENSE.txt create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/README.md create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/checkstyle.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/AndroidManifest.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/README.md create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/build.gradle create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/libs/android-support-v4.jar create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/pom.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/project.properties create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_dark.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_light.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_dark.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_light.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_solid_inverse_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_solid_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_solid_shadow_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_solid_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_solid_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_transparent_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_default_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_default_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_focused_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_focused_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__dialog_full_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_cab_done_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_disabled.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_normal.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_go.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_go_search_api_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_share_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_search.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_search_api_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_voice_search.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_activated_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_divider_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_divider_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_focused_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_longpressed_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_selector_disabled_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_bg_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_bg_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_primary_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_primary_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_48_inner_holo.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_48_outer_holo.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_pressed_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_pressed_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_default_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_default_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_default_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_solid_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_solid_inverse_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_transparent_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_transparent_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_focused_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_bottom_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_top_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_top_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__dialog_full_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__dialog_full_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_ab_back_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_cab_done_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_disabled.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_normal.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_search_api_disabled_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_go.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_menu_share_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_search.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_search_api_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_voice_search.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_voice_search_api_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_activated_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_divider_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_divider_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_focused_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_longpressed_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_bg_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_bg_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_primary_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_primary_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_secondary_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_secondary_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_48_inner_holo.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_48_outer_holo.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_default_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_disabled_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_disabled_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_focused_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_pressed_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_unselected_pressed_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_default_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-v11/abs__progress_medium_holo.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_solid_inverse_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_transparent_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_share_pack_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_top_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_top_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_ab_back_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_cab_done_holo_dark.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_cab_done_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_clear_disabled.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_clear_search_api_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_go.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_go_search_api_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_search.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_search_api_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_voice_search.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_voice_search_api_holo_light.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_activated_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_divider_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_divider_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_focused_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_longpressed_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_pressed_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_selector_disabled_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_bg_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_primary_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_secondary_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_48_inner_holo.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_48_outer_holo.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_focused_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_selected_focused_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_selected_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_unselected_pressed_holo.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_default_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_default_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_selected_holo_dark.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_selected_holo_light.9.png create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_dark.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_light.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_dark.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_light.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear_holo_light.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_dark.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_light.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_dark.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_light.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_dark.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_light.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_dark.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_light.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__progress_medium_holo.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_dark.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_light.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_dark.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_light.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__tab_indicator_ab_holo.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_dark.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_light.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_dark.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_light.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-large/abs__action_mode_close_item.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_dropdown_item.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_item.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar_overlay.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_home.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab_bar_view.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_title_item.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_menu_item_layout.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_menu_layout.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_mode_bar.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_mode_close_item.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view_list_item.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__dialog_title_holo.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_checkbox.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_icon.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_layout.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_radio.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__popup_menu_item_layout.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar_overlay.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__screen_simple.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__screen_simple_overlay_action_mode.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__search_dropdown_item_icons_2line.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__search_view.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__simple_dropdown_hint.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_dropdown_item.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_item.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-land/abs__dimens.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large-hdpi-1024x600/abs__dimens.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large-land-hdpi-1024x600/abs__dimens.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large-land-mdpi-1024x600/abs__dimens.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large-mdpi-1024x600/abs__dimens.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large/abs__dimens.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-sw600dp/abs__bools.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-sw600dp/abs__dimens.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-v11/abs__themes.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-v14/abs__styles.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-v14/abs__themes.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w360dp/abs__dimens.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w480dp/abs__bools.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w480dp/abs__config.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w500dp/abs__dimens.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w600dp/abs__dimens.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-xlarge/abs__dimens.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__attrs.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__bools.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__colors.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__config.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__dimens.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__ids.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__strings.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__styles.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__themes.xml create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/android/support/v4/app/Watson.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/ActionBarSherlock.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/ActionBar.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockActivity.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockDialogFragment.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragment.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragmentActivity.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListActivity.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListFragment.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ResourcesCompat.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarImpl.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/ActionProviderWrapper.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/StandaloneActionMode.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_HasStateListenerSupport.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_OnAttachStateChangeListener.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuView.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/AbsActionBarView.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContextView.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarView.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingTextView.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CollapsibleActionViewWrapper.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAbsSpinner.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAdapterView.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsProgressBar.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsSpinner.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsView.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionMode.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionProvider.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/CollapsibleActionView.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Menu.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuInflater.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuItem.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/SubMenu.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Window.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserModel.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserView.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SearchView.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ShareActionProvider.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SuggestionsAdapter.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/library/test/com/actionbarsherlock/internal/ManifestParsingTest.java create mode 100644 product/modules/agents/android/client/plugins/ActionBarSherlock/pom.xml create mode 100644 product/modules/agents/android/client/proguard-project.txt create mode 100644 product/modules/agents/android/client/project.properties create mode 100644 product/modules/agents/android/client/res/drawable-hdpi/ic_bookmark.png create mode 100644 product/modules/agents/android/client/res/drawable-hdpi/ic_check_default.png create mode 100644 product/modules/agents/android/client/res/drawable-hdpi/ic_check_selected.png create mode 100644 product/modules/agents/android/client/res/drawable-hdpi/ic_launcher.png create mode 100644 product/modules/agents/android/client/res/drawable-hdpi/ic_logo.png create mode 100644 product/modules/agents/android/client/res/drawable-hdpi/ic_logo_dark.png create mode 100644 product/modules/agents/android/client/res/drawable-hdpi/ic_stat_gcm.png create mode 100644 product/modules/agents/android/client/res/drawable-hdpi/option_icon.png create mode 100644 product/modules/agents/android/client/res/drawable-hdpi/repeat_bg.png create mode 100644 product/modules/agents/android/client/res/drawable-hdpi/top_bar.png create mode 100644 product/modules/agents/android/client/res/drawable-mdpi/ic_bookmark.png create mode 100644 product/modules/agents/android/client/res/drawable-mdpi/ic_check_default.png create mode 100644 product/modules/agents/android/client/res/drawable-mdpi/ic_check_selected.png create mode 100644 product/modules/agents/android/client/res/drawable-mdpi/ic_launcher.png create mode 100644 product/modules/agents/android/client/res/drawable-mdpi/ic_logo.png create mode 100644 product/modules/agents/android/client/res/drawable-mdpi/ic_logo_dark.png create mode 100644 product/modules/agents/android/client/res/drawable-mdpi/option_icon.png create mode 100644 product/modules/agents/android/client/res/drawable-mdpi/top_bar.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/appinstall.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/applist.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/appuninstall.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/camera.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/changepassword.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/encrypt.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/ic_bookmark.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/ic_check_default.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/ic_check_selected.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/ic_launcher.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/ic_logo.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/ic_logo_dark.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/info.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/location.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/lock.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/mute.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/notification.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/repeat_bg.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/wifi.png create mode 100644 product/modules/agents/android/client/res/drawable-xhdpi/wipe.png create mode 100644 product/modules/agents/android/client/res/drawable-xxhdpi/ic_bookmark.png create mode 100644 product/modules/agents/android/client/res/drawable-xxhdpi/ic_check_default.png create mode 100644 product/modules/agents/android/client/res/drawable-xxhdpi/ic_check_selected.png create mode 100644 product/modules/agents/android/client/res/drawable-xxhdpi/ic_launcher.png create mode 100644 product/modules/agents/android/client/res/drawable-xxhdpi/ic_logo.png create mode 100644 product/modules/agents/android/client/res/drawable-xxhdpi/ic_logo_dark.png create mode 100644 product/modules/agents/android/client/res/drawable-xxhdpi/repeat_bg.png create mode 100644 product/modules/agents/android/client/res/drawable/btn_grey.xml create mode 100644 product/modules/agents/android/client/res/drawable/btn_orange.xml create mode 100644 product/modules/agents/android/client/res/drawable/custom_checkbox.xml create mode 100644 product/modules/agents/android/client/res/drawable/dot.png create mode 100644 product/modules/agents/android/client/res/drawable/mdm_logo.xml create mode 100644 product/modules/agents/android/client/res/layout/activity_agent_settings.xml create mode 100644 product/modules/agents/android/client/res/layout/activity_alert.xml create mode 100644 product/modules/agents/android/client/res/layout/activity_already_registered.xml create mode 100644 product/modules/agents/android/client/res/layout/activity_authentication.xml create mode 100644 product/modules/agents/android/client/res/layout/activity_authentication_error.xml create mode 100644 product/modules/agents/android/client/res/layout/activity_available_operations.xml create mode 100644 product/modules/agents/android/client/res/layout/activity_display_device_info.xml create mode 100644 product/modules/agents/android/client/res/layout/activity_entry.xml create mode 100644 product/modules/agents/android/client/res/layout/activity_log.xml create mode 100644 product/modules/agents/android/client/res/layout/activity_main.xml create mode 100644 product/modules/agents/android/client/res/layout/activity_notification.xml create mode 100644 product/modules/agents/android/client/res/layout/activity_pin_code.xml create mode 100644 product/modules/agents/android/client/res/layout/activity_register_successful.xml create mode 100644 product/modules/agents/android/client/res/layout/activity_settings.xml create mode 100644 product/modules/agents/android/client/res/layout/custom_sherlock_bar.xml create mode 100644 product/modules/agents/android/client/res/layout/custom_terms_popup.xml create mode 100644 product/modules/agents/android/client/res/layout/footer_repeat.xml create mode 100644 product/modules/agents/android/client/res/layout/header_gradient.xml create mode 100644 product/modules/agents/android/client/res/layout/login.xml create mode 100644 product/modules/agents/android/client/res/layout/main.xml create mode 100644 product/modules/agents/android/client/res/layout/notify.xml create mode 100644 product/modules/agents/android/client/res/layout/row_with_icon.xml create mode 100644 product/modules/agents/android/client/res/layout/simplerow.xml create mode 100644 product/modules/agents/android/client/res/menu/agent_settings.xml create mode 100644 product/modules/agents/android/client/res/menu/alert.xml create mode 100644 product/modules/agents/android/client/res/menu/all_ready_registered.xml create mode 100644 product/modules/agents/android/client/res/menu/auth_sherlock_menu.xml create mode 100644 product/modules/agents/android/client/res/menu/authentication.xml create mode 100644 product/modules/agents/android/client/res/menu/authentication_error.xml create mode 100644 product/modules/agents/android/client/res/menu/available_operations.xml create mode 100644 product/modules/agents/android/client/res/menu/display_device_info.xml create mode 100644 product/modules/agents/android/client/res/menu/entry.xml create mode 100644 product/modules/agents/android/client/res/menu/log.xml create mode 100644 product/modules/agents/android/client/res/menu/main.xml create mode 100644 product/modules/agents/android/client/res/menu/notification.xml create mode 100644 product/modules/agents/android/client/res/menu/notify.xml create mode 100644 product/modules/agents/android/client/res/menu/options_menu.xml create mode 100644 product/modules/agents/android/client/res/menu/pin_code.xml create mode 100644 product/modules/agents/android/client/res/menu/register_successful.xml create mode 100644 product/modules/agents/android/client/res/menu/settings.xml create mode 100644 product/modules/agents/android/client/res/menu/sherlock_menu.xml create mode 100644 product/modules/agents/android/client/res/menu/sherlock_menu_debug.xml create mode 100644 product/modules/agents/android/client/res/raw/emm_truststore.bks create mode 100644 product/modules/agents/android/client/res/values-sw600dp/dimens.xml create mode 100644 product/modules/agents/android/client/res/values-sw720dp-land/dimens.xml create mode 100644 product/modules/agents/android/client/res/values-v11/styles.xml create mode 100644 product/modules/agents/android/client/res/values-v14/styles.xml create mode 100644 product/modules/agents/android/client/res/values/colors.xml create mode 100644 product/modules/agents/android/client/res/values/dimens.xml create mode 100644 product/modules/agents/android/client/res/values/ids.xml create mode 100644 product/modules/agents/android/client/res/values/strings.xml create mode 100644 product/modules/agents/android/client/res/values/styles.xml create mode 100644 product/modules/agents/android/client/res/xml/wso2_device_admin.xml create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/AlertActivity.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/AlreadyRegisteredActivity.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/AuthenticationActivity.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/AuthenticationErrorActivity.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/DisplayDeviceInfoActivity.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/GCMIntentService.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/LogActivity.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/NotifyActivity.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/PinCodeActivity.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/RegistrationActivity.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/ServerDetails.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/api/ApplicationManager.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/api/Battery.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/api/DeviceInfo.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/api/ExecShell.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/api/GPSTracker.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/api/LocationServices.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/api/PhoneState.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/api/Root.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/api/TrackCallSMS.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/api/TrafficRecord.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/api/TrafficSnapshot.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/api/WiFiConfig.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/models/PInfo.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/parser/PayloadParser.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/proxy/APIAccessCallBack.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/proxy/APIController.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/proxy/APIResultCallBack.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/proxy/APIUtilities.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/proxy/AccessTokenHandler.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/proxy/CallBack.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/proxy/IdentityProxy.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/proxy/RefreshTokenHandler.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/proxy/ServerUtilities.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/proxy/ServerUtilitiesTemp.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/proxy/Token.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/proxy/TokenCallBack.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/security/APIResultCallBackImpl.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/services/AlarmReceiver.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/services/Config.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/services/DeviceStartupIntentReceiver.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/services/Operation.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/services/PolicyTester.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/services/ProcessMessage.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/services/SMSReceiver.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/services/WSO2DeviceAdminReceiver.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/utils/CommonDialogUtils.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/utils/CommonUtilities.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/utils/Errors.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/utils/HTTPConnectorUtils.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/utils/LoggerCustom.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/utils/Preference.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/utils/ServerUtils.java create mode 100644 product/modules/agents/android/client/src/org/wso2/cdm/agent/utils/WSO2SSLSocketFactory.java create mode 100644 product/modules/agents/android/jax-rs/build.xml create mode 100644 product/modules/agents/android/jax-rs/pom.xml create mode 100644 product/modules/agents/android/jax-rs/run-client.bat create mode 100755 product/modules/agents/android/jax-rs/run-client.sh create mode 100644 product/modules/agents/android/jax-rs/src/main/java/cdm/api/android/Authentication.java create mode 100644 product/modules/agents/android/jax-rs/src/main/webapp/META-INF/webapp-classloading.xml create mode 100644 product/modules/agents/android/jax-rs/src/main/webapp/WEB-INF/cxf-servlet.xml create mode 100644 product/modules/agents/android/jax-rs/src/main/webapp/WEB-INF/web.xml create mode 100644 product/modules/agents/android/jax-rs/src/main/webapp/servicelist.css create mode 100644 product/modules/agents/ios/android/AndroidManifest.xml create mode 100644 product/modules/agents/ios/android/README.md create mode 100644 product/modules/agents/ios/android/assets/config.properties create mode 100644 product/modules/agents/ios/android/bin/AndroidManifest.xml create mode 100644 product/modules/agents/ios/android/bin/R.txt create mode 100644 product/modules/agents/ios/android/bin/cdm-agent.apk create mode 100644 product/modules/agents/ios/android/bin/classes.dex create mode 100644 product/modules/agents/ios/android/bin/dexedLibs/android-support-v4-7b0b3238976555cb6d251e95cc30748f.jar create mode 100644 product/modules/agents/ios/android/bin/dexedLibs/commons-codec-1.2-b63678973161d34ef8e3f1b4d2d5e356.jar create mode 100644 product/modules/agents/ios/android/bin/dexedLibs/gcm-d481818bb64b84c38624bd6717ade0cb.jar create mode 100644 product/modules/agents/ios/android/bin/dexedLibs/json-simple-1.1.1-1244001980bc7a37a2d614fb8d7dae09.jar create mode 100644 product/modules/agents/ios/android/bin/dexedLibs/library-5073d48b3ca9a828720ba02b7fdaed24.jar create mode 100644 product/modules/agents/ios/android/bin/jarlist.cache create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-hdpi/ic_bookmark.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-hdpi/ic_check_default.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-hdpi/ic_check_selected.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-hdpi/ic_launcher.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-hdpi/ic_logo.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-hdpi/ic_logo_dark.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-hdpi/ic_stat_gcm.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-hdpi/option_icon.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-hdpi/repeat_bg.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-hdpi/top_bar.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-mdpi/ic_bookmark.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-mdpi/ic_check_default.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-mdpi/ic_check_selected.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-mdpi/ic_launcher.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-mdpi/ic_logo.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-mdpi/ic_logo_dark.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-mdpi/option_icon.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-mdpi/top_bar.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/appinstall.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/applist.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/appuninstall.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/camera.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/changepassword.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/encrypt.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/ic_bookmark.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/ic_check_default.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/ic_check_selected.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/ic_launcher.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/ic_logo.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/ic_logo_dark.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/info.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/location.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/lock.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/mute.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/notification.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/repeat_bg.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/wifi.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xhdpi/wipe.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xxhdpi/ic_bookmark.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xxhdpi/ic_check_default.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xxhdpi/ic_check_selected.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xxhdpi/ic_launcher.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xxhdpi/ic_logo.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xxhdpi/ic_logo_dark.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable-xxhdpi/repeat_bg.png create mode 100644 product/modules/agents/ios/android/bin/res/crunch/drawable/dot.png create mode 100644 product/modules/agents/ios/android/bin/resources.ap_ create mode 100644 product/modules/agents/ios/android/libs/android-support-v4.jar create mode 100644 product/modules/agents/ios/android/libs/commons-codec-1.2.jar create mode 100644 product/modules/agents/ios/android/libs/gcm.jar create mode 100644 product/modules/agents/ios/android/libs/json-simple-1.1.1.jar create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/.gitignore create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/.travis.yml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/CHANGELOG.md create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/CONTRIBUTING.md create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/LICENSE.txt create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/README.md create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/checkstyle.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/AndroidManifest.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/README.md create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/build.gradle create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/libs/android-support-v4.jar create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/pom.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/project.properties create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_dark.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_light.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_dark.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_light.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_solid_inverse_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_solid_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_solid_shadow_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_solid_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_solid_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_transparent_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_default_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_default_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_focused_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_focused_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__dialog_full_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_cab_done_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_disabled.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_normal.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_go.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_go_search_api_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_share_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_search.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_search_api_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_voice_search.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_activated_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_divider_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_divider_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_focused_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_longpressed_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_selector_disabled_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_bg_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_bg_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_primary_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_primary_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_48_inner_holo.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_48_outer_holo.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_pressed_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_pressed_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_default_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_default_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_default_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_solid_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_solid_inverse_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_transparent_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_transparent_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_focused_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_bottom_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_top_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_top_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__dialog_full_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__dialog_full_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_ab_back_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_cab_done_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_disabled.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_normal.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_search_api_disabled_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_go.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_menu_moreoverflow_normal_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_menu_share_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_search.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_search_api_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_voice_search.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_voice_search_api_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_activated_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_divider_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_divider_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_focused_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_longpressed_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_bg_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_bg_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_primary_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_primary_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_secondary_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_secondary_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_48_inner_holo.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_48_outer_holo.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_default_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_disabled_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_disabled_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_focused_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_pressed_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_unselected_pressed_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_default_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-v11/abs__progress_medium_holo.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_solid_inverse_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_transparent_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_share_pack_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_top_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_top_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_ab_back_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_cab_done_holo_dark.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_cab_done_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_clear_disabled.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_clear_search_api_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_go.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_go_search_api_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_search.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_search_api_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_voice_search.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_voice_search_api_holo_light.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_activated_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_divider_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_divider_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_focused_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_longpressed_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_pressed_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_selector_disabled_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_bg_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_primary_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_secondary_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_48_inner_holo.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_48_outer_holo.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_focused_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_selected_focused_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_selected_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_unselected_pressed_holo.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_default_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_default_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_selected_holo_dark.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_selected_holo_light.9.png create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_dark.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_light.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_dark.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_light.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear_holo_light.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_dark.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_light.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_dark.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_light.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_dark.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_light.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_dark.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_light.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__progress_medium_holo.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_dark.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_light.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_dark.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_light.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__tab_indicator_ab_holo.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_dark.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_light.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_dark.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_light.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout-large/abs__action_mode_close_item.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_dropdown_item.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_item.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar_overlay.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_home.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab_bar_view.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_title_item.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__action_menu_item_layout.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__action_menu_layout.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__action_mode_bar.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__action_mode_close_item.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view_list_item.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__dialog_title_holo.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_checkbox.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_icon.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_layout.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_radio.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__popup_menu_item_layout.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar_overlay.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__screen_simple.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__screen_simple_overlay_action_mode.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__search_dropdown_item_icons_2line.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__search_view.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/abs__simple_dropdown_hint.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_dropdown_item.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_item.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values-land/abs__dimens.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values-large-hdpi-1024x600/abs__dimens.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values-large-land-hdpi-1024x600/abs__dimens.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values-large-land-mdpi-1024x600/abs__dimens.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values-large-mdpi-1024x600/abs__dimens.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values-large/abs__dimens.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values-sw600dp/abs__bools.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values-sw600dp/abs__dimens.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values-v11/abs__themes.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values-v14/abs__styles.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values-v14/abs__themes.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values-w360dp/abs__dimens.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values-w480dp/abs__bools.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values-w480dp/abs__config.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values-w500dp/abs__dimens.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values-w600dp/abs__dimens.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values-xlarge/abs__dimens.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values/abs__attrs.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values/abs__bools.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values/abs__colors.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values/abs__config.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values/abs__dimens.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values/abs__ids.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values/abs__strings.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values/abs__styles.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/res/values/abs__themes.xml create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/android/support/v4/app/Watson.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/ActionBarSherlock.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/ActionBar.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockActivity.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockDialogFragment.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragment.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragmentActivity.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListActivity.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListFragment.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ResourcesCompat.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarImpl.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/ActionProviderWrapper.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/StandaloneActionMode.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_HasStateListenerSupport.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_OnAttachStateChangeListener.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuView.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/AbsActionBarView.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContextView.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarView.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingTextView.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CollapsibleActionViewWrapper.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAbsSpinner.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAdapterView.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsProgressBar.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsSpinner.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsView.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionMode.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionProvider.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/CollapsibleActionView.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Menu.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuInflater.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuItem.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/SubMenu.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Window.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserModel.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserView.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SearchView.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ShareActionProvider.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SuggestionsAdapter.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/library/test/com/actionbarsherlock/internal/ManifestParsingTest.java create mode 100644 product/modules/agents/ios/android/plugins/ActionBarSherlock/pom.xml create mode 100644 product/modules/agents/ios/android/proguard-project.txt create mode 100644 product/modules/agents/ios/android/project.properties create mode 100644 product/modules/agents/ios/android/res/drawable-hdpi/ic_bookmark.png create mode 100644 product/modules/agents/ios/android/res/drawable-hdpi/ic_check_default.png create mode 100644 product/modules/agents/ios/android/res/drawable-hdpi/ic_check_selected.png create mode 100644 product/modules/agents/ios/android/res/drawable-hdpi/ic_launcher.png create mode 100644 product/modules/agents/ios/android/res/drawable-hdpi/ic_logo.png create mode 100644 product/modules/agents/ios/android/res/drawable-hdpi/ic_logo_dark.png create mode 100644 product/modules/agents/ios/android/res/drawable-hdpi/ic_stat_gcm.png create mode 100644 product/modules/agents/ios/android/res/drawable-hdpi/option_icon.png create mode 100644 product/modules/agents/ios/android/res/drawable-hdpi/repeat_bg.png create mode 100644 product/modules/agents/ios/android/res/drawable-hdpi/top_bar.png create mode 100644 product/modules/agents/ios/android/res/drawable-mdpi/ic_bookmark.png create mode 100644 product/modules/agents/ios/android/res/drawable-mdpi/ic_check_default.png create mode 100644 product/modules/agents/ios/android/res/drawable-mdpi/ic_check_selected.png create mode 100644 product/modules/agents/ios/android/res/drawable-mdpi/ic_launcher.png create mode 100644 product/modules/agents/ios/android/res/drawable-mdpi/ic_logo.png create mode 100644 product/modules/agents/ios/android/res/drawable-mdpi/ic_logo_dark.png create mode 100644 product/modules/agents/ios/android/res/drawable-mdpi/option_icon.png create mode 100644 product/modules/agents/ios/android/res/drawable-mdpi/top_bar.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/appinstall.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/applist.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/appuninstall.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/camera.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/changepassword.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/encrypt.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/ic_bookmark.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/ic_check_default.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/ic_check_selected.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/ic_launcher.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/ic_logo.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/ic_logo_dark.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/info.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/location.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/lock.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/mute.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/notification.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/repeat_bg.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/wifi.png create mode 100644 product/modules/agents/ios/android/res/drawable-xhdpi/wipe.png create mode 100644 product/modules/agents/ios/android/res/drawable-xxhdpi/ic_bookmark.png create mode 100644 product/modules/agents/ios/android/res/drawable-xxhdpi/ic_check_default.png create mode 100644 product/modules/agents/ios/android/res/drawable-xxhdpi/ic_check_selected.png create mode 100644 product/modules/agents/ios/android/res/drawable-xxhdpi/ic_launcher.png create mode 100644 product/modules/agents/ios/android/res/drawable-xxhdpi/ic_logo.png create mode 100644 product/modules/agents/ios/android/res/drawable-xxhdpi/ic_logo_dark.png create mode 100644 product/modules/agents/ios/android/res/drawable-xxhdpi/repeat_bg.png create mode 100644 product/modules/agents/ios/android/res/drawable/btn_grey.xml create mode 100644 product/modules/agents/ios/android/res/drawable/btn_orange.xml create mode 100644 product/modules/agents/ios/android/res/drawable/custom_checkbox.xml create mode 100644 product/modules/agents/ios/android/res/drawable/dot.png create mode 100644 product/modules/agents/ios/android/res/drawable/mdm_logo.xml create mode 100644 product/modules/agents/ios/android/res/layout/activity_agent_settings.xml create mode 100644 product/modules/agents/ios/android/res/layout/activity_alert.xml create mode 100644 product/modules/agents/ios/android/res/layout/activity_already_registered.xml create mode 100644 product/modules/agents/ios/android/res/layout/activity_authentication.xml create mode 100644 product/modules/agents/ios/android/res/layout/activity_authentication_error.xml create mode 100644 product/modules/agents/ios/android/res/layout/activity_available_operations.xml create mode 100644 product/modules/agents/ios/android/res/layout/activity_display_device_info.xml create mode 100644 product/modules/agents/ios/android/res/layout/activity_entry.xml create mode 100644 product/modules/agents/ios/android/res/layout/activity_log.xml create mode 100644 product/modules/agents/ios/android/res/layout/activity_main.xml create mode 100644 product/modules/agents/ios/android/res/layout/activity_notification.xml create mode 100644 product/modules/agents/ios/android/res/layout/activity_pin_code.xml create mode 100644 product/modules/agents/ios/android/res/layout/activity_register_successful.xml create mode 100644 product/modules/agents/ios/android/res/layout/activity_settings.xml create mode 100644 product/modules/agents/ios/android/res/layout/custom_sherlock_bar.xml create mode 100644 product/modules/agents/ios/android/res/layout/custom_terms_popup.xml create mode 100644 product/modules/agents/ios/android/res/layout/footer_repeat.xml create mode 100644 product/modules/agents/ios/android/res/layout/header_gradient.xml create mode 100644 product/modules/agents/ios/android/res/layout/login.xml create mode 100644 product/modules/agents/ios/android/res/layout/main.xml create mode 100644 product/modules/agents/ios/android/res/layout/notify.xml create mode 100644 product/modules/agents/ios/android/res/layout/row_with_icon.xml create mode 100644 product/modules/agents/ios/android/res/layout/simplerow.xml create mode 100644 product/modules/agents/ios/android/res/menu/agent_settings.xml create mode 100644 product/modules/agents/ios/android/res/menu/alert.xml create mode 100644 product/modules/agents/ios/android/res/menu/all_ready_registered.xml create mode 100644 product/modules/agents/ios/android/res/menu/auth_sherlock_menu.xml create mode 100644 product/modules/agents/ios/android/res/menu/authentication.xml create mode 100644 product/modules/agents/ios/android/res/menu/authentication_error.xml create mode 100644 product/modules/agents/ios/android/res/menu/available_operations.xml create mode 100644 product/modules/agents/ios/android/res/menu/display_device_info.xml create mode 100644 product/modules/agents/ios/android/res/menu/entry.xml create mode 100644 product/modules/agents/ios/android/res/menu/log.xml create mode 100644 product/modules/agents/ios/android/res/menu/main.xml create mode 100644 product/modules/agents/ios/android/res/menu/notification.xml create mode 100644 product/modules/agents/ios/android/res/menu/notify.xml create mode 100644 product/modules/agents/ios/android/res/menu/options_menu.xml create mode 100644 product/modules/agents/ios/android/res/menu/pin_code.xml create mode 100644 product/modules/agents/ios/android/res/menu/register_successful.xml create mode 100644 product/modules/agents/ios/android/res/menu/settings.xml create mode 100644 product/modules/agents/ios/android/res/menu/sherlock_menu.xml create mode 100644 product/modules/agents/ios/android/res/menu/sherlock_menu_debug.xml create mode 100644 product/modules/agents/ios/android/res/raw/emm_truststore.bks create mode 100644 product/modules/agents/ios/android/res/values-sw600dp/dimens.xml create mode 100644 product/modules/agents/ios/android/res/values-sw720dp-land/dimens.xml create mode 100644 product/modules/agents/ios/android/res/values-v11/styles.xml create mode 100644 product/modules/agents/ios/android/res/values-v14/styles.xml create mode 100644 product/modules/agents/ios/android/res/values/colors.xml create mode 100644 product/modules/agents/ios/android/res/values/dimens.xml create mode 100644 product/modules/agents/ios/android/res/values/ids.xml create mode 100644 product/modules/agents/ios/android/res/values/strings.xml create mode 100644 product/modules/agents/ios/android/res/values/styles.xml create mode 100644 product/modules/agents/ios/android/res/xml/wso2_device_admin.xml create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/AlertActivity.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/AlreadyRegisteredActivity.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/AuthenticationActivity.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/AuthenticationErrorActivity.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/DisplayDeviceInfoActivity.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/GCMIntentService.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/LogActivity.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/NotifyActivity.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/PinCodeActivity.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/RegistrationActivity.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/ServerDetails.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/api/ApplicationManager.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/api/Battery.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/api/DeviceInfo.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/api/ExecShell.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/api/GPSTracker.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/api/LocationServices.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/api/PhoneState.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/api/Root.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/api/TrackCallSMS.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/api/TrafficRecord.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/api/TrafficSnapshot.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/api/WiFiConfig.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/models/PInfo.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/parser/PayloadParser.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/proxy/APIAccessCallBack.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/proxy/APIController.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/proxy/APIResultCallBack.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/proxy/APIUtilities.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/proxy/AccessTokenHandler.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/proxy/CallBack.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/proxy/IdentityProxy.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/proxy/RefreshTokenHandler.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/proxy/ServerUtilities.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/proxy/ServerUtilitiesTemp.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/proxy/Token.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/proxy/TokenCallBack.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/security/APIResultCallBackImpl.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/services/AlarmReceiver.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/services/Config.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/services/DeviceStartupIntentReceiver.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/services/Operation.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/services/PolicyTester.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/services/ProcessMessage.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/services/SMSReceiver.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/services/WSO2DeviceAdminReceiver.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/utils/CommonDialogUtils.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/utils/CommonUtilities.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/utils/Errors.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/utils/HTTPConnectorUtils.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/utils/LoggerCustom.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/utils/Preference.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/utils/ServerUtils.java create mode 100644 product/modules/agents/ios/android/src/org/wso2/cdm/agent/utils/WSO2SSLSocketFactory.java diff --git a/product/modules/agents/android/client/AndroidManifest.xml b/product/modules/agents/android/client/AndroidManifest.xml new file mode 100644 index 0000000000..3f7c84ff69 --- /dev/null +++ b/product/modules/agents/android/client/AndroidManifest.xml @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/modules/agents/android/client/README.md b/product/modules/agents/android/client/README.md new file mode 100644 index 0000000000..b66bd049b9 --- /dev/null +++ b/product/modules/agents/android/client/README.md @@ -0,0 +1,18 @@ +WSO2 EMM Agent +================= + +Configure and build the Android client application +---------------------- +Follow the instructions below to configure and build the Android client application: + +1. Get a Git clone of the project. +2. Download Android ADT plugin and configure it in your Eclipse. +3. Open the project in your Eclipse IDE. +4. Import the project as an Android project using "File-->Import-->Existing Android Code Into Workspace" +5. Two projects will show, a library and the agent. Clean the Library first and build it. +6. Open the file properties of the Agent project. +7. Under "Android" scroll down (past the Build targets). +8. The library project will show with a red "X" next to it. Remove it. +9. Add the library project you just built in step 3 +10. Ensure the Library is also on your "Java Build Path" under Libraries. +11. Clean and build. diff --git a/product/modules/agents/android/client/assets/config.properties b/product/modules/agents/android/client/assets/config.properties new file mode 100644 index 0000000000..7d9009c35f --- /dev/null +++ b/product/modules/agents/android/client/assets/config.properties @@ -0,0 +1 @@ +SHOP_URL="" \ No newline at end of file diff --git a/product/modules/agents/android/client/bin/AndroidManifest.xml b/product/modules/agents/android/client/bin/AndroidManifest.xml new file mode 100644 index 0000000000..3f7c84ff69 --- /dev/null +++ b/product/modules/agents/android/client/bin/AndroidManifest.xml @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/product/modules/agents/android/client/bin/R.txt b/product/modules/agents/android/client/bin/R.txt new file mode 100644 index 0000000000..43fe3e2fc8 --- /dev/null +++ b/product/modules/agents/android/client/bin/R.txt @@ -0,0 +1,903 @@ +int attr actionBarDivider 0x7f01000e +int attr actionBarItemBackground 0x7f01000f +int attr actionBarSize 0x7f01000d +int attr actionBarSplitStyle 0x7f01000b +int attr actionBarStyle 0x7f01000a +int attr actionBarTabBarStyle 0x7f010007 +int attr actionBarTabStyle 0x7f010006 +int attr actionBarTabTextStyle 0x7f010008 +int attr actionBarWidgetTheme 0x7f01000c +int attr actionButtonStyle 0x7f01003a +int attr actionDropDownStyle 0x7f010039 +int attr actionMenuTextAppearance 0x7f010010 +int attr actionMenuTextColor 0x7f010011 +int attr actionModeBackground 0x7f010014 +int attr actionModeCloseButtonStyle 0x7f010013 +int attr actionModeCloseDrawable 0x7f010016 +int attr actionModePopupWindowStyle 0x7f010018 +int attr actionModeShareDrawable 0x7f010017 +int attr actionModeSplitBackground 0x7f010015 +int attr actionModeStyle 0x7f010012 +int attr actionOverflowButtonStyle 0x7f010009 +int attr actionSpinnerItemStyle 0x7f01003f +int attr activatedBackgroundIndicator 0x7f010047 +int attr activityChooserViewStyle 0x7f010046 +int attr background 0x7f010002 +int attr backgroundSplit 0x7f010003 +int attr backgroundStacked 0x7f01004e +int attr buttonStyleSmall 0x7f010019 +int attr customNavigationLayout 0x7f01004f +int attr displayOptions 0x7f010049 +int attr divider 0x7f010005 +int attr dividerVertical 0x7f010038 +int attr dropDownListViewStyle 0x7f01003c +int attr dropdownListPreferredItemHeight 0x7f01003e +int attr expandActivityOverflowButtonDrawable 0x7f01005e +int attr headerBackground 0x7f010058 +int attr height 0x7f010004 +int attr homeAsUpIndicator 0x7f01003b +int attr homeLayout 0x7f010050 +int attr horizontalDivider 0x7f010056 +int attr icon 0x7f01004c +int attr iconifiedByDefault 0x7f01005f +int attr indeterminateProgressStyle 0x7f010052 +int attr initialActivityCount 0x7f01005d +int attr itemBackground 0x7f010059 +int attr itemIconDisabledAlpha 0x7f01005b +int attr itemPadding 0x7f010054 +int attr itemTextAppearance 0x7f010055 +int attr listPopupWindowStyle 0x7f010045 +int attr listPreferredItemHeightSmall 0x7f010032 +int attr listPreferredItemPaddingLeft 0x7f010033 +int attr listPreferredItemPaddingRight 0x7f010034 +int attr logo 0x7f01004d +int attr navigationMode 0x7f010048 +int attr popupMenuStyle 0x7f01003d +int attr preserveIconSpacing 0x7f01005c +int attr progressBarPadding 0x7f010053 +int attr progressBarStyle 0x7f010051 +int attr queryHint 0x7f010060 +int attr searchAutoCompleteTextView 0x7f010024 +int attr searchDropdownBackground 0x7f010025 +int attr searchResultListItemHeight 0x7f01002f +int attr searchViewCloseIcon 0x7f010026 +int attr searchViewEditQuery 0x7f01002a +int attr searchViewEditQueryBackground 0x7f01002b +int attr searchViewGoIcon 0x7f010027 +int attr searchViewSearchIcon 0x7f010028 +int attr searchViewTextField 0x7f01002c +int attr searchViewTextFieldRight 0x7f01002d +int attr searchViewVoiceIcon 0x7f010029 +int attr selectableItemBackground 0x7f01001a +int attr spinnerDropDownItemStyle 0x7f010023 +int attr spinnerItemStyle 0x7f010022 +int attr subtitle 0x7f01004b +int attr subtitleTextStyle 0x7f010001 +int attr textAppearanceLargePopupMenu 0x7f01001c +int attr textAppearanceListItemSmall 0x7f010035 +int attr textAppearanceSearchResultSubtitle 0x7f010031 +int attr textAppearanceSearchResultTitle 0x7f010030 +int attr textAppearanceSmall 0x7f01001e +int attr textAppearanceSmallPopupMenu 0x7f01001d +int attr textColorPrimary 0x7f01001f +int attr textColorPrimaryDisableOnly 0x7f010020 +int attr textColorPrimaryInverse 0x7f010021 +int attr textColorSearchUrl 0x7f01002e +int attr title 0x7f01004a +int attr titleTextStyle 0x7f010000 +int attr verticalDivider 0x7f010057 +int attr windowActionBar 0x7f010041 +int attr windowActionBarOverlay 0x7f010042 +int attr windowActionModeOverlay 0x7f010043 +int attr windowAnimationStyle 0x7f01005a +int attr windowContentOverlay 0x7f01001b +int attr windowMinWidthMajor 0x7f010036 +int attr windowMinWidthMinor 0x7f010037 +int attr windowNoTitle 0x7f010040 +int attr windowSplitActionBar 0x7f010044 +int bool abs__action_bar_embed_tabs 0x7f070000 +int bool abs__action_bar_expanded_action_views_exclusive 0x7f070002 +int bool abs__config_actionMenuItemAllCaps 0x7f070004 +int bool abs__config_allowActionMenuItemTextWithIcon 0x7f070005 +int bool abs__config_showMenuShortcutsWhenKeyboardPresent 0x7f070003 +int bool abs__split_action_bar_is_narrow 0x7f070001 +int color abs__background_holo_dark 0x7f080000 +int color abs__background_holo_light 0x7f080001 +int color abs__bright_foreground_disabled_holo_dark 0x7f080004 +int color abs__bright_foreground_disabled_holo_light 0x7f080005 +int color abs__bright_foreground_holo_dark 0x7f080002 +int color abs__bright_foreground_holo_light 0x7f080003 +int color abs__bright_foreground_inverse_holo_dark 0x7f080006 +int color abs__bright_foreground_inverse_holo_light 0x7f080007 +int color abs__holo_blue_light 0x7f080008 +int color abs__primary_text_disable_only_holo_dark 0x7f08000c +int color abs__primary_text_disable_only_holo_light 0x7f08000d +int color abs__primary_text_holo_dark 0x7f08000e +int color abs__primary_text_holo_light 0x7f08000f +int color black 0x7f08000b +int color light_grey 0x7f080009 +int color white 0x7f08000a +int dimen abs__action_bar_default_height 0x7f090001 +int dimen abs__action_bar_icon_vertical_padding 0x7f090002 +int dimen abs__action_bar_subtitle_bottom_margin 0x7f090006 +int dimen abs__action_bar_subtitle_text_size 0x7f090004 +int dimen abs__action_bar_subtitle_top_margin 0x7f090005 +int dimen abs__action_bar_title_text_size 0x7f090003 +int dimen abs__action_button_min_width 0x7f090007 +int dimen abs__alert_dialog_title_height 0x7f090008 +int dimen abs__config_prefDialogWidth 0x7f090000 +int dimen abs__dialog_min_width_major 0x7f090009 +int dimen abs__dialog_min_width_minor 0x7f09000a +int dimen abs__dropdownitem_icon_width 0x7f09000d +int dimen abs__dropdownitem_text_padding_left 0x7f09000b +int dimen abs__dropdownitem_text_padding_right 0x7f09000c +int dimen abs__search_view_preferred_width 0x7f09000f +int dimen abs__search_view_text_min_width 0x7f09000e +int dimen action_button_min_width 0x7f090010 +int dimen activity_horizontal_margin 0x7f090011 +int dimen activity_vertical_margin 0x7f090012 +int dimen top_bar_height 0x7f090013 +int drawable abs__ab_bottom_solid_dark_holo 0x7f020000 +int drawable abs__ab_bottom_solid_inverse_holo 0x7f020001 +int drawable abs__ab_bottom_solid_light_holo 0x7f020002 +int drawable abs__ab_bottom_transparent_dark_holo 0x7f020003 +int drawable abs__ab_bottom_transparent_light_holo 0x7f020004 +int drawable abs__ab_share_pack_holo_dark 0x7f020005 +int drawable abs__ab_share_pack_holo_light 0x7f020006 +int drawable abs__ab_solid_dark_holo 0x7f020007 +int drawable abs__ab_solid_light_holo 0x7f020008 +int drawable abs__ab_solid_shadow_holo 0x7f020009 +int drawable abs__ab_stacked_solid_dark_holo 0x7f02000a +int drawable abs__ab_stacked_solid_light_holo 0x7f02000b +int drawable abs__ab_stacked_transparent_dark_holo 0x7f02000c +int drawable abs__ab_stacked_transparent_light_holo 0x7f02000d +int drawable abs__ab_transparent_dark_holo 0x7f02000e +int drawable abs__ab_transparent_light_holo 0x7f02000f +int drawable abs__activated_background_holo_dark 0x7f020010 +int drawable abs__activated_background_holo_light 0x7f020011 +int drawable abs__btn_cab_done_default_holo_dark 0x7f020012 +int drawable abs__btn_cab_done_default_holo_light 0x7f020013 +int drawable abs__btn_cab_done_focused_holo_dark 0x7f020014 +int drawable abs__btn_cab_done_focused_holo_light 0x7f020015 +int drawable abs__btn_cab_done_holo_dark 0x7f020016 +int drawable abs__btn_cab_done_holo_light 0x7f020017 +int drawable abs__btn_cab_done_pressed_holo_dark 0x7f020018 +int drawable abs__btn_cab_done_pressed_holo_light 0x7f020019 +int drawable abs__cab_background_bottom_holo_dark 0x7f02001a +int drawable abs__cab_background_bottom_holo_light 0x7f02001b +int drawable abs__cab_background_top_holo_dark 0x7f02001c +int drawable abs__cab_background_top_holo_light 0x7f02001d +int drawable abs__dialog_full_holo_dark 0x7f02001e +int drawable abs__dialog_full_holo_light 0x7f02001f +int drawable abs__ic_ab_back_holo_dark 0x7f020020 +int drawable abs__ic_ab_back_holo_light 0x7f020021 +int drawable abs__ic_cab_done_holo_dark 0x7f020022 +int drawable abs__ic_cab_done_holo_light 0x7f020023 +int drawable abs__ic_clear 0x7f020024 +int drawable abs__ic_clear_disabled 0x7f020025 +int drawable abs__ic_clear_holo_light 0x7f020026 +int drawable abs__ic_clear_normal 0x7f020027 +int drawable abs__ic_clear_search_api_disabled_holo_light 0x7f020028 +int drawable abs__ic_clear_search_api_holo_light 0x7f020029 +int drawable abs__ic_go 0x7f02002a +int drawable abs__ic_go_search_api_holo_light 0x7f02002b +int drawable abs__ic_menu_moreoverflow_holo_dark 0x7f02002c +int drawable abs__ic_menu_moreoverflow_holo_light 0x7f02002d +int drawable abs__ic_menu_moreoverflow_normal_holo_dark 0x7f02002e +int drawable abs__ic_menu_moreoverflow_normal_holo_light 0x7f02002f +int drawable abs__ic_menu_share_holo_dark 0x7f020030 +int drawable abs__ic_menu_share_holo_light 0x7f020031 +int drawable abs__ic_search 0x7f020032 +int drawable abs__ic_search_api_holo_light 0x7f020033 +int drawable abs__ic_voice_search 0x7f020034 +int drawable abs__ic_voice_search_api_holo_light 0x7f020035 +int drawable abs__item_background_holo_dark 0x7f020036 +int drawable abs__item_background_holo_light 0x7f020037 +int drawable abs__list_activated_holo 0x7f020038 +int drawable abs__list_divider_holo_dark 0x7f020039 +int drawable abs__list_divider_holo_light 0x7f02003a +int drawable abs__list_focused_holo 0x7f02003b +int drawable abs__list_longpressed_holo 0x7f02003c +int drawable abs__list_pressed_holo_dark 0x7f02003d +int drawable abs__list_pressed_holo_light 0x7f02003e +int drawable abs__list_selector_background_transition_holo_dark 0x7f02003f +int drawable abs__list_selector_background_transition_holo_light 0x7f020040 +int drawable abs__list_selector_disabled_holo_dark 0x7f020041 +int drawable abs__list_selector_disabled_holo_light 0x7f020042 +int drawable abs__list_selector_holo_dark 0x7f020043 +int drawable abs__list_selector_holo_light 0x7f020044 +int drawable abs__menu_dropdown_panel_holo_dark 0x7f020045 +int drawable abs__menu_dropdown_panel_holo_light 0x7f020046 +int drawable abs__progress_bg_holo_dark 0x7f020047 +int drawable abs__progress_bg_holo_light 0x7f020048 +int drawable abs__progress_horizontal_holo_dark 0x7f020049 +int drawable abs__progress_horizontal_holo_light 0x7f02004a +int drawable abs__progress_medium_holo 0x7f02004b +int drawable abs__progress_primary_holo_dark 0x7f02004c +int drawable abs__progress_primary_holo_light 0x7f02004d +int drawable abs__progress_secondary_holo_dark 0x7f02004e +int drawable abs__progress_secondary_holo_light 0x7f02004f +int drawable abs__search_dropdown_dark 0x7f020050 +int drawable abs__search_dropdown_light 0x7f020051 +int drawable abs__spinner_48_inner_holo 0x7f020052 +int drawable abs__spinner_48_outer_holo 0x7f020053 +int drawable abs__spinner_ab_default_holo_dark 0x7f020054 +int drawable abs__spinner_ab_default_holo_light 0x7f020055 +int drawable abs__spinner_ab_disabled_holo_dark 0x7f020056 +int drawable abs__spinner_ab_disabled_holo_light 0x7f020057 +int drawable abs__spinner_ab_focused_holo_dark 0x7f020058 +int drawable abs__spinner_ab_focused_holo_light 0x7f020059 +int drawable abs__spinner_ab_holo_dark 0x7f02005a +int drawable abs__spinner_ab_holo_light 0x7f02005b +int drawable abs__spinner_ab_pressed_holo_dark 0x7f02005c +int drawable abs__spinner_ab_pressed_holo_light 0x7f02005d +int drawable abs__tab_indicator_ab_holo 0x7f02005e +int drawable abs__tab_selected_focused_holo 0x7f02005f +int drawable abs__tab_selected_holo 0x7f020060 +int drawable abs__tab_selected_pressed_holo 0x7f020061 +int drawable abs__tab_unselected_pressed_holo 0x7f020062 +int drawable abs__textfield_search_default_holo_dark 0x7f020063 +int drawable abs__textfield_search_default_holo_light 0x7f020064 +int drawable abs__textfield_search_right_default_holo_dark 0x7f020065 +int drawable abs__textfield_search_right_default_holo_light 0x7f020066 +int drawable abs__textfield_search_right_selected_holo_dark 0x7f020067 +int drawable abs__textfield_search_right_selected_holo_light 0x7f020068 +int drawable abs__textfield_search_selected_holo_dark 0x7f020069 +int drawable abs__textfield_search_selected_holo_light 0x7f02006a +int drawable abs__textfield_searchview_holo_dark 0x7f02006b +int drawable abs__textfield_searchview_holo_light 0x7f02006c +int drawable abs__textfield_searchview_right_holo_dark 0x7f02006d +int drawable abs__textfield_searchview_right_holo_light 0x7f02006e +int drawable appinstall 0x7f02006f +int drawable applist 0x7f020070 +int drawable appuninstall 0x7f020071 +int drawable btn_grey 0x7f020072 +int drawable btn_orange 0x7f020073 +int drawable camera 0x7f020074 +int drawable changepassword 0x7f020075 +int drawable custom_checkbox 0x7f020076 +int drawable dot 0x7f020077 +int drawable encrypt 0x7f020078 +int drawable ic_bookmark 0x7f020079 +int drawable ic_check_default 0x7f02007a +int drawable ic_check_selected 0x7f02007b +int drawable ic_launcher 0x7f02007c +int drawable ic_logo 0x7f02007d +int drawable ic_logo_dark 0x7f02007e +int drawable ic_stat_gcm 0x7f02007f +int drawable info 0x7f020080 +int drawable location 0x7f020081 +int drawable lock 0x7f020082 +int drawable mdm_logo 0x7f020083 +int drawable mute 0x7f020084 +int drawable notification 0x7f020085 +int drawable option_icon 0x7f020086 +int drawable repeat_bg 0x7f020087 +int drawable top_bar 0x7f020088 +int drawable wifi 0x7f020089 +int drawable wipe 0x7f02008a +int id TextView01 0x7f060090 +int id abs__action_bar 0x7f06004e +int id abs__action_bar_container 0x7f06004d +int id abs__action_bar_subtitle 0x7f06003d +int id abs__action_bar_title 0x7f06003c +int id abs__action_context_bar 0x7f06004f +int id abs__action_menu_divider 0x7f06000c +int id abs__action_menu_presenter 0x7f06000d +int id abs__action_mode_bar 0x7f060052 +int id abs__action_mode_bar_stub 0x7f060051 +int id abs__action_mode_close_button 0x7f060040 +int id abs__activity_chooser_view_content 0x7f060041 +int id abs__checkbox 0x7f06004a +int id abs__content 0x7f060049 +int id abs__default_activity_button 0x7f060044 +int id abs__expand_activities_button 0x7f060042 +int id abs__home 0x7f06000a +int id abs__icon 0x7f060046 +int id abs__image 0x7f060043 +int id abs__imageButton 0x7f06003e +int id abs__list_item 0x7f060045 +int id abs__progress_circular 0x7f06000e +int id abs__progress_horizontal 0x7f06000f +int id abs__radio 0x7f06004c +int id abs__search_badge 0x7f060055 +int id abs__search_bar 0x7f060054 +int id abs__search_button 0x7f060056 +int id abs__search_close_btn 0x7f06005b +int id abs__search_edit_frame 0x7f060057 +int id abs__search_go_btn 0x7f06005d +int id abs__search_mag_icon 0x7f060058 +int id abs__search_plate 0x7f060059 +int id abs__search_src_text 0x7f06005a +int id abs__search_voice_btn 0x7f06005e +int id abs__shortcut 0x7f06004b +int id abs__split_action_bar 0x7f060050 +int id abs__submit_area 0x7f06005c +int id abs__textButton 0x7f06003f +int id abs__title 0x7f060047 +int id abs__titleDivider 0x7f060048 +int id abs__up 0x7f06000b +int id action_settings 0x7f060094 +int id background_container 0x7f06001f +int id blocks_now 0x7f06001e +int id blocks_ruler 0x7f06001d +int id btnEnroll 0x7f060082 +int id btnLogin 0x7f06008f +int id btnOK 0x7f060064 +int id btnRefresh 0x7f06007d +int id btnRegister 0x7f060070 +int id btnReset 0x7f06007e +int id btnSetPin 0x7f060087 +int id btnTryAgain 0x7f060073 +int id btnUnreg 0x7f060065 +int id btnUnregister 0x7f060088 +int id button_layout 0x7f06008c +int id debug_log 0x7f06009a +int id dialogButtonCancel 0x7f06008e +int id dialogButtonOK 0x7f06008d +int id dialog_discard_confirm 0x7f06001a +int id dialog_moderator 0x7f06001b +int id dialog_wave 0x7f06001c +int id disableHome 0x7f060009 +int id editText2 0x7f06006c +int id edit_query 0x7f060053 +int id enrollPanel 0x7f060081 +int id error 0x7f060072 +int id etServerIP 0x7f06008a +int id footer 0x7f060071 +int id footerlogo 0x7f060068 +int id fragment_container 0x7f060034 +int id gridview 0x7f060014 +int id homeAsUp 0x7f060006 +int id incompatibleError 0x7f060074 +int id info 0x7f060097 +int id info_setting 0x7f060098 +int id ip_setting 0x7f060096 +int id layout_topbar 0x7f060067 +int id lblPin 0x7f060084 +int id linInner 0x7f060062 +int id linearLayout1 0x7f060069 +int id linearLayoutText 0x7f060080 +int id listMode 0x7f060002 +int id listview 0x7f060060 +int id logo 0x7f06005f +int id more 0x7f060095 +int id normal 0x7f060001 +int id notify 0x7f060091 +int id option_button 0x7f06007c +int id pin_setting 0x7f060099 +int id preference_brand_view 0x7f06002d +int id preference_empty_view 0x7f06002c +int id radioBYOD 0x7f06006e +int id radioCOPE 0x7f06006f +int id radioGroupType 0x7f06006d +int id rowImage 0x7f060092 +int id rowTextView 0x7f060093 +int id scroller 0x7f060061 +int id setting_invite_email_button 0x7f060030 +int id setting_invite_email_edittext 0x7f06002f +int id setting_invite_email_imageview 0x7f060031 +int id setting_invite_email_layout 0x7f06002e +int id setting_invite_email_textview 0x7f060032 +int id sg_button1 0x7f060039 +int id sg_button2 0x7f06003a +int id sg_button3 0x7f06003b +int id sg_category_popup 0x7f060035 +int id sg_city 0x7f060038 +int id sg_tag_command 0x7f060036 +int id sg_tag_payload 0x7f060037 +int id showCustom 0x7f060008 +int id showHome 0x7f060005 +int id showTitle 0x7f060007 +int id sp_edittext_city 0x7f060025 +int id sp_edittext_email 0x7f060023 +int id sp_edittext_location 0x7f060022 +int id sp_edittext_name 0x7f060021 +int id sp_edittext_other 0x7f06002a +int id sp_edittext_phone 0x7f060029 +int id sp_edittext_state 0x7f060026 +int id sp_edittext_street 0x7f060024 +int id sp_edittext_zipcode 0x7f060027 +int id sp_textview_country 0x7f060028 +int id sp_textview_gpspick 0x7f06002b +int id startRegistration 0x7f060083 +int id swipeable 0x7f060013 +int id swipeable_bottom 0x7f060010 +int id swipeable_container 0x7f060012 +int id swipeable_top 0x7f060011 +int id tabMode 0x7f060003 +int id text 0x7f06008b +int id title_bar_layout 0x7f060020 +int id title_container 0x7f060016 +int id title_logo 0x7f060017 +int id title_option 0x7f060019 +int id title_text 0x7f060018 +int id txtDevice 0x7f060076 +int id txtDomain 0x7f06006a +int id txtId 0x7f060075 +int id txtLog 0x7f06007f +int id txtMessage 0x7f060063 +int id txtModel 0x7f060077 +int id txtOS 0x7f06007a +int id txtOldPinCode 0x7f060085 +int id txtOperator 0x7f060078 +int id txtPinCode 0x7f060086 +int id txtRegText 0x7f060066 +int id txtRoot 0x7f06007b +int id txtSDK 0x7f060079 +int id txtVw 0x7f060089 +int id useLogo 0x7f060004 +int id user_edit_location 0x7f060033 +int id username 0x7f06006b +int id webview 0x7f060015 +int id wrap_content 0x7f060000 +int integer abs__max_action_buttons 0x7f0a0000 +int layout abs__action_bar_home 0x7f030000 +int layout abs__action_bar_tab 0x7f030001 +int layout abs__action_bar_tab_bar_view 0x7f030002 +int layout abs__action_bar_title_item 0x7f030003 +int layout abs__action_menu_item_layout 0x7f030004 +int layout abs__action_menu_layout 0x7f030005 +int layout abs__action_mode_bar 0x7f030006 +int layout abs__action_mode_close_item 0x7f030007 +int layout abs__activity_chooser_view 0x7f030008 +int layout abs__activity_chooser_view_list_item 0x7f030009 +int layout abs__dialog_title_holo 0x7f03000a +int layout abs__list_menu_item_checkbox 0x7f03000b +int layout abs__list_menu_item_icon 0x7f03000c +int layout abs__list_menu_item_layout 0x7f03000d +int layout abs__list_menu_item_radio 0x7f03000e +int layout abs__popup_menu_item_layout 0x7f03000f +int layout abs__screen_action_bar 0x7f030010 +int layout abs__screen_action_bar_overlay 0x7f030011 +int layout abs__screen_simple 0x7f030012 +int layout abs__screen_simple_overlay_action_mode 0x7f030013 +int layout abs__search_dropdown_item_icons_2line 0x7f030014 +int layout abs__search_view 0x7f030015 +int layout abs__simple_dropdown_hint 0x7f030016 +int layout activity_agent_settings 0x7f030017 +int layout activity_alert 0x7f030018 +int layout activity_already_registered 0x7f030019 +int layout activity_authentication 0x7f03001a +int layout activity_authentication_error 0x7f03001b +int layout activity_available_operations 0x7f03001c +int layout activity_display_device_info 0x7f03001d +int layout activity_entry 0x7f03001e +int layout activity_log 0x7f03001f +int layout activity_main 0x7f030020 +int layout activity_notification 0x7f030021 +int layout activity_pin_code 0x7f030022 +int layout activity_register_successful 0x7f030023 +int layout activity_settings 0x7f030024 +int layout custom_sherlock_bar 0x7f030025 +int layout custom_terms_popup 0x7f030026 +int layout footer_repeat 0x7f030027 +int layout header_gradient 0x7f030028 +int layout login 0x7f030029 +int layout main 0x7f03002a +int layout notify 0x7f03002b +int layout row_with_icon 0x7f03002c +int layout sherlock_spinner_dropdown_item 0x7f03002d +int layout sherlock_spinner_item 0x7f03002e +int layout simplerow 0x7f03002f +int menu agent_settings 0x7f0d0000 +int menu alert 0x7f0d0001 +int menu all_ready_registered 0x7f0d0002 +int menu auth_sherlock_menu 0x7f0d0003 +int menu authentication 0x7f0d0004 +int menu authentication_error 0x7f0d0005 +int menu available_operations 0x7f0d0006 +int menu display_device_info 0x7f0d0007 +int menu entry 0x7f0d0008 +int menu log 0x7f0d0009 +int menu main 0x7f0d000a +int menu notification 0x7f0d000b +int menu notify 0x7f0d000c +int menu options_menu 0x7f0d000d +int menu pin_code 0x7f0d000e +int menu register_successful 0x7f0d000f +int menu settings 0x7f0d0010 +int menu sherlock_menu 0x7f0d0011 +int menu sherlock_menu_debug 0x7f0d0012 +int raw emm_truststore 0x7f050000 +int string abs__action_bar_home_description 0x7f0b0000 +int string abs__action_bar_up_description 0x7f0b0001 +int string abs__action_menu_overflow_description 0x7f0b0002 +int string abs__action_mode_done 0x7f0b0003 +int string abs__activity_chooser_view_dialog_title_default 0x7f0b0005 +int string abs__activity_chooser_view_see_all 0x7f0b0004 +int string abs__activitychooserview_choose_application 0x7f0b0007 +int string abs__searchview_description_clear 0x7f0b000c +int string abs__searchview_description_query 0x7f0b000b +int string abs__searchview_description_search 0x7f0b000a +int string abs__searchview_description_submit 0x7f0b000d +int string abs__searchview_description_voice 0x7f0b000e +int string abs__share_action_provider_share_with 0x7f0b0006 +int string abs__shareactionprovider_share_with 0x7f0b0008 +int string abs__shareactionprovider_share_with_application 0x7f0b0009 +int string action_settings 0x7f0b0023 +int string already_registered 0x7f0b0010 +int string app_name 0x7f0b0021 +int string application_mgr_download_file_name 0x7f0b0091 +int string application_mgr_download_location 0x7f0b0090 +int string application_mgr_mime 0x7f0b0092 +int string application_package_launcher_action 0x7f0b0094 +int string application_package_prefix 0x7f0b0093 +int string button_ok 0x7f0b008f +int string device_admin_disabled 0x7f0b002e +int string device_admin_enable_alert 0x7f0b003d +int string device_admin_enabled 0x7f0b002d +int string device_compatible 0x7f0b0031 +int string device_enroll_type_byod 0x7f0b003e +int string device_enroll_type_cope 0x7f0b003f +int string device_not_compatible_error 0x7f0b002f +int string device_not_compatible_error_os 0x7f0b0030 +int string device_not_compatible_error_root 0x7f0b0032 +int string dialog_authenticate 0x7f0b0071 +int string dialog_checking_reg 0x7f0b0073 +int string dialog_enrolling 0x7f0b0076 +int string dialog_init_confirmation 0x7f0b0079 +int string dialog_init_end 0x7f0b007b +int string dialog_init_end_general 0x7f0b007c +int string dialog_init_middle 0x7f0b007a +int string dialog_license_agreement 0x7f0b0075 +int string dialog_message_please_wait 0x7f0b0084 +int string dialog_message_unregistering 0x7f0b0083 +int string dialog_pin_confirmation 0x7f0b0077 +int string dialog_pin_confirmation_end 0x7f0b0078 +int string dialog_please_wait 0x7f0b0072 +int string dialog_sender_id 0x7f0b0074 +int string dialog_unregister 0x7f0b007d +int string empty_app_title 0x7f0b0022 +int string error_auth_failed_detail 0x7f0b0068 +int string error_authentication_failed 0x7f0b0069 +int string error_authorization_failed 0x7f0b0065 +int string error_config 0x7f0b000f +int string error_connect_to_server 0x7f0b0061 +int string error_enrollment_failed 0x7f0b0066 +int string error_enrollment_failed_detail 0x7f0b0067 +int string error_for_all_unknown_authentication_failures 0x7f0b006c +int string error_for_all_unknown_notification_failures 0x7f0b006e +int string error_for_all_unknown_registration_failures 0x7f0b006b +int string error_for_all_unknown_unregister_failures 0x7f0b006d +int string error_heading_connection 0x7f0b0062 +int string error_internal_server 0x7f0b006f +int string error_invalid_server_address 0x7f0b0070 +int string error_network_unavailable 0x7f0b006a +int string error_registration_failed 0x7f0b0063 +int string error_unregistration_failed 0x7f0b0064 +int string gcm_deleted 0x7f0b0016 +int string gcm_error 0x7f0b0014 +int string gcm_message 0x7f0b0013 +int string gcm_recoverable_error 0x7f0b0015 +int string gcm_registered 0x7f0b0011 +int string gcm_unregistered 0x7f0b0012 +int string hello_world 0x7f0b0024 +int string hint_new_pin 0x7f0b0042 +int string info_label_device 0x7f0b0086 +int string info_label_imei 0x7f0b0085 +int string info_label_imsi 0x7f0b008a +int string info_label_model 0x7f0b0087 +int string info_label_no_sim 0x7f0b0088 +int string info_label_operator 0x7f0b0089 +int string info_label_os 0x7f0b008b +int string info_label_rooted 0x7f0b008c +int string info_label_rooted_answer_no 0x7f0b008e +int string info_label_rooted_answer_yes 0x7f0b008d +int string intent_extra_fresh_reg_flag 0x7f0b004c +int string intent_extra_from_activity 0x7f0b0048 +int string intent_extra_main_activity 0x7f0b004a +int string intent_extra_message 0x7f0b004b +int string intent_extra_notification 0x7f0b004e +int string intent_extra_regid 0x7f0b0049 +int string intent_extra_username 0x7f0b004d +int string menu_item_change_ip 0x7f0b0082 +int string menu_item_change_pin 0x7f0b0081 +int string menu_item_ip 0x7f0b003a +int string menu_item_log 0x7f0b003b +int string menu_item_operations 0x7f0b0038 +int string menu_item_phone_info 0x7f0b0080 +int string menu_item_pin 0x7f0b0039 +int string options_clear 0x7f0b001f +int string options_exit 0x7f0b0020 +int string options_register 0x7f0b001c +int string options_unregister 0x7f0b001d +int string register_button_text 0x7f0b007e +int string register_text_view_text_unregister 0x7f0b007f +int string registration_heading 0x7f0b0098 +int string server_register_error 0x7f0b001a +int string server_registered 0x7f0b0018 +int string server_registering 0x7f0b0017 +int string server_unregister_error 0x7f0b001b +int string server_unregistered 0x7f0b0019 +int string server_util_req_type_get 0x7f0b0096 +int string server_util_req_type_post 0x7f0b0095 +int string shared_pref_client_id 0x7f0b005f +int string shared_pref_client_secret 0x7f0b0060 +int string shared_pref_device_active 0x7f0b005e +int string shared_pref_eula 0x7f0b0054 +int string shared_pref_interval 0x7f0b005d +int string shared_pref_ip 0x7f0b0053 +int string shared_pref_isagreed 0x7f0b0051 +int string shared_pref_message_mode 0x7f0b005c +int string shared_pref_package 0x7f0b004f +int string shared_pref_pin 0x7f0b0057 +int string shared_pref_policy 0x7f0b0050 +int string shared_pref_regId 0x7f0b0055 +int string shared_pref_reg_fail 0x7f0b0059 +int string shared_pref_reg_success 0x7f0b0058 +int string shared_pref_reg_type 0x7f0b005a +int string shared_pref_registered 0x7f0b0052 +int string shared_pref_sender_id 0x7f0b005b +int string shared_pref_username 0x7f0b0056 +int string string_content 0x7f0b001e +int string title_activity_agent_settings 0x7f0b0036 +int string title_activity_alert 0x7f0b003c +int string title_activity_authentication_error 0x7f0b0033 +int string title_activity_available_operations 0x7f0b0037 +int string title_activity_display_device_info 0x7f0b0025 +int string title_activity_entry 0x7f0b0028 +int string title_activity_log 0x7f0b0097 +int string title_activity_notification 0x7f0b0034 +int string title_activity_notify 0x7f0b0035 +int string title_activity_register_successful 0x7f0b0027 +int string title_head_authentication_error 0x7f0b0029 +int string title_head_connection_error 0x7f0b002b +int string title_head_init_error 0x7f0b0041 +int string title_head_notification_error 0x7f0b002c +int string title_head_registration_error 0x7f0b002a +int string title_init_msg_error 0x7f0b0040 +int string toast_error_password 0x7f0b0047 +int string toast_error_username 0x7f0b0046 +int string toast_message_enter_server_address 0x7f0b0045 +int string toast_message_pin_change_failed 0x7f0b0044 +int string toast_message_pin_change_success 0x7f0b0043 +int string url 0x7f0b0026 +int style AppBaseTheme 0x7f0c0059 +int style AppTheme 0x7f0c005a +int style ButtonText 0x7f0c005f +int style DialogWindowTitle_Sherlock 0x7f0c0036 +int style DialogWindowTitle_Sherlock_Light 0x7f0c0037 +int style Sherlock___TextAppearance_Small 0x7f0c004a +int style Sherlock___Theme 0x7f0c004e +int style Sherlock___Theme_DarkActionBar 0x7f0c0050 +int style Sherlock___Theme_Dialog 0x7f0c0051 +int style Sherlock___Theme_Light 0x7f0c004f +int style Sherlock___Widget_ActionBar 0x7f0c0001 +int style Sherlock___Widget_ActionMode 0x7f0c0016 +int style Sherlock___Widget_ActivityChooserView 0x7f0c001e +int style Sherlock___Widget_Holo_DropDownItem 0x7f0c0029 +int style Sherlock___Widget_Holo_ListView 0x7f0c0026 +int style Sherlock___Widget_Holo_Spinner 0x7f0c0023 +int style Sherlock___Widget_SearchAutoCompleteTextView 0x7f0c0033 +int style TextAppearance_Sherlock_DialogWindowTitle 0x7f0c0048 +int style TextAppearance_Sherlock_Light_DialogWindowTitle 0x7f0c0049 +int style TextAppearance_Sherlock_Light_Small 0x7f0c004c +int style TextAppearance_Sherlock_Light_Widget_PopupMenu_Large 0x7f0c0043 +int style TextAppearance_Sherlock_Light_Widget_PopupMenu_Small 0x7f0c0045 +int style TextAppearance_Sherlock_Small 0x7f0c004b +int style TextAppearance_Sherlock_Widget_ActionBar_Menu 0x7f0c0038 +int style TextAppearance_Sherlock_Widget_ActionBar_Subtitle 0x7f0c003b +int style TextAppearance_Sherlock_Widget_ActionBar_Subtitle_Inverse 0x7f0c003c +int style TextAppearance_Sherlock_Widget_ActionBar_Title 0x7f0c0039 +int style TextAppearance_Sherlock_Widget_ActionBar_Title_Inverse 0x7f0c003a +int style TextAppearance_Sherlock_Widget_ActionMode_Subtitle 0x7f0c003f +int style TextAppearance_Sherlock_Widget_ActionMode_Subtitle_Inverse 0x7f0c0040 +int style TextAppearance_Sherlock_Widget_ActionMode_Title 0x7f0c003d +int style TextAppearance_Sherlock_Widget_ActionMode_Title_Inverse 0x7f0c003e +int style TextAppearance_Sherlock_Widget_DropDownHint 0x7f0c004d +int style TextAppearance_Sherlock_Widget_DropDownItem 0x7f0c0047 +int style TextAppearance_Sherlock_Widget_PopupMenu 0x7f0c0041 +int style TextAppearance_Sherlock_Widget_PopupMenu_Large 0x7f0c0042 +int style TextAppearance_Sherlock_Widget_PopupMenu_Small 0x7f0c0044 +int style TextAppearance_Sherlock_Widget_TextView_SpinnerItem 0x7f0c0046 +int style Theme_Sherlock 0x7f0c0052 +int style Theme_Sherlock_Dialog 0x7f0c0057 +int style Theme_Sherlock_Light 0x7f0c0053 +int style Theme_Sherlock_Light_DarkActionBar 0x7f0c0054 +int style Theme_Sherlock_Light_Dialog 0x7f0c0058 +int style Theme_Sherlock_Light_NoActionBar 0x7f0c0056 +int style Theme_Sherlock_NoActionBar 0x7f0c0055 +int style TitleBar 0x7f0c005c +int style TitleBarLogo 0x7f0c005d +int style TitleBarOption 0x7f0c005e +int style TopBarTheme 0x7f0c005b +int style Widget 0x7f0c0000 +int style Widget_Sherlock_ActionBar 0x7f0c0002 +int style Widget_Sherlock_ActionBar_Solid 0x7f0c0003 +int style Widget_Sherlock_ActionBar_TabBar 0x7f0c000a +int style Widget_Sherlock_ActionBar_TabText 0x7f0c000d +int style Widget_Sherlock_ActionBar_TabView 0x7f0c0007 +int style Widget_Sherlock_ActionButton 0x7f0c0010 +int style Widget_Sherlock_ActionButton_CloseMode 0x7f0c0012 +int style Widget_Sherlock_ActionButton_Overflow 0x7f0c0014 +int style Widget_Sherlock_ActionMode 0x7f0c0017 +int style Widget_Sherlock_ActivityChooserView 0x7f0c001f +int style Widget_Sherlock_Button_Small 0x7f0c0021 +int style Widget_Sherlock_DropDownItem_Spinner 0x7f0c002a +int style Widget_Sherlock_Light_ActionBar 0x7f0c0004 +int style Widget_Sherlock_Light_ActionBar_Solid 0x7f0c0005 +int style Widget_Sherlock_Light_ActionBar_Solid_Inverse 0x7f0c0006 +int style Widget_Sherlock_Light_ActionBar_TabBar 0x7f0c000b +int style Widget_Sherlock_Light_ActionBar_TabBar_Inverse 0x7f0c000c +int style Widget_Sherlock_Light_ActionBar_TabText 0x7f0c000e +int style Widget_Sherlock_Light_ActionBar_TabText_Inverse 0x7f0c000f +int style Widget_Sherlock_Light_ActionBar_TabView 0x7f0c0008 +int style Widget_Sherlock_Light_ActionBar_TabView_Inverse 0x7f0c0009 +int style Widget_Sherlock_Light_ActionButton 0x7f0c0011 +int style Widget_Sherlock_Light_ActionButton_CloseMode 0x7f0c0013 +int style Widget_Sherlock_Light_ActionButton_Overflow 0x7f0c0015 +int style Widget_Sherlock_Light_ActionMode 0x7f0c0018 +int style Widget_Sherlock_Light_ActionMode_Inverse 0x7f0c0019 +int style Widget_Sherlock_Light_ActivityChooserView 0x7f0c0020 +int style Widget_Sherlock_Light_Button_Small 0x7f0c0022 +int style Widget_Sherlock_Light_DropDownItem_Spinner 0x7f0c002b +int style Widget_Sherlock_Light_ListPopupWindow 0x7f0c001b +int style Widget_Sherlock_Light_ListView_DropDown 0x7f0c0028 +int style Widget_Sherlock_Light_PopupMenu 0x7f0c001d +int style Widget_Sherlock_Light_PopupWindow_ActionMode 0x7f0c002d +int style Widget_Sherlock_Light_ProgressBar 0x7f0c002f +int style Widget_Sherlock_Light_ProgressBar_Horizontal 0x7f0c0031 +int style Widget_Sherlock_Light_SearchAutoCompleteTextView 0x7f0c0035 +int style Widget_Sherlock_Light_Spinner_DropDown_ActionBar 0x7f0c0025 +int style Widget_Sherlock_ListPopupWindow 0x7f0c001a +int style Widget_Sherlock_ListView_DropDown 0x7f0c0027 +int style Widget_Sherlock_PopupMenu 0x7f0c001c +int style Widget_Sherlock_PopupWindow_ActionMode 0x7f0c002c +int style Widget_Sherlock_ProgressBar 0x7f0c002e +int style Widget_Sherlock_ProgressBar_Horizontal 0x7f0c0030 +int style Widget_Sherlock_SearchAutoCompleteTextView 0x7f0c0034 +int style Widget_Sherlock_Spinner_DropDown_ActionBar 0x7f0c0024 +int style Widget_Sherlock_TextView_SpinnerItem 0x7f0c0032 +int[] styleable SherlockActionBar { 0x7f010000, 0x7f010001, 0x7f010002, 0x7f010003, 0x7f010004, 0x7f010005, 0x7f010048, 0x7f010049, 0x7f01004a, 0x7f01004b, 0x7f01004c, 0x7f01004d, 0x7f01004e, 0x7f01004f, 0x7f010050, 0x7f010051, 0x7f010052, 0x7f010053, 0x7f010054 } +int styleable SherlockActionBar_background 2 +int styleable SherlockActionBar_backgroundSplit 3 +int styleable SherlockActionBar_backgroundStacked 12 +int styleable SherlockActionBar_customNavigationLayout 13 +int styleable SherlockActionBar_displayOptions 7 +int styleable SherlockActionBar_divider 5 +int styleable SherlockActionBar_height 4 +int styleable SherlockActionBar_homeLayout 14 +int styleable SherlockActionBar_icon 10 +int styleable SherlockActionBar_indeterminateProgressStyle 16 +int styleable SherlockActionBar_itemPadding 18 +int styleable SherlockActionBar_logo 11 +int styleable SherlockActionBar_navigationMode 6 +int styleable SherlockActionBar_progressBarPadding 17 +int styleable SherlockActionBar_progressBarStyle 15 +int styleable SherlockActionBar_subtitle 9 +int styleable SherlockActionBar_subtitleTextStyle 1 +int styleable SherlockActionBar_title 8 +int styleable SherlockActionBar_titleTextStyle 0 +int[] styleable SherlockActionMenuItemView { 0x0101013f } +int styleable SherlockActionMenuItemView_android_minWidth 0 +int[] styleable SherlockActionMode { 0x7f010000, 0x7f010001, 0x7f010002, 0x7f010003, 0x7f010004 } +int styleable SherlockActionMode_background 2 +int styleable SherlockActionMode_backgroundSplit 3 +int styleable SherlockActionMode_height 4 +int styleable SherlockActionMode_subtitleTextStyle 1 +int styleable SherlockActionMode_titleTextStyle 0 +int[] styleable SherlockActivityChooserView { 0x010100d4, 0x7f01005d, 0x7f01005e } +int styleable SherlockActivityChooserView_android_background 0 +int styleable SherlockActivityChooserView_expandActivityOverflowButtonDrawable 2 +int styleable SherlockActivityChooserView_initialActivityCount 1 +int[] styleable SherlockMenuGroup { 0x0101000e, 0x010100d0, 0x01010194, 0x010101de, 0x010101df, 0x010101e0 } +int styleable SherlockMenuGroup_android_checkableBehavior 5 +int styleable SherlockMenuGroup_android_enabled 0 +int styleable SherlockMenuGroup_android_id 1 +int styleable SherlockMenuGroup_android_menuCategory 3 +int styleable SherlockMenuGroup_android_orderInCategory 4 +int styleable SherlockMenuGroup_android_visible 2 +int[] styleable SherlockMenuItem { 0x01010002, 0x0101000e, 0x010100d0, 0x01010106, 0x01010194, 0x010101de, 0x010101df, 0x010101e1, 0x010101e2, 0x010101e3, 0x010101e4, 0x010101e5, 0x0101026f, 0x010102d9, 0x010102fb, 0x010102fc, 0x01010389 } +int styleable SherlockMenuItem_android_actionLayout 14 +int styleable SherlockMenuItem_android_actionProviderClass 16 +int styleable SherlockMenuItem_android_actionViewClass 15 +int styleable SherlockMenuItem_android_alphabeticShortcut 9 +int styleable SherlockMenuItem_android_checkable 11 +int styleable SherlockMenuItem_android_checked 3 +int styleable SherlockMenuItem_android_enabled 1 +int styleable SherlockMenuItem_android_icon 0 +int styleable SherlockMenuItem_android_id 2 +int styleable SherlockMenuItem_android_menuCategory 5 +int styleable SherlockMenuItem_android_numericShortcut 10 +int styleable SherlockMenuItem_android_onClick 12 +int styleable SherlockMenuItem_android_orderInCategory 6 +int styleable SherlockMenuItem_android_showAsAction 13 +int styleable SherlockMenuItem_android_title 7 +int styleable SherlockMenuItem_android_titleCondensed 8 +int styleable SherlockMenuItem_android_visible 4 +int[] styleable SherlockMenuView { 0x7f010055, 0x7f010056, 0x7f010057, 0x7f010058, 0x7f010059, 0x7f01005a, 0x7f01005b, 0x7f01005c } +int styleable SherlockMenuView_headerBackground 3 +int styleable SherlockMenuView_horizontalDivider 1 +int styleable SherlockMenuView_itemBackground 4 +int styleable SherlockMenuView_itemIconDisabledAlpha 6 +int styleable SherlockMenuView_itemTextAppearance 0 +int styleable SherlockMenuView_preserveIconSpacing 7 +int styleable SherlockMenuView_verticalDivider 2 +int styleable SherlockMenuView_windowAnimationStyle 5 +int[] styleable SherlockSearchView { 0x0101011f, 0x01010220, 0x01010264, 0x7f01005f, 0x7f010060 } +int styleable SherlockSearchView_android_imeOptions 2 +int styleable SherlockSearchView_android_inputType 1 +int styleable SherlockSearchView_android_maxWidth 0 +int styleable SherlockSearchView_iconifiedByDefault 3 +int styleable SherlockSearchView_queryHint 4 +int[] styleable SherlockSpinner { 0x010100af, 0x01010175, 0x01010176, 0x0101017b, 0x01010262, 0x010102ac, 0x010102ad, 0x0101043a } +int styleable SherlockSpinner_android_dropDownHorizontalOffset 5 +int styleable SherlockSpinner_android_dropDownSelector 1 +int styleable SherlockSpinner_android_dropDownVerticalOffset 6 +int styleable SherlockSpinner_android_dropDownWidth 4 +int styleable SherlockSpinner_android_gravity 0 +int styleable SherlockSpinner_android_popupBackground 2 +int styleable SherlockSpinner_android_popupPromptView 7 +int styleable SherlockSpinner_android_prompt 3 +int[] styleable SherlockTheme { 0x01010057, 0x7f010006, 0x7f010007, 0x7f010008, 0x7f010009, 0x7f01000a, 0x7f01000b, 0x7f01000c, 0x7f01000d, 0x7f01000e, 0x7f01000f, 0x7f010010, 0x7f010011, 0x7f010012, 0x7f010013, 0x7f010014, 0x7f010015, 0x7f010016, 0x7f010017, 0x7f010018, 0x7f010019, 0x7f01001a, 0x7f01001b, 0x7f01001c, 0x7f01001d, 0x7f01001e, 0x7f01001f, 0x7f010020, 0x7f010021, 0x7f010022, 0x7f010023, 0x7f010024, 0x7f010025, 0x7f010026, 0x7f010027, 0x7f010028, 0x7f010029, 0x7f01002a, 0x7f01002b, 0x7f01002c, 0x7f01002d, 0x7f01002e, 0x7f01002f, 0x7f010030, 0x7f010031, 0x7f010032, 0x7f010033, 0x7f010034, 0x7f010035, 0x7f010036, 0x7f010037, 0x7f010038, 0x7f010039, 0x7f01003a, 0x7f01003b, 0x7f01003c, 0x7f01003d, 0x7f01003e, 0x7f01003f, 0x7f010040, 0x7f010041, 0x7f010042, 0x7f010043, 0x7f010044, 0x7f010045, 0x7f010046, 0x7f010047 } +int styleable SherlockTheme_actionBarDivider 9 +int styleable SherlockTheme_actionBarItemBackground 10 +int styleable SherlockTheme_actionBarSize 8 +int styleable SherlockTheme_actionBarSplitStyle 6 +int styleable SherlockTheme_actionBarStyle 5 +int styleable SherlockTheme_actionBarTabBarStyle 2 +int styleable SherlockTheme_actionBarTabStyle 1 +int styleable SherlockTheme_actionBarTabTextStyle 3 +int styleable SherlockTheme_actionBarWidgetTheme 7 +int styleable SherlockTheme_actionButtonStyle 53 +int styleable SherlockTheme_actionDropDownStyle 52 +int styleable SherlockTheme_actionMenuTextAppearance 11 +int styleable SherlockTheme_actionMenuTextColor 12 +int styleable SherlockTheme_actionModeBackground 15 +int styleable SherlockTheme_actionModeCloseButtonStyle 14 +int styleable SherlockTheme_actionModeCloseDrawable 17 +int styleable SherlockTheme_actionModePopupWindowStyle 19 +int styleable SherlockTheme_actionModeShareDrawable 18 +int styleable SherlockTheme_actionModeSplitBackground 16 +int styleable SherlockTheme_actionModeStyle 13 +int styleable SherlockTheme_actionOverflowButtonStyle 4 +int styleable SherlockTheme_actionSpinnerItemStyle 58 +int styleable SherlockTheme_activatedBackgroundIndicator 66 +int styleable SherlockTheme_activityChooserViewStyle 65 +int styleable SherlockTheme_android_windowIsFloating 0 +int styleable SherlockTheme_buttonStyleSmall 20 +int styleable SherlockTheme_dividerVertical 51 +int styleable SherlockTheme_dropDownListViewStyle 55 +int styleable SherlockTheme_dropdownListPreferredItemHeight 57 +int styleable SherlockTheme_homeAsUpIndicator 54 +int styleable SherlockTheme_listPopupWindowStyle 64 +int styleable SherlockTheme_listPreferredItemHeightSmall 45 +int styleable SherlockTheme_listPreferredItemPaddingLeft 46 +int styleable SherlockTheme_listPreferredItemPaddingRight 47 +int styleable SherlockTheme_popupMenuStyle 56 +int styleable SherlockTheme_searchAutoCompleteTextView 31 +int styleable SherlockTheme_searchDropdownBackground 32 +int styleable SherlockTheme_searchResultListItemHeight 42 +int styleable SherlockTheme_searchViewCloseIcon 33 +int styleable SherlockTheme_searchViewEditQuery 37 +int styleable SherlockTheme_searchViewEditQueryBackground 38 +int styleable SherlockTheme_searchViewGoIcon 34 +int styleable SherlockTheme_searchViewSearchIcon 35 +int styleable SherlockTheme_searchViewTextField 39 +int styleable SherlockTheme_searchViewTextFieldRight 40 +int styleable SherlockTheme_searchViewVoiceIcon 36 +int styleable SherlockTheme_selectableItemBackground 21 +int styleable SherlockTheme_spinnerDropDownItemStyle 30 +int styleable SherlockTheme_spinnerItemStyle 29 +int styleable SherlockTheme_textAppearanceLargePopupMenu 23 +int styleable SherlockTheme_textAppearanceListItemSmall 48 +int styleable SherlockTheme_textAppearanceSearchResultSubtitle 44 +int styleable SherlockTheme_textAppearanceSearchResultTitle 43 +int styleable SherlockTheme_textAppearanceSmall 25 +int styleable SherlockTheme_textAppearanceSmallPopupMenu 24 +int styleable SherlockTheme_textColorPrimary 26 +int styleable SherlockTheme_textColorPrimaryDisableOnly 27 +int styleable SherlockTheme_textColorPrimaryInverse 28 +int styleable SherlockTheme_textColorSearchUrl 41 +int styleable SherlockTheme_windowActionBar 60 +int styleable SherlockTheme_windowActionBarOverlay 61 +int styleable SherlockTheme_windowActionModeOverlay 62 +int styleable SherlockTheme_windowContentOverlay 22 +int styleable SherlockTheme_windowMinWidthMajor 49 +int styleable SherlockTheme_windowMinWidthMinor 50 +int styleable SherlockTheme_windowNoTitle 59 +int styleable SherlockTheme_windowSplitActionBar 63 +int[] styleable SherlockView { 0x010100da } +int styleable SherlockView_android_focusable 0 +int xml wso2_device_admin 0x7f040000 diff --git a/product/modules/agents/android/client/bin/jarlist.cache b/product/modules/agents/android/client/bin/jarlist.cache new file mode 100644 index 0000000000..21d5ff1dc2 --- /dev/null +++ b/product/modules/agents/android/client/bin/jarlist.cache @@ -0,0 +1,5 @@ +# cache for current jar dependency. DO NOT EDIT. +# format is +# Encoding is UTF-8 +1417676912000 484258 bd6479f5dd592790607e0504e66e0f31c2b4d308 /home/inoshp/Documents/work/EMM 2.0/Source/CDM/product-cdm/product/modules/agents/android/client/libs/android-support-v4.jar +1417676912000 484258 bd6479f5dd592790607e0504e66e0f31c2b4d308 /home/inoshp/Documents/work/EMM 2.0/Source/CDM/product-cdm/product/modules/agents/android/client/plugins/ActionBarSherlock/library/libs/android-support-v4.jar diff --git a/product/modules/agents/android/client/libs/android-support-v4.jar b/product/modules/agents/android/client/libs/android-support-v4.jar new file mode 100644 index 0000000000000000000000000000000000000000..428bdbc02a1aa32649e236e0734261bd68bc4e6f GIT binary patch literal 484258 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ПpHSAC30$g7yH$GiAcgHdf4hoNNNW2%pqu zqm$p?=GRMDf)wGe9H;r09RK&TjQ_Hv_fKyvIs3o#YMlOcZ8BTg>aQr}Re~xWmlV(? zs?N)M$fu!?PsQp%u!|&~RYs>FD#&9D94X_agdk;f?l|+*?Cc_nlWWB`!pX#_YNFxmH!C(N&tDvv;ZIOL8 zln~KycEM#t!65H6S7MIYG1cwkgJToX#!Uh7nD!v1YT~^O=yH5Baka@kZ`|#wbwy64 zGVk<#aTEU{gwHCimv*-{QOZ?=)-Oy$&YhLoiUXUqt?e~0l(rlvXm9#ypZqrh49bO8 zjF;);Ui~<$*V=Q*=8>KT7=_m#BR!X@Hr2?#-iNrqTp^2UeGL5SZhpy­S=@2b9k zA3eAHSw5HWdUIZ1FA~sHPZ`lLFjJC^-n>GokPAubRwzuqXJ7x=a^V*3ye!1c_b6E) zU!M|0<8*1MhLSvdR~q|H!_w49fJ2ze1Vc)XQ>~m+qmu$MxxI3*IPkP8V4HlQxJX&? zd@PZ3ca*?_t2$Sq8!ttbCas&IP|m8O(eTcdUte?SCPFdx#EC8D_RMF7(S@S};zU+s zusOgWDt%|rJ3x>_@mLthu(?1kFMRjE=+8zyA5&8NC&F z;`d1y&0eGHA&kApN~+`mGfQkXqa_X>%!SsViBOzqRVp6UiIXuay!C*uuXW=8geVwl z{vsTYz~#(Z$m%bv8ETmvv;b;eiOtKk6{FiA7_=UW4de)f*ayZ1ye};G1hE6Q-H+v6 zp&I48zObE*0nx*axV$|k8Mjzetz{e>ZZF?b2Eh(VFTIsUHZg!KW^Vf3NUu{F{wW4Ons z9n{ly(Hkrc`470}ydJ`H$WmiODNBMzC1f0iOC00_KRipirJtygu$(d`7rRgkzn5gZ zhMMs%kcMQhP?y;q{9nNC(=j*p_A9CQ{zd%h-+|qKX#xKnD*kD{CG28jPrcTl;4mbX-UpQ7sBw_Qx6(Q-Ow-C z%HP$XECqV;w_}maYCZhf0!ADfx$UNTn7M!Z`h7xfbLJex^#;fuCp)lZ4&4`(cXVJbLoA)e+Y*9zpOf|$mf5ZXdF@aZWOm+z_6 zm^5d>0n2X~rnlz9`4b)2f#;C7{^fS0rS>zdbw_%Qnj?Q(GPOnz$!w)Qqttui9OzM} zqgwE!<26~Mx*o;MH58GfY=)&ayYMB?-q)&KJ7>*q? zVwvFAV@kNrf;5lFWDj2d_-7_a6Mw1iIxlJrlRmS$QY-VSQ*cA+$t~sNw+Lu!2`PS0 zKBNkf*PZCj$A;3EySk-(SCqpTV8RW)Xz$mpC*~?T(-5X=XD}Fz7b#E2Ul)+=^JU_6 z@k<1}0%kRyK&l(>5d%jYWO9z-OZeu5!Nh_bqW-@Y$IVgdzYnym1xdn7fsi zG~tW;miY?oelJ(0eTHTKCBDozNtFbFZH}CaEa)wUk=-i!%;cwP65V~D))L;)ite-- zrf^}zIV2%ps^x4Nb^=Fr0{ELbmfJUcIFzsG+xV|XlFa`Zfc!K1{sG(mZLYBSnkx{7 zKcRK9GeSJRA#WYCnalzrCFHNTT*7=6{L;AKIbFgk0 z2?t|9fwNa$0XvT4$-4*UGl-|Km+t$cEpK#>aIKE_ZUB}(A$I+5fnDUq^02Ys{sgh} zyA7q@Ek_`QJ2PtePB$w%{rU6Co%{$)>qiNX!Iq&sD8(;mLN%2jt1<`hx=xFzc>T9G zLA&5nD;+8tLDK6%)R-xUKQZPMz1LMD{7lPIAE_?UNU;51gFSm5FrXBk5czjvhE29S z7CDhNRjn=XKj^VtKUOShZa;m zrfrY+(%rtXoKrgi*Gsq!6y(d!lSMAEfRR^iQYGwBZpU~Ed9ImE^&xDCb-RN@ z#@btC54+s!*l~9x8s#C0Rn1g6sDv?}wdaK6)W@h0#p$u0wX+}_|Kj(*hTB0=Md9{;9d5b)a}@p`V6cR(p`H8x1i?u*e>r## zf39^nHuG9gq96#1c$mW<2qWN2GRzH#&*e!V7G5@=LrVSW@Z2E2s%AlyV7dMhXNYQC zE>!jhai2}!XiMLk>bLd#e7=V6`L3EEZm{%&FC4=ZS-c>Q#GrgJ3+XZ0J+FHT+udB> zKfku^1TfAfRMR>B*orGYTc`KJ$4?R2Ov6M%Ww>_0bcGA{N|T!$Q{TH`)A6hSJ>r(r zemz4;yZE>pbqA_#EbjnX3&wM_5}8~Ft)>x?r84ICXeDfe@wjd@dvh!O0w2?uW5saTAT>f6pqY4iz;)EAcyCOGP$k^%_Q>Uz zeUl~TZbKj*Z|ua3T)A?9Y2qvRsVKvM<$_+|@|mSNOK=4G6YEj3d{+EC_!M0eUJlkETe^?MmV{<_d|COF1>+3%uP3sfO22hDi~ zansQTFxtCObus-VxdA>L0q&p=);m0sRXMyFuskb^q9&RUK|_o{9MOJeCX873%Mor- zu1EaojMtbaNEYbqJRwAuP(m9H5O}u$;yTTZ0g!x5+Z|Wu0q7eA-4Ir{FupS>^ooz) zc`^hw8>jx5I%)pg3+SL7Yr$PH`XvFFDZXJ=yaTf5^TJsIikav689Ei=UWhIgQnVrq zN%yc^Dmm_cRFfVgEFIu!r{9$j8A47NOu>kYhAEOstZ!tu!A={1XK&# zUd3O@aQrVQ``-b{PSd=P>pnRNpRa?ZpFsB9AK8PdD-AfK1p$SaV_7gUJFWJ^!Ie;I zs8fGE$X^fo6uPZwE9QM|aH8D?4@eQ)$UXi^V z)T44psT}m9G}!cR8%qxRwIJGi-MqWPajc1lL`tsl_1A5|S?$=3l7_G8?vaLd2(8?E z-vGVL+t@%Ytno&Dg-YdlllIz==_f|3B`RgwTE#R7;NeOb>|^^#-Bmu59tx~uXE*R} zZrkjKGeXi(qi_`m8+w`)SPHj^N5S!Hz>j81x48<8V^{bUA{x)8nHx!O%Ds!CBIgA< z=%Cp=MRaIZ;L0J|TAU}@w(Vso?o-`1OXPkkx4w*~@yS#&LFxt3L)c9gw_4TQ^y|Pn zhK_3e$qAGUH}gRp?m8=H$1Nb_+EKE)>KXX3wqwK^xIh^YA2p&CJ5bUNOBuEE58+%_ zCS=*c#y-y;w?}O)FJnseKgm1iNJognPJQQKFSk-JObml7G0!I7kMYdv9+x&OxYLqS zNh5tnD`YkNiC=}&pkle4FP08=@;~B#Ftw2Vp5cG@%-m}tq2@Fe;ozdqFHGF0JDD`6 zbT-Yty1SaQr6(S>pk_4Fm$+|B#eB!4&KvkqW4$ct&uk+_ILx}5gRg&5%Yn&}&wDcL zi>2P7ZXUtK%pxGQj9adWsw)?pR3Tw$5q`7^`CImUBZkCO1bM>rgf|$RvHFT@li?aW znAu&)0Q-XFS}VBYN+#HD$2Qn22s_0D#Eoj5y5YQGJ@i%PO?Kze@ezS|KN<-s(C7ifq_ zFtr2oO^+4WPPa{Vkn}KB+CL*$g~bn6z_#LK6qK7d@G|e1`0I{YHd-f|8D7xxMTa+m;x&toyly_?7g z{KEA0SxozU8n5seScju^;kC#p;3f`aJfbr%={>;S{;}F-HQdXarLs`R8_-7kn}G(} zisoc`2kpHTy{0@D?%g!}Amhhbz7lQJD+*>KO|b|9O@M?i=kfI_ON%GtK8%Z|)rq3) z!97FtCF|MA>1CnmpVGQueyirb9^5Qg&h)f5fz-tCa>~$>l1Gx)ouC*J&quPOHRLfy zsAp^$3NiBKdnT7B(Rgp{?r69hc*CqSp`@(hs%YoWZBUHBOe}M&JYGRd`*{y-^n9T* zOhQ@~WJ2m+%mGO4M1rX^7Z9BJ)WmlXI;i=NS-v*(%ah0Zp7@Hwi!#<$;gzu?Y)EQA z9mn&wITt%eKmg(~p9NiHqunF!KZ)-gJ=h_leDMUIdI9S;M0(W*>~*63WW2!4_k4=y zSluaR$Q4NMHE3Ph?^PBNM3+iSKySjaWTg`Q~0+!%eR%!rxPum(gX$Vwt-GHbOURLIQ8nd~}V zL{+HqD7!HG`QfJ_%)9$_Z^-vhy6u!4E$kJFVc30ajMlK;&?amrp!G-0YUgL+-bs>?6TW$I21Go~Qjzw?POEI;hPGb!KQSJwpxf7xROn%nb$o~aS$UoKdlZ@9GCX3IYl*IGMqD7psG`jBXUL%D$&L*wc9zoyAN z=HzHS&vi;8cc_d48%XqK)zsP)5osXfN=z@PqqvCPf4vzNTc!fra1lie17T_ zPEH6>Hr@KpyYK1{aegs^koQ*n8|1H6NZof6*7&7&ll$f9^1lz2|GgD5{%2hH&sO+9 zr<1>T#AFolO0Iv5RaWKB(LxtXxHEUCx!5gIR^+-Y?(^GX%zIRt!1PBbMD(N zkg`Scftg>D$@B%1{FQ#CYkO(w(f!#;&c-D_pC70_WbCf_fH;gABi1mh_VNsp5U_38 zs7!J6AVZ7-EcxPo3X@#fPICyi!$NsAtfhyfkY>M5z}JPXwv!Uli=&3Y0q)vFDHZlX z!+C4@WPB1usuFVyMN-iLU0YwWQBcO5F(3VHkUX7GSZYa7{gl-Z7vZ&7T*W+HM2c=! zj&_dT0z)-f3`)&8!d;Y!1i21MazqtEd!@T8X%hjC5Za)n!UNbx6tWf*bc#JY&XmE$ z<>ub!n7yic0Re9AZjhwQ`Y&m>00h~)S_C2s?rDS5#uCyaHp$944b`Whk}8|9-3WVW zR`@8y$EHzA7+gxKd|C&FNJdm%W6hvLAv8!>4-G~fCzTSLag&jV;j~Jn$00_YHtW}% zAmmVgv(9ylK2l*lR1yCcWV;$%_6UKGYf`U3A2aD>^>Mq2(B*-Wnb|;QEK}z!!PF2h zt_$MALQGmNyzTrL)n67PryTx?T&9erMtIQPJYpQ#n^GVM31TaKW`!%o5q(rehic13 zy%NoMf5?JremBGCKl<51p&G6v;CzIC+MG1WqNGd6b;grjuxv$mKUxcUr-J8xfKcT=xQTfCX3)n92~KqRguQNxudF0GaHKxxfA1K=gqhohSA(kd~8M z6@JE4#8kGH@1ZS0885Odu%=;Q!Q2X6sQrJWy;G28QMWBvS!vt0ZCBd1ZQIT-ZQHhO zJG0WZZKLZyeQ)=@{cxf?I$}NTmld&>#vF6bF+kz9Lx!Ib@f{~m3hZ2rFT=lmz;v#9 zpFQ{u^x1@T@jNA5vh&xD3(!M#XC=WDP)6plY&Ccys=Cu&fYru)=-hXruL$lb<-P;R zdD^GzlroQYcj7MJfrMoD(G*r1+;rUHJ=0Tq#mfMy8NGC0}KLNFmiB*>~J;$BP8_gZTUKO}ZL&ek&k%j&FCr%w&7brZcbQ_V)a% z`y8;uqN=Ijh-_!6G2n})ZmUVqh&v8}v8zxQR!uoXIfc5188p~{K~u$WRJq3JvBDb8 zJMgH%N9#Nydg^nIax-txtLKf3(Z=t}zzB;iXs5&pg41ho$|fLM>BBjUF7-+p7pEP=E^tFJa&BZg zOr}i1RGIYyUWjFQWUas?=ay#eqn3_aBGMb?lpeQLEN>e;X&W@{2^~Tgo)zU0yG{@P zO4tUzAbf+=I3tB~IR4c*&pTxAC&MXh`SOdB*Dv@HGRC85>>44J%lUG?+asE_t6!;W z*r{t!>K5Wa8DA_)!4usfoPori^PDwEF?Gs?5KgD)Ha$ z)c;QobpJ`|%3ByYyEvNsFN9X{e?%=6{t;Sc78)IND0c(X*b(b!CPzdOq#1L;;`0cJ zMDRV?wy{TP*S1?ZNN;FZPcl1;?67>l!r^^?@h3URb}B=$0a?taXK$tN{A-nU{Z~44 zhunvPMx#EaF0M}`aGb){+MK>P^7lA~O^M7@dWz}MU9PC|JYOGU#;F$ttl=<8NLMG- zc3LB8;$VqJsJ4}2(gQDLxB>eW=F7%GfCB6}D&I@sU6I%LRI+#l!>~P1c-L6>-LUu? zRiteq5|xWN4qjVV;~;<0!I`OK*(ACl9LIvHOva~Q_t^*Wn5s(^IVsNOtZJ!pi9mT~ zq-wBI#f((`zTLS!As`pJi%RVPTwMd%3Fg>PM^%!@I86#Sbg63Md}eAN&+wQZg2g{W zzK9n6Rr1wRg=*_$LHQeWXIB>RVM5+IGZ^Tuf!;&iaE9D8g`g($ElGOup*4&aX+XQ=z%NS{i+YBLzOg(>1@bh9Dy2Ay$0MD-7`=KrYJvU2V0pkd zVm)Q`@Jj-_RDa`isRUjE**Wp;M|Er$r<<)JOw9LuwNs$`Vrdl`>qg@vWmR`0Nb(vU zo8It!jC~lx2a4w1-uZ8?DcILVG>=S-HG3K!^BPcu=@|3<-4xxb8yACpNRC3R9Sh`(9p&?T3 zn6y};lJxXdQ8m*G|0?(}Z2Xu0DYU5})C~U+9h-hUF$S$c!}L|Qrw*4t`{YEvAtv5y zV$E90*egWm95p{uhA)KSdXTTxK||Ql7EGJg{p%zdnufE4;UpWYgyEgIBy8niiqRb` zVB@j!CchVwvilg`;zt~%4{T}f{_FC-TPD6K`FAAr|2G8j|Ag`XP2O0^#oom6AIB?X zU~O$;EaGlt@?Qz$|A8UodFB4e?edfo2FOz=?;GhG?+R5!4yh_bsxXM)LY!ZdsWM1j zj=4~Mqah;!^ZVli+$91)8TF-R-A>$YXnOs+dVt#g@C$->BXASCVg^zdCu1{TW)H<0 zQo0j5&mfy6&xn;WgZUXUjn73Urz~`2NqNy9gHnF278RsHR$_gVzF!N_VuaMsrL$5U zM0Qj}xp;ewi>TZc)f8o8u_KBQHfEM8tIA^X8lEOac459>Ai^jZT4qjYEs@}SF&fTc zbl%pFFudw<4c@ipyH@P3P&=wwl}f%Xgb?z)cbGD+Cke9>u#s&QGIMbI0eO)f5*A@K zp94MN8fMRZS3qMs2cg*%Y|N}%@^0k*=LWhNKAwR6S5Q*)zZI4I{{(FRqgXLnaZ+-K z0fpB=)XHk2x{QT>@=1 zUbZ`vHFmVVwbY}VP}#E&wHCU2Cu|UQ-$s&jffmfJ2X%jdQ^;C4ytn?TtX)eP5Epq?Av-N+6$N$fTX83;{9{&fK z|DR{7+6P=;S!MaQ{U}*F1mQQ3AQB{R(R{x=Fi2ROKZ$={m=IH(K3O=W^F_g`7qpBp z1Dp0AB!o*)=cVSCZI_jr&dTeW?~~1!4`%O|jIX-z=AV32m+T&qp{@78c)oEvcK1SH{FgxVeto;}o&+)c z!r6FiZ^U4Ji-Y(FvDlxGiTo1XvF>${lVZGci92F|Qkd^1@Pz6Cz0(I6pPcCafLVp> zS}?zDV4pW=Fu%XM^d9=Zc5LobDSZHZweu&e@QrV+c5mdT zJHh;7Cpym__CGQg$$m1&e{64S z&F5AY53qy$E&?n*xv@UF$Ng?^@!#a|UXygglrxnS?7|B ze@QJy;XulcjDk!`r1F|hO3$={Qp$v~#Yi$KHW4UP#d7=KN1mBP(er#Ir&1RDN{{SA zzu>cI!LSVDvcf9%0-Qv+Sm8>vL%^2(ZsaKwJxwu*Hh|G1an6&Z+F{;}iAIMINF-pM z!VC;K?q#FmkZVQ5(y%GXYb@4D$aUwN!XpahjfTu)F^FZO5IqcOqH)D;M;6R}yQGV| zB%UV9<&Hn53+9$TQs&LFobzmelENfrF!2X&?BrEquAn3{%t+?-E z)~9e)70!ApWyzdzmT;tU<%j_uWE_Bs{g{TqBG~Cvk1}t3 zmmRwZG)XNPhdvZ=8HZjm>K|*H=E&9i}00V+mJeL;QpUAK~2Cvj<3- zw{k*0=HZi)*MUK@NP45&AgB*^rO#}#uL%^r%zbPnZ>z8yo+@!~y9j)kyTZ_ELLpwU zPvKm@xs%+ISM=!bbdFEx{-0!;trw8zos!pB%5STP9qBu6IvB_j5u)vRsa)B|@IpDW_o0PSXdk501y)hl#PE!vbF}8=)ik=j zX@X>xEGsUsy_aAgd{m-+!5EoM(a~wLm^#gwf)?jL+ZUiEQ>SP-Jah#l&JrjaOVMa3 zDW~aa)eC-&Y+Th;w7mg9p*K;(A0(lU>C*Mo6*)Xq`x7t$!^NsTCw(}6E}Z*uddu?R z6#8<|-6J6r6`P+OTss*W$xpCh2GSBo_m+A>M!1HlnANi!=sHf=m6bkHm7hlByJM?= zEb`bueiqHYFq|P#s-9B`#nI_R{TrwqMi~E^J*uRxEGeg)EVC~!FE6ql*5JfnR8~)C ztDb1#-Kw#dojv{W^=R+K@xU3=JFBds684<@gy21JS4L4~e@*?kKtYkyZ>YVTN&x$0 zNP7*fa{!xpN?lq^rnb-it#tm`1Lo%u-`i22Q|9K$`RdYoYqJrDa?Vry8}Vu3@!Qf5 zx8*5A2luZ!p0&v?ZPkeLKc~K)oL!pt+%(O@%4b5g_g4P+0tPaM;(9nOY3aUxe z<9Z+w!Eig$e>(XLOL{xW?-(Z|Nh4hlb=p@ zFHZj=A(<}p_Tk9+J=Nv;2*Ad<^Fg+TJ+`}uh_+a*`m)`)}c+*lZs zU$T|Ryk@2%GK4ab>{bE&*lRhc5|kz`3>XK4n(DjS(R&3oFkgXAbyCNA z29=(WjLy&;niEt+Dhf&} zTA65wd#eRcab40n2h`{io5}KJLg1V@BHXfVbLhnFh{cXSJwTUQCFowuy_$ zAV|~0SS<6J`8fWtgD{JJn`1>e%sfKijfc&eiq<;zD;PJjv zhPZ8g^Fm=9$W6!2My7hwmAoSo5a8e2rC9xVeP;7=BuF}HsrPH6*+ix1=;`Wd(4*;5 za4A5Ko3^v|WH-&0Zr)@ED~Hfhi&LW;?0 zCBcK!xY=E;Ee1F25BBCZ+=V~EXvq|oK$RUlhNT2=I}T~vQXDuN>~J{SJe{V^n@Te( zU*+~pgs0yiV~YoPI1>MK-jdcFSo4bB^zn%HgT_M>x8U9$-d_L)=d{}O@!pWpU7Zll z;yJCGG{G5(nzdkVSH+0hb%yE4oto-i!2sO!N~@5eP2N@{57V?>HA+pRju4KWx=szah))5bc}ynUICbv>Rp>RUtSLA%t})5*H7%_u=iL$elZln7ZoQIW`J-{4bq=;i#-+y+Cq-!T~H9v%eG! z@k6)73mNOX_2o|4xioSPGOX9XCaL1Fc>{AKHz1Z9=I&=Bw=0bhi-lY5M9HR(#ogS# zjP-m>(zh7SV_(g$#r;zWj@4Aw>=Wh(JKANR4u=UefMeNX4-P6{e$Gk ztm?e!xL-FX;~}m|%0LamTw_Bh3=(m0Ox)u!MY1z3h~eg-E*MYR`lJ` z(XBUX;X|`g7@1*}Ppa;p=dx?N>XT3D-=%_N*=$;yN{x8$7oXe4{Gi*HCVps&OagV? ze1(ATmvPioO+w#zNLi!J5l*|pu+@UACkTP}OyugwyRE4=j!oR^JG(FOTCjZpF`=*T z@Fu??L`po@a@X*b-@;@=c>1Zm8ueh)k4lk zpB@^tR$ZGOEi6ujL~Ugvy3OKe0f-k9z2Grmu@=YVu!7J~$|* zjyp!A>Il(AKbrjPMl{t&JjO(dJ*3!^n7mEX@B-elm%%xi2Z^d|21Zr(`3ZG>zGdgX6!_Fu-Xvo?#>0E7ZlOafJ zdGT4jfpg`vWmv?za)jsBmKt&+Y|=>`_n_$a#f8X-XCt%)=0c$_oB`;zq+UHtBpyoF zW|2mAHK@Y$tXO#M@X(d~TCZ=>( zOh{%usU7sK7*t6i(!J&KAbE0itBi^b$V0df$x142(gdKUI*+zSyBfuJ=;#-;74X&P z`#6DWO>QdLz|D{P`2cw*87tirULycFyJyYbJJ?~-2E z1I_3BR7nmN7Kt}E%e6{a!l=3z&gX#gH1~Z{ht1v|3vY@xGgQXHnSG_LiwM?3UQWo- zvf?56BsT`TPcr8^xzfC5$z1Oct9_YzW&BCkgU#U%C&x(Knp-aCCKj-d9)M3z~p2=U_WbbQmHb6>cKkQULDvIQqD;&|28%UMU>LZR zsWR*b0V=$d&^2|E8pfkoO;@C)`ayrGXR7}GQZ)yVG2}2&d1PJNC8~Royn;x(GRa7I zmYQ@t+sxP*z>8Utt0m7=J66#f-)4`@N+y5M(2?Qa`F4DZhTc~)ma^t_tWKL*M!IGZ zK2kb;ihRo~0i{*;fWHI)UR*hiY80ql&-> zrZ5N^%56atLFq30Fk$KuN_g`)(FyUR0P=48c`G11&g;m2wSJ1^Z1E5=OnoB~8sL`b zC;ByBs-Ct^i4y?!@)vL6{L{DL0+Cj?UF`a4!Uu-+o^Nf1`UP181tc$-H>1QZUP!xB zA)^+`t?-`Jf=c#JlsTyYejSVim+iKycapW4v?lAiWtK~q8Xn1@6aSkR7l7Mhmyjug zD_g6q(PEgBa%1{;e2F?<1zR;Tn+YYDDJ%Fz*FD4Z?JvZ80#A;vI5{zV%ZOS{iIJG1 z(!W05875x~-jj34vO>@?ozg=(n|(&nl|#fL?fljMNR))j*CW)P_oiZBKUN~^8@Ukg zF>3sjSofpCdqx!aYm}iV7O09j)$pA>cM=O|M@*jpSI<+6N-AtBhJ}^ugTm+twgdC- z#K8TS`IP8wHzOTh4{G0g42$#Un+@2vHZ?v%1;SYI#i*!)k$12nrSguQ6oI}{??3a< z`;s;~u(ml*x~`o6G+?3%b>C1d9v6x<-+p$~Ms?rNHL)Tg4w>7YCe6n8u31Y& zCvgRq++&mO9Dn{uze)M`s^G_5qR1uhu&V zCyf0_OZTnCdz5-7`DQP|l6f5swqU8z2Afva@|>6b90x8{-a+Udk{=;{zempO=etcw zS@TAmda$~4ePgL1CI-Nzp|7Ofvtj;1n85cZ*@~GUYr|C2bIvrZzliK78Q;?bQZ2SC z@E5AhwvSa zvR``dgkGq4`%YebiTA>H-e<#U&~stwl;&#BK`w&M^`8%gsIVCWgL62Zn}RZx+UFg^ zy?%(~e26RZm_MSS=>;0BlM1mLJ}!u^CTe2@jO!|RvOBC>9%u&qLwV~0xKXOi7%PM@ z+N{NoIWi)vDx0(n#O{nNZ}9as*`?ZC&uZ-7YYMe=8-61Rf~`eY?C@VgV;XK<4Ly#u z-Bg;g^mIsrd$YP719~Mjk`9=n;-j{O3>CH>{EtIxaO$RF7alM}PwOKgf>7@lVIdR3 ze%q?zP9S#e1-#Bg5u5S-tWQ(}*s<5}mNtVKm_6@M7re&Gh6ujaLenrm=eu5oL*_80 zp(t0wOr`IsY;?Jy?VgVVsYn5&sH-*GT$LN=SriW~lb9|q8d3`KU?Gx~6&nIRe7u`w z^*iTeCGdQ#88`>Tf!0q=9EFcjl8w@8Y8&-ukAKP#e#DAro+R~S?x4Kt9I95@p-|v* zEO&GeJ`>C4BRh^gznJoL?DN^FBV@u-I+!3)KGfI`D^po?<}4KBDbTwF&TxHb7HsW_ z(;A0)^1saf;AT>QCHn%|YCGf36Z0B|E&YKXEL3Jb4K_Lx&2zLU>==KZxvws_uueOu zeE6GeYU*q+kh`?yQAOD6vbK2eD5|4bjD;(Bes&b&xo5c3HVjgwM4}Tq1ah1ZEpJ7| z#sKSM4~@}`q6+@t0EDgibpNSRG`e+(e(HSfkZ~H_b^l3(GoLdCHTeXq6Ssarc#_Ex-+BlaqD79KAPE<-6FoU~OSEkCLeKIgQM{0the}UxU@XiR{{E~I?+PGoY z+2qd}OP=TJZHU^iu|^kZCH^USKbGmwUzX>nl3lB6V`ozu#$Ts!XMzQJj@5%eu6EQF>l06TcNeN0MK z3T`aqx+SpL0~Nt8mp~hO!|J8EIt8;14e>78-n#v%8 zm&TbG`5C2OnJ?DS8NBIdo9;6}s`w#M()mx!l|AQnMty?ll&)#*NDDtiQ7OiGzoBAr zkVQB^WUOd(ju}X6Mdkxw-R)9Re|85((d<@SxAO~4>#w{vRPqxb{}qjHA;WUAh|^Bf zFdH^}DinsoOl_2QzEpd!W%g|GgK{2jz4;VJPi|YT2|f8dO;Jne=6U_Bj)G^1wX&o{ zb;}ie8Kg0MPj0!&a^nT+St9lvO3bB*wRrN;vJerKGrvUU5?)5eMuwJ?i>?NfBi&?? zYvaS3Awo*9t_w=59*LrjrEp#^v_^V3Lw}66+b0*0w#aNAzdjNgJ@Fp+ht`Ik_pWLw zCNl~9D$RQelNaKW!xsKo^VZMsuz(ka^oDV)pW`rx%S_{9)w2XcaBNAqSG_X!bd$O} zyXQP_Kf;s|;&Z1v@nZGHe$IX7$A~a9=3bsR*XD1klfoW0?B;yzS`9Mo-%BDU`zLjRlV39z^NP^~n39h+0474p4_$fdS}%D(x2fIdz^ znV}m2AWtMqXSWM~87h}l7Mj*R&q|(R{M^wlpz=WP0|~8qy0ZO(0ZXiDWL!zi9-RRn zq07@t3k*NvUwgvVetI!{6I6S%rO`X2+6g#{uDQqiA`(_l&`&XR7g`(>LDDE*+39x!j$>JU7a+2Jbzh{P(oXSWuQ~-ta|+Y z*gt-fNF8<7cLXF&f-9zDGl?8jj1qXk*U%Yz!BO&7v8Jb&w$t7i%?!{Z10bhhB6SF| zgNp_Fznw*+o&!R+z#*;qiwNq0)v1l^gBZ{_d4Ssa!f^u=8T5wm0s&*g3vrF5jbeF$ zyfqZrzqq6YA!h4)iNNLD9L4ixc#m?-=n2FW^U}JcjE|~Wc0F$uirved6^ASuN zCLHeD7RB`hhxA+lZ7qc!Y_(}~ibr~<_2e;Jbu$n(od7yThaHX0WB$R31LS=+a!o_liiVEkDGmYir`3{);Tr*vMvR>{d+iL(pPZ( z?@WVVo!?rMU481VMEaFDNn^F}^WdV*95t{OR769}pG|`_QS4)9Z4zsEXoY#`WSm!y zB4eHj3nZAMH--$k5KQliMkcYsoX;qZL~B{cQw|A>lCe{=yfdeNklK4Cuek~^f-g4w3{=wX@nolAbGwVwh=#W71ip_Y-~VbIp9rU|Pj z>e^Ea;&L&4mRh}{XW{Q`>haM&vNN)2QhK3yRTLHgMaBtn7NjR!hU5_vtd^Mc=QNMU z;`O&RNN9>&;~jWne-SZ#MADhfMr)4Jj#4Zc9WJ&d z3l3QUKd4cfmOOe};IBvV)5st2Q}e{H7MXuv>O$!pgmR^ItWSAkVZUH-&c)SOsSg$lFQeogcD7%1$2;Pyjs%g)}&Xg87Y!r$p-wuz?1O%heIF( zx4|f%F?x}DDs)^CQjjf24$3+`@T3!Y;Ej|307Vh(B&sbKf+Q+yuquw29Eyb8`p&Fy z`Ah5MXlb73`pVy~Dy*s+)K#5Zibky{0IrpF742!a6rBny!24w|Sm)v@6g8v9(%~;n zo7SoZ&E?<{b*t7Y0Tf0JGe&zI4B(XwpJh&%O{q~-K7icd6L0iv(W2%<6^0~(7Zl08 z5+NWr#eKbuUy=mnu>7}4AWoNwJi0j?t8eWyv(Fy_TO2g=@%O$2SuUEiM-}W(k zgWQ|UrI;^sYFGH^1Ga}-Pc-~~>#cz|ckYnetzl2%>_O-2*{7@SNTvsCZ&2;A+kND# z&L^2KdoS#y+dZ#0|ITFW{Xd}Qi~oZl#eb)2a0^TnkB{>8`b89kk3{@tz?j2NQF0$T zWc^*I-iMEh`pKv;i;sTtK%Q*#3FKKooLS9=g$!i?_JPZe4;+i5a%yHX2)k$TxLvjU z^TN(FOd^(d>JIAwbwu*rtP6AN$5CqsnSxBdh~Nx& zn%di%3tA*V9VzsEk{6rN?IM>GTuXa=0Ly%~yp(}cr!Oef^CKzb*dQX>C?Mnx?mQak z4sGj&*LekhY-P}))20U>)#Vu;sYjPn;qaW>;{iG$18-uNYlMHE4$BSb-ky<`5cxTb zP;Fz9lbVn5kHIO7AmdSs2lihJvPTW~Uw`DK%p6;ilHi3lYe?^>gn-Rj|2mFUjmnFHTfkCju=k{>Gz9sO6!Q_JA| z4=vqe%(IXZ@}s~2JF9?nh;_iU7qbX7i;404Hz5cfUu*E^53=|o5iHDK@O@$aQ>u3% zc1DDRAp#5nu+FTe0Jst0WQ}~{75&HRrB73`nOG^o&fh0H>mYd2Ed~ihZh>Uu)7{08 z`$}V5B0<9A?$CchCa}5dN@I9kju1*O5egZ$wn6ICHaj2>b*0^K0<(KwXWE4bRvJ z=Z04WwSDLcXdHitxY8`jFTNlycF9iNFyNYb`EcOy@bTO+ zIH-qO=uuZX84@ofS|8D3TqF(hbXoBIx^cp>D} zY30}gQmOX;R&o|(R0W7-DtJ=>Mim-p$P?=2nhh?WWo}U?7Z_ihkzdEQ@-M$`(cxnI zn2ot(Djwz=Gxa4yxHa!^0tRZ96-f4K(GE|_D^PXwD$s=zas8#aq)E?cZxzFqNq7@h z7YY!hmaYDXno?nfs=BAUMiQf)HA!?8=<_T?)w%|gKM&PvB!ZIOaW%6h%ECk)u3#g6 zS_0UWqOuv78g{f0zvRcaNA9_yn0&4+kMAtcE)PxZW$aC{bs|otluG&hRbK7bs^d|d zz>P&`9&E9_w~1Ljxk1&;u@86b7T$tTcqMz`Hy%GIL^gmvh(CNbMLpueC6*IjgHx7$ z+b$^5oK?S3etb+_IB*kF=VHZ3i9cFkk;YNCgGZO9lnug_ZRFF_Jwj-|aMLMi?X?no zG5GY-;*D|q={5JHNF5$=bP3&4rhY`Te8Tx+*Qk1duZd1&<|diMbtna{$Qp%%er#3T z6p_d7rt9bu#%k9Q!mXD3GHPj|=b(0Qte*U^HNV2KuAQGV$aB0`q8^x-*rP5X4H=dg zAG)};!$g_Dr@iPrwS@9}G2nuR%`xal`h?@b7luL7$jJu0O7NPAFV5#dIl5A0{GJJ_#x`eC`=_Xokh#mHP z25`jsL~qxje+|{_%XM|G_9+bmc+|9qMkAuVv)dAK>1+1c!>wM~9B6xWv`1eeF8*%x z0Ck^bz9Kp>`{`Qm+lA47Lf0q%NNo=M5ZfXvUZT_+rk+w|h{!p#ile@SIT*I4kvxa} zu2)Nn^eIr>B>!#LTZT+)Sj|B}hwu`~J!EkCW}JKY<38_Im5-_?bv6S3C~}|tE#o!RTkDgCAE9?_cDVK)d;Cx?VN$Osu2({5 z!MN%;Ubnh2YQfRi%%&)6MK(#N8L}ahO@qu5(9o$$nb>5xCS{d0zP`q!()lMR&n5}D zdGd&$xqC&B#t+4lVrA%$%v+S%JBJHTicd)K0+bkivXeZGrg8qyv zL=&}p&C!5d@E+PjJA|sv*0jE zxqxqc6`mh2;8j@WNOQ0BLDT}wTO@Jk^L$Ehfmok>_v{l0i#0SdkM_HubGeS~kS9N{_g7 zkkb)No4{;f+7WG&C{n*P>)^GiF~2v#ABfnXf(z=L0p|P_LTavV(%_0Nw7C<9-whq# zf)esLY|A+g^Jvq^W{7W*Evd}~#e-^ul$(ZRo?L?+NQuJH($u(lpqGu|aK01qx|&A7 zV^(PXLJ61f&Vr@RbjVV$S zRIYQwAi0)77@+z>(Lk{zx*2uhEnV_FCLhzW%p#jtHKlccKDMv6`qs`(E(_f2$4uZ* z^?v8Jnnc(c4j^@O)@GkduqQ<*ks^>m6Dr*fbARZVMyB?sodH`yJJ@r4$nfZ!#%iX3gAt)Q&*An=-42zNm zD`XWP)>(3Z*U~{4eb{DG9Q}<}v}jJ0 z8&WPIKI3-FN%LoF5 zm{tj+e34zSr3;eOk6C&&XV}~UeV6YjRm%X-1!{TdY97~0gzef<!dI5` zlF!wY$Ax2mif?yw>C9kj&+&KHzMy|kIA|Jjs^6>L@M*!ceFqc zC(|1d@F^tzZ9wt^MDim*@gT2*I6S?OPhCt)8X`j~Z35LQd;S|Q1HSWn{ z8+Npq2qAC&ai?ap4wPEQT7|=!W^;0hoM_8au$knY%#S+EHc{mNv+Wbs^#S4W!gzm; ze7IFAPrx6_c@JHd;1@J`w6h2HhH9OlH;8+Wy-M2~^l=nR$A{OQu2Ko}Yuio+*+ z1lq#&6-CR^FfkvU|2&*egP+@gxdNS{NE2GZfz2Cn`9*`MBSGsm3-;~xaC4(Ib11)& z3IUtpTqRH=e?oB@ob-b{{WyCH{T0|VS8Fcw6P@Q95`XW8QOd|6aloL5T&J8UA9IA7 zamEvK4(wn_jyeaL-Lr$5{gB;ZA&WbIVqY@hOEB=t!nd_dwskz983}E~6kA5!fi9L=y4PCE^Lt>F_;Ex7R+(gF!HF?k^oL2MX z@1ZGoYatosIsZw0M!rXu>3jG7vf>Xa@5&j-`Hmjv(u z^rDPR$(c6XW=^l;&lBk;O5cA*1`0;2yl!NlyI)kB_h?{=-OGKp_yp4D1?ZGK1Ha5m zs4uog%IH*RB&R(;@qXI`x#7yJ3racVJy}50s$}axXy;53i4wsgea;oUw&@kq+V@Is zeP#hZX#$0-F%+BD7{s|T9h=+h_S;@pqj#)h=p-Q`fV)e}Bw1PrbCziI^Qyq-RmM{n1tSCFA~_f;#!*h~|)o zNhg&w&aF?U!l(s3IaoreW-n*oe-$}L5yHspWzSM3RRw^M~N}R};!|g_Bm44c*xEV4usg+V_U7gJl&Dn zc%|&upaj15YvZ!1A)qr*Ca6pzs&T1)K=ahNi7i0lo_myTKcs(t2`I9dKdAxOkXaEg z7?n24+7?u$rJ+Bi+X!>7WyWT6OmCfptcb|p7%PeE(l=%NkBP=OSU|)xCTKF-xWja> z8nOShjC}$|EOC~*w5;fBP&e@$uS5lhs&>SLJcd=*?$-G)uPGc*ze33T1)@JOvhHVJIsa#H#jo?KG zCRKCwT$xSK(>kqvc?+)XqHCY&729h5Rq)n2-D>QckR~%v)fP~!rP~1V`qpifD?Cr> zRY+@-*PheW>}_HTxbKQ9vrK2~u=$5Z*75*SQ;_67v%S|ARJr9~kxoxaZb8e;Y<}q% z&8-K9Nh=>XC>4h2YjS2!OBV0=Z{1TWW_BAn4kGXH95;u!Em1lU63W%jhSFCf3is8!;jsOJ;8|0;#?ZD?u5i7!vJ>yu^PtK z$Hm>pCcq;o2_e|f$CFyd`D#t>&Zf6ylN?Rf%`7y1nO<~$DzipE(SyzL{m=edF}sS~ zam0o}2(!bNPAHTsA*ZNP&56*-PK_Xk#kvzWTOg*~%n3ZqE+NMNnsnNW5V`n`M)H9( z>~BtJ&N}p*oEPGJbEv3pooN^QCyFt+o2p|tDhZOosrt`>fw+)cF(kiNj7&31dRS6-W>zWy&w zxqH-C=&zz5?4ME}^mMH|>T=R@a{;jPnAjCgEq~Cf&>pD&560dxxYDrO+D*r{*|BZg zwy|Q{wr$(CZ9D1M>DcV>^oxDYx8M5quCwa?v)0d5qn>AudCz$bmzbIrxDpd}A>7BH zoe$V$E4Weruy=(i=km}1*K3ByCdX*u$j@;~5K~QrOapM7QkfR;??C>$l1t<#^UC0~ ziZZ4048c#63lGkhs$IQm^**q_{r-SsErZydUg_RxS8ZBz_HvA_DG#t(3`fT9XFk^- zStgu+tVUi@$GpLbKHkCHt+94MotWZ;s%w~C&^Gp`Qhh2~ z^>N3W`)OR#6Wr_Ay(v4o>wg?35E>^$4FmHbG$**%%w2HEY<2^3GaFD6SzN{#Scoqf zI747_N(1MWRnw#HjBbX%V3;2}V2H=cS%J4#{=f{zQ1JT)H zGVPIU6fBz0O2bOC0P<~{Pznq3a5U*TNssxb>&>vL8TM@}8E8sxCuFBKs=HN@H4Ft< zT%>0z=A(?3+oqkXSCRt}XBG~f*yma!r!U{n&gW#OrK27w)3w%Qto6J!@=Q-8z6(h0 z+p!hV(mUW;i39@b^4o$3NJsZ171u-9x{1OHF zwDli_RRe7&1dYhQm=1+~g6tXHfreUQT8=5?p$)gRNK6f%rqxO>XcdFm&4ti#kj$bq z6PL?Cv6=LOZ{nn=NSg2&w*)vTLNO;-EQLUBL1qi=s zxhv^I@SmRy_B}nM7wGqUp5kcOeF|;u)0r7PRcVyy4Ol*2X!iJmbP4n&*vx0GiTR*( zsq9YHF0?g}eWJIj?#{ZNwl#J=;avhg*<4k2C%%ey2b>4VtaYWbpHYlTdEa#RmU zq?T288h7ncUAU&r4S>YD%tb}*upwu7M{)gP#2mCcaOuX68D{VWvCCJFwkFOR#`z-^ z>_~|-r+&ARf5$r?RJU)1mh9r)(;{wJRRiPNz?3xY_nX*Sj`2FkslvZ@b!O7QxZ?Bv zzB+!u+{ro@Lx->R2r9G@ZAjvh?XtVe z(iHmfS!AR$23i?7!gnhYWS>UK{Ww@KUDht_WC^4g8qu}pX8lQXt73@DzGBGw_*Ikc z79aJLP3}t*Qr13d3fGr3z32>ys>PEC8`}`WujVM>)ko*4OeOUYQ0>Nk!|u#a$0Owl zBo53Y>xhwcQ9-@bpY(R6>lAquPD1H;BOwH)eX~CyDAuN)a2R8*VK?lzFlHTSKN^2b zIa>e-=F`CGT`RI?TJKG_-s7W1IZV!w*6>L3mx+FoO9)UR+k=&q!=8qvty6XPhe&xK zrqoW`FvziG&ZEeI(LY`{_#HVMy!4snTz zY2n(W?2CUIA*MT(FT4_#U5yh8{DOT8oh!6^#eEC)6V-m!SZoddgDj9e|3C z2D1Hh_cs)CL5k~$ZpgO{R8Hj^-A0D%?_r}L&60$(-s{$P z!&gUb1eJ&ev7!OcepXv30&J`iQjy@)2nV^K05j3h7YEM<84Ctz#MSGNR&pvDX&m)p z8}-o=$uy~H{+ z*x`<#`*F|*&=A8)I3n1J%jL1$Sb_ctchP0?tUi%MdU;rA5+oq9 z=Qqn^?;+SQ`x5m{=GKMf~Q!HJt+XWqNul*6m0pkMMm#JSwwDF5;t9{-#JIxA^1`wsDy`-S( z9)Dt+8@Du3r84}ZN8)&a)X{|0;e^=Xgw*ly6K{%h6#RrD6TI}3g&rK7gK=6X4Djpj z;z~Lj{8E-*XM>1rPjGy&NaNt!iP;Y>yKJy)2Z-_FT2J0jb@A zk!qZDkCiUO_>c*8_E_Q@jbXGM`98YJpwNMJnxQs?bB%Ae9Sa>tR>8zNuw~S=eRvI6 z-SCg+q1u}9R;jxy_PqrIY@=JwEQ9WyjIhkwtT)OvVF6~Es#A+6T}y^tLy94LEMd9Ph#XpbdrTT zt1Jt4!OJWCRg?vNum!&2wk*U!*Z!D?a;LUiV4u-lih|bx1*5i@u`cA;@7ZO1pO;hC zPz~`$;=4#_Vf_tk0l0E1#tW=VYP~aJK1n?rVw&Ly4t1@q^2~@AT7z%+Ek`@{pS&sYRS_A?ueBqWp{FP6H<4o{H8j3a1;yM>}vzl%hvz<7{20W3wgKbqVZWrINCz@k} z4^YDolEV*>2Og+*-q3g6*mvH@cOMtu{wMIho8Oi_=Y`sJX^2Bv5uywe`WnA6W$#iB1n{mvtN<0ww;CJZ(plug!8cYv23=`6f;n1@{= z%+fJ+4;Ge1@9%V%7he#&5EQuigJlklhHp_YO})X3qUm)RM;On~m_x+G?>18?qYA!X z)Y#O*a~9V#yt@Z2wNR@^H#Ck(*fj}#Y`mFClm*8E141~c(r5BVE)JE6kUk-Z-sD9d z%~0>@+oQkWjAFj~K@Zs}STd+T*q6kT9Y2><(ZYm$%M5ELZX8(xIj$nF4b zzbc*%`>0l~A`Ao+o%DYaJN`2zN#TDc zcKichX7@K4$x*}+;AY~eVrOP%Z9?*Y{q-L-4~F1K(m-fsxy61I@_!%!;NRxs-6DYAS#Ki!o_B+HmjIwGxro}I-ZG$~ z?wr}T5x6(n1)ucZfF&?)u(sdeWU#crOlZSKwT5?sFrwagFI`DTiR<;(s}q?0k>yQX zC{r`CZUwnUC`QBfIZ*w?ymA&UHpvCXOl^$7Och3oiF&8ztaF=v4ab3ZvpH0~k*~ zWW5z8_br9&UzHw&9qyr`e5OR<;IVRV#iyR@TRnTZt*(B znMS))#Qz|@Q-a-rKa@B8kl+BjMnq+C z26FmO`Tj2`$p5QQ|1D6B3pW*YwC|j05;rENhoA8R$P`Mz88Yz+&H0GXv`~yoWW~r5 zU^aJ5PDwi19n7;i!D2ObHFIy4EstOtR>_4e$-%%{yEUDuRvjO|G5Y?zf-E0v)gIrs z-Q;w5a0mxQAvn$Qom@A)*zwQqyv*8tJ6*8?ao>tz>QXEdMN(pwnsCq#4KYoR-wI;! zp%OlXg?N%g$L$pXykQB_j>%cPnW8ueeSoe((?ku7*nba01rLMePMOoHXlG8DGIUQeHJ8y}b%hSq#bjPoW+`POHY=+cj24QjYc7_2rYxj8oWNr; zZBzyeG3RtHt62`#{JU&(w9qnA1jTJa8Y9H!H;+zV`q$tKkvJJIP9s(@3ew>9u0?bw zWHl$s@u)s}b|3jhE=v>jC~J+z$m;=aW;ksmH7MO?3_HSP$+=VHm3*yCNz68Oh`H(v zHbQ)tB=J+1&8HqqnqoD-_A95$HE*xv)($m8N(+=nn~~&ko<+QmjwqQa`6}0~*3|%c zLVnHOplavWB18+Uqqyf&rI6i#@x~cp<&31}wW+Pr0_#PII4lq8)sYzkz#`Gc75gzy zAv~7v!D$8QnPQ&Sfq00^dL+KJteUGq4YLusIE+{T1&Crp^$H_Q$~`3}FC7hQ>D7A6 ztRq!}5@u2zsg?3!J1b)f`|xnDq?jnaoi3#CVi4+FmYg?~Q{8E0%goYF?ci^;Y(?|g z4PwrM9FYNI-{OoPg^f0X$IT|Wu?Shu$@Y)X^ZBBY>J`8+H)gG;y6hzr9Woo3VLLwr zai4{VaiFWF?C<2bh>VTBvwMHj;_c0fc#^SeZdA}yCRq`#X-`_9nDCW(Nsf1nj!_Ce zed0xTTHqA2M=ii#$(BaB31zW8z~hNs7G1~S){}JFm@GMVZPDQcaa0=7UoYOlU#>Pl z^l-h^ON;lxLYTCJxShYE=l*IycxUz29)o#}4b{Zk9eHuyiur{0`ucVx!lXNGhk$VI z4v)g_tviHpmmEWIP#go=sW>#zS#$suXYDRLWcuwq4Kswc#-*3CPgQHtUVAA1+7SE8 z_!Y{xa{q+OH$vAMsjXBP_8DqbpK{B~>PRw8dCir15EVO3T{I+zy2|6P2Ry!=l|(7m z?``-jz1%2Zu(!e;co(g=_2bTbutMxo2_f2TX}oSL-2$WC5+CqmXgrHsYyPz{A6g9}9>!p??TzUh6()BMRwKyNq&lwRF$vX&ugW zIe;jwcCIwK+}mFm9w%JA0kdrW?nQ|Z7Dv6Ncn9_fl0Gw)K6E5q8?N)G>#ZNlFOrqw z+I`)uN9k&Raa~l^VUZ-(yc*4xF=q|xPliF&=IpN-Jzl%irYi!_NZ z5_s67^9d!mY>ywM8xRS0qJVahEBv$727X{Ilv8CavqKZbsx~(Wy(?JZMRi#X0Kc#C z!b61fyI`(>&K2)z%rH&S4Ghl7oMdIK*%DutzRUCGa7`E{fV{#6yoF=vCabI-TiysS zcfiIyHILcskB?JqYR(wq`-URV99Hv!Xczz&SjRGWM}f|T|5Nc;>83E`M;ez5)u~cZ zaplAWylV54gZYl+0SsGB?ils~V)YwOrWq0vlTf153f5zI3yJnC%y^M#**qqFfmK%2A5w`Xoha$G@iFan+_-~Gt0cYQoAqJ|UImd?V5CSr-l!Jl{;7c807PF|g}#C&KXHn_F|Rua4D%?6QMa!kcXp6rH!9qr zJEEiZE^w5PaQe4GtF0M+y2iGRwijNNJ-l3lWf4&`B!_-^I?d@W!V0?5HJ(-4pLUKx zA7(5E^zC?lC0^gHkPc;W?Mdkbj!3!v?~zgjgmLy)*S>gN>9aK-wdUMmw)B^Hq%Vt4 zaHO7}G>^zVg!Kj{Fg3tmvwsMJ@8qq=`rPfldmtxm2_|hZInIP6iByB{F=r5kJxOXG z+HLZSEDllT3OuBPhhMAQrMD^JL8fPD@q}!#5l3mK7fb|I2!mBe%sos z;2^c2EO7leH`4!U-0E0BD1};vWm?bt++VjDy!EYqXnBP`r&DttW2x~qSFT~ z2ImT<+pj7fm>zvvp%~x23N(11Y%dIGbKU?7PD?4xVH=XgGTiUu6q4H%zmOsiY_i?# zuPdOK+v5(bV?LZ7nLmJA{#AlJfy!(WLjnOkA^)Eh^nWt%{(m6h6#!-?j)KMjduJ2J ze^nqk>Q+uDs+hj5>tv)fA?U&2U;N(hF2Ifg?gukHBEVHjT0viQDyElo&T| zBk$YvzAB?wISW`3v9lb$gIIpahYz{ir52JlPr|!S&)F~c-M_NGo?hzuK-PljlTL># zRM#Sxgk~W%-w9f2_t z*Zh@fZ;hWqKxxazxu}l}fzy!Ns|ndW_u@mJ3!HveXV7NK5qk05T9?)94`u%NbqBHp zH9BKBVmW{YHxtLZ!!PD*!z4zZ570f!H$#_7MZsmnYclY_UKB1(dePy|d!jyWyZ~EY z@6l}1nWZ}@4rwU~h-5#{h_(9-yy?PnsU_DQn+3fZ1spd)bSNtztZ zZ_MpFUsm8X;_en}H4m}XExIS%YJ^vlTuNiNoK2;LEXZz#J|;VtdUL9PU}~)|Jm-im zCh{H7tqHH9ky&~sQfL5H!0lEH;a1yUv@)H75uNg2DzK#edponGCTiUwQ8-tdlA2xZ zScjb94CG;@0hM^Wc?h_^f@yfMsaVS}yRKlr!bwd|pe0#%7hbsvj_I7O1@`wJhx7%9 zY2<`f8F9Y(knUrMT$~bzm&I0FHd4J2-4=a~Syqag-j;fqXp2;TerAjYmsWaocu!jk zj>RNfe*-^|%_L_rOpSOrP)yt1?3P%FNf|2MJegl}vFUoVR8k%BbGN5`7c&jllJolS*5qMBMW_upp274T0DDDgW z((dd1n4@srf$AvkGyNCtL;XE#R(rDDCVMtItheyBmZw^!Ca~Sqg*OqSFLwa}2zN+9 zjca*dk-94TmQjySZx~lU*^NAU!1+eWh4@SatLo-py<_P)RKA3Vng(#}tL`<&TMHVT zX=pum8yX2mMdUQWHZ>WX-OAE(=wZgLM@M}o&XWcwsAVpn+1NCE<%GYF6`S$_`ftA@ zH7A^>s&Rk9%)=2dVYR*|MEqBnbaO)#$Z z8l4Y|jk|Kxje3tOstTWiX_uID+l1=akGGU2;NelDu0=OgmyE}s{zx~kcN!m41+W@& zdh9H(Kd3H}4ejPQuuj?joqT$;KqohztRe^k=c8K?K;6p3|9H6oKQ#X8B()zRb`|Oz z*ji|N@L8TvmtmNTXB}UP(Jkiv;2L-! ztHojB7oIZzwLn6Wde#g7DNfpw) z2}|?jyAk$IWc8jbmOE1w`v8qupsWLaydYR7}t7vMsa5UHM!-5zQ)*xkuaXZH8&+=MDXruc~G znRT`Fpn+)u}2N;iI={Eu`X+ZuBG#_3W!^gN%RrbhW z?`7N(@YE;)TGYZ?vTLB=q8mun%$l^QY5VZXB$23BkTrK7^NlNg;9=+;fcAu3^=wk; z6*8`88Szfeh)TIz60I2bJVa!pPh}(Kj$^T84=PSPA^wVCwVa{9GEjaq z4S23Dbsf_v0uGu>lUV;$lrYlP`}R%fw7URCtEz~q(7D4Roy(P&V9bqNnBA@4KbmVV z@i9WnVpCsO$UP{ng1&B}aea6P^GMHMWI!O-07cGBiuAkxX8>dJmhip9Uprm+zeb$= zFKJ)OCXTKaMkfEt(*4(qEGAA+dPo2@_=MG>h_R)`6G=WW+|!=YQyCNrawOkCs6WX% zQM9diJ>L4hj|U3>NjWuUF=Ng$i!1)uAH)LV3 z&xd3_kl|TX(Ms<${UoMdCLFRzT2sPDv_3Z0DDbLE29Yd)W>~jLN(AkWgng1mfpX4B zZ^HH)&E}KHY7o#LRjtHi)=i^HQK?oss9u$L0TYN*St>OWbBXi)kxS<> z#aj)?vA@mZ8f=cL&&HU$g=0%3WmzjgLHIT850CFe8{G9yHJzfDG9MZJ0yTzf2->zwW-9Ae*oq($(_>OCw}7n!cY_mmC4nGCp@xb*?N2SENQ zh_CZH6@N7PJLfLT|1?kZmSO#^6UuJ<8Uowryi^C;Ul;NkgZo)C?MvRYJ9UZB_%4q1 zMKY9Uawxm*E^TVpbxKe7Ru%R2yU>q`(q{lpHwT2b$Exd7R|eOB%0_-z*@87!uTCti zMaVrbeUix=WI&+4N?C2ax6`qvPg|e1z7E`TwHjv9l2F+t&(FtfOhCMUccsfRpZ*lV z6(01nD!p5Ga~Y|HwQ>|f`+adj!rPuxIbxtjy0LukeAZUs7<}dW#^UDkz6~nqm$Cl# z=B`<#K_v_N=Es#;Bwus@JegTFeGhZx1WCJU6hH~tO8t@ zl7*4NI177YCv6lFlDWe$Bc_s$6<>~wXkX36ynICi?6q<2ExffzSh^%BA_rT}-JS?7 zs#pn}aPZKEy9;dCBEg-+hf5i-l>H6E&i|)kHgX$a^MRC@RFToRN-de2*r!PddZlIt(_z!}?Cs) z{@rD(g0kqWQfTx@&!F<}l-|z3l!G|XE;JC)qMfGxrG+E-qZQvv44OHJ+UP6$P@0pC zi=+BI%R=l~gCbyUY>6x@7gBpU9#F_^U75i~$IS$KJyom&R%pnz+8@=bXb8!ScZ>*f z^|c6>+6tmrD}rk+nXE`^YVQ=AwtXAP=>lzK2w6e4u!OVfsoPja&zKEsK~0>foigT{ z=%K_94Y#Nk!Y85&okKkoW+6}@%Tz98$+Rg1Lig4t^j+}Xd8!-o71lh`-6eM3=WUrED6vR*y7rIT~>0j)E`R`FD=Q+A&zckjS4gnF&Yo>ZNZC!uNq zy3n%`PGs8J$suO2g(sronuD|A*0|Qm!3VvR_5{^-j}qEPWs6~48Ld+~+V04Lj!$y` zj3>y#vNZ{;P|-#q=G@_mhrbvO%g6exp};B_1N$(-`OvgRaRo*nhP@Oe#~r2R3)NnnjT$X?>H*ajOsZ2oFeMof7w_fXI|$=m zFc{_DFevR_A@m|WE{~qt6P(NV5KPCI&Ldakc1J1mFjmoq)niKQCaScS7OKSODhV}w zw~4Rn;7~+`5lz2by;mI`$z#2BcjWcqXMf72TsH=-IdS&*Lt!ERsR<1 zZub~^qs9&{cfv;lA1x;`l;B4-&*)48?UU_JX^4oW!?YbQ&nR5#6)n>{sHQ^=ux_d) zKL4Gy7WOC~2owB5&PAa0AzMy54#h)hEoPHBsC!K2a+a=cuhZyn$Arwkw2HWXSCDwZ z#b?MVON?1Z`{!$cRa0FBN@*jl{X_?S9wV*F+I*=rwo))UUL*(3GG~v2Y#Gs+*(}jN z`0*ceMjbkIe`R?XxN=wP&GhW>mIl@C@RSx#6 z7JrvM9>Gxa5tK+}3z;imcF(u(vE+F3y=)$_=grnnTk_wno#V-txU}pRrUYI#PbXg8 zT4QP_q{DwKDK$Z1S*kA_QhB8WG{woi;P`jd07#qhNTR<9~} zM{Cd8AEMProsmQ-+3-!D{~(#6<;oxRPtd50evY|kAavw)De@ne9pMqaI+)4}w}egg zI7ziLW5@H`C?Id5{9gbUDwP?3V8u0aNLI8-YYBvy>DeI}85yNXPzSztyw@5G>1{(} zhX)D|&);uaVim=H*A$eW9i8;S*HPm^6K^52JI@pu9%HAJ1;0@hdQr4u?2x( z>F-mdn8-fwrJcf?cPydHm!Zu?-AmXXCDdae^CgJ` zPozar?!zs?VZ*xI5RD1m1#9alM5jQBTLgYYD|N&n0Im^#^^>|O#MmWM8AH$L@k+id zNH&HlxV9N6t?Rc%N$o9Ee)$~PaEx$rkIKM#FaZf;bvR~N*jLG+ zK*PA=)dO)pjbPa9P&IzU$fxs!!MvQ{`cmHPQ`4yDf!PkQD@M)%+|@1ZgtjSUr#nk! z;>M^E@2FH4tUBi{5A#jdMBdUZ*2c~zdDd_{*7WA0uBc!(&&b%y45%k%i`(pf+u+1o z6LFqdqKvb81fU)R{}I>w`6|SQP{$hJ?lTisfsGvLhI4j08+d$IBkeI)hh_@}2Kf~|Huw_*2 z^Y=!nO+Vd^X@q#Sfbd=flIJSsF54qq9Fpoh4&een{5CG)l%cP~E5Tw4!(x7qS*~Sy zHuW%zQ(AgpIRP@yL!1#hN@vc|;R%xRU{gH|@?m^Gh0T@!p(kPGj%0IC!scX{%E>sD zt$oI}lnu`ec`ROT0Lu1AX_UnDA?CFp zC~h(EI<-h8F1PEJA_c!d6sJ21VJY#1gh)e&s_!6EkxMhL5Reb{mur&VS4IS=%IcXC zv+$VHX;R)Fw&0Y_79JOYt8e@1jifTk7HrSWYM*TCgsaIJT+I{5#VNU+UFecs3da*2 zAFGh=rjSfuUwbE8UL!yB8R8LiIpTF`+bLeR>s8~aXH|8AmVr|>-(C{$Q)afHR-})p zAMM#2EcL2Hbuy)}ly*{c#+w?o%W^Y@>h;aC^1!M*wXUSX zn|I~_$DD6hg8V`D=p<|5hiyTNH_nGQcZfT?%?Y=8`b{I<6cyFNCk+&v;UACSYi8wd z->I%2O)2VwU3j5)_(QL=f0udbal0U5dk`q=fBjyTnyT=kZ8%96wDMm|30!V3kHGIF^1SNR)KG=DGFCw2;A*qycO0Z)<5ww!u{x0)}6Xr;Kv#DjqndM zCHlrE{0IvKl!Etvc3=O~Oo{)`X6nCe)c+g9CTC|WY-ej~Vdmlp_{V62q^*-Pz}Cpb z>0d^xByq}eQvfye+X0u_W&5|<$)a{6Wb;{}WkFPGx<6wuc5?DT;%5U(0{J+zAq&%M zLnpNH0>r6sO0J>|L&v-T2G=kB-RzE!FQ-2+{oqQ!rQI1Q2trj?C zDW)aL_S^P5qPGJCi0NR=MroqOsidoyfiKht7b|E!q()BD9o6`-%T$rN)%Hgz|aE&a|YLB+z^-=iFAfk z3`t+rvNG$Gn#T{C4cB6kCmVc>oo0_2Qqt0LSlhosi1DPaTi&#!H>b)eyf@x|rFJ!K zZg-_k2(v?!HaGAn`G!Bw=1pOO zKKw}SM+h&%&a@^da>?NbygS$SO(T8OuGKl9Hol~cxM3jjQ%`t?JdaT3HrVJw&5x?B z?ABg7SvT4_)`h06^{@UjyIjKHfvxJV(YE}X7y17s()_1B*#2jI{0(`sFtsrHrxgCx z()jmq%fEfM(v%zyBPwq!IaVV4joXrv9t`FW5Huxe!IVmg6e3a7h)7yTGVo|{uXK(N zj3~$mu)i}bsyf`Nnku5sPB(Ww&zxhwd_P>ifeaw3SXC723ZvcVy4?VT!-nCcp#mjh z%=Ki#>r`2ip&hFw?MRYjj~SaQnNy(MDgm{Q0Cfmd=ZMCv zIm(2$eMHEVHu1kWYEMzBKI$^wclL?YE~j7sjW{GDYC)t{FnhRAHG}nc9ad<=3E`Ky z{$#SAe_aP-Oa~!{)!4bHo8R!w{9{8gjKX|}QSpYTFA6PBWohlqhaO>zj4|#8BN#|@yXB%JQ zlNng+PP6xuv)5Cs|Ku(NC>L!$;==otX!i@5AQ$D9M-Ot3H1@I4pZ*Z-2mJvx?pf8= z`4eJqXdT2Y+>f4i{C;+@$Gbn;KfJRDv*Xq2G%Z)7Pwv;pW|_hrWR;^Us;x64C+2nj zd{tXh{qPP8rgFnNPfChoXqM4WQ9sg9TV-nSm{Mq&rVu_%uFXiT)`W3v%?G{H4J}=t z=y-@YI-aO7_9o2Lfj#ho?R}lTWEr|`t}cPol^vTF;;X|^vp#l~nLRNQ4H~1SMe)t* zsK#hKlm5d=YC_RiLSpiOJv1Q!6>cS8O5-BhVjG+4s@!QxnTZy)xn%yGBm$6`8gZmybY49WK+Nne zG#!tS{sR-5o0aBN%dN}0b*66siGD9?-cX&lyeo!$483y4uWip;U<8UR&_MII?2!xz4I25C^lg1=@E5l`Fw{Zlx|NeEV)=hn$Xw@5V* zKFArt7#7(9h+=QH5VP?4D#DRjUnaHH65VLQ0T^X=SAx<*x&#>jIa7rt+X@Xn!Qc4Z z?@+93$leCCc-?yqypdj+Z0v3zzR2;ukV$#ypv(Y2{Dj=;B1mt3reu#P=4wB2V%X$( zo|&y^Y8)eW*j`4pFZWG=bepf4Hphs&nS~JXreYH@SwAM-uA?i>6~Pu=k!cyTq>8<- zdfJq#+N9JpY9o<3(4exq0#{8DYB3fyLfP^A%CkNH9@Lt~64ohAq?-UC>J>;#L23)>9FlC1`lNJ&EZ3tcx+#G8O0@lN=I!k-}O6-uvU zQ&{RElG37+ly-_bl0;hWOu|u7x+q@SR8O)(x-t>p)LkVqTX|_ww&y49SvMc4blQ=# zR%5EX-esx-dTR4NZ0BM$|oW=I!t1vUgradvfubfkssW7I39-Z5V{ z*#Yh>Gwuc}b^Fnr2+aYC_tOKAFX2I&drstTmyXER;02NI@!G2kP#@Br_7?n}8!STK zRP}EOJJ4G%q^fq}1G=4~;4j4f%y78!WwD#GsQX&K17FlvGobAhuk!geVNL*@UPoo| zX((2G1g{$d$JHyk2T}KEz^1Ik32+{&Q_`%(tq9|u-&!C|dJwgO8BDIz@5$~tID;xNfc>QExW##2r zj9rnj^x1h?ar!a}FjRHF=XiZNb0roTRilc+eAh(I(v*2S9Rhv%8N1VR&+VagIdtzn z_&nuvB3FThx^)+_m>*dLGhJ8++F{V~)@0)~>_%gD@d3S3vnh zZiLf^H8CzV-?oQK$O>`F^YGill(lbZZ3p_=V?$H>u>%)agI9mfR~`cqi14v2)`#A5 zW$whnTj&3gixA-ctOeQ0cSwQVCS1ia_H7EB5B}T40WH-LTK3ctQdZr;s}{%7sn`Du z`R!)ut^ry+dJUXQhJ}w30AgEM5*uz4x2kVLvykA}z%f`P5<>iuQO-8cgS9PmVd!jt zXM^KzV0w%HVZE}0tt0M5#3j;Y=B?Z7g=oI+0JBf)tc2SYx;pPOx_hkOBA@wBFRlZDw!^Eqvz^en4=D+$Yb=x|?+cpeDnZ+^wseQUF1Kxd zE*Wp`Uf6gj3p0m3;#_qB`GAv^If^(XfI{S0q8U-X-Z#<|6~N|i%VwU%b>*K-WIrC` zPmt3dEuZL$DI4!F(o1@NRsKr#QG2MLQ@dMc{@eL;!3DRf63rEu&$W@L?^B`Pc#KFH z_%&UdQ2gfL)!fbL!ODC`h#v3CYX`I|WR&)CK{yz{a_YmQ@B#RhpAOGGgRWIwD%JaF zkx51StCCl5=;w^$;zbFJy+7vT0*}Z8!%Rcy&yFV|hkd`b52Opo&wm<*nckqvRtO*< zz<(Rp_|HP%f4O~;v2b$!FVjH6^zZvE6&t%n1yo-;XJ=;$Jmpd+rzOTQgT(?8Y|T{6 z17vh(0@GLD0`|*U$IaxyN3)FA#Mgn>bpjKfwrg3uU^1IIUY}W~T&L@f&p#KNZa}I$ zvPR%I=t}O!hD$;}L{YTKq{v#alolFrQC%_Fv~)TO=ylB)V1fCgvlVCd1^1eder_Om z)X}S`l=CkT94R3|sypuIve zd6RfXjSD3#$dj#<9vVwE#rrcjB~#p-Z}?w^|Vo#F>Jg+)R<-{)6LE#XEqdP?ewJ}IklM8hBB2e zShcsv;W137pj<9w_t>n*>EYH88pruC;~#C1C0IKsbfR`$k5JVgAQM+9-FIN2za>X` z)Ux-%Mplh#u`7r^u+my>i3uJyHHLFAZ4T*DDfF~o>R~~sF{oI+_%y2;7FmUO!)wAc z%Gw0Ku?=#sasQa!o-iqn9;&>t|D!Us{mK8z@wY0?|6k*oY5(WS^uNUTUk>))KGpjl z7lKc(oF}rTWJ%(wP(MOR7-)pXh1Nu1qe4jpNI*#hKvi%Pp`ztX52iuGwQH=jU$*xm zn-7H0C}1hBwG=LTS9@xtFZ5deevaK{ee8B*5~1e5^KPbm+;}&6H+$UpazAf^;(+=^ zY(ijq`)A-kN?;&wri14kqCjpO1;K4oN4Md-$H3%_j`YrUGABmrblnMdZia2(x2^+m zw=ReA?muH-+z#j}Ms(Y8UdEdta9{ILUMzti;M)xt_((7bkQETRFi(jWy;U;fB=6cE zdG`m&?H+)0!Bl1BT|Mt`YdzLOR49ML3?><|FzNl20Hj5B zrOcvYHmy{=1W_aN>hO0HEQ*8xhedU&A`{?Boi{3-Td19z{JW2mNt#Rn6y|**o_;Xd z#NG+I9kJCmMi$XX;*xZ#pK*!DOYUW7<`!yDTW3ns@c|i1S)|hh#4Sc(fEJ(}+9Fma z1!~cp>KtMpCta4fb6scL88@Y%D0GFQBy=gSgrr!vMZ*dadivvIDRtFqe<$LNx64iPNBhfDm~ja z$#hG3)~0T-!gsC;{^C6K46f!x+Rb$Jqi7v&0~f4A2>D3J%%{hG5=Y{R*;kO|SVq@a z!nzv)-dFIUz8%)wy(6ysbe~Ysj0Az6a_9|T|xrC#m>Oc{te^$*1>D$ z@U#Wy5+j|dRw0`4fX=o`Tc_D>zy`e9WE4OX+MI83T{+^i0tYvx&PuDw$WR|(m0+LW!h~DH;+27_?iI*S*0Gg|a&>tM zDQ=i@QL6IB#YKhUg#Iej%lakZ<0Y<8W5Q?HDee~0igNdE_@(ySE`$Z+ zy(s5u(Ycjvh|O`0%oqa`k*fS*xRovs0OK@qdo z(A7|X40Din8V=uQ(-+*z-cckGyrt5cN@4nX%CFRmeSQ(InbjK@Hfh{QjnWF&uLNsn z%w~h9x*M6jTlyJC*tyKpLu1+Afu;Q+`eBik)4H|+^uT+q;H9yR3{wp=+=;1g%aLq8 z@f*wta)k8h2|XBn$5u~KvyN{GP1Xjfp#UjtaB#kf=xd4lb0K{ogu0Lc6As6&DbB5f zUj`B@K%vSHBukZpW%HNg29X|KN)P_>l!n#nz1~EBdLm!HyR1pvL}bu(ykE~k6vH{g zYCRt_cFB2kFUbn1nOh_jRr%V$c{W$;IEKX?gozbqAoscUiJdG5x|&WvN**{WaEKP7 zCA=Go_{&8%rixzRwPF%Q|%}KlLtZLA0OKbjMsL@0aF)9CjtP2;$< z;6TqCpM$2`cZ>pTA%j8r`@wPr9O-@y5Yrac&SCR)iw{G2Yt7feqYyBN-)-%T(82FrwHgy_n!w5BOds9oTEt5_d z3I_`VvK3&6tc`zBLpQlfnC?C0YKKD!G}4c`2+O>y=&YkgjAw(PiF=EJ|HiU5_J)3p z0amSBY^J9oPsWJ8c|^Lu?kS=3wix(N0k2{*)R)09i!S+llZVJwYuVQ0%U$a0gJ$+fY0T{;1 zJt;2vtldAFkU`*oT6+DuQ??f z*eI!vbS*j}T0Ys7YEuP>+nO=Ah9#}hIw+07rwEGugsWm0&(0=(Riity(dHewdo7ej z21$c24vcS`#XOHM45bjTl(HVPYy}sXI7B}DXgn4((Oj(EsMdsh(8GpnrSwYovLZxA z<~7Q&U?g0_owqGo&wI2Pz}Nq2a+;!<_Q04-$VxteDLL=*SP!bJ(Q@)cl^48>pok-S z!eZriWv8yjTCg1UF10>@Dva|wIU@UTTJR(^TO!M8 zCUomS+v0I6+!4le>xi_s0DH=vz*~rKCsCuI@QMxD$%@c2NSX6l+w9)sa1fh+qPY%1 z;@J{uaCGB!q&IwdRU7Qe7>l`ecVO$l$ftqXU$MlIMAjO=RVJnc%uE`9A}w8xd^ z)tF*6^zu_Q(V*+3VD1n+{7^udHz3fRt6dO%s8fiCtv;w%DV02B&LJ$N#D7Ru_`B-^ zbGdQ~@|GB(_9V0X#~yd?-hmvYWt=5e~c zb=y9S9@Z?w1b?#k7`d6rmnN9Ly5(#aOu-^lb|G*v_!JU+rV8n%wX$ODHs*5n$>%k1 zR=AAoU74TO{*miDzsGHF^zi%Ml3MBsQEhEA$k5^DowYr8s_(5>`mC(_Dt;HCJmg}j zuzPZRQ!(jBftOw1S>?|v9xE_=ic-K4P$YQzKy1z92f1_pP>=Dex0UBZ`|T4P#`O(j z!u2giVC59y?Wd?*N^46aDUOw~p2*L<`ZS*mS4I??JNb^OzJ5rEy;Yq6vVRs2M&!PG zOoQTu6|E`UP01=6ei^vh47f{U*Wm8zm=G`@q~HB4NhfRurN8GndHkX&PagbU6m=}RV|$Ic zHG}@dPi-I_G9vRYwVrUT&amGl`(QeN z{zZq*YR#7(a1!CwgSR?3Y)h?{(o32Ex-4CGoWGfwxN$&O zMm)*t)Xl^B=n`=v?Ancw{ZBOmsTF<~6z3SOr_!*gqfqH!d4OEzn?T+WL_R+p9(tlP z-Kz^Rhiq77Zuf>TY5R+Zhm6zrW6xo0Z)byO8APT?(A~+UUWw8S<#)Eq(^a%Gr8fgd z7uFw)*w|>A?&3@Di*w~{MOmkjfwUGDEJA3fkUSDq1|_QSExcLg1!!+T{tytEuyRa; zW&EvHW_zC`xp?X1v&PqD)qxr8^UP?r3$dK;)Y5s~2S1;8V;<)|ByoTY=s*rvkM)dY zaK@ChcM4Z9vNSsQvqyG8FHw7TxZ2Tb;&pLTRKxanVcHVCeTCsDrG;d}vKnuIy5B#W zP0zN7X_ArV8G?jQ&ZnFYAnW#lX>~DLSCqS&@c!0reNWq2=Q@#3a#n`pvF~G(c4A?` znz^7vOLKO|TDeybKPlOCC;BMmaSZ9~+1YEg&(d-IJB+cacR^a@4=T<{;J^89zX%^K zKvq+hNj<9?cC^tmWs;Cghae7G3<1l0aW2V6+m(X^UU8qRr({ zIJP)I3)t+|m^OWhDFDcHO1KF;UnI})PGs+LFx^2wIe*>zifpQKZ^vTZjG1Ez6I1cN z11@=TDT|ES)}oLf9sesR@~cnUsUfi~*l|VA*iTCyBA%4LOUOjTzxXKn^;}M8Xk(+Y z5YP1x8`p6@ZjDlVKOtUNKvB4*R$P`Z(*khoHnogZxmYi>Ag|WGpUe(nl@SPT3aj=O zUe`o=3X<93UG-aXJfbB04o2~(x{ztk(z`7;o=|kbljnS@kcpfj+WSH8>=a5Xm4Z+Z zy4WSJzpV3`mmk5UI$l$)H8;UcOM%_`4@)lCL^A*U0I>@Y@OFc{|GC$ zdvL3&y#OGmE>l&PEB%&Gas~A+Kw(}MI_SxEiiS1sGSqa$1Tg_V_icnOQCSVDov@bd zj*zY9mnGa^p4+7^E2(&D_PxA_^)?p5^qOD%x^%X0eLsJufYfN^f2|rd>JhIafmOon z2YX}KBs$>6)3M-N92g@gB2t!4q&&X(zyAp3-JEVb4i){ZNp<{d z-7+uq=7FUsSR=zVuIR!#Grme(oeL+Tsn#uc1g*37;MJa85;HQ>Bp_ap8w5ZEGB;$9 zCU%*iT;*T^A?_?vO0tUkZEQa1_agT8;Jq0+f4RH(B=z$4(Jnbe;<&~ygr6mg)oG^j zalVDYvMkHiv}X_WVe4MI}k`#LIewe;y28%Rm; z2u>_1?k7x@AqX}c>67E}BH?H@^-yUDc}^7VV81uBnc0-cGTihGO-*skP0N{7W}Z^D z97SdbCdY_ODDsFzpsrq)or6@+T*#TR(8EZ^A%`y+xYfYUzK=hdekjvaNvhido5qxR~R*IhIDoYl(dJ%s7HS>4ATyRc6w*Onf@h#CGJ8{>jwYC|bqu#YEtS zb6k@w>am~xjda)L1^nA46Gl&<1K1w#Yb2i80P2gbj1PYN7ePVqnl7(V&0H2Ce{IRK^4h6)i*&=zSGRP-($^`r-wgLzp*+F3dHzvpQXuVQo#Rf+B zVpKA`RCT&dk@bKhmsQNE%7ZhJL$qE{)`r?tqq%<^aZ5pL7p)VO0w4>i;rKZa;p+J9 zDOrD%d9I)fBV#wtG&zW^v&ohd5k1}931=H`osi-$7{!S&lwCr7zX=JRBDVs`xb-`p&!}TOveS zm-uK=P~nfVU1n^Q6gy)!Co0aiS}6ceWCo;XcBC%=dO(#4|7pO=6MB5lg9$7*7<25TGGt?3OaLOhY%sVo`}tValz+v_LhZK@psmfvACD zA3`dFFyS%qqCF&{&h4TK42L_OUI#;WY2*-=xYgLuFdf#2-ZZX~`{uwJ;qe_|+uZP$ zFec*&N-8Tz61NCMS>YyBd?nqLk;K`c zG%>DSSZZ4-^qh#&tAyy5V{f9WzL8-(;(gf-%AZ-$?t5!@$QeFz-H4 zAAk40fw)9pHv8i-#jbiE2xkE>5Y-9jywK?i&_;69vO2p78F3x9m9`CjcR z29Nx4x(I@@Rw*1IZ}aFAsZsOP<26>skJA+Ez?s>nuQTAm>&z#nf0i#_q({rdSJ9=} z%CLBDFaXGW--esQBQ9m!=F0vTrlj5Z+#dz0@GKMkjE-KX;H}1mpJx%>q^Qx%RkiNm z4$od%w$35Tcx_w_@d9Akqa8hX(HKOtLzFCIiL*=6KDKbgul&QMF;ia|Xu2GU-?+|g ztsl$b?hd?gxVS;(F&4Dwr=>zs=T47puWI+w3bC*1^<7>J>Aq|zY;g(Y4oiefU8w2&SDopAY z@lWF}3{}Z@ z;IzI_>cPIYg*eecq2%T{dLnV9vfl3NEo69RM0x*_i)+-%HXp{z(MH7C%vq=9+ohh2 zM`>_$gGcEY8t}DcGS;`hV-ijD*5Nc;ZNb{EjQDX&1IO}-dHbsfT9PUNH+)y4alS`g z_ReyYrPrA+#i`ZhCt6q}P9V*N+@4F=&@ti!Xu20_wd_SNB3f>JU4C660}>Pdl7j!0 z;w_fv`@dGk=Q@Sr((>}p6fd`A=W#clgU0%uSXWv@ z>Lsdcr%BWROTh0a5>GhM&g3CS;DQtPf)kX(p*j;*twL5H{V)Z(LpSg*j1;PYWr=b3 z^OO5%uY6aQM^VTp7?vr7Biu0!;4Mw(f{uNS+RS}9>(If9p&97Q99MH>&`!EN^R0!s z?s9jSfC(cYNyIB({FMbkJSnn&fNJ`LHopg!@bHgMMs)bK-u3y(}i89hD*lV`mvJGpJ+qpB-%48>?ogmgqHRGm;e)nH9o>xe=5Z z+)=p?$Xfo|l-<802FRzd&302E7*kzt zXe`n+TYfz{Zy4YV%w4M}=-Rd+Fx;<>yZ8O6@DCl)=s_6ggMVhgIj@(F`Pb#X-aF9c zJF5GFRyp`9V?a?GPQX?C-!ud z&typx_pftG(K3TV=~|@z)&vI?9t#x=v=YOiG9hCAI|lYqz1rZwo_50?7#+)43KWRR zn9-A16rho78Qdj-@ytZ{P)aVjpRTHu=emy}jLTorh?2FGb92f2X<72;LWwKh9cQN+NJUZG`SMMA_9 z)tn)2UKI*uE}n$Dc4xo$TbJ?sa`Q}5kPgg{9z7%;rYHqcuq`ffuoWc6f)tK)p%H#; zARHT3$s89~m`r}^xRF50fJ(&=bP!**4EnBIChYMX#&SByk(&T%MHzEbVPQ`o6O7l2 zf={Y(7mWuxH_z0VsP$K&&N;>n>_)3q0yOWMSG5Yv&_=!b6Xefh&2Eq{kMeU0?EznEj6-z*`HkzIEP*s(gA4z#l2+bc(;O_ zw)FCNU9&S-d_+7olcGP8c|k7k-W@#+>cdU*BD{jNY@`4bg%BkSB6r#ty>$4{6L`|4 z@BPCcx-E#T7KAU$$0N?kAEbGz$teL4_nRpqZaw0Ur`akvGCjeX(&NUQ!Zw(`T^)t} z-P$q|_p&MTE+e)3j-?stY0@%1LsDavEHsB~L+Dp3w5wG6jvk?Z2^-xytha1hrd6w} zEzZ}u-g)ZZ1RAfQuUM;gwUU1Rol0EBFlk|Co=*wOyMyOuDMLtNDeM`5e8AIAwh)JM zSe@p&SVy`oVoL*?h-EMVeS+Ve0&pbK`mH(;<4Pv-<7$3TbO3x^F+)zRwG>x+UtQ_- zL{|EiT=_ReID5NYN&imRdnVckd7N0hgxL2Xb}V)9B>FHcAUV-nA3p0v8<)ZlyX%FY zt2da8AgvBPIkV{w0{Ivr^zLkE?)C8Zx$(QLVwh54j<3SDkjy7%bGi6>FWA%mpklNoAVZ;QGmbhPM|2jvhXBZqDcLscYx6plNmja|?)RnfI>mm$$j=-+!!ddqdBKAw2%by$15@)PSLjWGl> z0=*g-=@q3lRpV=RWL64X&!2~k1zRW3FH2+H#S1>(Jzhx>KT7MWM;)n z2E7j3hYRdidx5G|qaW|wVVfh=cC3d2ca+1evmYXurQ%*!*nbWxsGxpGz&`s~`Sk9+mi8nbS}ICT)^=G)yc*oD`E zU;rP`tRPCPIR=5XVJD8uVej?e=uBeLjEZ11yfII{@b`I%jp2f7}qnZ3#fz8+!5eV+$-f3e#A;|E-S+1dk?2WZMSho8az zifa#8_YcTO`K=(TZbj0QV6ohw8Daih`eW1SXo|b?Bi&ab9IohhxRndGbB9w5?RldtRq}N0X=&2<{O+9zI!3;7?-*R z=0H4`O0TftIk&$NTXGRO8U4j^K0zNX{_U80PmNeQ(<^J(i}MDcIiXD#GaN8`gFc#X zb>#Ddp}cQR`K%dajgJ(J3*M!1Q}4Ca@=6rkOK798k5H2jDR6T3NBqPO=u;>FFS%vD z^l`&#Pe!qpsIq27F>=24zLc0=wf)J8c@^YQJxGmw{n){u7Z4QezgzdnIKA>YW&9?o zAo`gFAPU!RLK>LhcEhmr3dJPqoP6QZ2AATDN#UECY=eKjzZw?XfBZ}plX(nGWPB%< z9+kTF$VA82p*YDzxND}vsW@fQnFwQ{C!zpBsG6Lb(WV-V9jgS#koIw1nF7jW2%3zk zv-5`FDkiWaA2bixDI#Q8KSojSyv@I_qfx)G(!H7u*&9Y$+b2* zPDndqJoo8OXUs~rs5-lFVs!E!XU_+ty6vyTg&|hMH#D8f&B~>I(kYn6hr;PJr!cbs zqRS#nZi*-l6D#1n0IUv!_DNkXo?@%iobyNZcgBT(UzppZrcr_?UVU4X^?6>W@?|r9 zs7p0Qc$mYfGZ6-wyqHufE&Z(O#8PI~Di7;Lgxkdpx$V^`LOjv8ZRed?qGhNE?aE5B z2XtG3<=sy3b>xa*W8IowIV~|DD~mC@a6UUI#1)N_lYT4Oq&6rAb|?PH%ELSX!?tyl zwd@z)e&pks&O9=4$o=G}frx#3oMvnW9RrPV+&k<8+scB8QhZ^S*DhfAOw7Q)wqJeS zA+j8Bdpq`|g?@{9c=Al55-U3i?zKm;ImhFlxpwHma`1rZysOAX_tYXR`nE#eZ@rr5xBDyffXGtr4u}n1vJ*K!gD8E6-mzFqD!Zit+om@VmN6uq}r!J@32gLSC z?T1zvdHWv$SEn5=Jw5SU_?F9&UXROBHsk&M%F6Y(mbx5a+zDKJOVoiJPh>$WXgE!JO)7bQ+9TqyaBzo zoxzL5wq=-gs3|mixHXb<`u*IG~D;yClkq!w=Id88?(z>fe<7VJVs=jCSYj9_I{SBB-4km(fSPr<_kX z4<+Vs9gwb87YtOZ?4o0%(m4`nUBV|h8ll)uL4sUZtWD7xxy@yzTvizPs{nt zT9nBJ4d8yL;a-Y`3Di)NEh3({2irsE$Z4+xe80^}hIIXT+UpsTMfRxtt;7kzy57o> z_=P(M?hoxR(pNjgcj9l1G2kL~^Y*3!qtb;aAOR9__wTwjwv(mPiMXY27)t7r!f5JP z9(5QmjbI>>+0^5u=)T`kFE-t_nf zdEftM?&`lC{F|}8nX?1PjM2r-(b2)#mC>Dz(b&#4_*g?X9IXE`srn;#wh*i(i&+f89vixS zEoe?9n3T9U10-yX#&RHFZiB!KL7Wf;hSoNoQps&c%!QCV=Ho_>B}x_D9t&#{O(f^v zqRd6?T(jPEQ^6s_ca1Re9!B^By|(cq+obK5$3>SxEstkHDHAtfO> zCXIDTWz>H76t4lh%elu)4^eYCU7{)E2acM!%{JH;j|ziwj*E4D%EHY-@^P4YmM33d zvs}10I4#i$I5KvuVFvZ&BGDWja(D`Orf=UX#Wax!#TgQt5yFvo-FkxDI)3f>lFfjX z{>9A70tl;$hfN%AjW(WcvG?k@6|nHI<#698J_cGJqh~Wx`Dvj}aQItG^UY)=S=mJ7 zti)4o__nWoz&+#BZV@>e0+(C<(0{0FQQGzDo?Q^UUe`ylPS`8+Q!dlg$8H~qI3!KW zzr_W!%eIGBwjfv>Hz8jCmo8h~$qu;r&!7ePf68Dv|7S$~UyOSHJplaoZmI3%iSY;c zHD#8>&q54?78oKL>DHJBmT!ayDMHnT14~SdQC6L_CCyUD+c-TPbSkX8v94jG*!(bS z5cMQRUNCQ>SSfWWty`Vfy|}$ZxE|p9*2B7^K(VH8)pEzzwZpvg>=Ur#q}_x&nPXtLUqvwxfLNlk3a6`*mBtk;- zThwTWh8L`8hsGD==<9|TLPq~|pPl1v(oG*Wk$oH#qJuprEWzEq13LfFeMvh1$$d&X z|M7iG;dj2E`&$HyPucAUF~}TGmLT*Ob@tr;vF{2{w@o2R9Sdx>mo&QlF$_ymIwiTb zvNy@bt&xhC0P9Wju&vS!YWe<$nw&HHX8K}WQM;Uhils{ZjD?sG30X{s@?aiv!5Cf@ zk)%?IDYJDBkc0|n*k*iFr$9GHn#>~wojmIuZ^eS2w@I4C3bzqhkg;|7Nf zXkq!qH1!+FDZ>)({JtynS7I0)J8KnXgI%Q?Z?(lc-@$MmHF5fOx-5!SDkL=narU;^ zX-V-0DZqL`w?XH)&K%c5r!fa}gIulH=Q1%FYmgN{lfxi9j3nB~qiW4jX--ae*JSCE z5d&JY>rCSc-?mzR%ga@=+hXIHa+PS-#Sd|Rl60`|ZO#_KpCp!@u;47yY){_I4*?kn z+LL9d>Ts&*9$XT@NffhNwlj>cc~?{qG%O}E@K0bNKc9&0yUo(xSbi$~Q9EC!E-GsGZ_c^bVDAmT*-_gO+GKz0B)KSca zi#4I)WhhIPXibBmLsF_jHF409FWzi3#EngpR`GaZj2@nVERzFuHe+x{!NxKI@d}Eq zB{DK?u|1*`lMX6>oHxK`k^Pc2#y!0697iSCQD}vRbS*6}d9By$Ot)1ov80*LZp)7e zS1*iLTp7iIfa9NAP;X(0ZOY=5ExRXLQg5a9&J@whZK2UOYJ6U?qUNzS*ig%)uDaka zJy0r{OELDd@~rZ1Jl;AFp0wj7;3RwadHZtK8Mv_EL2nn6+LbmwfZ|k@#Z5|We2LQ{ zyxFSd-JYN126m2cLsmtrree_@VP+?*y5L6&Oho>8`|;;+xZxy@h1M=1EZNM=%4@`% z6TE|p!Zva8PpZTnk^1@%knQ(885hTd4Jr54%_K?7&#mDEX=XXPN#EM(424+NBDQEA zI3B%NZeuxF9_N;|^7({uOR-0!iX2;9H5Y0PfQ+|(Ps(zMnu;>87t3yp#Hg6|XF#y|y3Iux<8fexHq^)%l! zgP9NUwPqdgcL|C1AzH~Ui|br)Cx$ju)@-2>F&5M<9@OulYYe?OPTCiK4JxfM6HFcq zvi4`X=;%7FJ^mJ8wi9 zhA$N30))>zv+x+#QSDV=j!uw$P>VD)skusW(iF@R@6YCDHp~gJ>4t1hMV*bjQk8f3 z;vuzA>m@xEP9MJ|hDnENhUa!Q`t7bOMSODZt1HB->6Jkv8CiE*gVyy+H#|IV>e@ER zp@@!@U^PT3)AKLi@5kku3UGM`no9p%A;3?Y#bzs?bN5y(ZwW)5jF6d9#`B1>NXYJN z9V`YtsdkMvuH5N_$7L}}Rl=x3rSY1#0A@1RG`HFL6xicghi8s&NDsf9@!#VCtDv-q zROdxdT4buq0*IP7$Gu%kGUKX=R$SJt4@BLW?Vh9MQT{@Red%2v2ak3_pvVv0A}ha1 z$d+}H(y!8cWraCbSYr3{inERu|bXQ3ch%7Qzl86MG8w7e+WL5{kRU zq*8nE?&?bAMx%~VqV_T`?sHk}OHcMmH|=9&?16aBSWikZ7xdg#qwM-&H%@s!X!?=6 zq!V=Hi)hN+T&Ik4VEFmbEWcceF1?5h1_z=Y+1+logJ>bQWpoBAgX&9^7cqWxhsbnY zKp=P<37474LgNYblO6|gAHq6}i}96%6H_Y%;itF-mcn&$&f^N$28T=9-BVfnwW)fB zE(*1&DpRuath#LJ6S@cY9&LYrG&@5vZtI0Soaz7{moH1sluZ{ZWilP-jSgPI{xL;b zmkKcIgw(3w(h>z*B?0d|K{Nu*a3ApTH-D?j=}k@h#u{Qdxj%`E(8~j7D-Tx}W8_Xw z2Uaqd`K|eJ@}dfd+f&DOnQHo}kK+csJlcr!JBgiG_2Omk$Yv~|FMmV-!ebqQq6?#B zqK0Fg1I1HDB&5XuOSB$v)O{$KVk>*@x7UF4w! z)^3IvgKCf-;Wfc3?M+KWrt-vLrpe>#iZ9L-)IZ5+Viz>~d~*+e#p4efD5mFa>8C^d z_2Z!dvGGQDDnrF&2P)xLYc#-L$5=^itmJ!71PSKOA9wPQ-mJXYU!@Gsjk%Wc&m6F*(?n0Gu5_`z)pzuBPr9(!x{iH&=p{((>{zj`qKON+@b4E6Lk zO1+QI-G%wW2llT)zkpf+e8=jh&+oFJm4h$UodN3e)W4)fa%)iSu~rV~33bAS5Jt{K#P@Q=mAt26u%CAOU)p|b z7$VlxP;DYWKAXU`DZ;iXdOr{R0k=q$aN7t_&}i;NaN-y@0M-+fGvJrDeJE*g-vnqzuE7J z1R9Bd>%TvJV@O~Q(;qTCoWQ3W(kHL$Iob7-u6ku@27C;5%VzIQrgw`onfop!8V=y~ zUY~yBaRRpiH_lePl(_i?rKpsTctCCarH=W=_+Qjkajt&={I_qf`2Ram@P9@{)BVpg zuE;-D>%XWi6?0PuXS4r48FBx|>9uscnK9NSX8?-`2@o+$pwEzl?L>tIi2RTOB!tvS z1rmFa6*h9Sf(7{?EO)FdLn%Qjt5zde1Ip+Ms`FQut92GNZ1j6u?3?X>N4y_*Js(Y( zu@K*Uz4o+kbXv9_=RO{V66FfOemf8oq>XC^+vkECaS`kbLwEX#M0wy;`OZM)*G99M%R4r|7b5REdKG{~Yn)eInMj?jr%V zNAY*a_ND;aCc(v?v;kl3A+1hd2(+K`5?mV0FPEE}#zVa1T@%po+vE520DE)r4YIDR z$Q{x>cev{m$8aQ%eZLs9w2)`nmmio!W#uUe5Z)Avthxm|f+6?W~;b=JBvjuF9O!?a*JGvxfS(5P$GR@o_ za@+gU?p?P9denou8fMVHea%jDv{bhj1>pbZ%7|vvzEkky2!Q=4MC!!cD=hnX3hAhc0#H+LrkM<5ZyoY=3JyvmSUJ+*7Km+_e>^=5D6VCC*O#W?X@9(zNpMt_y-z3x*P%uGx0L6H zA880fCW}rYl|9N5r?&;+h*kb9)Dy*9ad;ZOvyo|b#r zHKslKb&Om`P6|<-DPN4q<(z8yDKi>_)JQPNzNs4cLlGoej6FCzraeOPH+sO3L@?;2 z$$kk5r}8>tEI)>ujkP0HFlnui#7tB?+p z*t0Z*dSP~7@yiOZoI!j>WL2@M9V;*26Vz}+kbGSq=;DDFuM^0>3MN+WZZtp!75xdJ zD}wC4^6q#^PS{7ND(nl|uDzk-=HT>NP0ARM4}26W6DGa{6$J7YAiagBNNKxp0dAad z99c0ykE>l#QH^9~%I_70Otcs(sKe-Cjl;xHkFetXaMpd1`&dpmM43@{(^%E?02ur0 zAcc54m2{t_yuWSeB5RXm3KzDFeYMa7!nuwsT;*X3;x0lMvM?N;{a0plu5#PjfJ0ID zdzli{Uk(ZeiZ!RUD45E@r+JQwSGK*lQO3j66)BElNbN^_OYlsC{u9{7ziLZhLuByE zRPw7Kv6N{bjC(LHWueZ)b}r4yCf3Zex&tLt&iBT+9O68?#8Uz#NYx^Dy?YFX3B%Vh zte+~ed-olB?bV`!8SJmY&W2GM^&*0Mj z1|?$6k7WwElo{;(ko_rhb8h+)CPm192*dIY(Krf&t7OKSpE_aoj^1N6lxF4&G_2pR zWcdUdChc*rid%Xh9?#THIKs9p2opSXiiGV9paBg6Tg~1P2-TCMcx2($f<*U&y(oLb+t!X6b=(WMY9g7m^hcez!s7>dg20{qf%ImX0kI`0P>6wg!cDVvP>&0y zFo7mYQs+ zV0(!&{ri$YoDp{Z{?4sF@C%Gcg}PoURvBrih)2a$uGF#4qC5P0;svZ}>;|zM`r=29 z#=Fw6spn=C(b$XPdm7^9!#`%phevDPuy2LMACcGm9kNCDRuw2XFoPC0?Ap_Ru8zB9 zu(UqTxkxKKRp&gh`8kIs>4$!)jGt`81#Uwy*EHCt^GO6ys5kBAm8;Uh|LpaK+38mX z{@xXhKLd9-M2m}BgNyi_=)9ldLQmS;xv59o=}&__cIOobmDOk54ilJZVGij_x@Zw& zeT3qrDD@^LER8zCmp5dq%07mYMq<0qHVC3RwKa3?M?m7+V8B2z+2Mm!@NFW*CDVZf zqyu1F5lresSf^1#m*zS4#E#Ca{Kg5lvJwf230g_5+2Xm|dn;{k0$`ty@~) z?_meC_f+#WH$1qkRy53xM+1`hn08NOU<(#BqJ25Wz4J>l+woupch!oN&?mJtTtDue z-~}bY1?rfGe>kPtJE7uFczWw6)-z>&*5EGRoSuR1R8%gu?Yld3{19!H&t468nICkh zJLH-5Fd-(XjM8}_%}E9F(#fPLGxJKLTPmk;l4dWEf@z_s6x!+S^^QsXvFZsLMT}2| zA|00=3B2D?zLSwqsf5a7fkaAPl5qMw6+2EyqYP=Vq;Hm z|J6;BF|3+$h+*%p$XsHG6u(4P_ZMkv&p^5Dv?=}*jf$H``YoICbGYi>kz&zi9k?aaB=KucgPwW8z{k1cE=MUgE11}v;J1gHi?xLz zJ$9`h`gLe>LhshLBZ@}@pD=gfdFfmbTQHAi1Ir&BZ=Bt7bNAP(A(zO+leNOD7!|I4 zU)OjCI(^s3l+_h};Po%du8|WjmUFcLWU9wu`;VoX-58>_be)cUN@7mh;zymPiKt^% z>)G`I#fsWYdl^mTyI7YP&alMpl>wSC4F4=M`K!WHSHyv`ZDzHy$B4;LXGDdgAa0J! zLde4XW?7qI=0m^ zG{ru^=v1KB{A2fw|2qxBMF}z!Bemld)P#Z5UVS4{)ka=Gp#FT%Y!ifv*V^*f1Zd7Y zi>GeFdIjvXQ=R%faGg0p;&NlL2g3b@Hyh%*U+M*>ZI?eClBn191$BHEN3CB{3F0e6 zaQ-R~*WrfJGx3eBEGTW)d>@~CWlpgUFlm%;;EaWl$(uKW4lSMq{{g49r;52DX7?*D zRx&_?JxsE;@BGXj?h{5LSgds_Ez0lZnTj76kPa0LSEgirH48Y7+2dF+Oz&_1^DHF%D*u)!bBkNn)qc`gs3 z#L%-!NTX;FxFy#>Tqqt*Lq{B;0rot!93~wY-12K6Arx*gW6a5qxy3&q)K_NM(jH<) zc;!6CLmSi@1z*`69Vs>Kt*2fb9j1-wGGcXVj{6pqXppl^OEEgpSW8piYWPx?HRR=t z%x{u6`4U684~qo{fe)-X2jGXs#t5daZvMDHZYTE>+-8o$uhA`xzhqa#Ym_d>O}|FA z9RFfmg`HfimI7#L^ylp@#wr^1ChaVuyvr9nv+dMZ78aSo;o+b(`-Z8t}JcA z(vSoET@9tx_*e^RS(|Kjjmwd_XrZ;Rwlr{|vI+DvFd^u!L-N)=db2O{(kWy!R9yXu z=-kbdd|3++jtIVYUbujYF(u4pbcvVDe@R9(=`;9*dTUT$RUwWdV9yeBO0RmK`5R;! z+O8!BRSVK_&>`nIg2jG`YTQF127UeX3xGo}Gh+y=&ByNv3{|sO?)& zz%hX02$3Dci@N8Jal@6l3t}4}Zt5kPg?A``Br>A$4dZx$U)UupF~xoA3rr6jsAG&9 z_SXu@;L6aDDGw_zWHE-aIH19gLE?hEF2KDosOTpg%zvTcsf*2f+G~HoM;;;N0yi8^ zR6B_;>8DmKGU^!>D;*sMPmE_^Mnf2q!zVp5O4JHD7{tYA^yLz6+7)xcQ~+@9V$>6q zMvc^IHSMuE!Inmoa*1|D97nIzso@W3@0(`R_Y9O%^tMybPP4An^(V*OtH(Eis|+b< zK?RVb(C=-Xg#S*IY?uc=C6sO=TkwpbA2M$AiX3~zbR98B8GoTa8ney&;l!@Gz_~pz zh(nS{Z9npF$ubl(UhF_~Jqr~tY$B^G%pq%73iGOs@Er*~C1{C1Kf}MaujHXvO3mU<584SUraU*)DUI3rKk$h{O1}EZ*YmpoJ zEPz}*X9dbFH;zXTty!dO1#nhERu)KP+n)xDQy=F%k)}vtAcjw+#N1#`oFjSu& z7Ts3Jn>&N;N6dKCBntN|x^4{pEV_}O>?6rL>C9jgjC+6PUKUv%g4;4D%lB&Z4cZ76 z+8ELR{uL+82`8|86|uMtnZ}WSaW{-hy`0^%MqNFf@dO=y2=_U~6&>HgPC+$rqAOeh zEh!kc?Usclazfn~*{(EjW_Tv7LeKWlwxyEfGel2;xTgeW@=HCbl?n;z zK8@#yr{8v&`QMkW3?{=$6L)J~#bEAneo7<5#9%d0*{~!9G7OiyM(e2z}jEAQArojcs^GHocPcj;4Je zX!FnJ2Ifo!Bp)p`Y=x(DlU3Qi)1QQ&)wbbFe|zPXY@+DbQswR_O&jTJ+|#cnTU>?w zo;Lpwjqyqr<7t_6Du~6Wp9wRqCI{d??Cf9^74f|_uFrR5wxK{9r#t? zSX%Wn4SM#X9)O9)z_>Eso#4G$mmvE8IARAKw}zQa<}+Gbj6}_WA=OVTYz{&=(V+bz zm!Osjlkv4F3(?e!q#IwJe-3Pz>~Tk76BvLuIj#8az8#K|s2Gs`epYC<8$U!XlPb(O zk(Xwk%_J*Gta9H1dkH;BVv!7>Rd61R;-U!OpL+GFR_{-=qaI=yM7r z-sus9+@=MTNComdbA8ZrJ>8?vieiuA9qVaSW<7}7FV^@=ebE1wdZ+MX_=57Kcy9o4 zg=FLzp4g*&!P^RJiFcHnK{1c!b9(u7HZeuTM<#&&;Mz$_6{)B^xgM06DdV-lKu|6% zxh~>T(+bT^eR#-4y^ZK})H0w%>4PBI>f$RzJsoZ|V44s(LX0jLMY{$KB!l_4PRYE? zN)n|BwAJn<6B<;u$BIx@lSn77!Y%|uE~5WG z%HA=$vTofPtyGeVZQHhO+o;&KZQHhO+fKz?aVl2D$<2HA-shgP@7?d$zSY`lZLaxm z%`wLq{Tcn~z2nBMIT@LgpN(yLoMubK^hiG7N~NyxoEvfQb*2%uRA;93kSg!+^S#Bq zjY5p|U+s?_Vjeg!=uAV#-yTE}V<@T!h6v9|FcM4Fyq@+gRooGX3HPDd&bxODA1)2G z8wF${nbbi--6J7FBbVE^H9~K?2$kJAvDZYs zJD;xG^Rrcvj%da~Tlx-g`qi2I@nb>CQLBfQp0UKe%h-XjWYx!!R(JFOIO{p+-leTv zs)r(~g6ZS9XzKcZh8LP5PJ@gtJ7!&3QKjX&A$Do$6>XtKKl(sk$i_VSt4HlX3HU78 ztF&|KvmJh0W&*Pl!vQk~Zbm_m=iFT-CO4?-(dX%Y|WbXcb_Y zbtuo{28lOtY-y)*F;zR)PO)ffoYtYYWz4qVSrRQfQfto9M4sd@5%`H2LyUqAnlKhv zKLC*^3?z+0n??bdFB#=eHO#(BJu*l)1hPs%I#4@I>=t-*6;^I1EzOiQ3!4_OcECAp z2SqJ^#_Ym83e%4_+W*^GHh`=!2E{R|!l)|ey_9{tl9dc|D~f$koB`TU9MQ}X@kB!+ z&;N6$Ovtywloadvox-BwY}H7GKrS4@y}JgiL;bNo#MosA*Q|UU3@f$$PoMFU?CYVr zIK?8$dHN4C-oDENkmTK(BF={71j^=|0}{pJ$_`Y&{ct&W$1#GbU;zW%EpbrfNT@vN zsZdD;P_zgObxKtJ!Z!G>f*%oTVCNnsW;oCJ8ghG>Y75Y!EW#PQ$qYKf^Qv+pHQ5EGrF$H3Myl0L@}D zW+1%7gRMhy$vwW0sJ4}KMj7tdT7W*D?%LWEM?5lLw>AyX&m0sU_aw_|>2X6ixX3j= zCs&ijmao@rug@0l66bC(E0mlb-9)Atz95&(+fhKHOzJ1KfkO^MvddM4oEpF+MR<^- z!N4O}=8G^7uoOVlpy9SjXn${opxdPJx(>S@^g-~08!o<12JeSJ5REhw)uyI@o$D*?2&F#+4KYN zse0+YVgE#H1z_!^KDD&r@FBbIs_n_Xsao|X8dTPWSraO4(liXY#8X|O5DmjJNSq@p z4bdu)X%0)?)S02iMobPH8YHe(XV}3nkfWT35-lm3@L>-rRB&y2 zHqQeY-nTGtV&H^to`lJ0yMh!OxZEcLi5ccxg0se9iO+w)EiN6u-%@+!%w_clBO}=- zPTKvDLd+6id4JmBS(gDml=Va6z*cqK;+0Zs61!lHG=Ni=Z1urtY;W) z2*OLjD;7_I@gp7LhAXj8iL}weluaoo%{FM_MzpLeAOfTX1*uC8g>WMWG^P(^>CaTs zcGX;uBFvH;-k~UgT?s=4o9GJW)9TwjzO=h!4`$G0`EG29fb4#5)J<_HO@0frMq&ys zsKiefFj8WHlBS}*nxek7@IDL)f2in)Q*IpgY(LAEfTc}H6D7ig4}0+iXX5XpW!4Cr z)vCe)7TsL>SSoy4*We!nBoDqoe-SsklDi*2F}{6kWdEPU&A*#Q{!Prd>_6S3iT`!+ zS8Llp=$q{LY00nj_+UAUi(i_}AAp7ENYo+qlbSF11FSgQLc2L^j;&NGA5jhqv-L@jn*-OZ7`;&o# zMN*n#F(YO4eP-6B2$Jgk@&pNcl`NTbF}&w69x!#o&^QaSg;J!FH^U>K)F3^C%P?>F z05^ow4^V6($aD8pm{J=u>ob-RnFd99pO1(alkTMw-rQFc zOp?kH|DksMu}Z{FQ_i}ii6Pdg8(-j*lO)2v5+3_ui6J>YjjzA#AT_6{z5Aj+LiDLL z>U(YZO#t+{Oci2T{sFX~(<1ms8Cr*bh^um)#*|D`7pqt4Y*4o5JJes}pv3tgP5#v+ z#{JcL_@CX}|Hdov-&?`|$)IVNyJ0P%@X#fYXyj14AR-}!k`usdq!e25hiAi&%JS=d zIXc5MK|7eu7T64?d$}pbN8Pn?zsGIAHGcks!gmR^TM6Vv z6IQ#A<%11d0JM{2u#@n*^Jkyy*1cEzxyH-0FBS}#9dQVfo47aj#Xhm=vCb4o_RCNh zafl)67Aekbr0C@48*XwPUZnumNaYO=_vL6f{(GUN97w$YuiVQ`5uO|b^+qu&?0tsC zZC^{i6KOHVjTNtBdCGXy`O>c}Kg8KX=0c)ER7g$zjQ!LT4r}6a(?>|^@}^!H8Z#fS zpLz<#IzY2EeNV|G*$rmDgy-UE2eZRVE)sg9<06PHm5Q@zWeyjaHqXrfq! z=OQr25;mh5tLmwACNN>S)`WpbcC{8c58Xy39EL=-kPQwqDCUIhh8Fj^rPT4l5vu>l zbyI1^pSf399ueld&IJw{hNP`ZjLu)(7%~o}WJ^=HOX8EZp7WNlC8s|ZwGJcrgCyxC zgp_0^TxY(SpmM&CLqK-DLi13;pZ~fINhyj(2Cgbmgt$a4M>-*AvuNbR%IwdQI!ria zPPn32eqA`yi?z6(RurR@UP7NMGjInbZE!E~o{=uokQvF$C>d*!<0KSlA)CIpTgOgM z#=3)4g_RkD{H3-mQRF_^!mqWeBC5JJGqE>Nj!Faiz1f(PB#DB8Eg@IDQ=~X_gRlXg zmJ*nB#We6@LGt+|W}u2OTO3WQJjmv9F4Up?0xVH;Tl(zW9W7;T+|-ZqEc0;vVQ}Sl|!Hb)6a`%9c$`V&Mpz_ms2MS$Cq=?keecA}4q*ClW`RIHd zwjz`%gT<=#R0S|I6P`m#K#qdS9E6O(NQwE6GQw&8CK4tWv7O%&FWH`tmJ*Fi%?3BK z73uMxdN-tN@hMBqZOo}F;?|IRdY)cgE zB`f6wxLPD+d>{8wKx_T$T61TFk23IEb7F8g%o!OZrDCkxyN+a$8Z1R^xNvyROQ63& zacOT;WYieNl0D0cLREpM?m!hcj$tfDS$B;Y6PF^V_Hm#vr!3`l{eZ5{GY!#M6b}Zf z*S?+x(B_8p1aWp{R!8AHLPNDwEko=hwf3#EWj9P6OCM3xrGkL{RA=42>qaOzivt^X{R6lwuvra!Z?n zB#y!Au8-DYddK*d^}U9Ad;v}ETcL-lQaHYkemj|X{X6w$(^r)4n`{U~p6BHa z_qFDmAzC#HY3xzRCp%n_nNT!S11Q?PSJiKh^0T%rjy)^m3jSvs)ekstN5Ax{XXAl^ zTxs`LY}}q;sAHl8ghv=keW7yOcC$}f>9tSE zz2Iiup0s6*`!7!#({`knR0_*5f){YSe=NnHkRSaKY2%x8qe;3F;1gcz4&59?NZ_XJ?=?T{U0v9PDpAx{%OQ|L^_ta%TNeeh zuFNeGoe&|5ais9ey5$^abU=8LNu3f6YkYvPeZo}U2HR(UY4B~MzNY6gYF~YUEhgk6 zg(2%1gu)Z9p=8DFXovfOa~Y7^2LEaB@IHELOr%pw zVw`{s=W59jhg&yx=Ja+Z91 zj!|hhU4s*{l$4~Hn|9PIwlFVpm=L?jQ2DB8^>dC)Ep%%z+gUNs{lqVa#}n* zG7EEa`ol9YSw84Dd=)^nh1j38WZu(0QDo#Rlkj34cEX*yB9%2E$BbfWtEL9Y&gsXs z50%;N1+a_7?JSJevBHGv&6<*++N6_{^)0I#&A?Nd(K-3DxGZLu6qXjQ$W*9=)q`Sh zTga5Qlu1HZ7;;OPKxvcNM*sT0-bH==1lxFcXjQhQ{odh6^;2H-C;g3-FJ11?+LG5E zZA&E4G^%v_B?W1F;Bses{qvAFdu6-*o^YXK!D9-?-Zd5-OKOvc0)I5U0$B(G3elI5 z3&G5>tbL)-3+DDQUW33-n@;7yJc+pmCa=};TiG+{;uwRAfDF%iJ?t|#{aRmiOIWE7 zwrfKoKHLTe&)dD_a*|meKQ^kQ}lP!akI6LaNpS4?(Kd9vhoOqh3!qA1RLV00yZwa z`i0AkkQK{My(tIMUc0{xD2d}I<}UnxD5BFsPgn5@7-Lj}GL`Rv?0;Tj@W{Q__gWr> zX%G{>PY4C*vwdmVL##2P)72M8mqNfsuDapx9n~APJvoGUppJisTiSrv+!}H1J6{r) zUdEKThDMKuA`3WED4|?yAaBfCn?~ZM=~>pi$X)^h^sdENr4V0)w#Vm!hHoN3Z8P%R z`+gk>suP-MIznmnLLoTa3MWH=L)w+96OtDg-NcK4Cei${>l#IgtYlx?&rmU~<;3h< z8%obsY0IW*noPF+tC|oVuf${eswQUswwmDn&qJeRrtk32oNMC$as5|qC#dge{LlJM zMMnus1>Hxs;Tc~;6TFB#L_fg`5?WKUmPR`T|jQ(4Ya!m91%p-D4ll zZiI^tyF}M%geu+sX%55J&v(GLfY)>|6}WtF`0_R9k^Aa3=Pv8`{Nv-8t``X1A3=z& zW`sV>(!MKXg@}A84`6}4aw7`OgRV4)W$|Q!%(kS*9btfMD{|9A!Ehn4mQM65wPK9gIm7-k`%^;TU3AapNL?mm;l} zXKFHTXEa~K23@Oc`)dRyHPK_dp-8C;qlOBiLzT5kWRw-{&Zcp`4u`JSfy0&=^Vxe` zC={6z+)2&qEMCK!(?L;lI)UsAK^n>_g<4K?+ikImMp7&1{*3!GUFn$~0O!3lX2CWF;X~ zx;GM2j-lpK0O3zw{T-!?1h*oWM86*3anJYtSQ*@WmVNJ<7)RzU)b$#P@}e?C6kZWt z(%c08u?OhT>c9of15(rT5~X;glHc>qu`y5;Wid$X<@?@V@cp5jCiGG>8`MMr8=Ob< zwfo$(CvAb9oV)`(4)GQ4pg4H@J-3y(t*DY14?nE&on>Xb29oWOWi_B|219wnb_pKe zK9$F#&#Ub{^fgqIKw@+w)h_rC_7sALu+;5~0ONZJ)}0G$@kYL!jZ~7l1SnIjM`Oab z@)}T1Z3`O|^a(bpx#pf!ve-4qia!%om$YtsnSY7@YSc2Nn#<%>-UUG3**aiob|mF@ z3=sFD{dx}MW%-6tQ5dQ#;NIl|OuKC0@g4Hw@`qsJV7s0Tl)k@=@G9-gqD`S8?=@~g7fW|r zZ>`3TO(U;Sobf4nNBkf?li}}#mW*&N;n47PZ1kms_0v-INs?w7ClGo}$&ikk+5)D` zuxcXSPv{+b`XjJ=)m^F|iavRbD0S#hw_rnNKXMJoJG%pi7-Y$W&e(HK3Px#~cG-|^ zP>3XCJja$z9VTuvEA7-+=d100TJEj=^fl`Iu@bMRNL@)uq6s+VS=bQ?xB_*`8(>O3 z*h7%0ahR2A`<~dlV=TR^G*u8n`upiSYEN+V)m$H?_S@JA<{jJh(6N0~*Zr>N?*l>- z_@UXim7ljPO{aI@JC^p9U1}Uy*WHu%0r#~}mRQ5)>pr3$Z6iQAgZLLx+NKFEl-TcB ze=R&szQI0lUphBQ@W0y={w9>}Uy%=Ay}(Y!@_%g%0!I3FPR0)ZSaPb>A-s^6a6U*q zr%af>LlD;`@KaOJLQHSvuIYiX<4Sk{k04X zhYDY-8EtxI-5gpR+THZ%ZQlE6;@X&Lm9hHM_xU38@#uZ_%D0Qn{ZBU-9uU2p0KAyK zB}vQ>E6On#z#a`P4B%+cCJ&7k9z7cgFhEHKxdHWJ7+XoLXrm6J)TVX$iX}!dXj7!F zh1|2yMjC2vlb!oXXYvzq5XRuySirR~q85Y!MGN#@256HSl}mXOQJARZhh2l)Hf6}h zkX@(VCWToKWe69@%F59BnMxays|vtolPE-o@)E`X_7Z9EU4YwfD}V{BFX!8zAN6o> z6|1#-1fV%fk+Ev>i#{Pe0(&E&O_a8y=PO2vo-8*&2K^qT7QY{pa&(k!2Kll=J1b^aj~6mvbGOE5T8QBZZMPQahVA>#*gNT+<&#mqyeJ zAdwhNEk+AlQ(pj(*-30;ZR!TH0pjqgs~sF!jc?FpzNq>I4S9K)zj87 z@$zsnND^eW|+kEID+GQX*n)Nn^Z3+;p?{SHF7e577atY%7}C`4$B1wjL!1F9&7sO z=y_V$QLS=m%@@VBOi4~o9DPAqjPSUg3>%M3a$!V2)>rB;hF9>vj~ak(%-4xts;VcEp?X@wEDI z2rE{KG-c(Dp@jtsZRMY_%41zxYz2|JU#dA`aTUdYPA+$0USI8XLh%W#^1PZRb+*zw zP%PR)tNH5^IxTfmN}=jW>3%lrA;}z~G?u1)eHgq!gFW4nHFNcVV$76C0Em~i5EX9) z0D-##z~Cj+f3ILry=M=zGlYbxY8V}GR9_krLdK8>px~|sU~pFgI2gENZOflpLeQ?u zBG88aNMY)ZP+{s0TVm>>g?NM6nz+$Xd%^C5hO$&{1&5id{kU)iFhKMNy#E#2U*sM1~qu-LI& zFi0$`7OLpu(y8W|JSLk?tCd}V=79PTElaDx1TA~R zc8ZSPQB-goOxl&LNqtqd4=24^#A8dV`v?kw`almcu5dp58G`vgcUsoBT^G}jyDEhN zJRL0ygMGFb;lDyY6HgSyNFPfOAr>{TV@p{ZP>Vx4Rv1?*jNc!*&N zQvww)k0! zbrVT8f^g%R8p3uzJsqA_+UTtWJ%Jpdzq#DJlX2lmj&Vatl<~IE)4LBcpOFf7RN)PR z&m8S;#rIJAZum&ZGedczOB#on%owj*&B1rW!#B5&6twD%r+wqlJN%umNSM)NZR_0? z576A{Y0o@ns!oOZF1(z?KYg88J^kfBt;(lqIuY8`CbWj_F{?q0J?yb5%k2?aWJ^m( zCvrt#a5k$Qi}#V9ik^6ns}fbIbVamt4!}IoIviWD2}tg?@*w$I`4a>bBn6TJkn9n~ zKrQQMQ1Yirxp*(FZGFCdP*a}Sid3g9n<98Yt56XEUyHch$P6o?uS}WZL&>nq1O%!& zTsWqeM3hf5+xW8`;P4w0A50r~>0Z)YDvuioKF&PuM7uSVp$bL+LLE0SXq{U~7$&B* z=p^cd^C8B@NzZzN(Vqx{$A9P_4wgI5*z5o)9y)M!<0_n*WTm-1v_9$4|;6)gEsFI zjWM0BKnIP9hc^BL=TcMoy0~&zN^J&>Are6V?$BAhwrlf>%1s2gC`xsuGVWTc8|H4v z@Eg*w&=B2Y6#@Vk?{?w9f@7IERQ>z!yoYIOLU><3+EF(`%}^?JXtjmP%J~3GdbpK_ zuv*jjZTSNM%l^RS0I+IMI87*AY@O@8UU^JTa}brlZ;s!ThKM35wrqwcPJ$wKs}mt@ z4ZOFdfnDnuZ3TF2s3;3V0vKR|88v4Q9G9vIqn~^=AFRHo4ENKt3O!r~tvDXXO>_xG zSUH755mws&a8!?H0;qr<+nY3M6(%}xw1}9`8ZSntwc{zRng71C#T{uwG2rBi47p6n zF!z#u#8%3!?7?BT5myk?$`Mr29r0nlbr+uwZAcTyD52)1R^pgLylp@?wW*YM>B+Um zs2WoZ0NI>g;+d<9wA-2#b-^2G%f)EVv}T)JZV9!vrhDHK>-)2q8Cn;8q5!;+TBjPCqTM2oaJG_p1y-{U@md_?m!+6d=`EA?69a>3E z6ud7#KEqrisF-TVECp(WI=)&ahse9RC+;yG2RwW$u63C$w^~a1m=&+vJJW}a?mF1( zb#8!Y2=Df4&f`ix&12IrK>4(wABfQ(K4nb6CYK`t*bI zasVr8BhyXW3+>J_4X=w)(0s&*^-OuFPpk%MO-fG8uj_(QFgYnLPC-cn9<6TD#z>lq z!XAm}AfIQJz9ZAz5R7(s?I~$$4>-7ruTR`Z)8ri}Yp_jqmwSe#$Nsc6t|y>dR`|V9 zJ%uY`be$zrE`CkVkFKB-Uf+_xU_5DAC`2K-=lhq*flpZiXy{*@aPA$!; zii1)RIf#qq{QS%+^(a8U7mH~26~N+67s4Enk6YGrx_F!~OzXfp=`PlD*wb78K8N2_ z$g=r;^vl}jWD~&9#p>Dt=(*}%xo?(@&5QC@9;d(`@Y|H%m)O@VmlB)f!);s z?bz@6usO_;WhNoL+q6wh2ioBFoDB)tkfYn}dD^&XQlI@Zqhh=SMwKA))++44-@wVJp-i7=Q3IY0XqpqlC_(ICEP>n#j zXm`fOT)RFux6shs(_Y?8yZYrv!k>}w!wkBmDW=0oM6I%3URVmAl=YSp0WS3WjZq(G zwXx4U%zBLtO?hopt1B6(Rp@%*4?>G7qPl!8RHarC<{wlMtfRk)0DrQh0Yx>#O+iS$ zBw6#=P`@>uhCl@%M%-#*%f^dFkdI3-u3$qsnR(>V6g!=0>M5!&a?<_ztHZ4O;VDH8 zq0*cu<2V%7khs(Pf`A9x3Ss7HyVYE%9Wd)cAAz8Xh}Q>L;mX6~V4R?*RWBfUqU(4O zuEfp8iC?AE21E9OL+D$8Bfso7NjIpqcFIXLhc4?~rsL${wK(@X4Y5JBz}t^Q4fVY# z2sYSEk@^+z;OwcT&5Rmkw&txh3sl|)446kYmc~d~5K_9GPv*D=tsXVZZxXk3bZ&xh zPc)F_J3F8ktE9_t6lhAA97%91<;*H-(lvh`VVUQPHnVM4gBflRRit@UJ*$%JZRs@s zInmsvnOET=D=gR1k3`o0O~HY1yB;dT;m$o`6;!ld7#twF-eh?$uG9GHu8tp|M2@+Q z?owlqya@bogd)U&c+-|caKCD%FrAc;@6g#Yxm_d5`Ntq5LmarHqe_09-+??LrLw@z zW{5Do`0*MZkdKdxq$2|t4DRTKQI#?NgviPhB9=Y`DSIuv8F2=2lNQ9!c>@mRwO=Cl zm1V*rm__)uL$p4esLz9aJT?v4=+_j2L{NU(!c8JQIi^P*9h{|v6X5Jxk{^7LD*HTbu6>MbujT8W{F!E-HkQhSUgLX z#XQ2OjQu+s@R$5h*_nV6a+SSxa!@pX{6OKF#J(Syl5C1STF=xp3YY~1Py{LX@cF1~ z0QMqVxg_Ns|DrZJ+(cIOh*)7oVvHRg;@94z{4{crZW6!fMA4-9mWia_(_*0ogl7dw zHn=f>5LlV{SczCcG0?t`B=ghh3?QCoGp0t9p=;^nkNuP0tT`qQeN-YjXkF>gXuNGG z!kYC7eY}WPfAXRg?v1cx70dQ8j?(WxVUoL(eJ0o$NQj!u+l5P&@nfvb-eg3n&x||` zpsLb|v`;gz)0Bk8JyW*jdkmo_JFD0+!F!!r`&=xnpTt; zj_5t=o!7$fq2LRIODtAlW3EgQWX)|V0q$`&&2N(jiNqaDB!B@1xva<68HOB~H;;wU z=r9_?jnwF}#FDk&GZX`H#WT>sOwXN7pu4tr<7UI6mqwXxsi1UMY#V<>x_VbzYWc&t zq1|){ySLNYqlJ9h*f5w{84Qn>ji)xdqufKAcg&|ZC8E-~aAQTL0`Z8rNuf1ib%A(& z`NsJCs#<)E9{c+zvsig2F9H)+Xf=)>`n|{EXvg=753buHZh+JLK*>iDr$#JJ;>02Z zkhV?$>2+9YX>TVO2ZXt^+xMk$Kljo77LM%i3-d@#zXgvt2+GuuwHA>F8_3lV1tZGY z#8U+`xlzjM?|qZRh>#?GD6ASe9e-d4qi?T1F`6IuaZ^m&8^1Z2kWfvjr^7SZy={}E zR7~Uan_$)7jx}d-&*?(6g*5fJ4SI5lolImybPoaLY#h0;Po0tkP{(p{1+PJ$wg@q5 zt&DYBAKx8dOJ`mHlkeYrDJqP~O+r=cpiJt7j_bIN8--Hq7BN@jGuNzf&PzZ(|1>Dn z8XM})9=#D_-O*}?3$;PQ?FG7_dtQU^2JE-}AiIVbeA6ijr@5P~NM#sP*BNHl7_ork z4YEqvSMf@_!J(eE_d>=qY*pPg_rg}Y(*eHJ?^qcaS3K``_Bz|sNqY{8A7!K-Cetus zTRb95K~Y3wShC8wdslIMWe5cx<-=wP9$7k0yN{0g<1VCK3z37$hL@|qG_D>Vr_t5J zi&L*dowup-inmMe{cQ%h;_X*xyHCu9yH9U!%YA;vC$M)K9U7E+Kw~ILnUQgyZJXEm zzIGc%aT_SpGYK15s{yV}nhtLM12hEXzfC3AKLaN!B}q*KnM_%Z9I&Af)ecp{td@h&;x zX!;lwE1|nNq3f<}y~b62W`@&L zy*M#K9}cn)x7}t{tC5W$(iKh;TY>61f;?B1(eIFsy?Ddl69fY{)0Fr-;soy2-D;`p%o(wd1$t!!C|2|-XGBP5gkT&DTX7<(Fyk~cBgrsh zVU3Uey!SCv9^Uc0%Tr>hDS2)SN4;e`BHWZY-u*@+5HZtuXz9D2_MXCE{2)X1^Qym< z8V|IJeg?8MMur!uuo|#PxX;{I32CUJL(=W?(9tfP zBDJX3hdgh9j%?i&QP}Q_W9PEzDZh z2g7D$TrT3Vb%!*W; zA;E*9fkT70Z@r?wz2X&0wcU3BW(wUQ_w8Tac^ELCA6_tesX{ZQGKzYHDfiv>-4r{Y zulFa=E|AT`u3`1pp#z*9O`mhfB~f{i_tYFlj0?t_cxiyXJz=t&3YzCY*O4cOh$^Ya z#GQ^!5m&3gj!A=ox-6rOa8YE!MjQDZnjFSUz2bl{M=hm5TsDMS`8*>`We0V0J-~|U zz!+mjf$cL6gXvzF<*?YzCNc}KZFie8>z3x&j3*i-JJhLJR*oKfgc#1Ec!9Jsi@Cfm zK^!8Ge99@8TV$SOt^+4CLaP=@Aa-1i-CvMEWZMFX2J^@{-N%XG}aF>p?$3 z9toE%#H5T5D4JG!w(7{47jMapx$Gd}=t7%^voRcLQ79^?wmc zpzxV0ZC^~bG4S8LA9Vk@mi`x^^efS-1*C5_M?P`#}ikR68}3TCgRJWot~SL zbd!IP#5|bvPOGbB=RwEHruFQ7Z-6iXz@M*=Z-U*Enc)=5dv$Hi)}-gT{_gnd0>@9N zt2!@822ECWXzqrL6 z2R)^d$%}s=FJ<)<*+A#ZfI>8G{;wDz3Ac3>O`q(j7shAW7X+ea8|<($GDPDYraB`j zBEMbdrW6S-L~}|EbD9jNM;^4ZcX`fpis!q@CM3k=v+U1m6X@6F5g*WD)!*=&cWwzF zx5{gT%SRlKbi$-era>{B8FF?f-eqmGuq8Z5^G68UAsI5*;M~ zIY19D@@dwr3FQI+(hh55MDFrecOsy@|89rYev6ww&VJxYE9o${9IT}>A$GB24 zm2RFXYChQkvoAB~gB+RmP0%e)@x*#M8X*MUd#LKDL9et4F`b0^^G?Lk^bEk|-D-EB zzq>v-cetvv>vJMBe**K@lPFR&SgZN^pSNG%|F^{kKebx$>&Ab7q`$8I#*Eh1Mo`~D z*g@ab*g@IW)YQuOza7Gfm5iMvY>dne^_^@TBy3D<|M8rvRdj5zM38w5Yr9+45=Lw` z+dw7xzKzOscr^tNS)1<-MMq};$Ocvv?F0Ve?Y^e1~6ag4JdCYE;> z+!G_1Sr11dDG?6?^EA2ac0As6oSpi3UioV3a081)65p?guw=+mwbvPbg&=>zk71A= zjSDyY@vLVrG(24guFvSN^+fN#k*30s+6NBVzvHE+A+G>!a8*WL-bQ6tLGmu*DmBw` z$tD$JoEdWE@!fPHQ*?9=D@19Lr+q%Iq*kryr)zarU;8^xiEXFs7Z5#tx@$1@aAB$g zk7|NTs9tyA5;tQ{IbKicvDRWaJu9XuBn8Gp61828x!6G*GXm2WZ7c@^bF%U!skZL-!YQ~nD!iD6=-kP6r$~j z*<{$NevlGFx|>R?S4-vhaO)mYA?yEM?%yj^aqr!e5h6ALIuhG?BFeNz}@&wy(eO`Wc6#H#DYY8$_-M~1X5mB+ul+_1U32>iMii)F=L&V zEY(Wyy8MZ=sO&N2YJMxcMNqv%qU*>l1nWV(GLdPZo0wR?{jM|0cmsh>D)8HP(51>R zzC9b!zPPbCJl_DD#{@a7vF?y3I%gVoZN=5$5keFdmLhpbzB1hVj9LbP_B+VRhZ5g4 zXKp7m-U7XF9{r3ke$Don>Z7RquUZGM=txH8A+u-NMH%MceEWx66k$a3^ zIV{VqA3<(A8LQRWvKBg7Wzru&#;y&Kskw$m<`t2NE6EHbx4_X#09sK~LM2IhVWxQ6 z1c?g@gY=WwFe5@H3()77ykKy{f^lZFA>;Ia&Yv;z9MF7mxn|t-kaD|6D_r*A$Tika=W6 zpo8>xT!rH#)J2gMfE2>?2=(LT$>n~&0&&`=T2yebrzBi z!zCI)P?Q4Tu)(%0&U|jrl&2ZS&e@+C4^An=9&~D|qdM9;X`ftmhaxx>;UF%DCt(eV z$?TTbZ=0N)bIug|A@a1*P>mgn#VYiv(i%6qu5VH zJ+7__KV%6?WuP&P1xgTv(lv}Zc;XxVO=vNAXF8CGNEFnjw_b~xI;nqY72}7>CyvOa z64eU|@~x7-a2Ilt{s;!?(!?>KRvx92Fhgt}B+(<}s9UAm>V$IGN=J!d3}kIi=~oA9 zbAqNFr>ef(`xttRRweu_dx|%qrfy%$4l=p%g1lf*WZ=41`g3vXd{%kYQPs<=!HccC z7`h;lcjmVcT;{@HBdY8Q{6#ziLWxBIu4rN+4IFmR*WVdV3%{L{w@wOFDA4E1Lyc%W z=G8zx3*>ZI#xMFXD$rS1vzVWea%RmqLrrbpkQcJJ51fx`$T-FAPdO@tJxk`S>rF_{ZZAY~ZiC_42=h5&qrp z@NeeUzu@RU?BV}0w~~{zlot7sM?a;cgrwpox)l+Si;DQWcAH}$L75}yfuZ+}vB{d! z8Dukl87Up^Uk^diJ^4k!`F!I`+FxT9C9ej)n951q;_3Zdb9DK$a)rkSv?)vwOgxg% z7GX&dWk?u&mL^RQN&%o4n3PIOp&yKMGg>G0or0f~v1S;GlwH$1(PgkUT&lIgx-99j zo|m4DP+F*_* zelO8kq-m^jG_0PG8U3S+(J~u1E)uqHA6(uFjpOk&Oh4y^CX_nroH{Fpg{E~~u$Exx zICxZnn&x{KQ%d{fvc?EmfC<5*Zh~%sGKSCb5J-Q|nlC>?rl{qz={$HxV?dkDBvvhw zkX>`L#>TCCg}sQbh!t~{5@oD(U-oE(WWsmKq9Y2Kji`*#N>2!AiHb~1v=bBMyOeAr zJNL#I9E$(|4GyJaPQ_U^TwO6l4EP*AR3qXls>orFHBIbmNu6P>uT!e9+!{@{z_gm3 z=9tRI7e^1L;x#SFgsd?g-fz}NXD2AFeaw;+63XU4{4wwcXk01>4kTtjx;(H$G#>?&Vq9IxO#59mE(&X&B`6~qlMPwWgppy?Kf4tek+zMmvQHi8Og zLM4olJzc&=YTVQ`CT_KG@Srg?4il6E;^n}X;6xU`>=#hH9x39KJg6ACrkfzA=tr_2 zo8%Q!8BCP!vBoCl|M%8ky~h8IRR0M~ zmH(O`=sZ&S6eRe0-@ijrT0pIi4O5kgql~WtiJ|9gkxFSuvogpCd?wGZ7w!l0_2C^p zS!+QJGzGla&0PAdY&DMieBL}@`C+V@-|sq*h1iQMs>mQ^)R=eFoQ9M{l~k2T$S9dh z@0S2g_R#<{L63`+8@+`Q#E;uBG#vx0(PvSJlPpvEC!|11 zjyDdeZ^lpASOC;REAw6p;cobxRR56da{b;rrnfE`PJVUcpdmjH`CZKhS$u_3ZGb+^ zz|wYmPu~oOj`=2Z9SRy}IO1L#*b#c9AtxeCpT{u*_n|7-is;x3zggcYroESZB5oU; zGM-4aXxZx8&CDkC${wlvgoz<`gY$ZbI*qO#{Q@p@cfNGND;_6Ge8a?!NXA<3|REi7XAZ(8MelCF+%#B^oB$zFA^K zbw}jE)gL%CeRLb=$*txL%I&23o|^mtf7oXnTj}BnVoyL3l%gT$9QZ*Oq)(-o~s#vjQa3&_ul#PsQ>z%EcL9F?Vmt z5y#f-@$kRZMAzxA%ZRPS@Sgay6o&?JPLryQFpR?N*Gbm$X7rovFQj!jtl^pTH6e2U7t;Fo zn4JIHGVMRd@RtBVgbqqzB3$G=jZGc+ZA4|?KfKclfsLAKL9xaTgF^ej#JXGBxEX9$l0a5 zQT@2eRPgefDyIthBjTTw{ULB3g@xPIFjEHE@W)rv;V#;57%0cn#awVY_eYW*QM16 z!7F8BC_hX&iPmbo1}MstilU0CSK|VO))&S#Yw0REc)Z(|SQdFo#`F({5k6y4kGOni zg=KGNOz_Qa*Gd;#9Qw+{NY+)2bC%TO`0c$I9qth(rpJ=%L>eKp2A1AuKTG#-LLl=N zjhLzCKn1qlTE#KvjGGXq~@lNvWWG`t2Lu>;}NJ0S`StiL>MM72~Fm2BTc1- z8Tbc$ww_nQ>^aQ&FkKehE&ted)>*EV9oHfal_+(p@axYGu~zZNjW(GZpGy*r0dXYT zb>ORr0x*Ns=_M<2H}s4d57v>*7HRa;;{EL*|8Ye5){o{V`(3?7tndILxMk-FVS z36Z+}NAuFMH+QU&x}!%fk-C$6aMBw??d*)6%y~@=9@Ky)#>?}_jqW{EfE$ws2EdKk z1HrB(W!fvHJ!bedWvypVl?-3saV18FqxXmnEcn~PHVpuQsU>3=7kUD$I(GT{H6awPbyvpCM%>a7>o-p3t!)t~K zciou?geTM9vuxxz3U{`!UR;!UHZ}liJo91EMO4Vg3uNkS~3b z%=tAtaR{-9*_5`RcaEmrUUkk#M#@U(_pd`?rNg)AHQ3uqPZ1%P@-2B8lEZg6R55wGR%O~ zoe=!69lTvGHw9#kb7Hh~Qb8@EGO-+L=1s8K%0#W^84{Bg%(_^2#X8?K>hfe}hT6^F z=(-q0uEUdzv<^e1_L*9iR5)TUa>6*#oR=J%@9W+)1bauNLY)d<+dFqsj&X~U&6usO zIFAjX!3=glVn-$b!%(}5lo+xO?yRniY85a2#6T0QDXzCsaTzpioX)9SUR=2|KDPX& zEj{{R>3dF~@X;JwSS4FX^!y1W1LuRoVi%aj)LPkNWu@~wpgExl@PhaAT~l>ecH_^A z@>w?qs&{N7-xA7*R#*Pc=u<>Q)s7X_3`hCSsdQ(6UFj3LsIvF>O@(V69C-(X&Z3>y zr+^6jn?(HW_6Vev@W9?FET&<4g70zG`|5o z<+p_4&E&U?Vg4&Qw9lU82tVc*gpaZvzO^doDJVj5e{=mg3LdH##$rJXU8Mu&HbRKM`Ee338?FdMd)ds5C{=h*ngl3At2i ze$eDIb-HI16Nw*Q;qa*G&lYq|-)WBzttW95k{_ekz&ah%mYTAv8O<+h`yLOHJFk$2 zJl#)cC~#__;g#z4py8%vZ6+o26__2h=FMK0Ck{6+uAkVmXeLF@v|aMu1H~zNbAY-A zTk*cRNYFnZ^@}A0;m11#^r}<^eQFf3o9)ZALU4_w$sjuov3Wl4j~BsGUo5pI?w>|w z`bDRC=}Wm!gufUTOJhN4xnjbJg{~1q$8(hRik(Uo#!V~vKvbT%P4hX~rAHdE@J;;w ziNQRB;(b_^v$tTD;>MF#;8ZE`I#w_84wba1t`oYtpEKsHC)xx>GMt8Pc)yQp^&^k+ zOI#+2zj%YiR+^INnq*eibC0#erexnQYvMIOQY@u!75qcP<;=5vZc(MYHOkhDw3qfZ zV_Q9{u@dk5TzqEEK`lwOjA&t8oj-@yL49YNC1oYOi8qWg3$NOQczd-$>180HLvQ~@ zC*X?kg`Km^;~@W%{&Di6d@jT(VZrQv``KmbK1>(Q_e#ebq0a3cgKgaBma2c5)}f51 zE5g<5ktbMp$`^iuzQJklEIo#^E_DD5!(#r(lp&&nig$4Cw@!WNdHQIZ0tVSK4eMcX0}4wH}R!AG2- zA;hN>xeo7G?$B2=TX|WEKTzO4fPq<9LcPI?K{bySHGh1EI|p-~nv&=OyVFwt@jHa> z@}4}$UAB8x{f|)c^oDY`1_|dmS~{WwI!5(gEpTGUkbh{1_*Jjq1~49;C6zuFEj@iU z_ue4@w>f9$C_+BlKS6-WMdf#-CayKLzDzY|F}M~qv;YTKK3v;%uU{Z4FRF|S#* z>#!%Z&g4;K6_CX<{7kLV%ku68?JH%Q!*NjrRNOj2tUx0h@*`#?tz}E>!I{=0XE}FI z>V)BYD=^(Ijm^@5jwf=!?<8k2DrYxI9gw43M=fcvru1f^8EncDYaw=~d=2q<(yZ?! zOuuR_LP(9)MO!W1YTI$f;wk70T*;n2qF=Til7tHuMS)Rh073 zkeDiFi#j&5^iI_PvSNK8a%+fUOF-Pv0G@q+QdCs@KRyIE4l9SmaDN-h`Xy*>q&dCK#P1mZ4@@h6tlDK%-9C3_31FT5$g1!d_6mFzosnAKffs?SdJ zm*=}{%YM33*%GL6SEsCba<#m`YH;T^KS*nOCBoj;g^T&oMPRK86JJ^wn!zl2NO7X^ z4dW+0v^b_lG_q`Y#BGQ_IElDJZVD&t4{~8wXk(;jx?#^!ceU(=bkSQJCZ=s;R zedGMETvyirTyFiZAtQ-|t+R=(v!cmgvf#hhS{Z5{-l%H0pA*t?88j#aFi@NnH1Q$h z0*O-5$R)$I@iy%KB=Y7J9A~m|Ic?mdXEb8-c$O756=J+OUv3^!D#{eb0lBpI-)uS> zHZ(8Wnp8h;b}z@rWXam$=fW;9Fny}mbp$49&tcz7p7!Z+RJCF1KDh+*oB zdA@Ss=L?WyT7L)Fe|wC0LS5~g43%Rpe@$5uXuR>q&*~<`$Gh7ma z2CAyF21R(bdo|#D^e+=|fUh%dY&p~8n0vQ@gw&XO%Q)sl>ZK=sGY_D1Ca7`D6?&nB zv}&>tgTg$T_Zq1 zd6?T7Ne*8&c|oGhm}g?qqAx-VM4IhWiJj$yhg$%;2}y;1JZWvGuRKUDSOIe3ApY)= zVI9zYhNma6qRMd40da$+B~77NCMJ7-;EV!uv9 zhP|gPDHR!nxVExdXlQ_korxK9I!@R@QhS`@^!6Axf{)@-oRWq~Q&83>)+NDb^;hnh zdr6_#c=3QG{CL8WHKDVSFlo;(U5FYkRVQnwFeA_9vYe8*hz99NeLl@)y?i!VoeNHBS*JFb>#)ti{A;+s@Tuz#ij z+nEUm60cu&3A1J^ATtgz$jIw=qNlr*SKM0!qOBs2Z=fnmEUCP^FulIsmVn=0REI$Z zXBhJBq}rA_y5F`!?u@n*KN1oaL_Z`c@3w?$v)2_wweoo?46@tyG_=$@QI%=7Epu&! z$UR+rx{41fy0&o?H_17FPuu-j6Lno2)Wpz!fUHmos&j!CX-n$4+3m(Tc7v+UzJ$MN zE8&B%nRKOUT{K7U88ENpPCz{imvpxcf$STGFY(0ayVEO2`UcB?ICTQW&CpD_vP!>= z@kE;7CxIr>jC@L>9a@3x8?5(w^&M(*r^$J(hAX^=YV|ie8|;0J@^H(HwWtN_{r-Hs z2O7IZKc+GqX$DMOe5#>^mxp}M<&_r{m22%XesN%+DHeo_E9)LC>9Fxf*r^7^C&~7t z^cDS+l}B>Q6J(lBY`%61!k8qI_DHp2WI9Q=@&S@J zn9sy3s*hfSoKV|{d3{n7s==CU+iJVc7L>(Yk6l{_((>2XI=bf_l=&S8Uakr;v3{}D z-2+{|Z5X}lmwPgOq;r{gj~*t8Ds+>QbVE293f+?;m9zbfiAvr@DGZZi;cJA1+pa%G zmi%TUCZ|m@*_X}vzH7nVc*aCF<_mrM+K)avQF}=!P^3v|P4?S@tsL4p(FJuu4K&UQ zKFZ;E+jPF?n!=*Pq> zvNq)pBi)o%?nNFnO6Q1tqb2HI9;!9AbZII~67Vo|U-sZq$*5-05H#!Pa23gmaJoa~ z%;P2OwIQy;6U(9Z@%epO2l?e5bXuOBN%dwJs&=hQK1q(vW4nb{Cqf6(6v9~67!T@2 zXmB$2GTO$(Yz-79qO6s%++IA_>Z>D6jpaF-4&9L*1igywV~7pC)Vx=Q znICitIwoLk?PXdz7xD<_5sP^5ATpVGes5M&f$WB?J~{$=Jc%>-4bBJYt(;Ezx)V4h z0A{fhBXK^{iK-swxgE>$q6E15T2SC|{}tw~MwfI@zd6)Z^VD3p4}uM8r(xtCvQ^Z3 z0NWqgmmQ0AsS!c3LyA%^E|_9G5gD;V$|q66+8S5X42{-nqfz1o^WWY)~MquZK;BaU$fKStf6Z?q-8B)FBzNy3rSzQdN)#IJlU7LHr1=>d{9hD<%yb}qA+~Mce|m{) zW;+CjBU0#VrjJh$&nf)5`=}(JuEqznP2_H)V(*43Y`Va^6fxwTvZT8AaSxu2lZI?% z{mk;qH2eg{e#UTs`a~9d8$H_5>t^~;0Z9EmW1Xpr#5FBfT`GS&677jrL6$5@lkpt~ zt4|lP8YT?3lw&7nH2%pGK{Y#v7%;{YgXLT=^&9J zVDkVQxH_Rf(FjQX-dykR5#*!+WE1erLSE1aEJ!~65!7po?%hY{KitDo4-J=0&62BS z-eZ`9r3P718HDRNVhGub$(ZruOXc?FwtBzDO!z5bO_9AT?od|OZj7xUQ+|L_hFEh# zpqg=nh~DhIwEJ`gp3kFHQRWX;prC${VtEV=xsC_fkqMas4QYT7RK|hfB7qPsf5E{8_HU}YeFGB1@|5>N_^ z-p{=(3G^%G0U{B6W6A}3v~oK-PL((HSW|bWGdp-yo_a0Xa~r-M(oOO0vWI8ewunLN zm~+S|CIw)_7V62OPydiIXLn~zoLGYdqi$QP;b6e_h@AEsHvZmsKv3i1zl76j&SvLE z*RxvOgOxVn$aWAX|7Qf4j-9f?Q7JWenKV8csbE*w0<}(pnnGR#rU+M30HZ)QRPmQg z_#pRKb|=a^86Nd&8X|cHDP{pvWk1l1Z=vYl@7EI!4`_sc)p|GoQtSQuLixXl`~Tge z@ZZM!35qgut3MEZg!s~fKzq~(0|*?56;ztSv=9})mssW(g9S9(uPm)PcbEU{h~Coc zhU&}V&*q0_v?3-ccKj2XlEHqvamM$&x!bGvO|M!*0Iv+KJZC%mSU*F4O-VDwN6@y- zM{wv-P!IV4LUJ@~xL;m$&=8ZMmIIO(DLqVl`2}k%jh~9_3^wQ?PyX39J#x^%cx||n zdcf#Wz3)&=)ctT18SRPb1jflq{OE{%*Q65EvWY#LxNtK zvB~T<;rK!B)5@gWw(EVSW>in&MsRQx6*8)1Cumt*myC%m1!2xCQ_}1yBdVkfDtI#h z^ICeJLYhdmFEyR+Rw&mYAd zH#k~D*Pr@bSid`9#6qc)m>uYxFMc#xwDr{_2g<~As@4H1GmN&3xtynX|A|wrpVRnU zY8@OK|L#k@?^cU7X293+1ImRa|BJO!(+BINX-YGABw2dB4fR)TA1CoL6!|qu9r~A1 z>c1~J{|gW6UkrZ!+UNYesBh4Oa>tpE{W!gkEM&EXva;5QvsvEN!jnh@`d&?wwuIgY z)_G-v61^a;h0PP1+#4sZPJq+miXshP&52A9ZXg61N}J}+IYvfiFbuV941g087xc&Z zE-pBPTz{|oco!*3O#D{!!T0F(uG>-iQg))E67xRCz3GnnrzHNWw+F!Iy^0V(K8n=s zwzo_9{DkoAuF2PV+WYuMG59#R<@uJKZpI%!%71gai}mcTTKTSi^CTznh=T81y4&@J z8Ty5sEUA;vg=-l6%-cM8xf6HYX!@bSUtGSFgGp~sXuh;9@1ldFT)xyEokaLmBZF3P z*O$(3x`X(8ulW0~pHJ81?R0uwWxH^k9~y&t&TlG%XLO@IdVa9NYHhGtZCH0`_m_?{4#WB5L);i;0NC@u6 zr&5+M{DO42MxlrdpY_!oudI#CLbP02%up>(-q^@JOyPfr!=1Q`4Gt zAr-3b7t(;2A@i+12E9pu(Jn3&b9(qijdm38wavP9_{|ej3*Pu0%0YCWpUKEsgjTq8 zv~x{gC#6v#lWGv{_f2z?G4nt;(c+P=X3(NOwR{@pUa3ZBL5=T9#)-%iwwShe3RX2v z7pem_L|6vQnYCo8)e9!O8LF0b%UE^!+yDdS#(8Ox{kFQJVP`QcZ}YiC<6_M!mU!D% z*P8;TA*woFBxa+1nWZ@f%kzR8QFZJAhlm(W5_ncUg8{<~Q+M`LPZy!kQRWm|jZ7I~ z!-X(WY+!v;q`H1$&!-?HVMGORDO_uQ=J|fEDC!)fG>S7wqI3txmm2@#)@&F##p&8) z6a!{SMo4lLEZ2bEpkZ>@sMwE8?eugn#g`^D(A$>@sS111^{;!~I!Q>fz8CMeJ`zym z-w{yGnspMxoQKXZf9=z`iZ~y=Y7lRPqDcOB>!nu`j+VRmd_{(Zi2~H$9JuZ`%QZDL zB{Dp{9?6oLqslvCtK`!pG&-Ws=gEp}RY2Mm#J#uB$_a%!`=dwQIRqTlt})kn7%30j z4njwq*T!033it>?B zai_ykTB*fns4whF_tDAjH4sY}^yv1d%Ihc+nSCG&E{Cm~rt18*m-5!+jPS~r`wx+U{Fi~EngM9T+Ob+l}8$TZ|{!R+wKmw~xhEFLBm)~ur z(Fa+SCCp{`%(9uSbjkIE0SWy&# zpXf?y-Zb0PbJ+3yUf}@{*S}*Dv7Om`{``@7!t~Q*F|b^&#Fnt5{TqNO12OBJ=2bqlqd#&Io?>udKIPHeJv|pYZA41sA);ji zHzA>&*ibt%W&!3%f!0Qgscm)P>M}O$tel`-8nP$xJ&inhtzfKuAiJS{BK!V~b;X|> zmM7YXk83kKs(x534Q_=<0gI|Yobu$UFIEZj_M%ZSQ9#S$yFnrflPuoeR1LBK^MLHH zJBSQlFs3%NigcQk99uwbzU>Oc&>2X883{H zT@=;Qvk{1pD@J?#3$`O73AdX3GFRl%H9b>^pU7%T)tRrRHN?-zrhme>;Nfow7q^A@ znBY$Gt7C}37lUex7vL&4?AkOigW5t7nyr0Dujalf!xUB51gJJgg&lc}P5_adSv zoH>XtvOVo^(rLE;gh^Nc>`O8RaKc;R=UdyY&`r*hLYG+TH@n2P;W~w89V!lf;{-!Y zmBQs0c*YaVQaS{^Gjf_zsnG=N5s7<2I*HPJ3ZWkV#$N)fq>HIydsII+9WVyzJ7<)K z*8AZbRUs$->)>Kf{M|j4SW>HvX~VXk<3mZcFY)Bpo@cJb22B7xUgr8&()>{dG7MhB-!NDELY){Khng)FJpK6}ZTxfhg8 zUPNjfZ2mgW@zH+b$@tu_lc-TeS!y0OzH$^i0M*&gj_qWV+THfV5 zwiRi&RsLb+q*ij8#?oy59ZUreJ880(m6K7{h4}*DKsW}UeE911lQCDDZLBnwDN159 zCHBiQ{3o`wF$Y~J9Z^_Ltn*#T`YvmKyyt=Kq5;g+v9{F{y+i>-B=v7^#Ukvv1ll8Z zft$|DJ=fmlXA&N~B@13p@3pyZ7s`a6_I0HLJ*i?V1C-^?4MVNU3vk-k2Y%a<}<~p^TzJWla-G zhrFP96Hfdn7Lw9GN@c3D19e5n2;c2cmk1gvNW%RMK7nhywvg1A?ukSGCX40S+fj7#G z=NdbOa1(_v9g#wCf{>%O&z8*{F$wtXanx)NT?&+r2za6(7#khFsqid5b`Q?}*l1~- z-wYA>{KL_WC1VaITj}Cbs^aOW+v~e#s1-4BSQm*fnC#Tgr;O9zj2mzrs_>qS%5Cut z1y9VQ>`-9tthfBfxx$=-yBzG*z~0oi6A&f$nLYrJG;iQmBiAIryyl#DoU?(+&yov8 z3S+MrLBEoyWD+n&K~!?fg5NX7H7PK*63X@6*Pl2B1NJ$Y*Pru*6hEk_#(}V~hdi(t znVCUktVfa&;xN2riAL}U?du!_%Pt!u{$s?fy)un+#&C%JxXYN!HsfOOAP$CXw@&oz z?L@p+Q|m-~)S~TViblENhBp|+%f{FmLvBiplE0j%6M2Wr#_m(5Q6XBtXoi-xGChP( z@dUTOs7V_T3#DmX;mNn?q5gyS>7)gJXM_SwS6V0KdOxNGKLm5cAn#CB&7 z#i`xRa7>FS_3zISROZg_SgsK833B(}qoU)x+-|rcKLLkEj1f(1+h31C(PeUW_cN0> zKcTcyG|z2JZM_g(R5ODGryDw-R&P;77tK0d*ZY&>aKqqQaS6B�@v;$9bpl_%m}> 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

f4)&8pa{MTrd^Bdt^+KRphNNz9%3le_j=ZTL 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 z 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/pom.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/pom.xml new file mode 100644 index 0000000000..3b6ce40ce1 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/pom.xml @@ -0,0 +1,148 @@ + + + + 4.0.0 + + actionbarsherlock + ActionBarSherlock + apklib + + + com.actionbarsherlock + parent + 4.2.0 + ../pom.xml + + + + + com.google.android + android + provided + + + com.google.android + support-v4 + + + + junit + junit + test + + + + + src + test + + + + com.jayway.maven.plugins.android.generation2 + android-maven-plugin + true + + ignored + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + true + + + + + com.google.code.maven-replacer-plugin + maven-replacer-plugin + 1.4.0 + + + process-sources + + replace + + + + + false + target/generated-sources/r/com/actionbarsherlock/R.java + target/generated-sources/r/com/actionbarsherlock/R.java + false + static final int + static int + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + + ../checkstyle.xml + + + + verify + + checkstyle + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 1.7 + + + package + + attach-artifact + + + + + jar + ${project.build.directory}/${project.build.finalName}.jar + + + + + + + + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + com.google.code.maven-replacer-plugin + maven-replacer-plugin + [1.4.0,) + + replace + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/project.properties b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/project.properties new file mode 100644 index 0000000000..f28bc833e1 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/project.properties @@ -0,0 +1,12 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system use, +# "ant.properties", and override values to adapt the script to your +# project structure. + +android.library=true +# Project target. +target=android-15 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_dark.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_dark.xml new file mode 100644 index 0000000000..ea7459aaf5 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_dark.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_light.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_light.xml new file mode 100644 index 0000000000..0edb33b4be --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/color/abs__primary_text_disable_only_holo_light.xml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_dark.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_dark.xml new file mode 100644 index 0000000000..2bcfd0b630 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_dark.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_light.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_light.xml new file mode 100644 index 0000000000..198384fede --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/color/abs__primary_text_holo_light.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_solid_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..769463b369a5185ba2d2fdf26abf058086ebcd08 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^S!aZFaLn02py|Iz^fCC51!MDwC ze!c%VXGhEQ)_dJsezHtpNMD|7Dac@a*_ZJyulFV2w{5C|YCbaz5)ZX-3ak0tIJ#lm tp_aeGY*)k&iW*FhzahTiJD1r}=BlLiI{(TJ=>e@^@O1TaS?83{1OUpzopr0A6)2vH$=8 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_solid_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..73050476e77aa798919b829a5566973e231f9d49 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^S!aZFaLn02py|Iz^fCC51!MFRR zxpqaJ>-4UOe6iPKwm$=BLD{Wo!i)yScSSDT-Jo*!N?wFe;-MB!VKtu_20%tEPqwzt q4f{lgTEQ5`;-9UxjMeKCf^DQ_uhd?;-Btm#g2B_(&t;ucLK6V6dokDm literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_transparent_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..712a551ece87b2544433ac982382a087e7f1731d GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^S{5)M8Ln02py}Xf^L4oIp!}}xu zHrx6hVG;aws8xB@i!KMDZA_cCWy>wsRQS4KRST!En$HY_#6vK~{lt8cLjun}a%VT6 c)z9eScC>M27UGHi05qAw)78&qol`;+0QSr+Bme*a literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_bottom_transparent_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3b9438b16543294498ba27e51d4e878c8ead5a GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^Sd_7$pLn02py}Xh4fCCS+;oB*H z(}QQZt5vXQMa=PTZk@YrXXvE3+ofW5$)(cU#3WF_jrSY!c@8l>`*HAE!gKCvr?`99 W=bm|#aNiDSFoUP7pUXO@geCw#94y)Z literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_share_pack_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..81b87b86c959a98c478177270c979763831ebf66 GIT binary patch literal 2863 zcmV+~3()k5P)Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RX1_J~u5ib;3{Qv*}VM#T66ediVupfmDUrE(ZH~?NY`rps5=6CW55L#63MUDUf N002ovPDHLkV1kHdRS^IH literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_share_pack_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc83e22efde5509c563c97a836d869d05ff5dc6 GIT binary patch literal 2859 zcmV+`3)J+9P)Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RX1_J~v33EADYybcNT}ebi zR9M69*TD^dAP@k-!&n%l+Zk4%XvhVkGhZ~Uxd#&QUQ2!+fJ~*cUX%Afu1<@6;N?-b zAHA(QN@2o;2@{qW)>aKGMk!2~FkwFmdvZ&v0l;_k{`cFg{ZH922Xd1D?Op%?002ov JPDHLkV1neRPs;!R literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_solid_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..cbbaec588ec98bbc8a518a9ab5a9c469482341ba GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SB0XIkLn02py}Xe3KmgB?fcJu8 z^Zp*+-L#E6MBZg;W9F9wttxZ4PHc?!oG~+pYe(tbxxSpjYCbaz5)ZY&8G8*Bq7ylO npZ&2~Yqrog$!|3Wm+fFU5UE)t_U_Fapd}2Ru6{1-oD!M-^V;Vpy{TG>rs2jRbt|WpWjh#Ji#?9Gi^wblTEgJz>gTe~DWM4fZg4bX literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_transparent_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1e39572224b24a81ed4d73923280ba2724dbaf6e GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^Sf;?RuLn02py|Iy(L4oIp!})_Q zZ}wlfoYKNk`|wbZR*CB+2cd0Do4#G+S+1#YsD)El&1Z%|BAjt`!_S2)TNKYc{m-!5 f_v_(jT(cfAPEEXE)c4^Y$T|j3S3j3^P6 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_stacked_transparent_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a16db853e94af78c0739d9b89b578e2a8021c856 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^Sd^}woLn02py|j?`fP(zopr08IHUH2?qr literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_transparent_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0eff695d82911a73874d871f3a7b23b71dd8ab44 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^Sl001;Ln02py?l}LfC5j;!{`N< zEvnsL$t-6rWU%$psDGg1|4DLDj`q~RzPqNgR|nl=*Rt6dx_ol~p-I||JQ4;82O1ce y*`SQyBHQ|!3>bf({j~je;Zla%ZD->HG+$+yO5M3zoXrBXjlt8^&t;ucLK6T4R5w)s literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_transparent_light_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ab_transparent_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..219b170fa67aa2ef8e0b11ebff90c1629ba7e97a GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SB0OCjLn02py?l|AL4l*?;q8?- zrB_<6lUu~-<@8GYocm9fskyGHQx2!G9uAwU_k&&MlS%_4GaHYDLBatTBRp}nY76HL mkjg^D5fnx&0glSHJj>3%>1Jqp^q#PeS;bnL@oAJ;NJ=s*Cb_P#ZKbLh* G2~7YBfgFPX literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__btn_cab_done_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..66adffed632f0f6267afe6dc2f518adb6a83ca4a GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Qo!3HFq_#{<Lb literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_bottom_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1d836f65a1fffea301e9cf36770b21b48b3b8132 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SVmw_OLn02py|R(B!9jra;>r_8 z?%b*io|Yn;UGT9};ZTu}!9}%xc^%IgtXD4oJ@0X-F7B%4f|j+c$=0hv54CU#tNF|@ sNQ5wMgi8eI0r?xYZ}@0_Yf6jsMX$B_pXOhT0oudh>FVdQ&MBb@0DzD;x&QzG literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_bottom_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5818666d4e64b93da73bc3d6dc2764bcb500359c GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SB0OCjLn02py|R(>fCCT9!M7)Q zv literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_top_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..564fb34b4308750b6922f320e9e114b080ecd538 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SqC8z3Ln02py}XdO!9jra;!2L@ z<=I|~`ucZlc5hPnsi>TGwM)Is^N?0TPy5{UQpwgqqAoKG5)ZX-3ak0R7;B{1mWZ}( p*lxaUe)ue*Z}vC-G%ee~_}P|!&DqTD7lF1gc)I$ztaD0e0st(KG%NrB literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__cab_background_top_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ae21b760fb1ebecac3389164251b0fa14f580f5a GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^Y9P$P1|(P5zFY^SqC8z3Ln02py>gKAfB^?4dC zy{Qwe+I<(;Zrk3}qFy7o$Hqotreyxi(D>i`gF-*@tj&^T;Xws!Omj@dZ?l#4Y_?*} ivA^-x{8q}NM@;fbHo20HF^oW47(8A5T-G@yGywny6)bE3 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__dialog_full_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..79e56f522b2837bd9f579b28f037ad5eafaaee8e GIT binary patch literal 1414 zcmV;11$p|3P)cSnqT^=WQ7*OFqW%ysfqGq3fLYCng$eebY1E zq0h)!qMt>^T{!1KLrdv5=!(bMwnfb7mMF4BgVA@!3k##^X|etG%o8VLfn)&kp1$5* zAHx|3EF9@?)w)=}!OothSF(h}LSVs2n}u~V8rR2gA&m?6GFm9LT5i!5ovh2$`aOLf zDMwpCv(UIN+s(qhT71rU;E=VYR%2(wIy9)U9BqNMU?EvKj~0!zxmxOREjkZzh+iq_n}2*GaEP(@ILD!5 zWBguqUH^M`clY;tz5a@wsI&tR0g7j89WEv$&WS`s3jmAj>+65+@9$R+4-crSDsl+t zoXD~ai^by4tE;Qe>-G9CHN@f2j4rXz#$jzQA^^+B$H$Mix3`1-5a+ZsO@p#5Q53}= z0G4QnFC7vyL_!;@%<@Jv>_k)mSUx>Hz18n=PE3d}%kYsC@*I)N0NNv^lI%s;wg9j! z%knLLgEIoQ+bysY63^&#(^_eOc(NT6QxTdoZI(#S<~ro`ne!tS(gH7T&zUX-UZRk7 zy|5!F77`FowzZg?X(M)KAw}<4SRP51e8qZ>m)V;$Z3?tS#CiaZ^hhEi?U_=yRh(%c zcGk9kwMUBGYjYt@pHyCSltyExNUHHFevMy@-l#r~QEjQ;(4?Q~r4samHh{FF{bU7StYxgeBAZQ`6E7N`VLYGS_ z;oj>aHT`D+d1$*FJhVBd!G+`uf(ywR1Q(Js2reXN5G)~C&xiARXWFDHmGF81Z6U>K z;#g%)oXa8RP+ENtZO$MZBP0)Pm&4Jv?h_KbHF>VdnKo?a-t;CVB(9^gh389`0#_~3 z>r7%ovdX{d8amFjk%uF>Vp~*9sp-GKg_vAO(?{&AZLdjA|Mdo3?oA8H>)1>mc|==# zB~EQxV&cD40$n%8&w#s-rjOWJ+ddiIQXYxR!^y#)tE&3)24CJ80l~J_MCXPu>Ml3AI+9BHcJ4%0r(Kw z@2dYHj4#nGKH!fqjRVUuh**Aw_CvMrs{b>Lm!YwzO4di>6N@*}Phg5Tw&B1fy2S@v zNaMh=r`Sx3>1SxA8q+hl==5I;NtblfC(XkF^KkH7ZKuDGcq0~@mC!ryi=K7WXgde? zOwz>rq{P&!A!(hIr~D!&pe-W#G7`?LQYh|`P7hzs(O!weT#2|xih3m$l64(P7wFd8 z$(YnkvI-Blh{l8EAha{kf+|%%mTX6hk;YCcRo{6`6g>|oKBz>Tb24JLyVyI4p!izS z!8wv9b%$RIiIZ@y?B&nGjRPyvaF~-xlb-U|=!P~^8?n&FNw@wIvQA!p;xDy1AK0dR zu~CaAl^btMM>A?9->NQ&|AnVmzdt!!WF>xutSl`;$84s2a_=ari#ecl- zo|KSyJXTD=1$2JI1Ql!6el7Y8-dCZ-i%gs^mMBu<;eLzP8a;YIXA&Hxi>7JtAFa#2 UvCQ(L;{X5v07*qoM6N<$g1g$KMgRZ+ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__dialog_full_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__dialog_full_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e029f210b9a81ed4765d31e90b6e49dc8aa37bed GIT binary patch literal 1537 zcmV+c2LAbpP)P*hY@RCILOyI+)4*Y%ioMH6eaT8-v42qXrI z0|4iGEk=d4Xm52^#H?WUz%bBygG}I|;L!cJM*+u%I9T*&&%x@0sx#0Qk0mTmeRX1h$MIxNMY&% zsz{Hz01C^N@8p~dFgXbIRub%{CUOKKzAQ3rfl0r3M&j^DZL~BnC0R+zNTfH*0>l>% z6xe!^4oO*vg0sbY%(i4Znw@-;nUbs&1zN~PIe02zy)Qcz&8uA?+OU=`?e2Zs5}uJN0M*6C#a{)YX?>^k&iO8v%U{pV&i+9YXUL@sAe1fQs10%V6ikBo z^7Qod_s{$xhgN}Tci-i5`3pX{;N4;1Au(Bm7x@)z#1I9LmdL~RrF4uC5rsHs>tE+w zbjvJ)LKv+{MYbuBrU=TBLj=6Xm=@t7;baF+QjNr0K02$09MPPz_Q^dZ5CLh8#Oov4 z0!TsP8|Jz<^->fRi@r;w5OrSCkw6L?N(J|#V;?nA78HxV{Q97DD=gWeOHxKs4U)p3 zSoD>;waz;geHn?ahed6Tq%7rduPgn zV$nDE$&ajtWS5-`4=n>hvFJNE&bxxNGnt2!k)T-g9UO0!_0BFb6cm%bLuC>qYeBK* zyN@VHxuTkNE#cFa@PaJz!! z*)p0eo;YjAyoc}Lcn`@)ql2XA#Le!l%y)3C`#|D`qk*LC#Leoh&{v9irz@IDt(4j|E-ey3YJCdAoj z17Q35`nvale)TKB+I=4%AAxk%w!OMGAf++t+Mb@Cemp-vW4j&J%V|A%#TR&cd&9%S z1Mctdf1tZ-6W>Id5JKwGXhvG!+}wOSKR^Gos;Zyq!S}5X*>+05G4|7V9G{hQ?!VjH z+iw8YkTX)YMrymYx~{`?w$U_yh$q-O1#m*zu<(hQDx}lJ70s)V5Io{ZN7v2rMwVC7 zhTm_2@1*&pTK&uP8_~o&lye*5+om^+1{h zqafFH?O0X{OUO1M^YAPb=F`bd6<0LB=s!LE=ilN39Gach?DYt$CL6UhXTc;$2zpT2dqqQrIZWT*_yH->_|IcgE|Y&S_AJ4lX{3 zlIkT6RWeyS^JtZ1q^3@yK=Cm?J&*-y*C;dpYgTSF&bztX%>V7a(kL+ra#JUT-|=or zs-McUNbE?uO3e#!@v#wf-Fu%ryG^`~69lNs`%MmnTRbrM$471B$+eE{K4hK$mCQ9h-Z$E`tJc<=E)8`p?U8s&`700000NkvXXu0mjfb2aWW literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..897a1c11a06923f0ee630a3ec44b40118c1fa4d3 GIT binary patch literal 602 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1rX+877l!}s{b%+Ad7K3vkswhI zFm^kcZ3hx8D{xE)(qO#|6+TOsF)%PDdAc};Se)*?;+-wxD8l++z18QgepiI9o*=R4AA9|r|3}>uTm;M6YILUxmVi!uBjgaN)~;(wEWpmNk!cW z(d%Z<{E>P~YK!lT=8FgRsYuTJwQ$0$u+I~@?rdLb^6_f+5jpHV#tRQqPS1ijb30F2_W#pYUFO#_XV=?h zOHP?#2^DqDa literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_light.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_ab_back_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..0c89f71407e8d51f92ff6a10b1ae40ec902aa04e GIT binary patch literal 546 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1rX+877l!}s{b%+Ad7K3vkswhI zFm^kcZ3hx8D{xE)(qO#|6+TOsF)%P{dAc};Se%}E<)W9gqsXz3_j5LNPFu1pO1DK} z+N#=yeg8w_ofMzAMJao1SUGXl-8U7Joy@GYEX@zknfd?wSxaLcYqyHhr&soQ-EO{p zw!~UfNcQJK)l+|B(yvWaZRmKvsC8=g<+E=!6%t;!XnxPxBUZuOVKlwt*0FipR-Y02 zmCh$xWIQ?dubRMH%k4r1TjlOEFztJ(`Lu4f+1J+&0<|T}CPeP?x_?Pcpm5>hNwa5M zzkQR1sjpY$)<2WmGuJ)*zvffcmaNUK`~10Vr~dw8eVc_z%*|+OqxE^sCGQ0OTrOO6 z<>J@Zf0Ym33CMeTp!xW+<7NU=B(%1ExnpuV-^$?oQTEn-hjMN&=46?A$U{|X$JUzr zjr;q)=$3Bvc`c`@@Ze;4?7{TSRWGgUnXHd<-`o)9JVUa&78r!8C9V-ADTyViR>?)F zK#IZ0z|c_Fz+BhBFvQT<%Fw{d$P~!6GB7Z{-*6d4LvDUbW?Cg~4NgrK`9KYlARB`7 r(@M${i&7aJQ}UBi6+Ckj(^G>|6H_V+Po~-c6)||a`njxgN@xNAF&x-_ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_cab_done_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d8662e3f0fdae62cdee68c184a30fa9e421dc338 GIT binary patch literal 713 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfizez!?|}o;S3Cn7d>4ZLn02pop#z!+EApeUwz>goe2TrwSq2J zirU3kvaXhOUTIG}?do{Paly7dd_m%&JI?q_-onB2%KO8{j^-Q>wzNlYp6R5&dH;Rm z|KbvtPbZZ7*R_9QUBqkhp({MdL+G`PeiKVkcC&4Y!{nAd6Z!S-oqj3U!mzMkIqyf? zf)_G(nEp@p{`aZ-I!9g5h7aq1927O&FPT&GvG@NuQA5$TGve!iOqW^IxiY{>!{pzO z!{3V<)Sk6$zkBfg;!caFvF0E2Z#WAV9{aHQL)vPusEmizHw=GVH2J}B^#kKc_ZNxM zzDF#RGe0;TaIo&I-m~b0*sP8To$2@Yde+QKc8kg_`XHU5q@;HFk@ug+O{X5aZ~nk~ zjknIKwfM~0Z^b864VUMM@zwGAdYt)v<(Nz4IlImB@8#qJ%zn(A@Z29bd}4MpKn$sTM506307QmPCTFYr(@#O zpZ-(V%YE!?30QE(DXivDMdI0PFM+AKOT1>hnX-6tX;O6(d#2d)iSBZ_kN7m7WzTRr zzEA`h)2bz|5hW>!C8<`)MX5lF!N|bSP}jgh*T6i)(9Fuf$jaCl$hI;t2>JhQGm3`X z{FKbJN)!#IR;K1a1kqq?mJtlpAPKS|I6tkVJh3R1!7(L2DOJHUH!(dmC^a#qvhZZ8 Q4Nwt-r>mdKI;Vst0K3d3fB*mh literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_cab_done_holo_light.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_cab_done_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..ed03f620f8ef9e969d0471ab76329038e25c9f0d GIT binary patch literal 737 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA0wn)(8}a}trX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfizez!?|}o;S3CnFFjoxLn02py%z6(IY8q0$M=`{k_{&Q=;t<2 zt8!*r>&D`|W2$+>pS=eAb}M##+^cbdA4dCLPr0$oL~Mm8Bn#4$+9@L$(#*Pp%fW0&@t4F~+Q4$6OeIrG`|nG22@uVa-C zJ=H0n)NABBE9V2ZrDh$}Ob?>#U7^{{%b z^;_|*S@)*|RLscvyw85$_Y2}8p?L-UY)vO;|NFUQJ(sNEA?BESpVrme#d7mboB7l} z-Tl+e|M{(6F|!lpnSU$jtXi?CXvKcs<;$n_y<4FKOaZDTt`Q|Ei6yC4$wjF^iowXh z&`{UFLf61N#L&#jz{twj7|6CVFbMhoZ8M67-29Zxv`Q2WrdForKm^fXYnBlV)F276 tAviy+q&%@GmBBG3KPgqgGdD3kH7GSPrLyp3str&PgQu&X%Q~loCIB{EJ2wCT literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_disabled.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..d97c342d53690e6d286efbe5f37562747a49b96d GIT binary patch literal 1774 zcmVU8P*7-ZbZ>KLZ*U+lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO56)-X|e7nZL z$iTqBa9P*U#mSX{G{Bl%P*lRez;J+pfx##xwK$o9f#C}S14DXwNkIt%17i#W1A|CX zc0maP17iUL1A|C*NRTrF17iyV0~1e4YDEbH0|SF|enDkXW_m`6f}y3QrGjHhep0GJ zaAk2xYHqQDXI^rCQ9*uDVo7QW0|Nup4h9AW240u^5(W3f%sd4n162kpgNVo|1qcff zJ_s=cNG>fZg9jx8g8+j9g8_pBLjXe}Lp{R+hNBE`7{wV~7)u#fFy3PlV+vxLz;uCG zm^qSpA@ds+OO_6nTdaDlt*rOhEZL^9ePa)2-_4=K(Z%tFGm-NGmm}8}ZcXk5JW@PU zd4+f<@d@)yL(o<5icqT158+-B6_LH7;i6x}CW#w~Uy-Pgl#@Irl`kzV zeL|*8R$ca%T%Wv){2zs_iiJvgN^h0dsuZZ2sQy$tsNSU!s;Q*;LF<6_B%M@UD?LHI zSNcZ`78uqV#TeU~$eS{ozBIdFzSClfs*^S+dw;4dus<{M;#|MXC)T}S9v!D zcV!QCPhBq)ZyO(X-(bH4|NMaZz==UigLj2o41F2S6d@OB6%`R(5i>J(Puzn9wnW{e zu;hl6HK{k#IWjCVGqdJqU(99Cv(K+6*i`tgSi2;vbXD1#3jNBGs$DgVwO(~o>mN4i zHPtkqZIx>)Y(Ls5-Br|mx>vQYvH$Kwn@O`L|D75??eGkZnfg$5<;Xeg_o%+-I&+-3%01W^SH2RkDT>t<8AY({UO#lFTB>(_`g8%^e z{{R4h=>PzAFaQARU;qF*m;eA5Z<1fdMgRZyw(kRs!-6#o(LP%Wr3O<1=S3ZFo9z$bj(u70=3}tI#6DWj&F;Ob99q4>t z7t_JEGi|0s7bcyiT{LI@zd7fguOSTo_Tn%A3;+W_$om&@e+U59{C2xK>{t*000Isi zc-XLE_dt-QB?k*OY(G1$>uu7@#B2;ALf{;yd>Fer3 zxz>Q~gZLw#9*+Wwy1biLp*!&n>VXAqU0c|%HDJZ1jZ6!oDKES7+VWmrg9gjr1HUt9 z$&h=(yP22-u6mx^E9uZ+0pKCX;bJ-&1r%+uT+pDpXT$;nS`cq%Mnv${vs}4kKnFnO zP;ojL1*vOGZSwsAS`q0H5q$MLS1wr~GAT|cBOrBcX}?{*UqB~HsT)hjem%$S zQCYe=d4(eMUA?{!rJtE>6>2uC>s{nMUVQiovq!7(tSuZUVsBCpu612n+{HyeG&{C3 zg%Qx;Ym2+tg`4}D-D9)knmeH3*ac5hx88#8rcKL0fWiC005AajcYxmm08)I=nXx}} QjQ{`u07*qoM6N<$g6k0wDF6Tf literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_normal.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..33ad8d4b891b14d934e470b2222571ea859c77a6 GIT binary patch literal 1945 zcmV;K2WI$*P)U8P*7-ZbZ>KLZ*U+lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO56)-X|e7nZL z$iTqBa9P*U#mSX{G{Bl%P*lRez;J+pfx##xwK$o9f#C}S14DXwNkIt%17i#W1A|CX zc0maP17iUL1A|C*NRTrF17iyV0~1e4YDEbH0|SF|enDkXW_m`6f}y3QrGjHhep0GJ zaAk2xYHqQDXI^rCQ9*uDVo7QW0|Nup4h9AW240u^5(W3f%sd4n162kpgNVo|1qcff zJ_s=cNG>fZg9jx8g8+j9g8_pBLjXe}Lp{R+hNBE`7{wV~7)u#fFy3PlV+vxLz;uCG zm^qSpA@ds+OO_6nTdaDlt*rOhEZL^9ePa)2-_4=K(Z%tFGm-NGmm}8}ZcXk5JW@PU zd4+f<@d@)yL(o<5icqT158+-B6_LH7;i6x}CW#w~Uy-Pgl#@Irl`kzV zeL|*8R$ca%T%Wv){2zs_iiJvgN^h0dsuZZ2sQy$tsNSU!s;Q*;LF<6_B%M@UD?LHI zSNcZ`78uqV#TeU~$eS{ozBIdFzSClfs*^S+dw;4dus<{M;#|MXC)T}S9v!D zcV!QCPhBq)ZyO(X-(bH4|NMaZz==UigLj2o41F2S6d@OB6%`R(5i>J(Puzn9wnW{e zu;hl6HK{k#IWjCVGqdJqU(99Cv(K+6*i`tgSi2;vbXD1#3jNBGs$DgVwO(~o>mN4i zHPtkqZIx>)Y(Ls5-Br|mx>vQYvH$Kwn@O`L|D75??eGkZnfg$5<;Xeg_o%+-I&+-3%01W^SH2RkDT>t<8AY({UO#lFTB>(_`g8%^e z{{R4h=>PzAFaQARU;qF*m;eA5Z<1fdMgRZ<`$>NYxmjX{xd; z@m&{rFo*<6ia-&%?9S}Yj1NoMU6_?!qi=gB^D?>lzI)G{bI*)0`G1E*K~NAB1j^1w z0>tKJZeH2PwwY!w0t6BY3JN+p33SuQLYI(HkdcX#K*!j*7|BwgVB_Kabv%L#JBpC9 z;EQnJ<+1&B?8Szh`#X@?^XlV2b_Y-K5FTsACcc7-srF!J%cFRa5f;nX88so}^!n$z zoaNXjzHYk7GONT$qz7ti^`5C0{0Fct&sMz04AGszwAz7*v3&RHh^`S091pfpv3(b5 z_*4F8KwG3jHT04 zL)Y{;8%;+;M^cIuK77Jo4_dVE!}GH&5hG!l3Z``(DA*|D!7J6TwaW^Q$!{BPvBY1f zfE_QM@bQ{@gcj@j`1~x3tfQh^)q%AjL($PLWE_*Djkj1Kg2074d~6f{Nje^K7u;94 zsJv3$@rsafhDHP55kG-dHIPmFAA9=;s{MWcddV( zJFI2mtpvLr*Csj|Q8r$mAN(8x6+<_AKkZ*4LX3DO{@?b4Jsi2Lc%zUffeHejlb9+rq0PNT9OD z;u|vq-{=}^jSayj%5h_}ZkgGdzKgPOi{A&T+VkZWUN=qCxUcB??b4_oXFbpmY{r8l zAAy7`+*;!URqf8e1DIx-VoXo49%u+2!egDT);TPBON$juHQN2v;6f%oLvg2T=HjTH zV68;SR?~`g%UoVKaQk-bqv^ppmWX8HlM0b+kmj2@1ok$Lvua%nR#_xaD8_}Gdqhyt zw&OGA*(k-%DiJgiJLg#o1Tr!L6T|w0FfHFCBm_osWr=J^mg5%t6~${t-Jw00000NkvXXu0mjfxs7-r literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_search_api_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..3edbd740858acce452a65675b594d87cd85c4cde GIT binary patch literal 1504 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%xRe+5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8nflaTYtD^x(vzwcwbv89=@ zo12R>knQRQ)9aa6T#}fVoC>oy6KF3~uNhvwR?bDKi6!|(A^G_^uoMuGkzbNuoRMFk z;2dnK;G3A7nFr#7q6gwzm(-%nveXo}qWoM1aQIqfVzJ-F(A>z`+0Dqw5#euVHw$9} zR|{85phuLTdQ->=Gku_A^g)RODY3wWfGH5fgeQF<2cCIS^ME;~2$(fE*e!Y)7?=b+ zT^vIyZoLURops1T#P^YM)`G6?uC=+kf7_B4{*@J9^x)duU6<$Tu^imLQtVB+#DuWI zKp&sr#e2ikRF+h_7hGg6C3|* z?e*8ufgcND|MEKid{9C;-~RZ9Bc^sP~EP3ND_zG5Dxwk6j&$wE~4;Qc*`ssan{ zzn`9=dZ&RsirvSfCP;`whUHEmQ}f9$MSB`#rfaa*Eq?H{s4_-JY+eJUGP9%1oq zJCJw4f2WB2si`MZ$~H#$*nP`3S@opI(pSE?i0N0@>$2Vb7oL|#u)gB_!dQ1$La5q` zDeOVQ4#QJ|EiB?JGJhRxA5Ld^&RpYp@TAicHpRs4(vR3C88QC9{5(weR))#4lPN-s z1=7=NbKU$Nr0Hgbao(RTxaH2IZ#(aDrMoH3_0umA{h;I6BI6;^&o0#XM(`ImzsjuT zTnrQ3)U=jJbp=fS?83{ F1OTcH9Pt1E literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_clear_search_api_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..90db01b5bcf1246d6a94e83930cac63c93a6cf83 GIT binary patch literal 1540 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2abc45809c62513224e9d695542cb8dd8e8087b9 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezt=sPZ!6KjC*gdALL|E;9+*q=6m<7 zlueVX_4IZHnJ0qE#_rG0T(kiyWMEjjhCTn?qu5pu`=4q}27?c$C=-xvpo(CHaDZeV Zn6Yoz!5==w*?y}vd$@?2>|OKBsl;8 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_moreoverflow_normal_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..bb6aef1d069a14a7fc1cea9780c919c61679e4fa GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUtXipc%kc@k8uWjUIP~c#3xZ62X z=G4p^oaPsfxfS0Jish)R3f(&WG9yqa14Evg(y_dGGlfCy2iXqR3?>_SEs{VyhV?DH iJ0OaDc|iOR772{!kNsXaOPT8&i0|p@=d#Wzp$Py$I4IEo literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_share_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..6f747c8f065940a8844587c682fb3c9443ad1ca2 GIT binary patch literal 467 zcmV;^0WAKBP)SO)@i{}u0qYYqHziBfu2L*;{L?D;GxhmUqDjP ziMkTn=nm+BxmDP>FsP2fGnnz3AAnfGAiD%ptMDlguG*u-2|uL;kN%Xenfoz6Wm9neQuJ_f08buH`WL4SA>8mzG9{4uwy+$BT^9a|eO3@D0j4;gS>^u3i8D002ov JPDHLkV1mHE(I@}_ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_share_holo_light.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_menu_share_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..682b2fdec4cdcffe042a0eaba5574fcb553c6fab GIT binary patch literal 505 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 AsQ>@~ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__ic_voice_search_api_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..3481c982862cd524654e200187445a774446567f GIT binary patch literal 1833 zcmbVNX;2eq7~YUb1P`!K89?kB6p2E1Hz5g$1PR%s1`Ngo6*2bY*3mT(eCwGjDt30z@ADk&)ul!ycbSpXq2nas~26ecnniH=emg*g*#j@Uj16nB_N zi=DC%Hqg(A)tr+Y(ebG%LzlQPJO*&###LsqLlu9w;l%7DLh{2@p8E^+tOq!T_lW zAkrjQDugA;2orvi3RR;rF{(mPu~6K{@h+@VEmI|-Ny!?GN`oM%Mu|v7GKol|K~;>b z*7RYuHV1{-On9GN3uBkTDuptM`n_1Wio`LBAhQXgsILR`g#<-73JE)?GKxVRX0q7) zdw+ReMT_F3WiD>kkc1U{nP0i(9rjT~DpaX7!gS@^xK)~D5v)#TJVPYB*I4ua$r;2r z1NocdKh4s2#B`uveAD{O=FRZnHfCZ-W;Dvr_J%MMH(iS=vz?dnp7r*Q|0OM8=!_4l zs;ZL3zhAiUWdL6Q-YyURf{oFuq)uPWZD82qEi67Cysi1BvmZvMgw)Irq>e&MQ~pM`Lu=nbBxwasjL&Tsbadl%z!58�PUR2s z;--Gn6L-Y44d%`7eX(hACTrQSaf!p)CX^44OWKiL4CvZ6umi8K5;zZ2#*ykw_khy5-2;-x4w&2R z09{9x#xx})BvjJ}TI2cLeM%Juon}o2C0ni%oPP$#W_j{v7Fn&)Y4-+12-XAz2ixMp zdk-dG3-j7Z^7|(bZX9v*jq7?`Wn~?YeZGM=J3B9(I(X1G#M{BXSmw#wPX}s^Mx$a& zd* zptYy_ughebWX6!_=*!|<*LPvVhwlqoZlfEYtjvv>6wjfX3p_g?JMFdJ!co__^o#We zw=b#O^i`T}%SWdnY zptrVi4hONM1>8N+Q_^*Hw7fWo0bv~uaDGTec^ju?7ft7iw};GWFmT;t zmqkFIFYh$^o^;LBh6ZkJNGZ)@ubCQlP9ArdMLX{p^!g2)d{G45wZD$82#Akx7wY?a zz21Agb)mdb(PM7iyy?!^d2(dCvbWL2&n$1d$2oqkM7b5PX3wkWY%R=ajlH#S8mQ3! ge6yDA3jkPwzzE(HQ|OAY)&8HCR-J`5r{^yG7imhbuK)l5 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_activated_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_activated_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4ea7afa00e2bfe057472ed5a196080fc80ad7383 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEX7WqAsj$Z!;#Vf2?p zbb>IW`N`93fr2)kE{-7*QBRJJkl{&7FVVepxUS$Rt1LT2VAvn7lLLt0oo!v4%( tpjG6n=4tr&fORvYRP%q%M>EqU82;Q9of*be(FHVz!PC{xWt~$(699PnDoy|Z literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_divider_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_divider_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..986ab0b9746301f2dd9401829da09e00995621b3 GIT binary patch literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~qMj~}Asp9}6B-)+^BAxRtXRm= az`@Yw&#rLZUbzUUfWgz%&t;ucLK6T(%Mo}0 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_divider_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_divider_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0279e17a123f8cbb3c7e3a9ce5c5af8e693b6977 GIT binary patch literal 76 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~!k#XUAsp9}6B-)+^LX%RmN2q0 Ycy4A9FVZ~13zTN?boFyt=akR{01+Y(GXMYp literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_focused_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..516f5c7399c853d112a31d1e17c8c7f17180f9bd GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEX7WqAsj$Z!;#Vf2?p zbb>IW`N`93fr5^nE{-7*QpO1)z4*}Q$iB}R!lH3 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_longpressed_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_longpressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4ea7afa00e2bfe057472ed5a196080fc80ad7383 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEX7WqAsj$Z!;#Vf2?p zbb>IW`N`93fr2)kE{-7*QBRJJkl{&7FVVepxUS$Rt1LT2VAvn7lLLt0oo!v4%( tpjG6n=4tr&fORvYRP%q%M>EqU82;Q9of*be(FHVz!PC{xWt~$(699PnDoy|Z literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5654cd69429fd0a3502a05b5f827bffab89cc7e0 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEX7WqAsj$Z!;#Vf2?p zbb>IW`N`93fr5^nE{-7*QD_LZ%D`aoRl?HIGCc%n7=x#)pUXO@geCyJM=ZAh literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5654cd69429fd0a3502a05b5f827bffab89cc7e0 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^+#t-s1|(OmDOUqhEX7WqAsj$Z!;#Vf2?p zbb>IW`N`93fr5^nE{-7*QD_LZ%D`aoRl?HIGCc%n7=x#)pUXO@geCyJM=ZAh literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__list_selector_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f6fd30dcdc9c39c836e509486854f9da03486892 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^;y~=k!3HF){@Qy1DVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?cuyC{kcif|*A4j^95`Gq9-KV8B6o6ra`I!Z80pW;7d5zZGhRBg zm{FnhT6Xzih3ZMUGkfBc^kAT_eS7{3zPQ8d#DAm9s(?cuyC{kcif|*Eb3_81S$-+V)J@yPBVWyvqG&GeYz~KYxJdw0eeyIoHJnOEfn# R{sUUY;OXk;vd$@?2>|r{LWckV literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__menu_dropdown_panel_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4d3d208578c61662986fdc16bd15c69759b48d6a GIT binary patch literal 922 zcmV;L17-Y)P)!ytdud6iMT7O&4bD*mP3eKws)UN7D2k#e z%DbYt@4NEYnkjlINEK7=*RV3zwml#Px9r!q%}Y$QM*NqHEZ-wscn^ zf4p9=Kg#ZZAKY%YZvc!aCbL}F6eGxtBSzy=smEUmc6C{?q1YCQrid~5o$!73+BeU$Ee{DI^Yo4#-o87 zao*xiE9Z<+s}ttlWw19HGlEA1nW09+*~|#}a;CkeJh%bU1g9CP5h0^O2}4Hs%y=Lc z5q!OY8j*^uk~rBBK?ljmh#jL84Ev;rDo>_H#K|6e%Mo=CgLzw$rI$Y4Z-kUy6U47Z zMI2w^tmuV~pH%tJq!^(yWY-hbFl2;G2g)+VPqud2Sicc+jL>MvBTKK;HbN#jlrS<8 zl+;FqdPULzJ~Kh_!?j8>!xs^*nQAm$#290~ue;BBnY1w&wMw4#m(pwEDZd_oY1{Ux z>$>N)H(eWD*FCpw`-IsDKF28-6~1bz!JGs-W6Z&R1n>#KR{&q8us99Q}8ID#(NJr3oa@N-D4Rc$qhA--bT2} z_Wpf@Z`4749}#V+fwWJz^oyZKO1~J&exY-1*Kg?D$hu!fixvAiNfpmG;mo&f5BSEA wlE;@gYed_N;JFm#Y)Zw{1W}kQU9GkF3xsHEK4Myn7XSbN07*qoM6N<$g18=|djJ3c literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__menu_dropdown_panel_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..924a99d173082ba58ca7527822359f228bb14dec GIT binary patch literal 1061 zcmV+=1ls$FP)#d)-&;4-At916hopygyW1WQa|lkCWZ4-q&QLYwjy>%Jd>?UvK6*fy zdt!`Ep~K-gOUxeEG;B7TCA&L&Y`5FR`f3tF5S^VH!lJsKJqkfK0&PN7nPcRS?`4Ev z7V~vPKouy~L@5%v*=&-(hy0cgM*ETwjWz&8F3NVhH7#V4$3+kVgi2lPw-adOTXm|2 z;f`P0rx+seIw-H@dwPaOx@-q(hY$i2BS4u1XM~+%LI5%mN(D;0XOsl63U@~43e6EU z5mrW96C~;L2O}H%p$jmGc5)7LM&^oyAacV=14{s_wp`K^YIpyDFEM02mXk3OSEw-p zdORS~SGTvf|Cjl{`o#71_3u-2KzcK(ZU7La5JAil5&>9olp#5yVJhG_L?OnQ2x7(v zIfg2+Q2z$cZ7gkJK~)>%8)`3CJSNBlBGKwWz;6QnLDPCN+(q9 zAJ*09wM4d_hZLYxWa z2;mvCbu@F-B1H21)loz{?U-+?@nqk8kw`Vm31QkJFg_V%{OMfZr8mlq(-<|uJGVoHpVClAlh&-bsduQ(hI zi(GsU`1tt1hf_X{d`3<68b|S{tXYwd2YXzXl8Izg4y^21 zp<@H92ON{kB3P1HizBE$;EP~xzks74y{^`3Ur7(FmPO0@t2+WXW`VN|Gc9|AJ43ds z=_5ZJGT6$YN8bIa6HYZ^jFIn`&>W#9La9l$?6@3`ET&WsUkjFK0@?|yO)(6`*1l_s~_L1z$~& z@jZM)qqe)$B+Pe}79nG2sji9uR0#8Z){~%#a(p4yPG;@1CipK8G=YCTO^$u*mj`Me f=rGa5Ym5<}3Pv>t$oVA_00000NkvXXu0mjf+qu}} literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_bg_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_bg_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..310c368e7a68479307866c479d1e4eefcf5db311 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^96&6^!3HF|1ZAax6icy_X9x!n)NrJ90QsB+9+AZi z4BVX{%xHe{^je@`h^LEVh{nXLlN`Ak3Qu?vqkba5WyT9CKZ;N%wBhP~?hKK2LK3q{Q@b8ror6q0>Kp=4vJYD@<);T3K0RYm>I5PkM literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_bg_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_bg_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..70cb7fc7e0bcfb850d4b365f1bccb5b743913e21 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^96&6^!3HF|1ZAax6icy_X9x!n)NrJ90QsB+9+AZi z4BVX{%xHe{^je@`fTxRNh{nXLlN`Ak40u@7AASF0zb~yy)74d)-}Q|XM+&=H%L1l~ z70X`DZ5Q8J;=>T6aJiv_zhUdQx9rw$B!4Wi^!v;8!uD-LM?h!CZ3$B@rZO?tz^Iy& QK(iSCDOJO>Ym5d24oA2hD9A9kkZ#C-ocYxQulY$%dG^s1`jD zWrBMf{hI5z?Ps6d&cAMwxpu9tAQSLC;sV+l?CI!atlqGv_K~X}S&7D6#irA$G%zcr zGa^}SvXODrvrsWB#ZkB-c}-Y}>Q0!#L#9IQCX$ZI#7DnF9fJ8(R=8iR{NJvIR3GfdBS0fGXvSYugM@B@Fy~s_l`Jy)|ccqHxmVzApHz{x4N{y z#Xj0V$LH=@zsWY)$4Z)6--edG^VYGh&b$}$F3XeLt5=Uu0`p37@FaypB&t$KuAm9R zq*|yt7WOdr(m%g{dU1bs0-qy(nh~3JDc<<|K^(;cR4G!8UrKd|p;N zi5zZftW#Kk#vM}fdS+hLQ#;Dq?H?_`8P1nhqmR=j>Au${MMR)hh&5HCA z?cjx6pHV1ZFFx`ra1m|YMALE$u3RAxZp(6Eus@DJwzn!G7Cw2Mm%K&AN5Ia`DuuPd r`dvHM#yxB2nYDo;0!e2cs)*3P7gB8$K+RT%00000NkvXXu0mjfr&_ZI literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_primary_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_primary_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1c269205e874bc6addc308efe5be4fb7c5da0edc GIT binary patch literal 917 zcmV;G18V$CDOJO>Ym5d24oA2hD9A9kkZ#C-ocYxQulY$%dG^s1`jD zWrBMf{hI5z?Ps6d&cAMwxpu9tAQSLC;sV+l?CI!atlqGv_K~X}S&7D6#irA$G%zcr zGa^}SvXODrvrsWB#ZkB-c}-Y}>Q0!#L#9IQCX$ZI#7DnF9fJ8(R=8iR{NJvIR3GfdBS0fGXvSYugM@B@Fy~s_l`Jy)|ccqHxmVzApHz{x4N{y z#Xj0V$LH=@zsWY)$4Z)6--edG^VYGh&b$}$F3XeLt5=Uu0`p37@FaypB&t$KuAm9R zq*|yt7WOdr(m%g{dU1bs0-qy(nh~3JDc<<|K^(;cR4G!8UrKd|p;N zi5zZftW#Kk#vM}fdS+hLQ#;Dq?H?_`8P1nhqmR=j>Au${MMR)hh&5HCA z?cjx6pHV1ZFFx`ra1m|YMALE$u3RAxZp(6Eus@DJwzn!G7Cw2Mm%K&AN5Ia`DuuPd r`dvHM#yxB2nYDo;0!e2cs)*3P7gB8$K+RT%00000NkvXXu0mjfr&_ZI literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_secondary_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..40d0d1645cbf05e30bf092ace45403281da7f318 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^96&6^!3HF|1ZAax6icy_X9x!n)NrJ90QsB+9+AZi z4BVX{%xHe{^je@`oTrOph{nXLlMZq=7znVWA2oV&$ZSjW?F|h7ziq5jS#e}ezd(V) z{M(JTeF@SBrcbxn{QE=WZYK^04VRD=846z*9&b9ovtVvpnl(eT%D#{N!SzC3^S3#* f<|u1MCr7h0-;i__`(soEw28sf)z4*}Q$iB}%FaDT literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__progress_secondary_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..40d0d1645cbf05e30bf092ace45403281da7f318 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^96&6^!3HF|1ZAax6icy_X9x!n)NrJ90QsB+9+AZi z4BVX{%xHe{^je@`oTrOph{nXLlMZq=7znVWA2oV&$ZSjW?F|h7ziq5jS#e}ezd(V) z{M(JTeF@SBrcbxn{QE=WZYK^04VRD=846z*9&b9ovtVvpnl(eT%D#{N!SzC3^S3#* f<|u1MCr7h0-;i__`(soEw28sf)z4*}Q$iB}%FaDT literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_48_inner_holo.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_48_inner_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..c8358e9cefce502030416e05dc8faff139b886b2 GIT binary patch literal 2081 zcmV++2;TRJP)YIdx5%v}IY-E={))x>B}kD^;1aO=v<01PBB|;(|LQ1lm?k zLWq;Nn-CY=ae0(~!^>I`t6s zs-B%JpquWw-vVT&b%#DKYKZiAR|9AYVtSC>+D1~E4^t2*_YE}4C7t2scS_b&i9ji7 zBYSvMwdlT0Go+O!I1;=rq$n|BisnJx=53v0;@hqm(7l)*=4rJMo!clNrP~Z@m{E-} z^JZ{ZNHx@{flX?mQSo``X|C|5u79fpM_&?X60Kt|A5rbxJ7+XZpRQ<_6xsZ!_#wo! zj#h1_U5!M-Io2>ob>UEYg+LRijsxnVI$Sub8=TigMynU~iXTIjns`*ZXjCM8l?je< z^3e1OfW}cB&*(9#LY#4(p+|S(CFYo)RH;RK=~N=zD5YZ@e|b@)#etF>)Z-yez@UzD zxn@bF&zGN~8oIPk4dfy-rEX5Ww8$EZ0F70%U;9F1W%-Z($&Ga-Maup1vncKQ7_DKl zn9!@7d$FjFqs1PKM)U|Dr6$Db)oTnV%fNxx{Okxr+DM%Qs^$R=K0p5VBBLXP|Go*uWAqrP!s#9EjG3Y5H)_%&0w$xIP8)2<gS?toB)4w_5VP~5v52jeNf?a@l%z&Ft# z7nB8|dUgD~fFBhAa+9}!Fnz66uJJUZMq$&Z-=x+YQJfJpw%hO;S zbE}u#&MHNeP>Upl#AP)>l0hdeKfNO4(#tQm-Akeu&02@RbFR7XY>6_k1%f(YAT(#fsAW zCKBlg4QBOIpq?mn>zJh1X=9x9hp4F}kQ(@481j?!sz3o)0BA?xOCB;{@vwLHR_qA* zZA`n>5_V~?==zrnj46C`9p$WNjB&zGc+-W7;QUT(*KSn_p>ds2!NyfVppL*7{NFHR zx3J%}=U0sLd(^D`)P?PxcXaJb1;-WXet3d^dmIcA@AOk%p(p(THF8j!=km|#V)bYd zpicX$PljfTc@O)})|@FD=Z~mC2i2imPj;N6y7k2(V~h2N*p=p#-z6}HxcB*hYkSJV z`IFSdb9yY-P}dA6b@>ZL?=z9&3we?^d^OD4aqs1Mx13&f#Qiy{cDn?wohTPSPjL-WpW1m}O&Ju5YPHyotYlm=9`GcY zrwYvY8;-f&ZSM33oCpsge2-Ip%afm3V!sl6q6gM{kN3J3%|Xrhwg)`uVUIiGY!FzE zIO3Qa-0aQX;)a}NjB&uQ|K;9KmvHqg(MeCoc*sw<&DEj$2|GyBp7MmJgBi=!jyvfZ z$6Ymtf^mwAKHp@Hd-~&L-Nsi~>l_hPjymE9wjDU*%(E+7 za!uA`P2O+vKSpg~;?JJlUH||9C3HntbYx+4WjbSWWnpw>05UK!F)c7SEiyAyF*Z6g zGdeOeEigAaFfi_TCsF_a03~!qSaf7zbY(hiZ)9m^c>ppnF)=MLI4v?WR53O>Gc!6e zGc7PTIxsMwC7)_* literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_48_outer_holo.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_48_outer_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..f62f74bb38e8818fd970b7ec1f7862e543cc9d07 GIT binary patch literal 1811 zcmV+u2kiKXP)Q(x@RlU0R z*6*F+o^#JDHf2*b#j2Gf_PMBSbuGRn) zDJUkGcinCw!4`)d@_D~EMJnC5dvGXBz z^GjW6Gg4BPB{MBwxqQWN<0fP#?6J=Sj@WNJ!AH@8Kl`>9L$xnJF(@mqT0WPnt1qF1 z=Fx+;deGw@bGK5OQ+L*P{Upq+6DX1yGQbK>T~%EkI?XGa@}$o>ppa%>^8?Sie*2l7 zfHK3%D>%7|N++0Avr7*8vd@}G^Jo0fcfyUHfnsLZ&jU?a6Rn7I58e-AIzUHA66jy!AvGyBgcAIA_8&ya%2-o5w@+x^Frq z7x5uqjDu?ciVPZ-34&-=b^T>U$i3owu8N|PCmm@W9a)>Z@0e@OLVt>;Q1iTBsK`Y- zJ#Dm0pva)1q@Sv}wFUZZ<(6Yki*muoJ=kjDtmVDYq#tH=k$<|@5vTpkf+%-~CzQJb zDj5=FGBxvks&SW*YJTnCqA2*7ySf013>jGQpITpe;Jn|eigLRhZQhTXHIx~a$pm$C z{nZbIsz13R7nL1tHd-@KF*$Um(og?cC1;!x<)VYeI|B_UB@HdgHw5UWlj@?}cDp+O zMal|-j9w2i9i`?Cb8^v;J)JZZ3@FG_LfsGv{MVdZZorO4w{8Y134%<%0TH$=m)%OW z_@u(SziK>nET6ihG`KOcU?%zJh~m2+ycN)r5;qQq+h%%Xy;f)Ejn0a3UnsuS^+vZqWP#0th z#x}@k!|oI0qU+rNRV>J4GUFR$v|a9z%jMoM-5IE6CMAy{ll?bZ%p5f-7cDwzt|L%b z^86*Y-fp1pM3X+OAj(~JqWJ*PYCpbZCY5MgZSAj)V(>vz$zUg(ZywPKsOqx1Or~s4 ztCPVxWShrQgx&N<^IZW2u9-7hOofKj5BzxpoW= zdO}GqH|+&2+j}j6LUh@cv}2FCzaLvtWZ?^TwHb8;v&L-C`+P^-e$fT!yBz5Da{oL7hj@h;h3%R$P7X_J;dmT2? z8&V8*_<~22M7c%3b3D}BjlNwczv7fZds1ebGU8;svesTmESU0X4=BlHYF_eOt8iaY zL0I~yq8N;M$m4dU73%)xM=srNe&@#dxWo1;CZw8+{^f0pouFbc zV#*`lZz%0)HGlQf<_c&{Ktx7;z}?CzodgvZopY&OUp7)Q;eaFVO?})iuy4L9j zyLs2K^qSz1EvYP7>Ws{|~_-QddT;IiL%she&}m+lY?b~t3u zik_CPT+O0+6?K`iA!CLOr{nnY$OW(ay)*42s|TRe$lC9I+YPJ$b-IG8H~q!myML>= zroa>ruDyrb zV`&jHgSNQCgmI$=lu=hRYuXKOo3_xM&-4jsmA;l<3@^Ph&(-?zXM#=Hludb0$^QZH zs3&Vcm*{c;001R)MObuXVRU6WV{&C-bY%cCFflPLFgPtTGgL7)Ix{mmGBYhOH##sd z?sz9s0000bbVXQnWMOn=I&E)cX=Zr$HaasiIx;gYFgH3dFrOu# z?f?J)8FWQhbW?9;ba!ELWdK2BZ(?O2No`?gWm08fWO;GPWjp`?002ovPDHLkV1l}_ BPJaLZ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..eb28ff9a5516c15667fa8fafbc22d608d1f77a06 GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^%0O(y!3HF+1t+BgDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?o1QL?ArY-_Z*Jr|WFXM+FkX}IYI~tj_}8!bFJ^a4j((ibs-&WN zGIsXEx)Wtn`lnsEAmpSFI79ccn9RKAsn<`<tk;t}o>yjV{qp%WbL{dki&M)*dw`x~@O1TaS?83{1OTcY Bcf0@q literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d281adb553af892f758407b846bf31810b9d776b GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^%0O(y!3HF+1t+BgDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?Tb?eCArY-_Z*Jr|WFXM+FkX}IYP%rckLbO*zpbz{y7bYSIrPClD)2Hc3qcaC*%7oYhKR%+5DyWbJ~oU4#{OKNlluqE0VJm zR?Ud&kaA;Q)O4{aB-unUR3g{I@EB82%f_aZWF5r`AFqi`v@HN~5*v&Qo>cRA$gv99 zHaapFv&*%1#4~?bwda`9)~}vNKHF@K`t|cGZ}Xb{RR4x!PC{xWt~$(69DLj BcXj{( literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b2985860907ac324b509b76731e8ef9e01bcef39 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^%0O(y!3HF+1t+BgDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?E1oWnArY-_Z#r@{8;G<#%>2r*^uo7)-)HXL@_O1Ny%Iq#{YfeF z(mvLmIJH1t&`=}DOJmBWhqv04yB582t6X;JXNKdwfEg3JZl{PztUeIIdQ8h8YDr!LqoiBzejNy&kDcJs%rP689)vmGI{X_;^jtl6gm^<0^v)GdFRa+YOJx z7F>vKtz@b&Rr+MtRJ_Cdn)*bIu9V&{pI@`*?C`z(Yf|Vzp#K;=UHx3vIVCg!08ssU A5dZ)H literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4215396dd4e51fea9239323d313b72fde0ba86d6 GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^%0O(y!3HF+1t+BgDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?E1oWnArY-_Z#r@{8;G<#%>2r*^ujlV;{V25Ur(E)S0c!zKPhEi z+Q+&RrxwTy8fpZ2X-wJl@K&30*P>T$mCG*u%y7IHFk@oZ?G!PI)dwP2k7*f%?N0KT z=P~Pe`QZt37-AUDv?qm~sFi(Y>bsQr3FCw4S+92))lbOG-Y30G>`_~0 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a280eabf59b5eb69fa2a84280402b63d5e1bb8f0 GIT binary patch literal 524 zcmeAS@N?(olHy`uVBq!ia0vp^%0O(y!3HF+1t+BgDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9q_DjO#pI977^n-`=$MKI|ZI{A2#4tV=npb9cQAXy4X!_bwM}{Q4K( z1sl8bnxc=22fURRmTQmkS`l-5N%{4LzmAq3{WkJ?oSyR(lyW*m>cW(jDj1r7drC_% z+Ahf4U7%?EfVHA#U$%eE)HUhV{* zGqMRv58QeS1t+_UJh{!Nwtjop`q`x&KXzE!mvvsrOU)9V|3+xFYu0w7ttSN+pN66C zV4oMA@AG&3wK%+`$wcPZ<#Ux2T-c9-*heq_yZUm|{V%D1UlxhJm0zYfUETgVr;hpA zt-Fj|Jsx=O$lYh^6WL+vBibSA6WURD#!g`Ij9SHG25Jg!2FnzxlYN}N9h%V=a_mM! z$e|leQ;yweap>IrEpmd};fhV2Zrn5uN|m^)*v*dyQIi{G2ej@g`j zy#1roz10ezmNeBYwbLI^0W9{MT&2dcxOa)`zb@?O?Gu2 z*S413TzCHUdV}>`f)DaiKP_4HkL&Y-WAl>F%y}d1AGY65et#XKh5dqWo7Y|}14bu< Mr>mdKI;Vst0N8Ej(f|Me literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f8d619b4d47ab5b104d6b1042c27fb16a3beca47 GIT binary patch literal 523 zcmV+m0`&cfP)C3<00004b3#c}2nYxW zdK`GU$CA-E+tg1FUj3CV1Ez}l7r{NB_YWZ zgb+-Kh;2qAgunr)owSNT9jE|#(}iQ{0=K~F)j_f4%AIwfW*LI4SCjSena$3zhl@?`-N)f>fC&00iU>|7tSL}YGdG832Z z7Ry93w=$W@5~IozqskJa$`YfBUCf~8@-tLEe(Yg7ZJ&$d5^vAJVlkbz&)H#>=1rCU z=lI*@D9QucAy4<)W_$YF0~q6}sI5vC!>ie*fX@E1>5KTAKqegRE>ywO`Fw(I}^ N002ovPDHLkV1grX;W+>R literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__spinner_ab_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..955a2f34061ae8ac853050da355f89409fa0a784 GIT binary patch literal 464 zcmV;>0WbcEP)C3<00004b3#c}2nYxW zd0`Pl=$b2!s#>@tS z$Y#JV#)+K6SU+tW#+_RkXYzpRi_e9eTN!5>F{(z4su81V#Hi{OLkTB`etUYuM1<4( zFh4)_STHCiBAh-(+2ze7j|0M$*V@)G5^^0JhFHh^fzV_7Tf?-4Si|T*tYCB@#xY$W zMloF>#xN!zMlhxzoiQdMoiL^$+87%UEsQNlYm7|@05m?}iO1-}bYl(D3Ue3c7gw}A zD?zp;CtICi-;5NDtN#ybjCs$)&yQmArGt<$4!&l7(HXO5p7J23`oDJvMC3<00004b3#c}2nYxW zdPRE!~6H3V|7LaeL+kwzxO}{DvWjdA^uWhB*Ox4MVbeVt$Spwgkx< z!VkuXjKgSuY)h6Hw=%|LL;AyKLdLC(F?ASO9Y$7%k=0>jHH%rr7Kwb5&>UvDaCo}j z=j+357qeVAJX{{~a_138(!I8ROa__X7ee%7enXtUzOE0mAw(ah0z?m{B1Ao=21G5U zCPW=Z0YnW(5u`pwA*3EgF{C<11Ed;86J&FYMhHOp8-||_vny?o%`ne52fWVraQiWC zKdv-wupMF9(yd;3%<<_PN8|TOh%C!a80|#$F{54SO;q)d{~Z)(nS?QFWpYf|szS`q zFpt2hCCEz5&mZk`@i_(t4MLWruXxh=CcXUn1{k8P{&E{)e*gdg07*qoM6N<$f@(ay AcmMzZ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..673e3bf10d60cc54b6dfef2fcda24575073adf61 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1i!3HFsuehcLq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMgJWBc+iXw=G=Ra=)z4*}Q$iB}l;b6k literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_selected_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d57df98b501944b4ba63623766c396b5bccc29ee GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1i!3HFsuehcLq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg}h~fd(*my85}Sb4q9e0H>EG$N&HU literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__tab_unselected_pressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..aadc6f87b21d7d5139f3bfe860f4c289f75d241f GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1c!3HD^Kbl$tDVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s&XV^0^y5RRG22KRnVX>4qKXwM^^Uwi5RN2-aD!@msM(PItf+&Xuw+O+F;e0P1D%boFyt=akR{ E0I7Z;-v9sr literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_default_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4be4af5fab3a09cce65144c747f24c6ade600359 GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DPvC;#}JM4$v^)8w`Z37Am6po z+v)2g(?$k`c>N1yj{}(xupO|Bb9m#eWaid)`oBujjyMLj^RWk-B)8T8wKI6S`njxg HN@xNA1NtG- literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e72193f5921ec091dcbdb7a6da540c6ae62a0abf GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DLqdY#}JM4$v^)8w`Z37Am6po z+v)2g(?*5`F8a+MS1=|pKR7U*C#OeuU+2*R28QEj<(b@LKCA=kWbkzLb6Mw<&;$Tx C%ODE? literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_selected_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8f20b9d2673d84e22fe4f92da5c6fba5524bd7c9 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DN9cm#}JM4$v^)8w`Z37Am6po z+v)2g(?$k`;P+>Y&mX9;kTm#w#$Mr{KU16J0f(K87k2#dS899B%AjFfa`@;vsXm|~ N44$rjF6*2UngAGyC2#-$ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_right_selected_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..04f657e1db10e9694c00a2d0240c4dd96a062c37 GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DKk$O#}JM4$q6$m+Zg$O@E^Uw z81lZJ?Gxk7s`Po4Y{w3tY?zt;Z*oT>n?b-q29KD3>Vk*AGBMnIke8aaIU*2f0)wZk KpUXO@geCxD+9O{8 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_selected_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..99309ef6d3e32a2d3303400aa061e0508a70f758 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DN9cm#}JM4$v^)8w`Z37Am6po z+v)2g(?*7dS92?$NlFNF3%qKd&uD!9kGjy}NRLj&jF%7WCrYdnXQ&Wp*=?oVF$ZV} NgQu&X%Q~loCII6IBdP!Z literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-hdpi/abs__textfield_search_selected_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9bde7fbdce15a1c2873eb0779ffc0617fd9b15c4 GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~k!3HF)wbmE`DRWO3#}JM4$q6$m+Zg$O@E^Uw z81lZJ?bE^f8J_14%!p_Ru>Zp|qw<;kM2WLbT|5rH?EgED6zpZtm|hnx*$^-bXas|& LtDnm{r-UW|n`=evwJLPDoBk{4*AEnmdKI;Vst0H2gA*Z=?k literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_solid_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0706c8af658bde9602634950dfe3d5fa5886163f GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%zMd|QAs)xyUfsxfz<`JK;_Z5A z-Y@ApO*&r-OgQM+#9X>wkYiu(tId138dhyGKCm}H$eLN@qysZ=3D*)nlM7YC@0xyy hn}nCMmBhQI$CPR`ipOiMnG7_T!PC{xWt~$(698&aE5rZ* literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_transparent_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d814d02d31183b8f00f475a05c124004983d9eff GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%PM$7~As)w*fBgS%&%9EC|%_%783w8jlt8^&t;ucLK6TeKPwmj literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_bottom_transparent_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b139c8e49168e4404df0a46b30a4b30e90c1ccff GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%PM$7~As)w*fBgS%&%9ECY>s_{MVWOZ(=mjBT1_sGr W&p6(H%v1uJ#^CAd=d#Wzp$P!PC@9VV literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_share_pack_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..738cb38d072137cb68723c576a801e3f3471bd3e GIT binary patch literal 2849 zcmV++3*PjJP)Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RX1_J~p5beDeCIA2cQ%OWY zR7l5TU?2|sCsS?|jDi6Kj9Am_|Nq()8Oq3b72QY{5)>1c;cz&TiC#fBYSE}gC>H&v zmqm=DaWrZXT`giEwGM2L; literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_share_pack_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..2ed75a767a87ac573cb7306686035f2100459fb5 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)n!3HFaZu8v$Qfx`y?k)`fL2$v|<&%LToCO|{ z#S9GG!XV7ZFl&wkP>{XE)7O>#4jVIz7XKNB(EC6kA5Ry@5Rc=@2?~6F)PwUxdYTwn zdMu8}YM6Xys1i$1bTr(^uv&TM3(=CrV!crU$Q6V-%Qg7n#gTe~DWM4fl0G)# literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..743d00b6cd7e446c7badca9dd11d1579404569cc GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%KAtX)As)xyUQ!e~V8Fq8aW6aH z`M>?!MSK0VJ5DH+1)MRKpSquM-S5BdOIN+&sn~jE%jQNlsf-1UY_}X6mMgq#dKVMx ha^q%Y#@a>3az|3`-r6;1y%^A322WQ%mvv4FO#tkfF|q&v literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_light_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..17c1fb921f9b7b46aaeefe7afb8302874fb0abd1 GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%KAtX)As)xyURua|z<`JK;_Z5y z;?s*`91mY+Vs~LvSAIRQ|I~ek>wo_(4hk(}+Y^;`>!t%UugL`m=C=w5f(6PQ%h%~C hy?JA^CG4Uk|5eN5b2qlEYyz6g;OXk;vd$@?2>`YpFM0p~ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_solid_shadow_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ddfc8e3d5c4131f2460254f183938477fc5a0679 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rhed`}n05R21qr&#kfCPg`@kT=WR_nY-)l@u)2m z9YjR(TNrC5J8zlf@MOx-MX#^q?zd~tP;1Ok`WbQLQ#YGy{=Yfu7pEGW;JmVaai5Cr S@!LSF89ZJ6T-G@yGywoUXh2*5 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_solid_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..007a4b239244212339b817f8de9474a4dc34fde0 GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%zMd|QAs)xyURua|z<`JK;_L&H z*gyPBj&nSGnTg$nOT)YjBQU;+O3-o%)BNS9GKrK90(RDcPwA0 ir}XBH&6co>lKfV`a~Jh`>I4G~X7F_Nb6Mw<&;$VSc`p(G literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_solid_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ad6e1a4d9f3c81e20676f979a53cea2084ce903d GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%KAtX)As)xyUQ!e~V8Fq8aqs`F z7bNtyi1zwxcbrft3piseKXpIjy5E1@m#%ulQ?d2Tmd%Z9QW*;x*={*DELV8f^e!gW h<;Km*jJ1o5{)rFFF7K literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_transparent_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0ad6c888b4c7e436e7d7c78432dbfdaecc95a7ac GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%Zk{fVAs)w*fBgS%&%9ECxB?U?=uVx Y$^4u51wHGE0Gi0)>FVdQ&MBb@0N@ZURR910 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ab_stacked_transparent_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..19b50abcb536602cf2cd36d5a19805464988bd20 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%PM$7~As)w*fBgS%&%9ECmdKI;Vst03^XH%m4rY literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5461b9c00fd3fc513aa4465682e70e87cca36a6d GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Ql!3HEv&)kdyQaYY4jv*T7lQS|h5*V8PD@dJb zGfWV2j%0YY@&Et-(u-Ft=sZxsVYp-gbGr;f^5z}?TUWk$0o2Ff>FVdQ&MBb@07WJt A3jhEB literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5dc6f804aea8ca344275ac6eb497b6bfe0f117f3 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Ql!3HEv&)kdyQd*uajv*T7lQS|h5*V8PD@dJb xGfWV2j%0Xds4&4P&{4SYp+J&{BRiiZ!)425)ejdW>;mdy@O1TaS?83{1ORBM8sz{0 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a70b53c59af769e3c98973ad9718670ce27259ff GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Ql!3HEv&)kdyQYM}*jv*T7lYjjGZ_h07hy7xL zS%<;BUsuG{45zRSgeB^>bP0l+XkK D`1l&; literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..85d7aadd4dfb619883f68f1cc63e629698b5dab5 GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Ql!3HEv&)kdyQbwLGjv*T7lQS|h5*V8PD@dJT z6Fe3@|6GeFPb#ATqtK84|Mweqan0i3X%}$jvMQLwz#trO`SaWQ^{znO44$rjF6*2U FngE5o9^U`} literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__btn_cab_done_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f7b01e012f895bfe2c4241e1d48771fc372b35cb GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^EI_Ql!3HEv&)kdyQU;zbjv*T7lQS|h5*V8PD@dJT z6Fe3@|6GeFPb#ATqY%TTAPubyB?B2J9?cgAJee4pt{u!zH{AaisF%Uh)z4*}Q$iB} D0X-aq literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__cab_background_bottom_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d8f1c8bd54f4f091e79389603095c99cf825cb6c GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%Zk{fVAs)w*Gcqy~4zxBtu(zuW zGMHg-@7EW5UBeRx4_{GYv)%pQnG{Mujhr&UNqv-pZ`Il{xB Xs2c0@Tz2whppguou6{1-oD!Md5lfPH{+~ zs&ZK!$GJ#`+OXn)bEl7O^s7vMLr%~_eO6@BP#xDsWzJIxbKZ~=QHwoEqiCN;6|k~9&?6VGu8wVeg}kjlqBUkXd|o%rApJ7Xx?SmelE6^*`N?mP%?P7H@yM z@176Te{31>^aeVqCP$2D`iM8b&G*loT1#z02OAN3)TGUD#xbYXQgqexFre>@9yw_< zoN>t9>xRrEIA?_IE1YrUo=P<2hNadJXB=4rbb%a&IXb5^sO2P4AoU2`8OJ_N3+RuU z?3bPMlGWJT{|mv5xDeck3qc!^Tkv+yM^@uWqQKxnw{tZ6G_7EN(=@mR#5tHjEptZL zT?o!N^e&F18P*7EfGlP>S;He0o_$19Sz!q7up>N&hdzT z+KgUQr1}UkLQL4KR;yolWSqh_YPX?lMz7!1&pz~~fd%z~_Z{#V_yT+aKE`}mgO%s( z*Zy2en({y`_&;C`{0061zkwyNiuqzpAev$qeWYoU3d{J#NzC8IACaX$H=;%xu?3!~ z#a`2j|4di>P9KpnLiZ0Fl^vDJdHW{hJgNDYHbk!VsHwq51hhtobGl;RmY>GHkg{)E zesWUhFRGl6)Eh$fMU__)%@X*lTj%8LuWk+fh;ux9b*`$4|A#h$uKO0E`Tzg`07*qo IM6N<$f=1Pyg8%>k literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__dialog_full_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__dialog_full_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f18050ea589eaa31233bc08e4f8a4e361747bc94 GIT binary patch literal 1003 zcmV%vbFc60S)hq5aquQtN zO>~Q-PMt}eDy?tfo9G5^U3x~HVu{=o-l^#5`3AXbFq#7CZ= zx~R)Z%-PngELWXE=jG+4wH{HY%RHtL$z+_dj#xsD@Y&isDVlJd1j7%A; z{S3ob2!NCVl}{yrl8B^V**9f-6IC==^T()w$-W%VAY54pg(^F>UjitZxrB-eCn8Lf zB*stQ-rl}17K`6RG#lbS(&{_eIc1V`#=6_}di{5~T>e4x!ZPZXM|a{QRmt`XV*pbC z)5T)(D?{j2cRHWXf1>hHw<=z1GC@s9Ro2lk0Wc$?r`}K3Qx5<^GzKt(+iwt@SwZ#Y z1K3Z>bSEt!roEr8rydA`NJoVD>nPSV+2(05UE>4T005_GAOuI89vS#iG4B18N9tN{ z^Z@tNBTj+gCOB47*w+ z+2Hb~>!f2H1$Hq!D=_Sb+i%D|qnZ-1^bbIwX<}v&QHjdz0&e>kOOQ$(hHgzP5DjJz z0f>y6M3En>w55Wi4nf3bKUf4p>o0~xvY>6}4YBjHqH^B)8ba{Lja`ks{5OurR;$m< ZjQ=n8%sUGgc=rGR002ovPDHLkV1nUn!$<%C literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_ab_back_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..df2d3d158e201f4b5bc8f478bfe194c819c762d1 GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6n3BBRT^Rni_n+Ah2>S z4={E+nQaFWEGuwK2hw1@3^B*n9tLu5dAc};Xq+#-xYx_sQH13|{`71Pj-*6Uoi`#n zE(U8IKgsQz<^Rb4R70ym$22iPZttV^?_#_6n&0#=x|;ZH&dfx!jETDzs(0U>)g_uQmUhGGNWo+VotE}_5b3Zj`hnf_E}Q2 zkoV^c&!VIWreR+T-g@7!2<2C~cxLXYh02~hOPyXw&7V2OC7#SEE>Kd5q8W@Hc8e16}SQ(iDxmE@S#`ha8qiD#@ zPsvQH#I3=p$s!-9K@wy`aDG}zd16s2gJVj5QmTSyZen_BP-2>S z4={E+nQaFWEGuwK2hw1@3^B*n9tLvudAc};Xq?Zzc+iX4P{i%w`)y*!lC}nMxxP5m z`ipDd|3l#c1q-`17wzs7jap-@cWTC&8}(D4%&X3GaM#!SkY4?Tswdc+PM~^5?gXjDEJr|A(9^w&s1cyzt=Kg=58+)D;SHpB%sRSHFHUToUy>RV`*x3 zp=*`d7Z@F1xvAFw#q#fW_g_%cHx(CZDFFIJwZt`|BqgyV)hf9t6-Y4{85kPs8kp-E z7={=cTNxTy8JPmPRt5&f_Zu#wXvob^$xN%nt--0uA|I$h5@bVgep*R+Vo@rCV@iHf fs)A>3VtQ&&YGO)d;mK4RpdtoOS3j3^P6 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_cab_done_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a17b6a78920848c37a67246a76749b4cc1425a15 GIT binary patch literal 566 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE&~Ijou`Xqh{y4_R~-EgIfxwlm><>K$vu5h!wc4! z9iP>XtrZVs65@3e-rKIN%Hh(x{ewWxt1j(s|L*kJ zSoUnickXv5=i7?TNH`^EJfpg4#&4;Y0qR0+drTg2JXGfUq3}Rr;{P9f_n*&gD7KkW z&D4IqLivGGRq&kmAH6(eA0`F~7S8rex88HAVS=03cY~80?cpzkFa4S5A6;t}xJ7Q# z9-saRVPfVT##U33AAO3A+Ypl|_94?@cK)tT4*8AF;-^j1iVm!a-M-<=iX&Itr@TnW zJpXO;4EOj9!Ar}#BHVL6_dHGGELXBQqN>Q8)gj~`k@s=>rw|ur?|x;upO5s^{asBY zKb@S=&SWDRsQzHyR;N3i0@8Cfnf~0l`P3PA4VeH(Ut{H!I{}l<<aB zB5gMTgH*M|HKHUXu_VC#5QQ<|d}62BjvZR2H60 RwE-$(@O1TaS?83{1OW6u*u?+< literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_cab_done_holo_light.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_cab_done_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..b28b3b54f4c81d482f797f31936cbd4013c093b5 GIT binary patch literal 552 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_normal.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_normal.png new file mode 100644 index 0000000000000000000000000000000000000000..86944a879b986d941e6567d78fbac16c87ae9244 GIT binary patch literal 1869 zcmbVNc~H}M6fTFTAW9JhxeNgj51OPWje@pKfI5QEBA|d$+W@sTscjVKdVuS?9w2h9 zu!^p(ipSu+I*za)qKMZh4tTpGiYF)@D~E`is<``y;~$%us6_Qf>3EP7d8-+ zSuC3rZA?5JA2A(OQ+kfdV#CSM8yGZ;HF-*gL8aCaG%$}y)sn&B%ahe0pw$F}ae@dq z!XP8kwBcqWp)^OvsLeXHSOZQ80VZdl41u1YRX~P*0ck=rg27L`C^NTgLm=?Ugw_Rv zpPh=2hyrAkkpKi7I8Y4>VL*s*5FTG75={iSFakp`7ecs!hzR9zQ5XikJRqZH)TE#a zEcA;OvkC^&Xxe~6PXctnG=pit3hET2u2VQ z9~N<8VGzQE&zE61CKg~a1QT!t{T$!IN?{zwL_!$n$z%wEg-T!nU&6;R9*)6ME??M> zm6Ik~MXHH@T`i;g87m0=E*6y;2^CElV<>7te+5LPQ8Z;rqYQvdDF7l=YAtD5TdwDG zv>0L3E+#agMoJHS$}g(@hCVJsqzKOFTO4KL4hj`=LnW957mEdaK`0OWg4O(=oI#8; zkfk{OQ!M>kOa)q|UrV1^d~F_rWID#kv<4`i7|nFtQaL7x$+*=PcRNxkacMnTzT(!p zfRg6DJ1Y_~Z$G;tw~$ix*L@nh0_gy+q{K6=O-)U1ZBL7fiw9T#wcP7iz?I7*wg8n!aY@L* z%F1466IZ9xDGw&8Ca%%8-9N%k=5}B-gNg) zDs^~|+ru7gAfdUoeO*+YE(gj=-VB=VaaeB5#xy?WU;B+3~rnji3!zw~u|NB5xDgMA*Ab}CoKR1b4{ zl>=_SIAEWB^HRqqsb8t5;#}&X_CmjxL@oZX6x`u-Nm{2|`y?pbN5T8(*$@T`ZH%+J z9q+wi#oajjm>l)vpmE_mr&lY%70+^a$7TKT;qFtqhuwA!$jh%>ho3F4%BgGKv%2K0 z$HF4;&SJ>7KIHm~u<^wO_8Z;3y_c~N@r~v)LwjwHt(kkY;`G=_K|x(kncTb+Ti2eM z7yH!X-5fzxm)r79(!ZaTJ+c?A_7b`^xjVa7S5;ayZg6q=sKBA)LhBfI?7p4HG-EdX zGM##G-t1BC0PE-nz1YH|+GW>beOJO<&x4C?Y3_ohAr4Hb&I{K{y07O> zYq)siMdY38b0^FH-T7Vnp?+Dwy~?6uy>H4FYTQ}9{^zjW>fFu1k;Wnu$QYKv+~3MD zkL9@kLKD%Thtmq5^yY3(U$KE}2<_4f7b{3i<6pkgb<{dv;FI&fmd#{QXNuR<0GE-t|?<-_xFWf6rQD zvp1?(m;K#mK7kAc23PhCb9_I|Uwpe=_~P7`{<9hKeqT15)CmrGep&{}lJt6uiX0l6LDtGM?vvS&HSN)*I> zeOGt*EnBDP@;N{6y`LG()$~n&=KfpyvX&R-FPte;1xy60C9V-ADTyViR>?)FK#IZ0 zz|c_Fz)aW3GQ`l_%D~9V#8}q=$S`=EA9fW*LvDUbW?Cg~4U>%CWdb!wf@}!RPb(=; nEJ|f?Ovz75Rq)JBOiv9;O-!jQJeg_(RK(!v>gTe~DWM4f-EB1! literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_clear_search_api_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..15b86cbb21eb3bfb82d36aa9ce750906297a9225 GIT binary patch literal 743 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{0wkH`a%F)OQ-Tee`#-|*CiUbcIg;ND=p zYvDSd^|6iLOdqf$Xmz|*HxtvIt|l!1HU7>O^~bA&&;Fj*b;Hx}3d6&UEnVN=_&rrS zyUca-tl4jMo@$nFEpTFXzIjD+{<)ibKgss#-rp9f6_EGh??g@(2S&3=!i$ftp1=NR ze5Ls1tv8DvCnWJd(z*Zhh{1dQ0Dw1}N=Vgur< zo}V(7G@F#*B=UQaz!7tS(%x&E*VO)~n0V|`)7|K^f!Elpcvl1$gq+H{_D)QEMqY%8 z_vf1aTF*LU_FtRc+)-?b!3?Ao)T}9E5o1c=IR*74~B%^nkKn;>08-nxG qO3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrH1%F?hQAxvXq8M>Z zk&z^%c%@bRQ#)+nOe){kHaX!!Ue%|-vcG@vo7s2MJqBDZfk5<_)|-ZFZPj9NlZ$EDG$w6h z^v#+%T(e!=j16si)bzU4HWV6_^stND&E;|5`nfYv$?gux?t!>a1t>hEvKg8)f3B--`qJ5Vc+(!(3AIVr zEf|cmkv%DM(IHdcJ}Sgr>#(5~Tn4TISAy%nrQvE?Laps69ZLLT!~WS0QV)l|q?Zr( z+%hOrq1e~am)EDre9b1+$FL^?hsoiT)~9EmS!B=eNVF1PP(kFFm`ljix)2F8;hG8d=#8;jP)h%8u`(ez=ZN9^bNjAY1@m$qMwqc*3 zT<9Z^7q-4S8p!6dM-010M=(>rk1eytHi>R-cR}tW4SUbF89%`nk>dMSnMgg-f@tvLl z8zJ1Aj<77hi)&@}=LO_3nTIUJfhLK?)MTgjijKG^e1tcvx@U?wd-4zBd{w~Rm8u&) z61IEoor<-v>QlY};sLy%=GMYsYZW#7TiibW&xJ?UJ`JsgWSk4`n=4tN;yWe=Mb9;n zrw!^kvCo<)%-&D;l)PgTvU~Z|j|VKn#)IlF_j=`rkH?YbC)&niUyM-$#5;BRtd~Vt zvDwmlW4up^P2AqKxmr=aNvNMq0%A$n_A&Ybf8s&n?eE2(zp1N=^sXKmlORRu-MwkG zqSrlb4;RY>`GT2~ewsriQ0>5-Cr@@n4LZ4_+db%Z)RR$pECx zV&kKm<~rTWsF|5CovUxbAuX%rMqUY#bK_3MXl`zRlnnCM)JOk#@Q|`yZle2b!xrs+ z?}@SMBoaxAn*F`n4c~I!tWN%NL;nce-(Ln9T2XV@wz0+fUe{x3EWBVphWolE&ZMpy zk=t+u)*ULX*vshr>?xS>+y1VFi$&0ZQQaET*YU40s&SgZh;!v@8ZAA*DJJ>D=a=0< zFKXQ=k&~NZZGoK2o`n~+R8w?*R>uuBc#s$EF{m0(={u8TU3kQEm9SfChYCn7J#=g4 z(PaFJU1FFZJS#?cN?VCdd62LmX1(Q&iCokv9@0&`0c7bz75vdTSAVg)Dte++U_U8a z)M|^@vmd{xiq;M1c-`XC1_k!;*hJ-2+0wh;$&M)lJC}axPr((&K~D-GVw^}ZK>;xo z8*&r{B7jDjnH@k`96(zW%`9zDXdCl`2T+hey^ru3{!bx1A}HkS<^L~SLob9t1%PwH KV``51)Bgpr>#?r@ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_go_search_api_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..8518498eb6c93e3d4f9f5c806362bf3117b17852 GIT binary patch literal 570 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{0wkH`a%F)OQf4-y`wRCHWT>4=v6Z~W)^Ex~}&Cks#3Ph?YL zYs=^PA1JbT)~OR;KkxqfX5VYCuTH8yF+BVMK5jv$P8>M!p?~7X|K_(-ZNE?1#j0+Y zX}rfdsOO!o8=KoP`};Z1zsHB36rFKS#YJJm49Wj>o1-q)hN%bb=nB|jWMKUFU(#;% zzNwwTK`8{^tVraaWCe_M$vxef5w0QpFdP-veDuD zxhegZ|L;vckoBsbjg4*D|NoLZ`&-4e?`K!s|My<3S%8^2?NH;i6Q(?qt2KRNl&_PX0wV*1 z5qGtn%`^R9z@Swvag8WRNi0dVN-jzTQVd20hK9NZX1Yd}A%^Bw21ZsU#<~VThQZ_f zu&XEx;QVw%w1wevX{81fiqT9$oZHH(4a215zM2{s3I28IOo7eJ#J d>KPlRN5&o6d@ywr|9haR44$rjF6*2UngC}HDAND{ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_menu_share_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..6bf21e307ed392bf00fe80b162a6ce9115e62c84 GIT binary patch literal 332 zcmV-S0ki&zP)h$s=>Sb2o({EW84x$2Sq@4Qvb1mj$j~;VIQBr2GX>%-APxay9!he7 z8W7h*gD?q**@0LXh%12j6cFzN;xHg)rA0Yl3bh0|IM)O5QD`2|BGz~0I$#-|1SL$5 zlJGbV2jtPKD8?58g7k0zp)`;V#9XwljI@z*K`Om-0V(CcdbDyt4~XM{*o)XuqGd@4 zDx{8=fp<=lEG6&%R0000-rS^s>8d@5ni2hppU0iV;YH8gwNa0%) z{Cz&}Jx|SbT`f+uL?986Pnf0|l@f5k0jz*^zeXXD13Pe$Xi*7R9^s5FmB7$P;6x!% z=kMH0V6IZ20v0@I38qpwTN6bU0_>(U;T<=GYX-1E8)QG}f-;!!681nE=wJ-aU=KPV z^-i_I3K%>@EawIsd5_!T)2R?x1}rE&N|%HcIQa;SqE5+gRv=Fy@M;YVKt`niqbhVk zpSlae%z=$G2Wp@TnqrmWnuKgf72^IDIDhdq{E7X5-;T%%62M`q*b}mOv3|8DyoG;R z;O#l^2#-VHDcnmy=|6xRPAT9SP9@+QP9YE&4z7Z?SGPkvc&h*a002ovPDHLkV1j;z BjTis` literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_search.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__ic_search.png new file mode 100644 index 0000000000000000000000000000000000000000..4be72f108ba1a4f36da5c3a59b1ed08ddcf7cb8b GIT binary patch literal 2280 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_activated_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_activated_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf8e03623c94b68d31963ffe7e59c72c3dcc059 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`86o-U3d5>t~CW>mH@a{g&g;s7!l1y4Byva-KaJLVIiI)OpBYodjS ofJx&-C1HsL_x|*Yp0_#7zz}{&aC*>dO_0?Lp00i_>zopr00f~Zw*UYD literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_divider_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_divider_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..986ab0b9746301f2dd9401829da09e00995621b3 GIT binary patch literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~qMj~}Asp9}6B-)+^BAxRtXRm= az`@Yw&#rLZUbzUUfWgz%&t;ucLK6T(%Mo}0 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_divider_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_divider_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0279e17a123f8cbb3c7e3a9ce5c5af8e693b6977 GIT binary patch literal 76 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~!k#XUAsp9}6B-)+^LX%RmN2q0 Ycy4A9FVZ~13zTN?boFyt=akR{01+Y(GXMYp literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_focused_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7c0599e3a6fcce1d9b22e47bfdb63afb1d3d9c02 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`6eo-U3d5>t~6?){p=$oZ!|i46oEul1LdSjZF4rt@IU_AhE`IYK8I wIB$ByaB<8!;4zVtCm{dd@wVRWcBu>u-xEd5&snyt0Gh?%>FVdQ&MBb@09FhvcK`qY literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_longpressed_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_longpressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf8e03623c94b68d31963ffe7e59c72c3dcc059 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`86o-U3d5>t~CW>mH@a{g&g;s7!l1y4Byva-KaJLVIiI)OpBYodjS ofJx&-C1HsL_x|*Yp0_#7zz}{&aC*>dO_0?Lp00i_>zopr00f~Zw*UYD literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6e77525d2dbbc1673145d60d775602c85264330d GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`6eo-U3d5>t~6?){p=$oZ!|i46oEul1LdSlBa@C*nY4{!0_J9HA2p woHspUxHx7V@R-QS6OjM!cw6swyHo~-e~lvMp^1B@1I=RaboFyt=akR{0Ay(_r~m)} literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6e77525d2dbbc1673145d60d775602c85264330d GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqEX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`6eo-U3d5>t~6?){p=$oZ!|i46oEul1LdSlBa@C*nY4{!0_J9HA2p woHspUxHx7V@R-QS6OjM!cw6swyHo~-e~lvMp^1B@1I=RaboFyt=akR{0Ay(_r~m)} literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..92da2f0dd3711a2ceb843768cafd6b91a2807b43 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^{6MVD!3HFkzrK_Oq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg#;uvX%d>fBtxy+SfFGJhTv9Z9>9n%%Tr7{oI+Q@DMao9hQt@O?p#8;eZd15IY| MboFyt=akR{068-?^#A|> literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__list_selector_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..42cb6463e4c28c6aeffa315c4fc869867dbb6b7c GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^{6MVD!3HFkzrK_Oq*#ibJVQ8upoSx*1IXtr@Q5sC zVBqcqVMg@oJyIHz9Y|%SiynA|kd)58s-{92FmHki*;@KxND!%;H%=F4ZU(n;yg$GVRgBd(s L{an^LB{Ts54)-;@ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__menu_dropdown_panel_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..460ec46eb0786706610e21ac9097de489cedfc33 GIT binary patch literal 651 zcmV;60(AX}P)!1&^00004b3#c}2nYxW zdZ_-Wf*5)VugS&t+23J}V*z%DOHb#W|`Z#l>;cJ*L_P;jGoKD8nX4Z`xH*Q>s zTvTl`b;%gqS1znaOc|u@tz3t7=|UK<9Hr>BJ|D1%4AOYzE>c>YASL1(e+Y^`_iG?7 z1UL~EK(|`0e*W#*UXt~C{TfUweyI5sSBLVgO?u)p&e9+4(C=i^T1GuQJ|j^LdEE0 zfZFjzm@Nd117_`XxKDqSoJXh_wG-}tW_yHE!!B|TSvyio<6k9eTgoG9O0aTdZJ81x zmbul8Z%fpkT#Wc{ND1L@No&VX#iPVF7hx`c0JdkE;3e2%ZBQYi%Oe#dj=&z+_I>|? zOJi$dCv)FoZJG3n&>Qp|;vSo*JOkf=A5uR{`;uV-QwsX>Ho!a31HXV*se5TxFFA=4 zo=3!%#5;D2+DO|6R;c8b^-B2j{s4XhZw!t1m&l3O!HmBwHn=!)kb6yF?kI1MVX*Vu z<6hz)DH{^YBPWDzO$|0isCW3@P>L98oO;C$E5=4jGEPjLS?XZ=13IvJLaC?O;nLn? z=e?6_T^b`&$N3sK+o1N3^-DyB&=+_N>geY)_rHdJwBJ%s{^4(_WBZ5MLQM53U4RfX laXn(LVYMe-Njr@(d;;;gyUim^Wn%yU002ovPDHLkV1m`SB-{W1 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__menu_dropdown_panel_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e84adf2d41604323cdad8b15e7034b6137e02425 GIT binary patch literal 720 zcmV;>0x$iEP)!1&^00004b3#c}2nYxW zd09!jyup9SJyH%;E_KZI5Ed^B*iNJmRSj zBG=jNc2B+cMg+dzb=~X>SwfDye{PH^oqQ4$1^~*55|NVv2=ckIR8XoEqC|oOgc2g; zEPA&fNb-^8#Mr1#v(VQn5UdVR@QAWs>EP1 zTHM9Zaim5tPqqk+y4R~ii**RWgPIHWkr2Q-rv~$oD_;OFg!*vQOJ?oR%RhjSvm}}N zU}~@)A@q_TOphE%y@J$^Y;2GXG*T-_?U?-%UNYKi5n>WcgjmBq)+~pV5UB*Fc4!_E zr<_OV^tE=(@|l_%K9#lBPBbeU!!Q72CYl{ozqWE(s>}kg*Xy-fB`%jskbX;(+jyxw zA`k(lb8|^3?6_RfL_?Is~gyeh`O%xX?U(f4nJ zaCd?*qxs3xYk`99o-U3d5>wYsbmTgqz{8?`Dg4L(`abqnuZs;wTVv8ZBg|GX^f4xE z5ck=nld$UVv7H|oR+P30etdkz&;0SSW2^3}yn7y4rozh{Dy3k((DE(NNCr<=KbLh* G2~7afj5MhL literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_bg_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__progress_bg_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..4bb22f0e10e621ef31f16100b3f682a09565c65d GIT binary patch literal 159 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 RY6Dcn;OXk;vd$@?2>^cl_{IPL literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..29aff4d43f71a025f464587ead52aff2ecae6a58 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^59s(?1)eUBAs(G?r*GssWFX)$e`(35Y8e@;SI4XCdOETn3puLX+U@Np z`{}{9$F@!!Tb4}GnD8m&^|D{1rP|_tuSV&+Z=MCoD&l+{? zpGeMToA<;$LF?@fW~rUl3#RU765DB+Fm*PQ+)k?pQ&%&Ye!A+gR)$OeeXHaR#_cxq xcQACD7BHRDw&oXmu9s(?g`O^sAs(G?r*GssWFX)$e`(35d_EZ~i&w|H<&_`ZD(+MedV5zj zu-#_I+lqbxCf!wDY`(!qq|2YPZ`s2sD|KqW({JG~4*WL+Cpx;A`7$XPF&b}JE9dda zdDh0P2cC5-%kKDDBus2)4y)97FmX3?+)izQiL;plcWMSG#q&-%rTF<%+zn>y2h*Mj yizj?!^E*(P`ureMOz-ZiFXWg1cX%y7!FpSm=AYI1UI{?QGI+ZBxvX9s(?*`6+rAs(G?r#o^TG7xZ`zf?Wo$i4qI|8=SuS_>z)W_YPj?%Q>u zIp@ANM{x}Zqe@#*i-Jc_;!9;KcT)!P=e8Z65pgErb%iKSkCNb@A?yTt$n@r z2c`IHF%KKu<@hR|E_CSLV|hUMOZy3b87rAYm)KaVUb9s(?*`6+rAs(G?r#o^TG7xZ`zf?Wo$i2t+|9e$2v=&Zo&G1s6+_&pQ zbIyHljz-QjH&*S{-J;(gu&3N>@$LMyenNedpai4+B)&;SOq0|eu$bkReVyxuhm-Z9>GFCF_99MaBsxVXw=u8GrS3j3^P6KmrqN>Fc^oQq;b>Mt0(a$ z!tgX@A7RK4{kGy^A3#w21maN-UfpV|U0)B)Mu)Zk(%$xiP)OBD#retJ&sicWsshEL!WHUI0Z}S=i2Rqw=-{<_oUlU4$I1(Vt^KG}@Sd2k4!kUV zp9d;G14UN$xn@Z2Tv!X1WCiPlZi?T5Wo`s>dMMw4?2=HB&MqLoAdzh3Gg0e200000 LNkvXXu0mjf#CNP@ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6536ee63329bb47bec2bf2384aa494923cc2773a GIT binary patch literal 424 zcmV;Z0ayNsP)Km%mHHKmbPH_0G1~QE(|Z z3L*$mIy*=P@!u2&!BHHFf;fuc0uio1*2@YRBct9{0AyU2}iGVkcWw7UUPW(q{Hz&m;6;CQrhm;h30w)z2(`W_Vv zws(S3@Pah`KM=_o2%_3&n+}O86bq(Ag>`_N^4m7drC>+{^&N;72|01L0Qm!AONf3s S@;8qF0000Km%VDkFce0=d)+vOWKIG} zhpvGvb*AhYN}o4m@H1o!d4o*tRBGZMkUCTWmkL{wB~SUlAntIEgw4Gc(!&*+NcHqe zdbonr;tjwaz@#r!B?pk5-j_#K1)p#z)*b-3QShBfQxGf+4==MNa*z{HXhG0C1P_4~ zh;-k(7eP#tUz1`!Wij$Dh)MD;xve&Fv5GXEp_kweUysY@i1cm8S?~wm($ky-rf?^L z4cuB_3%3%uz>Nj2a3et6#z@uGqTe`wK1>2-pyo{<@B~f=x)vOqS_S8F z{BbGcPm`Srko*>0TM51dS0?bbgq{a9*ucpHu=A!M^DM~~^Y@aViMI>L4{MrZFUa%^ Q4*&oF07*qoM6N<$f+pdR_W%F@ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__spinner_ab_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6de0ba8841d25f20f12e14002ecc4c9ec6a7b2f8 GIT binary patch literal 370 zcmV-&0ge8NP)Kmp@CxKpa3{epU;uAYD{w zoy1-2XXsG+d5c4J(@pInLg`pK=_I6J(k2d`5V?BE{Yj@j2pl)OcgK;0qd#7akgCKEJ@PeExDlrpx^Tf8?8gJ#K-Da<_nm z+&*9_w+lGPs|OtA)dC)JfQDKAb-?t#>nbk~ygr<>n4NOeOiNA8R)UE3F)|0PZr-`P z{wS3Lh~%_Rw1t=h$DO2-+|>0Ilo0LghZEP}j*Edw;7F{TKbM3p1iOHI0}cLp61dt? QIsgCw07*qoM6N<$f;wQ9<^TWy literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_focused_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c9972e74bb4fc7416960e238afd47b1ac363e316 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~!3HEJ|NhSh5-4`^4B-HR8jh3>AfL0qBeIx* zfx8og8O=|gUJDd7^K@|x;h4Gh+(zC520Y9MizoD2>~^~(JZa^V pUoEkkaeSh9w)TUlKa6vZ+qJ0**((%Vy8umK@O1TaS?83{1OR&wE2RJc literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..587337caf74f9ba3d32ba1c7cc8fb8b0b5ba245b GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~!3HEJ|NhSh5-4`^4B-HR8jh3>AfL0qBeIx* zfx8og8O=|gUJDeo^mK6y;h4Gh+(zC53JlB#xw8$}k`45e4cLk;e3y7!_%!uv(Z^d6 t0#9x~Qa^f(Id{#0H&;LIP<)f9-+fKc+F|3Yl|VxnJYD@<);T3K0RZ_tFJ}M% literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__tab_selected_pressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..155c4fc753ed43185b31df3bea2af1ea5b3e7482 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^EI`b~!3HEJ|NhSh5-4`^4B-HR8jh3>AfL0qBeIx* zfx8og8O=|gUJDeo@N{tu;h33haPQZY#>U2n_RP$O>mRT6my}r88lS< uMnfl1c4A|rBX^f%!~&s(1*$LFm>5oL2|PB@cz*+E5QC?ypUXO@geCw>u`ROz literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..081657ee7b828a74287d65d2f4644af9c7b55816 GIT binary patch literal 106 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQih%`jv*44lYjjGZ_jMS*7QH1 z$Cu9~IqOiSz?8?{Eo||(vKg$oJDqvb4v1Q5NJR27d@z6V;avVV1E6LGPgg&ebxsLQ E0ED?8Qvd(} literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3f312b465189caa47a7f8e4bc53c3222521e0bb1 GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQrey_jv*44lYjjGZ_jMS*7QH1 y$CppZQKez^S5>Et`mrVp3OWu(*tYT>W@HfhtG!C@Uj!>q8-u5-pUXO@geCyVL>!s` literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_default_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..b086fae8738227fc0b4f05171ded25ec1503e49d GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQU;zbjv*44lYjjGZ_jMS*7QH1 z$Cu9~IqOiSz{ak|8`Hl@9XRLoNT6Brf-|eO+cr*y`8p4HWnZ4T3DnEr>FVdQ&MBb@ E0JhyB4*&oF literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..73c336a77a9c908532b5b39098c22a878e0e87bf GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQktGFjv*44lYjjGZ_jMS*7QH1 w$CppZQANR3w^={dWI;j4L5+C_+aEG8Z2O~g(C$e@C{PoFr>mdKI;Vst0EP1$iU0rr literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_selected_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..726e0ff427cd175c9c3607e25352bd696a3152c1 GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQbwLGjv*44lYjjGZ_jMS*7QH1 z$CppT@G}o{phONwVb}j=LshAN!kv;Qt~79nzL7Xt$zT{YC1>l7eH(zf89ZJ6T-G@y GGywpjU?4sK literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_right_selected_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..726e0ff427cd175c9c3607e25352bd696a3152c1 GIT binary patch literal 107 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQbwLGjv*44lYjjGZ_jMS*7QH1 z$CppT@G}o{phONwVb}j=LshAN!kv;Qt~79nzL7Xt$zT{YC1>l7eH(zf89ZJ6T-G@y GGywpjU?4sK literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_selected_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1767c169eef03f3370b0f8e40f531dd481a9b82d GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQYM}*jv*44lYjjGZ_jMS*7QH1 z$CppT@G}o{phONw%V+tnLd~`l!OqNzXB@V%srV-z^vGhE?K{(iZ(fQrP(OpGtDnm{ Hr-UW|vZo$& literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-mdpi/abs__textfield_search_selected_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..1767c169eef03f3370b0f8e40f531dd481a9b82d GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CO!3HF4Hmy+sQYM}*jv*44lYjjGZ_jMS*7QH1 z$CppT@G}o{phONw%V+tnLd~`l!OqNzXB@V%srV-z^vGhE?K{(iZ(fQrP(OpGtDnm{ Hr-UW|vZo$& literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-v11/abs__progress_medium_holo.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-v11/abs__progress_medium_holo.xml new file mode 100644 index 0000000000..6bcbdb83f1 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-v11/abs__progress_medium_holo.xml @@ -0,0 +1,34 @@ + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_solid_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..575334699663b221b5a2b3251572a7c7a23ddb4a GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nET98VX=kc@k8Z|>$jV8FrZ@U7ta z-*T0WQ@><>I%v71J%hiqt0P@2{q!E)%~9Ermd_VC*s;IdoBnhS>rHk6>|lcSgpVF9 tjEp}SQ%vGx1w)$%c)I$ztaD0e0sua~Gttc^?peW`&R>iA3bc>G)78&qol`;+04`QPF8}}l literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_solid_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..8155fe840532e1d0fc25450729892ea73c4e007a GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETTu&Frkc@k8Z|>$jV8FrZ@J;?q zbcL8uwC8*^`8m#29p5Ib=%`p$wC&7oqt#odO)b{rdQv>$UUk^Hs0pFVdQ&MBb@0G6aYR{#J2 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_bottom_transparent_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fa4d76af93de31de153c6a7d41c05496bb14d2c0 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETcuyC{kc@k8Z*AmdP~c#3C@cDZ z^MXtGfey<_%m2nWx~HUtq@RtOD!V+x#J|ag^QD{sZZM%<(R`m!o+Hzd-iC%RO>bP0l+XkKAqp+G literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_share_pack_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9a70a5d1e3ad43f632287aff78d86289259099db GIT binary patch literal 2878 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 Xx&sG-cNbs*00000NkvXXu0mjfHD**$ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6622cbad34409b2e09f69e305455482ee107baa6 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETEKe85kc@k8FK-lVFc4sN{QB_B z&fog}EEk$2&*T)$|Ch61%h`96?xa8O-xitu^~t0=vn)PNZ(|U lO#br3!H&B!tiEU`L+e4N?emv^?*rP(;OXk;vd$@?2>`X4Gjad` literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c4272978338a232aa445ed5190abab61afcedb16 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETEKe85kc@k8FK^^+Fc4rl_yt@$W?82D^ReIqPjo#d{bLmpkiN+x lnf&F6gB^EeSbfn>hW*nwPPt#_849$O!PC{xWt~$(697sdG9dr} literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_solid_shadow_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d0df29d8b3fef9f71cda9b7a0975c68dcfb05685 GIT binary patch literal 290 zcmV+-0p0$IP)(^RAa&-b-qmfdL= zKY^DZ_=R_1v^+>Y{!mW=MF!v|2#Q>Q>z_&4i6T94j-Y4q`P>I~g?cE`S~^QhBCU5$ z-8a`dJ38hrt)qwm8XJx0+%VAuW=z7Jg@`1pBAUrf#Ef=wZl|UqH7RO)u1OwK(@xK~ zuV&5*5lN0GQV~igR!o15*n1TfDTP6ilQ72>QBJOyK^2jQYHlAzlrUMuFCtAA$s$=K oi)4{qME3aCu~lSF#Q4a(0o}otDK%H_Q2+n{07*qoM6N<$f*T@rc>n+a literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_solid_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a0d9c1b957ea4a6ce62abd120668610d0cb2bd96 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETEKe85kc@k8FK^^+Fc4rlxca~( z?t=fRa*SINS}wBuewp3mefy2x$=b4i8MC*B`RkorJG1!P69>HDUX#kpcm>9d6MZKb ky7}`x**qcrtNL{AY0h>p*ZiBQ0JN3C)78&qol`;+0O3wK)&Kwi literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_solid_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d36f99fecf223779432fb843b823c04d739f05cb GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETEKe85kc@k8FK-lVFc4sN{Ca;{ zvU;8e%Y`P%GdTtG|K%*$a`xS%JL%8+w?$@ueKP6JEX#C%J{El7iLS?_f2=|R(l=Qo klfOK1u;Z=_t1sHgP`H~Vw5GX>6KE@gr>mdKI;Vst03NU~l>h($ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_transparent_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..5ad475dc3f478734be31bc5763ff494e5f120914 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETR8JSjkc@k8Z!P3yFyvu&IDfHo z*MFzV3!h#&I<8{wJG6*7%`^0A*`zgvpO3}4Jy+2bzzZhGPxw0F1DlG16;n~mnRAu= eo1*Vq{$#i=98+;OAz%&ALIzJ)KbLh*2~7aXVK40f literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_stacked_transparent_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6ade5eeb37d8388813cee512f8adaad0f6c15397 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETcuyC{kc@k8FE8XhU?9M9Fk3-& z>Hkf73eN%?4n{M7dy#!$d2ZSCCv)eTUt5@6!ODmi{A7$QW>Hb7V|gN6#Q)yLqkTHN Y-hRf#&+ODnfL1Yhy85}Sb4q9e0PNo==Kufz literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_transparent_dark_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..719b9234df6fefc32c628a212141681df3414d85 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETB2O2`kc@k8Z(Za)puoZEAojv! z?q20mzFS+?F-&~oGw)ovvN+_p>pJvXn6S<7W@Fox#)9&t;ucLK6T;ku_WZ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ab_transparent_light_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6da264db26b5debc433e570e454f7ad596d3609c GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETbWaz@kc@k8Z*Aml2;gwNxP9_w z>q*543$-17oYd6QwPclDxvFIP6Y06uZ3-`2R5T~}Ha6e^YubHkRDB$o9=Xj@xc>Lb i$;LIUf5PjFDj6>?G+3v-_OK(+N(N6?KbLh*2~7a3Fg*4E literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..7ef2db75e273c3a4fa34a867d43714d47b67dfd9 GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqR!3HEvyN#v+DHBf@#}JFt$r%|L2@FmD6{OlE zCs-P=E^ay;FECBu-~a#X*$!!Fy;QT1l2!H>nDyu1;UEQuS2t(=%(&d{0o2dn>FVdQ I&MBb@0Ph$gIRF3v literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..2283b4c01f31c24c241101989a028a28e662ff2d GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqR!3HEvyN#v+DPvC;#}JFt$r%|L2@FmD6{OlE zCs-P=E^ay;FECA@!GWvmzw+t@{SPuqdTbmsKKbP0l+XkKVJ9JJ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_focused_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3c909b51306d684dc9fc4deb674ab1e1feb7004e GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqR!3HEvyN#xSIG!$!Ar_~TGcqy~7@GboNVOeo z`FL&lz5>PtO@Rj=>T@VLG&w|ZbqQ*{RI`whRrVK{_2=K=E+vL!&S{*=@1z8QW-xfV L`njxgN@xNAaNr>U literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..131d1030c9d5b447ef62fc8e336d9d3950ff7519 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqR!3HEvyN#v+DJxGG#}JFt$r%|L2@FmD6{Ok@ zwtT#{-1s4r1MA|Z!|?(x4J`lv|6k8`NJHzTnuV0CvcJHrKmQJQDKT8Re5&^Sxg#LM O7(8A5T-G@yGywoD=q9NE literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__btn_cab_done_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3e7dcdfdbaf66d51a90633e6f601bfe71b0c5069 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^tUzqR!3HEvyN#xSIG!$!Ar_~TGcqy~7@GboNVOeo z`FL%)@k1sD*2PVS;{{wASQ@v8h$x3#@+~m2a+{}M^7C)Is4GMKie-X3Pa7xz&0z3! L^>bP0l+XkKapWP} literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_bottom_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0bd09806f5c85ad3a33ec80c2a526e9dba34d1f3 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETTu&Frkc@k8uN>rTFyLXm;P>R{ z?#-o|?nQl9Ua&YVWQl+9{Kh9CkJo#*NAA>4+xPwD`<&mEu1}vZI664|W68WNxRjX* q7uY2C$wZnF2qKv(-xu6mlE@I5@4DcHNa}B(#SEUVelF{r5}E+w(lnv~ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__cab_background_bottom_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..43ed26d4784aa508b93551bdb0359b959bd2c91b GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nET3{Mxwkc@k8uUzCjV8Fq8;LR1* z*j37dP53cYgnN@8iE~W|ez(m3TTj;06C0 vR9@;$usQD^o~Q2-Eg&#Ke!|DE+S9qyz8u@<_Da1C=l}*!S3j3^P6YLYC-!V(AVEFG+v!>way|q9)89ZJ6T-G@yGywpFG&bP? literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__dialog_full_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..f4970ad1c3278235157ac72f71fc98f159fdc439 GIT binary patch literal 2159 zcmV-#2$1)QP)7pj*K04R=GS>IExgb+dqA%qY@2qDDdSi?}MdX75WMJ|ri_~yampZf~b zyDwJPzURp0aERFLx!K0Z6`{S(+b^7Rq0fZm(kDLm@P!|`&m~8kF)y`OQ+*6SLgj(n*c6WFZ`T<6tC6A%w8 z+L+Kg_>sWYRhaz=AtQLA^@LuUvKr4zS(=h&ATdHMd1uOv+V9M9YYe+zz%fKlM3B!~ zyq*EP{ZyC9dltDoQc<8ZrM^eE_Hte#g^dKR2>{;+o?xX#_XJ<6fcSW3 z(2+n3e1qrFpfvl1x~?#Fy4|E$M6lRgKuT?d8dD>b&VB465lv_ms575+OWy%#u@k+N zI%?Q+K~hGrT_7#|a=gF%@ZrOc@87@w`1bAFU(2$bW3Gd+|4`xmgT=9~$+>Rd`_AEe z?tAPdzh~^4zVA1WkB@)c-QE59<;$19v5OvFA}vv41E1cCHa5&@4N;9-`R?7jpWeKA z^Yg>QL%m+FvDt*4cRX_bt0?zBkB(K>DX%%#=N+5R(_-8y- zVb>j!?$Wbc5y%%}IfCs9*+@_USOKV3tJQDczI|KW-rgqvI6{s^UDwxjUH<~$ckEhw z$wzfwA%@V6dv=Zxn=8;sa(#b)ziOIh-@k{Dz1VCvD9chBW?(0HZ$3-*gQG?|lNRhy zsce!AuP~V46@dEg?(QVrAwo2L-=l3?V9=qSyONQk&Kv_~&Lf1nMm8E$0BV|mEX9~d zNP}Lf5}1xu21h4T$+9&-HQuut%PRmY8i6duXoOerBY}OxLGlJ5BU$zc%^yh8OvsW{ z7(^}+!OmYLNsSuWi7|-^5)oDyq5>gHA{u-eOKk`#f#=$OmM4_(@m{kC%_W5DAmmhR z=d>`52C;YCwuB;r{%j}Ebe_P7K+b^`h8A8*tydWpwYtuV2y(IKDEl%UBLZ0(i3V1m zfUn~Tp;05RlF3Ax+6Y;a8pF(Tjoo`iqE#Ca+!sAl5kbmO&cKL3&H*nkK%{gluy`-t zg(lV{G7z#PI)C*NX293=me{C~cPz9KvLxQ9W=NZ^Ugspsp|?>vp+=TQM}wGdXLXG{ zVi`Ci0$G}v=(F^hV}w+)Oe2t`iJ2g)`#yKX$5zN3ft&-L4rl3d-=WWF22RL{IarUJ z10V#?jlh->hk8-+(B={{f_KC0$_Y6UbF}H| z)iXk95=}<}9Szz&zBnPrq{TEU=*R&0y55rN8c7*TmhI~1gq#|$ON79_OO5CMyD7gV z9}@irgLxzpwBV#1S)NvH5*4HjnIZdKqfiE}-PZx=`o6zC@DCwmFGlT6G>P~~(uABG zK}Q3f7d(yIx@nqEUDtg*;O`-1HeJ_!ZJOp2fHih{)cJyq3PN^{5b9^?iHmLcxw*Od zt7)3gecv~S{b_{c(f57RG|lImo14Ed?FxBAs6Zqt*x!B;W5{pK*JF7#9(y&G-;L+K zAIl#wtZ4Xp+<&dElXaOZRbPeOuW5VVgIpFOP7$z(T3Yv~vHW)|AI5VJTZ64^6BEBSg#y zGM}I)%~}j17KiFDEnOcuUt#E@>0HCEcF3*~0j6Ce`xZm1O5Ih`IeuTN+ty1RWW4eh`~TOU@&BM)3MkQgMM@bdYm8B8c#1 z#@ViWE78D40!D<(#Tx`hXJ-KSDrqoae31hLi8 z$z>DjeP}^jBk1AK*j$2rhW(rzJ{2JYJMmiAitr^tE-^SXloO=ZTOgN*_a2ZHvyBd7 z1l@JghOv{s(P7lwc?A9CfSo}^z#H{B))n$biD&`>gkS9e;$0Z5~J8tXRDNuF002ovPDHLkV1mNB_TK;i literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__dialog_full_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..172fc3b5e3caf3357e706be2a1f0d91f357c8e5f GIT binary patch literal 2302 zcmV2ok^m97efLZMJ76bgmHN3TVPgynL1iZF^o zv0AMLkI|bD5@Z+S7;_RWD$X2Q#-Gi>; z=tN2`078B~PH0>efZ`B@1i||(&~g>qMGRTwTrQXXbnj39hPAQB*)bIg_=HbA_WGzO zR;yL=j9HSDjSEl*;KYv!A@o|O_=;IUA}l9+ObGitX|Dzg#M7mV*iktr2nZlVbl%^^ zH53Ym36TIhGR!|u7{3PC~!L=Y2z z32ZT8B;zY)i(nCqF!62X25hwu6@!!-aVKznAwf{$S4ay%(<6lhDJ|l}=KVE%xD;tO zjxokGV%Vil6ww-?fi&aiwtz1TI;KLw!36;9iSC?$w}w5ZTIo^H5hBZ^Apum+pFjWp*|TRqUSD7TX^iIhX;RaeQQ zE(9uq^MWzvYwRam(2Co38gn;jAmP?U& z&MGvUhjxmcRMYbSg3kR zZt4g}LPgLEq&hYm(J$si0u;4;IwvxY6?fp6l#|X8fH;pmq-q5ISi1H|(Ge;Lg>w@fkyi)P5d7;2~0$MDQ@!DE$`cg61AQt41xJiqTo9Dlsio7bTA}sD9BZvH#!%wZ zmJ%ND@1^DnZ%X(Ld?$$A6k0J~NE59ixD&!XX{j@~=b>7mwKZvxCyp*B)cAo?C*Y0% z?1kZeY?X^e-9W)XxdpU^5OahW`IAUpYa}@W?W5#&t4q8l2swcYLBS!VH7P;dBP@_? zQAk2?GdMjs_n0oBI`TV#(4X2ifxe2hDg*@upKxQ&K(mtAk|`HJPz)_1HaAZ&&GHf7 zsz6IO?f{EsSe^=LZJ-DtRGZRNi3)(P24xANDG)6Gj(#dNGOP_9D0K*+?F8HR`Nj#&1(CYoj<+oYNw{1t4Y0L^ri-RBp`1VD6hPVuR0IkNiMUb`EeV02O|F6c zauGd$;Lv5&C{!~b&}Udb7lOKhLPE$D=wt2>b>Q`^nt&r(EH@_=La)06a5Fwnfw+Sp z&{C)%=8X_pC077s0o1}imRwSiS1dcYq8ac~BtElCsZ+`Ul=zAmLOFfPAwvBY@Kn$$ zk{zOiq+$R>LAX{rQ>;#)$VHAb@IJ99w*HlMq6mNtA~I*7`@~Y7+@e^8prDZQ`Pk}@ zSYXq1DD{)3Sw!SFBRAo~AvKngUU3Lg#cu0$<^+@bU0;P_H1st~XDv}F6a(QX9$Rbi YKbh+rFQXz7g8%>k07*qoM6N<$g2q=E^8f$< literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_ab_back_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..8ded62fb7b6a27a86f7b532c9a2b5a4ae999d34c GIT binary patch literal 741 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE&~JOTTd6q5Rc^#N8xy%NgI}`eR{7o3SVw~oLF?DlhO#(rS&-V`^Q!s%)gPgzJD$(6 zlPX(2b^RHIj&o60rR$>g!|G>TRxtl*e|^4a{T&6ax|r;1#_KA};b_owfAXfrk8RFR$o&QDy{Vn>#x#sulW#~7Jq)- z)TH!~FS$Xsf0AE4joN$h`JQ|K8Rwjx@86b-rgDVb@NxHUL6S>yvXNP=t#&QB{TPb^Ah ka7@WhN>%X8O-xS>N=;0uEIgTN160J|>FVdQ&MBb@0GkggF#rGn literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_ab_back_holo_light.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_ab_back_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..517e9f72d0c8d28a22360ad5d73476c25fd4db33 GIT binary patch literal 661 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE0wix1Z>k4UOiAAEE)4(M`_JqL@;D1TB8!2v z2N=7Z%(epwmK8Xr18D^?ZvQoBE&~JOTu&Fr5Rcj%_$5Ae=jmr`i z3DvOQxBn=~BCIDR#iS^(^w0Zu6&JUPm!vIx7~`u}yzledo5s8M7#uS86ZssvI8sdD z&xg3?2M7HpA7}46mr}+fqP5gidGgVwQ1_}WN$aob&9(OVStj}6Xj_!ShugM~J~IZM zU$@KD($sJ1b4JGMs?Xp43SH*aH+p$-+40a@k*+<>G~DD-|-{tS&vG^x*%GGq=j0Y+3zJN#Vil?OA~@ zukBM`R53;FYi;h*X6Nv`Uq9z3iuI~5j`7&H`BAcUqjcZh^7x-d8^2$_pe40Fq;EPa z%hqE7x*0h;3a++#0KFc4?e_Zv*^k$mEo1DpzWsL9`(v*67M^+IpR-MVa>nHwC6*2c zw&pTkoOQ_aoMO7bofkh1@}JI}ZKA~9;BBq7`S!))DS4@K0yY}FSDK>kZ?)HK*JGG& z7n!~MQ}4z!!HZux9M^8s)pB{g?A$cwGrvCg`RlIwI(LVEXW4OK`|IMz?e(5Emfz@% z$^^!kYKdz^NlIc#s#S7PDv)9@GB7mMH89sTFbpv?wlXxZGBO2ntqcr|?>AgV(U6;; zl9^VCTZ2=RMLtl2B*=!~{Irtt#G+IN$CUh}R0Yr6#Prml)Wnp^!jq{sKt&9mu6{1- HoD!MOjfK$EgnR$;T z=N`Kp(hSrM@CU%evd=bf=-4w^bQmnuhmUH-jd<6WZ; zHl4_>Rk2U@t}L_t|AiwlQ891B3C|YS1B^O3M@oxo5*z)LB91b?+QOQX_r0yH)YX2= zvK_aW4}ZVF|MIp0)1X?{@CS{e_APBtKk;H~nV$PVB{N8HV+L1tOj6 z``KDz%d4l`HAyHPxAByb%b6xG^S8m<-YfXS7v>b+zlZNGcwheZcvv-P0dQ7=MviH9v^t)=yc559VF`j43j z_pMt2oAX|`goy_Fm~UMa9d%t_^^2qU)cXl;U0e%IRZSM> z>7Ksk_VioOmKv*1mN|c~ELg&~mMikt+LpAdYoES)QG3#uo404uV`0ytJ&!XS^rKz< zU6j9{ob*(;{k73gyQmwdmG2d+82l2_J(5-Z=Epp_^THpe+eb5HIvzUo?fW(va5{7P zd0GD0trC|9zjsRjleub%YeY#(Vo9o1a#1RfVlXl=G}JY)&^0g*F*LI>FtRc>2C}UT z3_|{Y+l-q7HAsSN2+mI{DNig)WpGT%PfAtr%uP&B Z4N6T+sVqF1Y6Dcn;OXk;vd$@?2>?&0tquSH literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_cab_done_holo_light.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_cab_done_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..bb19810bc2062509e4e4968099a359ad73818728 GIT binary patch literal 915 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfwTh{zxw0jNgl<&3j(^ zeD(x}!be9sh1LD$__>xwFX-mty1-MRJ?GVgBPRYo&#phmts!D?ltV3&FI%+a$=z1Z zV;YHl1iMSDgJ+|>#46F---v^ z=n46F|IdfFb=)S0I4Coo@!g}n4Nex)S*)#RZPN@k9D49tzo1o|L;8h-cSg(aGrNAg7qQ^lmAJNnY2BwD zmg$yB$_Kc(9`bFT@$ln4rdg7D8~IZ-f3I60`0mq%qw5167@Xn!BqR{_Lfuy~aYE2x zQ4_Q6{SU<2c z;lT8&TH+c}l9E`GYL#4+3Zxi}3=9o*4J>pG%tH*#tPG5-jE#Y8D+7a&|KB#FXvob^ z$xN$6(O_z2Y7RsY4Yp<(!9Wd?ARB`7(@M${i&7aJQ}UBi6+Ckj(^G>|6H_V+Po~-c P6)||a`njxgN@xNAiwS~- literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_clear_disabled.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_clear_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..e35c5f05efdaecd358f87fbaae543f8e5d5d0331 GIT binary patch literal 2531 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 WVgEmns=9(>1^{ytE8}V-6#hTCp0D=+ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_clear_search_api_disabled_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd7aeb2a63980f5c7459b96ae175b875f27add3 GIT binary patch literal 1315 zcmeAS@N?(olHy`uVBq!ia0vp^+91rq0wlddc6tLTrX+877l!}s{b%+Ad7K3vk;OpT z1B~5HX4`=T%L*LRfizez1K-K5QyCaov^`xMLp+YZo#ve{ohs5cKmXZmZ>G$w-JO@O z_$Dncy|l#DX=;KaYmSzf&V&g+I5)gx(wb5qs1h)7!mfsR25uDCBNMaEYi!b%Lx%#0Z>6%}_Ke;bM=$-hufo^&&725YD$vGBuUKV?<1 zW5r*8XXtLO5$#WZeo|;mb85TEyq_Keb3$U;>HYFK{YX}hy1N)ld|`iZ8c+f zaW}0jS<%V*aZgCBwd%4 z`mTTDHix9d^392b?Js?F`)aOklAwYhQ$?F@yb$ytH>J_Jb{Z~vrG;$w0s zy7gpFZTnjBVEMK z?u*UK{&)=cU7rs=ddas!yNA5%MN;fAeO3GpiZ3y(^OR`LtKE&RYG` z%T6M0Q((r64h>88-;=&fKXORn&)Y9<7j0ADM4op#Evb9DEVE3OxuAOMwTp8T79Bpj z^46Bw7ia(6t$e=h^6Gq+^)tU-Y>!_fu&_#YcJ0QCjvJ3m`|4emd(8LrvxuLIduy^w zKRn;Ob&-9_RrP6hYo5j|+EK9n+eN__H(s3nbj~C7+}RUuX{m{weGosZ*S#`Yezasg(E; z?-{fhY+_DS&eu;5`_fikR9#fupz-tEU2!F+6F=1F&8oh6DP7e>i}j<0lm5=$VtqvCS7PaJ&waLQ0xVeA<2r9FV_>h2sIGsVSbJsf1ID=TJ5=|I z&X8~@c`+{`NhyHi(Rj}}j=t-itc?USbMMp?m=EB?(?e-29Zxv`X9>CKeyCDB6UQN6rr@v)_sLiS3~Qp ztEzq2)O|!<>xiRNElR1gi&m6P`)xn$hne5Zy#N2rd-GvpEU{+CMPx+)0Kjn+5^l}o zg&!d#$jfNkdNdFGu4pqj;P63GZxgQ*_CY#Oc|`sUQ?}=CKZgE3#v~qpdI6&Bx^w_Q zunGk?wncWWW;l7-UI#@tQM0)~HL81;)HPu;pVQ0pgJQPrfpMpp=aU0}M<~a{2nw%n zU`-fLR8Od%K$J#9U{=UTI40i8@}fD@+Oa6N|E1RI6sbQ)pL!RfOePt0E*?-w>vc`F zFLoR~H8O{D0Fhbf&d=`-+1DWWi~EgA3{w%CBurf@x&z#)AS%CTjBJ;NXfEz(-q*!r&D zRZs9Vt%N#~h`fZ2dF&WAUxzdNEE zLcQ7z)<&U)d{TxG*7ZfZU%dui_e8AOG#Zu1*(e!@&OEmtgjVAmsh>Px!}hna+U*4u z-(P@*kBOd~_&ckM8!+$m47a*D-IZ(wJ}aDF{e;O>YW!u636JA2%GNI#9Kc(nk+Ttf zZ5oR_VO!WXDMZ#m`6;XjkCv`_D6eahzuUOoqFaafSiYTac<;TmC>LuaHD30rCoEXh zD5R1Oih#JsO2+Mq%9NFu7{5RCprvtcFS~~}?Jc*n#%9=R+B~=%4@*03!EPJP0MrnJ8N%7FfRW&1jKLlO`E6 z2Nzeo&ri0;XG#nsf-QzGDH@1K!SO+oQz;nwgfHIg%HhTbyKTOO$NB{~co(lFCB3>E zA&~-M`}RVuy48f;Y-C?8l|c;|{QHGA&~=s7pAt2h>u zaS=yuntEie>)yAC_-npL!3zTFzOgLKZ}$=3sW+~_Ul7!!J>-L1jXDCh?L;zNtpzrIp_ZRL}JEMXYA5@jiafE19#aIkmj zpOVnI=5TB*VZwzSHn(G2*x&nZOKW`I9?Av!cNOvbi#$Fwg7v#&)Ar=Xmc9st_ZL_3 z{@58B!k$KOp%D%6encJsnot-_4XUH2sc#F@HGpawXltoKc?EQiVmJC91DQf_cccHm zAysqDoo4|5*kD6(qXoG55dp>oiYrkGMRp+(t%)uKx-Xk($P)oj2rRtP1Q-4<4m6z) literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_go.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_go.png new file mode 100644 index 0000000000000000000000000000000000000000..1e2dcfa02057f16f9f89e31fada93991c4eb9ab6 GIT binary patch literal 1983 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a92fb1d4af622cfad770d7c494121719a7896e61 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=d7dtgAr-gYUQ-leFyLX@@b&p` z%gbN)&SLHDYV<0q^J4_6fq?|&@*V6j4#NRakTDF}Z~@#RP$drMna{J{ZM0wU(H|t@ M>FVdQ&MBb@0L8N*<^TWy literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_moreoverflow_normal_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..930ca8d95e8bee5a1240fba645d9dab919abd734 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=^`0({Ar-gYUf;;epuoZ6aJO@& z%&D0-IKvGL&8p&qV;O7KuliPO1yl(K>(rHwor_8Hg9|Y9Gj8!^hz0Vk4~QZ}ABcvv nF)(akj$uTI?LshtEWgbR4Rf6*RPme*0Ev6L`njxgN@xNAEX^ml literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_share_holo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..45a0f1da0d01b7c0ba53830285c67d629bd0774a GIT binary patch literal 699 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU~2MoaSW-r^>)^McjrWjeSoS8SCOEBs|%|?VJ7D=T9Yz_dLJ8 zJ9zK=&-=vhubx}{vF6<8-!m`2Et8%6G=f2_fi-~)r;kY>>MAgRkm@i7CT&PKJ^T(I*&Av>d6O5U0r~;hkX|;LrY6t%e!5sze0;lgN zzhmA1v9d1mdTWRDgJXqP4j5dhQr@DSSRpJN-*(9Bjp4$N@%tt%vt{r<#9TCmVT&q5 zPY_dpf5x8W&TrHi1EzgwuzL61gP~v}`*h7_ev9YX^%66WzmeOz)Rwd1sPzfWyZX+; ziqW^(w(Z~haJj|{8OsISSA~|G@%CQ8Y_d#7=yl$KAFm&t%#H|W$kcQ2;yBguIO76W zkG?He)AQ@KipLqRU6Nb%FPk$;xS@jW=|$x{C80dl?QT)`*~FQi^@N=fie6YGbN2D| z=`W4NG-chmgqp9bsxquQQuyVroI59@gwb7QnV5NMi~&p85J-Uv+l!N+#T%5W;<7yr4}f9Ow$JGA?da_{7}kE@t}@ET5LG{B2CIDTQC8`Twj U_qmZcFi|piy85}Sb4q9e0Mf@O?f?J) literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_menu_share_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..528e554abe239137182dd9069d1fa4ba02a109a1 GIT binary patch literal 935 zcmV;Y16cftP)=+L@6RIMT%_@p^A^X5UDRjLANf13Pq%);A`Pd+=!;23pXx; zAif`nPef)@LW&ftmV!!=U?`shr5Kn0)zPywg_Q~)Xf6@UsrA5Be7{a=6EByPs``206cpncnr4<@!q@mA~gUzaA3%HTX+%kDFHYT5Qf!vm`Me|1djAs_x*GR z&!z%kGhWI$<|3X<1;9qUl5@-=4yFR&S{y_@$C%@oE<1op+>aXzjC~!)$_ii$_F+%K z@y9V;#ya3q+!Mu4ce-D|$M^yJarJ;X=I|E&DieT9a7UE58@rw_;mfG%mg3n4+>X7G zDINV8W$>{wd4UPs8tHyn<_K%Vx4t-F{HB0#CbHyT8aIH=*w&T4zhI%?@Yvw4$UHw9 zfiH|AwZ;Wt3m(R<9MXfe~y?7+&yyx)=z7N}~%m5B!YmPaWaH#7@Q+5E; zIqP##(=Vn1;7AlEd2}e2K@tF-TcIq?su`V~Rw@AYX?JP!=ya5wR`qE`V>4fQR+^F$GWKC7sT4IxUFgD9>&BxJs0#D$E0dq8B&$(De03B_O{zBGgT!>|}k{a55 z!O~xj?u?9>EHL(EoJ!?lWDg$AX}pf&%~Sx?@v3~6qvvqAx*Saezy`dwo-+WR!8JMF zpTip|0k{c|kLwhu)oQ!f;y+34?@=W6(zkfKXdO_i)poDN4CtH&58$o=8{em4rdmY+ zbb?>20J>f0o#8w;#fEn(4AdV*y+C*HYaPJI-C#EObp@bT@IwJeLH&YX7XStYpFDt- zf=?R2Fu^AaVA$Z31du2AoO(cqH+@Lz(5e*i5O+3-*HCUO7(002ov JPDHLkV1h8vxv&5L literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_search.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_search.png new file mode 100644 index 0000000000000000000000000000000000000000..998f91be9c4dff50a3ac354a3810a2afe39fe32b GIT binary patch literal 3784 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 Z$DPpsU&xgE;c;3340Mc9_1aGO{{Rgi%2xmY literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_search_api_holo_light.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__ic_search_api_holo_light.png new file mode 100644 index 0000000000000000000000000000000000000000..a4cdf1c7927896d70e6b9f6af2eaa64b1bb41707 GIT binary patch literal 3037 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 S!l#~*4goMWSah`&G3sAAl9aOm literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_activated_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_activated_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..eda10e6123e1e1383c4617228ec0c96680d60dc7 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8wRq zxI00Z(fs7;wLn1!PZ!4!jfu$#Gb-B{xqtMx1s*(O%+nLV7IxRdaaX6Iu&3070|zpW ye6d-ZyJWwc+pgOl@x443T>9p%`1p8cx&%YrImy|zOvgZGF?hQAxvX30u5yFboFyt=akR{ E00Z(eO#lD@ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_longpressed_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_longpressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..eda10e6123e1e1383c4617228ec0c96680d60dc7 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8wRq zxI00Z(fs7;wLn1!PZ!4!jfu$#Gb-B{xqtMx1s*(O%+nLV7IxRdaaX6Iu&3070|zpW ye6d-ZyJWwc+pgOl@x443T>9p%`1p8cx&%YrImy|zOvgZGF?hQAxvX literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e4b33935a3aa4f1af3fa9e9e199b5c47d43f4b74 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamSQK*5Dp-y;YjHK@;M7UB8wRq zxI00Z(fs7;wLn2vPZ!4!jfu$y_kK-b literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__list_selector_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..88726b69160589c8545759440e8d4e69dc984c67 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^azGr$!3HF6SgS1tQk(@Ik;M!Q+?^oIXnykaTA*No zr;B4qM&sKXhJ1$tcw7#es=J@sd2yMiyW@jyg@u(=2qh%>1r1WJE1Ls*cJ{|veUO|(2?8OR-p?Vt(<)KXNk*dJ1<_`!jRpab6RMK;Rk47fDU#NEX#7yk4(~&Fr}L7DZp)K} zK)DDZgb+dqA%qY@2q7)3S*px^wsY!a9l?~jW2$HoDfOAoDc4?$q=mJH$Q@HesW|pH zEqI5t5pt#=^`ykNb$bDA+g_!6r>E#0Ebxb)V~E)@66{HSu%o+0#^7QK=<56_<*0g z4?VWXMFRkJB8s~XX6q}?LEeWW=Ef--P!X+fp` zQ#hbt=1@CWv@?Vrj0n$wG-wfB>s2&!$QdDJ0ulZgw-cuRiR{Y>^Hj3K6cvDZyr8vA z8lxp5*y$r9!v6G_XAF7`2PhmT)XW;J_(x39;8bKfgMu`e! zU+jWXwIOOF0-q>8C*JQsY~7_bBCuA z|Ap1-2&vJi9g(t&*dI@qVtrbEm_q)8uxlUymW^N&DQrSTF2REQdw9B(B*Fk-L?96w zfdFVX0=tCgq*<4>5rKwy4p!?>V+1b~mqyqhPm^M8N}pNlWK7Aa(;L|rtB1{dT%;u; z=)dm(?jeLfE6zhUB!2hW01y9MdY)1v=ujhBx3b+Xm&>Pd9KV)clx)K|j$bdA%O^}( zPFj=H`w_B~E-2}`eIdjBd_I2}hT(GvVW{|jkQIawhG7^!pU>wnc#H_%SRreOrJP6k z#f!~#`~_1^!^gPqw^)9R`+vop3DslHn(o!PiI0dTt@|45Za=)m1`%IwEW{fV$LVaF zE9RVsAMaWMjZlg;f(R_4iy{7r`=s=`3SdP<&^M)TPHqgUw5?z25;3$902*NlyMU*S zpa+j$RH$BIEX`7~H`b|A%pl=Pj|o!QHv-L&MvImjnCmfv9y@5Gq|A_|G$L4MNvqdg zg%(@J38}FG4N!(%uhEggMhM*%9HY#I^l zO-Wr$p$z~$ref=30GgqO)XJdORd}!BEq>NeB8p9{v^kJo2|NxCQwf^HCpGf6X;Wp4 zg!hgmb$FtdtQ>ASMriqL^@|$FBEhNWjw@zMktp~+Gzo9nO1w>OhBUKE#}ER(1L)vD UI+1b(O8@`>07*qoM6N<$f~tseq5uE@ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__menu_dropdown_panel_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..93066c8403ddaac9b19571152ef499620bcc0e02 GIT binary patch literal 1551 zcmV+q2JrcbP)ZMyJc+a5x+ehm5NR9U3;9%`Hyz-(tJnPJWK72_ZxFO$7HJ!wl=MA(TM` z5z;&LLlB#EA&f^$3`&>pe6X)LdJ&`vfROKm-xd+jMbSqLMZ|438|}{L$EEgM9M^%w zHa{i`W4qmEM~t#0eOdu-0W1NOh@<%YUknyuBI#0I?3#!O*zRI&T@|+kOaOda%IhNv zM;99T5trXGZJ+ZJPec%b)$c$hhFbzf1btKUoQ@WxJHBtqt%Djjh@==IkkXLZmr_R= zETUs(|D2YHL30h7B}jQ1@s(0WN*y++$>%9Px0_7;Q^61da}ymGVa5oGC6I`(Se|An zXj@SBzbdSFK)Um(Fw#d8Mr2~>phE(63xW_TA*G~C`G7107k~`S4FDISDe;mJcscGO zI_^QW2+SjBmZ1U=9v>gytZ(L+77q^(-%!w_2qCD0PZix`L1IaO$h(b>d0@F@G3Eaa zi55W^GL}q#AgNiNjxa=>FZdR(r+ zxE>NCSff^sd0^fBMHn)m#E-cU=7+{dF-K!9f{S1|kOWYSoDj6e26s~&lfViRc^MJj z^>Y9iF9eSfmVwbcxJ7UPa3MH8F;)otZ%)TN7|p{_AvpQV#UO5SLMWM?>!O$+C0vaD z8(N!X1GsBg3ar^sKmkXku0dO*!9}nfXnYiL)Hg=pYKs73(^zvc9aG}t;{#B5>C;Y2 z2$?l`wfXukgc)%>9s%7AsDyH^rRNDOAHyeHMgYzG`@1jfJOi4h!RzZQK)65|cOA0& z28%R3H(uBEzOL&YU%_z=>~=fscDp^gsmfTk*1@j+TejVzGC zpG{n`bp4r^(iKT*Io^&x%OHc_WZd_EkhCG`k)*sFZ|A&V23>!#)HToxrIRJ-1q1Q~ z3qHxB_z~+bgihSWK3otqlC9O%9BoMC(eAot5j0oOB3|pwbjUE4*ONZd@_Kxq z*B8(0XhE_FfV`ZZwcn~gXn8&5;sQ&h03_lPHzc@QD2L`A0DB!p$qE$r97Hn6cmgfM z$;^GEI@&qEx+o;VEJ0ZAK#dKOL6F|xU|IwgE6|`&x_D{{k^myy5)6fQcS{yR>LIlD zb0eL(UISu`k;Dp-=L_3_9uII4xG36?ZZ5uUxd1Up2yq&z=dNHjN&oIh<{D_CLJUbUG4w?002ovPDHLkV1n`$ Bwt@fv literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_bg_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..345f5d3067c1b5a2b13f7234238468e8083e75e8 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^Ahr?*8<0#p>+uXou@pObhHwBu4M$1`kk47*5n0T@ zz}*SLjOHg#uLTMQc)B=-SoFS~;>gutz{8S$H2ll||1$b2>+ab^8r zChoU9-sVBr1cr+EHAcpdxgPN?*fw!WN@w!F_di=AUe22-xp-2_jNr43yl#?i1$i|o QK(iS+uXou@pObhHwBu4M$1`kk47*5n0T@ zz}*SLjOHg#uLTPFdAc};SoFS~;>gutz{8S$^!?BO&wHlFT~V_1=)TZ8!I{mdT_A)Z zztl5%UbEjFE&+!7%~#Kq{9)d)y{;#I@4EEH*bSem)2!T7Pp)1*OL*gdvC7^*b6)~Y OX7F_Nb6Mw<&;$Uil{z^9 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_primary_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..c6c3f1ec248835c16ee8a8f9d253769ea4196468 GIT binary patch literal 1309 zcmV+&1>*XNP)>2T29Hys?P&Vm zZA9*OOSNlf`Pu!y*8AUEO|D+e=9Pi3BR)agfw#}SukU>S5_JQH{fFX7qt#y26-7>F z^lg#%AL~){ay($Vl%dNK|ns=8F95J5u4IuT)_iO}FO5AO!x2YA-ev{((MiCMb95Z27y1N{d~<$0ZOiAzT-4$^Y~d8=D&GctVLiOE-HZCX=>916 zaB}eD93BUF6!cN|FY@&i`W7!}IIL?H*U-;b(9ZeC>T4fo-D~%;%Al$SM;o1{CK^c@ zLsL?U%;F5uW`mKV6p@jG8Wm~81rvcAg~E0r38^#=q@={j6{7*N{-mRal zZyi757l1u@+(UUVUpKQfbx4*^AEZ`NBGTk&djR!;W=;+8vR!2ZvkZUiF_Uw;@^@UHY_tFNo|bZ|HqK}~Z_0kB z>1@!nFOf~^{KOi&lvG5Os4i`3m5LaZ>S{(}C2cS_3u25qx+GSC0x^F*mC<6C%zjX} z`(@Gi@=yT|C0D;bu>bAn+W30Hh5ZfH4VVpRc=$wP71`a_ciV~TTQkNXRQHQat7toU zZx*3Z?Q~QYQO|ZUR_Tl#qXtzIiPWWo(#}&aV(i6KuEST$lYVRUVscgaEz?@VCh+@z zYdAdahv=OS&fP(?9$16?`l0%F3gfnP`B71?hw4@2e4pjZouU=>X|R*`N-YD-DJj}uU$#5 zV>X}RzD~bXHhFf?KK=4JTCWrMiS*`U`G2n9l*Y@cp7B$uQwuKJNIF$*XNP)>2T29Hys?P&Vm zZA9*OOSNlf`Pu!y*8AUEO|D+e=9Pi3BR)agfw#}SukU>S5_JQH{fFX7qt#y26-7>F z^lg#%AL~){ay($Vl%dNK|ns=8F95J5u4IuT)_iO}FO5AO!x2YA-ev{((MiCMb95Z27y1N{d~<$0ZOiAzT-4$^Y~d8=D&GctVLiOE-HZCX=>916 zaB}eD93BUF6!cN|FY@&i`W7!}IIL?H*U-;b(9ZeC>T4fo-D~%;%Al$SM;o1{CK^c@ zLsL?U%;F5uW`mKV6p@jG8Wm~81rvcAg~E0r38^#=q@={j6{7*N{-mRal zZyi757l1u@+(UUVUpKQfbx4*^AEZ`NBGTk&djR!;W=;+8vR!2ZvkZUiF_Uw;@^@UHY_tFNo|bZ|HqK}~Z_0kB z>1@!nFOf~^{KOi&lvG5Os4i`3m5LaZ>S{(}C2cS_3u25qx+GSC0x^F*mC<6C%zjX} z`(@Gi@=yT|C0D;bu>bAn+W30Hh5ZfH4VVpRc=$wP71`a_ciV~TTQkNXRQHQat7toU zZx*3Z?Q~QYQO|ZUR_Tl#qXtzIiPWWo(#}&aV(i6KuEST$lYVRUVscgaEz?@VCh+@z zYdAdahv=OS&fP(?9$16?`l0%F3gfnP`B71?hw4@2e4pjZouU=>X|R*`N-YD-DJj}uU$#5 zV>X}RzD~bXHhFf?KK=4JTCWrMiS*`U`G2n9l*Y@cp7B$uQwuKJNIF$+uXou@pObhHwBu4M$1`kk47*5n0T@ zz}*SLjOHg#uLTN5dAc};So9|U`2XLYnVI=;y-5$#f-D2o4GsT&Tr`prfMCHsr=)`p zy9zZlQWAk&gL|Kjh|gcN+0MxMkn!S`=@A+#%ic(Om>d23|9^ht#EF9It^fc3f1ZP3 Y!dJ=4-o~HPfwnMsy85}Sb4q9e06h#o+yDRo literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__progress_secondary_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..205b66e2cdef686c5ed6369b14e64b38d0182984 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^Ahr?*8<0#p>+uXou@pObhHwBu4M$1`kk47*5n0T@ zz}*SLjOHg#uLTN5dAc};So9|U`2XLYnVI=;y-5$#f-D2o4GsT&Tr`prfMCHsr=)`p zy9zZlQWAk&gL|Kjh|gcN+0MxMkn!S`=@A+#%ic(Om>d23|9^ht#EF9It^fc3f1ZP3 Y!dJ=4-o~HPfwnMsy85}Sb4q9e06h#o+yDRo literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_48_inner_holo.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_48_inner_holo.png new file mode 100644 index 0000000000000000000000000000000000000000..19517c4b0aee1010c7041a76089fdfdbfa495e80 GIT binary patch literal 2769 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d8929fcd1864e92c78f24d34bb07ac0304bf5ebe GIT binary patch literal 395 zcmV;60d)R}P)%)khMb;v@5Yo)-?A$vWI3J{&4Tqm)VM&;#i3-!rXQ;}}A|kSK_xLoQ9!D=| zrQuRX_jo!D&!*woG(4MzXVdU(8lG)+!_Dl;%pOYTRyEwrUVwMtwRCnh!_9059DxJy zTsprAUsT~zdJlX8e>K+(FMd_}2<&RF8#?@^bn(8vHtbfpl-_eLJ!>=!D!!z&OE12( zv`a1CqqIva-mA1rDc-ZR3oqWgvUXO(tc zif5K~i;HKMc8iLSDD9eyk1Fk&iksP%L8V=5@ekmQ^NVfO%k2z5z^Qbob@&(X-FR)u p3HS~A?&0(Ut%!)oJooy?_kZokYAURbJh}h?002ovPDHLkV1n7-uz&yn literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9174c4e4bc984a89e1ed643bc66b1569466ef52b GIT binary patch literal 394 zcmV;50d@X~P)pS_@$ zhD#gW|+S$zvH?tjZ06u}I z+WCj@MGelS_rM46*K*DD;uob4z^?VWsl%^ISMTdf({7b>={={?i$=qw;%iE~^x|tv zyVT+%O1re;qe{D!;v-AD@ZzIOyU^khrCnI@sM0Q^cw}ieym)kJH?(+0X*aBRR%th+ zcxGw0x_EYJx2pJz(yqJstkSNlxS72&skG}Y{tg(Y7u%+n+Xa4rW9?Ay@Gs!I^V*st o@Ei2q)9D9V5fPDPZuO7v|4Ms3SH1lZVgLXD07*qoM6N<$f(F>P&Hw-a literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..3015d307088f12d52a9e99ff4575fd2153127e5b GIT binary patch literal 381 zcmV-@0fPRCP)hG*08Y#N?T!?S64w!;lKvy+*1?>p3RGdlx#190x$dzj&7b^-9QUftoB@I?dG z(l;!l|3;oEFaA*ajtwD8hd-6>9*;+5M`bO2!%}+FXrQS0p3;u)|QJUO}XO$+G;+dssck%4fw5xbU zX__uxRhp)XSC*#P;_m>iSbo@k`^^CW{9xcU{p|2h0AG{O_A~&$L7!btFK9(XM7DX= bKfeD1Etg?&Fp}qT00000NkvXXu0mjfW#pxI literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_disabled_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..126637d1194f1d6609787774fb140818eaa4ba1f GIT binary patch literal 381 zcmV-@0fPRCP)hG*08Y#N?T!?S64w!;lKvy+*1?>p3RGdlx#190x$dzj&7b^-9QUftoB@I?dG z(l;!l|3;oEFaA*ajtwD8hd-6>9*;+5M`bO2!%}+FXrQS0p3;u)|QJUO}XO$+G;+dssck%4fw5xbU zX__uxRhp)XSC*#P;_m>iSbo@k`^^CW{9xcU{p|2h0AG{O_A~&$L7!btFK9(XM7DX= bKfeD1iaRu(IeFS@00000NkvXXu0mjfR7Ip< literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_focused_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d45c7a864d9b36fc5d06ef7650bd22c228e3533e GIT binary patch literal 680 zcmV;Z0$2TsP)JMg@Fn128fNR{httc z2n-9ae~A~-WYQOAyjJ3`v+tFS>H?h>cjZI44!YCDJ4vU-UH-NFC!H?dNqTY9^x~%J z#ZA+To2C~xO)qX5=ft;__PrJUYC9#q>!rbyQFMFHPb=3hoe|&n)9~p|baWUbMthlMtLL6k^E5&wx9H zfkWKo4DxGy27JSv%4KLW#~I|sPnXY+fCHfNj(}ks%-+uyBgtHbMG(R)| O00009q_DOpcx|jv*P1Z)f>u3p>g<+)ulGcHZsoOUd0`v$ideb3Xs*rv6J! zg}R0?Ejbavstni13%M+(h~#=Y?=G{+sY|c-R?LyC;M~J_EGz53I-4BR z+cU4@A4T%4{LQ{7{nooe_R?;9Ufq56+wp;!Z_W|LdHU^V zuiix!E)rt*mg%eid+||lw)K3kxzR2XQeoHKTo0e>Tz_Z7KF;I+KDl^G6{a%9AKj}v z@Aq1v55LRoZXbD)<16^lF!*Li$^7}+)mu{zFEMCaSs}k;w&aatvA+!FKCV6>P_Fen z(L?roLe!sxPkWei7+T9&rtD<0W7^%ZdcE}hdZyQpKhHVIBAEwFVGN$GelF{r5}E)^ Cjyh@p literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb34d7f60401a563454c03e266cc5181d9de996 GIT binary patch literal 609 zcmV-n0-pVeP)%5ec8;(Nh#y0Zthco9&fD+Scz(J_kqCSd>@N)Jrb#iJx@ z@geV)|0U|;Q8J4AW)%0$DDIn4+&81RZ$@$73{E^#CTa6Odr;zqGLyGk)zfLB)26Y5 z5#LU9dOW?JALQjc$4r{WH?GVFg))<)qMW_Ts@W~*Hgkd(m(u%LwVNxGwVfAK{BG$~ zHD4Zg33jP$CptYU%GrKa?RJ%hK*cvHEqE`!X=%Z0aT}!tZ^dnu7Q7Uk{&1!u)wl@^>7cUfAnUfgwQ!D?|Ir3GuneU%oh6!%$L*todw(!xf?LzEVJ7Y|ih z=v92GOd6`R(5v{nqI~u|T|T)5eQi`_Q>fI*QllCl)AthpQf>YCTIE0c%xyxW%x|6C zG>z*e{-?!>T@(EFL|;a6&!||%qb(l4cp2298zt1@mjOk(atXEgIq-{NzY%9xIi5qk vb6%{!-vcjz*7vDBaRYn@J|M2KzWDwRiVUw(_ikNA00000NkvXXu0mjfOP&sp literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__spinner_ab_pressed_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..82f752fdc28390f1dae188e66886f9fee783b4f7 GIT binary patch literal 602 zcmV-g0;TXoV&|>P?2N3a|H=XkIpb%g2C{mUcD8z%K5!WW71`A3B@}P?c zNzmeTUM-&`=;A@rh-=e`Ytx8p(}-)+h-=e`Yg0e*Nfwct-zMuNo?gfN+FNCOm6(Rs zNBrh8;rK_F^Mfu~8k>e2?@WdCI_7lHVR+IZj_>A~;=j0*zBpPVOJB@8&9C^w(v!^i zcs#`4qjGbZa60I4akN%e8hjOBptPW0e8JL!ZgC5x1-;^yN((y0EtVGC7q?tma9i9# zX~A7_N2LWf#T}Lw>=$=jTCiJOp|oJHxKe4sPI1N3!s5l1OACt?_fT4>Uffe@p<40r zRpP6(P_6jSy?2bx-x9}n#O>6o(Q^BiC^BxWR1^RB?JvEr|0>Nj5k)!eSD9&8HSzXK z2sbij-vth4?P;pL%~0mos(Tg<|DAn;kcS obzts&Y9%t@53qx{hWg?AJqc6disFjI`v3p{07*qoM6N<$f`4nJ zaCd?*qxs3xYk`8Mo-U3d5>t~6?){q5*x2~c-pCBZ5@_=ERFyG literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_selected_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_selected_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e4229f26b2771d884934b80d0056b8dd66d10edd GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol;0U|59*B=E^EX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`8+o-U3d5>t~6?){q5*x2~c-l(n1@K5>ymj5$1a2Oc?!34d7Ck`Aq skg(^gW|wXH-lZoEvTk@AJm}J3sQWAGentL}KF}BjPgg&ebxsLQ0KFYBT>t<8 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__tab_selected_pressed_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..e862cb12154541c150fb2d9bb98872bcff506317 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^Y(Ol;0U|59*B=E^EX7WqAsj$Z!;#Vf4nJ zaCd?*qxs3xYk`8Mo-U3d5>t~6?){q5*x2~c-pCBZ5m8aUV+M1MLNsm8aUV+8udAXlQhooEaFu)>JVsC;_i|1;&qn1z`CMwWxmD@8>XG@5j{z4 Z4Ch(42+t_Fa};PGgQu&X%Q~loCICWDCD8x? literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_default_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..98f4871bb52aa7c60414b62dc102a63025d14b86 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{e!3HEJoIX|yq+C2*978nDC;#~W-=0~Khvol7 z1H)I2CW)>m8aUVm(v1b%el;0fY!m7fYzsPhAkg_?o6!P}0Ord_0t$qVOiDg+P{Wat YL8LkPQkkjERiJqcp00i_>zopr0H|OnC;$Ke literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_default_holo_light.9.png new file mode 100644 index 0000000000000000000000000000000000000000..733373ed38d92906a3f639124b60d39cfe3ea469 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{e!3HEJoIX|yq})7R978nDC;#~W-=0~Khvol7 z1H)I2CW)>m8aUVm(v20J8xM$gbsA4Oq2MIp#mnr@>uNTIF}6W!#;>-fvxg@opE#)D b$jGop@Lc3+&hjll6B#^R{an^LB{Ts5lN~2O literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dark.9.png b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable-xhdpi/abs__textfield_search_right_selected_holo_dark.9.png new file mode 100644 index 0000000000000000000000000000000000000000..0c6bb036dbff7c452df0032fac9daaaf3ed36cff GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^qCm{e!3HEJoIX|yq})AS978nDC;#~W-=0~Khvol7 z1H)I2CW)>m8aUVm(v9t$CDZ2p!k(eA~|x?WSsfj bIFlKwHfSC=yJ^W9ppguou6{1-oD!Mm8aUVm(v9t$CDZ2p!k(eA~|x?WSsfj bIFlKwHfSC=yJ^W9ppguou6{1-oD!Mm8aUV)4xTaopEyItdE!^$Tn)$h3#7aBEDrH5l{lPKbU~WStl#0CqS)dY aj0`i|)DAxoJGT#LAcLo?pUXO@geCyp{V3}I literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_dark.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_dark.xml new file mode 100644 index 0000000000..85c2c02129 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_dark.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_light.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_light.xml new file mode 100644 index 0000000000..85c2c02129 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__activated_background_holo_light.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_dark.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_dark.xml new file mode 100644 index 0000000000..cab896283c --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_dark.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_light.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_light.xml new file mode 100644 index 0000000000..42ba8a0df0 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__btn_cab_done_holo_light.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear.xml new file mode 100644 index 0000000000..a16f4b22e8 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear_holo_light.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear_holo_light.xml new file mode 100644 index 0000000000..256de80fb3 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__ic_clear_holo_light.xml @@ -0,0 +1,22 @@ + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml new file mode 100644 index 0000000000..2588a492db --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_dark.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml new file mode 100644 index 0000000000..e2078c9679 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__ic_menu_moreoverflow_holo_light.xml @@ -0,0 +1,18 @@ + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_dark.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_dark.xml new file mode 100644 index 0000000000..d99b7a426b --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_dark.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_light.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_light.xml new file mode 100644 index 0000000000..da5fb2e86e --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__item_background_holo_light.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_dark.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_dark.xml new file mode 100644 index 0000000000..b2ce4f0f77 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_dark.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_light.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_light.xml new file mode 100644 index 0000000000..d7e31b1d1f --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_background_transition_holo_light.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_dark.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_dark.xml new file mode 100644 index 0000000000..08b8b12f37 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_dark.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_light.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_light.xml new file mode 100644 index 0000000000..ada490bf9f --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__list_selector_holo_light.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_dark.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_dark.xml new file mode 100644 index 0000000000..bd19140abf --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_dark.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_light.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_light.xml new file mode 100644 index 0000000000..321f07c8b2 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__progress_horizontal_holo_light.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__progress_medium_holo.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__progress_medium_holo.xml new file mode 100644 index 0000000000..6d4814f862 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__progress_medium_holo.xml @@ -0,0 +1,34 @@ + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_dark.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_dark.xml new file mode 100644 index 0000000000..26284187a7 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_dark.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_light.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_light.xml new file mode 100644 index 0000000000..0d00c58788 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__search_dropdown_light.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_dark.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_dark.xml new file mode 100644 index 0000000000..4af5e22a90 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_dark.xml @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_light.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_light.xml new file mode 100644 index 0000000000..b785084782 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__spinner_ab_holo_light.xml @@ -0,0 +1,25 @@ + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__tab_indicator_ab_holo.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__tab_indicator_ab_holo.xml new file mode 100644 index 0000000000..d34e208117 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__tab_indicator_ab_holo.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_dark.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_dark.xml new file mode 100644 index 0000000000..b6d58c040a --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_dark.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_light.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_light.xml new file mode 100644 index 0000000000..3d6acf8085 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_holo_light.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_dark.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_dark.xml new file mode 100644 index 0000000000..05ff4eda55 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_dark.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_light.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_light.xml new file mode 100644 index 0000000000..f6d61e57ab --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/drawable/abs__textfield_searchview_right_holo_light.xml @@ -0,0 +1,22 @@ + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-large/abs__action_mode_close_item.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-large/abs__action_mode_close_item.xml new file mode 100644 index 0000000000..8811dad8d6 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-large/abs__action_mode_close_item.xml @@ -0,0 +1,40 @@ + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_dropdown_item.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_dropdown_item.xml new file mode 100644 index 0000000000..6c183c0596 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_dropdown_item.xml @@ -0,0 +1,26 @@ + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_item.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_item.xml new file mode 100644 index 0000000000..61dc02527f --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-v14/sherlock_spinner_item.xml @@ -0,0 +1,26 @@ + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar.xml new file mode 100644 index 0000000000..040df44abb --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar_overlay.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar_overlay.xml new file mode 100644 index 0000000000..c64ef141b3 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout-xlarge/abs__screen_action_bar_overlay.xml @@ -0,0 +1,49 @@ + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_home.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_home.xml new file mode 100644 index 0000000000..5c1e9ec4b3 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_home.xml @@ -0,0 +1,38 @@ + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab.xml new file mode 100644 index 0000000000..f46f7a044b --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab.xml @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab_bar_view.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab_bar_view.xml new file mode 100644 index 0000000000..0d51220c90 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_tab_bar_view.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_title_item.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_title_item.xml new file mode 100644 index 0000000000..dd69acadaa --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_bar_title_item.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_menu_item_layout.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_menu_item_layout.xml new file mode 100644 index 0000000000..13149fd630 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_menu_item_layout.xml @@ -0,0 +1,56 @@ + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_menu_layout.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_menu_layout.xml new file mode 100644 index 0000000000..a6f8e53f8a --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_menu_layout.xml @@ -0,0 +1,23 @@ + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_mode_bar.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_mode_bar.xml new file mode 100644 index 0000000000..7168dc77fd --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_mode_bar.xml @@ -0,0 +1,24 @@ + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_mode_close_item.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_mode_close_item.xml new file mode 100644 index 0000000000..875ec3e1b0 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__action_mode_close_item.xml @@ -0,0 +1,31 @@ + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view.xml new file mode 100644 index 0000000000..6a0ac9ece0 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view.xml @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view_list_item.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view_list_item.xml new file mode 100644 index 0000000000..b430032a14 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__activity_chooser_view_list_item.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__dialog_title_holo.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__dialog_title_holo.xml new file mode 100644 index 0000000000..ab2b0ee6ce --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__dialog_title_holo.xml @@ -0,0 +1,46 @@ + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_checkbox.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_checkbox.xml new file mode 100644 index 0000000000..39aca3a8dd --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_checkbox.xml @@ -0,0 +1,26 @@ + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_icon.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_icon.xml new file mode 100644 index 0000000000..55ab28a24d --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_icon.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_layout.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_layout.xml new file mode 100644 index 0000000000..147f36fe85 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_layout.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_radio.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_radio.xml new file mode 100644 index 0000000000..ff54bbecd1 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__list_menu_item_radio.xml @@ -0,0 +1,24 @@ + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__popup_menu_item_layout.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__popup_menu_item_layout.xml new file mode 100644 index 0000000000..d42425ad32 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__popup_menu_item_layout.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar.xml new file mode 100644 index 0000000000..1fb82fe9a4 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar_overlay.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar_overlay.xml new file mode 100644 index 0000000000..0961ef561a --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__screen_action_bar_overlay.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__screen_simple.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__screen_simple.xml new file mode 100644 index 0000000000..33e2dea0de --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__screen_simple.xml @@ -0,0 +1,38 @@ + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__screen_simple_overlay_action_mode.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__screen_simple_overlay_action_mode.xml new file mode 100644 index 0000000000..f8b9fb1859 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__screen_simple_overlay_action_mode.xml @@ -0,0 +1,38 @@ + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__search_dropdown_item_icons_2line.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__search_dropdown_item_icons_2line.xml new file mode 100644 index 0000000000..e1d3dc49cb --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__search_dropdown_item_icons_2line.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__search_view.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__search_view.xml new file mode 100644 index 0000000000..6ba319121c --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__search_view.xml @@ -0,0 +1,159 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__simple_dropdown_hint.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__simple_dropdown_hint.xml new file mode 100644 index 0000000000..8fc0eb12cb --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/abs__simple_dropdown_hint.xml @@ -0,0 +1,29 @@ + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_dropdown_item.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_dropdown_item.xml new file mode 100644 index 0000000000..a6c6252d26 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_dropdown_item.xml @@ -0,0 +1,26 @@ + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_item.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_item.xml new file mode 100644 index 0000000000..bea7401781 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/layout/sherlock_spinner_item.xml @@ -0,0 +1,26 @@ + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-land/abs__dimens.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-land/abs__dimens.xml new file mode 100644 index 0000000000..502cc16a30 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-land/abs__dimens.xml @@ -0,0 +1,33 @@ + + + + + 40dip + + 4dip + + 16dp + + 12dp + + -2dp + + 4dip + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large-hdpi-1024x600/abs__dimens.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large-hdpi-1024x600/abs__dimens.xml new file mode 100644 index 0000000000..3312cfa7fd --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large-hdpi-1024x600/abs__dimens.xml @@ -0,0 +1,33 @@ + + + + + 48dip + + 8dip + + 18dp + + 14dp + + -3dp + + 5dip + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large-land-hdpi-1024x600/abs__dimens.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large-land-hdpi-1024x600/abs__dimens.xml new file mode 100644 index 0000000000..502cc16a30 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large-land-hdpi-1024x600/abs__dimens.xml @@ -0,0 +1,33 @@ + + + + + 40dip + + 4dip + + 16dp + + 12dp + + -2dp + + 4dip + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large-land-mdpi-1024x600/abs__dimens.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large-land-mdpi-1024x600/abs__dimens.xml new file mode 100644 index 0000000000..3312cfa7fd --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large-land-mdpi-1024x600/abs__dimens.xml @@ -0,0 +1,33 @@ + + + + + 48dip + + 8dip + + 18dp + + 14dp + + -3dp + + 5dip + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large-mdpi-1024x600/abs__dimens.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large-mdpi-1024x600/abs__dimens.xml new file mode 100644 index 0000000000..35910333b2 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large-mdpi-1024x600/abs__dimens.xml @@ -0,0 +1,36 @@ + + + + + 56dip + + 4dip + + 18dp + + 14dp + + -3dp + + 9dip + + + 64dip + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large/abs__dimens.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large/abs__dimens.xml new file mode 100644 index 0000000000..63b12f7f3b --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-large/abs__dimens.xml @@ -0,0 +1,29 @@ + + + + + 55% + + 80% + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-sw600dp/abs__bools.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-sw600dp/abs__bools.xml new file mode 100644 index 0000000000..7a48e1542e --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-sw600dp/abs__bools.xml @@ -0,0 +1,19 @@ + + + + + false + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-sw600dp/abs__dimens.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-sw600dp/abs__dimens.xml new file mode 100644 index 0000000000..f678538173 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-sw600dp/abs__dimens.xml @@ -0,0 +1,38 @@ + + + + + 56dip + + 4dip + + 18dp + + 14dp + + -3dp + + 9dip + + 5 + + + 64dip + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-v11/abs__themes.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-v11/abs__themes.xml new file mode 100644 index 0000000000..03473572c2 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-v11/abs__themes.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-v14/abs__styles.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-v14/abs__styles.xml new file mode 100644 index 0000000000..88a60dd92d --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-v14/abs__styles.xml @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-v14/abs__themes.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-v14/abs__themes.xml new file mode 100644 index 0000000000..5fac1ab584 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-v14/abs__themes.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w360dp/abs__dimens.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w360dp/abs__dimens.xml new file mode 100644 index 0000000000..6f49d7e47b --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w360dp/abs__dimens.xml @@ -0,0 +1,22 @@ + + + + 3 + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w480dp/abs__bools.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w480dp/abs__bools.xml new file mode 100644 index 0000000000..3eaf4aee9d --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w480dp/abs__bools.xml @@ -0,0 +1,22 @@ + + + + true + false + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w480dp/abs__config.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w480dp/abs__config.xml new file mode 100644 index 0000000000..88357b0a76 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w480dp/abs__config.xml @@ -0,0 +1,29 @@ + + + + + + + + true + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w500dp/abs__dimens.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w500dp/abs__dimens.xml new file mode 100644 index 0000000000..2fd4deea2d --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w500dp/abs__dimens.xml @@ -0,0 +1,22 @@ + + + + 4 + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w600dp/abs__dimens.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w600dp/abs__dimens.xml new file mode 100644 index 0000000000..b085952d32 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-w600dp/abs__dimens.xml @@ -0,0 +1,22 @@ + + + + 5 + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-xlarge/abs__dimens.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-xlarge/abs__dimens.xml new file mode 100644 index 0000000000..bfc535de16 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values-xlarge/abs__dimens.xml @@ -0,0 +1,45 @@ + + + + + 56dip + + 4dip + + 18dp + + 14dp + + -3dp + + 9dip + + + 64dip + + + 45% + + 72% + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__attrs.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__attrs.xml new file mode 100644 index 0000000000..32631ca8d3 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__attrs.xml @@ -0,0 +1,432 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__bools.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__bools.xml new file mode 100644 index 0000000000..0b432448d9 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__bools.xml @@ -0,0 +1,22 @@ + + + + + false + true + true + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__colors.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__colors.xml new file mode 100644 index 0000000000..625c632ff7 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__colors.xml @@ -0,0 +1,27 @@ + + + + + #ff000000 + #fff3f3f3 + @color/abs__background_holo_light + @color/abs__background_holo_dark + #ff4c4c4c + #ffb2b2b2 + @color/abs__bright_foreground_holo_light + @color/abs__bright_foreground_holo_dark + #ff33b5e5 + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__config.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__config.xml new file mode 100644 index 0000000000..4c7b5d4598 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__config.xml @@ -0,0 +1,43 @@ + + + + + + + + 320dp + + + false + + + true + + + false + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__dimens.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__dimens.xml new file mode 100644 index 0000000000..831289e073 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__dimens.xml @@ -0,0 +1,67 @@ + + + + + 48dip + + 8dip + + 18dp + + 14dp + + -3dp + + 5dip + + 2 + + + 56dip + + + 64dip + + + 65% + + 95% + + + + 8dip + + + 8dip + + + 32dip + + + + 160dip + + + 320dip + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__ids.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__ids.xml new file mode 100644 index 0000000000..f9f56045b3 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__ids.xml @@ -0,0 +1,26 @@ + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__strings.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__strings.xml new file mode 100644 index 0000000000..06a2a2af4e --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__strings.xml @@ -0,0 +1,53 @@ + + + + + Navigate home + + Navigate up + + More options + + + Done + + + See all... + + Select activity + + Share with... + + Choose an application + + Share with + + Share with %s + + + Search + + Search query + + Clear query + + Submit query + + Voice search + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__styles.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__styles.xml new file mode 100644 index 0000000000..45a18c1833 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__styles.xml @@ -0,0 +1,412 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__themes.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__themes.xml new file mode 100644 index 0000000000..634fa798b0 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/res/values/abs__themes.xml @@ -0,0 +1,239 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/android/support/v4/app/Watson.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/android/support/v4/app/Watson.java new file mode 100644 index 0000000000..d93de4c6a1 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/android/support/v4/app/Watson.java @@ -0,0 +1,144 @@ +package android.support.v4.app; + +import android.util.Log; +import android.view.View; +import android.view.Window; +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. */ + public interface OnCreateOptionsMenuListener { + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater); + } + /** Fragment interface for menu preparation callback. */ + public interface OnPrepareOptionsMenuListener { + public void onPrepareOptionsMenu(Menu menu); + } + /** Fragment interface for menu item selection callback. */ + public interface OnOptionsItemSelectedListener { + public boolean onOptionsItemSelected(MenuItem item); + } + + private ArrayList mCreatedMenus; + + + /////////////////////////////////////////////////////////////////////////// + // Sherlock menu handling + /////////////////////////////////////////////////////////////////////////// + + @Override + public boolean onCreatePanelMenu(int featureId, Menu menu) { + if (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); + + MenuInflater inflater = getSupportMenuInflater(); + boolean show = false; + ArrayList newMenus = null; + if (mFragments.mAdded != null) { + for (int i = 0; i < mFragments.mAdded.size(); i++) { + Fragment f = mFragments.mAdded.get(i); + if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible && f instanceof OnCreateOptionsMenuListener) { + show = true; + ((OnCreateOptionsMenuListener)f).onCreateOptionsMenu(menu, inflater); + if (newMenus == null) { + newMenus = new ArrayList(); + } + newMenus.add(f); + } + } + } + + if (mCreatedMenus != null) { + for (int i = 0; i < mCreatedMenus.size(); i++) { + Fragment f = mCreatedMenus.get(i); + if (newMenus == null || !newMenus.contains(f)) { + f.onDestroyOptionsMenu(); + } + } + } + + mCreatedMenus = newMenus; + + if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] fragments create result: " + show); + result |= show; + + if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] returning " + result); + return result; + } + return false; + } + + @Override + public boolean onPreparePanel(int featureId, View view, Menu menu) { + if (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); + + boolean show = false; + if (mFragments.mAdded != null) { + for (int i = 0; i < mFragments.mAdded.size(); i++) { + Fragment f = mFragments.mAdded.get(i); + if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible && f instanceof OnPrepareOptionsMenuListener) { + show = true; + ((OnPrepareOptionsMenuListener)f).onPrepareOptionsMenu(menu); + } + } + } + + if (DEBUG) Log.d(TAG, "[onPreparePanel] fragments prepare result: " + show); + result |= show; + + result &= menu.hasVisibleItems(); + if (DEBUG) Log.d(TAG, "[onPreparePanel] returning " + result); + return result; + } + return false; + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + if (DEBUG) Log.d(TAG, "[onMenuItemSelected] featureId: " + featureId + ", item: " + item); + + if (featureId == Window.FEATURE_OPTIONS_PANEL) { + if (onOptionsItemSelected(item)) { + return true; + } + + if (mFragments.mAdded != null) { + for (int i = 0; i < mFragments.mAdded.size(); i++) { + Fragment f = mFragments.mAdded.get(i); + if (f != null && !f.mHidden && f.mHasMenu && f.mMenuVisible && f instanceof OnOptionsItemSelectedListener) { + if (((OnOptionsItemSelectedListener)f).onOptionsItemSelected(item)) { + return true; + } + } + } + } + } + return false; + } + + public abstract boolean onCreateOptionsMenu(Menu menu); + + public abstract boolean onPrepareOptionsMenu(Menu menu); + + public abstract boolean onOptionsItemSelected(MenuItem item); + + public abstract MenuInflater getSupportMenuInflater(); +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/ActionBarSherlock.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/ActionBarSherlock.java new file mode 100644 index 0000000000..ab160f8360 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/ActionBarSherlock.java @@ -0,0 +1,794 @@ +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; +import android.os.Build; +import android.os.Bundle; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import com.actionbarsherlock.app.ActionBar; +import com.actionbarsherlock.internal.ActionBarSherlockCompat; +import com.actionbarsherlock.internal.ActionBarSherlockNative; +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuInflater; +import com.actionbarsherlock.view.MenuItem; + +/** + *

Helper for implementing the action bar design pattern across all versions + * of Android.

+ * + *

This class will manage interaction with a custom action bar based on the + * Android 4.0 source code. The exposed API mirrors that of its native + * counterpart and you should refer to its documentation for instruction.

+ * + * @author Jake Wharton + */ +public abstract class ActionBarSherlock { + protected static final String TAG = "ActionBarSherlock"; + protected static final boolean DEBUG = false; + + private static final Class[] CONSTRUCTOR_ARGS = new Class[] { Activity.class, int.class }; + private static final HashMap> IMPLEMENTATIONS = + new HashMap>(); + + static { + //Register our two built-in implementations + registerImplementation(ActionBarSherlockCompat.class); + registerImplementation(ActionBarSherlockNative.class); + } + + + /** + *

Denotes an implementation of ActionBarSherlock which provides an + * action bar-enhanced experience.

+ */ + @Target(ElementType.TYPE) + @Retention(RetentionPolicy.RUNTIME) + public @interface Implementation { + static final int DEFAULT_API = -1; + static final int DEFAULT_DPI = -1; + + int api() default DEFAULT_API; + int dpi() default DEFAULT_DPI; + } + + + /** Activity interface for menu creation callback. */ + public interface OnCreatePanelMenuListener { + public boolean onCreatePanelMenu(int featureId, Menu menu); + } + /** Activity interface for menu creation callback. */ + public interface OnCreateOptionsMenuListener { + public boolean onCreateOptionsMenu(Menu menu); + } + /** Activity interface for menu item selection callback. */ + public interface OnMenuItemSelectedListener { + public boolean onMenuItemSelected(int featureId, MenuItem item); + } + /** Activity interface for menu item selection callback. */ + public interface OnOptionsItemSelectedListener { + public boolean onOptionsItemSelected(MenuItem item); + } + /** Activity interface for menu preparation callback. */ + public interface OnPreparePanelListener { + public boolean onPreparePanel(int featureId, View view, Menu menu); + } + /** Activity interface for menu preparation callback. */ + public interface OnPrepareOptionsMenuListener { + public boolean onPrepareOptionsMenu(Menu menu); + } + /** Activity interface for action mode finished callback. */ + public interface OnActionModeFinishedListener { + public void onActionModeFinished(ActionMode mode); + } + /** Activity interface for action mode started callback. */ + public interface OnActionModeStartedListener { + public void onActionModeStarted(ActionMode mode); + } + + + /** + * If set, the logic in these classes will assume that an {@link Activity} + * is dispatching all of the required events to the class. This flag should + * only be used internally or if you are creating your own base activity + * modeled after one of the included types (e.g., {@code SherlockActivity}). + */ + public static final int FLAG_DELEGATE = 1; + + + /** + * Register an ActionBarSherlock implementation. + * + * @param implementationClass Target implementation class which extends + * {@link ActionBarSherlock}. This class must also be annotated with + * {@link Implementation}. + */ + public static void registerImplementation(Class implementationClass) { + if (!implementationClass.isAnnotationPresent(Implementation.class)) { + throw new IllegalArgumentException("Class " + implementationClass.getSimpleName() + " is not annotated with @Implementation"); + } else if (IMPLEMENTATIONS.containsValue(implementationClass)) { + if (DEBUG) Log.w(TAG, "Class " + implementationClass.getSimpleName() + " already registered"); + return; + } + + Implementation impl = implementationClass.getAnnotation(Implementation.class); + if (DEBUG) Log.i(TAG, "Registering " + implementationClass.getSimpleName() + " with qualifier " + impl); + IMPLEMENTATIONS.put(impl, implementationClass); + } + + /** + * Unregister an ActionBarSherlock implementation. This should be + * considered very volatile and you should only use it if you know what + * you are doing. You have been warned. + * + * @param implementationClass Target implementation class. + * @return Boolean indicating whether the class was removed. + */ + public static boolean unregisterImplementation(Class implementationClass) { + return IMPLEMENTATIONS.values().remove(implementationClass); + } + + /** + * Wrap an activity with an action bar abstraction which will enable the + * use of a custom implementation on platforms where a native version does + * not exist. + * + * @param activity Activity to wrap. + * @return Instance to interact with the action bar. + */ + public static ActionBarSherlock wrap(Activity activity) { + return wrap(activity, 0); + } + + /** + * Wrap an activity with an action bar abstraction which will enable the + * use of a custom implementation on platforms where a native version does + * not exist. + * + * @param activity Owning activity. + * @param flags Option flags to control behavior. + * @return Instance to interact with the action bar. + */ + public static ActionBarSherlock wrap(Activity activity, int flags) { + //Create a local implementation map we can modify + HashMap> impls = + new HashMap>(IMPLEMENTATIONS); + boolean hasQualfier; + + /* DPI FILTERING */ + hasQualfier = false; + for (Implementation key : impls.keySet()) { + //Only honor TVDPI as a specific qualifier + if (key.dpi() == DisplayMetrics.DENSITY_TV) { + hasQualfier = true; + break; + } + } + if (hasQualfier) { + final boolean isTvDpi = activity.getResources().getDisplayMetrics().densityDpi == DisplayMetrics.DENSITY_TV; + for (Iterator keys = impls.keySet().iterator(); keys.hasNext(); ) { + int keyDpi = keys.next().dpi(); + if ((isTvDpi && keyDpi != DisplayMetrics.DENSITY_TV) + || (!isTvDpi && keyDpi == DisplayMetrics.DENSITY_TV)) { + keys.remove(); + } + } + } + + /* API FILTERING */ + hasQualfier = false; + for (Implementation key : impls.keySet()) { + if (key.api() != Implementation.DEFAULT_API) { + hasQualfier = true; + break; + } + } + if (hasQualfier) { + final int runtimeApi = Build.VERSION.SDK_INT; + int bestApi = 0; + for (Iterator keys = impls.keySet().iterator(); keys.hasNext(); ) { + int keyApi = keys.next().api(); + if (keyApi > runtimeApi) { + keys.remove(); + } else if (keyApi > bestApi) { + bestApi = keyApi; + } + } + for (Iterator keys = impls.keySet().iterator(); keys.hasNext(); ) { + if (keys.next().api() != bestApi) { + keys.remove(); + } + } + } + + if (impls.size() > 1) { + throw new IllegalStateException("More than one implementation matches configuration."); + } + if (impls.isEmpty()) { + throw new IllegalStateException("No implementations match configuration."); + } + Class impl = impls.values().iterator().next(); + if (DEBUG) Log.i(TAG, "Using implementation: " + impl.getSimpleName()); + + try { + Constructor ctor = impl.getConstructor(CONSTRUCTOR_ARGS); + return ctor.newInstance(activity, flags); + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } catch (IllegalArgumentException e) { + throw new RuntimeException(e); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } + } + + + /** Activity which is displaying the action bar. Also used for context. */ + protected final Activity mActivity; + /** Whether delegating actions for the activity or managing ourselves. */ + protected final boolean mIsDelegate; + + /** Reference to our custom menu inflater which supports action items. */ + protected MenuInflater mMenuInflater; + + + + protected ActionBarSherlock(Activity activity, int flags) { + if (DEBUG) Log.d(TAG, "[] activity: " + activity + ", flags: " + flags); + + mActivity = activity; + mIsDelegate = (flags & FLAG_DELEGATE) != 0; + } + + + /** + * Get the current action bar instance. + * + * @return Action bar instance. + */ + public abstract ActionBar getActionBar(); + + + /////////////////////////////////////////////////////////////////////////// + // Lifecycle and interaction callbacks when delegating + /////////////////////////////////////////////////////////////////////////// + + /** + * Notify action bar of a configuration change event. Should be dispatched + * after the call to the superclass implementation. + * + *
+     * @Override
+     * public void onConfigurationChanged(Configuration newConfig) {
+     *     super.onConfigurationChanged(newConfig);
+     *     mSherlock.dispatchConfigurationChanged(newConfig);
+     * }
+     * 
+ * + * @param newConfig The new device configuration. + */ + public void dispatchConfigurationChanged(Configuration newConfig) {} + + /** + * Notify the action bar that the activity has finished its resuming. This + * should be dispatched after the call to the superclass implementation. + * + *
+     * @Override
+     * protected void onPostResume() {
+     *     super.onPostResume();
+     *     mSherlock.dispatchPostResume();
+     * }
+     * 
+ */ + public void dispatchPostResume() {} + + /** + * Notify the action bar that the activity is pausing. This should be + * dispatched before the call to the superclass implementation. + * + *
+     * @Override
+     * protected void onPause() {
+     *     mSherlock.dispatchPause();
+     *     super.onPause();
+     * }
+     * 
+ */ + public void dispatchPause() {} + + /** + * Notify the action bar that the activity is stopping. This should be + * called before the superclass implementation. + * + *

+ * @Override + * protected void onStop() { + * mSherlock.dispatchStop(); + * super.onStop(); + * } + *

+ */ + public void dispatchStop() {} + + /** + * Indicate that the menu should be recreated by calling + * {@link OnCreateOptionsMenuListener#onCreateOptionsMenu(com.actionbarsherlock.view.Menu)}. + */ + public abstract void dispatchInvalidateOptionsMenu(); + + /** + * Notify the action bar that it should display its overflow menu if it is + * appropriate for the device. The implementation should conditionally + * call the superclass method only if this method returns {@code false}. + * + *

+ * @Override + * public void openOptionsMenu() { + * if (!mSherlock.dispatchOpenOptionsMenu()) { + * super.openOptionsMenu(); + * } + * } + *

+ * + * @return {@code true} if the opening of the menu was handled internally. + */ + public boolean dispatchOpenOptionsMenu() { + return false; + } + + /** + * Notify the action bar that it should close its overflow menu if it is + * appropriate for the device. This implementation should conditionally + * call the superclass method only if this method returns {@code false}. + * + *
+     * @Override
+     * public void closeOptionsMenu() {
+     *     if (!mSherlock.dispatchCloseOptionsMenu()) {
+     *         super.closeOptionsMenu();
+     *     }
+     * }
+     * 
+ * + * @return {@code true} if the closing of the menu was handled internally. + */ + public boolean dispatchCloseOptionsMenu() { + return false; + } + + /** + * Notify the class that the activity has finished its creation. This + * should be called after the superclass implementation. + * + *
+     * @Override
+     * protected void onPostCreate(Bundle savedInstanceState) {
+     *     mSherlock.dispatchPostCreate(savedInstanceState);
+     *     super.onPostCreate(savedInstanceState);
+     * }
+     * 
+ * + * @param savedInstanceState If the activity is being re-initialized after + * previously being shut down then this Bundle + * contains the data it most recently supplied in + * {@link Activity#}onSaveInstanceState(Bundle)}. + * Note: Otherwise it is null. + */ + public void dispatchPostCreate(Bundle savedInstanceState) {} + + /** + * Notify the action bar that the title has changed and the action bar + * should be updated to reflect the change. This should be called before + * the superclass implementation. + * + *
+     *  @Override
+     *  protected void onTitleChanged(CharSequence title, int color) {
+     *      mSherlock.dispatchTitleChanged(title, color);
+     *      super.onTitleChanged(title, color);
+     *  }
+     * 
+ * + * @param title New activity title. + * @param color New activity color. + */ + public void dispatchTitleChanged(CharSequence title, int color) {} + + /** + * Notify the action bar the user has created a key event. This is used to + * toggle the display of the overflow action item with the menu key and to + * close the action mode or expanded action item with the back key. + * + *
+     * @Override
+     * public boolean dispatchKeyEvent(KeyEvent event) {
+     *     if (mSherlock.dispatchKeyEvent(event)) {
+     *         return true;
+     *     }
+     *     return super.dispatchKeyEvent(event);
+     * }
+     * 
+ * + * @param event Description of the key event. + * @return {@code true} if the event was handled. + */ + public boolean dispatchKeyEvent(KeyEvent event) { + return false; + } + + /** + * Notify the action bar that the Activity has triggered a menu creation + * which should happen on the conclusion of {@link Activity#onCreate}. This + * will be used to gain a reference to the native menu for native and + * overflow binding as well as to indicate when compatibility create should + * occur for the first time. + * + * @param menu Activity native menu. + * @return {@code true} since we always want to say that we have a native + */ + public abstract boolean dispatchCreateOptionsMenu(android.view.Menu menu); + + /** + * Notify the action bar that the Activity has triggered a menu preparation + * which usually means that the user has requested the overflow menu via a + * hardware menu key. You should return the result of this method call and + * not call the superclass implementation. + * + *

+ * @Override + * public final boolean onPrepareOptionsMenu(android.view.Menu menu) { + * return mSherlock.dispatchPrepareOptionsMenu(menu); + * } + *

+ * + * @param menu Activity native menu. + * @return {@code true} if menu display should proceed. + */ + public abstract boolean dispatchPrepareOptionsMenu(android.view.Menu menu); + + /** + * Notify the action bar that a native options menu item has been selected. + * The implementation should return the result of this method call. + * + *

+ * @Override + * public final boolean onOptionsItemSelected(android.view.MenuItem item) { + * return mSherlock.dispatchOptionsItemSelected(item); + * } + *

+ * + * @param item Options menu item. + * @return @{code true} if the selection was handled. + */ + public abstract boolean dispatchOptionsItemSelected(android.view.MenuItem item); + + /** + * Notify the action bar that the overflow menu has been opened. The + * implementation should conditionally return {@code true} if this method + * returns {@code true}, otherwise return the result of the superclass + * method. + * + *

+ * @Override + * public final boolean onMenuOpened(int featureId, android.view.Menu menu) { + * if (mSherlock.dispatchMenuOpened(featureId, menu)) { + * return true; + * } + * return super.onMenuOpened(featureId, menu); + * } + *

+ * + * @param featureId Window feature which triggered the event. + * @param menu Activity native menu. + * @return {@code true} if the event was handled by this method. + */ + public boolean dispatchMenuOpened(int featureId, android.view.Menu menu) { + return false; + } + + /** + * Notify the action bar that the overflow menu has been closed. This + * method should be called before the superclass implementation. + * + *

+ * @Override + * public void onPanelClosed(int featureId, android.view.Menu menu) { + * mSherlock.dispatchPanelClosed(featureId, menu); + * super.onPanelClosed(featureId, menu); + * } + *

+ * + * @param featureId + * @param menu + */ + public void dispatchPanelClosed(int featureId, android.view.Menu menu) {} + + /** + * Notify the action bar that the activity has been destroyed. This method + * should be called before the superclass implementation. + * + *

+ * @Override + * public void onDestroy() { + * mSherlock.dispatchDestroy(); + * super.onDestroy(); + * } + *

+ */ + public void dispatchDestroy() {} + + public void dispatchSaveInstanceState(Bundle outState) {} + + public void dispatchRestoreInstanceState(Bundle savedInstanceState) {} + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + + /** + * Internal method to trigger the menu creation process. + * + * @return {@code true} if menu creation should proceed. + */ + protected final boolean callbackCreateOptionsMenu(Menu menu) { + if (DEBUG) Log.d(TAG, "[callbackCreateOptionsMenu] menu: " + menu); + + boolean result = true; + if (mActivity instanceof OnCreatePanelMenuListener) { + OnCreatePanelMenuListener listener = (OnCreatePanelMenuListener)mActivity; + result = listener.onCreatePanelMenu(Window.FEATURE_OPTIONS_PANEL, menu); + } else if (mActivity instanceof OnCreateOptionsMenuListener) { + OnCreateOptionsMenuListener listener = (OnCreateOptionsMenuListener)mActivity; + result = listener.onCreateOptionsMenu(menu); + } + + if (DEBUG) Log.d(TAG, "[callbackCreateOptionsMenu] returning " + result); + return result; + } + + /** + * Internal method to trigger the menu preparation process. + * + * @return {@code true} if menu preparation should proceed. + */ + protected final boolean callbackPrepareOptionsMenu(Menu menu) { + if (DEBUG) Log.d(TAG, "[callbackPrepareOptionsMenu] menu: " + menu); + + boolean result = true; + if (mActivity instanceof OnPreparePanelListener) { + OnPreparePanelListener listener = (OnPreparePanelListener)mActivity; + result = listener.onPreparePanel(Window.FEATURE_OPTIONS_PANEL, null, menu); + } else if (mActivity instanceof OnPrepareOptionsMenuListener) { + OnPrepareOptionsMenuListener listener = (OnPrepareOptionsMenuListener)mActivity; + result = listener.onPrepareOptionsMenu(menu); + } + + if (DEBUG) Log.d(TAG, "[callbackPrepareOptionsMenu] returning " + result); + return result; + } + + /** + * Internal method for dispatching options menu selection to the owning + * activity callback. + * + * @param item Selected options menu item. + * @return {@code true} if the item selection was handled in the callback. + */ + protected final boolean callbackOptionsItemSelected(MenuItem item) { + if (DEBUG) Log.d(TAG, "[callbackOptionsItemSelected] item: " + item.getTitleCondensed()); + + boolean result = false; + if (mActivity instanceof OnMenuItemSelectedListener) { + OnMenuItemSelectedListener listener = (OnMenuItemSelectedListener)mActivity; + result = listener.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, item); + } else if (mActivity instanceof OnOptionsItemSelectedListener) { + OnOptionsItemSelectedListener listener = (OnOptionsItemSelectedListener)mActivity; + result = listener.onOptionsItemSelected(item); + } + + if (DEBUG) Log.d(TAG, "[callbackOptionsItemSelected] returning " + result); + return result; + } + + + /////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////// + + + /** + * Query for the availability of a certain feature. + * + * @param featureId The feature ID to check. + * @return {@code true} if feature is enabled, {@code false} otherwise. + */ + public abstract boolean hasFeature(int featureId); + + /** + * Enable extended screen features. This must be called before + * {@code setContentView()}. May be called as many times as desired as long + * as it is before {@code setContentView()}. If not called, no extended + * features will be available. You can not turn off a feature once it is + * requested. + * + * @param featureId The desired features, defined as constants by Window. + * @return Returns true if the requested feature is supported and now + * enabled. + */ + public abstract boolean requestFeature(int featureId); + + /** + * Set extra options that will influence the UI for this window. + * + * @param uiOptions Flags specifying extra options for this window. + */ + public abstract void setUiOptions(int uiOptions); + + /** + * Set extra options that will influence the UI for this window. Only the + * bits filtered by mask will be modified. + * + * @param uiOptions Flags specifying extra options for this window. + * @param mask Flags specifying which options should be modified. Others + * will remain unchanged. + */ + public abstract void setUiOptions(int uiOptions, int mask); + + /** + * Set the content of the activity inside the action bar. + * + * @param layoutResId Layout resource ID. + */ + public abstract void setContentView(int layoutResId); + + /** + * Set the content of the activity inside the action bar. + * + * @param view The desired content to display. + */ + public void setContentView(View view) { + if (DEBUG) Log.d(TAG, "[setContentView] view: " + view); + + setContentView(view, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)); + } + + /** + * Set the content of the activity inside the action bar. + * + * @param view The desired content to display. + * @param params Layout parameters to apply to the view. + */ + public abstract void setContentView(View view, ViewGroup.LayoutParams params); + + /** + * Variation on {@link #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)} + * to add an additional content view to the screen. Added after any + * existing ones on the screen -- existing views are NOT removed. + * + * @param view The desired content to display. + * @param params Layout parameters for the view. + */ + public abstract void addContentView(View view, ViewGroup.LayoutParams params); + + /** + * Change the title associated with this activity. + */ + public abstract void setTitle(CharSequence title); + + /** + * Change the title associated with this activity. + */ + public void setTitle(int resId) { + if (DEBUG) Log.d(TAG, "[setTitle] resId: " + resId); + + setTitle(mActivity.getString(resId)); + } + + /** + * Sets the visibility of the progress bar in the title. + *

+ * In order for the progress bar to be shown, the feature must be requested + * via {@link #requestWindowFeature(int)}. + * + * @param visible Whether to show the progress bars in the title. + */ + public abstract void setProgressBarVisibility(boolean visible); + + /** + * Sets the visibility of the indeterminate progress bar in the title. + *

+ * In order for the progress bar to be shown, the feature must be requested + * via {@link #requestWindowFeature(int)}. + * + * @param visible Whether to show the progress bars in the title. + */ + public abstract void setProgressBarIndeterminateVisibility(boolean visible); + + /** + * Sets whether the horizontal progress bar in the title should be indeterminate (the circular + * is always indeterminate). + *

+ * In order for the progress bar to be shown, the feature must be requested + * via {@link #requestWindowFeature(int)}. + * + * @param indeterminate Whether the horizontal progress bar should be indeterminate. + */ + public abstract void setProgressBarIndeterminate(boolean indeterminate); + + /** + * Sets the progress for the progress bars in the title. + *

+ * In order for the progress bar to be shown, the feature must be requested + * via {@link #requestWindowFeature(int)}. + * + * @param progress The progress for the progress bar. Valid ranges are from + * 0 to 10000 (both inclusive). If 10000 is given, the progress + * bar will be completely filled and will fade out. + */ + public abstract void setProgress(int progress); + + /** + * Sets the secondary progress for the progress bar in the title. This + * progress is drawn between the primary progress (set via + * {@link #setProgress(int)} and the background. It can be ideal for media + * scenarios such as showing the buffering progress while the default + * progress shows the play progress. + *

+ * In order for the progress bar to be shown, the feature must be requested + * via {@link #requestWindowFeature(int)}. + * + * @param secondaryProgress The secondary progress for the progress bar. Valid ranges are from + * 0 to 10000 (both inclusive). + */ + public abstract void setSecondaryProgress(int secondaryProgress); + + /** + * Get a menu inflater instance which supports the newer menu attributes. + * + * @return Menu inflater instance. + */ + public MenuInflater getMenuInflater() { + if (DEBUG) Log.d(TAG, "[getMenuInflater]"); + + // Make sure that action views can get an appropriate theme. + if (mMenuInflater == null) { + if (getActionBar() != null) { + mMenuInflater = new MenuInflater(getThemedContext(), mActivity); + } else { + mMenuInflater = new MenuInflater(mActivity); + } + } + return mMenuInflater; + } + + protected abstract Context getThemedContext(); + + /** + * Start an action mode. + * + * @param callback Callback that will manage lifecycle events for this + * context mode. + * @return The ContextMode that was started, or null if it was canceled. + * @see ActionMode + */ + public abstract ActionMode startActionMode(ActionMode.Callback callback); +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/ActionBar.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/ActionBar.java new file mode 100644 index 0000000000..03755be2b0 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/ActionBar.java @@ -0,0 +1,956 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.app; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.support.v4.app.FragmentTransaction; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.view.ViewDebug; +import android.view.ViewGroup; +import android.view.ViewGroup.MarginLayoutParams; +import android.widget.SpinnerAdapter; + +/** + * A window feature at the top of the activity that may display the activity title, navigation + * modes, and other interactive items. + *

Beginning with Android 3.0 (API level 11), the action bar appears at the top of an + * activity's window when the activity uses the system's {@link + * android.R.style#Theme_Holo Holo} theme (or one of its descendant themes), which is the default. + * You may otherwise add the action bar by calling {@link + * android.view.Window#requestFeature requestFeature(FEATURE_ACTION_BAR)} or by declaring it in a + * custom theme with the {@link android.R.styleable#Theme_windowActionBar windowActionBar} property. + *

By default, the action bar shows the application icon on + * the left, followed by the activity title. If your activity has an options menu, you can make + * select items accessible directly from the action bar as "action items". You can also + * modify various characteristics of the action bar or remove it completely.

+ *

From your activity, you can retrieve an instance of {@link ActionBar} by calling {@link + * android.app.Activity#getActionBar getActionBar()}.

+ *

In some cases, the action bar may be overlayed by another bar that enables contextual actions, + * using an {@link android.view.ActionMode}. For example, when the user selects one or more items in + * your activity, you can enable an action mode that offers actions specific to the selected + * items, with a UI that temporarily replaces the action bar. Although the UI may occupy the + * same space, the {@link android.view.ActionMode} APIs are distinct and independent from those for + * {@link ActionBar}. + *

+ */ +public abstract class ActionBar { + /** + * Standard navigation mode. Consists of either a logo or icon + * and title text with an optional subtitle. Clicking any of these elements + * will dispatch onOptionsItemSelected to the host Activity with + * a MenuItem with item ID android.R.id.home. + */ + public static final int NAVIGATION_MODE_STANDARD = android.app.ActionBar.NAVIGATION_MODE_STANDARD; + + /** + * List navigation mode. Instead of static title text this mode + * presents a list menu for navigation within the activity. + * e.g. this might be presented to the user as a dropdown list. + */ + public static final int NAVIGATION_MODE_LIST = android.app.ActionBar.NAVIGATION_MODE_LIST; + + /** + * Tab navigation mode. Instead of static title text this mode + * presents a series of tabs for navigation within the activity. + */ + public static final int NAVIGATION_MODE_TABS = android.app.ActionBar.NAVIGATION_MODE_TABS; + + /** + * Use logo instead of icon if available. This flag will cause appropriate + * navigation modes to use a wider logo in place of the standard icon. + * + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public static final int DISPLAY_USE_LOGO = android.app.ActionBar.DISPLAY_USE_LOGO; + + /** + * Show 'home' elements in this action bar, leaving more space for other + * navigation elements. This includes logo and icon. + * + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public static final int DISPLAY_SHOW_HOME = android.app.ActionBar.DISPLAY_SHOW_HOME; + + /** + * Display the 'home' element such that it appears as an 'up' affordance. + * e.g. show an arrow to the left indicating the action that will be taken. + * + * Set this flag if selecting the 'home' button in the action bar to return + * up by a single level in your UI rather than back to the top level or front page. + * + *

Setting this option will implicitly enable interaction with the home/up + * button. See {@link #setHomeButtonEnabled(boolean)}. + * + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public static final int DISPLAY_HOME_AS_UP = android.app.ActionBar.DISPLAY_HOME_AS_UP; + + /** + * Show the activity title and subtitle, if present. + * + * @see #setTitle(CharSequence) + * @see #setTitle(int) + * @see #setSubtitle(CharSequence) + * @see #setSubtitle(int) + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public static final int DISPLAY_SHOW_TITLE = android.app.ActionBar.DISPLAY_SHOW_TITLE; + + /** + * Show the custom view if one has been set. + * @see #setCustomView(View) + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public static final int DISPLAY_SHOW_CUSTOM = android.app.ActionBar.DISPLAY_SHOW_CUSTOM; + + /** + * Set the action bar into custom navigation mode, supplying a view + * for custom navigation. + * + * Custom navigation views appear between the application icon and + * any action buttons and may use any space available there. Common + * use cases for custom navigation views might include an auto-suggesting + * address bar for a browser or other navigation mechanisms that do not + * translate well to provided navigation modes. + * + * @param view Custom navigation view to place in the ActionBar. + */ + public abstract void setCustomView(View view); + + /** + * Set the action bar into custom navigation mode, supplying a view + * for custom navigation. + * + *

Custom navigation views appear between the application icon and + * any action buttons and may use any space available there. Common + * use cases for custom navigation views might include an auto-suggesting + * address bar for a browser or other navigation mechanisms that do not + * translate well to provided navigation modes.

+ * + *

The display option {@link #DISPLAY_SHOW_CUSTOM} must be set for + * the custom view to be displayed.

+ * + * @param view Custom navigation view to place in the ActionBar. + * @param layoutParams How this custom view should layout in the bar. + * + * @see #setDisplayOptions(int, int) + */ + public abstract void setCustomView(View view, LayoutParams layoutParams); + + /** + * Set the action bar into custom navigation mode, supplying a view + * for custom navigation. + * + *

Custom navigation views appear between the application icon and + * any action buttons and may use any space available there. Common + * use cases for custom navigation views might include an auto-suggesting + * address bar for a browser or other navigation mechanisms that do not + * translate well to provided navigation modes.

+ * + *

The display option {@link #DISPLAY_SHOW_CUSTOM} must be set for + * the custom view to be displayed.

+ * + * @param resId Resource ID of a layout to inflate into the ActionBar. + * + * @see #setDisplayOptions(int, int) + */ + public abstract void setCustomView(int resId); + + /** + * Set the icon to display in the 'home' section of the action bar. + * The action bar will use an icon specified by its style or the + * activity icon by default. + * + * Whether the home section shows an icon or logo is controlled + * by the display option {@link #DISPLAY_USE_LOGO}. + * + * @param resId Resource ID of a drawable to show as an icon. + * + * @see #setDisplayUseLogoEnabled(boolean) + * @see #setDisplayShowHomeEnabled(boolean) + */ + public abstract void setIcon(int resId); + + /** + * Set the icon to display in the 'home' section of the action bar. + * The action bar will use an icon specified by its style or the + * activity icon by default. + * + * Whether the home section shows an icon or logo is controlled + * by the display option {@link #DISPLAY_USE_LOGO}. + * + * @param icon Drawable to show as an icon. + * + * @see #setDisplayUseLogoEnabled(boolean) + * @see #setDisplayShowHomeEnabled(boolean) + */ + public abstract void setIcon(Drawable icon); + + /** + * Set the logo to display in the 'home' section of the action bar. + * The action bar will use a logo specified by its style or the + * activity logo by default. + * + * Whether the home section shows an icon or logo is controlled + * by the display option {@link #DISPLAY_USE_LOGO}. + * + * @param resId Resource ID of a drawable to show as a logo. + * + * @see #setDisplayUseLogoEnabled(boolean) + * @see #setDisplayShowHomeEnabled(boolean) + */ + public abstract void setLogo(int resId); + + /** + * Set the logo to display in the 'home' section of the action bar. + * The action bar will use a logo specified by its style or the + * activity logo by default. + * + * Whether the home section shows an icon or logo is controlled + * by the display option {@link #DISPLAY_USE_LOGO}. + * + * @param logo Drawable to show as a logo. + * + * @see #setDisplayUseLogoEnabled(boolean) + * @see #setDisplayShowHomeEnabled(boolean) + */ + public abstract void setLogo(Drawable logo); + + /** + * Set the adapter and navigation callback for list navigation mode. + * + * The supplied adapter will provide views for the expanded list as well as + * the currently selected item. (These may be displayed differently.) + * + * The supplied OnNavigationListener will alert the application when the user + * changes the current list selection. + * + * @param adapter An adapter that will provide views both to display + * the current navigation selection and populate views + * within the dropdown navigation menu. + * @param callback An OnNavigationListener that will receive events when the user + * selects a navigation item. + */ + public abstract void setListNavigationCallbacks(SpinnerAdapter adapter, + OnNavigationListener callback); + + /** + * Set the selected navigation item in list or tabbed navigation modes. + * + * @param position Position of the item to select. + */ + public abstract void setSelectedNavigationItem(int position); + + /** + * Get the position of the selected navigation item in list or tabbed navigation modes. + * + * @return Position of the selected item. + */ + public abstract int getSelectedNavigationIndex(); + + /** + * Get the number of navigation items present in the current navigation mode. + * + * @return Number of navigation items. + */ + public abstract int getNavigationItemCount(); + + /** + * Set the action bar's title. This will only be displayed if + * {@link #DISPLAY_SHOW_TITLE} is set. + * + * @param title Title to set + * + * @see #setTitle(int) + * @see #setDisplayOptions(int, int) + */ + public abstract void setTitle(CharSequence title); + + /** + * Set the action bar's title. This will only be displayed if + * {@link #DISPLAY_SHOW_TITLE} is set. + * + * @param resId Resource ID of title string to set + * + * @see #setTitle(CharSequence) + * @see #setDisplayOptions(int, int) + */ + public abstract void setTitle(int resId); + + /** + * Set the action bar's subtitle. This will only be displayed if + * {@link #DISPLAY_SHOW_TITLE} is set. Set to null to disable the + * subtitle entirely. + * + * @param subtitle Subtitle to set + * + * @see #setSubtitle(int) + * @see #setDisplayOptions(int, int) + */ + public abstract void setSubtitle(CharSequence subtitle); + + /** + * Set the action bar's subtitle. This will only be displayed if + * {@link #DISPLAY_SHOW_TITLE} is set. + * + * @param resId Resource ID of subtitle string to set + * + * @see #setSubtitle(CharSequence) + * @see #setDisplayOptions(int, int) + */ + public abstract void setSubtitle(int resId); + + /** + * Set display options. This changes all display option bits at once. To change + * a limited subset of display options, see {@link #setDisplayOptions(int, int)}. + * + * @param options A combination of the bits defined by the DISPLAY_ constants + * defined in ActionBar. + */ + public abstract void setDisplayOptions(int options); + + /** + * Set selected display options. Only the options specified by mask will be changed. + * To change all display option bits at once, see {@link #setDisplayOptions(int)}. + * + *

Example: setDisplayOptions(0, DISPLAY_SHOW_HOME) will disable the + * {@link #DISPLAY_SHOW_HOME} option. + * setDisplayOptions(DISPLAY_SHOW_HOME, DISPLAY_SHOW_HOME | DISPLAY_USE_LOGO) + * will enable {@link #DISPLAY_SHOW_HOME} and disable {@link #DISPLAY_USE_LOGO}. + * + * @param options A combination of the bits defined by the DISPLAY_ constants + * defined in ActionBar. + * @param mask A bit mask declaring which display options should be changed. + */ + public abstract void setDisplayOptions(int options, int mask); + + /** + * Set whether to display the activity logo rather than the activity icon. + * A logo is often a wider, more detailed image. + * + *

To set several display options at once, see the setDisplayOptions methods. + * + * @param useLogo true to use the activity logo, false to use the activity icon. + * + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public abstract void setDisplayUseLogoEnabled(boolean useLogo); + + /** + * Set whether to include the application home affordance in the action bar. + * Home is presented as either an activity icon or logo. + * + *

To set several display options at once, see the setDisplayOptions methods. + * + * @param showHome true to show home, false otherwise. + * + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public abstract void setDisplayShowHomeEnabled(boolean showHome); + + /** + * Set whether home should be displayed as an "up" affordance. + * Set this to true if selecting "home" returns up by a single level in your UI + * rather than back to the top level or front page. + * + *

To set several display options at once, see the setDisplayOptions methods. + * + * @param showHomeAsUp true to show the user that selecting home will return one + * level up rather than to the top level of the app. + * + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public abstract void setDisplayHomeAsUpEnabled(boolean showHomeAsUp); + + /** + * Set whether an activity title/subtitle should be displayed. + * + *

To set several display options at once, see the setDisplayOptions methods. + * + * @param showTitle true to display a title/subtitle if present. + * + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public abstract void setDisplayShowTitleEnabled(boolean showTitle); + + /** + * Set whether a custom view should be displayed, if set. + * + *

To set several display options at once, see the setDisplayOptions methods. + * + * @param showCustom true if the currently set custom view should be displayed, false otherwise. + * + * @see #setDisplayOptions(int) + * @see #setDisplayOptions(int, int) + */ + public abstract void setDisplayShowCustomEnabled(boolean showCustom); + + /** + * Set the ActionBar's background. This will be used for the primary + * action bar. + * + * @param d Background drawable + * @see #setStackedBackgroundDrawable(Drawable) + * @see #setSplitBackgroundDrawable(Drawable) + */ + public abstract void setBackgroundDrawable(Drawable d); + + /** + * Set the ActionBar's stacked background. This will appear + * in the second row/stacked bar on some devices and configurations. + * + * @param d Background drawable for the stacked row + */ + public void setStackedBackgroundDrawable(Drawable d) { } + + /** + * Set the ActionBar's split background. This will appear in + * the split action bar containing menu-provided action buttons + * on some devices and configurations. + *

You can enable split action bar with {@link android.R.attr#uiOptions} + * + * @param d Background drawable for the split bar + */ + public void setSplitBackgroundDrawable(Drawable d) { } + + /** + * @return The current custom view. + */ + public abstract View getCustomView(); + + /** + * Returns the current ActionBar title in standard mode. + * Returns null if {@link #getNavigationMode()} would not return + * {@link #NAVIGATION_MODE_STANDARD}. + * + * @return The current ActionBar title or null. + */ + public abstract CharSequence getTitle(); + + /** + * Returns the current ActionBar subtitle in standard mode. + * Returns null if {@link #getNavigationMode()} would not return + * {@link #NAVIGATION_MODE_STANDARD}. + * + * @return The current ActionBar subtitle or null. + */ + public abstract CharSequence getSubtitle(); + + /** + * Returns the current navigation mode. The result will be one of: + *

    + *
  • {@link #NAVIGATION_MODE_STANDARD}
  • + *
  • {@link #NAVIGATION_MODE_LIST}
  • + *
  • {@link #NAVIGATION_MODE_TABS}
  • + *
+ * + * @return The current navigation mode. + */ + public abstract int getNavigationMode(); + + /** + * Set the current navigation mode. + * + * @param mode The new mode to set. + * @see #NAVIGATION_MODE_STANDARD + * @see #NAVIGATION_MODE_LIST + * @see #NAVIGATION_MODE_TABS + */ + public abstract void setNavigationMode(int mode); + + /** + * @return The current set of display options. + */ + public abstract int getDisplayOptions(); + + /** + * Create and return a new {@link Tab}. + * This tab will not be included in the action bar until it is added. + * + *

Very often tabs will be used to switch between {@link Fragment} + * objects. Here is a typical implementation of such tabs:

+ * + * {@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentTabs.java + * complete} + * + * @return A new Tab + * + * @see #addTab(Tab) + */ + public abstract Tab newTab(); + + /** + * Add a tab for use in tabbed navigation mode. The tab will be added at the end of the list. + * If this is the first tab to be added it will become the selected tab. + * + * @param tab Tab to add + */ + public abstract void addTab(Tab tab); + + /** + * Add a tab for use in tabbed navigation mode. The tab will be added at the end of the list. + * + * @param tab Tab to add + * @param setSelected True if the added tab should become the selected tab. + */ + public abstract void addTab(Tab tab, boolean setSelected); + + /** + * Add a tab for use in tabbed navigation mode. The tab will be inserted at + * position. If this is the first tab to be added it will become + * the selected tab. + * + * @param tab The tab to add + * @param position The new position of the tab + */ + public abstract void addTab(Tab tab, int position); + + /** + * Add a tab for use in tabbed navigation mode. The tab will be insterted at + * position. + * + * @param tab The tab to add + * @param position The new position of the tab + * @param setSelected True if the added tab should become the selected tab. + */ + public abstract void addTab(Tab tab, int position, boolean setSelected); + + /** + * Remove a tab from the action bar. If the removed tab was selected it will be deselected + * and another tab will be selected if present. + * + * @param tab The tab to remove + */ + public abstract void removeTab(Tab tab); + + /** + * Remove a tab from the action bar. If the removed tab was selected it will be deselected + * and another tab will be selected if present. + * + * @param position Position of the tab to remove + */ + public abstract void removeTabAt(int position); + + /** + * Remove all tabs from the action bar and deselect the current tab. + */ + public abstract void removeAllTabs(); + + /** + * Select the specified tab. If it is not a child of this action bar it will be added. + * + *

Note: If you want to select by index, use {@link #setSelectedNavigationItem(int)}.

+ * + * @param tab Tab to select + */ + public abstract void selectTab(Tab tab); + + /** + * Returns the currently selected tab if in tabbed navigation mode and there is at least + * one tab present. + * + * @return The currently selected tab or null + */ + public abstract Tab getSelectedTab(); + + /** + * Returns the tab at the specified index. + * + * @param index Index value in the range 0-get + * @return + */ + public abstract Tab getTabAt(int index); + + /** + * Returns the number of tabs currently registered with the action bar. + * @return Tab count + */ + public abstract int getTabCount(); + + /** + * Retrieve the current height of the ActionBar. + * + * @return The ActionBar's height + */ + public abstract int getHeight(); + + /** + * Show the ActionBar if it is not currently showing. + * If the window hosting the ActionBar does not have the feature + * {@link Window#FEATURE_ACTION_BAR_OVERLAY} it will resize application + * content to fit the new space available. + */ + public abstract void show(); + + /** + * Hide the ActionBar if it is currently showing. + * If the window hosting the ActionBar does not have the feature + * {@link Window#FEATURE_ACTION_BAR_OVERLAY} it will resize application + * content to fit the new space available. + */ + public abstract void hide(); + + /** + * @return true if the ActionBar is showing, false otherwise. + */ + public abstract boolean isShowing(); + + /** + * Add a listener that will respond to menu visibility change events. + * + * @param listener The new listener to add + */ + public abstract void addOnMenuVisibilityListener(OnMenuVisibilityListener listener); + + /** + * Remove a menu visibility listener. This listener will no longer receive menu + * visibility change events. + * + * @param listener A listener to remove that was previously added + */ + public abstract void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener); + + /** + * Enable or disable the "home" button in the corner of the action bar. (Note that this + * is the application home/up affordance on the action bar, not the systemwide home + * button.) + * + *

This defaults to true for packages targeting < API 14. For packages targeting + * API 14 or greater, the application should call this method to enable interaction + * with the home/up affordance. + * + *

Setting the {@link #DISPLAY_HOME_AS_UP} display option will automatically enable + * the home button. + * + * @param enabled true to enable the home button, false to disable the home button. + */ + public void setHomeButtonEnabled(boolean enabled) { } + + /** + * Returns a {@link Context} with an appropriate theme for creating views that + * will appear in the action bar. If you are inflating or instantiating custom views + * that will appear in an action bar, you should use the Context returned by this method. + * (This includes adapters used for list navigation mode.) + * This will ensure that views contrast properly against the action bar. + * + * @return A themed Context for creating views + */ + public Context getThemedContext() { return null; } + + /** + * Listener interface for ActionBar navigation events. + */ + public interface OnNavigationListener { + /** + * This method is called whenever a navigation item in your action bar + * is selected. + * + * @param itemPosition Position of the item clicked. + * @param itemId ID of the item clicked. + * @return True if the event was handled, false otherwise. + */ + public boolean onNavigationItemSelected(int itemPosition, long itemId); + } + + /** + * Listener for receiving events when action bar menus are shown or hidden. + */ + public interface OnMenuVisibilityListener { + /** + * Called when an action bar menu is shown or hidden. Applications may want to use + * this to tune auto-hiding behavior for the action bar or pause/resume video playback, + * gameplay, or other activity within the main content area. + * + * @param isVisible True if an action bar menu is now visible, false if no action bar + * menus are visible. + */ + public void onMenuVisibilityChanged(boolean isVisible); + } + + /** + * A tab in the action bar. + * + *

Tabs manage the hiding and showing of {@link Fragment}s. + */ + public static abstract class Tab { + /** + * An invalid position for a tab. + * + * @see #getPosition() + */ + public static final int INVALID_POSITION = -1; + + /** + * Return the current position of this tab in the action bar. + * + * @return Current position, or {@link #INVALID_POSITION} if this tab is not currently in + * the action bar. + */ + public abstract int getPosition(); + + /** + * Return the icon associated with this tab. + * + * @return The tab's icon + */ + public abstract Drawable getIcon(); + + /** + * Return the text of this tab. + * + * @return The tab's text + */ + public abstract CharSequence getText(); + + /** + * Set the icon displayed on this tab. + * + * @param icon The drawable to use as an icon + * @return The current instance for call chaining + */ + public abstract Tab setIcon(Drawable icon); + + /** + * Set the icon displayed on this tab. + * + * @param resId Resource ID referring to the drawable to use as an icon + * @return The current instance for call chaining + */ + public abstract Tab setIcon(int resId); + + /** + * Set the text displayed on this tab. Text may be truncated if there is not + * room to display the entire string. + * + * @param text The text to display + * @return The current instance for call chaining + */ + public abstract Tab setText(CharSequence text); + + /** + * Set the text displayed on this tab. Text may be truncated if there is not + * room to display the entire string. + * + * @param resId A resource ID referring to the text that should be displayed + * @return The current instance for call chaining + */ + public abstract Tab setText(int resId); + + /** + * Set a custom view to be used for this tab. This overrides values set by + * {@link #setText(CharSequence)} and {@link #setIcon(Drawable)}. + * + * @param view Custom view to be used as a tab. + * @return The current instance for call chaining + */ + public abstract Tab setCustomView(View view); + + /** + * Set a custom view to be used for this tab. This overrides values set by + * {@link #setText(CharSequence)} and {@link #setIcon(Drawable)}. + * + * @param layoutResId A layout resource to inflate and use as a custom tab view + * @return The current instance for call chaining + */ + public abstract Tab setCustomView(int layoutResId); + + /** + * Retrieve a previously set custom view for this tab. + * + * @return The custom view set by {@link #setCustomView(View)}. + */ + public abstract View getCustomView(); + + /** + * Give this Tab an arbitrary object to hold for later use. + * + * @param obj Object to store + * @return The current instance for call chaining + */ + public abstract Tab setTag(Object obj); + + /** + * @return This Tab's tag object. + */ + public abstract Object getTag(); + + /** + * Set the {@link TabListener} that will handle switching to and from this tab. + * All tabs must have a TabListener set before being added to the ActionBar. + * + * @param listener Listener to handle tab selection events + * @return The current instance for call chaining + */ + public abstract Tab setTabListener(TabListener listener); + + /** + * Select this tab. Only valid if the tab has been added to the action bar. + */ + public abstract void select(); + + /** + * Set a description of this tab's content for use in accessibility support. + * If no content description is provided the title will be used. + * + * @param resId A resource ID referring to the description text + * @return The current instance for call chaining + * @see #setContentDescription(CharSequence) + * @see #getContentDescription() + */ + public abstract Tab setContentDescription(int resId); + + /** + * Set a description of this tab's content for use in accessibility support. + * If no content description is provided the title will be used. + * + * @param contentDesc Description of this tab's content + * @return The current instance for call chaining + * @see #setContentDescription(int) + * @see #getContentDescription() + */ + public abstract Tab setContentDescription(CharSequence contentDesc); + + /** + * Gets a brief description of this tab's content for use in accessibility support. + * + * @return Description of this tab's content + * @see #setContentDescription(CharSequence) + * @see #setContentDescription(int) + */ + public abstract CharSequence getContentDescription(); + } + + /** + * Callback interface invoked when a tab is focused, unfocused, added, or removed. + */ + public interface TabListener { + /** + * Called when a tab enters the selected state. + * + * @param tab The tab that was selected + * @param ft A {@link FragmentTransaction} for queuing fragment operations to execute + * during a tab switch. The previous tab's unselect and this tab's select will be + * executed in a single transaction. This FragmentTransaction does not support + * being added to the back stack. + */ + public void onTabSelected(Tab tab, FragmentTransaction ft); + + /** + * Called when a tab exits the selected state. + * + * @param tab The tab that was unselected + * @param ft A {@link FragmentTransaction} for queuing fragment operations to execute + * during a tab switch. This tab's unselect and the newly selected tab's select + * will be executed in a single transaction. This FragmentTransaction does not + * support being added to the back stack. + */ + public void onTabUnselected(Tab tab, FragmentTransaction ft); + + /** + * Called when a tab that is already selected is chosen again by the user. + * Some applications may use this action to return to the top level of a category. + * + * @param tab The tab that was reselected. + * @param ft A {@link FragmentTransaction} for queuing fragment operations to execute + * once this method returns. This FragmentTransaction does not support + * being added to the back stack. + */ + public void onTabReselected(Tab tab, FragmentTransaction ft); + } + + /** + * Per-child layout information associated with action bar custom views. + * + * @attr ref android.R.styleable#ActionBar_LayoutParams_layout_gravity + */ + public static class LayoutParams extends MarginLayoutParams { + private static final int[] ATTRS = new int[] { + android.R.attr.layout_gravity + }; + + /** + * Gravity for the view associated with these LayoutParams. + * + * @see android.view.Gravity + */ + @ViewDebug.ExportedProperty(mapping = { + @ViewDebug.IntToString(from = -1, to = "NONE"), + @ViewDebug.IntToString(from = Gravity.NO_GRAVITY, to = "NONE"), + @ViewDebug.IntToString(from = Gravity.TOP, to = "TOP"), + @ViewDebug.IntToString(from = Gravity.BOTTOM, to = "BOTTOM"), + @ViewDebug.IntToString(from = Gravity.LEFT, to = "LEFT"), + @ViewDebug.IntToString(from = Gravity.RIGHT, to = "RIGHT"), + @ViewDebug.IntToString(from = Gravity.CENTER_VERTICAL, to = "CENTER_VERTICAL"), + @ViewDebug.IntToString(from = Gravity.FILL_VERTICAL, to = "FILL_VERTICAL"), + @ViewDebug.IntToString(from = Gravity.CENTER_HORIZONTAL, to = "CENTER_HORIZONTAL"), + @ViewDebug.IntToString(from = Gravity.FILL_HORIZONTAL, to = "FILL_HORIZONTAL"), + @ViewDebug.IntToString(from = Gravity.CENTER, to = "CENTER"), + @ViewDebug.IntToString(from = Gravity.FILL, to = "FILL") + }) + public int gravity = -1; + + public LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + + TypedArray a = c.obtainStyledAttributes(attrs, ATTRS); + gravity = a.getInt(0, -1); + a.recycle(); + } + + public LayoutParams(int width, int height) { + super(width, height); + this.gravity = Gravity.CENTER_VERTICAL | Gravity.LEFT; + } + + public LayoutParams(int width, int height, int gravity) { + super(width, height); + this.gravity = gravity; + } + + public LayoutParams(int gravity) { + this(WRAP_CONTENT, FILL_PARENT, gravity); + } + + public LayoutParams(LayoutParams source) { + super(source); + + this.gravity = source.gravity; + } + + public LayoutParams(ViewGroup.LayoutParams source) { + super(source); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockActivity.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockActivity.java new file mode 100644 index 0000000000..7b45436405 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockActivity.java @@ -0,0 +1,270 @@ +package com.actionbarsherlock.app; + +import android.app.Activity; +import android.content.res.Configuration; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.View; +import android.view.Window; +import android.view.ViewGroup.LayoutParams; +import com.actionbarsherlock.ActionBarSherlock; +import com.actionbarsherlock.ActionBarSherlock.OnActionModeFinishedListener; +import com.actionbarsherlock.ActionBarSherlock.OnActionModeStartedListener; +import com.actionbarsherlock.ActionBarSherlock.OnCreatePanelMenuListener; +import com.actionbarsherlock.ActionBarSherlock.OnMenuItemSelectedListener; +import com.actionbarsherlock.ActionBarSherlock.OnPreparePanelListener; +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuInflater; +import com.actionbarsherlock.view.MenuItem; + +public abstract class SherlockActivity extends Activity implements OnCreatePanelMenuListener, OnPreparePanelListener, OnMenuItemSelectedListener, OnActionModeStartedListener, OnActionModeFinishedListener { + private ActionBarSherlock mSherlock; + + protected final ActionBarSherlock getSherlock() { + if (mSherlock == null) { + mSherlock = ActionBarSherlock.wrap(this, ActionBarSherlock.FLAG_DELEGATE); + } + return mSherlock; + } + + + /////////////////////////////////////////////////////////////////////////// + // Action bar and mode + /////////////////////////////////////////////////////////////////////////// + + public ActionBar getSupportActionBar() { + return getSherlock().getActionBar(); + } + + public ActionMode startActionMode(ActionMode.Callback callback) { + return getSherlock().startActionMode(callback); + } + + @Override + public void onActionModeStarted(ActionMode mode) {} + + @Override + public void onActionModeFinished(ActionMode mode) {} + + + /////////////////////////////////////////////////////////////////////////// + // General lifecycle/callback dispatching + /////////////////////////////////////////////////////////////////////////// + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + getSherlock().dispatchConfigurationChanged(newConfig); + } + + @Override + protected void onPostResume() { + super.onPostResume(); + getSherlock().dispatchPostResume(); + } + + @Override + protected void onPause() { + getSherlock().dispatchPause(); + super.onPause(); + } + + @Override + protected void onStop() { + getSherlock().dispatchStop(); + super.onStop(); + } + + @Override + protected void onDestroy() { + getSherlock().dispatchDestroy(); + super.onDestroy(); + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + getSherlock().dispatchPostCreate(savedInstanceState); + super.onPostCreate(savedInstanceState); + } + + @Override + protected void onTitleChanged(CharSequence title, int color) { + getSherlock().dispatchTitleChanged(title, color); + super.onTitleChanged(title, color); + } + + @Override + public final boolean onMenuOpened(int featureId, android.view.Menu menu) { + if (getSherlock().dispatchMenuOpened(featureId, menu)) { + return true; + } + return super.onMenuOpened(featureId, menu); + } + + @Override + public void onPanelClosed(int featureId, android.view.Menu menu) { + getSherlock().dispatchPanelClosed(featureId, menu); + super.onPanelClosed(featureId, menu); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (getSherlock().dispatchKeyEvent(event)) { + return true; + } + return super.dispatchKeyEvent(event); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + getSherlock().dispatchSaveInstanceState(outState); + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + getSherlock().dispatchRestoreInstanceState(savedInstanceState); + } + + /////////////////////////////////////////////////////////////////////////// + // Native menu handling + /////////////////////////////////////////////////////////////////////////// + + public MenuInflater getSupportMenuInflater() { + return getSherlock().getMenuInflater(); + } + + public void invalidateOptionsMenu() { + getSherlock().dispatchInvalidateOptionsMenu(); + } + + public void supportInvalidateOptionsMenu() { + invalidateOptionsMenu(); + } + + @Override + public final boolean onCreateOptionsMenu(android.view.Menu menu) { + return getSherlock().dispatchCreateOptionsMenu(menu); + } + + @Override + public final boolean onPrepareOptionsMenu(android.view.Menu menu) { + return getSherlock().dispatchPrepareOptionsMenu(menu); + } + + @Override + public final boolean onOptionsItemSelected(android.view.MenuItem item) { + return getSherlock().dispatchOptionsItemSelected(item); + } + + @Override + public void openOptionsMenu() { + if (!getSherlock().dispatchOpenOptionsMenu()) { + super.openOptionsMenu(); + } + } + + @Override + public void closeOptionsMenu() { + if (!getSherlock().dispatchCloseOptionsMenu()) { + super.closeOptionsMenu(); + } + } + + + /////////////////////////////////////////////////////////////////////////// + // Sherlock menu handling + /////////////////////////////////////////////////////////////////////////// + + @Override + public boolean onCreatePanelMenu(int featureId, Menu menu) { + if (featureId == Window.FEATURE_OPTIONS_PANEL) { + return onCreateOptionsMenu(menu); + } + return false; + } + + public boolean onCreateOptionsMenu(Menu menu) { + return true; + } + + @Override + public boolean onPreparePanel(int featureId, View view, Menu menu) { + if (featureId == Window.FEATURE_OPTIONS_PANEL) { + return onPrepareOptionsMenu(menu); + } + return false; + } + + public boolean onPrepareOptionsMenu(Menu menu) { + return true; + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + if (featureId == Window.FEATURE_OPTIONS_PANEL) { + return onOptionsItemSelected(item); + } + return false; + } + + public boolean onOptionsItemSelected(MenuItem item) { + return false; + } + + + /////////////////////////////////////////////////////////////////////////// + // Content + /////////////////////////////////////////////////////////////////////////// + + @Override + public void addContentView(View view, LayoutParams params) { + getSherlock().addContentView(view, params); + } + + @Override + public void setContentView(int layoutResId) { + getSherlock().setContentView(layoutResId); + } + + @Override + public void setContentView(View view, LayoutParams params) { + getSherlock().setContentView(view, params); + } + + @Override + public void setContentView(View view) { + getSherlock().setContentView(view); + } + + public void requestWindowFeature(long featureId) { + getSherlock().requestFeature((int)featureId); + } + + + /////////////////////////////////////////////////////////////////////////// + // Progress Indication + /////////////////////////////////////////////////////////////////////////// + + public void setSupportProgress(int progress) { + getSherlock().setProgress(progress); + } + + public void setSupportProgressBarIndeterminate(boolean indeterminate) { + getSherlock().setProgressBarIndeterminate(indeterminate); + } + + public void setSupportProgressBarIndeterminateVisibility(boolean visible) { + getSherlock().setProgressBarIndeterminateVisibility(visible); + } + + public void setSupportProgressBarVisibility(boolean visible) { + getSherlock().setProgressBarVisibility(visible); + } + + public void setSupportSecondaryProgress(int secondaryProgress) { + getSherlock().setSecondaryProgress(secondaryProgress); + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockDialogFragment.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockDialogFragment.java new file mode 100644 index 0000000000..a7c856bf02 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockDialogFragment.java @@ -0,0 +1,68 @@ +package com.actionbarsherlock.app; + +import android.app.Activity; +import android.support.v4.app.DialogFragment; +import com.actionbarsherlock.internal.view.menu.MenuItemWrapper; +import com.actionbarsherlock.internal.view.menu.MenuWrapper; +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; + +public class SherlockDialogFragment extends DialogFragment implements OnCreateOptionsMenuListener, OnPrepareOptionsMenuListener, OnOptionsItemSelectedListener { + private SherlockFragmentActivity mActivity; + + public SherlockFragmentActivity getSherlockActivity() { + return mActivity; + } + + @Override + public void onAttach(Activity activity) { + if (!(activity instanceof SherlockFragmentActivity)) { + throw new IllegalStateException(getClass().getSimpleName() + " must be attached to a SherlockFragmentActivity."); + } + mActivity = (SherlockFragmentActivity)activity; + + super.onAttach(activity); + } + + @Override + public void onDetach() { + mActivity = null; + super.onDetach(); + } + + @Override + public final void onCreateOptionsMenu(android.view.Menu menu, android.view.MenuInflater inflater) { + onCreateOptionsMenu(new MenuWrapper(menu), mActivity.getSupportMenuInflater()); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + //Nothing to see here. + } + + @Override + public final void onPrepareOptionsMenu(android.view.Menu menu) { + onPrepareOptionsMenu(new MenuWrapper(menu)); + } + + @Override + public void onPrepareOptionsMenu(Menu menu) { + //Nothing to see here. + } + + @Override + public final boolean onOptionsItemSelected(android.view.MenuItem item) { + return onOptionsItemSelected(new MenuItemWrapper(item)); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + //Nothing to see here. + return false; + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java new file mode 100644 index 0000000000..078f9b0ca1 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockExpandableListActivity.java @@ -0,0 +1,259 @@ +package com.actionbarsherlock.app; + +import android.app.ExpandableListActivity; +import android.content.res.Configuration; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup.LayoutParams; +import android.view.Window; +import com.actionbarsherlock.ActionBarSherlock; +import com.actionbarsherlock.ActionBarSherlock.OnActionModeFinishedListener; +import com.actionbarsherlock.ActionBarSherlock.OnActionModeStartedListener; +import com.actionbarsherlock.ActionBarSherlock.OnCreatePanelMenuListener; +import com.actionbarsherlock.ActionBarSherlock.OnMenuItemSelectedListener; +import com.actionbarsherlock.ActionBarSherlock.OnPreparePanelListener; +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuInflater; +import com.actionbarsherlock.view.MenuItem; + +public abstract class SherlockExpandableListActivity extends ExpandableListActivity implements OnCreatePanelMenuListener, OnPreparePanelListener, OnMenuItemSelectedListener, OnActionModeStartedListener, OnActionModeFinishedListener { + private ActionBarSherlock mSherlock; + + protected final ActionBarSherlock getSherlock() { + if (mSherlock == null) { + mSherlock = ActionBarSherlock.wrap(this, ActionBarSherlock.FLAG_DELEGATE); + } + return mSherlock; + } + + + /////////////////////////////////////////////////////////////////////////// + // Action bar and mode + /////////////////////////////////////////////////////////////////////////// + + public ActionBar getSupportActionBar() { + return getSherlock().getActionBar(); + } + + public ActionMode startActionMode(ActionMode.Callback callback) { + return getSherlock().startActionMode(callback); + } + + @Override + public void onActionModeStarted(ActionMode mode) {} + + @Override + public void onActionModeFinished(ActionMode mode) {} + + + /////////////////////////////////////////////////////////////////////////// + // General lifecycle/callback dispatching + /////////////////////////////////////////////////////////////////////////// + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + getSherlock().dispatchConfigurationChanged(newConfig); + } + + @Override + protected void onPostResume() { + super.onPostResume(); + getSherlock().dispatchPostResume(); + } + + @Override + protected void onPause() { + getSherlock().dispatchPause(); + super.onPause(); + } + + @Override + protected void onStop() { + getSherlock().dispatchStop(); + super.onStop(); + } + + @Override + protected void onDestroy() { + getSherlock().dispatchDestroy(); + super.onDestroy(); + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + getSherlock().dispatchPostCreate(savedInstanceState); + super.onPostCreate(savedInstanceState); + } + + @Override + protected void onTitleChanged(CharSequence title, int color) { + getSherlock().dispatchTitleChanged(title, color); + super.onTitleChanged(title, color); + } + + @Override + public final boolean onMenuOpened(int featureId, android.view.Menu menu) { + if (getSherlock().dispatchMenuOpened(featureId, menu)) { + return true; + } + return super.onMenuOpened(featureId, menu); + } + + @Override + public void onPanelClosed(int featureId, android.view.Menu menu) { + getSherlock().dispatchPanelClosed(featureId, menu); + super.onPanelClosed(featureId, menu); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (getSherlock().dispatchKeyEvent(event)) { + return true; + } + return super.dispatchKeyEvent(event); + } + + + /////////////////////////////////////////////////////////////////////////// + // Native menu handling + /////////////////////////////////////////////////////////////////////////// + + public MenuInflater getSupportMenuInflater() { + return getSherlock().getMenuInflater(); + } + + public void invalidateOptionsMenu() { + getSherlock().dispatchInvalidateOptionsMenu(); + } + + public void supportInvalidateOptionsMenu() { + invalidateOptionsMenu(); + } + + @Override + public final boolean onCreateOptionsMenu(android.view.Menu menu) { + return getSherlock().dispatchCreateOptionsMenu(menu); + } + + @Override + public final boolean onPrepareOptionsMenu(android.view.Menu menu) { + return getSherlock().dispatchPrepareOptionsMenu(menu); + } + + @Override + public final boolean onOptionsItemSelected(android.view.MenuItem item) { + return getSherlock().dispatchOptionsItemSelected(item); + } + + @Override + public void openOptionsMenu() { + if (!getSherlock().dispatchOpenOptionsMenu()) { + super.openOptionsMenu(); + } + } + + @Override + public void closeOptionsMenu() { + if (!getSherlock().dispatchCloseOptionsMenu()) { + super.closeOptionsMenu(); + } + } + + + /////////////////////////////////////////////////////////////////////////// + // Sherlock menu handling + /////////////////////////////////////////////////////////////////////////// + + @Override + public boolean onCreatePanelMenu(int featureId, Menu menu) { + if (featureId == Window.FEATURE_OPTIONS_PANEL) { + return onCreateOptionsMenu(menu); + } + return false; + } + + public boolean onCreateOptionsMenu(Menu menu) { + return true; + } + + @Override + public boolean onPreparePanel(int featureId, View view, Menu menu) { + if (featureId == Window.FEATURE_OPTIONS_PANEL) { + return onPrepareOptionsMenu(menu); + } + return false; + } + + public boolean onPrepareOptionsMenu(Menu menu) { + return true; + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + if (featureId == Window.FEATURE_OPTIONS_PANEL) { + return onOptionsItemSelected(item); + } + return false; + } + + public boolean onOptionsItemSelected(MenuItem item) { + return false; + } + + + /////////////////////////////////////////////////////////////////////////// + // Content + /////////////////////////////////////////////////////////////////////////// + + @Override + public void addContentView(View view, LayoutParams params) { + getSherlock().addContentView(view, params); + } + + @Override + public void setContentView(int layoutResId) { + getSherlock().setContentView(layoutResId); + } + + @Override + public void setContentView(View view, LayoutParams params) { + getSherlock().setContentView(view, params); + } + + @Override + public void setContentView(View view) { + getSherlock().setContentView(view); + } + + public void requestWindowFeature(long featureId) { + getSherlock().requestFeature((int)featureId); + } + + + /////////////////////////////////////////////////////////////////////////// + // Progress Indication + /////////////////////////////////////////////////////////////////////////// + + public void setSupportProgress(int progress) { + getSherlock().setProgress(progress); + } + + public void setSupportProgressBarIndeterminate(boolean indeterminate) { + getSherlock().setProgressBarIndeterminate(indeterminate); + } + + public void setSupportProgressBarIndeterminateVisibility(boolean visible) { + getSherlock().setProgressBarIndeterminateVisibility(visible); + } + + public void setSupportProgressBarVisibility(boolean visible) { + getSherlock().setProgressBarVisibility(visible); + } + + public void setSupportSecondaryProgress(int secondaryProgress) { + getSherlock().setSecondaryProgress(secondaryProgress); + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragment.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragment.java new file mode 100644 index 0000000000..0f24e9c856 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragment.java @@ -0,0 +1,68 @@ +package com.actionbarsherlock.app; + +import android.app.Activity; +import android.support.v4.app.Fragment; +import com.actionbarsherlock.internal.view.menu.MenuItemWrapper; +import com.actionbarsherlock.internal.view.menu.MenuWrapper; +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; + +public class SherlockFragment extends Fragment implements OnCreateOptionsMenuListener, OnPrepareOptionsMenuListener, OnOptionsItemSelectedListener { + private SherlockFragmentActivity mActivity; + + public SherlockFragmentActivity getSherlockActivity() { + return mActivity; + } + + @Override + public void onAttach(Activity activity) { + if (!(activity instanceof SherlockFragmentActivity)) { + throw new IllegalStateException(getClass().getSimpleName() + " must be attached to a SherlockFragmentActivity."); + } + mActivity = (SherlockFragmentActivity)activity; + + super.onAttach(activity); + } + + @Override + public void onDetach() { + mActivity = null; + super.onDetach(); + } + + @Override + public final void onCreateOptionsMenu(android.view.Menu menu, android.view.MenuInflater inflater) { + onCreateOptionsMenu(new MenuWrapper(menu), mActivity.getSupportMenuInflater()); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + //Nothing to see here. + } + + @Override + public final void onPrepareOptionsMenu(android.view.Menu menu) { + onPrepareOptionsMenu(new MenuWrapper(menu)); + } + + @Override + public void onPrepareOptionsMenu(Menu menu) { + //Nothing to see here. + } + + @Override + public final boolean onOptionsItemSelected(android.view.MenuItem item) { + return onOptionsItemSelected(new MenuItemWrapper(item)); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + //Nothing to see here. + return false; + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragmentActivity.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragmentActivity.java new file mode 100644 index 0000000000..3d092f033a --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockFragmentActivity.java @@ -0,0 +1,303 @@ +package com.actionbarsherlock.app; + +import android.content.res.Configuration; +import android.os.Bundle; +import android.support.v4.app.Watson; +import android.util.Log; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup.LayoutParams; +import android.view.Window; +import com.actionbarsherlock.ActionBarSherlock; +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuInflater; +import com.actionbarsherlock.view.MenuItem; + +import static com.actionbarsherlock.ActionBarSherlock.OnActionModeFinishedListener; +import static com.actionbarsherlock.ActionBarSherlock.OnActionModeStartedListener; + +/** @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; + private boolean mIgnoreNativeCreate = false; + private boolean mIgnoreNativePrepare = false; + private boolean mIgnoreNativeSelected = false; + + protected final ActionBarSherlock getSherlock() { + if (mSherlock == null) { + mSherlock = ActionBarSherlock.wrap(this, ActionBarSherlock.FLAG_DELEGATE); + } + return mSherlock; + } + + + /////////////////////////////////////////////////////////////////////////// + // Action bar and mode + /////////////////////////////////////////////////////////////////////////// + + public ActionBar getSupportActionBar() { + return getSherlock().getActionBar(); + } + + public ActionMode startActionMode(ActionMode.Callback callback) { + return getSherlock().startActionMode(callback); + } + + @Override + public void onActionModeStarted(ActionMode mode) {} + + @Override + public void onActionModeFinished(ActionMode mode) {} + + + /////////////////////////////////////////////////////////////////////////// + // General lifecycle/callback dispatching + /////////////////////////////////////////////////////////////////////////// + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + getSherlock().dispatchConfigurationChanged(newConfig); + } + + @Override + protected void onPostResume() { + super.onPostResume(); + getSherlock().dispatchPostResume(); + } + + @Override + protected void onPause() { + getSherlock().dispatchPause(); + super.onPause(); + } + + @Override + protected void onStop() { + getSherlock().dispatchStop(); + super.onStop(); + } + + @Override + protected void onDestroy() { + getSherlock().dispatchDestroy(); + super.onDestroy(); + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + getSherlock().dispatchPostCreate(savedInstanceState); + super.onPostCreate(savedInstanceState); + } + + @Override + protected void onTitleChanged(CharSequence title, int color) { + getSherlock().dispatchTitleChanged(title, color); + super.onTitleChanged(title, color); + } + + @Override + public final boolean onMenuOpened(int featureId, android.view.Menu menu) { + if (getSherlock().dispatchMenuOpened(featureId, menu)) { + return true; + } + return super.onMenuOpened(featureId, menu); + } + + @Override + public void onPanelClosed(int featureId, android.view.Menu menu) { + getSherlock().dispatchPanelClosed(featureId, menu); + super.onPanelClosed(featureId, menu); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (getSherlock().dispatchKeyEvent(event)) { + return true; + } + return super.dispatchKeyEvent(event); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + getSherlock().dispatchSaveInstanceState(outState); + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + getSherlock().dispatchRestoreInstanceState(savedInstanceState); + } + + /////////////////////////////////////////////////////////////////////////// + // Native menu handling + /////////////////////////////////////////////////////////////////////////// + + public MenuInflater getSupportMenuInflater() { + if (DEBUG) Log.d(TAG, "[getSupportMenuInflater]"); + + return getSherlock().getMenuInflater(); + } + + public void invalidateOptionsMenu() { + if (DEBUG) Log.d(TAG, "[invalidateOptionsMenu]"); + + getSherlock().dispatchInvalidateOptionsMenu(); + } + + public void supportInvalidateOptionsMenu() { + if (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 (featureId == Window.FEATURE_OPTIONS_PANEL && !mIgnoreNativeCreate) { + mIgnoreNativeCreate = true; + boolean result = getSherlock().dispatchCreateOptionsMenu(menu); + mIgnoreNativeCreate = false; + + if (DEBUG) Log.d(TAG, "[onCreatePanelMenu] returning " + result); + return result; + } + return super.onCreatePanelMenu(featureId, menu); + } + + @Override + public final boolean onCreateOptionsMenu(android.view.Menu menu) { + return true; + } + + @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 (featureId == Window.FEATURE_OPTIONS_PANEL && !mIgnoreNativePrepare) { + mIgnoreNativePrepare = true; + boolean result = getSherlock().dispatchPrepareOptionsMenu(menu); + mIgnoreNativePrepare = false; + + if (DEBUG) Log.d(TAG, "[onPreparePanel] returning " + result); + return result; + } + return super.onPreparePanel(featureId, view, menu); + } + + @Override + public final boolean onPrepareOptionsMenu(android.view.Menu menu) { + return true; + } + + @Override + public final boolean onMenuItemSelected(int featureId, android.view.MenuItem item) { + if (DEBUG) Log.d(TAG, "[onMenuItemSelected] featureId: " + featureId + ", item: " + item); + + if (featureId == Window.FEATURE_OPTIONS_PANEL && !mIgnoreNativeSelected) { + mIgnoreNativeSelected = true; + boolean result = getSherlock().dispatchOptionsItemSelected(item); + mIgnoreNativeSelected = false; + + if (DEBUG) Log.d(TAG, "[onMenuItemSelected] returning " + result); + return result; + } + return super.onMenuItemSelected(featureId, item); + } + + @Override + public final boolean onOptionsItemSelected(android.view.MenuItem item) { + return false; + } + + @Override + public void openOptionsMenu() { + if (!getSherlock().dispatchOpenOptionsMenu()) { + super.openOptionsMenu(); + } + } + + @Override + public void closeOptionsMenu() { + if (!getSherlock().dispatchCloseOptionsMenu()) { + super.closeOptionsMenu(); + } + } + + + /////////////////////////////////////////////////////////////////////////// + // Sherlock menu handling + /////////////////////////////////////////////////////////////////////////// + + public boolean onCreateOptionsMenu(Menu menu) { + return true; + } + + public boolean onPrepareOptionsMenu(Menu menu) { + return true; + } + + public boolean onOptionsItemSelected(MenuItem item) { + return false; + } + + + /////////////////////////////////////////////////////////////////////////// + // Content + /////////////////////////////////////////////////////////////////////////// + + @Override + public void addContentView(View view, LayoutParams params) { + getSherlock().addContentView(view, params); + } + + @Override + public void setContentView(int layoutResId) { + getSherlock().setContentView(layoutResId); + } + + @Override + public void setContentView(View view, LayoutParams params) { + getSherlock().setContentView(view, params); + } + + @Override + public void setContentView(View view) { + getSherlock().setContentView(view); + } + + public void requestWindowFeature(long featureId) { + getSherlock().requestFeature((int)featureId); + } + + + /////////////////////////////////////////////////////////////////////////// + // Progress Indication + /////////////////////////////////////////////////////////////////////////// + + public void setSupportProgress(int progress) { + getSherlock().setProgress(progress); + } + + public void setSupportProgressBarIndeterminate(boolean indeterminate) { + getSherlock().setProgressBarIndeterminate(indeterminate); + } + + public void setSupportProgressBarIndeterminateVisibility(boolean visible) { + getSherlock().setProgressBarIndeterminateVisibility(visible); + } + + public void setSupportProgressBarVisibility(boolean visible) { + getSherlock().setProgressBarVisibility(visible); + } + + public void setSupportSecondaryProgress(int secondaryProgress) { + getSherlock().setSecondaryProgress(secondaryProgress); + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListActivity.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListActivity.java new file mode 100644 index 0000000000..aba6d85e88 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListActivity.java @@ -0,0 +1,270 @@ +package com.actionbarsherlock.app; + +import android.app.ListActivity; +import android.content.res.Configuration; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.View; +import android.view.Window; +import android.view.ViewGroup.LayoutParams; +import com.actionbarsherlock.ActionBarSherlock; +import com.actionbarsherlock.ActionBarSherlock.OnActionModeFinishedListener; +import com.actionbarsherlock.ActionBarSherlock.OnActionModeStartedListener; +import com.actionbarsherlock.ActionBarSherlock.OnCreatePanelMenuListener; +import com.actionbarsherlock.ActionBarSherlock.OnMenuItemSelectedListener; +import com.actionbarsherlock.ActionBarSherlock.OnPreparePanelListener; +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuInflater; +import com.actionbarsherlock.view.MenuItem; + +public abstract class SherlockListActivity extends ListActivity implements OnCreatePanelMenuListener, OnPreparePanelListener, OnMenuItemSelectedListener, OnActionModeStartedListener, OnActionModeFinishedListener { + private ActionBarSherlock mSherlock; + + protected final ActionBarSherlock getSherlock() { + if (mSherlock == null) { + mSherlock = ActionBarSherlock.wrap(this, ActionBarSherlock.FLAG_DELEGATE); + } + return mSherlock; + } + + + /////////////////////////////////////////////////////////////////////////// + // Action bar and mode + /////////////////////////////////////////////////////////////////////////// + + public ActionBar getSupportActionBar() { + return getSherlock().getActionBar(); + } + + public ActionMode startActionMode(ActionMode.Callback callback) { + return getSherlock().startActionMode(callback); + } + + @Override + public void onActionModeStarted(ActionMode mode) {} + + @Override + public void onActionModeFinished(ActionMode mode) {} + + + /////////////////////////////////////////////////////////////////////////// + // General lifecycle/callback dispatching + /////////////////////////////////////////////////////////////////////////// + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + getSherlock().dispatchConfigurationChanged(newConfig); + } + + @Override + protected void onPostResume() { + super.onPostResume(); + getSherlock().dispatchPostResume(); + } + + @Override + protected void onPause() { + getSherlock().dispatchPause(); + super.onPause(); + } + + @Override + protected void onStop() { + getSherlock().dispatchStop(); + super.onStop(); + } + + @Override + protected void onDestroy() { + getSherlock().dispatchDestroy(); + super.onDestroy(); + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + getSherlock().dispatchPostCreate(savedInstanceState); + super.onPostCreate(savedInstanceState); + } + + @Override + protected void onTitleChanged(CharSequence title, int color) { + getSherlock().dispatchTitleChanged(title, color); + super.onTitleChanged(title, color); + } + + @Override + public final boolean onMenuOpened(int featureId, android.view.Menu menu) { + if (getSherlock().dispatchMenuOpened(featureId, menu)) { + return true; + } + return super.onMenuOpened(featureId, menu); + } + + @Override + public void onPanelClosed(int featureId, android.view.Menu menu) { + getSherlock().dispatchPanelClosed(featureId, menu); + super.onPanelClosed(featureId, menu); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (getSherlock().dispatchKeyEvent(event)) { + return true; + } + return super.dispatchKeyEvent(event); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + getSherlock().dispatchSaveInstanceState(outState); + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + getSherlock().dispatchRestoreInstanceState(savedInstanceState); + } + + /////////////////////////////////////////////////////////////////////////// + // Native menu handling + /////////////////////////////////////////////////////////////////////////// + + public MenuInflater getSupportMenuInflater() { + return getSherlock().getMenuInflater(); + } + + public void invalidateOptionsMenu() { + getSherlock().dispatchInvalidateOptionsMenu(); + } + + public void supportInvalidateOptionsMenu() { + invalidateOptionsMenu(); + } + + @Override + public final boolean onCreateOptionsMenu(android.view.Menu menu) { + return getSherlock().dispatchCreateOptionsMenu(menu); + } + + @Override + public final boolean onPrepareOptionsMenu(android.view.Menu menu) { + return getSherlock().dispatchPrepareOptionsMenu(menu); + } + + @Override + public final boolean onOptionsItemSelected(android.view.MenuItem item) { + return getSherlock().dispatchOptionsItemSelected(item); + } + + @Override + public void openOptionsMenu() { + if (!getSherlock().dispatchOpenOptionsMenu()) { + super.openOptionsMenu(); + } + } + + @Override + public void closeOptionsMenu() { + if (!getSherlock().dispatchCloseOptionsMenu()) { + super.closeOptionsMenu(); + } + } + + + /////////////////////////////////////////////////////////////////////////// + // Sherlock menu handling + /////////////////////////////////////////////////////////////////////////// + + @Override + public boolean onCreatePanelMenu(int featureId, Menu menu) { + if (featureId == Window.FEATURE_OPTIONS_PANEL) { + return onCreateOptionsMenu(menu); + } + return false; + } + + public boolean onCreateOptionsMenu(Menu menu) { + return true; + } + + @Override + public boolean onPreparePanel(int featureId, View view, Menu menu) { + if (featureId == Window.FEATURE_OPTIONS_PANEL) { + return onPrepareOptionsMenu(menu); + } + return false; + } + + public boolean onPrepareOptionsMenu(Menu menu) { + return true; + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + if (featureId == Window.FEATURE_OPTIONS_PANEL) { + return onOptionsItemSelected(item); + } + return false; + } + + public boolean onOptionsItemSelected(MenuItem item) { + return false; + } + + + /////////////////////////////////////////////////////////////////////////// + // Content + /////////////////////////////////////////////////////////////////////////// + + @Override + public void addContentView(View view, LayoutParams params) { + getSherlock().addContentView(view, params); + } + + @Override + public void setContentView(int layoutResId) { + getSherlock().setContentView(layoutResId); + } + + @Override + public void setContentView(View view, LayoutParams params) { + getSherlock().setContentView(view, params); + } + + @Override + public void setContentView(View view) { + getSherlock().setContentView(view); + } + + public void requestWindowFeature(long featureId) { + getSherlock().requestFeature((int)featureId); + } + + + /////////////////////////////////////////////////////////////////////////// + // Progress Indication + /////////////////////////////////////////////////////////////////////////// + + public void setSupportProgress(int progress) { + getSherlock().setProgress(progress); + } + + public void setSupportProgressBarIndeterminate(boolean indeterminate) { + getSherlock().setProgressBarIndeterminate(indeterminate); + } + + public void setSupportProgressBarIndeterminateVisibility(boolean visible) { + getSherlock().setProgressBarIndeterminateVisibility(visible); + } + + public void setSupportProgressBarVisibility(boolean visible) { + getSherlock().setProgressBarVisibility(visible); + } + + public void setSupportSecondaryProgress(int secondaryProgress) { + getSherlock().setSecondaryProgress(secondaryProgress); + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListFragment.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListFragment.java new file mode 100644 index 0000000000..13ca3c49fb --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockListFragment.java @@ -0,0 +1,68 @@ +package com.actionbarsherlock.app; + +import android.app.Activity; +import android.support.v4.app.ListFragment; +import com.actionbarsherlock.internal.view.menu.MenuItemWrapper; +import com.actionbarsherlock.internal.view.menu.MenuWrapper; +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; + +public class SherlockListFragment extends ListFragment implements OnCreateOptionsMenuListener, OnPrepareOptionsMenuListener, OnOptionsItemSelectedListener { + private SherlockFragmentActivity mActivity; + + public SherlockFragmentActivity getSherlockActivity() { + return mActivity; + } + + @Override + public void onAttach(Activity activity) { + if (!(activity instanceof SherlockFragmentActivity)) { + throw new IllegalStateException(getClass().getSimpleName() + " must be attached to a SherlockFragmentActivity."); + } + mActivity = (SherlockFragmentActivity)activity; + + super.onAttach(activity); + } + + @Override + public void onDetach() { + mActivity = null; + super.onDetach(); + } + + @Override + public final void onCreateOptionsMenu(android.view.Menu menu, android.view.MenuInflater inflater) { + onCreateOptionsMenu(new MenuWrapper(menu), mActivity.getSupportMenuInflater()); + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + //Nothing to see here. + } + + @Override + public final void onPrepareOptionsMenu(android.view.Menu menu) { + onPrepareOptionsMenu(new MenuWrapper(menu)); + } + + @Override + public void onPrepareOptionsMenu(Menu menu) { + //Nothing to see here. + } + + @Override + public final boolean onOptionsItemSelected(android.view.MenuItem item) { + return onOptionsItemSelected(new MenuItemWrapper(item)); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + //Nothing to see here. + return false; + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java new file mode 100644 index 0000000000..bee72cb258 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/app/SherlockPreferenceActivity.java @@ -0,0 +1,270 @@ +package com.actionbarsherlock.app; + +import android.content.res.Configuration; +import android.os.Bundle; +import android.preference.PreferenceActivity; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup.LayoutParams; +import android.view.Window; +import com.actionbarsherlock.ActionBarSherlock; +import com.actionbarsherlock.ActionBarSherlock.OnActionModeFinishedListener; +import com.actionbarsherlock.ActionBarSherlock.OnActionModeStartedListener; +import com.actionbarsherlock.ActionBarSherlock.OnCreatePanelMenuListener; +import com.actionbarsherlock.ActionBarSherlock.OnMenuItemSelectedListener; +import com.actionbarsherlock.ActionBarSherlock.OnPreparePanelListener; +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuInflater; +import com.actionbarsherlock.view.MenuItem; + +public abstract class SherlockPreferenceActivity extends PreferenceActivity implements OnCreatePanelMenuListener, OnPreparePanelListener, OnMenuItemSelectedListener, OnActionModeStartedListener, OnActionModeFinishedListener { + private ActionBarSherlock mSherlock; + + protected final ActionBarSherlock getSherlock() { + if (mSherlock == null) { + mSherlock = ActionBarSherlock.wrap(this, ActionBarSherlock.FLAG_DELEGATE); + } + return mSherlock; + } + + + /////////////////////////////////////////////////////////////////////////// + // Action bar and mode + /////////////////////////////////////////////////////////////////////////// + + public ActionBar getSupportActionBar() { + return getSherlock().getActionBar(); + } + + public ActionMode startActionMode(ActionMode.Callback callback) { + return getSherlock().startActionMode(callback); + } + + @Override + public void onActionModeStarted(ActionMode mode) {} + + @Override + public void onActionModeFinished(ActionMode mode) {} + + + /////////////////////////////////////////////////////////////////////////// + // General lifecycle/callback dispatching + /////////////////////////////////////////////////////////////////////////// + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + getSherlock().dispatchConfigurationChanged(newConfig); + } + + @Override + protected void onPostResume() { + super.onPostResume(); + getSherlock().dispatchPostResume(); + } + + @Override + protected void onPause() { + getSherlock().dispatchPause(); + super.onPause(); + } + + @Override + protected void onStop() { + getSherlock().dispatchStop(); + super.onStop(); + } + + @Override + protected void onDestroy() { + getSherlock().dispatchDestroy(); + super.onDestroy(); + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + getSherlock().dispatchPostCreate(savedInstanceState); + super.onPostCreate(savedInstanceState); + } + + @Override + protected void onTitleChanged(CharSequence title, int color) { + getSherlock().dispatchTitleChanged(title, color); + super.onTitleChanged(title, color); + } + + @Override + public final boolean onMenuOpened(int featureId, android.view.Menu menu) { + if (getSherlock().dispatchMenuOpened(featureId, menu)) { + return true; + } + return super.onMenuOpened(featureId, menu); + } + + @Override + public void onPanelClosed(int featureId, android.view.Menu menu) { + getSherlock().dispatchPanelClosed(featureId, menu); + super.onPanelClosed(featureId, menu); + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (getSherlock().dispatchKeyEvent(event)) { + return true; + } + return super.dispatchKeyEvent(event); + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + getSherlock().dispatchSaveInstanceState(outState); + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + getSherlock().dispatchRestoreInstanceState(savedInstanceState); + } + + /////////////////////////////////////////////////////////////////////////// + // Native menu handling + /////////////////////////////////////////////////////////////////////////// + + public MenuInflater getSupportMenuInflater() { + return getSherlock().getMenuInflater(); + } + + public void invalidateOptionsMenu() { + getSherlock().dispatchInvalidateOptionsMenu(); + } + + public void supportInvalidateOptionsMenu() { + invalidateOptionsMenu(); + } + + @Override + public final boolean onCreateOptionsMenu(android.view.Menu menu) { + return getSherlock().dispatchCreateOptionsMenu(menu); + } + + @Override + public final boolean onPrepareOptionsMenu(android.view.Menu menu) { + return getSherlock().dispatchPrepareOptionsMenu(menu); + } + + @Override + public final boolean onOptionsItemSelected(android.view.MenuItem item) { + return getSherlock().dispatchOptionsItemSelected(item); + } + + @Override + public void openOptionsMenu() { + if (!getSherlock().dispatchOpenOptionsMenu()) { + super.openOptionsMenu(); + } + } + + @Override + public void closeOptionsMenu() { + if (!getSherlock().dispatchCloseOptionsMenu()) { + super.closeOptionsMenu(); + } + } + + + /////////////////////////////////////////////////////////////////////////// + // Sherlock menu handling + /////////////////////////////////////////////////////////////////////////// + + @Override + public boolean onCreatePanelMenu(int featureId, Menu menu) { + if (featureId == Window.FEATURE_OPTIONS_PANEL) { + return onCreateOptionsMenu(menu); + } + return false; + } + + public boolean onCreateOptionsMenu(Menu menu) { + return true; + } + + @Override + public boolean onPreparePanel(int featureId, View view, Menu menu) { + if (featureId == Window.FEATURE_OPTIONS_PANEL) { + return onPrepareOptionsMenu(menu); + } + return false; + } + + public boolean onPrepareOptionsMenu(Menu menu) { + return true; + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + if (featureId == Window.FEATURE_OPTIONS_PANEL) { + return onOptionsItemSelected(item); + } + return false; + } + + public boolean onOptionsItemSelected(MenuItem item) { + return false; + } + + + /////////////////////////////////////////////////////////////////////////// + // Content + /////////////////////////////////////////////////////////////////////////// + + @Override + public void addContentView(View view, LayoutParams params) { + getSherlock().addContentView(view, params); + } + + @Override + public void setContentView(int layoutResId) { + getSherlock().setContentView(layoutResId); + } + + @Override + public void setContentView(View view, LayoutParams params) { + getSherlock().setContentView(view, params); + } + + @Override + public void setContentView(View view) { + getSherlock().setContentView(view); + } + + public void requestWindowFeature(long featureId) { + getSherlock().requestFeature((int)featureId); + } + + + /////////////////////////////////////////////////////////////////////////// + // Progress Indication + /////////////////////////////////////////////////////////////////////////// + + public void setSupportProgress(int progress) { + getSherlock().setProgress(progress); + } + + public void setSupportProgressBarIndeterminate(boolean indeterminate) { + getSherlock().setProgressBarIndeterminate(indeterminate); + } + + public void setSupportProgressBarIndeterminateVisibility(boolean visible) { + getSherlock().setProgressBarIndeterminateVisibility(visible); + } + + public void setSupportProgressBarVisibility(boolean visible) { + getSherlock().setProgressBarVisibility(visible); + } + + public void setSupportSecondaryProgress(int secondaryProgress) { + getSherlock().setSecondaryProgress(secondaryProgress); + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java new file mode 100644 index 0000000000..5e69275c7c --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockCompat.java @@ -0,0 +1,1203 @@ +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; +import android.content.res.AssetManager; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.os.Bundle; +import android.util.AndroidRuntimeException; +import android.util.Log; +import android.util.TypedValue; +import android.view.ContextThemeWrapper; +import android.view.KeyCharacterMap; +import android.view.KeyEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewStub; +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.R; +import com.actionbarsherlock.app.ActionBar; +import com.actionbarsherlock.internal.app.ActionBarImpl; +import com.actionbarsherlock.internal.view.StandaloneActionMode; +import com.actionbarsherlock.internal.view.menu.ActionMenuPresenter; +import com.actionbarsherlock.internal.view.menu.MenuBuilder; +import com.actionbarsherlock.internal.view.menu.MenuItemImpl; +import com.actionbarsherlock.internal.view.menu.MenuPresenter; +import com.actionbarsherlock.internal.widget.ActionBarContainer; +import com.actionbarsherlock.internal.widget.ActionBarContextView; +import com.actionbarsherlock.internal.widget.ActionBarView; +import com.actionbarsherlock.internal.widget.IcsProgressBar; +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; + +@ActionBarSherlock.Implementation(api = 7) +public class ActionBarSherlockCompat extends ActionBarSherlock implements MenuBuilder.Callback, com.actionbarsherlock.view.Window.Callback, MenuPresenter.Callback, android.view.MenuItem.OnMenuItemClickListener { + /** Window features which are enabled by default. */ + protected static final int DEFAULT_FEATURES = 0; + + static private final String PANELS_TAG = "sherlock:Panels"; + + public ActionBarSherlockCompat(Activity activity, int flags) { + super(activity, flags); + } + + + /////////////////////////////////////////////////////////////////////////// + // Properties + /////////////////////////////////////////////////////////////////////////// + + /** Whether or not the device has a dedicated menu key button. */ + private boolean mReserveOverflow; + /** Lazy-load indicator for {@link #mReserveOverflow}. */ + private boolean mReserveOverflowSet = false; + + /** Current menu instance for managing action items. */ + private MenuBuilder mMenu; + /** Map between native options items and sherlock items. */ + protected HashMap mNativeItemMap; + + /** Parent view of the window decoration (action bar, mode, etc.). */ + private ViewGroup mDecor; + /** Parent view of the activity content. */ + private ViewGroup mContentParent; + + /** Whether or not the title is stable and can be displayed. */ + private boolean mIsTitleReady = false; + /** Whether or not the parent activity has been destroyed. */ + private boolean mIsDestroyed = false; + + /* Emulate PanelFeatureState */ + private boolean mClosingActionMenu; + private boolean mMenuIsPrepared; + private boolean mMenuRefreshContent; + private Bundle mMenuFrozenActionViewState; + + /** Implementation which backs the action bar interface API. */ + private ActionBarImpl aActionBar; + /** Main action bar view which displays the core content. */ + private ActionBarView wActionBar; + /** Relevant window and action bar features flags. */ + private int mFeatures = DEFAULT_FEATURES; + /** Relevant user interface option flags. */ + private int mUiOptions = 0; + + /** Decor indeterminate progress indicator. */ + private IcsProgressBar mCircularProgressBar; + /** Decor progress indicator. */ + private IcsProgressBar mHorizontalProgressBar; + + /** Current displayed context action bar, if any. */ + private ActionMode mActionMode; + /** 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; + + + + /////////////////////////////////////////////////////////////////////////// + // Instance methods + /////////////////////////////////////////////////////////////////////////// + + @Override + public ActionBar getActionBar() { + if (DEBUG) Log.d(TAG, "[getActionBar]"); + + initActionBar(); + return aActionBar; + } + + private void initActionBar() { + if (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. + if (mDecor == null) { + installDecor(); + } + + if ((aActionBar != null) || !hasFeature(Window.FEATURE_ACTION_BAR) || hasFeature(Window.FEATURE_NO_TITLE) || mActivity.isChild()) { + return; + } + + aActionBar = new ActionBarImpl(mActivity, mFeatures); + + if (!mIsDelegate) { + //We may never get another chance to set the title + wActionBar.setWindowTitle(mActivity.getTitle()); + } + } + + @Override + protected Context getThemedContext() { + return aActionBar.getThemedContext(); + } + + @Override + public void setTitle(CharSequence title) { + if (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 (mActionMode != null) { + mActionMode.finish(); + } + + final ActionMode.Callback wrappedCallback = new ActionModeCallbackWrapper(callback); + ActionMode mode = null; + + //Emulate Activity's onWindowStartingActionMode: + initActionBar(); + if (aActionBar != null) { + mode = aActionBar.startActionMode(wrappedCallback); + } + + if (mode != null) { + mActionMode = mode; + } else { + if (mActionModeView == null) { + ViewStub stub = (ViewStub)mDecor.findViewById(R.id.abs__action_mode_bar_stub); + if (stub != null) { + mActionModeView = (ActionBarContextView)stub.inflate(); + } + } + if (mActionModeView != null) { + mActionModeView.killMode(); + mode = new StandaloneActionMode(mActivity, mActionModeView, wrappedCallback, true); + if (callback.onCreateActionMode(mode, mode.getMenu())) { + mode.invalidate(); + mActionModeView.initForMode(mode); + mActionModeView.setVisibility(View.VISIBLE); + mActionMode = mode; + mActionModeView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + } else { + mActionMode = null; + } + } + } + if (mActionMode != null && mActivity instanceof OnActionModeStartedListener) { + ((OnActionModeStartedListener)mActivity).onActionModeStarted(mActionMode); + } + return mActionMode; + } + + + /////////////////////////////////////////////////////////////////////////// + // Lifecycle and interaction callbacks for delegation + /////////////////////////////////////////////////////////////////////////// + + @Override + public void dispatchConfigurationChanged(Configuration newConfig) { + if (DEBUG) Log.d(TAG, "[dispatchConfigurationChanged] newConfig: " + newConfig); + + if (aActionBar != null) { + aActionBar.onConfigurationChanged(newConfig); + } + } + + @Override + public void dispatchPostResume() { + if (DEBUG) Log.d(TAG, "[dispatchPostResume]"); + + if (aActionBar != null) { + aActionBar.setShowHideAnimationEnabled(true); + } + } + + @Override + public void dispatchPause() { + if (DEBUG) Log.d(TAG, "[dispatchPause]"); + + if (wActionBar != null && wActionBar.isOverflowMenuShowing()) { + wActionBar.hideOverflowMenu(); + } + } + + @Override + public void dispatchStop() { + if (DEBUG) Log.d(TAG, "[dispatchStop]"); + + if (aActionBar != null) { + aActionBar.setShowHideAnimationEnabled(false); + } + } + + @Override + public void dispatchInvalidateOptionsMenu() { + if (DEBUG) Log.d(TAG, "[dispatchInvalidateOptionsMenu]"); + + Bundle savedActionViewStates = null; + if (mMenu != null) { + savedActionViewStates = new Bundle(); + mMenu.saveActionViewStates(savedActionViewStates); + if (savedActionViewStates.size() > 0) { + mMenuFrozenActionViewState = savedActionViewStates; + } + // This will be started again when the panel is prepared. + mMenu.stopDispatchingItemsChanged(); + mMenu.clear(); + } + mMenuRefreshContent = true; + + // Prepare the options panel if we have an action bar + if (wActionBar != null) { + mMenuIsPrepared = false; + preparePanel(); + } + } + + @Override + public boolean dispatchOpenOptionsMenu() { + if (DEBUG) Log.d(TAG, "[dispatchOpenOptionsMenu]"); + + if (!isReservingOverflow()) { + return false; + } + + return wActionBar.showOverflowMenu(); + } + + @Override + public boolean dispatchCloseOptionsMenu() { + if (DEBUG) Log.d(TAG, "[dispatchCloseOptionsMenu]"); + + if (!isReservingOverflow()) { + return false; + } + + if (wActionBar != null) { + return wActionBar.hideOverflowMenu(); + } + return false; + } + + @Override + public void dispatchPostCreate(Bundle savedInstanceState) { + if (DEBUG) Log.d(TAG, "[dispatchOnPostCreate]"); + + if (mIsDelegate) { + mIsTitleReady = true; + } + + if (mDecor == null) { + initActionBar(); + } + } + + @Override + public boolean dispatchCreateOptionsMenu(android.view.Menu menu) { + if (DEBUG) { + Log.d(TAG, "[dispatchCreateOptionsMenu] android.view.Menu: " + menu); + Log.d(TAG, "[dispatchCreateOptionsMenu] returning true"); + } + return true; + } + + @Override + public boolean dispatchPrepareOptionsMenu(android.view.Menu menu) { + if (DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] android.view.Menu: " + menu); + + if (mActionMode != null) { + return false; + } + + mMenuIsPrepared = false; + if (!preparePanel()) { + return false; + } + + if (isReservingOverflow()) { + return false; + } + + if (mNativeItemMap == null) { + mNativeItemMap = new HashMap(); + } else { + mNativeItemMap.clear(); + } + + if (mMenu == null) { + return false; + } + + boolean result = mMenu.bindNativeOverflow(menu, this, mNativeItemMap); + if (DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] returning " + result); + return result; + } + + @Override + public boolean dispatchOptionsItemSelected(android.view.MenuItem item) { + throw new IllegalStateException("Native callback invoked. Create a test case and report!"); + } + + @Override + public boolean dispatchMenuOpened(int featureId, android.view.Menu menu) { + if (DEBUG) Log.d(TAG, "[dispatchMenuOpened] featureId: " + featureId + ", menu: " + menu); + + if (featureId == Window.FEATURE_ACTION_BAR || featureId == Window.FEATURE_OPTIONS_PANEL) { + if (aActionBar != null) { + aActionBar.dispatchMenuVisibilityChanged(true); + } + return true; + } + + return false; + } + + @Override + public void dispatchPanelClosed(int featureId, android.view.Menu menu){ + if (DEBUG) Log.d(TAG, "[dispatchPanelClosed] featureId: " + featureId + ", menu: " + menu); + + if (featureId == Window.FEATURE_ACTION_BAR || featureId == Window.FEATURE_OPTIONS_PANEL) { + if (aActionBar != null) { + aActionBar.dispatchMenuVisibilityChanged(false); + } + } + } + + @Override + public void dispatchTitleChanged(CharSequence title, int color) { + if (DEBUG) Log.d(TAG, "[dispatchTitleChanged] title: " + title + ", color: " + color); + + if (!mIsDelegate || mIsTitleReady) { + if (mTitleView != null) { + mTitleView.setText(title); + } else if (wActionBar != null) { + wActionBar.setWindowTitle(title); + } + } + + mTitle = title; + } + + @Override + public boolean dispatchKeyEvent(KeyEvent event) { + if (DEBUG) Log.d(TAG, "[dispatchKeyEvent] event: " + event); + + final int keyCode = event.getKeyCode(); + + // Not handled by the view hierarchy, does the action bar want it + // to cancel out of something special? + if (keyCode == KeyEvent.KEYCODE_BACK) { + final int action = event.getAction(); + // Back cancels action modes first. + if (mActionMode != null) { + if (action == KeyEvent.ACTION_UP) { + mActionMode.finish(); + } + if (DEBUG) Log.d(TAG, "[dispatchKeyEvent] returning true"); + return true; + } + + // Next collapse any expanded action views. + if (wActionBar != null && wActionBar.hasExpandedActionView()) { + if (action == KeyEvent.ACTION_UP) { + wActionBar.collapseActionView(); + } + if (DEBUG) Log.d(TAG, "[dispatchKeyEvent] returning true"); + return true; + } + } + + if (DEBUG) Log.d(TAG, "[dispatchKeyEvent] returning false"); + return false; + } + + @Override + public void dispatchDestroy() { + mIsDestroyed = true; + } + + @Override + public void dispatchSaveInstanceState(Bundle outState) { + if (mMenu != null) { + mMenuFrozenActionViewState = new Bundle(); + mMenu.saveActionViewStates(mMenuFrozenActionViewState); + } + outState.putParcelable(PANELS_TAG, mMenuFrozenActionViewState); + } + + @Override + public void dispatchRestoreInstanceState(Bundle savedInstanceState) { + mMenuFrozenActionViewState = savedInstanceState.getParcelable(PANELS_TAG); + } + + /////////////////////////////////////////////////////////////////////////// + // Menu callback lifecycle and creation + /////////////////////////////////////////////////////////////////////////// + + private boolean preparePanel() { + // Already prepared (isPrepared will be reset to false later) + if (mMenuIsPrepared) { + return true; + } + + // Init the panel state's menu--return false if init failed + if (mMenu == null || mMenuRefreshContent) { + if (mMenu == null) { + if (!initializePanelMenu() || (mMenu == null)) { + return false; + } + } + + if (wActionBar != null) { + wActionBar.setMenu(mMenu, this); + } + + // Call callback, and return if it doesn't want to display menu. + + // Creating the panel menu will involve a lot of manipulation; + // don't dispatch change events to presenters until we're done. + mMenu.stopDispatchingItemsChanged(); + if (!callbackCreateOptionsMenu(mMenu)) { + // Ditch the menu created above + mMenu = null; + + if (wActionBar != null) { + // Don't show it in the action bar either + wActionBar.setMenu(null, this); + } + + return false; + } + + mMenuRefreshContent = false; + } + + // Callback and return if the callback does not want to show the menu + + // Preparing the panel menu can involve a lot of manipulation; + // don't dispatch change events to presenters until we're done. + mMenu.stopDispatchingItemsChanged(); + + // Restore action view state before we prepare. This gives apps + // an opportunity to override frozen/restored state in onPrepare. + if (mMenuFrozenActionViewState != null) { + mMenu.restoreActionViewStates(mMenuFrozenActionViewState); + mMenuFrozenActionViewState = null; + } + + if (!callbackPrepareOptionsMenu(mMenu)) { + if (wActionBar != null) { + // The app didn't want to show the menu for now but it still exists. + // Clear it out of the action bar. + wActionBar.setMenu(null, this); + } + mMenu.startDispatchingItemsChanged(); + return false; + } + + // Set the proper keymap + KeyCharacterMap kmap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD); + mMenu.setQwertyMode(kmap.getKeyboardType() != KeyCharacterMap.NUMERIC); + mMenu.startDispatchingItemsChanged(); + + // Set other state + mMenuIsPrepared = true; + + return true; + } + + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { + return callbackOptionsItemSelected(item); + } + + public void onMenuModeChange(MenuBuilder menu) { + reopenMenu(true); + } + + private void reopenMenu(boolean toggleMenuMode) { + if (wActionBar != null && wActionBar.isOverflowReserved()) { + if (!wActionBar.isOverflowMenuShowing() || !toggleMenuMode) { + if (wActionBar.getVisibility() == View.VISIBLE) { + if (callbackPrepareOptionsMenu(mMenu)) { + wActionBar.showOverflowMenu(); + } + } + } else { + wActionBar.hideOverflowMenu(); + } + return; + } + } + + private boolean initializePanelMenu() { + Context context = mActivity;//getContext(); + + // If we have an action bar, initialize the menu with a context themed for it. + if (wActionBar != null) { + TypedValue outValue = new TypedValue(); + Resources.Theme currentTheme = context.getTheme(); + currentTheme.resolveAttribute(R.attr.actionBarWidgetTheme, + outValue, true); + final int targetThemeRes = outValue.resourceId; + + if (targetThemeRes != 0 /*&& context.getThemeResId() != targetThemeRes*/) { + context = new ContextThemeWrapper(context, targetThemeRes); + } + } + + mMenu = new MenuBuilder(context); + mMenu.setCallback(this); + + return true; + } + + void checkCloseActionMenu(Menu menu) { + if (mClosingActionMenu) { + return; + } + + mClosingActionMenu = true; + wActionBar.dismissPopupMenus(); + //Callback cb = getCallback(); + //if (cb != null && !isDestroyed()) { + // cb.onPanelClosed(FEATURE_ACTION_BAR, menu); + //} + mClosingActionMenu = false; + } + + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + return true; + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + checkCloseActionMenu(menu); + } + + @Override + public boolean onMenuItemClick(android.view.MenuItem item) { + if (DEBUG) Log.d(TAG, "[mNativeItemListener.onMenuItemClick] item: " + item); + + final MenuItemImpl sherlockItem = mNativeItemMap.get(item); + if (sherlockItem != null) { + sherlockItem.invoke(); + } else { + Log.e(TAG, "Options item \"" + item + "\" not found in mapping"); + } + + return true; //Do not allow continuation of native handling + } + + @Override + public boolean onMenuItemSelected(int featureId, MenuItem item) { + return callbackOptionsItemSelected(item); + } + + + /////////////////////////////////////////////////////////////////////////// + // Progress bar interaction and internal handling + /////////////////////////////////////////////////////////////////////////// + + @Override + public void setProgressBarVisibility(boolean visible) { + if (DEBUG) Log.d(TAG, "[setProgressBarVisibility] visible: " + visible); + + setFeatureInt(Window.FEATURE_PROGRESS, visible ? Window.PROGRESS_VISIBILITY_ON : + Window.PROGRESS_VISIBILITY_OFF); + } + + @Override + public void setProgressBarIndeterminateVisibility(boolean visible) { + if (DEBUG) Log.d(TAG, "[setProgressBarIndeterminateVisibility] visible: " + visible); + + setFeatureInt(Window.FEATURE_INDETERMINATE_PROGRESS, + visible ? Window.PROGRESS_VISIBILITY_ON : Window.PROGRESS_VISIBILITY_OFF); + } + + @Override + public void setProgressBarIndeterminate(boolean indeterminate) { + if (DEBUG) Log.d(TAG, "[setProgressBarIndeterminate] indeterminate: " + indeterminate); + + setFeatureInt(Window.FEATURE_PROGRESS, + indeterminate ? Window.PROGRESS_INDETERMINATE_ON : Window.PROGRESS_INDETERMINATE_OFF); + } + + @Override + public void setProgress(int progress) { + if (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); + + setFeatureInt(Window.FEATURE_PROGRESS, + secondaryProgress + Window.PROGRESS_SECONDARY_START); + } + + private void setFeatureInt(int featureId, int value) { + updateInt(featureId, value, false); + } + + private void updateInt(int featureId, int value, boolean fromResume) { + // Do nothing if the decor is not yet installed... an update will + // need to be forced when we eventually become active. + if (mContentParent == null) { + return; + } + + final int featureMask = 1 << featureId; + + if ((getFeatures() & featureMask) == 0 && !fromResume) { + return; + } + + onIntChanged(featureId, value); + } + + private void onIntChanged(int featureId, int value) { + if (featureId == Window.FEATURE_PROGRESS || featureId == Window.FEATURE_INDETERMINATE_PROGRESS) { + updateProgressBars(value); + } + } + + private void updateProgressBars(int value) { + IcsProgressBar circularProgressBar = getCircularProgressBar(true); + IcsProgressBar horizontalProgressBar = getHorizontalProgressBar(true); + + final int features = mFeatures;//getLocalFeatures(); + if (value == Window.PROGRESS_VISIBILITY_ON) { + if ((features & (1 << Window.FEATURE_PROGRESS)) != 0) { + int level = horizontalProgressBar.getProgress(); + int visibility = (horizontalProgressBar.isIndeterminate() || level < 10000) ? + View.VISIBLE : View.INVISIBLE; + horizontalProgressBar.setVisibility(visibility); + } + if ((features & (1 << Window.FEATURE_INDETERMINATE_PROGRESS)) != 0) { + circularProgressBar.setVisibility(View.VISIBLE); + } + } else if (value == Window.PROGRESS_VISIBILITY_OFF) { + if ((features & (1 << Window.FEATURE_PROGRESS)) != 0) { + horizontalProgressBar.setVisibility(View.GONE); + } + if ((features & (1 << Window.FEATURE_INDETERMINATE_PROGRESS)) != 0) { + circularProgressBar.setVisibility(View.GONE); + } + } else if (value == Window.PROGRESS_INDETERMINATE_ON) { + horizontalProgressBar.setIndeterminate(true); + } else if (value == Window.PROGRESS_INDETERMINATE_OFF) { + horizontalProgressBar.setIndeterminate(false); + } else if (Window.PROGRESS_START <= value && value <= Window.PROGRESS_END) { + // We want to set the progress value before testing for visibility + // so that when the progress bar becomes visible again, it has the + // correct level. + horizontalProgressBar.setProgress(value - Window.PROGRESS_START); + + if (value < Window.PROGRESS_END) { + showProgressBars(horizontalProgressBar, circularProgressBar); + } else { + hideProgressBars(horizontalProgressBar, circularProgressBar); + } + } else if (Window.PROGRESS_SECONDARY_START <= value && value <= Window.PROGRESS_SECONDARY_END) { + horizontalProgressBar.setSecondaryProgress(value - Window.PROGRESS_SECONDARY_START); + + showProgressBars(horizontalProgressBar, circularProgressBar); + } + } + + private void showProgressBars(IcsProgressBar horizontalProgressBar, IcsProgressBar spinnyProgressBar) { + final int features = mFeatures;//getLocalFeatures(); + if ((features & (1 << Window.FEATURE_INDETERMINATE_PROGRESS)) != 0 && + spinnyProgressBar.getVisibility() == View.INVISIBLE) { + spinnyProgressBar.setVisibility(View.VISIBLE); + } + // Only show the progress bars if the primary progress is not complete + if ((features & (1 << Window.FEATURE_PROGRESS)) != 0 && + horizontalProgressBar.getProgress() < 10000) { + horizontalProgressBar.setVisibility(View.VISIBLE); + } + } + + private void hideProgressBars(IcsProgressBar horizontalProgressBar, IcsProgressBar spinnyProgressBar) { + final int features = mFeatures;//getLocalFeatures(); + Animation anim = AnimationUtils.loadAnimation(mActivity, android.R.anim.fade_out); + anim.setDuration(1000); + if ((features & (1 << Window.FEATURE_INDETERMINATE_PROGRESS)) != 0 && + spinnyProgressBar.getVisibility() == View.VISIBLE) { + spinnyProgressBar.startAnimation(anim); + spinnyProgressBar.setVisibility(View.INVISIBLE); + } + if ((features & (1 << Window.FEATURE_PROGRESS)) != 0 && + horizontalProgressBar.getVisibility() == View.VISIBLE) { + horizontalProgressBar.startAnimation(anim); + horizontalProgressBar.setVisibility(View.INVISIBLE); + } + } + + private IcsProgressBar getCircularProgressBar(boolean shouldInstallDecor) { + if (mCircularProgressBar != null) { + return mCircularProgressBar; + } + if (mContentParent == null && shouldInstallDecor) { + installDecor(); + } + mCircularProgressBar = (IcsProgressBar)mDecor.findViewById(R.id.abs__progress_circular); + if (mCircularProgressBar != null) { + mCircularProgressBar.setVisibility(View.INVISIBLE); + } + return mCircularProgressBar; + } + + private IcsProgressBar getHorizontalProgressBar(boolean shouldInstallDecor) { + if (mHorizontalProgressBar != null) { + return mHorizontalProgressBar; + } + if (mContentParent == null && shouldInstallDecor) { + installDecor(); + } + mHorizontalProgressBar = (IcsProgressBar)mDecor.findViewById(R.id.abs__progress_horizontal); + if (mHorizontalProgressBar != null) { + mHorizontalProgressBar.setVisibility(View.INVISIBLE); + } + return mHorizontalProgressBar; + } + + + /////////////////////////////////////////////////////////////////////////// + // Feature management and content interaction and creation + /////////////////////////////////////////////////////////////////////////// + + private int getFeatures() { + if (DEBUG) Log.d(TAG, "[getFeatures] returning " + mFeatures); + + return mFeatures; + } + + @Override + public boolean hasFeature(int featureId) { + if (DEBUG) Log.d(TAG, "[hasFeature] featureId: " + featureId); + + boolean result = (mFeatures & (1 << featureId)) != 0; + if (DEBUG) Log.d(TAG, "[hasFeature] returning " + result); + return result; + } + + @Override + public boolean requestFeature(int featureId) { + if (DEBUG) Log.d(TAG, "[requestFeature] featureId: " + featureId); + + if (mContentParent != null) { + throw new AndroidRuntimeException("requestFeature() must be called before adding content"); + } + + switch (featureId) { + case Window.FEATURE_ACTION_BAR: + case Window.FEATURE_ACTION_BAR_OVERLAY: + case Window.FEATURE_ACTION_MODE_OVERLAY: + case Window.FEATURE_INDETERMINATE_PROGRESS: + case Window.FEATURE_NO_TITLE: + case Window.FEATURE_PROGRESS: + mFeatures |= (1 << featureId); + return true; + + default: + return false; + } + } + + @Override + public void setUiOptions(int uiOptions) { + if (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); + + mUiOptions = (mUiOptions & ~mask) | (uiOptions & mask); + } + + @Override + public void setContentView(int layoutResId) { + if (DEBUG) Log.d(TAG, "[setContentView] layoutResId: " + layoutResId); + + if (mContentParent == null) { + installDecor(); + } else { + mContentParent.removeAllViews(); + } + mActivity.getLayoutInflater().inflate(layoutResId, mContentParent); + + android.view.Window.Callback callback = mActivity.getWindow().getCallback(); + if (callback != null) { + callback.onContentChanged(); + } + + initActionBar(); + } + + @Override + public void setContentView(View view, ViewGroup.LayoutParams params) { + if (DEBUG) Log.d(TAG, "[setContentView] view: " + view + ", params: " + params); + + if (mContentParent == null) { + installDecor(); + } else { + mContentParent.removeAllViews(); + } + mContentParent.addView(view, params); + + android.view.Window.Callback callback = mActivity.getWindow().getCallback(); + if (callback != null) { + callback.onContentChanged(); + } + + initActionBar(); + } + + @Override + public void addContentView(View view, ViewGroup.LayoutParams params) { + if (DEBUG) Log.d(TAG, "[addContentView] view: " + view + ", params: " + params); + + if (mContentParent == null) { + installDecor(); + } + mContentParent.addView(view, params); + + initActionBar(); + } + + private void installDecor() { + if (DEBUG) Log.d(TAG, "[installDecor]"); + + if (mDecor == null) { + mDecor = (ViewGroup)mActivity.getWindow().getDecorView().findViewById(android.R.id.content); + } + if (mContentParent == null) { + //Since we are not operating at the window level we need to take + //into account the fact that the true decor may have already been + //initialized and had content attached to it. If that is the case, + //copy over its children to our new content container. + List views = null; + if (mDecor.getChildCount() > 0) { + views = new ArrayList(1); //Usually there's only one child + for (int i = 0, children = mDecor.getChildCount(); i < children; i++) { + View child = mDecor.getChildAt(0); + mDecor.removeView(child); + views.add(child); + } + } + + mContentParent = generateLayout(); + + //Copy over the old children. See above for explanation. + if (views != null) { + for (View child : views) { + mContentParent.addView(child); + } + } + + 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); + if (wActionBar.getTitle() == null) { + wActionBar.setWindowTitle(mActivity.getTitle()); + } + if (hasFeature(Window.FEATURE_PROGRESS)) { + wActionBar.initProgress(); + } + if (hasFeature(Window.FEATURE_INDETERMINATE_PROGRESS)) { + wActionBar.initIndeterminateProgress(); + } + + //Since we don't require onCreate dispatching, parse for uiOptions here + int uiOptions = loadUiOptionsFromManifest(mActivity); + if (uiOptions != 0) { + mUiOptions = uiOptions; + } + + boolean splitActionBar = false; + final boolean splitWhenNarrow = (mUiOptions & ActivityInfo.UIOPTION_SPLIT_ACTION_BAR_WHEN_NARROW) != 0; + if (splitWhenNarrow) { + splitActionBar = getResources_getBoolean(mActivity, R.bool.abs__split_action_bar_is_narrow); + } else { + splitActionBar = mActivity.getTheme() + .obtainStyledAttributes(R.styleable.SherlockTheme) + .getBoolean(R.styleable.SherlockTheme_windowSplitActionBar, false); + } + final ActionBarContainer splitView = (ActionBarContainer)mDecor.findViewById(R.id.abs__split_action_bar); + if (splitView != null) { + wActionBar.setSplitView(splitView); + wActionBar.setSplitActionBar(splitActionBar); + wActionBar.setSplitWhenNarrow(splitWhenNarrow); + + mActionModeView = (ActionBarContextView)mDecor.findViewById(R.id.abs__action_context_bar); + mActionModeView.setSplitView(splitView); + mActionModeView.setSplitActionBar(splitActionBar); + mActionModeView.setSplitWhenNarrow(splitWhenNarrow); + } else if (splitActionBar) { + Log.e(TAG, "Requested split action bar with incompatible window decor! Ignoring request."); + } + + // Post the panel invalidate for later; avoid application onCreateOptionsMenu + // being called in the middle of onCreate or similar. + mDecor.post(new Runnable() { + @Override + public void run() { + //Invalidate if the panel menu hasn't been created before this. + if (!mIsDestroyed && !mActivity.isFinishing() && mMenu == null) { + dispatchInvalidateOptionsMenu(); + } + } + }); + } + } + } + } + + private ViewGroup generateLayout() { + if (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."); + } + + if (a.getBoolean(R.styleable.SherlockTheme_windowNoTitle, false)) { + requestFeature(Window.FEATURE_NO_TITLE); + } else if (a.getBoolean(R.styleable.SherlockTheme_windowActionBar, false)) { + // Don't allow an action bar if there is no title. + requestFeature(Window.FEATURE_ACTION_BAR); + } + + if (a.getBoolean(R.styleable.SherlockTheme_windowActionBarOverlay, false)) { + requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY); + } + + if (a.getBoolean(R.styleable.SherlockTheme_windowActionModeOverlay, false)) { + requestFeature(Window.FEATURE_ACTION_MODE_OVERLAY); + } + + a.recycle(); + + 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)); + View in = mActivity.getLayoutInflater().inflate(layoutResource, null); + mDecor.addView(in, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)); + + ViewGroup contentParent = (ViewGroup)mDecor.findViewById(R.id.abs__content); + if (contentParent == null) { + throw new RuntimeException("Couldn't find content container view"); + } + + //Make our new child the true content view (for fragments). VERY VOLATILE! + mDecor.setId(View.NO_ID); + contentParent.setId(android.R.id.content); + + if (hasFeature(Window.FEATURE_INDETERMINATE_PROGRESS)) { + IcsProgressBar progress = getCircularProgressBar(false); + if (progress != null) { + progress.setIndeterminate(true); + } + } + + return contentParent; + } + + + /////////////////////////////////////////////////////////////////////////// + // Miscellaneous + /////////////////////////////////////////////////////////////////////////// + + /** + * Determine whether or not the device has a dedicated menu key. + * + * @return {@code true} if native menu key is present. + */ + private boolean isReservingOverflow() { + if (!mReserveOverflowSet) { + mReserveOverflow = ActionMenuPresenter.reserveOverflow(mActivity); + mReserveOverflowSet = true; + } + return mReserveOverflow; + } + + private static int loadUiOptionsFromManifest(Activity activity) { + int uiOptions = 0; + try { + final String thisPackage = activity.getClass().getName(); + if (DEBUG) Log.i(TAG, "Parsing AndroidManifest.xml for " + thisPackage); + + final String packageName = activity.getApplicationInfo().packageName; + final AssetManager am = activity.createPackageContext(packageName, 0).getAssets(); + final XmlResourceParser xml = am.openXmlResourceParser("AndroidManifest.xml"); + + int eventType = xml.getEventType(); + while (eventType != XmlPullParser.END_DOCUMENT) { + if (eventType == XmlPullParser.START_TAG) { + String name = xml.getName(); + + if ("application".equals(name)) { + //Check if the has the attribute + if (DEBUG) Log.d(TAG, "Got "); + + for (int i = xml.getAttributeCount() - 1; i >= 0; i--) { + if (DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i)); + + if ("uiOptions".equals(xml.getAttributeName(i))) { + uiOptions = xml.getAttributeIntValue(i, 0); + break; //out of for loop + } + } + } else if ("activity".equals(name)) { + //Check if the is us and has the attribute + if (DEBUG) Log.d(TAG, "Got "); + Integer 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)); + + //We need both uiOptions and name attributes + String attrName = xml.getAttributeName(i); + if ("uiOptions".equals(attrName)) { + activityUiOptions = xml.getAttributeIntValue(i, 0); + } else if ("name".equals(attrName)) { + activityPackage = cleanActivityName(packageName, xml.getAttributeValue(i)); + if (!thisPackage.equals(activityPackage)) { + break; //out of for loop + } + isOurActivity = true; + } + + //Make sure we have both attributes before processing + if ((activityUiOptions != null) && (activityPackage != null)) { + //Our activity, uiOptions specified, override with our value + uiOptions = activityUiOptions.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(uiOptions)); + return uiOptions; + } + + public static String cleanActivityName(String manifestPackage, String activityName) { + if (activityName.charAt(0) == '.') { + //Relative activity name (e.g., android:name=".ui.SomeClass") + return manifestPackage + activityName; + } + if (activityName.indexOf('.', 1) == -1) { + //Unqualified activity name (e.g., android:name="SomeClass") + return manifestPackage + "." + activityName; + } + //Fully-qualified activity name (e.g., "com.my.package.SomeClass") + return activityName; + } + + /** + * Clears out internal reference when the action mode is destroyed. + */ + private class ActionModeCallbackWrapper implements ActionMode.Callback { + private final ActionMode.Callback mWrapped; + + public ActionModeCallbackWrapper(ActionMode.Callback wrapped) { + mWrapped = wrapped; + } + + public boolean onCreateActionMode(ActionMode mode, Menu menu) { + return mWrapped.onCreateActionMode(mode, menu); + } + + public boolean onPrepareActionMode(ActionMode mode, Menu menu) { + return mWrapped.onPrepareActionMode(mode, menu); + } + + public boolean onActionItemClicked(ActionMode mode, MenuItem item) { + return mWrapped.onActionItemClicked(mode, item); + } + + public void onDestroyActionMode(ActionMode mode) { + mWrapped.onDestroyActionMode(mode); + if (mActionModeView != null) { + mActionModeView.setVisibility(View.GONE); + mActionModeView.removeAllViews(); + } + if (mActivity instanceof OnActionModeFinishedListener) { + ((OnActionModeFinishedListener)mActivity).onActionModeFinished(mActionMode); + } + mActionMode = null; + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java new file mode 100644 index 0000000000..0824d3848f --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ActionBarSherlockNative.java @@ -0,0 +1,336 @@ +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; + +@ActionBarSherlock.Implementation(api = 14) +public class ActionBarSherlockNative extends ActionBarSherlock { + private ActionBarWrapper mActionBar; + private ActionModeWrapper mActionMode; + private MenuWrapper mMenu; + + public ActionBarSherlockNative(Activity activity, int flags) { + super(activity, flags); + } + + + @Override + public ActionBar getActionBar() { + if (DEBUG) Log.d(TAG, "[getActionBar]"); + + initActionBar(); + return mActionBar; + } + + private void initActionBar() { + if (mActionBar != null || mActivity.getActionBar() == null) { + return; + } + + mActionBar = new ActionBarWrapper(mActivity); + } + + @Override + public void dispatchInvalidateOptionsMenu() { + if (DEBUG) Log.d(TAG, "[dispatchInvalidateOptionsMenu]"); + + mActivity.getWindow().invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL); + } + + @Override + public boolean dispatchCreateOptionsMenu(android.view.Menu menu) { + if (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); + return result; + } + + @Override + public boolean dispatchPrepareOptionsMenu(android.view.Menu menu) { + if (DEBUG) Log.d(TAG, "[dispatchPrepareOptionsMenu] menu: " + menu); + + final boolean result = callbackPrepareOptionsMenu(mMenu); + if (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()); + + final boolean result = callbackOptionsItemSelected(mMenu.findItem(item)); + if (DEBUG) Log.d(TAG, "[dispatchOptionsItemSelected] returning " + result); + return result; + } + + @Override + public boolean hasFeature(int feature) { + if (DEBUG) Log.d(TAG, "[hasFeature] feature: " + feature); + + final boolean result = mActivity.getWindow().hasFeature(feature); + if (DEBUG) Log.d(TAG, "[hasFeature] returning " + result); + return result; + } + + @Override + public boolean requestFeature(int featureId) { + if (DEBUG) Log.d(TAG, "[requestFeature] featureId: " + featureId); + + final boolean result = mActivity.getWindow().requestFeature(featureId); + if (DEBUG) Log.d(TAG, "[requestFeature] returning " + result); + return result; + } + + @Override + public void setUiOptions(int uiOptions) { + if (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); + + mActivity.getWindow().setUiOptions(uiOptions, mask); + } + + @Override + public void setContentView(int layoutResId) { + if (DEBUG) Log.d(TAG, "[setContentView] layoutResId: " + layoutResId); + + mActivity.getWindow().setContentView(layoutResId); + initActionBar(); + } + + @Override + public void setContentView(View view, LayoutParams params) { + if (DEBUG) Log.d(TAG, "[setContentView] view: " + view + ", params: " + params); + + mActivity.getWindow().setContentView(view, params); + initActionBar(); + } + + @Override + public void addContentView(View view, LayoutParams params) { + if (DEBUG) Log.d(TAG, "[addContentView] view: " + view + ", params: " + params); + + mActivity.getWindow().addContentView(view, params); + initActionBar(); + } + + @Override + public void setTitle(CharSequence title) { + if (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); + + mActivity.setProgressBarVisibility(visible); + } + + @Override + public void setProgressBarIndeterminateVisibility(boolean visible) { + if (DEBUG) Log.d(TAG, "[setProgressBarIndeterminateVisibility] visible: " + visible); + + mActivity.setProgressBarIndeterminateVisibility(visible); + } + + @Override + public void setProgressBarIndeterminate(boolean indeterminate) { + if (DEBUG) Log.d(TAG, "[setProgressBarIndeterminate] indeterminate: " + indeterminate); + + mActivity.setProgressBarIndeterminate(indeterminate); + } + + @Override + public void setProgress(int progress) { + if (DEBUG) Log.d(TAG, "[setProgress] progress: " + progress); + + mActivity.setProgress(progress); + } + + @Override + public void setSecondaryProgress(int secondaryProgress) { + if (DEBUG) Log.d(TAG, "[setSecondaryProgress] secondaryProgress: " + secondaryProgress); + + mActivity.setSecondaryProgress(secondaryProgress); + } + + @Override + protected Context getThemedContext() { + Context context = mActivity; + TypedValue outValue = new TypedValue(); + mActivity.getTheme().resolveAttribute(android.R.attr.actionBarWidgetTheme, outValue, true); + if (outValue.resourceId != 0) { + //We are unable to test if this is the same as our current theme + //so we just wrap it and hope that if the attribute was specified + //then the user is intentionally specifying an alternate theme. + context = new ContextThemeWrapper(context, outValue.resourceId); + } + return context; + } + + @Override + public ActionMode startActionMode(com.actionbarsherlock.view.ActionMode.Callback callback) { + if (DEBUG) Log.d(TAG, "[startActionMode] callback: " + callback); + + if (mActionMode != null) { + mActionMode.finish(); + } + ActionModeCallbackWrapper wrapped = null; + if (callback != null) { + wrapped = new ActionModeCallbackWrapper(callback); + } + + //Calling this will trigger the callback wrapper's onCreate which + //is where we will set the new instance to mActionMode since we need + //to pass it through to the sherlock callbacks and the call below + //will not have returned yet to store its value. + if (mActivity.startActionMode(wrapped) == null) { + mActionMode = null; + } + if (mActivity instanceof OnActionModeStartedListener && mActionMode != null) { + ((OnActionModeStartedListener)mActivity).onActionModeStarted(mActionMode); + } + + return mActionMode; + } + + private class ActionModeCallbackWrapper implements android.view.ActionMode.Callback { + private final ActionMode.Callback mCallback; + + public ActionModeCallbackWrapper(ActionMode.Callback callback) { + mCallback = callback; + } + + @Override + public boolean onCreateActionMode(android.view.ActionMode mode, android.view.Menu menu) { + //See ActionBarSherlockNative#startActionMode + mActionMode = new ActionModeWrapper(mode); + + return mCallback.onCreateActionMode(mActionMode, mActionMode.getMenu()); + } + + @Override + public boolean onPrepareActionMode(android.view.ActionMode mode, android.view.Menu menu) { + return mCallback.onPrepareActionMode(mActionMode, mActionMode.getMenu()); + } + + @Override + public boolean onActionItemClicked(android.view.ActionMode mode, android.view.MenuItem item) { + return mCallback.onActionItemClicked(mActionMode, mActionMode.getMenu().findItem(item)); + } + + @Override + public void onDestroyActionMode(android.view.ActionMode mode) { + mCallback.onDestroyActionMode(mActionMode); + if (mActivity instanceof OnActionModeFinishedListener) { + ((OnActionModeFinishedListener)mActivity).onActionModeFinished(mActionMode); + } + } + } + + private class ActionModeWrapper extends ActionMode { + private final android.view.ActionMode mActionMode; + private MenuWrapper mMenu = null; + + ActionModeWrapper(android.view.ActionMode actionMode) { + mActionMode = actionMode; + } + + @Override + public void setTitle(CharSequence title) { + mActionMode.setTitle(title); + } + + @Override + public void setTitle(int resId) { + mActionMode.setTitle(resId); + } + + @Override + public void setSubtitle(CharSequence subtitle) { + mActionMode.setSubtitle(subtitle); + } + + @Override + public void setSubtitle(int resId) { + mActionMode.setSubtitle(resId); + } + + @Override + public void setCustomView(View view) { + mActionMode.setCustomView(view); + } + + @Override + public void invalidate() { + mActionMode.invalidate(); + } + + @Override + public void finish() { + mActionMode.finish(); + } + + @Override + public MenuWrapper getMenu() { + if (mMenu == null) { + mMenu = new MenuWrapper(mActionMode.getMenu()); + } + return mMenu; + } + + @Override + public CharSequence getTitle() { + return mActionMode.getTitle(); + } + + @Override + public CharSequence getSubtitle() { + return mActionMode.getSubtitle(); + } + + @Override + public View getCustomView() { + return mActionMode.getCustomView(); + } + + @Override + public MenuInflater getMenuInflater() { + return ActionBarSherlockNative.this.getMenuInflater(); + } + + @Override + public void setTag(Object tag) { + mActionMode.setTag(tag); + } + + @Override + public Object getTag() { + return mActionMode.getTag(); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ResourcesCompat.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ResourcesCompat.java new file mode 100644 index 0000000000..8e1efe8c54 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/ResourcesCompat.java @@ -0,0 +1,95 @@ +package com.actionbarsherlock.internal; + +import android.content.Context; +import android.os.Build; +import android.util.DisplayMetrics; +import com.actionbarsherlock.R; + +public final class ResourcesCompat { + //No instances + private ResourcesCompat() {} + + + /** + * Support implementation of {@code getResources().getBoolean()} that we + * 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 + * 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) { + return context.getResources().getBoolean(id); + } + + DisplayMetrics metrics = context.getResources().getDisplayMetrics(); + float widthDp = metrics.widthPixels / metrics.density; + float heightDp = metrics.heightPixels / metrics.density; + float smallestWidthDp = (widthDp < heightDp) ? widthDp : heightDp; + + if (id == R.bool.abs__action_bar_embed_tabs) { + if (widthDp >= 480) { + return true; //values-w480dp + } + return false; //values + } + if (id == R.bool.abs__split_action_bar_is_narrow) { + if (widthDp >= 480) { + return false; //values-w480dp + } + return true; //values + } + if (id == R.bool.abs__action_bar_expanded_action_views_exclusive) { + if (smallestWidthDp >= 600) { + return false; //values-sw600dp + } + return true; //values + } + if (id == R.bool.abs__config_allowActionMenuItemTextWithIcon) { + if (widthDp >= 480) { + return true; //values-w480dp + } + return false; //values + } + + throw new IllegalArgumentException("Unknown boolean resource ID " + id); + } + + /** + * Support implementation of {@code getResources().getInteger()} that we + * can use to simulate filtering based on width qualifiers on pre-3.2. + * + * @param context Context to load integers from on 3.2+ and to fetch the + * display metrics. + * @param id Id of integer to load. + * @return Associated integer value as reflected by the current display + * metrics. + */ + public static int getResources_getInteger(Context context, int id) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) { + return context.getResources().getInteger(id); + } + + DisplayMetrics metrics = context.getResources().getDisplayMetrics(); + float widthDp = metrics.widthPixels / metrics.density; + + if (id == R.integer.abs__max_action_buttons) { + if (widthDp >= 600) { + return 5; //values-w600dp + } + if (widthDp >= 500) { + return 4; //values-w500dp + } + if (widthDp >= 360) { + return 3; //values-w360dp + } + return 2; //values + } + + throw new IllegalArgumentException("Unknown integer resource ID " + id); + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarImpl.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarImpl.java new file mode 100644 index 0000000000..d022a24659 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarImpl.java @@ -0,0 +1,1026 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.app; + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import android.app.Activity; +import android.app.Dialog; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Handler; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentTransaction; +import android.util.TypedValue; +import android.view.ContextThemeWrapper; +import android.view.LayoutInflater; +import android.view.View; +import android.view.Window; +import android.view.accessibility.AccessibilityEvent; +import android.widget.SpinnerAdapter; +import com.actionbarsherlock.R; +import com.actionbarsherlock.app.ActionBar; +import com.actionbarsherlock.internal.nineoldandroids.animation.Animator; +import com.actionbarsherlock.internal.nineoldandroids.animation.AnimatorListenerAdapter; +import com.actionbarsherlock.internal.nineoldandroids.animation.AnimatorSet; +import com.actionbarsherlock.internal.nineoldandroids.animation.ObjectAnimator; +import com.actionbarsherlock.internal.nineoldandroids.animation.Animator.AnimatorListener; +import com.actionbarsherlock.internal.nineoldandroids.widget.NineFrameLayout; +import com.actionbarsherlock.internal.view.menu.MenuBuilder; +import com.actionbarsherlock.internal.view.menu.MenuPopupHelper; +import com.actionbarsherlock.internal.view.menu.SubMenuBuilder; +import com.actionbarsherlock.internal.widget.ActionBarContainer; +import com.actionbarsherlock.internal.widget.ActionBarContextView; +import com.actionbarsherlock.internal.widget.ActionBarView; +import com.actionbarsherlock.internal.widget.ScrollingTabContainerView; +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuInflater; +import com.actionbarsherlock.view.MenuItem; +import static com.actionbarsherlock.internal.ResourcesCompat.getResources_getBoolean; + +/** + * ActionBarImpl is the ActionBar implementation used + * by devices of all screen sizes. If it detects a compatible decor, + * it will split contextual modes across both the ActionBarView at + * the top of the screen and a horizontal LinearLayout at the bottom + * which is normally hidden. + */ +public class ActionBarImpl extends ActionBar { + //UNUSED private static final String TAG = "ActionBarImpl"; + + private Context mContext; + private Context mThemedContext; + private Activity mActivity; + //UNUSED private Dialog mDialog; + + private ActionBarContainer mContainerView; + private ActionBarView mActionView; + private ActionBarContextView mContextView; + private ActionBarContainer mSplitView; + private NineFrameLayout mContentView; + private ScrollingTabContainerView mTabScrollView; + + private ArrayList mTabs = new ArrayList(); + + private TabImpl mSelectedTab; + private int mSavedTabPosition = INVALID_POSITION; + + ActionModeImpl mActionMode; + ActionMode mDeferredDestroyActionMode; + ActionMode.Callback mDeferredModeDestroyCallback; + + private boolean mLastMenuVisibility; + private ArrayList mMenuVisibilityListeners = + new ArrayList(); + + private static final int CONTEXT_DISPLAY_NORMAL = 0; + private static final int CONTEXT_DISPLAY_SPLIT = 1; + + private static final int INVALID_POSITION = -1; + + private int mContextDisplayMode; + private boolean mHasEmbeddedTabs; + + final Handler mHandler = new Handler(); + Runnable mTabSelector; + + private Animator mCurrentShowAnim; + private Animator mCurrentModeAnim; + private boolean mShowHideAnimationEnabled; + boolean mWasHiddenBeforeMode; + + final AnimatorListener mHideListener = new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + if (mContentView != null) { + mContentView.setTranslationY(0); + mContainerView.setTranslationY(0); + } + if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { + mSplitView.setVisibility(View.GONE); + } + mContainerView.setVisibility(View.GONE); + mContainerView.setTransitioning(false); + mCurrentShowAnim = null; + completeDeferredDestroyActionMode(); + } + }; + + final AnimatorListener mShowListener = new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + mCurrentShowAnim = null; + mContainerView.requestLayout(); + } + }; + + public ActionBarImpl(Activity activity, int features) { + mActivity = activity; + Window window = activity.getWindow(); + View decor = window.getDecorView(); + init(decor); + + //window.hasFeature() workaround for pre-3.0 + if ((features & (1 << Window.FEATURE_ACTION_BAR_OVERLAY)) == 0) { + mContentView = (NineFrameLayout)decor.findViewById(android.R.id.content); + } + } + + public ActionBarImpl(Dialog dialog) { + //UNUSED mDialog = dialog; + init(dialog.getWindow().getDecorView()); + } + + private void init(View decor) { + mContext = decor.getContext(); + mActionView = (ActionBarView) decor.findViewById(R.id.abs__action_bar); + mContextView = (ActionBarContextView) decor.findViewById( + R.id.abs__action_context_bar); + mContainerView = (ActionBarContainer) decor.findViewById( + R.id.abs__action_bar_container); + mSplitView = (ActionBarContainer) decor.findViewById( + R.id.abs__split_action_bar); + + if (mActionView == null || mContextView == null || mContainerView == null) { + throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + + "with a compatible window decor layout"); + } + + mActionView.setContextView(mContextView); + mContextDisplayMode = mActionView.isSplitActionBar() ? + CONTEXT_DISPLAY_SPLIT : CONTEXT_DISPLAY_NORMAL; + + // Older apps get the home button interaction enabled by default. + // Newer apps need to enable it explicitly. + setHomeButtonEnabled(mContext.getApplicationInfo().targetSdkVersion < 14); + + setHasEmbeddedTabs(getResources_getBoolean(mContext, + R.bool.abs__action_bar_embed_tabs)); + } + + public void onConfigurationChanged(Configuration newConfig) { + setHasEmbeddedTabs(getResources_getBoolean(mContext, + R.bool.abs__action_bar_embed_tabs)); + + //Manually dispatch a configuration change to the action bar view on pre-2.2 + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) { + mActionView.onConfigurationChanged(newConfig); + if (mContextView != null) { + mContextView.onConfigurationChanged(newConfig); + } + } + } + + private void setHasEmbeddedTabs(boolean hasEmbeddedTabs) { + mHasEmbeddedTabs = hasEmbeddedTabs; + // Switch tab layout configuration if needed + if (!mHasEmbeddedTabs) { + mActionView.setEmbeddedTabView(null); + mContainerView.setTabContainer(mTabScrollView); + } else { + mContainerView.setTabContainer(null); + mActionView.setEmbeddedTabView(mTabScrollView); + } + final boolean isInTabMode = getNavigationMode() == NAVIGATION_MODE_TABS; + if (mTabScrollView != null) { + mTabScrollView.setVisibility(isInTabMode ? View.VISIBLE : View.GONE); + } + mActionView.setCollapsable(!mHasEmbeddedTabs && isInTabMode); + } + + private void ensureTabsExist() { + if (mTabScrollView != null) { + return; + } + + ScrollingTabContainerView tabScroller = new ScrollingTabContainerView(mContext); + + if (mHasEmbeddedTabs) { + tabScroller.setVisibility(View.VISIBLE); + mActionView.setEmbeddedTabView(tabScroller); + } else { + tabScroller.setVisibility(getNavigationMode() == NAVIGATION_MODE_TABS ? + View.VISIBLE : View.GONE); + mContainerView.setTabContainer(tabScroller); + } + mTabScrollView = tabScroller; + } + + void completeDeferredDestroyActionMode() { + if (mDeferredModeDestroyCallback != null) { + mDeferredModeDestroyCallback.onDestroyActionMode(mDeferredDestroyActionMode); + mDeferredDestroyActionMode = null; + mDeferredModeDestroyCallback = null; + } + } + + /** + * Enables or disables animation between show/hide states. + * If animation is disabled using this method, animations in progress + * will be finished. + * + * @param enabled true to animate, false to not animate. + */ + public void setShowHideAnimationEnabled(boolean enabled) { + mShowHideAnimationEnabled = enabled; + if (!enabled && mCurrentShowAnim != null) { + mCurrentShowAnim.end(); + } + } + + public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) { + mMenuVisibilityListeners.add(listener); + } + + public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) { + mMenuVisibilityListeners.remove(listener); + } + + public void dispatchMenuVisibilityChanged(boolean isVisible) { + if (isVisible == mLastMenuVisibility) { + return; + } + mLastMenuVisibility = isVisible; + + final int count = mMenuVisibilityListeners.size(); + for (int i = 0; i < count; i++) { + mMenuVisibilityListeners.get(i).onMenuVisibilityChanged(isVisible); + } + } + + @Override + public void setCustomView(int resId) { + setCustomView(LayoutInflater.from(getThemedContext()).inflate(resId, mActionView, false)); + } + + @Override + public void setDisplayUseLogoEnabled(boolean useLogo) { + setDisplayOptions(useLogo ? DISPLAY_USE_LOGO : 0, DISPLAY_USE_LOGO); + } + + @Override + public void setDisplayShowHomeEnabled(boolean showHome) { + setDisplayOptions(showHome ? DISPLAY_SHOW_HOME : 0, DISPLAY_SHOW_HOME); + } + + @Override + public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) { + setDisplayOptions(showHomeAsUp ? DISPLAY_HOME_AS_UP : 0, DISPLAY_HOME_AS_UP); + } + + @Override + public void setDisplayShowTitleEnabled(boolean showTitle) { + setDisplayOptions(showTitle ? DISPLAY_SHOW_TITLE : 0, DISPLAY_SHOW_TITLE); + } + + @Override + public void setDisplayShowCustomEnabled(boolean showCustom) { + setDisplayOptions(showCustom ? DISPLAY_SHOW_CUSTOM : 0, DISPLAY_SHOW_CUSTOM); + } + + @Override + public void setHomeButtonEnabled(boolean enable) { + mActionView.setHomeButtonEnabled(enable); + } + + @Override + public void setTitle(int resId) { + setTitle(mContext.getString(resId)); + } + + @Override + public void setSubtitle(int resId) { + setSubtitle(mContext.getString(resId)); + } + + public void setSelectedNavigationItem(int position) { + switch (mActionView.getNavigationMode()) { + case NAVIGATION_MODE_TABS: + selectTab(mTabs.get(position)); + break; + case NAVIGATION_MODE_LIST: + mActionView.setDropdownSelectedPosition(position); + break; + default: + throw new IllegalStateException( + "setSelectedNavigationIndex not valid for current navigation mode"); + } + } + + public void removeAllTabs() { + cleanupTabs(); + } + + private void cleanupTabs() { + if (mSelectedTab != null) { + selectTab(null); + } + mTabs.clear(); + if (mTabScrollView != null) { + mTabScrollView.removeAllTabs(); + } + mSavedTabPosition = INVALID_POSITION; + } + + public void setTitle(CharSequence title) { + mActionView.setTitle(title); + } + + public void setSubtitle(CharSequence subtitle) { + mActionView.setSubtitle(subtitle); + } + + public void setDisplayOptions(int options) { + mActionView.setDisplayOptions(options); + } + + public void setDisplayOptions(int options, int mask) { + final int current = mActionView.getDisplayOptions(); + mActionView.setDisplayOptions((options & mask) | (current & ~mask)); + } + + public void setBackgroundDrawable(Drawable d) { + mContainerView.setPrimaryBackground(d); + } + + public void setStackedBackgroundDrawable(Drawable d) { + mContainerView.setStackedBackground(d); + } + + public void setSplitBackgroundDrawable(Drawable d) { + if (mSplitView != null) { + mSplitView.setSplitBackground(d); + } + } + + public View getCustomView() { + return mActionView.getCustomNavigationView(); + } + + public CharSequence getTitle() { + return mActionView.getTitle(); + } + + public CharSequence getSubtitle() { + return mActionView.getSubtitle(); + } + + public int getNavigationMode() { + return mActionView.getNavigationMode(); + } + + public int getDisplayOptions() { + return mActionView.getDisplayOptions(); + } + + public ActionMode startActionMode(ActionMode.Callback callback) { + boolean wasHidden = false; + if (mActionMode != null) { + wasHidden = mWasHiddenBeforeMode; + mActionMode.finish(); + } + + mContextView.killMode(); + ActionModeImpl mode = new ActionModeImpl(callback); + if (mode.dispatchOnCreate()) { + mWasHiddenBeforeMode = !isShowing() || wasHidden; + mode.invalidate(); + mContextView.initForMode(mode); + animateToMode(true); + if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { + // TODO animate this + mSplitView.setVisibility(View.VISIBLE); + } + mContextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + mActionMode = mode; + return mode; + } + return null; + } + + private void configureTab(Tab tab, int position) { + final TabImpl tabi = (TabImpl) tab; + final ActionBar.TabListener callback = tabi.getCallback(); + + if (callback == null) { + throw new IllegalStateException("Action Bar Tab must have a Callback"); + } + + tabi.setPosition(position); + mTabs.add(position, tabi); + + final int count = mTabs.size(); + for (int i = position + 1; i < count; i++) { + mTabs.get(i).setPosition(i); + } + } + + @Override + public void addTab(Tab tab) { + addTab(tab, mTabs.isEmpty()); + } + + @Override + public void addTab(Tab tab, int position) { + addTab(tab, position, mTabs.isEmpty()); + } + + @Override + public void addTab(Tab tab, boolean setSelected) { + ensureTabsExist(); + mTabScrollView.addTab(tab, setSelected); + configureTab(tab, mTabs.size()); + if (setSelected) { + selectTab(tab); + } + } + + @Override + public void addTab(Tab tab, int position, boolean setSelected) { + ensureTabsExist(); + mTabScrollView.addTab(tab, position, setSelected); + configureTab(tab, position); + if (setSelected) { + selectTab(tab); + } + } + + @Override + public Tab newTab() { + return new TabImpl(); + } + + @Override + public void removeTab(Tab tab) { + removeTabAt(tab.getPosition()); + } + + @Override + public void removeTabAt(int position) { + if (mTabScrollView == null) { + // No tabs around to remove + return; + } + + int selectedTabPosition = mSelectedTab != null + ? mSelectedTab.getPosition() : mSavedTabPosition; + mTabScrollView.removeTabAt(position); + TabImpl removedTab = mTabs.remove(position); + if (removedTab != null) { + removedTab.setPosition(-1); + } + + final int newTabCount = mTabs.size(); + for (int i = position; i < newTabCount; i++) { + mTabs.get(i).setPosition(i); + } + + if (selectedTabPosition == position) { + selectTab(mTabs.isEmpty() ? null : mTabs.get(Math.max(0, position - 1))); + } + } + + @Override + public void selectTab(Tab tab) { + if (getNavigationMode() != NAVIGATION_MODE_TABS) { + mSavedTabPosition = tab != null ? tab.getPosition() : INVALID_POSITION; + return; + } + + FragmentTransaction trans = null; + if (mActivity instanceof FragmentActivity) { + trans = ((FragmentActivity)mActivity).getSupportFragmentManager().beginTransaction() + .disallowAddToBackStack(); + } + + if (mSelectedTab == tab) { + if (mSelectedTab != null) { + mSelectedTab.getCallback().onTabReselected(mSelectedTab, trans); + mTabScrollView.animateToTab(tab.getPosition()); + } + } else { + mTabScrollView.setTabSelected(tab != null ? tab.getPosition() : Tab.INVALID_POSITION); + if (mSelectedTab != null) { + mSelectedTab.getCallback().onTabUnselected(mSelectedTab, trans); + } + mSelectedTab = (TabImpl) tab; + if (mSelectedTab != null) { + mSelectedTab.getCallback().onTabSelected(mSelectedTab, trans); + } + } + + if (trans != null && !trans.isEmpty()) { + trans.commit(); + } + } + + @Override + public Tab getSelectedTab() { + return mSelectedTab; + } + + @Override + public int getHeight() { + return mContainerView.getHeight(); + } + + @Override + public void show() { + show(true); + } + + void show(boolean markHiddenBeforeMode) { + if (mCurrentShowAnim != null) { + mCurrentShowAnim.end(); + } + if (mContainerView.getVisibility() == View.VISIBLE) { + if (markHiddenBeforeMode) mWasHiddenBeforeMode = false; + return; + } + mContainerView.setVisibility(View.VISIBLE); + + if (mShowHideAnimationEnabled) { + mContainerView.setAlpha(0); + AnimatorSet anim = new AnimatorSet(); + AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 1)); + if (mContentView != null) { + b.with(ObjectAnimator.ofFloat(mContentView, "translationY", + -mContainerView.getHeight(), 0)); + mContainerView.setTranslationY(-mContainerView.getHeight()); + b.with(ObjectAnimator.ofFloat(mContainerView, "translationY", 0)); + } + if (mSplitView != null && mContextDisplayMode == CONTEXT_DISPLAY_SPLIT) { + mSplitView.setAlpha(0); + mSplitView.setVisibility(View.VISIBLE); + b.with(ObjectAnimator.ofFloat(mSplitView, "alpha", 1)); + } + anim.addListener(mShowListener); + mCurrentShowAnim = anim; + anim.start(); + } else { + mContainerView.setAlpha(1); + mContainerView.setTranslationY(0); + mShowListener.onAnimationEnd(null); + } + } + + @Override + public void hide() { + if (mCurrentShowAnim != null) { + mCurrentShowAnim.end(); + } + if (mContainerView.getVisibility() == View.GONE) { + return; + } + + if (mShowHideAnimationEnabled) { + mContainerView.setAlpha(1); + mContainerView.setTransitioning(true); + AnimatorSet anim = new AnimatorSet(); + AnimatorSet.Builder b = anim.play(ObjectAnimator.ofFloat(mContainerView, "alpha", 0)); + if (mContentView != null) { + b.with(ObjectAnimator.ofFloat(mContentView, "translationY", + 0, -mContainerView.getHeight())); + b.with(ObjectAnimator.ofFloat(mContainerView, "translationY", + -mContainerView.getHeight())); + } + if (mSplitView != null && mSplitView.getVisibility() == View.VISIBLE) { + mSplitView.setAlpha(1); + b.with(ObjectAnimator.ofFloat(mSplitView, "alpha", 0)); + } + anim.addListener(mHideListener); + mCurrentShowAnim = anim; + anim.start(); + } else { + mHideListener.onAnimationEnd(null); + } + } + + public boolean isShowing() { + return mContainerView.getVisibility() == View.VISIBLE; + } + + void animateToMode(boolean toActionMode) { + if (toActionMode) { + show(false); + } + if (mCurrentModeAnim != null) { + mCurrentModeAnim.end(); + } + + mActionView.animateToVisibility(toActionMode ? View.GONE : View.VISIBLE); + mContextView.animateToVisibility(toActionMode ? View.VISIBLE : View.GONE); + if (mTabScrollView != null && !mActionView.hasEmbeddedTabs() && mActionView.isCollapsed()) { + mTabScrollView.animateToVisibility(toActionMode ? View.GONE : View.VISIBLE); + } + } + + public Context getThemedContext() { + if (mThemedContext == null) { + TypedValue outValue = new TypedValue(); + Resources.Theme currentTheme = mContext.getTheme(); + currentTheme.resolveAttribute(R.attr.actionBarWidgetTheme, + outValue, true); + final int targetThemeRes = outValue.resourceId; + + if (targetThemeRes != 0) { //XXX && mContext.getThemeResId() != targetThemeRes) { + mThemedContext = new ContextThemeWrapper(mContext, targetThemeRes); + } else { + mThemedContext = mContext; + } + } + return mThemedContext; + } + + /** + * @hide + */ + public class ActionModeImpl extends ActionMode implements MenuBuilder.Callback { + private ActionMode.Callback mCallback; + private MenuBuilder mMenu; + private WeakReference mCustomView; + + public ActionModeImpl(ActionMode.Callback callback) { + mCallback = callback; + mMenu = new MenuBuilder(getThemedContext()) + .setDefaultShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + mMenu.setCallback(this); + } + + @Override + public MenuInflater getMenuInflater() { + return new MenuInflater(getThemedContext()); + } + + @Override + public Menu getMenu() { + return mMenu; + } + + @Override + public void finish() { + if (mActionMode != this) { + // Not the active action mode - no-op + return; + } + + // If we were hidden before the mode was shown, defer the onDestroy + // callback until the animation is finished and associated relayout + // is about to happen. This lets apps better anticipate visibility + // and layout behavior. + if (mWasHiddenBeforeMode) { + mDeferredDestroyActionMode = this; + mDeferredModeDestroyCallback = mCallback; + } else { + mCallback.onDestroyActionMode(this); + } + mCallback = null; + animateToMode(false); + + // Clear out the context mode views after the animation finishes + mContextView.closeMode(); + mActionView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + + mActionMode = null; + + if (mWasHiddenBeforeMode) { + hide(); + } + } + + @Override + public void invalidate() { + mMenu.stopDispatchingItemsChanged(); + try { + mCallback.onPrepareActionMode(this, mMenu); + } finally { + mMenu.startDispatchingItemsChanged(); + } + } + + public boolean dispatchOnCreate() { + mMenu.stopDispatchingItemsChanged(); + try { + return mCallback.onCreateActionMode(this, mMenu); + } finally { + mMenu.startDispatchingItemsChanged(); + } + } + + @Override + public void setCustomView(View view) { + mContextView.setCustomView(view); + mCustomView = new WeakReference(view); + } + + @Override + public void setSubtitle(CharSequence subtitle) { + mContextView.setSubtitle(subtitle); + } + + @Override + public void setTitle(CharSequence title) { + mContextView.setTitle(title); + } + + @Override + public void setTitle(int resId) { + setTitle(mContext.getResources().getString(resId)); + } + + @Override + public void setSubtitle(int resId) { + setSubtitle(mContext.getResources().getString(resId)); + } + + @Override + public CharSequence getTitle() { + return mContextView.getTitle(); + } + + @Override + public CharSequence getSubtitle() { + return mContextView.getSubtitle(); + } + + @Override + public View getCustomView() { + return mCustomView != null ? mCustomView.get() : null; + } + + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { + if (mCallback != null) { + return mCallback.onActionItemClicked(this, item); + } else { + return false; + } + } + + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + } + + public boolean onSubMenuSelected(SubMenuBuilder subMenu) { + if (mCallback == null) { + return false; + } + + if (!subMenu.hasVisibleItems()) { + return true; + } + + new MenuPopupHelper(getThemedContext(), subMenu).show(); + return true; + } + + public void onCloseSubMenu(SubMenuBuilder menu) { + } + + public void onMenuModeChange(MenuBuilder menu) { + if (mCallback == null) { + return; + } + invalidate(); + mContextView.showOverflowMenu(); + } + } + + /** + * @hide + */ + public class TabImpl extends ActionBar.Tab { + private ActionBar.TabListener mCallback; + private Object mTag; + private Drawable mIcon; + private CharSequence mText; + private CharSequence mContentDesc; + private int mPosition = -1; + private View mCustomView; + + @Override + public Object getTag() { + return mTag; + } + + @Override + public Tab setTag(Object tag) { + mTag = tag; + return this; + } + + public ActionBar.TabListener getCallback() { + return mCallback; + } + + @Override + public Tab setTabListener(ActionBar.TabListener callback) { + mCallback = callback; + return this; + } + + @Override + public View getCustomView() { + return mCustomView; + } + + @Override + public Tab setCustomView(View view) { + mCustomView = view; + if (mPosition >= 0) { + mTabScrollView.updateTab(mPosition); + } + return this; + } + + @Override + public Tab setCustomView(int layoutResId) { + return setCustomView(LayoutInflater.from(getThemedContext()) + .inflate(layoutResId, null)); + } + + @Override + public Drawable getIcon() { + return mIcon; + } + + @Override + public int getPosition() { + return mPosition; + } + + public void setPosition(int position) { + mPosition = position; + } + + @Override + public CharSequence getText() { + return mText; + } + + @Override + public Tab setIcon(Drawable icon) { + mIcon = icon; + if (mPosition >= 0) { + mTabScrollView.updateTab(mPosition); + } + return this; + } + + @Override + public Tab setIcon(int resId) { + return setIcon(mContext.getResources().getDrawable(resId)); + } + + @Override + public Tab setText(CharSequence text) { + mText = text; + if (mPosition >= 0) { + mTabScrollView.updateTab(mPosition); + } + return this; + } + + @Override + public Tab setText(int resId) { + return setText(mContext.getResources().getText(resId)); + } + + @Override + public void select() { + selectTab(this); + } + + @Override + public Tab setContentDescription(int resId) { + return setContentDescription(mContext.getResources().getText(resId)); + } + + @Override + public Tab setContentDescription(CharSequence contentDesc) { + mContentDesc = contentDesc; + if (mPosition >= 0) { + mTabScrollView.updateTab(mPosition); + } + return this; + } + + @Override + public CharSequence getContentDescription() { + return mContentDesc; + } + } + + @Override + public void setCustomView(View view) { + mActionView.setCustomNavigationView(view); + } + + @Override + public void setCustomView(View view, LayoutParams layoutParams) { + view.setLayoutParams(layoutParams); + mActionView.setCustomNavigationView(view); + } + + @Override + public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) { + mActionView.setDropdownAdapter(adapter); + mActionView.setCallback(callback); + } + + @Override + public int getSelectedNavigationIndex() { + switch (mActionView.getNavigationMode()) { + case NAVIGATION_MODE_TABS: + return mSelectedTab != null ? mSelectedTab.getPosition() : -1; + case NAVIGATION_MODE_LIST: + return mActionView.getDropdownSelectedPosition(); + default: + return -1; + } + } + + @Override + public int getNavigationItemCount() { + switch (mActionView.getNavigationMode()) { + case NAVIGATION_MODE_TABS: + return mTabs.size(); + case NAVIGATION_MODE_LIST: + SpinnerAdapter adapter = mActionView.getDropdownAdapter(); + return adapter != null ? adapter.getCount() : 0; + default: + return 0; + } + } + + @Override + public int getTabCount() { + return mTabs.size(); + } + + @Override + public void setNavigationMode(int mode) { + final int oldMode = mActionView.getNavigationMode(); + switch (oldMode) { + case NAVIGATION_MODE_TABS: + mSavedTabPosition = getSelectedNavigationIndex(); + selectTab(null); + mTabScrollView.setVisibility(View.GONE); + break; + } + mActionView.setNavigationMode(mode); + switch (mode) { + case NAVIGATION_MODE_TABS: + ensureTabsExist(); + mTabScrollView.setVisibility(View.VISIBLE); + if (mSavedTabPosition != INVALID_POSITION) { + setSelectedNavigationItem(mSavedTabPosition); + mSavedTabPosition = INVALID_POSITION; + } + break; + } + mActionView.setCollapsable(mode == NAVIGATION_MODE_TABS && !mHasEmbeddedTabs); + } + + @Override + public Tab getTabAt(int index) { + return mTabs.get(index); + } + + + @Override + public void setIcon(int resId) { + mActionView.setIcon(resId); + } + + @Override + public void setIcon(Drawable icon) { + mActionView.setIcon(icon); + } + + @Override + public void setLogo(int resId) { + mActionView.setLogo(resId); + } + + @Override + public void setLogo(Drawable logo) { + mActionView.setLogo(logo); + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java new file mode 100644 index 0000000000..840cb3d27c --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/app/ActionBarWrapper.java @@ -0,0 +1,468 @@ +package com.actionbarsherlock.internal.app; + +import java.util.HashSet; +import java.util.Set; + +import android.app.Activity; +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.support.v4.app.FragmentActivity; +import android.support.v4.app.FragmentTransaction; +import android.view.View; +import android.widget.SpinnerAdapter; + +import com.actionbarsherlock.app.ActionBar; + +public class ActionBarWrapper extends ActionBar implements android.app.ActionBar.OnNavigationListener, android.app.ActionBar.OnMenuVisibilityListener { + private final Activity mActivity; + private final android.app.ActionBar mActionBar; + private ActionBar.OnNavigationListener mNavigationListener; + private Set mMenuVisibilityListeners = new HashSet(1); + private FragmentTransaction mFragmentTransaction; + + + public ActionBarWrapper(Activity activity) { + mActivity = activity; + mActionBar = activity.getActionBar(); + if (mActionBar != null) { + mActionBar.addOnMenuVisibilityListener(this); + } + } + + + @Override + public void setHomeButtonEnabled(boolean enabled) { + mActionBar.setHomeButtonEnabled(enabled); + } + + @Override + public Context getThemedContext() { + return mActionBar.getThemedContext(); + } + + @Override + public void setCustomView(View view) { + mActionBar.setCustomView(view); + } + + @Override + public void setCustomView(View view, LayoutParams layoutParams) { + android.app.ActionBar.LayoutParams lp = new android.app.ActionBar.LayoutParams(layoutParams); + lp.gravity = layoutParams.gravity; + lp.bottomMargin = layoutParams.bottomMargin; + lp.topMargin = layoutParams.topMargin; + lp.leftMargin = layoutParams.leftMargin; + lp.rightMargin = layoutParams.rightMargin; + mActionBar.setCustomView(view, lp); + } + + @Override + public void setCustomView(int resId) { + mActionBar.setCustomView(resId); + } + + @Override + public void setIcon(int resId) { + mActionBar.setIcon(resId); + } + + @Override + public void setIcon(Drawable icon) { + mActionBar.setIcon(icon); + } + + @Override + public void setLogo(int resId) { + mActionBar.setLogo(resId); + } + + @Override + public void setLogo(Drawable logo) { + mActionBar.setLogo(logo); + } + + @Override + public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) { + mNavigationListener = callback; + mActionBar.setListNavigationCallbacks(adapter, (callback != null) ? this : null); + } + + @Override + public boolean onNavigationItemSelected(int itemPosition, long itemId) { + //This should never be a NullPointerException since we only set + //ourselves as the listener when the callback is not null. + return mNavigationListener.onNavigationItemSelected(itemPosition, itemId); + } + + @Override + public void setSelectedNavigationItem(int position) { + mActionBar.setSelectedNavigationItem(position); + } + + @Override + public int getSelectedNavigationIndex() { + return mActionBar.getSelectedNavigationIndex(); + } + + @Override + public int getNavigationItemCount() { + return mActionBar.getNavigationItemCount(); + } + + @Override + public void setTitle(CharSequence title) { + mActionBar.setTitle(title); + } + + @Override + public void setTitle(int resId) { + mActionBar.setTitle(resId); + } + + @Override + public void setSubtitle(CharSequence subtitle) { + mActionBar.setSubtitle(subtitle); + } + + @Override + public void setSubtitle(int resId) { + mActionBar.setSubtitle(resId); + } + + @Override + public void setDisplayOptions(int options) { + mActionBar.setDisplayOptions(options); + } + + @Override + public void setDisplayOptions(int options, int mask) { + mActionBar.setDisplayOptions(options, mask); + } + + @Override + public void setDisplayUseLogoEnabled(boolean useLogo) { + mActionBar.setDisplayUseLogoEnabled(useLogo); + } + + @Override + public void setDisplayShowHomeEnabled(boolean showHome) { + mActionBar.setDisplayShowHomeEnabled(showHome); + } + + @Override + public void setDisplayHomeAsUpEnabled(boolean showHomeAsUp) { + mActionBar.setDisplayHomeAsUpEnabled(showHomeAsUp); + } + + @Override + public void setDisplayShowTitleEnabled(boolean showTitle) { + mActionBar.setDisplayShowTitleEnabled(showTitle); + } + + @Override + public void setDisplayShowCustomEnabled(boolean showCustom) { + mActionBar.setDisplayShowCustomEnabled(showCustom); + } + + @Override + public void setBackgroundDrawable(Drawable d) { + mActionBar.setBackgroundDrawable(d); + } + + @Override + public void setStackedBackgroundDrawable(Drawable d) { + mActionBar.setStackedBackgroundDrawable(d); + } + + @Override + public void setSplitBackgroundDrawable(Drawable d) { + mActionBar.setSplitBackgroundDrawable(d); + } + + @Override + public View getCustomView() { + return mActionBar.getCustomView(); + } + + @Override + public CharSequence getTitle() { + return mActionBar.getTitle(); + } + + @Override + public CharSequence getSubtitle() { + return mActionBar.getSubtitle(); + } + + @Override + public int getNavigationMode() { + return mActionBar.getNavigationMode(); + } + + @Override + public void setNavigationMode(int mode) { + mActionBar.setNavigationMode(mode); + } + + @Override + public int getDisplayOptions() { + return mActionBar.getDisplayOptions(); + } + + public class TabWrapper extends ActionBar.Tab implements android.app.ActionBar.TabListener { + final android.app.ActionBar.Tab mNativeTab; + private Object mTag; + private TabListener mListener; + + public TabWrapper(android.app.ActionBar.Tab nativeTab) { + mNativeTab = nativeTab; + mNativeTab.setTag(this); + } + + @Override + public int getPosition() { + return mNativeTab.getPosition(); + } + + @Override + public Drawable getIcon() { + return mNativeTab.getIcon(); + } + + @Override + public CharSequence getText() { + return mNativeTab.getText(); + } + + @Override + public Tab setIcon(Drawable icon) { + mNativeTab.setIcon(icon); + return this; + } + + @Override + public Tab setIcon(int resId) { + mNativeTab.setIcon(resId); + return this; + } + + @Override + public Tab setText(CharSequence text) { + mNativeTab.setText(text); + return this; + } + + @Override + public Tab setText(int resId) { + mNativeTab.setText(resId); + return this; + } + + @Override + public Tab setCustomView(View view) { + mNativeTab.setCustomView(view); + return this; + } + + @Override + public Tab setCustomView(int layoutResId) { + mNativeTab.setCustomView(layoutResId); + return this; + } + + @Override + public View getCustomView() { + return mNativeTab.getCustomView(); + } + + @Override + public Tab setTag(Object obj) { + mTag = obj; + return this; + } + + @Override + public Object getTag() { + return mTag; + } + + @Override + public Tab setTabListener(TabListener listener) { + mNativeTab.setTabListener(listener != null ? this : null); + mListener = listener; + return this; + } + + @Override + public void select() { + mNativeTab.select(); + } + + @Override + public Tab setContentDescription(int resId) { + mNativeTab.setContentDescription(resId); + return this; + } + + @Override + public Tab setContentDescription(CharSequence contentDesc) { + mNativeTab.setContentDescription(contentDesc); + return this; + } + + @Override + public CharSequence getContentDescription() { + return mNativeTab.getContentDescription(); + } + + @Override + public void onTabReselected(android.app.ActionBar.Tab tab, android.app.FragmentTransaction ft) { + if (mListener != null) { + FragmentTransaction trans = null; + if (mActivity instanceof FragmentActivity) { + trans = ((FragmentActivity)mActivity).getSupportFragmentManager().beginTransaction() + .disallowAddToBackStack(); + } + + mListener.onTabReselected(this, trans); + + if (trans != null && !trans.isEmpty()) { + trans.commit(); + } + } + } + + @Override + public void onTabSelected(android.app.ActionBar.Tab tab, android.app.FragmentTransaction ft) { + if (mListener != null) { + + if (mFragmentTransaction == null && mActivity instanceof FragmentActivity) { + mFragmentTransaction = ((FragmentActivity)mActivity).getSupportFragmentManager().beginTransaction() + .disallowAddToBackStack(); + } + + mListener.onTabSelected(this, mFragmentTransaction); + + if (mFragmentTransaction != null) { + if (!mFragmentTransaction.isEmpty()) { + mFragmentTransaction.commit(); + } + mFragmentTransaction = null; + } + } + } + + @Override + public void onTabUnselected(android.app.ActionBar.Tab tab, android.app.FragmentTransaction ft) { + if (mListener != null) { + FragmentTransaction trans = null; + if (mActivity instanceof FragmentActivity) { + trans = ((FragmentActivity)mActivity).getSupportFragmentManager().beginTransaction() + .disallowAddToBackStack(); + mFragmentTransaction = trans; + } + + mListener.onTabUnselected(this, trans); + } + } + } + + @Override + public Tab newTab() { + return new TabWrapper(mActionBar.newTab()); + } + + @Override + public void addTab(Tab tab) { + mActionBar.addTab(((TabWrapper)tab).mNativeTab); + } + + @Override + public void addTab(Tab tab, boolean setSelected) { + mActionBar.addTab(((TabWrapper)tab).mNativeTab, setSelected); + } + + @Override + public void addTab(Tab tab, int position) { + mActionBar.addTab(((TabWrapper)tab).mNativeTab, position); + } + + @Override + public void addTab(Tab tab, int position, boolean setSelected) { + mActionBar.addTab(((TabWrapper)tab).mNativeTab, position, setSelected); + } + + @Override + public void removeTab(Tab tab) { + mActionBar.removeTab(((TabWrapper)tab).mNativeTab); + } + + @Override + public void removeTabAt(int position) { + mActionBar.removeTabAt(position); + } + + @Override + public void removeAllTabs() { + mActionBar.removeAllTabs(); + } + + @Override + public void selectTab(Tab tab) { + mActionBar.selectTab(((TabWrapper)tab).mNativeTab); + } + + @Override + public Tab getSelectedTab() { + android.app.ActionBar.Tab selected = mActionBar.getSelectedTab(); + return (selected != null) ? (Tab)selected.getTag() : null; + } + + @Override + public Tab getTabAt(int index) { + android.app.ActionBar.Tab selected = mActionBar.getTabAt(index); + return (selected != null) ? (Tab)selected.getTag() : null; + } + + @Override + public int getTabCount() { + return mActionBar.getTabCount(); + } + + @Override + public int getHeight() { + return mActionBar.getHeight(); + } + + @Override + public void show() { + mActionBar.show(); + } + + @Override + public void hide() { + mActionBar.hide(); + } + + @Override + public boolean isShowing() { + return mActionBar.isShowing(); + } + + @Override + public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) { + mMenuVisibilityListeners.add(listener); + } + + @Override + public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) { + mMenuVisibilityListeners.remove(listener); + } + + @Override + public void onMenuVisibilityChanged(boolean isVisible) { + for (OnMenuVisibilityListener listener : mMenuVisibilityListeners) { + listener.onMenuVisibilityChanged(isVisible); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java new file mode 100644 index 0000000000..2caf5b4a96 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Animator.java @@ -0,0 +1,278 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.nineoldandroids.animation; + +import java.util.ArrayList; + +import android.view.animation.Interpolator; + +/** + * This is the superclass for classes which provide basic support for animations which can be + * started, ended, and have AnimatorListeners added to them. + */ +public abstract class Animator implements Cloneable { + + + /** + * The set of listeners to be sent events through the life of an animation. + */ + ArrayList mListeners = null; + + /** + * Starts this animation. If the animation has a nonzero startDelay, the animation will start + * running after that delay elapses. A non-delayed animation will have its initial + * value(s) set immediately, followed by calls to + * {@link AnimatorListener#onAnimationStart(Animator)} for any listeners of this animator. + * + *

The animation started by calling this method will be run on the thread that called + * this method. This thread should have a Looper on it (a runtime exception will be thrown if + * this is not the case). Also, if the animation will animate + * properties of objects in the view hierarchy, then the calling thread should be the UI + * thread for that view hierarchy.

+ * + */ + public void start() { + } + + /** + * Cancels the animation. Unlike {@link #end()}, cancel() causes the animation to + * stop in its tracks, sending an + * {@link android.animation.Animator.AnimatorListener#onAnimationCancel(Animator)} to + * its listeners, followed by an + * {@link android.animation.Animator.AnimatorListener#onAnimationEnd(Animator)} message. + * + *

This method must be called on the thread that is running the animation.

+ */ + public void cancel() { + } + + /** + * Ends the animation. This causes the animation to assign the end value of the property being + * animated, then calling the + * {@link android.animation.Animator.AnimatorListener#onAnimationEnd(Animator)} method on + * its listeners. + * + *

This method must be called on the thread that is running the animation.

+ */ + public void end() { + } + + /** + * The amount of time, in milliseconds, to delay starting the animation after + * {@link #start()} is called. + * + * @return the number of milliseconds to delay running the animation + */ + public abstract long getStartDelay(); + + /** + * The amount of time, in milliseconds, to delay starting the animation after + * {@link #start()} is called. + + * @param startDelay The amount of the delay, in milliseconds + */ + public abstract void setStartDelay(long startDelay); + + + /** + * Sets the length of the animation. + * + * @param duration The length of the animation, in milliseconds. + */ + public abstract Animator setDuration(long duration); + + /** + * Gets the length of the animation. + * + * @return The length of the animation, in milliseconds. + */ + public abstract long getDuration(); + + /** + * The time interpolator used in calculating the elapsed fraction of this animation. The + * interpolator determines whether the animation runs with linear or non-linear motion, + * such as acceleration and deceleration. The default value is + * {@link android.view.animation.AccelerateDecelerateInterpolator} + * + * @param value the interpolator to be used by this animation + */ + public abstract void setInterpolator(/*Time*/Interpolator value); + + /** + * Returns whether this Animator is currently running (having been started and gone past any + * initial startDelay period and not yet ended). + * + * @return Whether the Animator is running. + */ + public abstract boolean isRunning(); + + /** + * Returns whether this Animator has been started and not yet ended. This state is a superset + * of the state of {@link #isRunning()}, because an Animator with a nonzero + * {@link #getStartDelay() startDelay} will return true for {@link #isStarted()} during the + * delay phase, whereas {@link #isRunning()} will return true only after the delay phase + * is complete. + * + * @return Whether the Animator has been started and not yet ended. + */ + public boolean isStarted() { + // Default method returns value for isRunning(). Subclasses should override to return a + // real value. + return isRunning(); + } + + /** + * Adds a listener to the set of listeners that are sent events through the life of an + * animation, such as start, repeat, and end. + * + * @param listener the listener to be added to the current set of listeners for this animation. + */ + public void addListener(AnimatorListener listener) { + if (mListeners == null) { + mListeners = new ArrayList(); + } + mListeners.add(listener); + } + + /** + * Removes a listener from the set listening to this animation. + * + * @param listener the listener to be removed from the current set of listeners for this + * animation. + */ + public void removeListener(AnimatorListener listener) { + if (mListeners == null) { + return; + } + mListeners.remove(listener); + if (mListeners.size() == 0) { + mListeners = null; + } + } + + /** + * Gets the set of {@link android.animation.Animator.AnimatorListener} objects that are currently + * listening for events on this Animator object. + * + * @return ArrayList The set of listeners. + */ + public ArrayList getListeners() { + return mListeners; + } + + /** + * Removes all listeners from this object. This is equivalent to calling + * getListeners() followed by calling clear() on the + * returned list of listeners. + */ + public void removeAllListeners() { + if (mListeners != null) { + mListeners.clear(); + mListeners = null; + } + } + + @Override + public Animator clone() { + try { + final Animator anim = (Animator) super.clone(); + if (mListeners != null) { + ArrayList oldListeners = mListeners; + anim.mListeners = new ArrayList(); + int numListeners = oldListeners.size(); + for (int i = 0; i < numListeners; ++i) { + anim.mListeners.add(oldListeners.get(i)); + } + } + return anim; + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } + } + + /** + * This method tells the object to use appropriate information to extract + * starting values for the animation. For example, a AnimatorSet object will pass + * this call to its child objects to tell them to set up the values. A + * ObjectAnimator object will use the information it has about its target object + * and PropertyValuesHolder objects to get the start values for its properties. + * An ValueAnimator object will ignore the request since it does not have enough + * information (such as a target object) to gather these values. + */ + public void setupStartValues() { + } + + /** + * This method tells the object to use appropriate information to extract + * ending values for the animation. For example, a AnimatorSet object will pass + * this call to its child objects to tell them to set up the values. A + * ObjectAnimator object will use the information it has about its target object + * and PropertyValuesHolder objects to get the start values for its properties. + * An ValueAnimator object will ignore the request since it does not have enough + * information (such as a target object) to gather these values. + */ + public void setupEndValues() { + } + + /** + * Sets the target object whose property will be animated by this animation. Not all subclasses + * operate on target objects (for example, {@link ValueAnimator}, but this method + * is on the superclass for the convenience of dealing generically with those subclasses + * that do handle targets. + * + * @param target The object being animated + */ + public void setTarget(Object target) { + } + + /** + *

An animation listener receives notifications from an animation. + * Notifications indicate animation related events, such as the end or the + * repetition of the animation.

+ */ + public static interface AnimatorListener { + /** + *

Notifies the start of the animation.

+ * + * @param animation The started animation. + */ + void onAnimationStart(Animator animation); + + /** + *

Notifies the end of the animation. This callback is not invoked + * for animations with repeat count set to INFINITE.

+ * + * @param animation The animation which reached its end. + */ + void onAnimationEnd(Animator animation); + + /** + *

Notifies the cancellation of the animation. This callback is not invoked + * for animations with repeat count set to INFINITE.

+ * + * @param animation The animation which was canceled. + */ + void onAnimationCancel(Animator animation); + + /** + *

Notifies the repetition of the animation.

+ * + * @param animation The animation which was repeated. + */ + void onAnimationRepeat(Animator animation); + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java new file mode 100644 index 0000000000..02ddff48d2 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorListenerAdapter.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.nineoldandroids.animation; + +/** + * This adapter class provides empty implementations of the methods from {@link android.animation.Animator.AnimatorListener}. + * Any custom listener that cares only about a subset of the methods of this listener can + * simply subclass this adapter class instead of implementing the interface directly. + */ +public abstract class AnimatorListenerAdapter implements Animator.AnimatorListener { + + /** + * {@inheritDoc} + */ + @Override + public void onAnimationCancel(Animator animation) { + } + + /** + * {@inheritDoc} + */ + @Override + public void onAnimationEnd(Animator animation) { + } + + /** + * {@inheritDoc} + */ + @Override + public void onAnimationRepeat(Animator animation) { + } + + /** + * {@inheritDoc} + */ + @Override + public void onAnimationStart(Animator animation) { + } + +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java new file mode 100644 index 0000000000..3231080c44 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/AnimatorSet.java @@ -0,0 +1,1111 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.nineoldandroids.animation; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; + +import android.view.animation.Interpolator; + +/** + * This class plays a set of {@link Animator} objects in the specified order. Animations + * can be set up to play together, in sequence, or after a specified delay. + * + *

There are two different approaches to adding animations to a AnimatorSet: + * either the {@link AnimatorSet#playTogether(Animator[]) playTogether()} or + * {@link AnimatorSet#playSequentially(Animator[]) playSequentially()} methods can be called to add + * a set of animations all at once, or the {@link AnimatorSet#play(Animator)} can be + * used in conjunction with methods in the {@link AnimatorSet.Builder Builder} + * class to add animations + * one by one.

+ * + *

It is possible to set up a AnimatorSet with circular dependencies between + * its animations. For example, an animation a1 could be set up to start before animation a2, a2 + * before a3, and a3 before a1. The results of this configuration are undefined, but will typically + * result in none of the affected animations being played. Because of this (and because + * circular dependencies do not make logical sense anyway), circular dependencies + * should be avoided, and the dependency flow of animations should only be in one direction. + */ +@SuppressWarnings("unchecked") +public final class AnimatorSet extends Animator { + + /** + * Internal variables + * NOTE: This object implements the clone() method, making a deep copy of any referenced + * objects. As other non-trivial fields are added to this class, make sure to add logic + * to clone() to make deep copies of them. + */ + + /** + * Tracks animations currently being played, so that we know what to + * cancel or end when cancel() or end() is called on this AnimatorSet + */ + private ArrayList mPlayingSet = new ArrayList(); + + /** + * Contains all nodes, mapped to their respective Animators. When new + * dependency information is added for an Animator, we want to add it + * to a single node representing that Animator, not create a new Node + * if one already exists. + */ + private HashMap mNodeMap = new HashMap(); + + /** + * Set of all nodes created for this AnimatorSet. This list is used upon + * starting the set, and the nodes are placed in sorted order into the + * sortedNodes collection. + */ + private ArrayList mNodes = new ArrayList(); + + /** + * The sorted list of nodes. This is the order in which the animations will + * be played. The details about when exactly they will be played depend + * on the dependency relationships of the nodes. + */ + private ArrayList mSortedNodes = new ArrayList(); + + /** + * Flag indicating whether the nodes should be sorted prior to playing. This + * flag allows us to cache the previous sorted nodes so that if the sequence + * is replayed with no changes, it does not have to re-sort the nodes again. + */ + private boolean mNeedsSort = true; + + private AnimatorSetListener mSetListener = null; + + /** + * Flag indicating that the AnimatorSet has been manually + * terminated (by calling cancel() or end()). + * This flag is used to avoid starting other animations when currently-playing + * child animations of this AnimatorSet end. It also determines whether cancel/end + * notifications are sent out via the normal AnimatorSetListener mechanism. + */ + boolean mTerminated = false; + + /** + * Indicates whether an AnimatorSet has been start()'d, whether or + * not there is a nonzero startDelay. + */ + private boolean mStarted = false; + + // The amount of time in ms to delay starting the animation after start() is called + private long mStartDelay = 0; + + // Animator used for a nonzero startDelay + private ValueAnimator mDelayAnim = null; + + + // How long the child animations should last in ms. The default value is negative, which + // simply means that there is no duration set on the AnimatorSet. When a real duration is + // set, it is passed along to the child animations. + private long mDuration = -1; + + + /** + * Sets up this AnimatorSet to play all of the supplied animations at the same time. + * + * @param items The animations that will be started simultaneously. + */ + public void playTogether(Animator... items) { + if (items != null) { + mNeedsSort = true; + Builder builder = play(items[0]); + for (int i = 1; i < items.length; ++i) { + builder.with(items[i]); + } + } + } + + /** + * Sets up this AnimatorSet to play all of the supplied animations at the same time. + * + * @param items The animations that will be started simultaneously. + */ + public void playTogether(Collection items) { + if (items != null && items.size() > 0) { + mNeedsSort = true; + Builder builder = null; + for (Animator anim : items) { + if (builder == null) { + builder = play(anim); + } else { + builder.with(anim); + } + } + } + } + + /** + * Sets up this AnimatorSet to play each of the supplied animations when the + * previous animation ends. + * + * @param items The animations that will be started one after another. + */ + public void playSequentially(Animator... items) { + if (items != null) { + mNeedsSort = true; + if (items.length == 1) { + play(items[0]); + } else { + for (int i = 0; i < items.length - 1; ++i) { + play(items[i]).before(items[i+1]); + } + } + } + } + + /** + * Sets up this AnimatorSet to play each of the supplied animations when the + * previous animation ends. + * + * @param items The animations that will be started one after another. + */ + public void playSequentially(List items) { + if (items != null && items.size() > 0) { + mNeedsSort = true; + if (items.size() == 1) { + play(items.get(0)); + } else { + for (int i = 0; i < items.size() - 1; ++i) { + play(items.get(i)).before(items.get(i+1)); + } + } + } + } + + /** + * Returns the current list of child Animator objects controlled by this + * AnimatorSet. This is a copy of the internal list; modifications to the returned list + * will not affect the AnimatorSet, although changes to the underlying Animator objects + * will affect those objects being managed by the AnimatorSet. + * + * @return ArrayList The list of child animations of this AnimatorSet. + */ + public ArrayList getChildAnimations() { + ArrayList childList = new ArrayList(); + for (Node node : mNodes) { + childList.add(node.animation); + } + return childList; + } + + /** + * Sets the target object for all current {@link #getChildAnimations() child animations} + * of this AnimatorSet that take targets ({@link ObjectAnimator} and + * AnimatorSet). + * + * @param target The object being animated + */ + @Override + public void setTarget(Object target) { + for (Node node : mNodes) { + Animator animation = node.animation; + if (animation instanceof AnimatorSet) { + ((AnimatorSet)animation).setTarget(target); + } else if (animation instanceof ObjectAnimator) { + ((ObjectAnimator)animation).setTarget(target); + } + } + } + + /** + * Sets the TimeInterpolator for all current {@link #getChildAnimations() child animations} + * of this AnimatorSet. + * + * @param interpolator the interpolator to be used by each child animation of this AnimatorSet + */ + @Override + public void setInterpolator(/*Time*/Interpolator interpolator) { + for (Node node : mNodes) { + node.animation.setInterpolator(interpolator); + } + } + + /** + * This method creates a Builder object, which is used to + * set up playing constraints. This initial play() method + * tells the Builder the animation that is the dependency for + * the succeeding commands to the Builder. For example, + * calling play(a1).with(a2) sets up the AnimatorSet to play + * a1 and a2 at the same time, + * play(a1).before(a2) sets up the AnimatorSet to play + * a1 first, followed by a2, and + * play(a1).after(a2) sets up the AnimatorSet to play + * a2 first, followed by a1. + * + *

Note that play() is the only way to tell the + * Builder the animation upon which the dependency is created, + * so successive calls to the various functions in Builder + * will all refer to the initial parameter supplied in play() + * as the dependency of the other animations. For example, calling + * play(a1).before(a2).before(a3) will play both a2 + * and a3 when a1 ends; it does not set up a dependency between + * a2 and a3.

+ * + * @param anim The animation that is the dependency used in later calls to the + * methods in the returned Builder object. A null parameter will result + * in a null Builder return value. + * @return Builder The object that constructs the AnimatorSet based on the dependencies + * outlined in the calls to play and the other methods in the + * BuilderNote that canceling a AnimatorSet also cancels all of the animations that it + * is responsible for.

+ */ + @Override + public void cancel() { + mTerminated = true; + if (isStarted()) { + ArrayList tmpListeners = null; + if (mListeners != null) { + tmpListeners = (ArrayList) mListeners.clone(); + for (AnimatorListener listener : tmpListeners) { + listener.onAnimationCancel(this); + } + } + if (mDelayAnim != null && mDelayAnim.isRunning()) { + // If we're currently in the startDelay period, just cancel that animator and + // send out the end event to all listeners + mDelayAnim.cancel(); + } else if (mSortedNodes.size() > 0) { + for (Node node : mSortedNodes) { + node.animation.cancel(); + } + } + if (tmpListeners != null) { + for (AnimatorListener listener : tmpListeners) { + listener.onAnimationEnd(this); + } + } + mStarted = false; + } + } + + /** + * {@inheritDoc} + * + *

Note that ending a AnimatorSet also ends all of the animations that it is + * responsible for.

+ */ + @Override + public void end() { + mTerminated = true; + if (isStarted()) { + if (mSortedNodes.size() != mNodes.size()) { + // hasn't been started yet - sort the nodes now, then end them + sortNodes(); + for (Node node : mSortedNodes) { + if (mSetListener == null) { + mSetListener = new AnimatorSetListener(this); + } + node.animation.addListener(mSetListener); + } + } + if (mDelayAnim != null) { + mDelayAnim.cancel(); + } + if (mSortedNodes.size() > 0) { + for (Node node : mSortedNodes) { + node.animation.end(); + } + } + if (mListeners != null) { + ArrayList tmpListeners = + (ArrayList) mListeners.clone(); + for (AnimatorListener listener : tmpListeners) { + listener.onAnimationEnd(this); + } + } + mStarted = false; + } + } + + /** + * Returns true if any of the child animations of this AnimatorSet have been started and have + * not yet ended. + * @return Whether this AnimatorSet has been started and has not yet ended. + */ + @Override + public boolean isRunning() { + for (Node node : mNodes) { + if (node.animation.isRunning()) { + return true; + } + } + return false; + } + + @Override + public boolean isStarted() { + return mStarted; + } + + /** + * The amount of time, in milliseconds, to delay starting the animation after + * {@link #start()} is called. + * + * @return the number of milliseconds to delay running the animation + */ + @Override + public long getStartDelay() { + return mStartDelay; + } + + /** + * The amount of time, in milliseconds, to delay starting the animation after + * {@link #start()} is called. + + * @param startDelay The amount of the delay, in milliseconds + */ + @Override + public void setStartDelay(long startDelay) { + mStartDelay = startDelay; + } + + /** + * Gets the length of each of the child animations of this AnimatorSet. This value may + * be less than 0, which indicates that no duration has been set on this AnimatorSet + * and each of the child animations will use their own duration. + * + * @return The length of the animation, in milliseconds, of each of the child + * animations of this AnimatorSet. + */ + @Override + public long getDuration() { + return mDuration; + } + + /** + * Sets the length of each of the current child animations of this AnimatorSet. By default, + * each child animation will use its own duration. If the duration is set on the AnimatorSet, + * then each child animation inherits this duration. + * + * @param duration The length of the animation, in milliseconds, of each of the child + * animations of this AnimatorSet. + */ + @Override + public AnimatorSet setDuration(long duration) { + if (duration < 0) { + throw new IllegalArgumentException("duration must be a value of zero or greater"); + } + for (Node node : mNodes) { + // TODO: don't set the duration of the timing-only nodes created by AnimatorSet to + // insert "play-after" delays + node.animation.setDuration(duration); + } + mDuration = duration; + return this; + } + + @Override + public void setupStartValues() { + for (Node node : mNodes) { + node.animation.setupStartValues(); + } + } + + @Override + public void setupEndValues() { + for (Node node : mNodes) { + node.animation.setupEndValues(); + } + } + + /** + * {@inheritDoc} + * + *

Starting this AnimatorSet will, in turn, start the animations for which + * it is responsible. The details of when exactly those animations are started depends on + * the dependency relationships that have been set up between the animations. + */ + @Override + public void start() { + mTerminated = false; + mStarted = true; + + // First, sort the nodes (if necessary). This will ensure that sortedNodes + // contains the animation nodes in the correct order. + sortNodes(); + + int numSortedNodes = mSortedNodes.size(); + for (int i = 0; i < numSortedNodes; ++i) { + Node node = mSortedNodes.get(i); + // First, clear out the old listeners + ArrayList oldListeners = node.animation.getListeners(); + if (oldListeners != null && oldListeners.size() > 0) { + final ArrayList clonedListeners = new + ArrayList(oldListeners); + + for (AnimatorListener listener : clonedListeners) { + if (listener instanceof DependencyListener || + listener instanceof AnimatorSetListener) { + node.animation.removeListener(listener); + } + } + } + } + + // nodesToStart holds the list of nodes to be started immediately. We don't want to + // start the animations in the loop directly because we first need to set up + // dependencies on all of the nodes. For example, we don't want to start an animation + // when some other animation also wants to start when the first animation begins. + final ArrayList nodesToStart = new ArrayList(); + for (int i = 0; i < numSortedNodes; ++i) { + Node node = mSortedNodes.get(i); + if (mSetListener == null) { + mSetListener = new AnimatorSetListener(this); + } + if (node.dependencies == null || node.dependencies.size() == 0) { + nodesToStart.add(node); + } else { + int numDependencies = node.dependencies.size(); + for (int j = 0; j < numDependencies; ++j) { + Dependency dependency = node.dependencies.get(j); + dependency.node.animation.addListener( + new DependencyListener(this, node, dependency.rule)); + } + node.tmpDependencies = (ArrayList) node.dependencies.clone(); + } + node.animation.addListener(mSetListener); + } + // Now that all dependencies are set up, start the animations that should be started. + if (mStartDelay <= 0) { + for (Node node : nodesToStart) { + node.animation.start(); + mPlayingSet.add(node.animation); + } + } else { + mDelayAnim = ValueAnimator.ofFloat(0f, 1f); + mDelayAnim.setDuration(mStartDelay); + mDelayAnim.addListener(new AnimatorListenerAdapter() { + boolean canceled = false; + public void onAnimationCancel(Animator anim) { + canceled = true; + } + public void onAnimationEnd(Animator anim) { + if (!canceled) { + int numNodes = nodesToStart.size(); + for (int i = 0; i < numNodes; ++i) { + Node node = nodesToStart.get(i); + node.animation.start(); + mPlayingSet.add(node.animation); + } + } + } + }); + mDelayAnim.start(); + } + if (mListeners != null) { + ArrayList tmpListeners = + (ArrayList) mListeners.clone(); + int numListeners = tmpListeners.size(); + for (int i = 0; i < numListeners; ++i) { + tmpListeners.get(i).onAnimationStart(this); + } + } + if (mNodes.size() == 0 && mStartDelay == 0) { + // Handle unusual case where empty AnimatorSet is started - should send out + // end event immediately since the event will not be sent out at all otherwise + mStarted = false; + if (mListeners != null) { + ArrayList tmpListeners = + (ArrayList) mListeners.clone(); + int numListeners = tmpListeners.size(); + for (int i = 0; i < numListeners; ++i) { + tmpListeners.get(i).onAnimationEnd(this); + } + } + } + } + + @Override + public AnimatorSet clone() { + final AnimatorSet anim = (AnimatorSet) super.clone(); + /* + * The basic clone() operation copies all items. This doesn't work very well for + * AnimatorSet, because it will copy references that need to be recreated and state + * that may not apply. What we need to do now is put the clone in an uninitialized + * state, with fresh, empty data structures. Then we will build up the nodes list + * manually, as we clone each Node (and its animation). The clone will then be sorted, + * and will populate any appropriate lists, when it is started. + */ + anim.mNeedsSort = true; + anim.mTerminated = false; + anim.mStarted = false; + anim.mPlayingSet = new ArrayList(); + anim.mNodeMap = new HashMap(); + anim.mNodes = new ArrayList(); + anim.mSortedNodes = new ArrayList(); + + // Walk through the old nodes list, cloning each node and adding it to the new nodemap. + // One problem is that the old node dependencies point to nodes in the old AnimatorSet. + // We need to track the old/new nodes in order to reconstruct the dependencies in the clone. + HashMap nodeCloneMap = new HashMap(); // + for (Node node : mNodes) { + Node nodeClone = node.clone(); + nodeCloneMap.put(node, nodeClone); + anim.mNodes.add(nodeClone); + anim.mNodeMap.put(nodeClone.animation, nodeClone); + // Clear out the dependencies in the clone; we'll set these up manually later + nodeClone.dependencies = null; + nodeClone.tmpDependencies = null; + nodeClone.nodeDependents = null; + nodeClone.nodeDependencies = null; + // clear out any listeners that were set up by the AnimatorSet; these will + // be set up when the clone's nodes are sorted + ArrayList cloneListeners = nodeClone.animation.getListeners(); + if (cloneListeners != null) { + ArrayList listenersToRemove = null; + for (AnimatorListener listener : cloneListeners) { + if (listener instanceof AnimatorSetListener) { + if (listenersToRemove == null) { + listenersToRemove = new ArrayList(); + } + listenersToRemove.add(listener); + } + } + if (listenersToRemove != null) { + for (AnimatorListener listener : listenersToRemove) { + cloneListeners.remove(listener); + } + } + } + } + // Now that we've cloned all of the nodes, we're ready to walk through their + // dependencies, mapping the old dependencies to the new nodes + for (Node node : mNodes) { + Node nodeClone = nodeCloneMap.get(node); + if (node.dependencies != null) { + for (Dependency dependency : node.dependencies) { + Node clonedDependencyNode = nodeCloneMap.get(dependency.node); + Dependency cloneDependency = new Dependency(clonedDependencyNode, + dependency.rule); + nodeClone.addDependency(cloneDependency); + } + } + } + + return anim; + } + + /** + * This class is the mechanism by which animations are started based on events in other + * animations. If an animation has multiple dependencies on other animations, then + * all dependencies must be satisfied before the animation is started. + */ + private static class DependencyListener implements AnimatorListener { + + private AnimatorSet mAnimatorSet; + + // The node upon which the dependency is based. + private Node mNode; + + // The Dependency rule (WITH or AFTER) that the listener should wait for on + // the node + private int mRule; + + public DependencyListener(AnimatorSet animatorSet, Node node, int rule) { + this.mAnimatorSet = animatorSet; + this.mNode = node; + this.mRule = rule; + } + + /** + * Ignore cancel events for now. We may want to handle this eventually, + * to prevent follow-on animations from running when some dependency + * animation is canceled. + */ + public void onAnimationCancel(Animator animation) { + } + + /** + * An end event is received - see if this is an event we are listening for + */ + public void onAnimationEnd(Animator animation) { + if (mRule == Dependency.AFTER) { + startIfReady(animation); + } + } + + /** + * Ignore repeat events for now + */ + public void onAnimationRepeat(Animator animation) { + } + + /** + * A start event is received - see if this is an event we are listening for + */ + public void onAnimationStart(Animator animation) { + if (mRule == Dependency.WITH) { + startIfReady(animation); + } + } + + /** + * Check whether the event received is one that the node was waiting for. + * If so, mark it as complete and see whether it's time to start + * the animation. + * @param dependencyAnimation the animation that sent the event. + */ + private void startIfReady(Animator dependencyAnimation) { + if (mAnimatorSet.mTerminated) { + // if the parent AnimatorSet was canceled, then don't start any dependent anims + return; + } + Dependency dependencyToRemove = null; + int numDependencies = mNode.tmpDependencies.size(); + for (int i = 0; i < numDependencies; ++i) { + Dependency dependency = mNode.tmpDependencies.get(i); + if (dependency.rule == mRule && + dependency.node.animation == dependencyAnimation) { + // rule fired - remove the dependency and listener and check to + // see whether it's time to start the animation + dependencyToRemove = dependency; + dependencyAnimation.removeListener(this); + break; + } + } + mNode.tmpDependencies.remove(dependencyToRemove); + if (mNode.tmpDependencies.size() == 0) { + // all dependencies satisfied: start the animation + mNode.animation.start(); + mAnimatorSet.mPlayingSet.add(mNode.animation); + } + } + + } + + private class AnimatorSetListener implements AnimatorListener { + + private AnimatorSet mAnimatorSet; + + AnimatorSetListener(AnimatorSet animatorSet) { + mAnimatorSet = animatorSet; + } + + public void onAnimationCancel(Animator animation) { + if (!mTerminated) { + // Listeners are already notified of the AnimatorSet canceling in cancel(). + // The logic below only kicks in when animations end normally + if (mPlayingSet.size() == 0) { + if (mListeners != null) { + int numListeners = mListeners.size(); + for (int i = 0; i < numListeners; ++i) { + mListeners.get(i).onAnimationCancel(mAnimatorSet); + } + } + } + } + } + + public void onAnimationEnd(Animator animation) { + animation.removeListener(this); + mPlayingSet.remove(animation); + Node animNode = mAnimatorSet.mNodeMap.get(animation); + animNode.done = true; + if (!mTerminated) { + // Listeners are already notified of the AnimatorSet ending in cancel() or + // end(); the logic below only kicks in when animations end normally + ArrayList sortedNodes = mAnimatorSet.mSortedNodes; + boolean allDone = true; + int numSortedNodes = sortedNodes.size(); + for (int i = 0; i < numSortedNodes; ++i) { + if (!sortedNodes.get(i).done) { + allDone = false; + break; + } + } + if (allDone) { + // If this was the last child animation to end, then notify listeners that this + // AnimatorSet has ended + if (mListeners != null) { + ArrayList tmpListeners = + (ArrayList) mListeners.clone(); + int numListeners = tmpListeners.size(); + for (int i = 0; i < numListeners; ++i) { + tmpListeners.get(i).onAnimationEnd(mAnimatorSet); + } + } + mAnimatorSet.mStarted = false; + } + } + } + + // Nothing to do + public void onAnimationRepeat(Animator animation) { + } + + // Nothing to do + public void onAnimationStart(Animator animation) { + } + + } + + /** + * This method sorts the current set of nodes, if needed. The sort is a simple + * DependencyGraph sort, which goes like this: + * - All nodes without dependencies become 'roots' + * - while roots list is not null + * - for each root r + * - add r to sorted list + * - remove r as a dependency from any other node + * - any nodes with no dependencies are added to the roots list + */ + private void sortNodes() { + if (mNeedsSort) { + mSortedNodes.clear(); + ArrayList roots = new ArrayList(); + int numNodes = mNodes.size(); + for (int i = 0; i < numNodes; ++i) { + Node node = mNodes.get(i); + if (node.dependencies == null || node.dependencies.size() == 0) { + roots.add(node); + } + } + ArrayList tmpRoots = new ArrayList(); + while (roots.size() > 0) { + int numRoots = roots.size(); + for (int i = 0; i < numRoots; ++i) { + Node root = roots.get(i); + mSortedNodes.add(root); + if (root.nodeDependents != null) { + int numDependents = root.nodeDependents.size(); + for (int j = 0; j < numDependents; ++j) { + Node node = root.nodeDependents.get(j); + node.nodeDependencies.remove(root); + if (node.nodeDependencies.size() == 0) { + tmpRoots.add(node); + } + } + } + } + roots.clear(); + roots.addAll(tmpRoots); + tmpRoots.clear(); + } + mNeedsSort = false; + if (mSortedNodes.size() != mNodes.size()) { + throw new IllegalStateException("Circular dependencies cannot exist" + + " in AnimatorSet"); + } + } else { + // Doesn't need sorting, but still need to add in the nodeDependencies list + // because these get removed as the event listeners fire and the dependencies + // are satisfied + int numNodes = mNodes.size(); + for (int i = 0; i < numNodes; ++i) { + Node node = mNodes.get(i); + if (node.dependencies != null && node.dependencies.size() > 0) { + int numDependencies = node.dependencies.size(); + for (int j = 0; j < numDependencies; ++j) { + Dependency dependency = node.dependencies.get(j); + if (node.nodeDependencies == null) { + node.nodeDependencies = new ArrayList(); + } + if (!node.nodeDependencies.contains(dependency.node)) { + node.nodeDependencies.add(dependency.node); + } + } + } + // nodes are 'done' by default; they become un-done when started, and done + // again when ended + node.done = false; + } + } + } + + /** + * Dependency holds information about the node that some other node is + * dependent upon and the nature of that dependency. + * + */ + private static class Dependency { + static final int WITH = 0; // dependent node must start with this dependency node + static final int AFTER = 1; // dependent node must start when this dependency node finishes + + // The node that the other node with this Dependency is dependent upon + public Node node; + + // The nature of the dependency (WITH or AFTER) + public int rule; + + public Dependency(Node node, int rule) { + this.node = node; + this.rule = rule; + } + } + + /** + * A Node is an embodiment of both the Animator that it wraps as well as + * any dependencies that are associated with that Animation. This includes + * both dependencies upon other nodes (in the dependencies list) as + * well as dependencies of other nodes upon this (in the nodeDependents list). + */ + private static class Node implements Cloneable { + public Animator animation; + + /** + * These are the dependencies that this node's animation has on other + * nodes. For example, if this node's animation should begin with some + * other animation ends, then there will be an item in this node's + * dependencies list for that other animation's node. + */ + public ArrayList dependencies = null; + + /** + * tmpDependencies is a runtime detail. We use the dependencies list for sorting. + * But we also use the list to keep track of when multiple dependencies are satisfied, + * but removing each dependency as it is satisfied. We do not want to remove + * the dependency itself from the list, because we need to retain that information + * if the AnimatorSet is launched in the future. So we create a copy of the dependency + * list when the AnimatorSet starts and use this tmpDependencies list to track the + * list of satisfied dependencies. + */ + public ArrayList tmpDependencies = null; + + /** + * nodeDependencies is just a list of the nodes that this Node is dependent upon. + * This information is used in sortNodes(), to determine when a node is a root. + */ + public ArrayList nodeDependencies = null; + + /** + * nodeDepdendents is the list of nodes that have this node as a dependency. This + * is a utility field used in sortNodes to facilitate removing this node as a + * dependency when it is a root node. + */ + public ArrayList nodeDependents = null; + + /** + * Flag indicating whether the animation in this node is finished. This flag + * is used by AnimatorSet to check, as each animation ends, whether all child animations + * are done and it's time to send out an end event for the entire AnimatorSet. + */ + public boolean done = false; + + /** + * Constructs the Node with the animation that it encapsulates. A Node has no + * dependencies by default; dependencies are added via the addDependency() + * method. + * + * @param animation The animation that the Node encapsulates. + */ + public Node(Animator animation) { + this.animation = animation; + } + + /** + * Add a dependency to this Node. The dependency includes information about the + * node that this node is dependency upon and the nature of the dependency. + * @param dependency + */ + public void addDependency(Dependency dependency) { + if (dependencies == null) { + dependencies = new ArrayList(); + nodeDependencies = new ArrayList(); + } + dependencies.add(dependency); + if (!nodeDependencies.contains(dependency.node)) { + nodeDependencies.add(dependency.node); + } + Node dependencyNode = dependency.node; + if (dependencyNode.nodeDependents == null) { + dependencyNode.nodeDependents = new ArrayList(); + } + dependencyNode.nodeDependents.add(this); + } + + @Override + public Node clone() { + try { + Node node = (Node) super.clone(); + node.animation = animation.clone(); + return node; + } catch (CloneNotSupportedException e) { + throw new AssertionError(); + } + } + } + + /** + * The Builder object is a utility class to facilitate adding animations to a + * AnimatorSet along with the relationships between the various animations. The + * intention of the Builder methods, along with the {@link + * AnimatorSet#play(Animator) play()} method of AnimatorSet is to make it possible + * to express the dependency relationships of animations in a natural way. Developers can also + * use the {@link AnimatorSet#playTogether(Animator[]) playTogether()} and {@link + * AnimatorSet#playSequentially(Animator[]) playSequentially()} methods if these suit the need, + * but it might be easier in some situations to express the AnimatorSet of animations in pairs. + *

+ *

The Builder object cannot be constructed directly, but is rather constructed + * internally via a call to {@link AnimatorSet#play(Animator)}.

+ *

+ *

For example, this sets up a AnimatorSet to play anim1 and anim2 at the same time, anim3 to + * play when anim2 finishes, and anim4 to play when anim3 finishes:

+ *
+     *     AnimatorSet s = new AnimatorSet();
+     *     s.play(anim1).with(anim2);
+     *     s.play(anim2).before(anim3);
+     *     s.play(anim4).after(anim3);
+     * 
+ *

+ *

Note in the example that both {@link Builder#before(Animator)} and {@link + * Builder#after(Animator)} are used. These are just different ways of expressing the same + * relationship and are provided to make it easier to say things in a way that is more natural, + * depending on the situation.

+ *

+ *

It is possible to make several calls into the same Builder object to express + * multiple relationships. However, note that it is only the animation passed into the initial + * {@link AnimatorSet#play(Animator)} method that is the dependency in any of the successive + * calls to the Builder object. For example, the following code starts both anim2 + * and anim3 when anim1 ends; there is no direct dependency relationship between anim2 and + * anim3: + *

+     *   AnimatorSet s = new AnimatorSet();
+     *   s.play(anim1).before(anim2).before(anim3);
+     * 
+ * If the desired result is to play anim1 then anim2 then anim3, this code expresses the + * relationship correctly:

+ *
+     *   AnimatorSet s = new AnimatorSet();
+     *   s.play(anim1).before(anim2);
+     *   s.play(anim2).before(anim3);
+     * 
+ *

+ *

Note that it is possible to express relationships that cannot be resolved and will not + * result in sensible results. For example, play(anim1).after(anim1) makes no + * sense. In general, circular dependencies like this one (or more indirect ones where a depends + * on b, which depends on c, which depends on a) should be avoided. Only create AnimatorSets + * that can boil down to a simple, one-way relationship of animations starting with, before, and + * after other, different, animations.

+ */ + public class Builder { + + /** + * This tracks the current node being processed. It is supplied to the play() method + * of AnimatorSet and passed into the constructor of Builder. + */ + private Node mCurrentNode; + + /** + * package-private constructor. Builders are only constructed by AnimatorSet, when the + * play() method is called. + * + * @param anim The animation that is the dependency for the other animations passed into + * the other methods of this Builder object. + */ + Builder(Animator anim) { + mCurrentNode = mNodeMap.get(anim); + if (mCurrentNode == null) { + mCurrentNode = new Node(anim); + mNodeMap.put(anim, mCurrentNode); + mNodes.add(mCurrentNode); + } + } + + /** + * Sets up the given animation to play at the same time as the animation supplied in the + * {@link AnimatorSet#play(Animator)} call that created this Builder object. + * + * @param anim The animation that will play when the animation supplied to the + * {@link AnimatorSet#play(Animator)} method starts. + */ + public Builder with(Animator anim) { + Node node = mNodeMap.get(anim); + if (node == null) { + node = new Node(anim); + mNodeMap.put(anim, node); + mNodes.add(node); + } + Dependency dependency = new Dependency(mCurrentNode, Dependency.WITH); + node.addDependency(dependency); + return this; + } + + /** + * Sets up the given animation to play when the animation supplied in the + * {@link AnimatorSet#play(Animator)} call that created this Builder object + * ends. + * + * @param anim The animation that will play when the animation supplied to the + * {@link AnimatorSet#play(Animator)} method ends. + */ + public Builder before(Animator anim) { + Node node = mNodeMap.get(anim); + if (node == null) { + node = new Node(anim); + mNodeMap.put(anim, node); + mNodes.add(node); + } + Dependency dependency = new Dependency(mCurrentNode, Dependency.AFTER); + node.addDependency(dependency); + return this; + } + + /** + * Sets up the given animation to play when the animation supplied in the + * {@link AnimatorSet#play(Animator)} call that created this Builder object + * to start when the animation supplied in this method call ends. + * + * @param anim The animation whose end will cause the animation supplied to the + * {@link AnimatorSet#play(Animator)} method to play. + */ + public Builder after(Animator anim) { + Node node = mNodeMap.get(anim); + if (node == null) { + node = new Node(anim); + mNodeMap.put(anim, node); + mNodes.add(node); + } + Dependency dependency = new Dependency(node, Dependency.AFTER); + mCurrentNode.addDependency(dependency); + return this; + } + + /** + * Sets up the animation supplied in the + * {@link AnimatorSet#play(Animator)} call that created this Builder object + * to play when the given amount of time elapses. + * + * @param delay The number of milliseconds that should elapse before the + * animation starts. + */ + public Builder after(long delay) { + // setup dummy ValueAnimator just to run the clock + ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); + anim.setDuration(delay); + after(anim); + return this; + } + + } + +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java new file mode 100644 index 0000000000..e41019364d --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatEvaluator.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.nineoldandroids.animation; + +/** + * This evaluator can be used to perform type interpolation between float values. + */ +public class FloatEvaluator implements TypeEvaluator { + + /** + * This function returns the result of linearly interpolating the start and end values, with + * fraction representing the proportion between the start and end values. The + * calculation is a simple parametric calculation: result = x0 + t * (v1 - v0), + * where x0 is startValue, x1 is endValue, + * and t is fraction. + * + * @param fraction The fraction from the starting to the ending values + * @param startValue The start value; should be of type float or + * Float + * @param endValue The end value; should be of type float or Float + * @return A linear interpolation between the start and end values, given the + * fraction parameter. + */ + public Float evaluate(float fraction, Number startValue, Number endValue) { + float startFloat = startValue.floatValue(); + return startFloat + fraction * (endValue.floatValue() - startFloat); + } +} \ No newline at end of file diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java new file mode 100644 index 0000000000..6d9dafa7a4 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/FloatKeyframeSet.java @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.nineoldandroids.animation; + +import java.util.ArrayList; +import android.view.animation.Interpolator; + +import com.actionbarsherlock.internal.nineoldandroids.animation.Keyframe.FloatKeyframe; + +/** + * This class holds a collection of FloatKeyframe objects and is called by ValueAnimator to calculate + * values between those keyframes for a given animation. The class internal to the animation + * package because it is an implementation detail of how Keyframes are stored and used. + * + *

This type-specific subclass of KeyframeSet, along with the other type-specific subclass for + * int, exists to speed up the getValue() method when there is no custom + * TypeEvaluator set for the animation, so that values can be calculated without autoboxing to the + * Object equivalents of these primitive types.

+ */ +@SuppressWarnings("unchecked") +class FloatKeyframeSet extends KeyframeSet { + private float firstValue; + private float lastValue; + private float deltaValue; + private boolean firstTime = true; + + public FloatKeyframeSet(FloatKeyframe... keyframes) { + super(keyframes); + } + + @Override + public Object getValue(float fraction) { + return getFloatValue(fraction); + } + + @Override + public FloatKeyframeSet clone() { + ArrayList keyframes = mKeyframes; + int numKeyframes = mKeyframes.size(); + FloatKeyframe[] newKeyframes = new FloatKeyframe[numKeyframes]; + for (int i = 0; i < numKeyframes; ++i) { + newKeyframes[i] = (FloatKeyframe) keyframes.get(i).clone(); + } + FloatKeyframeSet newSet = new FloatKeyframeSet(newKeyframes); + return newSet; + } + + public float getFloatValue(float fraction) { + if (mNumKeyframes == 2) { + if (firstTime) { + firstTime = false; + firstValue = ((FloatKeyframe) mKeyframes.get(0)).getFloatValue(); + lastValue = ((FloatKeyframe) mKeyframes.get(1)).getFloatValue(); + deltaValue = lastValue - firstValue; + } + if (mInterpolator != null) { + fraction = mInterpolator.getInterpolation(fraction); + } + if (mEvaluator == null) { + return firstValue + fraction * deltaValue; + } else { + return ((Number)mEvaluator.evaluate(fraction, firstValue, lastValue)).floatValue(); + } + } + if (fraction <= 0f) { + final FloatKeyframe prevKeyframe = (FloatKeyframe) mKeyframes.get(0); + final FloatKeyframe nextKeyframe = (FloatKeyframe) mKeyframes.get(1); + float prevValue = prevKeyframe.getFloatValue(); + float nextValue = nextKeyframe.getFloatValue(); + float prevFraction = prevKeyframe.getFraction(); + float nextFraction = nextKeyframe.getFraction(); + final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); + if (interpolator != null) { + fraction = interpolator.getInterpolation(fraction); + } + float intervalFraction = (fraction - prevFraction) / (nextFraction - prevFraction); + return mEvaluator == null ? + prevValue + intervalFraction * (nextValue - prevValue) : + ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)). + floatValue(); + } else if (fraction >= 1f) { + final FloatKeyframe prevKeyframe = (FloatKeyframe) mKeyframes.get(mNumKeyframes - 2); + final FloatKeyframe nextKeyframe = (FloatKeyframe) mKeyframes.get(mNumKeyframes - 1); + float prevValue = prevKeyframe.getFloatValue(); + float nextValue = nextKeyframe.getFloatValue(); + float prevFraction = prevKeyframe.getFraction(); + float nextFraction = nextKeyframe.getFraction(); + final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); + if (interpolator != null) { + fraction = interpolator.getInterpolation(fraction); + } + float intervalFraction = (fraction - prevFraction) / (nextFraction - prevFraction); + return mEvaluator == null ? + prevValue + intervalFraction * (nextValue - prevValue) : + ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)). + floatValue(); + } + FloatKeyframe prevKeyframe = (FloatKeyframe) mKeyframes.get(0); + for (int i = 1; i < mNumKeyframes; ++i) { + FloatKeyframe nextKeyframe = (FloatKeyframe) mKeyframes.get(i); + if (fraction < nextKeyframe.getFraction()) { + final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); + if (interpolator != null) { + fraction = interpolator.getInterpolation(fraction); + } + float intervalFraction = (fraction - prevKeyframe.getFraction()) / + (nextKeyframe.getFraction() - prevKeyframe.getFraction()); + float prevValue = prevKeyframe.getFloatValue(); + float nextValue = nextKeyframe.getFloatValue(); + return mEvaluator == null ? + prevValue + intervalFraction * (nextValue - prevValue) : + ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)). + floatValue(); + } + prevKeyframe = nextKeyframe; + } + // shouldn't get here + return ((Number)mKeyframes.get(mNumKeyframes - 1).getValue()).floatValue(); + } + +} + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java new file mode 100644 index 0000000000..ed5e79ec64 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntEvaluator.java @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.nineoldandroids.animation; + +/** + * This evaluator can be used to perform type interpolation between int values. + */ +public class IntEvaluator implements TypeEvaluator { + + /** + * This function returns the result of linearly interpolating the start and end values, with + * fraction representing the proportion between the start and end values. The + * calculation is a simple parametric calculation: result = x0 + t * (v1 - v0), + * where x0 is startValue, x1 is endValue, + * and t is fraction. + * + * @param fraction The fraction from the starting to the ending values + * @param startValue The start value; should be of type int or + * Integer + * @param endValue The end value; should be of type int or Integer + * @return A linear interpolation between the start and end values, given the + * fraction parameter. + */ + public Integer evaluate(float fraction, Integer startValue, Integer endValue) { + int startInt = startValue; + return (int)(startInt + fraction * (endValue - startInt)); + } +} \ No newline at end of file diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java new file mode 100644 index 0000000000..e9215e7f8c --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/IntKeyframeSet.java @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.nineoldandroids.animation; + +import java.util.ArrayList; +import android.view.animation.Interpolator; + +import com.actionbarsherlock.internal.nineoldandroids.animation.Keyframe.IntKeyframe; + +/** + * This class holds a collection of IntKeyframe objects and is called by ValueAnimator to calculate + * values between those keyframes for a given animation. The class internal to the animation + * package because it is an implementation detail of how Keyframes are stored and used. + * + *

This type-specific subclass of KeyframeSet, along with the other type-specific subclass for + * float, exists to speed up the getValue() method when there is no custom + * TypeEvaluator set for the animation, so that values can be calculated without autoboxing to the + * Object equivalents of these primitive types.

+ */ +@SuppressWarnings("unchecked") +class IntKeyframeSet extends KeyframeSet { + private int firstValue; + private int lastValue; + private int deltaValue; + private boolean firstTime = true; + + public IntKeyframeSet(IntKeyframe... keyframes) { + super(keyframes); + } + + @Override + public Object getValue(float fraction) { + return getIntValue(fraction); + } + + @Override + public IntKeyframeSet clone() { + ArrayList keyframes = mKeyframes; + int numKeyframes = mKeyframes.size(); + IntKeyframe[] newKeyframes = new IntKeyframe[numKeyframes]; + for (int i = 0; i < numKeyframes; ++i) { + newKeyframes[i] = (IntKeyframe) keyframes.get(i).clone(); + } + IntKeyframeSet newSet = new IntKeyframeSet(newKeyframes); + return newSet; + } + + public int getIntValue(float fraction) { + if (mNumKeyframes == 2) { + if (firstTime) { + firstTime = false; + firstValue = ((IntKeyframe) mKeyframes.get(0)).getIntValue(); + lastValue = ((IntKeyframe) mKeyframes.get(1)).getIntValue(); + deltaValue = lastValue - firstValue; + } + if (mInterpolator != null) { + fraction = mInterpolator.getInterpolation(fraction); + } + if (mEvaluator == null) { + return firstValue + (int)(fraction * deltaValue); + } else { + return ((Number)mEvaluator.evaluate(fraction, firstValue, lastValue)).intValue(); + } + } + if (fraction <= 0f) { + final IntKeyframe prevKeyframe = (IntKeyframe) mKeyframes.get(0); + final IntKeyframe nextKeyframe = (IntKeyframe) mKeyframes.get(1); + int prevValue = prevKeyframe.getIntValue(); + int nextValue = nextKeyframe.getIntValue(); + float prevFraction = prevKeyframe.getFraction(); + float nextFraction = nextKeyframe.getFraction(); + final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); + if (interpolator != null) { + fraction = interpolator.getInterpolation(fraction); + } + float intervalFraction = (fraction - prevFraction) / (nextFraction - prevFraction); + return mEvaluator == null ? + prevValue + (int)(intervalFraction * (nextValue - prevValue)) : + ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)). + intValue(); + } else if (fraction >= 1f) { + final IntKeyframe prevKeyframe = (IntKeyframe) mKeyframes.get(mNumKeyframes - 2); + final IntKeyframe nextKeyframe = (IntKeyframe) mKeyframes.get(mNumKeyframes - 1); + int prevValue = prevKeyframe.getIntValue(); + int nextValue = nextKeyframe.getIntValue(); + float prevFraction = prevKeyframe.getFraction(); + float nextFraction = nextKeyframe.getFraction(); + final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); + if (interpolator != null) { + fraction = interpolator.getInterpolation(fraction); + } + float intervalFraction = (fraction - prevFraction) / (nextFraction - prevFraction); + return mEvaluator == null ? + prevValue + (int)(intervalFraction * (nextValue - prevValue)) : + ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)).intValue(); + } + IntKeyframe prevKeyframe = (IntKeyframe) mKeyframes.get(0); + for (int i = 1; i < mNumKeyframes; ++i) { + IntKeyframe nextKeyframe = (IntKeyframe) mKeyframes.get(i); + if (fraction < nextKeyframe.getFraction()) { + final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); + if (interpolator != null) { + fraction = interpolator.getInterpolation(fraction); + } + float intervalFraction = (fraction - prevKeyframe.getFraction()) / + (nextKeyframe.getFraction() - prevKeyframe.getFraction()); + int prevValue = prevKeyframe.getIntValue(); + int nextValue = nextKeyframe.getIntValue(); + return mEvaluator == null ? + prevValue + (int)(intervalFraction * (nextValue - prevValue)) : + ((Number)mEvaluator.evaluate(intervalFraction, prevValue, nextValue)). + intValue(); + } + prevKeyframe = nextKeyframe; + } + // shouldn't get here + return ((Number)mKeyframes.get(mNumKeyframes - 1).getValue()).intValue(); + } + +} + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java new file mode 100644 index 0000000000..ab76fa7f68 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/Keyframe.java @@ -0,0 +1,361 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.nineoldandroids.animation; + +import android.view.animation.Interpolator; + +/** + * This class holds a time/value pair for an animation. The Keyframe class is used + * by {@link ValueAnimator} to define the values that the animation target will have over the course + * of the animation. As the time proceeds from one keyframe to the other, the value of the + * target object will animate between the value at the previous keyframe and the value at the + * next keyframe. Each keyframe also holds an optional {@link TimeInterpolator} + * object, which defines the time interpolation over the intervalue preceding the keyframe. + * + *

The Keyframe class itself is abstract. The type-specific factory methods will return + * a subclass of Keyframe specific to the type of value being stored. This is done to improve + * performance when dealing with the most common cases (e.g., float and + * int values). Other types will fall into a more general Keyframe class that + * treats its values as Objects. Unless your animation requires dealing with a custom type + * or a data structure that needs to be animated directly (and evaluated using an implementation + * of {@link TypeEvaluator}), you should stick to using float and int as animations using those + * types have lower runtime overhead than other types.

+ */ +@SuppressWarnings("rawtypes") +public abstract class Keyframe implements Cloneable { + /** + * The time at which mValue will hold true. + */ + float mFraction; + + /** + * The type of the value in this Keyframe. This type is determined at construction time, + * based on the type of the value object passed into the constructor. + */ + Class mValueType; + + /** + * The optional time interpolator for the interval preceding this keyframe. A null interpolator + * (the default) results in linear interpolation over the interval. + */ + private /*Time*/Interpolator mInterpolator = null; + + /** + * Flag to indicate whether this keyframe has a valid value. This flag is used when an + * animation first starts, to populate placeholder keyframes with real values derived + * from the target object. + */ + boolean mHasValue = false; + + /** + * Constructs a Keyframe object with the given time and value. The time defines the + * time, as a proportion of an overall animation's duration, at which the value will hold true + * for the animation. The value for the animation between keyframes will be calculated as + * an interpolation between the values at those keyframes. + * + * @param fraction The time, expressed as a value between 0 and 1, representing the fraction + * of time elapsed of the overall animation duration. + * @param value The value that the object will animate to as the animation time approaches + * the time in this keyframe, and the the value animated from as the time passes the time in + * this keyframe. + */ + public static Keyframe ofInt(float fraction, int value) { + return new IntKeyframe(fraction, value); + } + + /** + * Constructs a Keyframe object with the given time. The value at this time will be derived + * from the target object when the animation first starts (note that this implies that keyframes + * with no initial value must be used as part of an {@link ObjectAnimator}). + * The time defines the + * time, as a proportion of an overall animation's duration, at which the value will hold true + * for the animation. The value for the animation between keyframes will be calculated as + * an interpolation between the values at those keyframes. + * + * @param fraction The time, expressed as a value between 0 and 1, representing the fraction + * of time elapsed of the overall animation duration. + */ + public static Keyframe ofInt(float fraction) { + return new IntKeyframe(fraction); + } + + /** + * Constructs a Keyframe object with the given time and value. The time defines the + * time, as a proportion of an overall animation's duration, at which the value will hold true + * for the animation. The value for the animation between keyframes will be calculated as + * an interpolation between the values at those keyframes. + * + * @param fraction The time, expressed as a value between 0 and 1, representing the fraction + * of time elapsed of the overall animation duration. + * @param value The value that the object will animate to as the animation time approaches + * the time in this keyframe, and the the value animated from as the time passes the time in + * this keyframe. + */ + public static Keyframe ofFloat(float fraction, float value) { + return new FloatKeyframe(fraction, value); + } + + /** + * Constructs a Keyframe object with the given time. The value at this time will be derived + * from the target object when the animation first starts (note that this implies that keyframes + * with no initial value must be used as part of an {@link ObjectAnimator}). + * The time defines the + * time, as a proportion of an overall animation's duration, at which the value will hold true + * for the animation. The value for the animation between keyframes will be calculated as + * an interpolation between the values at those keyframes. + * + * @param fraction The time, expressed as a value between 0 and 1, representing the fraction + * of time elapsed of the overall animation duration. + */ + public static Keyframe ofFloat(float fraction) { + return new FloatKeyframe(fraction); + } + + /** + * Constructs a Keyframe object with the given time and value. The time defines the + * time, as a proportion of an overall animation's duration, at which the value will hold true + * for the animation. The value for the animation between keyframes will be calculated as + * an interpolation between the values at those keyframes. + * + * @param fraction The time, expressed as a value between 0 and 1, representing the fraction + * of time elapsed of the overall animation duration. + * @param value The value that the object will animate to as the animation time approaches + * the time in this keyframe, and the the value animated from as the time passes the time in + * this keyframe. + */ + public static Keyframe ofObject(float fraction, Object value) { + return new ObjectKeyframe(fraction, value); + } + + /** + * Constructs a Keyframe object with the given time. The value at this time will be derived + * from the target object when the animation first starts (note that this implies that keyframes + * with no initial value must be used as part of an {@link ObjectAnimator}). + * The time defines the + * time, as a proportion of an overall animation's duration, at which the value will hold true + * for the animation. The value for the animation between keyframes will be calculated as + * an interpolation between the values at those keyframes. + * + * @param fraction The time, expressed as a value between 0 and 1, representing the fraction + * of time elapsed of the overall animation duration. + */ + public static Keyframe ofObject(float fraction) { + return new ObjectKeyframe(fraction, null); + } + + /** + * Indicates whether this keyframe has a valid value. This method is called internally when + * an {@link ObjectAnimator} first starts; keyframes without values are assigned values at + * that time by deriving the value for the property from the target object. + * + * @return boolean Whether this object has a value assigned. + */ + public boolean hasValue() { + return mHasValue; + } + + /** + * Gets the value for this Keyframe. + * + * @return The value for this Keyframe. + */ + public abstract Object getValue(); + + /** + * Sets the value for this Keyframe. + * + * @param value value for this Keyframe. + */ + public abstract void setValue(Object value); + + /** + * Gets the time for this keyframe, as a fraction of the overall animation duration. + * + * @return The time associated with this keyframe, as a fraction of the overall animation + * duration. This should be a value between 0 and 1. + */ + public float getFraction() { + return mFraction; + } + + /** + * Sets the time for this keyframe, as a fraction of the overall animation duration. + * + * @param fraction time associated with this keyframe, as a fraction of the overall animation + * duration. This should be a value between 0 and 1. + */ + public void setFraction(float fraction) { + mFraction = fraction; + } + + /** + * Gets the optional interpolator for this Keyframe. A value of null indicates + * that there is no interpolation, which is the same as linear interpolation. + * + * @return The optional interpolator for this Keyframe. + */ + public /*Time*/Interpolator getInterpolator() { + return mInterpolator; + } + + /** + * Sets the optional interpolator for this Keyframe. A value of null indicates + * that there is no interpolation, which is the same as linear interpolation. + * + * @return The optional interpolator for this Keyframe. + */ + public void setInterpolator(/*Time*/Interpolator interpolator) { + mInterpolator = interpolator; + } + + /** + * Gets the type of keyframe. This information is used by ValueAnimator to determine the type of + * {@link TypeEvaluator} to use when calculating values between keyframes. The type is based + * on the type of Keyframe created. + * + * @return The type of the value stored in the Keyframe. + */ + public Class getType() { + return mValueType; + } + + @Override + public abstract Keyframe clone(); + + /** + * This internal subclass is used for all types which are not int or float. + */ + static class ObjectKeyframe extends Keyframe { + + /** + * The value of the animation at the time mFraction. + */ + Object mValue; + + ObjectKeyframe(float fraction, Object value) { + mFraction = fraction; + mValue = value; + mHasValue = (value != null); + mValueType = mHasValue ? value.getClass() : Object.class; + } + + public Object getValue() { + return mValue; + } + + public void setValue(Object value) { + mValue = value; + mHasValue = (value != null); + } + + @Override + public ObjectKeyframe clone() { + ObjectKeyframe kfClone = new ObjectKeyframe(getFraction(), mValue); + kfClone.setInterpolator(getInterpolator()); + return kfClone; + } + } + + /** + * Internal subclass used when the keyframe value is of type int. + */ + static class IntKeyframe extends Keyframe { + + /** + * The value of the animation at the time mFraction. + */ + int mValue; + + IntKeyframe(float fraction, int value) { + mFraction = fraction; + mValue = value; + mValueType = int.class; + mHasValue = true; + } + + IntKeyframe(float fraction) { + mFraction = fraction; + mValueType = int.class; + } + + public int getIntValue() { + return mValue; + } + + public Object getValue() { + return mValue; + } + + public void setValue(Object value) { + if (value != null && value.getClass() == Integer.class) { + mValue = ((Integer)value).intValue(); + mHasValue = true; + } + } + + @Override + public IntKeyframe clone() { + IntKeyframe kfClone = new IntKeyframe(getFraction(), mValue); + kfClone.setInterpolator(getInterpolator()); + return kfClone; + } + } + + /** + * Internal subclass used when the keyframe value is of type float. + */ + static class FloatKeyframe extends Keyframe { + /** + * The value of the animation at the time mFraction. + */ + float mValue; + + FloatKeyframe(float fraction, float value) { + mFraction = fraction; + mValue = value; + mValueType = float.class; + mHasValue = true; + } + + FloatKeyframe(float fraction) { + mFraction = fraction; + mValueType = float.class; + } + + public float getFloatValue() { + return mValue; + } + + public Object getValue() { + return mValue; + } + + public void setValue(Object value) { + if (value != null && value.getClass() == Float.class) { + mValue = ((Float)value).floatValue(); + mHasValue = true; + } + } + + @Override + public FloatKeyframe clone() { + FloatKeyframe kfClone = new FloatKeyframe(getFraction(), mValue); + kfClone.setInterpolator(getInterpolator()); + return kfClone; + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java new file mode 100644 index 0000000000..a71e1ad3cf --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/KeyframeSet.java @@ -0,0 +1,227 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.nineoldandroids.animation; + +import java.util.ArrayList; +import java.util.Arrays; +import android.view.animation.Interpolator; + +import com.actionbarsherlock.internal.nineoldandroids.animation.Keyframe.FloatKeyframe; +import com.actionbarsherlock.internal.nineoldandroids.animation.Keyframe.IntKeyframe; +import com.actionbarsherlock.internal.nineoldandroids.animation.Keyframe.ObjectKeyframe; + +/** + * This class holds a collection of Keyframe objects and is called by ValueAnimator to calculate + * values between those keyframes for a given animation. The class internal to the animation + * package because it is an implementation detail of how Keyframes are stored and used. + */ +@SuppressWarnings({"rawtypes", "unchecked"}) +class KeyframeSet { + + int mNumKeyframes; + + Keyframe mFirstKeyframe; + Keyframe mLastKeyframe; + /*Time*/Interpolator mInterpolator; // only used in the 2-keyframe case + ArrayList mKeyframes; // only used when there are not 2 keyframes + TypeEvaluator mEvaluator; + + + public KeyframeSet(Keyframe... keyframes) { + mNumKeyframes = keyframes.length; + mKeyframes = new ArrayList(); + mKeyframes.addAll(Arrays.asList(keyframes)); + mFirstKeyframe = mKeyframes.get(0); + mLastKeyframe = mKeyframes.get(mNumKeyframes - 1); + mInterpolator = mLastKeyframe.getInterpolator(); + } + + public static KeyframeSet ofInt(int... values) { + int numKeyframes = values.length; + IntKeyframe keyframes[] = new IntKeyframe[Math.max(numKeyframes,2)]; + if (numKeyframes == 1) { + keyframes[0] = (IntKeyframe) Keyframe.ofInt(0f); + keyframes[1] = (IntKeyframe) Keyframe.ofInt(1f, values[0]); + } else { + keyframes[0] = (IntKeyframe) Keyframe.ofInt(0f, values[0]); + for (int i = 1; i < numKeyframes; ++i) { + keyframes[i] = (IntKeyframe) Keyframe.ofInt((float) i / (numKeyframes - 1), values[i]); + } + } + return new IntKeyframeSet(keyframes); + } + + public static KeyframeSet ofFloat(float... values) { + int numKeyframes = values.length; + FloatKeyframe keyframes[] = new FloatKeyframe[Math.max(numKeyframes,2)]; + if (numKeyframes == 1) { + keyframes[0] = (FloatKeyframe) Keyframe.ofFloat(0f); + keyframes[1] = (FloatKeyframe) Keyframe.ofFloat(1f, values[0]); + } else { + keyframes[0] = (FloatKeyframe) Keyframe.ofFloat(0f, values[0]); + for (int i = 1; i < numKeyframes; ++i) { + keyframes[i] = (FloatKeyframe) Keyframe.ofFloat((float) i / (numKeyframes - 1), values[i]); + } + } + return new FloatKeyframeSet(keyframes); + } + + public static KeyframeSet ofKeyframe(Keyframe... keyframes) { + // if all keyframes of same primitive type, create the appropriate KeyframeSet + int numKeyframes = keyframes.length; + boolean hasFloat = false; + boolean hasInt = false; + boolean hasOther = false; + for (int i = 0; i < numKeyframes; ++i) { + if (keyframes[i] instanceof FloatKeyframe) { + hasFloat = true; + } else if (keyframes[i] instanceof IntKeyframe) { + hasInt = true; + } else { + hasOther = true; + } + } + if (hasFloat && !hasInt && !hasOther) { + FloatKeyframe floatKeyframes[] = new FloatKeyframe[numKeyframes]; + for (int i = 0; i < numKeyframes; ++i) { + floatKeyframes[i] = (FloatKeyframe) keyframes[i]; + } + return new FloatKeyframeSet(floatKeyframes); + } else if (hasInt && !hasFloat && !hasOther) { + IntKeyframe intKeyframes[] = new IntKeyframe[numKeyframes]; + for (int i = 0; i < numKeyframes; ++i) { + intKeyframes[i] = (IntKeyframe) keyframes[i]; + } + return new IntKeyframeSet(intKeyframes); + } else { + return new KeyframeSet(keyframes); + } + } + + public static KeyframeSet ofObject(Object... values) { + int numKeyframes = values.length; + ObjectKeyframe keyframes[] = new ObjectKeyframe[Math.max(numKeyframes,2)]; + if (numKeyframes == 1) { + keyframes[0] = (ObjectKeyframe) Keyframe.ofObject(0f); + keyframes[1] = (ObjectKeyframe) Keyframe.ofObject(1f, values[0]); + } else { + keyframes[0] = (ObjectKeyframe) Keyframe.ofObject(0f, values[0]); + for (int i = 1; i < numKeyframes; ++i) { + keyframes[i] = (ObjectKeyframe) Keyframe.ofObject((float) i / (numKeyframes - 1), values[i]); + } + } + return new KeyframeSet(keyframes); + } + + /** + * Sets the TypeEvaluator to be used when calculating animated values. This object + * is required only for KeyframeSets that are not either IntKeyframeSet or FloatKeyframeSet, + * both of which assume their own evaluator to speed up calculations with those primitive + * types. + * + * @param evaluator The TypeEvaluator to be used to calculate animated values. + */ + public void setEvaluator(TypeEvaluator evaluator) { + mEvaluator = evaluator; + } + + @Override + public KeyframeSet clone() { + ArrayList keyframes = mKeyframes; + int numKeyframes = mKeyframes.size(); + Keyframe[] newKeyframes = new Keyframe[numKeyframes]; + for (int i = 0; i < numKeyframes; ++i) { + newKeyframes[i] = keyframes.get(i).clone(); + } + KeyframeSet newSet = new KeyframeSet(newKeyframes); + return newSet; + } + + /** + * Gets the animated value, given the elapsed fraction of the animation (interpolated by the + * animation's interpolator) and the evaluator used to calculate in-between values. This + * function maps the input fraction to the appropriate keyframe interval and a fraction + * between them and returns the interpolated value. Note that the input fraction may fall + * outside the [0-1] bounds, if the animation's interpolator made that happen (e.g., a + * spring interpolation that might send the fraction past 1.0). We handle this situation by + * just using the two keyframes at the appropriate end when the value is outside those bounds. + * + * @param fraction The elapsed fraction of the animation + * @return The animated value. + */ + public Object getValue(float fraction) { + + // Special-case optimization for the common case of only two keyframes + if (mNumKeyframes == 2) { + if (mInterpolator != null) { + fraction = mInterpolator.getInterpolation(fraction); + } + return mEvaluator.evaluate(fraction, mFirstKeyframe.getValue(), + mLastKeyframe.getValue()); + } + if (fraction <= 0f) { + final Keyframe nextKeyframe = mKeyframes.get(1); + final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); + if (interpolator != null) { + fraction = interpolator.getInterpolation(fraction); + } + final float prevFraction = mFirstKeyframe.getFraction(); + float intervalFraction = (fraction - prevFraction) / + (nextKeyframe.getFraction() - prevFraction); + return mEvaluator.evaluate(intervalFraction, mFirstKeyframe.getValue(), + nextKeyframe.getValue()); + } else if (fraction >= 1f) { + final Keyframe prevKeyframe = mKeyframes.get(mNumKeyframes - 2); + final /*Time*/Interpolator interpolator = mLastKeyframe.getInterpolator(); + if (interpolator != null) { + fraction = interpolator.getInterpolation(fraction); + } + final float prevFraction = prevKeyframe.getFraction(); + float intervalFraction = (fraction - prevFraction) / + (mLastKeyframe.getFraction() - prevFraction); + return mEvaluator.evaluate(intervalFraction, prevKeyframe.getValue(), + mLastKeyframe.getValue()); + } + Keyframe prevKeyframe = mFirstKeyframe; + for (int i = 1; i < mNumKeyframes; ++i) { + Keyframe nextKeyframe = mKeyframes.get(i); + if (fraction < nextKeyframe.getFraction()) { + final /*Time*/Interpolator interpolator = nextKeyframe.getInterpolator(); + if (interpolator != null) { + fraction = interpolator.getInterpolation(fraction); + } + final float prevFraction = prevKeyframe.getFraction(); + float intervalFraction = (fraction - prevFraction) / + (nextKeyframe.getFraction() - prevFraction); + return mEvaluator.evaluate(intervalFraction, prevKeyframe.getValue(), + nextKeyframe.getValue()); + } + prevKeyframe = nextKeyframe; + } + // shouldn't reach here + return mLastKeyframe.getValue(); + } + + @Override + public String toString() { + String returnVal = " "; + for (int i = 0; i < mNumKeyframes; ++i) { + returnVal += mKeyframes.get(i).getValue() + " "; + } + return returnVal; + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java new file mode 100644 index 0000000000..21d15c02ac --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ObjectAnimator.java @@ -0,0 +1,491 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.nineoldandroids.animation; + +import android.util.Log; +//import android.util.Property; + +//import java.lang.reflect.Method; +import java.util.ArrayList; + +/** + * This subclass of {@link ValueAnimator} provides support for animating properties on target objects. + * The constructors of this class take parameters to define the target object that will be animated + * as well as the name of the property that will be animated. Appropriate set/get functions + * are then determined internally and the animation will call these functions as necessary to + * animate the property. + * + * @see #setPropertyName(String) + * + */ +@SuppressWarnings("rawtypes") +public final class ObjectAnimator extends ValueAnimator { + private static final boolean DBG = false; + + // The target object on which the property exists, set in the constructor + private Object mTarget; + + private String mPropertyName; + + //private Property mProperty; + + /** + * Sets the name of the property that will be animated. This name is used to derive + * a setter function that will be called to set animated values. + * For example, a property name of foo will result + * in a call to the function setFoo() on the target object. If either + * valueFrom or valueTo is null, then a getter function will + * also be derived and called. + * + *

For best performance of the mechanism that calls the setter function determined by the + * name of the property being animated, use float or int typed values, + * and make the setter function for those properties have a void return value. This + * will cause the code to take an optimized path for these constrained circumstances. Other + * property types and return types will work, but will have more overhead in processing + * the requests due to normal reflection mechanisms.

+ * + *

Note that the setter function derived from this property name + * must take the same parameter type as the + * valueFrom and valueTo properties, otherwise the call to + * the setter function will fail.

+ * + *

If this ObjectAnimator has been set up to animate several properties together, + * using more than one PropertyValuesHolder objects, then setting the propertyName simply + * sets the propertyName in the first of those PropertyValuesHolder objects.

+ * + * @param propertyName The name of the property being animated. Should not be null. + */ + public void setPropertyName(String propertyName) { + // mValues could be null if this is being constructed piecemeal. Just record the + // propertyName to be used later when setValues() is called if so. + if (mValues != null) { + PropertyValuesHolder valuesHolder = mValues[0]; + String oldName = valuesHolder.getPropertyName(); + valuesHolder.setPropertyName(propertyName); + mValuesMap.remove(oldName); + mValuesMap.put(propertyName, valuesHolder); + } + mPropertyName = propertyName; + // New property/values/target should cause re-initialization prior to starting + mInitialized = false; + } + + /** + * Sets the property that will be animated. Property objects will take precedence over + * properties specified by the {@link #setPropertyName(String)} method. Animations should + * be set up to use one or the other, not both. + * + * @param property The property being animated. Should not be null. + */ + //public void setProperty(Property property) { + // // mValues could be null if this is being constructed piecemeal. Just record the + // // propertyName to be used later when setValues() is called if so. + // if (mValues != null) { + // PropertyValuesHolder valuesHolder = mValues[0]; + // String oldName = valuesHolder.getPropertyName(); + // valuesHolder.setProperty(property); + // mValuesMap.remove(oldName); + // mValuesMap.put(mPropertyName, valuesHolder); + // } + // if (mProperty != null) { + // mPropertyName = property.getName(); + // } + // mProperty = property; + // // New property/values/target should cause re-initialization prior to starting + // mInitialized = false; + //} + + /** + * Gets the name of the property that will be animated. This name will be used to derive + * a setter function that will be called to set animated values. + * For example, a property name of foo will result + * in a call to the function setFoo() on the target object. If either + * valueFrom or valueTo is null, then a getter function will + * also be derived and called. + */ + public String getPropertyName() { + return mPropertyName; + } + + /** + * Creates a new ObjectAnimator object. This default constructor is primarily for + * use internally; the other constructors which take parameters are more generally + * useful. + */ + public ObjectAnimator() { + } + + /** + * Private utility constructor that initializes the target object and name of the + * property being animated. + * + * @param target The object whose property is to be animated. This object should + * have a public method on it called setName(), where name is + * the value of the propertyName parameter. + * @param propertyName The name of the property being animated. + */ + private ObjectAnimator(Object target, String propertyName) { + mTarget = target; + setPropertyName(propertyName); + } + + /** + * Private utility constructor that initializes the target object and property being animated. + * + * @param target The object whose property is to be animated. + * @param property The property being animated. + */ + //private ObjectAnimator(T target, Property property) { + // mTarget = target; + // setProperty(property); + //} + + /** + * Constructs and returns an ObjectAnimator that animates between int values. A single + * value implies that that value is the one being animated to. Two values imply a starting + * and ending values. More than two values imply a starting value, values to animate through + * along the way, and an ending value (these values will be distributed evenly across + * the duration of the animation). + * + * @param target The object whose property is to be animated. This object should + * have a public method on it called setName(), where name is + * the value of the propertyName parameter. + * @param propertyName The name of the property being animated. + * @param values A set of values that the animation will animate between over time. + * @return An ObjectAnimator object that is set up to animate between the given values. + */ + public static ObjectAnimator ofInt(Object target, String propertyName, int... values) { + ObjectAnimator anim = new ObjectAnimator(target, propertyName); + anim.setIntValues(values); + return anim; + } + + /** + * Constructs and returns an ObjectAnimator that animates between int values. A single + * value implies that that value is the one being animated to. Two values imply a starting + * and ending values. More than two values imply a starting value, values to animate through + * along the way, and an ending value (these values will be distributed evenly across + * the duration of the animation). + * + * @param target The object whose property is to be animated. + * @param property The property being animated. + * @param values A set of values that the animation will animate between over time. + * @return An ObjectAnimator object that is set up to animate between the given values. + */ + //public static ObjectAnimator ofInt(T target, Property property, int... values) { + // ObjectAnimator anim = new ObjectAnimator(target, property); + // anim.setIntValues(values); + // return anim; + //} + + /** + * Constructs and returns an ObjectAnimator that animates between float values. A single + * value implies that that value is the one being animated to. Two values imply a starting + * and ending values. More than two values imply a starting value, values to animate through + * along the way, and an ending value (these values will be distributed evenly across + * the duration of the animation). + * + * @param target The object whose property is to be animated. This object should + * have a public method on it called setName(), where name is + * the value of the propertyName parameter. + * @param propertyName The name of the property being animated. + * @param values A set of values that the animation will animate between over time. + * @return An ObjectAnimator object that is set up to animate between the given values. + */ + public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) { + ObjectAnimator anim = new ObjectAnimator(target, propertyName); + anim.setFloatValues(values); + return anim; + } + + /** + * Constructs and returns an ObjectAnimator that animates between float values. A single + * value implies that that value is the one being animated to. Two values imply a starting + * and ending values. More than two values imply a starting value, values to animate through + * along the way, and an ending value (these values will be distributed evenly across + * the duration of the animation). + * + * @param target The object whose property is to be animated. + * @param property The property being animated. + * @param values A set of values that the animation will animate between over time. + * @return An ObjectAnimator object that is set up to animate between the given values. + */ + //public static ObjectAnimator ofFloat(T target, Property property, + // float... values) { + // ObjectAnimator anim = new ObjectAnimator(target, property); + // anim.setFloatValues(values); + // return anim; + //} + + /** + * Constructs and returns an ObjectAnimator that animates between Object values. A single + * value implies that that value is the one being animated to. Two values imply a starting + * and ending values. More than two values imply a starting value, values to animate through + * along the way, and an ending value (these values will be distributed evenly across + * the duration of the animation). + * + * @param target The object whose property is to be animated. This object should + * have a public method on it called setName(), where name is + * the value of the propertyName parameter. + * @param propertyName The name of the property being animated. + * @param evaluator A TypeEvaluator that will be called on each animation frame to + * provide the necessary interpolation between the Object values to derive the animated + * value. + * @param values A set of values that the animation will animate between over time. + * @return An ObjectAnimator object that is set up to animate between the given values. + */ + public static ObjectAnimator ofObject(Object target, String propertyName, + TypeEvaluator evaluator, Object... values) { + ObjectAnimator anim = new ObjectAnimator(target, propertyName); + anim.setObjectValues(values); + anim.setEvaluator(evaluator); + return anim; + } + + /** + * Constructs and returns an ObjectAnimator that animates between Object values. A single + * value implies that that value is the one being animated to. Two values imply a starting + * and ending values. More than two values imply a starting value, values to animate through + * along the way, and an ending value (these values will be distributed evenly across + * the duration of the animation). + * + * @param target The object whose property is to be animated. + * @param property The property being animated. + * @param evaluator A TypeEvaluator that will be called on each animation frame to + * provide the necessary interpolation between the Object values to derive the animated + * value. + * @param values A set of values that the animation will animate between over time. + * @return An ObjectAnimator object that is set up to animate between the given values. + */ + //public static ObjectAnimator ofObject(T target, Property property, + // TypeEvaluator evaluator, V... values) { + // ObjectAnimator anim = new ObjectAnimator(target, property); + // anim.setObjectValues(values); + // anim.setEvaluator(evaluator); + // return anim; + //} + + /** + * Constructs and returns an ObjectAnimator that animates between the sets of values specified + * in PropertyValueHolder objects. This variant should be used when animating + * several properties at once with the same ObjectAnimator, since PropertyValuesHolder allows + * you to associate a set of animation values with a property name. + * + * @param target The object whose property is to be animated. Depending on how the + * PropertyValuesObjects were constructed, the target object should either have the {@link + * android.util.Property} objects used to construct the PropertyValuesHolder objects or (if the + * PropertyValuesHOlder objects were created with property names) the target object should have + * public methods on it called setName(), where name is the name of + * the property passed in as the propertyName parameter for each of the + * PropertyValuesHolder objects. + * @param values A set of PropertyValuesHolder objects whose values will be animated between + * over time. + * @return An ObjectAnimator object that is set up to animate between the given values. + */ + public static ObjectAnimator ofPropertyValuesHolder(Object target, + PropertyValuesHolder... values) { + ObjectAnimator anim = new ObjectAnimator(); + anim.mTarget = target; + anim.setValues(values); + return anim; + } + + @Override + public void setIntValues(int... values) { + if (mValues == null || mValues.length == 0) { + // No values yet - this animator is being constructed piecemeal. Init the values with + // whatever the current propertyName is + //if (mProperty != null) { + // setValues(PropertyValuesHolder.ofInt(mProperty, values)); + //} else { + setValues(PropertyValuesHolder.ofInt(mPropertyName, values)); + //} + } else { + super.setIntValues(values); + } + } + + @Override + public void setFloatValues(float... values) { + if (mValues == null || mValues.length == 0) { + // No values yet - this animator is being constructed piecemeal. Init the values with + // whatever the current propertyName is + //if (mProperty != null) { + // setValues(PropertyValuesHolder.ofFloat(mProperty, values)); + //} else { + setValues(PropertyValuesHolder.ofFloat(mPropertyName, values)); + //} + } else { + super.setFloatValues(values); + } + } + + @Override + public void setObjectValues(Object... values) { + if (mValues == null || mValues.length == 0) { + // No values yet - this animator is being constructed piecemeal. Init the values with + // whatever the current propertyName is + //if (mProperty != null) { + // setValues(PropertyValuesHolder.ofObject(mProperty, (TypeEvaluator)null, values)); + //} else { + setValues(PropertyValuesHolder.ofObject(mPropertyName, (TypeEvaluator)null, values)); + //} + } else { + super.setObjectValues(values); + } + } + + @Override + public void start() { + if (DBG) { + Log.d("ObjectAnimator", "Anim target, duration: " + mTarget + ", " + getDuration()); + for (int i = 0; i < mValues.length; ++i) { + PropertyValuesHolder pvh = mValues[i]; + ArrayList keyframes = pvh.mKeyframeSet.mKeyframes; + Log.d("ObjectAnimator", " Values[" + i + "]: " + + pvh.getPropertyName() + ", " + keyframes.get(0).getValue() + ", " + + keyframes.get(pvh.mKeyframeSet.mNumKeyframes - 1).getValue()); + } + } + super.start(); + } + + /** + * This function is called immediately before processing the first animation + * frame of an animation. If there is a nonzero startDelay, the + * function is called after that delay ends. + * It takes care of the final initialization steps for the + * animation. This includes setting mEvaluator, if the user has not yet + * set it up, and the setter/getter methods, if the user did not supply + * them. + * + *

Overriders of this method should call the superclass method to cause + * internal mechanisms to be set up correctly.

+ */ + @Override + void initAnimation() { + if (!mInitialized) { + // mValueType may change due to setter/getter setup; do this before calling super.init(), + // which uses mValueType to set up the default type evaluator. + int numValues = mValues.length; + for (int i = 0; i < numValues; ++i) { + mValues[i].setupSetterAndGetter(mTarget); + } + super.initAnimation(); + } + } + + /** + * Sets the length of the animation. The default duration is 300 milliseconds. + * + * @param duration The length of the animation, in milliseconds. + * @return ObjectAnimator The object called with setDuration(). This return + * value makes it easier to compose statements together that construct and then set the + * duration, as in + * ObjectAnimator.ofInt(target, propertyName, 0, 10).setDuration(500).start(). + */ + @Override + public ObjectAnimator setDuration(long duration) { + super.setDuration(duration); + return this; + } + + + /** + * The target object whose property will be animated by this animation + * + * @return The object being animated + */ + public Object getTarget() { + return mTarget; + } + + /** + * Sets the target object whose property will be animated by this animation + * + * @param target The object being animated + */ + @Override + public void setTarget(Object target) { + if (mTarget != target) { + final Object oldTarget = mTarget; + mTarget = target; + if (oldTarget != null && target != null && oldTarget.getClass() == target.getClass()) { + return; + } + // New target type should cause re-initialization prior to starting + mInitialized = false; + } + } + + @Override + public void setupStartValues() { + initAnimation(); + int numValues = mValues.length; + for (int i = 0; i < numValues; ++i) { + mValues[i].setupStartValue(mTarget); + } + } + + @Override + public void setupEndValues() { + initAnimation(); + int numValues = mValues.length; + for (int i = 0; i < numValues; ++i) { + mValues[i].setupEndValue(mTarget); + } + } + + /** + * This method is called with the elapsed fraction of the animation during every + * animation frame. This function turns the elapsed fraction into an interpolated fraction + * and then into an animated value (from the evaluator. The function is called mostly during + * animation updates, but it is also called when the end() + * function is called, to set the final value on the property. + * + *

Overrides of this method must call the superclass to perform the calculation + * of the animated value.

+ * + * @param fraction The elapsed fraction of the animation. + */ + @Override + void animateValue(float fraction) { + super.animateValue(fraction); + int numValues = mValues.length; + for (int i = 0; i < numValues; ++i) { + mValues[i].setAnimatedValue(mTarget); + } + } + + @Override + public ObjectAnimator clone() { + final ObjectAnimator anim = (ObjectAnimator) super.clone(); + return anim; + } + + @Override + public String toString() { + String returnVal = "ObjectAnimator@" + Integer.toHexString(hashCode()) + ", target " + + mTarget; + if (mValues != null) { + for (int i = 0; i < mValues.length; ++i) { + returnVal += "\n " + mValues[i].toString(); + } + } + return returnVal; + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java new file mode 100644 index 0000000000..84f7504abc --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/PropertyValuesHolder.java @@ -0,0 +1,1012 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.nineoldandroids.animation; + +//import android.util.FloatProperty; +//import android.util.IntProperty; +import android.util.Log; +//import android.util.Property; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +/** + * This class holds information about a property and the values that that property + * should take on during an animation. PropertyValuesHolder objects can be used to create + * animations with ValueAnimator or ObjectAnimator that operate on several different properties + * in parallel. + */ +@SuppressWarnings({"rawtypes", "unchecked"}) +public class PropertyValuesHolder implements Cloneable { + + /** + * The name of the property associated with the values. This need not be a real property, + * unless this object is being used with ObjectAnimator. But this is the name by which + * aniamted values are looked up with getAnimatedValue(String) in ValueAnimator. + */ + String mPropertyName; + + /** + * @hide + */ + //protected Property mProperty; + + /** + * The setter function, if needed. ObjectAnimator hands off this functionality to + * PropertyValuesHolder, since it holds all of the per-property information. This + * property is automatically + * derived when the animation starts in setupSetterAndGetter() if using ObjectAnimator. + */ + Method mSetter = null; + + /** + * The getter function, if needed. ObjectAnimator hands off this functionality to + * PropertyValuesHolder, since it holds all of the per-property information. This + * property is automatically + * derived when the animation starts in setupSetterAndGetter() if using ObjectAnimator. + * The getter is only derived and used if one of the values is null. + */ + private Method mGetter = null; + + /** + * The type of values supplied. This information is used both in deriving the setter/getter + * functions and in deriving the type of TypeEvaluator. + */ + Class mValueType; + + /** + * The set of keyframes (time/value pairs) that define this animation. + */ + KeyframeSet mKeyframeSet = null; + + + // type evaluators for the primitive types handled by this implementation + private static final TypeEvaluator sIntEvaluator = new IntEvaluator(); + private static final TypeEvaluator sFloatEvaluator = new FloatEvaluator(); + + // We try several different types when searching for appropriate setter/getter functions. + // The caller may have supplied values in a type that does not match the setter/getter + // functions (such as the integers 0 and 1 to represent floating point values for alpha). + // Also, the use of generics in constructors means that we end up with the Object versions + // of primitive types (Float vs. float). But most likely, the setter/getter functions + // will take primitive types instead. + // So we supply an ordered array of other types to try before giving up. + private static Class[] FLOAT_VARIANTS = {float.class, Float.class, double.class, int.class, + Double.class, Integer.class}; + private static Class[] INTEGER_VARIANTS = {int.class, Integer.class, float.class, double.class, + Float.class, Double.class}; + private static Class[] DOUBLE_VARIANTS = {double.class, Double.class, float.class, int.class, + Float.class, Integer.class}; + + // These maps hold all property entries for a particular class. This map + // is used to speed up property/setter/getter lookups for a given class/property + // combination. No need to use reflection on the combination more than once. + private static final HashMap> sSetterPropertyMap = + new HashMap>(); + private static final HashMap> sGetterPropertyMap = + new HashMap>(); + + // This lock is used to ensure that only one thread is accessing the property maps + // at a time. + final ReentrantReadWriteLock mPropertyMapLock = new ReentrantReadWriteLock(); + + // Used to pass single value to varargs parameter in setter invocation + final Object[] mTmpValueArray = new Object[1]; + + /** + * The type evaluator used to calculate the animated values. This evaluator is determined + * automatically based on the type of the start/end objects passed into the constructor, + * but the system only knows about the primitive types int and float. Any other + * type will need to set the evaluator to a custom evaluator for that type. + */ + private TypeEvaluator mEvaluator; + + /** + * The value most recently calculated by calculateValue(). This is set during + * that function and might be retrieved later either by ValueAnimator.animatedValue() or + * by the property-setting logic in ObjectAnimator.animatedValue(). + */ + private Object mAnimatedValue; + + /** + * Internal utility constructor, used by the factory methods to set the property name. + * @param propertyName The name of the property for this holder. + */ + private PropertyValuesHolder(String propertyName) { + mPropertyName = propertyName; + } + + /** + * Internal utility constructor, used by the factory methods to set the property. + * @param property The property for this holder. + */ + //private PropertyValuesHolder(Property property) { + // mProperty = property; + // if (property != null) { + // mPropertyName = property.getName(); + // } + //} + + /** + * Constructs and returns a PropertyValuesHolder with a given property name and + * set of int values. + * @param propertyName The name of the property being animated. + * @param values The values that the named property will animate between. + * @return PropertyValuesHolder The constructed PropertyValuesHolder object. + */ + public static PropertyValuesHolder ofInt(String propertyName, int... values) { + return new IntPropertyValuesHolder(propertyName, values); + } + + /** + * Constructs and returns a PropertyValuesHolder with a given property and + * set of int values. + * @param property The property being animated. Should not be null. + * @param values The values that the property will animate between. + * @return PropertyValuesHolder The constructed PropertyValuesHolder object. + */ + //public static PropertyValuesHolder ofInt(Property property, int... values) { + // return new IntPropertyValuesHolder(property, values); + //} + + /** + * Constructs and returns a PropertyValuesHolder with a given property name and + * set of float values. + * @param propertyName The name of the property being animated. + * @param values The values that the named property will animate between. + * @return PropertyValuesHolder The constructed PropertyValuesHolder object. + */ + public static PropertyValuesHolder ofFloat(String propertyName, float... values) { + return new FloatPropertyValuesHolder(propertyName, values); + } + + /** + * Constructs and returns a PropertyValuesHolder with a given property and + * set of float values. + * @param property The property being animated. Should not be null. + * @param values The values that the property will animate between. + * @return PropertyValuesHolder The constructed PropertyValuesHolder object. + */ + //public static PropertyValuesHolder ofFloat(Property property, float... values) { + // return new FloatPropertyValuesHolder(property, values); + //} + + /** + * Constructs and returns a PropertyValuesHolder with a given property name and + * set of Object values. This variant also takes a TypeEvaluator because the system + * cannot automatically interpolate between objects of unknown type. + * + * @param propertyName The name of the property being animated. + * @param evaluator A TypeEvaluator that will be called on each animation frame to + * provide the necessary interpolation between the Object values to derive the animated + * value. + * @param values The values that the named property will animate between. + * @return PropertyValuesHolder The constructed PropertyValuesHolder object. + */ + public static PropertyValuesHolder ofObject(String propertyName, TypeEvaluator evaluator, + Object... values) { + PropertyValuesHolder pvh = new PropertyValuesHolder(propertyName); + pvh.setObjectValues(values); + pvh.setEvaluator(evaluator); + return pvh; + } + + /** + * Constructs and returns a PropertyValuesHolder with a given property and + * set of Object values. This variant also takes a TypeEvaluator because the system + * cannot automatically interpolate between objects of unknown type. + * + * @param property The property being animated. Should not be null. + * @param evaluator A TypeEvaluator that will be called on each animation frame to + * provide the necessary interpolation between the Object values to derive the animated + * value. + * @param values The values that the property will animate between. + * @return PropertyValuesHolder The constructed PropertyValuesHolder object. + */ + //public static PropertyValuesHolder ofObject(Property property, + // TypeEvaluator evaluator, V... values) { + // PropertyValuesHolder pvh = new PropertyValuesHolder(property); + // pvh.setObjectValues(values); + // pvh.setEvaluator(evaluator); + // return pvh; + //} + + /** + * Constructs and returns a PropertyValuesHolder object with the specified property name and set + * of values. These values can be of any type, but the type should be consistent so that + * an appropriate {@link android.animation.TypeEvaluator} can be found that matches + * the common type. + *

If there is only one value, it is assumed to be the end value of an animation, + * and an initial value will be derived, if possible, by calling a getter function + * on the object. Also, if any value is null, the value will be filled in when the animation + * starts in the same way. This mechanism of automatically getting null values only works + * if the PropertyValuesHolder object is used in conjunction + * {@link ObjectAnimator}, and with a getter function + * derived automatically from propertyName, since otherwise PropertyValuesHolder has + * no way of determining what the value should be. + * @param propertyName The name of the property associated with this set of values. This + * can be the actual property name to be used when using a ObjectAnimator object, or + * just a name used to get animated values, such as if this object is used with an + * ValueAnimator object. + * @param values The set of values to animate between. + */ + public static PropertyValuesHolder ofKeyframe(String propertyName, Keyframe... values) { + KeyframeSet keyframeSet = KeyframeSet.ofKeyframe(values); + if (keyframeSet instanceof IntKeyframeSet) { + return new IntPropertyValuesHolder(propertyName, (IntKeyframeSet) keyframeSet); + } else if (keyframeSet instanceof FloatKeyframeSet) { + return new FloatPropertyValuesHolder(propertyName, (FloatKeyframeSet) keyframeSet); + } + else { + PropertyValuesHolder pvh = new PropertyValuesHolder(propertyName); + pvh.mKeyframeSet = keyframeSet; + pvh.mValueType = values[0].getType(); + return pvh; + } + } + + /** + * Constructs and returns a PropertyValuesHolder object with the specified property and set + * of values. These values can be of any type, but the type should be consistent so that + * an appropriate {@link android.animation.TypeEvaluator} can be found that matches + * the common type. + *

If there is only one value, it is assumed to be the end value of an animation, + * and an initial value will be derived, if possible, by calling the property's + * {@link android.util.Property#get(Object)} function. + * Also, if any value is null, the value will be filled in when the animation + * starts in the same way. This mechanism of automatically getting null values only works + * if the PropertyValuesHolder object is used in conjunction with + * {@link ObjectAnimator}, since otherwise PropertyValuesHolder has + * no way of determining what the value should be. + * @param property The property associated with this set of values. Should not be null. + * @param values The set of values to animate between. + */ + //public static PropertyValuesHolder ofKeyframe(Property property, Keyframe... values) { + // KeyframeSet keyframeSet = KeyframeSet.ofKeyframe(values); + // if (keyframeSet instanceof IntKeyframeSet) { + // return new IntPropertyValuesHolder(property, (IntKeyframeSet) keyframeSet); + // } else if (keyframeSet instanceof FloatKeyframeSet) { + // return new FloatPropertyValuesHolder(property, (FloatKeyframeSet) keyframeSet); + // } + // else { + // PropertyValuesHolder pvh = new PropertyValuesHolder(property); + // pvh.mKeyframeSet = keyframeSet; + // pvh.mValueType = ((Keyframe)values[0]).getType(); + // return pvh; + // } + //} + + /** + * Set the animated values for this object to this set of ints. + * If there is only one value, it is assumed to be the end value of an animation, + * and an initial value will be derived, if possible, by calling a getter function + * on the object. Also, if any value is null, the value will be filled in when the animation + * starts in the same way. This mechanism of automatically getting null values only works + * if the PropertyValuesHolder object is used in conjunction + * {@link ObjectAnimator}, and with a getter function + * derived automatically from propertyName, since otherwise PropertyValuesHolder has + * no way of determining what the value should be. + * + * @param values One or more values that the animation will animate between. + */ + public void setIntValues(int... values) { + mValueType = int.class; + mKeyframeSet = KeyframeSet.ofInt(values); + } + + /** + * Set the animated values for this object to this set of floats. + * If there is only one value, it is assumed to be the end value of an animation, + * and an initial value will be derived, if possible, by calling a getter function + * on the object. Also, if any value is null, the value will be filled in when the animation + * starts in the same way. This mechanism of automatically getting null values only works + * if the PropertyValuesHolder object is used in conjunction + * {@link ObjectAnimator}, and with a getter function + * derived automatically from propertyName, since otherwise PropertyValuesHolder has + * no way of determining what the value should be. + * + * @param values One or more values that the animation will animate between. + */ + public void setFloatValues(float... values) { + mValueType = float.class; + mKeyframeSet = KeyframeSet.ofFloat(values); + } + + /** + * Set the animated values for this object to this set of Keyframes. + * + * @param values One or more values that the animation will animate between. + */ + public void setKeyframes(Keyframe... values) { + int numKeyframes = values.length; + Keyframe keyframes[] = new Keyframe[Math.max(numKeyframes,2)]; + mValueType = values[0].getType(); + for (int i = 0; i < numKeyframes; ++i) { + keyframes[i] = values[i]; + } + mKeyframeSet = new KeyframeSet(keyframes); + } + + /** + * Set the animated values for this object to this set of Objects. + * If there is only one value, it is assumed to be the end value of an animation, + * and an initial value will be derived, if possible, by calling a getter function + * on the object. Also, if any value is null, the value will be filled in when the animation + * starts in the same way. This mechanism of automatically getting null values only works + * if the PropertyValuesHolder object is used in conjunction + * {@link ObjectAnimator}, and with a getter function + * derived automatically from propertyName, since otherwise PropertyValuesHolder has + * no way of determining what the value should be. + * + * @param values One or more values that the animation will animate between. + */ + public void setObjectValues(Object... values) { + mValueType = values[0].getClass(); + mKeyframeSet = KeyframeSet.ofObject(values); + } + + /** + * Determine the setter or getter function using the JavaBeans convention of setFoo or + * getFoo for a property named 'foo'. This function figures out what the name of the + * function should be and uses reflection to find the Method with that name on the + * target object. + * + * @param targetClass The class to search for the method + * @param prefix "set" or "get", depending on whether we need a setter or getter. + * @param valueType The type of the parameter (in the case of a setter). This type + * is derived from the values set on this PropertyValuesHolder. This type is used as + * a first guess at the parameter type, but we check for methods with several different + * types to avoid problems with slight mis-matches between supplied values and actual + * value types used on the setter. + * @return Method the method associated with mPropertyName. + */ + private Method getPropertyFunction(Class targetClass, String prefix, Class valueType) { + // TODO: faster implementation... + Method returnVal = null; + String methodName = getMethodName(prefix, mPropertyName); + Class args[] = null; + if (valueType == null) { + try { + returnVal = targetClass.getMethod(methodName, args); + } catch (NoSuchMethodException e) { + Log.e("PropertyValuesHolder", targetClass.getSimpleName() + " - " + + "Couldn't find no-arg method for property " + mPropertyName + ": " + e); + } + } else { + args = new Class[1]; + Class typeVariants[]; + if (mValueType.equals(Float.class)) { + typeVariants = FLOAT_VARIANTS; + } else if (mValueType.equals(Integer.class)) { + typeVariants = INTEGER_VARIANTS; + } else if (mValueType.equals(Double.class)) { + typeVariants = DOUBLE_VARIANTS; + } else { + typeVariants = new Class[1]; + typeVariants[0] = mValueType; + } + for (Class typeVariant : typeVariants) { + args[0] = typeVariant; + try { + returnVal = targetClass.getMethod(methodName, args); + // change the value type to suit + mValueType = typeVariant; + return returnVal; + } catch (NoSuchMethodException e) { + // Swallow the error and keep trying other variants + } + } + // If we got here, then no appropriate function was found + Log.e("PropertyValuesHolder", + "Couldn't find " + prefix + "ter property " + mPropertyName + + " for " + targetClass.getSimpleName() + + " with value type "+ mValueType); + } + + return returnVal; + } + + + /** + * Returns the setter or getter requested. This utility function checks whether the + * requested method exists in the propertyMapMap cache. If not, it calls another + * utility function to request the Method from the targetClass directly. + * @param targetClass The Class on which the requested method should exist. + * @param propertyMapMap The cache of setters/getters derived so far. + * @param prefix "set" or "get", for the setter or getter. + * @param valueType The type of parameter passed into the method (null for getter). + * @return Method the method associated with mPropertyName. + */ + private Method setupSetterOrGetter(Class targetClass, + HashMap> propertyMapMap, + String prefix, Class valueType) { + Method setterOrGetter = null; + try { + // Have to lock property map prior to reading it, to guard against + // another thread putting something in there after we've checked it + // but before we've added an entry to it + mPropertyMapLock.writeLock().lock(); + HashMap propertyMap = propertyMapMap.get(targetClass); + if (propertyMap != null) { + setterOrGetter = propertyMap.get(mPropertyName); + } + if (setterOrGetter == null) { + setterOrGetter = getPropertyFunction(targetClass, prefix, valueType); + if (propertyMap == null) { + propertyMap = new HashMap(); + propertyMapMap.put(targetClass, propertyMap); + } + propertyMap.put(mPropertyName, setterOrGetter); + } + } finally { + mPropertyMapLock.writeLock().unlock(); + } + return setterOrGetter; + } + + /** + * Utility function to get the setter from targetClass + * @param targetClass The Class on which the requested method should exist. + */ + void setupSetter(Class targetClass) { + mSetter = setupSetterOrGetter(targetClass, sSetterPropertyMap, "set", mValueType); + } + + /** + * Utility function to get the getter from targetClass + */ + private void setupGetter(Class targetClass) { + mGetter = setupSetterOrGetter(targetClass, sGetterPropertyMap, "get", null); + } + + /** + * Internal function (called from ObjectAnimator) to set up the setter and getter + * prior to running the animation. If the setter has not been manually set for this + * object, it will be derived automatically given the property name, target object, and + * types of values supplied. If no getter has been set, it will be supplied iff any of the + * supplied values was null. If there is a null value, then the getter (supplied or derived) + * will be called to set those null values to the current value of the property + * on the target object. + * @param target The object on which the setter (and possibly getter) exist. + */ + void setupSetterAndGetter(Object target) { + //if (mProperty != null) { + // // check to make sure that mProperty is on the class of target + // try { + // Object testValue = mProperty.get(target); + // for (Keyframe kf : mKeyframeSet.mKeyframes) { + // if (!kf.hasValue()) { + // kf.setValue(mProperty.get(target)); + // } + // } + // return; + // } catch (ClassCastException e) { + // Log.e("PropertyValuesHolder","No such property (" + mProperty.getName() + + // ") on target object " + target + ". Trying reflection instead"); + // mProperty = null; + // } + //} + Class targetClass = target.getClass(); + if (mSetter == null) { + setupSetter(targetClass); + } + for (Keyframe kf : mKeyframeSet.mKeyframes) { + if (!kf.hasValue()) { + if (mGetter == null) { + setupGetter(targetClass); + } + try { + kf.setValue(mGetter.invoke(target)); + } catch (InvocationTargetException e) { + Log.e("PropertyValuesHolder", e.toString()); + } catch (IllegalAccessException e) { + Log.e("PropertyValuesHolder", e.toString()); + } + } + } + } + + /** + * Utility function to set the value stored in a particular Keyframe. The value used is + * whatever the value is for the property name specified in the keyframe on the target object. + * + * @param target The target object from which the current value should be extracted. + * @param kf The keyframe which holds the property name and value. + */ + private void setupValue(Object target, Keyframe kf) { + //if (mProperty != null) { + // kf.setValue(mProperty.get(target)); + //} + try { + if (mGetter == null) { + Class targetClass = target.getClass(); + setupGetter(targetClass); + } + kf.setValue(mGetter.invoke(target)); + } catch (InvocationTargetException e) { + Log.e("PropertyValuesHolder", e.toString()); + } catch (IllegalAccessException e) { + Log.e("PropertyValuesHolder", e.toString()); + } + } + + /** + * This function is called by ObjectAnimator when setting the start values for an animation. + * The start values are set according to the current values in the target object. The + * property whose value is extracted is whatever is specified by the propertyName of this + * PropertyValuesHolder object. + * + * @param target The object which holds the start values that should be set. + */ + void setupStartValue(Object target) { + setupValue(target, mKeyframeSet.mKeyframes.get(0)); + } + + /** + * This function is called by ObjectAnimator when setting the end values for an animation. + * The end values are set according to the current values in the target object. The + * property whose value is extracted is whatever is specified by the propertyName of this + * PropertyValuesHolder object. + * + * @param target The object which holds the start values that should be set. + */ + void setupEndValue(Object target) { + setupValue(target, mKeyframeSet.mKeyframes.get(mKeyframeSet.mKeyframes.size() - 1)); + } + + @Override + public PropertyValuesHolder clone() { + try { + PropertyValuesHolder newPVH = (PropertyValuesHolder) super.clone(); + newPVH.mPropertyName = mPropertyName; + //newPVH.mProperty = mProperty; + newPVH.mKeyframeSet = mKeyframeSet.clone(); + newPVH.mEvaluator = mEvaluator; + return newPVH; + } catch (CloneNotSupportedException e) { + // won't reach here + return null; + } + } + + /** + * Internal function to set the value on the target object, using the setter set up + * earlier on this PropertyValuesHolder object. This function is called by ObjectAnimator + * to handle turning the value calculated by ValueAnimator into a value set on the object + * according to the name of the property. + * @param target The target object on which the value is set + */ + void setAnimatedValue(Object target) { + //if (mProperty != null) { + // mProperty.set(target, getAnimatedValue()); + //} + if (mSetter != null) { + try { + mTmpValueArray[0] = getAnimatedValue(); + mSetter.invoke(target, mTmpValueArray); + } catch (InvocationTargetException e) { + Log.e("PropertyValuesHolder", e.toString()); + } catch (IllegalAccessException e) { + Log.e("PropertyValuesHolder", e.toString()); + } + } + } + + /** + * Internal function, called by ValueAnimator, to set up the TypeEvaluator that will be used + * to calculate animated values. + */ + void init() { + if (mEvaluator == null) { + // We already handle int and float automatically, but not their Object + // equivalents + mEvaluator = (mValueType == Integer.class) ? sIntEvaluator : + (mValueType == Float.class) ? sFloatEvaluator : + null; + } + if (mEvaluator != null) { + // KeyframeSet knows how to evaluate the common types - only give it a custom + // evaluator if one has been set on this class + mKeyframeSet.setEvaluator(mEvaluator); + } + } + + /** + * The TypeEvaluator will the automatically determined based on the type of values + * supplied to PropertyValuesHolder. The evaluator can be manually set, however, if so + * desired. This may be important in cases where either the type of the values supplied + * do not match the way that they should be interpolated between, or if the values + * are of a custom type or one not currently understood by the animation system. Currently, + * only values of type float and int (and their Object equivalents: Float + * and Integer) are correctly interpolated; all other types require setting a TypeEvaluator. + * @param evaluator + */ + public void setEvaluator(TypeEvaluator evaluator) { + mEvaluator = evaluator; + mKeyframeSet.setEvaluator(evaluator); + } + + /** + * Function used to calculate the value according to the evaluator set up for + * this PropertyValuesHolder object. This function is called by ValueAnimator.animateValue(). + * + * @param fraction The elapsed, interpolated fraction of the animation. + */ + void calculateValue(float fraction) { + mAnimatedValue = mKeyframeSet.getValue(fraction); + } + + /** + * Sets the name of the property that will be animated. This name is used to derive + * a setter function that will be called to set animated values. + * For example, a property name of foo will result + * in a call to the function setFoo() on the target object. If either + * valueFrom or valueTo is null, then a getter function will + * also be derived and called. + * + *

Note that the setter function derived from this property name + * must take the same parameter type as the + * valueFrom and valueTo properties, otherwise the call to + * the setter function will fail.

+ * + * @param propertyName The name of the property being animated. + */ + public void setPropertyName(String propertyName) { + mPropertyName = propertyName; + } + + /** + * Sets the property that will be animated. + * + *

Note that if this PropertyValuesHolder object is used with ObjectAnimator, the property + * must exist on the target object specified in that ObjectAnimator.

+ * + * @param property The property being animated. + */ + //public void setProperty(Property property) { + // mProperty = property; + //} + + /** + * Gets the name of the property that will be animated. This name will be used to derive + * a setter function that will be called to set animated values. + * For example, a property name of foo will result + * in a call to the function setFoo() on the target object. If either + * valueFrom or valueTo is null, then a getter function will + * also be derived and called. + */ + public String getPropertyName() { + return mPropertyName; + } + + /** + * Internal function, called by ValueAnimator and ObjectAnimator, to retrieve the value + * most recently calculated in calculateValue(). + * @return + */ + Object getAnimatedValue() { + return mAnimatedValue; + } + + @Override + public String toString() { + return mPropertyName + ": " + mKeyframeSet.toString(); + } + + /** + * Utility method to derive a setter/getter method name from a property name, where the + * prefix is typically "set" or "get" and the first letter of the property name is + * capitalized. + * + * @param prefix The precursor to the method name, before the property name begins, typically + * "set" or "get". + * @param propertyName The name of the property that represents the bulk of the method name + * after the prefix. The first letter of this word will be capitalized in the resulting + * method name. + * @return String the property name converted to a method name according to the conventions + * specified above. + */ + static String getMethodName(String prefix, String propertyName) { + if (propertyName == null || propertyName.length() == 0) { + // shouldn't get here + return prefix; + } + char firstLetter = Character.toUpperCase(propertyName.charAt(0)); + String theRest = propertyName.substring(1); + return prefix + firstLetter + theRest; + } + + static class IntPropertyValuesHolder extends PropertyValuesHolder { + + // Cache JNI functions to avoid looking them up twice + //private static final HashMap> sJNISetterPropertyMap = + // new HashMap>(); + //int mJniSetter; + //private IntProperty mIntProperty; + + IntKeyframeSet mIntKeyframeSet; + int mIntAnimatedValue; + + public IntPropertyValuesHolder(String propertyName, IntKeyframeSet keyframeSet) { + super(propertyName); + mValueType = int.class; + mKeyframeSet = keyframeSet; + mIntKeyframeSet = (IntKeyframeSet) mKeyframeSet; + } + + //public IntPropertyValuesHolder(Property property, IntKeyframeSet keyframeSet) { + // super(property); + // mValueType = int.class; + // mKeyframeSet = keyframeSet; + // mIntKeyframeSet = (IntKeyframeSet) mKeyframeSet; + // if (property instanceof IntProperty) { + // mIntProperty = (IntProperty) mProperty; + // } + //} + + public IntPropertyValuesHolder(String propertyName, int... values) { + super(propertyName); + setIntValues(values); + } + + //public IntPropertyValuesHolder(Property property, int... values) { + // super(property); + // setIntValues(values); + // if (property instanceof IntProperty) { + // mIntProperty = (IntProperty) mProperty; + // } + //} + + @Override + public void setIntValues(int... values) { + super.setIntValues(values); + mIntKeyframeSet = (IntKeyframeSet) mKeyframeSet; + } + + @Override + void calculateValue(float fraction) { + mIntAnimatedValue = mIntKeyframeSet.getIntValue(fraction); + } + + @Override + Object getAnimatedValue() { + return mIntAnimatedValue; + } + + @Override + public IntPropertyValuesHolder clone() { + IntPropertyValuesHolder newPVH = (IntPropertyValuesHolder) super.clone(); + newPVH.mIntKeyframeSet = (IntKeyframeSet) newPVH.mKeyframeSet; + return newPVH; + } + + /** + * Internal function to set the value on the target object, using the setter set up + * earlier on this PropertyValuesHolder object. This function is called by ObjectAnimator + * to handle turning the value calculated by ValueAnimator into a value set on the object + * according to the name of the property. + * @param target The target object on which the value is set + */ + @Override + void setAnimatedValue(Object target) { + //if (mIntProperty != null) { + // mIntProperty.setValue(target, mIntAnimatedValue); + // return; + //} + //if (mProperty != null) { + // mProperty.set(target, mIntAnimatedValue); + // return; + //} + //if (mJniSetter != 0) { + // nCallIntMethod(target, mJniSetter, mIntAnimatedValue); + // return; + //} + if (mSetter != null) { + try { + mTmpValueArray[0] = mIntAnimatedValue; + mSetter.invoke(target, mTmpValueArray); + } catch (InvocationTargetException e) { + Log.e("PropertyValuesHolder", e.toString()); + } catch (IllegalAccessException e) { + Log.e("PropertyValuesHolder", e.toString()); + } + } + } + + @Override + void setupSetter(Class targetClass) { + //if (mProperty != null) { + // return; + //} + // Check new static hashmap for setter method + //try { + // mPropertyMapLock.writeLock().lock(); + // HashMap propertyMap = sJNISetterPropertyMap.get(targetClass); + // if (propertyMap != null) { + // Integer mJniSetterInteger = propertyMap.get(mPropertyName); + // if (mJniSetterInteger != null) { + // mJniSetter = mJniSetterInteger; + // } + // } + // if (mJniSetter == 0) { + // String methodName = getMethodName("set", mPropertyName); + // mJniSetter = nGetIntMethod(targetClass, methodName); + // if (mJniSetter != 0) { + // if (propertyMap == null) { + // propertyMap = new HashMap(); + // sJNISetterPropertyMap.put(targetClass, propertyMap); + // } + // propertyMap.put(mPropertyName, mJniSetter); + // } + // } + //} catch (NoSuchMethodError e) { + // Log.d("PropertyValuesHolder", + // "Can't find native method using JNI, use reflection" + e); + //} finally { + // mPropertyMapLock.writeLock().unlock(); + //} + //if (mJniSetter == 0) { + // Couldn't find method through fast JNI approach - just use reflection + super.setupSetter(targetClass); + //} + } + } + + static class FloatPropertyValuesHolder extends PropertyValuesHolder { + + // Cache JNI functions to avoid looking them up twice + //private static final HashMap> sJNISetterPropertyMap = + // new HashMap>(); + //int mJniSetter; + //private FloatProperty mFloatProperty; + + FloatKeyframeSet mFloatKeyframeSet; + float mFloatAnimatedValue; + + public FloatPropertyValuesHolder(String propertyName, FloatKeyframeSet keyframeSet) { + super(propertyName); + mValueType = float.class; + mKeyframeSet = keyframeSet; + mFloatKeyframeSet = (FloatKeyframeSet) mKeyframeSet; + } + + //public FloatPropertyValuesHolder(Property property, FloatKeyframeSet keyframeSet) { + // super(property); + // mValueType = float.class; + // mKeyframeSet = keyframeSet; + // mFloatKeyframeSet = (FloatKeyframeSet) mKeyframeSet; + // if (property instanceof FloatProperty) { + // mFloatProperty = (FloatProperty) mProperty; + // } + //} + + public FloatPropertyValuesHolder(String propertyName, float... values) { + super(propertyName); + setFloatValues(values); + } + + //public FloatPropertyValuesHolder(Property property, float... values) { + // super(property); + // setFloatValues(values); + // if (property instanceof FloatProperty) { + // mFloatProperty = (FloatProperty) mProperty; + // } + //} + + @Override + public void setFloatValues(float... values) { + super.setFloatValues(values); + mFloatKeyframeSet = (FloatKeyframeSet) mKeyframeSet; + } + + @Override + void calculateValue(float fraction) { + mFloatAnimatedValue = mFloatKeyframeSet.getFloatValue(fraction); + } + + @Override + Object getAnimatedValue() { + return mFloatAnimatedValue; + } + + @Override + public FloatPropertyValuesHolder clone() { + FloatPropertyValuesHolder newPVH = (FloatPropertyValuesHolder) super.clone(); + newPVH.mFloatKeyframeSet = (FloatKeyframeSet) newPVH.mKeyframeSet; + return newPVH; + } + + /** + * Internal function to set the value on the target object, using the setter set up + * earlier on this PropertyValuesHolder object. This function is called by ObjectAnimator + * to handle turning the value calculated by ValueAnimator into a value set on the object + * according to the name of the property. + * @param target The target object on which the value is set + */ + @Override + void setAnimatedValue(Object target) { + //if (mFloatProperty != null) { + // mFloatProperty.setValue(target, mFloatAnimatedValue); + // return; + //} + //if (mProperty != null) { + // mProperty.set(target, mFloatAnimatedValue); + // return; + //} + //if (mJniSetter != 0) { + // nCallFloatMethod(target, mJniSetter, mFloatAnimatedValue); + // return; + //} + if (mSetter != null) { + try { + mTmpValueArray[0] = mFloatAnimatedValue; + mSetter.invoke(target, mTmpValueArray); + } catch (InvocationTargetException e) { + Log.e("PropertyValuesHolder", e.toString()); + } catch (IllegalAccessException e) { + Log.e("PropertyValuesHolder", e.toString()); + } + } + } + + @Override + void setupSetter(Class targetClass) { + //if (mProperty != null) { + // return; + //} + // Check new static hashmap for setter method + //try { + // mPropertyMapLock.writeLock().lock(); + // HashMap propertyMap = sJNISetterPropertyMap.get(targetClass); + // if (propertyMap != null) { + // Integer mJniSetterInteger = propertyMap.get(mPropertyName); + // if (mJniSetterInteger != null) { + // mJniSetter = mJniSetterInteger; + // } + // } + // if (mJniSetter == 0) { + // String methodName = getMethodName("set", mPropertyName); + // mJniSetter = nGetFloatMethod(targetClass, methodName); + // if (mJniSetter != 0) { + // if (propertyMap == null) { + // propertyMap = new HashMap(); + // sJNISetterPropertyMap.put(targetClass, propertyMap); + // } + // propertyMap.put(mPropertyName, mJniSetter); + // } + // } + //} catch (NoSuchMethodError e) { + // Log.d("PropertyValuesHolder", + // "Can't find native method using JNI, use reflection" + e); + //} finally { + // mPropertyMapLock.writeLock().unlock(); + //} + //if (mJniSetter == 0) { + // Couldn't find method through fast JNI approach - just use reflection + super.setupSetter(targetClass); + //} + } + + } + + //native static private int nGetIntMethod(Class targetClass, String methodName); + //native static private int nGetFloatMethod(Class targetClass, String methodName); + //native static private void nCallIntMethod(Object target, int methodID, int arg); + //native static private void nCallFloatMethod(Object target, int methodID, float arg); +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java new file mode 100644 index 0000000000..0ea3192446 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/TypeEvaluator.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.nineoldandroids.animation; + +/** + * Interface for use with the {@link ValueAnimator#setEvaluator(TypeEvaluator)} function. Evaluators + * allow developers to create animations on arbitrary property types, by allowing them to supply + * custom evaulators for types that are not automatically understood and used by the animation + * system. + * + * @see ValueAnimator#setEvaluator(TypeEvaluator) + */ +public interface TypeEvaluator { + + /** + * This function returns the result of linearly interpolating the start and end values, with + * fraction representing the proportion between the start and end values. The + * calculation is a simple parametric calculation: result = x0 + t * (v1 - v0), + * where x0 is startValue, x1 is endValue, + * and t is fraction. + * + * @param fraction The fraction from the starting to the ending values + * @param startValue The start value. + * @param endValue The end value. + * @return A linear interpolation between the start and end values, given the + * fraction parameter. + */ + public T evaluate(float fraction, T startValue, T endValue); + +} \ No newline at end of file diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java new file mode 100644 index 0000000000..d8a12c6882 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/animation/ValueAnimator.java @@ -0,0 +1,1265 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.nineoldandroids.animation; + +import android.os.Handler; +import android.os.Looper; +import android.os.Message; +import android.util.AndroidRuntimeException; +import android.view.animation.AccelerateDecelerateInterpolator; +import android.view.animation.AnimationUtils; +import android.view.animation.Interpolator; +import android.view.animation.LinearInterpolator; + +import java.util.ArrayList; +import java.util.HashMap; + +/** + * This class provides a simple timing engine for running animations + * which calculate animated values and set them on target objects. + * + *

There is a single timing pulse that all animations use. It runs in a + * custom handler to ensure that property changes happen on the UI thread.

+ * + *

By default, ValueAnimator uses non-linear time interpolation, via the + * {@link AccelerateDecelerateInterpolator} class, which accelerates into and decelerates + * out of an animation. This behavior can be changed by calling + * {@link ValueAnimator#setInterpolator(TimeInterpolator)}.

+ */ +@SuppressWarnings({"rawtypes", "unchecked"}) +public class ValueAnimator extends Animator { + + /** + * Internal constants + */ + + /* + * The default amount of time in ms between animation frames + */ + private static final long DEFAULT_FRAME_DELAY = 10; + + /** + * Messages sent to timing handler: START is sent when an animation first begins, FRAME is sent + * by the handler to itself to process the next animation frame + */ + static final int ANIMATION_START = 0; + static final int ANIMATION_FRAME = 1; + + /** + * Values used with internal variable mPlayingState to indicate the current state of an + * animation. + */ + static final int STOPPED = 0; // Not yet playing + static final int RUNNING = 1; // Playing normally + static final int SEEKED = 2; // Seeked to some time value + + /** + * Internal variables + * NOTE: This object implements the clone() method, making a deep copy of any referenced + * objects. As other non-trivial fields are added to this class, make sure to add logic + * to clone() to make deep copies of them. + */ + + // The first time that the animation's animateFrame() method is called. This time is used to + // determine elapsed time (and therefore the elapsed fraction) in subsequent calls + // to animateFrame() + long mStartTime; + + /** + * Set when setCurrentPlayTime() is called. If negative, animation is not currently seeked + * to a value. + */ + long mSeekTime = -1; + + // TODO: We access the following ThreadLocal variables often, some of them on every update. + // If ThreadLocal access is significantly expensive, we may want to put all of these + // fields into a structure sot hat we just access ThreadLocal once to get the reference + // to that structure, then access the structure directly for each field. + + // The static sAnimationHandler processes the internal timing loop on which all animations + // are based + private static ThreadLocal sAnimationHandler = + new ThreadLocal(); + + // The per-thread list of all active animations + private static final ThreadLocal> sAnimations = + new ThreadLocal>() { + @Override + protected ArrayList initialValue() { + return new ArrayList(); + } + }; + + // The per-thread set of animations to be started on the next animation frame + private static final ThreadLocal> sPendingAnimations = + new ThreadLocal>() { + @Override + protected ArrayList initialValue() { + return new ArrayList(); + } + }; + + /** + * Internal per-thread collections used to avoid set collisions as animations start and end + * while being processed. + */ + private static final ThreadLocal> sDelayedAnims = + new ThreadLocal>() { + @Override + protected ArrayList initialValue() { + return new ArrayList(); + } + }; + + private static final ThreadLocal> sEndingAnims = + new ThreadLocal>() { + @Override + protected ArrayList initialValue() { + return new ArrayList(); + } + }; + + private static final ThreadLocal> sReadyAnims = + new ThreadLocal>() { + @Override + protected ArrayList initialValue() { + return new ArrayList(); + } + }; + + // The time interpolator to be used if none is set on the animation + private static final /*Time*/Interpolator sDefaultInterpolator = + new AccelerateDecelerateInterpolator(); + + // type evaluators for the primitive types handled by this implementation + //private static final TypeEvaluator sIntEvaluator = new IntEvaluator(); + //private static final TypeEvaluator sFloatEvaluator = new FloatEvaluator(); + + /** + * Used to indicate whether the animation is currently playing in reverse. This causes the + * elapsed fraction to be inverted to calculate the appropriate values. + */ + private boolean mPlayingBackwards = false; + + /** + * This variable tracks the current iteration that is playing. When mCurrentIteration exceeds the + * repeatCount (if repeatCount!=INFINITE), the animation ends + */ + private int mCurrentIteration = 0; + + /** + * Tracks current elapsed/eased fraction, for querying in getAnimatedFraction(). + */ + private float mCurrentFraction = 0f; + + /** + * Tracks whether a startDelay'd animation has begun playing through the startDelay. + */ + private boolean mStartedDelay = false; + + /** + * Tracks the time at which the animation began playing through its startDelay. This is + * different from the mStartTime variable, which is used to track when the animation became + * active (which is when the startDelay expired and the animation was added to the active + * animations list). + */ + private long mDelayStartTime; + + /** + * Flag that represents the current state of the animation. Used to figure out when to start + * an animation (if state == STOPPED). Also used to end an animation that + * has been cancel()'d or end()'d since the last animation frame. Possible values are + * STOPPED, RUNNING, SEEKED. + */ + int mPlayingState = STOPPED; + + /** + * Additional playing state to indicate whether an animator has been start()'d. There is + * some lag between a call to start() and the first animation frame. We should still note + * that the animation has been started, even if it's first animation frame has not yet + * happened, and reflect that state in isRunning(). + * Note that delayed animations are different: they are not started until their first + * animation frame, which occurs after their delay elapses. + */ + private boolean mRunning = false; + + /** + * Additional playing state to indicate whether an animator has been start()'d, whether or + * not there is a nonzero startDelay. + */ + private boolean mStarted = false; + + /** + * Flag that denotes whether the animation is set up and ready to go. Used to + * set up animation that has not yet been started. + */ + boolean mInitialized = false; + + // + // Backing variables + // + + // How long the animation should last in ms + private long mDuration = 300; + + // The amount of time in ms to delay starting the animation after start() is called + private long mStartDelay = 0; + + // The number of milliseconds between animation frames + private static long sFrameDelay = DEFAULT_FRAME_DELAY; + + // The number of times the animation will repeat. The default is 0, which means the animation + // will play only once + private int mRepeatCount = 0; + + /** + * The type of repetition that will occur when repeatMode is nonzero. RESTART means the + * animation will start from the beginning on every new cycle. REVERSE means the animation + * will reverse directions on each iteration. + */ + private int mRepeatMode = RESTART; + + /** + * The time interpolator to be used. The elapsed fraction of the animation will be passed + * through this interpolator to calculate the interpolated fraction, which is then used to + * calculate the animated values. + */ + private /*Time*/Interpolator mInterpolator = sDefaultInterpolator; + + /** + * The set of listeners to be sent events through the life of an animation. + */ + private ArrayList mUpdateListeners = null; + + /** + * The property/value sets being animated. + */ + PropertyValuesHolder[] mValues; + + /** + * A hashmap of the PropertyValuesHolder objects. This map is used to lookup animated values + * by property name during calls to getAnimatedValue(String). + */ + HashMap mValuesMap; + + /** + * Public constants + */ + + /** + * When the animation reaches the end and repeatCount is INFINITE + * or a positive value, the animation restarts from the beginning. + */ + public static final int RESTART = 1; + /** + * When the animation reaches the end and repeatCount is INFINITE + * or a positive value, the animation reverses direction on every iteration. + */ + public static final int REVERSE = 2; + /** + * This value used used with the {@link #setRepeatCount(int)} property to repeat + * the animation indefinitely. + */ + public static final int INFINITE = -1; + + /** + * Creates a new ValueAnimator object. This default constructor is primarily for + * use internally; the factory methods which take parameters are more generally + * useful. + */ + public ValueAnimator() { + } + + /** + * Constructs and returns a ValueAnimator that animates between int values. A single + * value implies that that value is the one being animated to. However, this is not typically + * useful in a ValueAnimator object because there is no way for the object to determine the + * starting value for the animation (unlike ObjectAnimator, which can derive that value + * from the target object and property being animated). Therefore, there should typically + * be two or more values. + * + * @param values A set of values that the animation will animate between over time. + * @return A ValueAnimator object that is set up to animate between the given values. + */ + public static ValueAnimator ofInt(int... values) { + ValueAnimator anim = new ValueAnimator(); + anim.setIntValues(values); + return anim; + } + + /** + * Constructs and returns a ValueAnimator that animates between float values. A single + * value implies that that value is the one being animated to. However, this is not typically + * useful in a ValueAnimator object because there is no way for the object to determine the + * starting value for the animation (unlike ObjectAnimator, which can derive that value + * from the target object and property being animated). Therefore, there should typically + * be two or more values. + * + * @param values A set of values that the animation will animate between over time. + * @return A ValueAnimator object that is set up to animate between the given values. + */ + public static ValueAnimator ofFloat(float... values) { + ValueAnimator anim = new ValueAnimator(); + anim.setFloatValues(values); + return anim; + } + + /** + * Constructs and returns a ValueAnimator that animates between the values + * specified in the PropertyValuesHolder objects. + * + * @param values A set of PropertyValuesHolder objects whose values will be animated + * between over time. + * @return A ValueAnimator object that is set up to animate between the given values. + */ + public static ValueAnimator ofPropertyValuesHolder(PropertyValuesHolder... values) { + ValueAnimator anim = new ValueAnimator(); + anim.setValues(values); + return anim; + } + /** + * Constructs and returns a ValueAnimator that animates between Object values. A single + * value implies that that value is the one being animated to. However, this is not typically + * useful in a ValueAnimator object because there is no way for the object to determine the + * starting value for the animation (unlike ObjectAnimator, which can derive that value + * from the target object and property being animated). Therefore, there should typically + * be two or more values. + * + *

Since ValueAnimator does not know how to animate between arbitrary Objects, this + * factory method also takes a TypeEvaluator object that the ValueAnimator will use + * to perform that interpolation. + * + * @param evaluator A TypeEvaluator that will be called on each animation frame to + * provide the ncessry interpolation between the Object values to derive the animated + * value. + * @param values A set of values that the animation will animate between over time. + * @return A ValueAnimator object that is set up to animate between the given values. + */ + public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values) { + ValueAnimator anim = new ValueAnimator(); + anim.setObjectValues(values); + anim.setEvaluator(evaluator); + return anim; + } + + /** + * Sets int values that will be animated between. A single + * value implies that that value is the one being animated to. However, this is not typically + * useful in a ValueAnimator object because there is no way for the object to determine the + * starting value for the animation (unlike ObjectAnimator, which can derive that value + * from the target object and property being animated). Therefore, there should typically + * be two or more values. + * + *

If there are already multiple sets of values defined for this ValueAnimator via more + * than one PropertyValuesHolder object, this method will set the values for the first + * of those objects.

+ * + * @param values A set of values that the animation will animate between over time. + */ + public void setIntValues(int... values) { + if (values == null || values.length == 0) { + return; + } + if (mValues == null || mValues.length == 0) { + setValues(new PropertyValuesHolder[]{PropertyValuesHolder.ofInt("", values)}); + } else { + PropertyValuesHolder valuesHolder = mValues[0]; + valuesHolder.setIntValues(values); + } + // New property/values/target should cause re-initialization prior to starting + mInitialized = false; + } + + /** + * Sets float values that will be animated between. A single + * value implies that that value is the one being animated to. However, this is not typically + * useful in a ValueAnimator object because there is no way for the object to determine the + * starting value for the animation (unlike ObjectAnimator, which can derive that value + * from the target object and property being animated). Therefore, there should typically + * be two or more values. + * + *

If there are already multiple sets of values defined for this ValueAnimator via more + * than one PropertyValuesHolder object, this method will set the values for the first + * of those objects.

+ * + * @param values A set of values that the animation will animate between over time. + */ + public void setFloatValues(float... values) { + if (values == null || values.length == 0) { + return; + } + if (mValues == null || mValues.length == 0) { + setValues(new PropertyValuesHolder[]{PropertyValuesHolder.ofFloat("", values)}); + } else { + PropertyValuesHolder valuesHolder = mValues[0]; + valuesHolder.setFloatValues(values); + } + // New property/values/target should cause re-initialization prior to starting + mInitialized = false; + } + + /** + * Sets the values to animate between for this animation. A single + * value implies that that value is the one being animated to. However, this is not typically + * useful in a ValueAnimator object because there is no way for the object to determine the + * starting value for the animation (unlike ObjectAnimator, which can derive that value + * from the target object and property being animated). Therefore, there should typically + * be two or more values. + * + *

If there are already multiple sets of values defined for this ValueAnimator via more + * than one PropertyValuesHolder object, this method will set the values for the first + * of those objects.

+ * + *

There should be a TypeEvaluator set on the ValueAnimator that knows how to interpolate + * between these value objects. ValueAnimator only knows how to interpolate between the + * primitive types specified in the other setValues() methods.

+ * + * @param values The set of values to animate between. + */ + public void setObjectValues(Object... values) { + if (values == null || values.length == 0) { + return; + } + if (mValues == null || mValues.length == 0) { + setValues(new PropertyValuesHolder[]{PropertyValuesHolder.ofObject("", + (TypeEvaluator)null, values)}); + } else { + PropertyValuesHolder valuesHolder = mValues[0]; + valuesHolder.setObjectValues(values); + } + // New property/values/target should cause re-initialization prior to starting + mInitialized = false; + } + + /** + * Sets the values, per property, being animated between. This function is called internally + * by the constructors of ValueAnimator that take a list of values. But an ValueAnimator can + * be constructed without values and this method can be called to set the values manually + * instead. + * + * @param values The set of values, per property, being animated between. + */ + public void setValues(PropertyValuesHolder... values) { + int numValues = values.length; + mValues = values; + mValuesMap = new HashMap(numValues); + for (int i = 0; i < numValues; ++i) { + PropertyValuesHolder valuesHolder = values[i]; + mValuesMap.put(valuesHolder.getPropertyName(), valuesHolder); + } + // New property/values/target should cause re-initialization prior to starting + mInitialized = false; + } + + /** + * Returns the values that this ValueAnimator animates between. These values are stored in + * PropertyValuesHolder objects, even if the ValueAnimator was created with a simple list + * of value objects instead. + * + * @return PropertyValuesHolder[] An array of PropertyValuesHolder objects which hold the + * values, per property, that define the animation. + */ + public PropertyValuesHolder[] getValues() { + return mValues; + } + + /** + * This function is called immediately before processing the first animation + * frame of an animation. If there is a nonzero startDelay, the + * function is called after that delay ends. + * It takes care of the final initialization steps for the + * animation. + * + *

Overrides of this method should call the superclass method to ensure + * that internal mechanisms for the animation are set up correctly.

+ */ + void initAnimation() { + if (!mInitialized) { + int numValues = mValues.length; + for (int i = 0; i < numValues; ++i) { + mValues[i].init(); + } + mInitialized = true; + } + } + + + /** + * Sets the length of the animation. The default duration is 300 milliseconds. + * + * @param duration The length of the animation, in milliseconds. This value cannot + * be negative. + * @return ValueAnimator The object called with setDuration(). This return + * value makes it easier to compose statements together that construct and then set the + * duration, as in ValueAnimator.ofInt(0, 10).setDuration(500).start(). + */ + public ValueAnimator setDuration(long duration) { + if (duration < 0) { + throw new IllegalArgumentException("Animators cannot have negative duration: " + + duration); + } + mDuration = duration; + return this; + } + + /** + * Gets the length of the animation. The default duration is 300 milliseconds. + * + * @return The length of the animation, in milliseconds. + */ + public long getDuration() { + return mDuration; + } + + /** + * Sets the position of the animation to the specified point in time. This time should + * be between 0 and the total duration of the animation, including any repetition. If + * the animation has not yet been started, then it will not advance forward after it is + * set to this time; it will simply set the time to this value and perform any appropriate + * actions based on that time. If the animation is already running, then setCurrentPlayTime() + * will set the current playing time to this value and continue playing from that point. + * + * @param playTime The time, in milliseconds, to which the animation is advanced or rewound. + */ + public void setCurrentPlayTime(long playTime) { + initAnimation(); + long currentTime = AnimationUtils.currentAnimationTimeMillis(); + if (mPlayingState != RUNNING) { + mSeekTime = playTime; + mPlayingState = SEEKED; + } + mStartTime = currentTime - playTime; + animationFrame(currentTime); + } + + /** + * Gets the current position of the animation in time, which is equal to the current + * time minus the time that the animation started. An animation that is not yet started will + * return a value of zero. + * + * @return The current position in time of the animation. + */ + public long getCurrentPlayTime() { + if (!mInitialized || mPlayingState == STOPPED) { + return 0; + } + return AnimationUtils.currentAnimationTimeMillis() - mStartTime; + } + + /** + * This custom, static handler handles the timing pulse that is shared by + * all active animations. This approach ensures that the setting of animation + * values will happen on the UI thread and that all animations will share + * the same times for calculating their values, which makes synchronizing + * animations possible. + * + */ + private static class AnimationHandler extends Handler { + /** + * There are only two messages that we care about: ANIMATION_START and + * ANIMATION_FRAME. The START message is sent when an animation's start() + * method is called. It cannot start synchronously when start() is called + * because the call may be on the wrong thread, and it would also not be + * synchronized with other animations because it would not start on a common + * timing pulse. So each animation sends a START message to the handler, which + * causes the handler to place the animation on the active animations queue and + * start processing frames for that animation. + * The FRAME message is the one that is sent over and over while there are any + * active animations to process. + */ + @Override + public void handleMessage(Message msg) { + boolean callAgain = true; + ArrayList animations = sAnimations.get(); + ArrayList delayedAnims = sDelayedAnims.get(); + switch (msg.what) { + // TODO: should we avoid sending frame message when starting if we + // were already running? + case ANIMATION_START: + ArrayList pendingAnimations = sPendingAnimations.get(); + if (animations.size() > 0 || delayedAnims.size() > 0) { + callAgain = false; + } + // pendingAnims holds any animations that have requested to be started + // We're going to clear sPendingAnimations, but starting animation may + // cause more to be added to the pending list (for example, if one animation + // starting triggers another starting). So we loop until sPendingAnimations + // is empty. + while (pendingAnimations.size() > 0) { + ArrayList pendingCopy = + (ArrayList) pendingAnimations.clone(); + pendingAnimations.clear(); + int count = pendingCopy.size(); + for (int i = 0; i < count; ++i) { + ValueAnimator anim = pendingCopy.get(i); + // If the animation has a startDelay, place it on the delayed list + if (anim.mStartDelay == 0) { + anim.startAnimation(); + } else { + delayedAnims.add(anim); + } + } + } + // fall through to process first frame of new animations + case ANIMATION_FRAME: + // currentTime holds the common time for all animations processed + // during this frame + long currentTime = AnimationUtils.currentAnimationTimeMillis(); + ArrayList readyAnims = sReadyAnims.get(); + ArrayList endingAnims = sEndingAnims.get(); + + // First, process animations currently sitting on the delayed queue, adding + // them to the active animations if they are ready + int numDelayedAnims = delayedAnims.size(); + for (int i = 0; i < numDelayedAnims; ++i) { + ValueAnimator anim = delayedAnims.get(i); + if (anim.delayedAnimationFrame(currentTime)) { + readyAnims.add(anim); + } + } + int numReadyAnims = readyAnims.size(); + if (numReadyAnims > 0) { + for (int i = 0; i < numReadyAnims; ++i) { + ValueAnimator anim = readyAnims.get(i); + anim.startAnimation(); + anim.mRunning = true; + delayedAnims.remove(anim); + } + readyAnims.clear(); + } + + // Now process all active animations. The return value from animationFrame() + // tells the handler whether it should now be ended + int numAnims = animations.size(); + int i = 0; + while (i < numAnims) { + ValueAnimator anim = animations.get(i); + if (anim.animationFrame(currentTime)) { + endingAnims.add(anim); + } + if (animations.size() == numAnims) { + ++i; + } else { + // An animation might be canceled or ended by client code + // during the animation frame. Check to see if this happened by + // seeing whether the current index is the same as it was before + // calling animationFrame(). Another approach would be to copy + // animations to a temporary list and process that list instead, + // but that entails garbage and processing overhead that would + // be nice to avoid. + --numAnims; + endingAnims.remove(anim); + } + } + if (endingAnims.size() > 0) { + for (i = 0; i < endingAnims.size(); ++i) { + endingAnims.get(i).endAnimation(); + } + endingAnims.clear(); + } + + // If there are still active or delayed animations, call the handler again + // after the frameDelay + if (callAgain && (!animations.isEmpty() || !delayedAnims.isEmpty())) { + sendEmptyMessageDelayed(ANIMATION_FRAME, Math.max(0, sFrameDelay - + (AnimationUtils.currentAnimationTimeMillis() - currentTime))); + } + break; + } + } + } + + /** + * The amount of time, in milliseconds, to delay starting the animation after + * {@link #start()} is called. + * + * @return the number of milliseconds to delay running the animation + */ + public long getStartDelay() { + return mStartDelay; + } + + /** + * The amount of time, in milliseconds, to delay starting the animation after + * {@link #start()} is called. + + * @param startDelay The amount of the delay, in milliseconds + */ + public void setStartDelay(long startDelay) { + this.mStartDelay = startDelay; + } + + /** + * The amount of time, in milliseconds, between each frame of the animation. This is a + * requested time that the animation will attempt to honor, but the actual delay between + * frames may be different, depending on system load and capabilities. This is a static + * function because the same delay will be applied to all animations, since they are all + * run off of a single timing loop. + * + * @return the requested time between frames, in milliseconds + */ + public static long getFrameDelay() { + return sFrameDelay; + } + + /** + * The amount of time, in milliseconds, between each frame of the animation. This is a + * requested time that the animation will attempt to honor, but the actual delay between + * frames may be different, depending on system load and capabilities. This is a static + * function because the same delay will be applied to all animations, since they are all + * run off of a single timing loop. + * + * @param frameDelay the requested time between frames, in milliseconds + */ + public static void setFrameDelay(long frameDelay) { + sFrameDelay = frameDelay; + } + + /** + * The most recent value calculated by this ValueAnimator when there is just one + * property being animated. This value is only sensible while the animation is running. The main + * purpose for this read-only property is to retrieve the value from the ValueAnimator + * during a call to {@link AnimatorUpdateListener#onAnimationUpdate(ValueAnimator)}, which + * is called during each animation frame, immediately after the value is calculated. + * + * @return animatedValue The value most recently calculated by this ValueAnimator for + * the single property being animated. If there are several properties being animated + * (specified by several PropertyValuesHolder objects in the constructor), this function + * returns the animated value for the first of those objects. + */ + public Object getAnimatedValue() { + if (mValues != null && mValues.length > 0) { + return mValues[0].getAnimatedValue(); + } + // Shouldn't get here; should always have values unless ValueAnimator was set up wrong + return null; + } + + /** + * The most recent value calculated by this ValueAnimator for propertyName. + * The main purpose for this read-only property is to retrieve the value from the + * ValueAnimator during a call to + * {@link AnimatorUpdateListener#onAnimationUpdate(ValueAnimator)}, which + * is called during each animation frame, immediately after the value is calculated. + * + * @return animatedValue The value most recently calculated for the named property + * by this ValueAnimator. + */ + public Object getAnimatedValue(String propertyName) { + PropertyValuesHolder valuesHolder = mValuesMap.get(propertyName); + if (valuesHolder != null) { + return valuesHolder.getAnimatedValue(); + } else { + // At least avoid crashing if called with bogus propertyName + return null; + } + } + + /** + * Sets how many times the animation should be repeated. If the repeat + * count is 0, the animation is never repeated. If the repeat count is + * greater than 0 or {@link #INFINITE}, the repeat mode will be taken + * into account. The repeat count is 0 by default. + * + * @param value the number of times the animation should be repeated + */ + public void setRepeatCount(int value) { + mRepeatCount = value; + } + /** + * Defines how many times the animation should repeat. The default value + * is 0. + * + * @return the number of times the animation should repeat, or {@link #INFINITE} + */ + public int getRepeatCount() { + return mRepeatCount; + } + + /** + * Defines what this animation should do when it reaches the end. This + * setting is applied only when the repeat count is either greater than + * 0 or {@link #INFINITE}. Defaults to {@link #RESTART}. + * + * @param value {@link #RESTART} or {@link #REVERSE} + */ + public void setRepeatMode(int value) { + mRepeatMode = value; + } + + /** + * Defines what this animation should do when it reaches the end. + * + * @return either one of {@link #REVERSE} or {@link #RESTART} + */ + public int getRepeatMode() { + return mRepeatMode; + } + + /** + * Adds a listener to the set of listeners that are sent update events through the life of + * an animation. This method is called on all listeners for every frame of the animation, + * after the values for the animation have been calculated. + * + * @param listener the listener to be added to the current set of listeners for this animation. + */ + public void addUpdateListener(AnimatorUpdateListener listener) { + if (mUpdateListeners == null) { + mUpdateListeners = new ArrayList(); + } + mUpdateListeners.add(listener); + } + + /** + * Removes all listeners from the set listening to frame updates for this animation. + */ + public void removeAllUpdateListeners() { + if (mUpdateListeners == null) { + return; + } + mUpdateListeners.clear(); + mUpdateListeners = null; + } + + /** + * Removes a listener from the set listening to frame updates for this animation. + * + * @param listener the listener to be removed from the current set of update listeners + * for this animation. + */ + public void removeUpdateListener(AnimatorUpdateListener listener) { + if (mUpdateListeners == null) { + return; + } + mUpdateListeners.remove(listener); + if (mUpdateListeners.size() == 0) { + mUpdateListeners = null; + } + } + + + /** + * The time interpolator used in calculating the elapsed fraction of this animation. The + * interpolator determines whether the animation runs with linear or non-linear motion, + * such as acceleration and deceleration. The default value is + * {@link android.view.animation.AccelerateDecelerateInterpolator} + * + * @param value the interpolator to be used by this animation. A value of null + * will result in linear interpolation. + */ + @Override + public void setInterpolator(/*Time*/Interpolator value) { + if (value != null) { + mInterpolator = value; + } else { + mInterpolator = new LinearInterpolator(); + } + } + + /** + * Returns the timing interpolator that this ValueAnimator uses. + * + * @return The timing interpolator for this ValueAnimator. + */ + public /*Time*/Interpolator getInterpolator() { + return mInterpolator; + } + + /** + * The type evaluator to be used when calculating the animated values of this animation. + * The system will automatically assign a float or int evaluator based on the type + * of startValue and endValue in the constructor. But if these values + * are not one of these primitive types, or if different evaluation is desired (such as is + * necessary with int values that represent colors), a custom evaluator needs to be assigned. + * For example, when running an animation on color values, the {@link ArgbEvaluator} + * should be used to get correct RGB color interpolation. + * + *

If this ValueAnimator has only one set of values being animated between, this evaluator + * will be used for that set. If there are several sets of values being animated, which is + * the case if PropertyValuesHOlder objects were set on the ValueAnimator, then the evaluator + * is assigned just to the first PropertyValuesHolder object.

+ * + * @param value the evaluator to be used this animation + */ + public void setEvaluator(TypeEvaluator value) { + if (value != null && mValues != null && mValues.length > 0) { + mValues[0].setEvaluator(value); + } + } + + /** + * Start the animation playing. This version of start() takes a boolean flag that indicates + * whether the animation should play in reverse. The flag is usually false, but may be set + * to true if called from the reverse() method. + * + *

The animation started by calling this method will be run on the thread that called + * this method. This thread should have a Looper on it (a runtime exception will be thrown if + * this is not the case). Also, if the animation will animate + * properties of objects in the view hierarchy, then the calling thread should be the UI + * thread for that view hierarchy.

+ * + * @param playBackwards Whether the ValueAnimator should start playing in reverse. + */ + private void start(boolean playBackwards) { + if (Looper.myLooper() == null) { + throw new AndroidRuntimeException("Animators may only be run on Looper threads"); + } + mPlayingBackwards = playBackwards; + mCurrentIteration = 0; + mPlayingState = STOPPED; + mStarted = true; + mStartedDelay = false; + sPendingAnimations.get().add(this); + if (mStartDelay == 0) { + // This sets the initial value of the animation, prior to actually starting it running + setCurrentPlayTime(getCurrentPlayTime()); + mPlayingState = STOPPED; + mRunning = true; + + if (mListeners != null) { + ArrayList tmpListeners = + (ArrayList) mListeners.clone(); + int numListeners = tmpListeners.size(); + for (int i = 0; i < numListeners; ++i) { + tmpListeners.get(i).onAnimationStart(this); + } + } + } + AnimationHandler animationHandler = sAnimationHandler.get(); + if (animationHandler == null) { + animationHandler = new AnimationHandler(); + sAnimationHandler.set(animationHandler); + } + animationHandler.sendEmptyMessage(ANIMATION_START); + } + + @Override + public void start() { + start(false); + } + + @Override + public void cancel() { + // Only cancel if the animation is actually running or has been started and is about + // to run + if (mPlayingState != STOPPED || sPendingAnimations.get().contains(this) || + sDelayedAnims.get().contains(this)) { + // Only notify listeners if the animator has actually started + if (mRunning && mListeners != null) { + ArrayList tmpListeners = + (ArrayList) mListeners.clone(); + for (AnimatorListener listener : tmpListeners) { + listener.onAnimationCancel(this); + } + } + endAnimation(); + } + } + + @Override + public void end() { + if (!sAnimations.get().contains(this) && !sPendingAnimations.get().contains(this)) { + // Special case if the animation has not yet started; get it ready for ending + mStartedDelay = false; + startAnimation(); + } else if (!mInitialized) { + initAnimation(); + } + // The final value set on the target varies, depending on whether the animation + // was supposed to repeat an odd number of times + if (mRepeatCount > 0 && (mRepeatCount & 0x01) == 1) { + animateValue(0f); + } else { + animateValue(1f); + } + endAnimation(); + } + + @Override + public boolean isRunning() { + return (mPlayingState == RUNNING || mRunning); + } + + @Override + public boolean isStarted() { + return mStarted; + } + + /** + * Plays the ValueAnimator in reverse. If the animation is already running, + * it will stop itself and play backwards from the point reached when reverse was called. + * If the animation is not currently running, then it will start from the end and + * play backwards. This behavior is only set for the current animation; future playing + * of the animation will use the default behavior of playing forward. + */ + public void reverse() { + mPlayingBackwards = !mPlayingBackwards; + if (mPlayingState == RUNNING) { + long currentTime = AnimationUtils.currentAnimationTimeMillis(); + long currentPlayTime = currentTime - mStartTime; + long timeLeft = mDuration - currentPlayTime; + mStartTime = currentTime - timeLeft; + } else { + start(true); + } + } + + /** + * Called internally to end an animation by removing it from the animations list. Must be + * called on the UI thread. + */ + private void endAnimation() { + sAnimations.get().remove(this); + sPendingAnimations.get().remove(this); + sDelayedAnims.get().remove(this); + mPlayingState = STOPPED; + if (mRunning && mListeners != null) { + ArrayList tmpListeners = + (ArrayList) mListeners.clone(); + int numListeners = tmpListeners.size(); + for (int i = 0; i < numListeners; ++i) { + tmpListeners.get(i).onAnimationEnd(this); + } + } + mRunning = false; + mStarted = false; + } + + /** + * Called internally to start an animation by adding it to the active animations list. Must be + * called on the UI thread. + */ + private void startAnimation() { + initAnimation(); + sAnimations.get().add(this); + if (mStartDelay > 0 && mListeners != null) { + // Listeners were already notified in start() if startDelay is 0; this is + // just for delayed animations + ArrayList tmpListeners = + (ArrayList) mListeners.clone(); + int numListeners = tmpListeners.size(); + for (int i = 0; i < numListeners; ++i) { + tmpListeners.get(i).onAnimationStart(this); + } + } + } + + /** + * Internal function called to process an animation frame on an animation that is currently + * sleeping through its startDelay phase. The return value indicates whether it + * should be woken up and put on the active animations queue. + * + * @param currentTime The current animation time, used to calculate whether the animation + * has exceeded its startDelay and should be started. + * @return True if the animation's startDelay has been exceeded and the animation + * should be added to the set of active animations. + */ + private boolean delayedAnimationFrame(long currentTime) { + if (!mStartedDelay) { + mStartedDelay = true; + mDelayStartTime = currentTime; + } else { + long deltaTime = currentTime - mDelayStartTime; + if (deltaTime > mStartDelay) { + // startDelay ended - start the anim and record the + // mStartTime appropriately + mStartTime = currentTime - (deltaTime - mStartDelay); + mPlayingState = RUNNING; + return true; + } + } + return false; + } + + /** + * This internal function processes a single animation frame for a given animation. The + * currentTime parameter is the timing pulse sent by the handler, used to calculate the + * elapsed duration, and therefore + * the elapsed fraction, of the animation. The return value indicates whether the animation + * should be ended (which happens when the elapsed time of the animation exceeds the + * animation's duration, including the repeatCount). + * + * @param currentTime The current time, as tracked by the static timing handler + * @return true if the animation's duration, including any repetitions due to + * repeatCount has been exceeded and the animation should be ended. + */ + boolean animationFrame(long currentTime) { + boolean done = false; + + if (mPlayingState == STOPPED) { + mPlayingState = RUNNING; + if (mSeekTime < 0) { + mStartTime = currentTime; + } else { + mStartTime = currentTime - mSeekTime; + // Now that we're playing, reset the seek time + mSeekTime = -1; + } + } + switch (mPlayingState) { + case RUNNING: + case SEEKED: + float fraction = mDuration > 0 ? (float)(currentTime - mStartTime) / mDuration : 1f; + if (fraction >= 1f) { + if (mCurrentIteration < mRepeatCount || mRepeatCount == INFINITE) { + // Time to repeat + if (mListeners != null) { + int numListeners = mListeners.size(); + for (int i = 0; i < numListeners; ++i) { + mListeners.get(i).onAnimationRepeat(this); + } + } + if (mRepeatMode == REVERSE) { + mPlayingBackwards = mPlayingBackwards ? false : true; + } + mCurrentIteration += (int)fraction; + fraction = fraction % 1f; + mStartTime += mDuration; + } else { + done = true; + fraction = Math.min(fraction, 1.0f); + } + } + if (mPlayingBackwards) { + fraction = 1f - fraction; + } + animateValue(fraction); + break; + } + + return done; + } + + /** + * Returns the current animation fraction, which is the elapsed/interpolated fraction used in + * the most recent frame update on the animation. + * + * @return Elapsed/interpolated fraction of the animation. + */ + public float getAnimatedFraction() { + return mCurrentFraction; + } + + /** + * This method is called with the elapsed fraction of the animation during every + * animation frame. This function turns the elapsed fraction into an interpolated fraction + * and then into an animated value (from the evaluator. The function is called mostly during + * animation updates, but it is also called when the end() + * function is called, to set the final value on the property. + * + *

Overrides of this method must call the superclass to perform the calculation + * of the animated value.

+ * + * @param fraction The elapsed fraction of the animation. + */ + void animateValue(float fraction) { + fraction = mInterpolator.getInterpolation(fraction); + mCurrentFraction = fraction; + int numValues = mValues.length; + for (int i = 0; i < numValues; ++i) { + mValues[i].calculateValue(fraction); + } + if (mUpdateListeners != null) { + int numListeners = mUpdateListeners.size(); + for (int i = 0; i < numListeners; ++i) { + mUpdateListeners.get(i).onAnimationUpdate(this); + } + } + } + + @Override + public ValueAnimator clone() { + final ValueAnimator anim = (ValueAnimator) super.clone(); + if (mUpdateListeners != null) { + ArrayList oldListeners = mUpdateListeners; + anim.mUpdateListeners = new ArrayList(); + int numListeners = oldListeners.size(); + for (int i = 0; i < numListeners; ++i) { + anim.mUpdateListeners.add(oldListeners.get(i)); + } + } + anim.mSeekTime = -1; + anim.mPlayingBackwards = false; + anim.mCurrentIteration = 0; + anim.mInitialized = false; + anim.mPlayingState = STOPPED; + anim.mStartedDelay = false; + PropertyValuesHolder[] oldValues = mValues; + if (oldValues != null) { + int numValues = oldValues.length; + anim.mValues = new PropertyValuesHolder[numValues]; + anim.mValuesMap = new HashMap(numValues); + for (int i = 0; i < numValues; ++i) { + PropertyValuesHolder newValuesHolder = oldValues[i].clone(); + anim.mValues[i] = newValuesHolder; + anim.mValuesMap.put(newValuesHolder.getPropertyName(), newValuesHolder); + } + } + return anim; + } + + /** + * Implementors of this interface can add themselves as update listeners + * to an ValueAnimator instance to receive callbacks on every animation + * frame, after the current frame's values have been calculated for that + * ValueAnimator. + */ + public static interface AnimatorUpdateListener { + /** + *

Notifies the occurrence of another frame of the animation.

+ * + * @param animation The animation which was repeated. + */ + void onAnimationUpdate(ValueAnimator animation); + + } + + /** + * Return the number of animations currently running. + * + * Used by StrictMode internally to annotate violations. Only + * called on the main thread. + * + * @hide + */ + public static int getCurrentAnimationsCount() { + return sAnimations.get().size(); + } + + /** + * Clear all animations on this thread, without canceling or ending them. + * This should be used with caution. + * + * @hide + */ + public static void clearAllAnimations() { + sAnimations.get().clear(); + sPendingAnimations.get().clear(); + sDelayedAnims.get().clear(); + } + + @Override + public String toString() { + String returnVal = "ValueAnimator@" + Integer.toHexString(hashCode()); + if (mValues != null) { + for (int i = 0; i < mValues.length; ++i) { + returnVal += "\n " + mValues[i].toString(); + } + } + return returnVal; + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java new file mode 100644 index 0000000000..7b830b9c05 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/NineViewGroup.java @@ -0,0 +1,79 @@ +package com.actionbarsherlock.internal.nineoldandroids.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.ViewGroup; + +import com.actionbarsherlock.internal.nineoldandroids.view.animation.AnimatorProxy; + +public abstract class NineViewGroup extends ViewGroup { + private final AnimatorProxy mProxy; + + public NineViewGroup(Context context) { + super(context); + mProxy = AnimatorProxy.NEEDS_PROXY ? AnimatorProxy.wrap(this) : null; + } + public NineViewGroup(Context context, AttributeSet attrs) { + super(context, attrs); + mProxy = AnimatorProxy.NEEDS_PROXY ? AnimatorProxy.wrap(this) : null; + } + public NineViewGroup(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mProxy = AnimatorProxy.NEEDS_PROXY ? AnimatorProxy.wrap(this) : null; + } + + @Override + public void setVisibility(int visibility) { + if (mProxy != null) { + if (visibility == GONE) { + clearAnimation(); + } else if (visibility == VISIBLE) { + setAnimation(mProxy); + } + } + super.setVisibility(visibility); + } + + public float getAlpha() { + if (AnimatorProxy.NEEDS_PROXY) { + return mProxy.getAlpha(); + } else { + return super.getAlpha(); + } + } + public void setAlpha(float alpha) { + if (AnimatorProxy.NEEDS_PROXY) { + mProxy.setAlpha(alpha); + } else { + super.setAlpha(alpha); + } + } + public float getTranslationX() { + if (AnimatorProxy.NEEDS_PROXY) { + return mProxy.getTranslationX(); + } else { + return super.getTranslationX(); + } + } + public void setTranslationX(float translationX) { + if (AnimatorProxy.NEEDS_PROXY) { + mProxy.setTranslationX(translationX); + } else { + super.setTranslationX(translationX); + } + } + public float getTranslationY() { + if (AnimatorProxy.NEEDS_PROXY) { + return mProxy.getTranslationY(); + } else { + return super.getTranslationY(); + } + } + public void setTranslationY(float translationY) { + if (AnimatorProxy.NEEDS_PROXY) { + mProxy.setTranslationY(translationY); + } else { + super.setTranslationY(translationY); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java new file mode 100644 index 0000000000..067d0494ee --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/view/animation/AnimatorProxy.java @@ -0,0 +1,212 @@ +package com.actionbarsherlock.internal.nineoldandroids.view.animation; + +import java.lang.ref.WeakReference; +import java.util.WeakHashMap; +import android.graphics.Matrix; +import android.graphics.RectF; +import android.os.Build; +import android.util.FloatMath; +import android.view.View; +import android.view.animation.Animation; +import android.view.animation.Transformation; + +public final class AnimatorProxy extends Animation { + public static final boolean NEEDS_PROXY = Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB; + + private static final WeakHashMap PROXIES = + new WeakHashMap(); + + public static AnimatorProxy wrap(View view) { + AnimatorProxy proxy = PROXIES.get(view); + if (proxy == null) { + proxy = new AnimatorProxy(view); + PROXIES.put(view, proxy); + } + return proxy; + } + + private final WeakReference mView; + + private float mAlpha = 1; + private float mScaleX = 1; + private float mScaleY = 1; + private float mTranslationX; + private float mTranslationY; + + private final RectF mBefore = new RectF(); + private final RectF mAfter = new RectF(); + private final Matrix mTempMatrix = new Matrix(); + + private AnimatorProxy(View view) { + setDuration(0); //perform transformation immediately + setFillAfter(true); //persist transformation beyond duration + view.setAnimation(this); + mView = new WeakReference(view); + } + + public float getAlpha() { + return mAlpha; + } + public void setAlpha(float alpha) { + if (mAlpha != alpha) { + mAlpha = alpha; + View view = mView.get(); + if (view != null) { + view.invalidate(); + } + } + } + public float getScaleX() { + return mScaleX; + } + public void setScaleX(float scaleX) { + if (mScaleX != scaleX) { + prepareForUpdate(); + mScaleX = scaleX; + invalidateAfterUpdate(); + } + } + public float getScaleY() { + return mScaleY; + } + public void setScaleY(float scaleY) { + if (mScaleY != scaleY) { + prepareForUpdate(); + mScaleY = scaleY; + invalidateAfterUpdate(); + } + } + public int getScrollX() { + View view = mView.get(); + if (view == null) { + return 0; + } + return view.getScrollX(); + } + public void setScrollX(int value) { + View view = mView.get(); + if (view != null) { + view.scrollTo(value, view.getScrollY()); + } + } + public int getScrollY() { + View view = mView.get(); + if (view == null) { + return 0; + } + return view.getScrollY(); + } + public void setScrollY(int value) { + View view = mView.get(); + if (view != null) { + view.scrollTo(view.getScrollY(), value); + } + } + + public float getTranslationX() { + return mTranslationX; + } + public void setTranslationX(float translationX) { + if (mTranslationX != translationX) { + prepareForUpdate(); + mTranslationX = translationX; + invalidateAfterUpdate(); + } + } + public float getTranslationY() { + return mTranslationY; + } + public void setTranslationY(float translationY) { + if (mTranslationY != translationY) { + prepareForUpdate(); + mTranslationY = translationY; + invalidateAfterUpdate(); + } + } + + private void prepareForUpdate() { + View view = mView.get(); + if (view != null) { + computeRect(mBefore, view); + } + } + private void invalidateAfterUpdate() { + View view = mView.get(); + if (view == null) { + return; + } + View parent = (View)view.getParent(); + if (parent == null) { + return; + } + + view.setAnimation(this); + + final RectF after = mAfter; + computeRect(after, view); + after.union(mBefore); + + parent.invalidate( + (int) FloatMath.floor(after.left), + (int) FloatMath.floor(after.top), + (int) FloatMath.ceil(after.right), + (int) FloatMath.ceil(after.bottom)); + } + + private void computeRect(final RectF r, View view) { + // compute current rectangle according to matrix transformation + final float w = view.getWidth(); + final float h = view.getHeight(); + + // use a rectangle at 0,0 to make sure we don't run into issues with scaling + r.set(0, 0, w, h); + + final Matrix m = mTempMatrix; + m.reset(); + transformMatrix(m, view); + mTempMatrix.mapRect(r); + + r.offset(view.getLeft(), view.getTop()); + + // Straighten coords if rotations flipped them + if (r.right < r.left) { + final float f = r.right; + r.right = r.left; + r.left = f; + } + if (r.bottom < r.top) { + final float f = r.top; + r.top = r.bottom; + r.bottom = f; + } + } + + private void transformMatrix(Matrix m, View view) { + final float w = view.getWidth(); + final float h = view.getHeight(); + + final float sX = mScaleX; + final float sY = mScaleY; + if ((sX != 1.0f) || (sY != 1.0f)) { + final float deltaSX = ((sX * w) - w) / 2f; + final float deltaSY = ((sY * h) - h) / 2f; + m.postScale(sX, sY); + m.postTranslate(-deltaSX, -deltaSY); + } + m.postTranslate(mTranslationX, mTranslationY); + } + + @Override + protected void applyTransformation(float interpolatedTime, Transformation t) { + View view = mView.get(); + if (view != null) { + t.setAlpha(mAlpha); + transformMatrix(t.getMatrix(), view); + } + } + + @Override + public void reset() { + /* Do nothing. */ + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java new file mode 100644 index 0000000000..953e3e8444 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineFrameLayout.java @@ -0,0 +1,57 @@ +package com.actionbarsherlock.internal.nineoldandroids.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +import com.actionbarsherlock.internal.nineoldandroids.view.animation.AnimatorProxy; + +public class NineFrameLayout extends FrameLayout { + private final AnimatorProxy mProxy; + + public NineFrameLayout(Context context, AttributeSet attrs) { + super(context, attrs); + mProxy = AnimatorProxy.NEEDS_PROXY ? AnimatorProxy.wrap(this) : null; + } + + @Override + public void setVisibility(int visibility) { + if (mProxy != null) { + if (visibility == GONE) { + clearAnimation(); + } else if (visibility == VISIBLE) { + setAnimation(mProxy); + } + } + super.setVisibility(visibility); + } + + public float getAlpha() { + if (AnimatorProxy.NEEDS_PROXY) { + return mProxy.getAlpha(); + } else { + return super.getAlpha(); + } + } + public void setAlpha(float alpha) { + if (AnimatorProxy.NEEDS_PROXY) { + mProxy.setAlpha(alpha); + } else { + super.setAlpha(alpha); + } + } + public float getTranslationY() { + if (AnimatorProxy.NEEDS_PROXY) { + return mProxy.getTranslationY(); + } else { + return super.getTranslationY(); + } + } + public void setTranslationY(float translationY) { + if (AnimatorProxy.NEEDS_PROXY) { + mProxy.setTranslationY(translationY); + } else { + super.setTranslationY(translationY); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java new file mode 100644 index 0000000000..129b5aaaa6 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineHorizontalScrollView.java @@ -0,0 +1,41 @@ +package com.actionbarsherlock.internal.nineoldandroids.widget; + +import android.content.Context; +import android.widget.HorizontalScrollView; +import com.actionbarsherlock.internal.nineoldandroids.view.animation.AnimatorProxy; + +public class NineHorizontalScrollView extends HorizontalScrollView { + private final AnimatorProxy mProxy; + + public NineHorizontalScrollView(Context context) { + super(context); + mProxy = AnimatorProxy.NEEDS_PROXY ? AnimatorProxy.wrap(this) : null; + } + + @Override + public void setVisibility(int visibility) { + if (mProxy != null) { + if (visibility == GONE) { + clearAnimation(); + } else if (visibility == VISIBLE) { + setAnimation(mProxy); + } + } + super.setVisibility(visibility); + } + + public float getAlpha() { + if (AnimatorProxy.NEEDS_PROXY) { + return mProxy.getAlpha(); + } else { + return super.getAlpha(); + } + } + public void setAlpha(float alpha) { + if (AnimatorProxy.NEEDS_PROXY) { + mProxy.setAlpha(alpha); + } else { + super.setAlpha(alpha); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java new file mode 100644 index 0000000000..1f381013a7 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/nineoldandroids/widget/NineLinearLayout.java @@ -0,0 +1,57 @@ +package com.actionbarsherlock.internal.nineoldandroids.widget; + +import android.content.Context; +import android.util.AttributeSet; +import android.widget.LinearLayout; + +import com.actionbarsherlock.internal.nineoldandroids.view.animation.AnimatorProxy; + +public class NineLinearLayout extends LinearLayout { + private final AnimatorProxy mProxy; + + public NineLinearLayout(Context context, AttributeSet attrs) { + super(context, attrs); + mProxy = AnimatorProxy.NEEDS_PROXY ? AnimatorProxy.wrap(this) : null; + } + + @Override + public void setVisibility(int visibility) { + if (mProxy != null) { + if (visibility == GONE) { + clearAnimation(); + } else if (visibility == VISIBLE) { + setAnimation(mProxy); + } + } + super.setVisibility(visibility); + } + + public float getAlpha() { + if (AnimatorProxy.NEEDS_PROXY) { + return mProxy.getAlpha(); + } else { + return super.getAlpha(); + } + } + public void setAlpha(float alpha) { + if (AnimatorProxy.NEEDS_PROXY) { + mProxy.setAlpha(alpha); + } else { + super.setAlpha(alpha); + } + } + public float getTranslationX() { + if (AnimatorProxy.NEEDS_PROXY) { + return mProxy.getTranslationX(); + } else { + return super.getTranslationX(); + } + } + public void setTranslationX(float translationX) { + if (AnimatorProxy.NEEDS_PROXY) { + mProxy.setTranslationX(translationX); + } else { + super.setTranslationX(translationX); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/ActionProviderWrapper.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/ActionProviderWrapper.java new file mode 100644 index 0000000000..b136d50f07 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/ActionProviderWrapper.java @@ -0,0 +1,40 @@ +package com.actionbarsherlock.internal.view; + +import com.actionbarsherlock.internal.view.menu.SubMenuWrapper; +import com.actionbarsherlock.view.ActionProvider; +import android.view.View; + +public class ActionProviderWrapper extends android.view.ActionProvider { + private final ActionProvider mProvider; + + + public ActionProviderWrapper(ActionProvider provider) { + super(null/*TODO*/); //XXX this *should* be unused + mProvider = provider; + } + + + public ActionProvider unwrap() { + return mProvider; + } + + @Override + public View onCreateActionView() { + return mProvider.onCreateActionView(); + } + + @Override + public boolean hasSubMenu() { + return mProvider.hasSubMenu(); + } + + @Override + public boolean onPerformDefaultAction() { + return mProvider.onPerformDefaultAction(); + } + + @Override + public void onPrepareSubMenu(android.view.SubMenu subMenu) { + mProvider.onPrepareSubMenu(new SubMenuWrapper(subMenu)); + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/StandaloneActionMode.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/StandaloneActionMode.java new file mode 100644 index 0000000000..0a87bd3f79 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/StandaloneActionMode.java @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.actionbarsherlock.internal.view; + +import android.content.Context; +import android.view.View; +import android.view.accessibility.AccessibilityEvent; + +import java.lang.ref.WeakReference; + +import com.actionbarsherlock.internal.view.menu.MenuBuilder; +import com.actionbarsherlock.internal.view.menu.MenuPopupHelper; +import com.actionbarsherlock.internal.view.menu.SubMenuBuilder; +import com.actionbarsherlock.internal.widget.ActionBarContextView; +import com.actionbarsherlock.view.ActionMode; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuInflater; +import com.actionbarsherlock.view.MenuItem; + +public class StandaloneActionMode extends ActionMode implements MenuBuilder.Callback { + private Context mContext; + private ActionBarContextView mContextView; + private ActionMode.Callback mCallback; + private WeakReference mCustomView; + private boolean mFinished; + private boolean mFocusable; + + private MenuBuilder mMenu; + + public StandaloneActionMode(Context context, ActionBarContextView view, + ActionMode.Callback callback, boolean isFocusable) { + mContext = context; + mContextView = view; + mCallback = callback; + + mMenu = new MenuBuilder(context).setDefaultShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); + mMenu.setCallback(this); + mFocusable = isFocusable; + } + + @Override + public void setTitle(CharSequence title) { + mContextView.setTitle(title); + } + + @Override + public void setSubtitle(CharSequence subtitle) { + mContextView.setSubtitle(subtitle); + } + + @Override + public void setTitle(int resId) { + setTitle(mContext.getString(resId)); + } + + @Override + public void setSubtitle(int resId) { + setSubtitle(mContext.getString(resId)); + } + + @Override + public void setCustomView(View view) { + mContextView.setCustomView(view); + mCustomView = view != null ? new WeakReference(view) : null; + } + + @Override + public void invalidate() { + mCallback.onPrepareActionMode(this, mMenu); + } + + @Override + public void finish() { + if (mFinished) { + return; + } + mFinished = true; + + mContextView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED); + mCallback.onDestroyActionMode(this); + } + + @Override + public Menu getMenu() { + return mMenu; + } + + @Override + public CharSequence getTitle() { + return mContextView.getTitle(); + } + + @Override + public CharSequence getSubtitle() { + return mContextView.getSubtitle(); + } + + @Override + public View getCustomView() { + return mCustomView != null ? mCustomView.get() : null; + } + + @Override + public MenuInflater getMenuInflater() { + return new MenuInflater(mContext); + } + + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item) { + return mCallback.onActionItemClicked(this, item); + } + + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + } + + public boolean onSubMenuSelected(SubMenuBuilder subMenu) { + if (!subMenu.hasVisibleItems()) { + return true; + } + + new MenuPopupHelper(mContext, subMenu).show(); + return true; + } + + public void onCloseSubMenu(SubMenuBuilder menu) { + } + + public void onMenuModeChange(MenuBuilder menu) { + invalidate(); + mContextView.showOverflowMenu(); + } + + public boolean isUiFocusable() { + return mFocusable; + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_HasStateListenerSupport.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_HasStateListenerSupport.java new file mode 100644 index 0000000000..7d45e81be7 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_HasStateListenerSupport.java @@ -0,0 +1,6 @@ +package com.actionbarsherlock.internal.view; + +public interface View_HasStateListenerSupport { + void addOnAttachStateChangeListener(View_OnAttachStateChangeListener listener); + void removeOnAttachStateChangeListener(View_OnAttachStateChangeListener listener); +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_OnAttachStateChangeListener.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_OnAttachStateChangeListener.java new file mode 100644 index 0000000000..3869d32907 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/View_OnAttachStateChangeListener.java @@ -0,0 +1,8 @@ +package com.actionbarsherlock.internal.view; + +import android.view.View; + +public interface View_OnAttachStateChangeListener { + void onViewAttachedToWindow(View v); + void onViewDetachedFromWindow(View v); +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java new file mode 100644 index 0000000000..0354ad1ad1 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenu.java @@ -0,0 +1,264 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.view.menu; + +import java.util.ArrayList; +import java.util.List; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.view.KeyEvent; + +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; +import com.actionbarsherlock.view.SubMenu; + +/** + * @hide + */ +public class ActionMenu implements Menu { + private Context mContext; + + private boolean mIsQwerty; + + private ArrayList mItems; + + public ActionMenu(Context context) { + mContext = context; + mItems = new ArrayList(); + } + + public Context getContext() { + return mContext; + } + + public MenuItem add(CharSequence title) { + return add(0, 0, 0, title); + } + + public MenuItem add(int titleRes) { + return add(0, 0, 0, titleRes); + } + + public MenuItem add(int groupId, int itemId, int order, int titleRes) { + return add(groupId, itemId, order, mContext.getResources().getString(titleRes)); + } + + public MenuItem add(int groupId, int itemId, int order, CharSequence title) { + ActionMenuItem item = new ActionMenuItem(getContext(), + groupId, itemId, 0, order, title); + mItems.add(order, item); + return item; + } + + public int addIntentOptions(int groupId, int itemId, int order, + ComponentName caller, Intent[] specifics, Intent intent, int flags, + MenuItem[] outSpecificItems) { + PackageManager pm = mContext.getPackageManager(); + final List lri = + pm.queryIntentActivityOptions(caller, specifics, intent, 0); + final int N = lri != null ? lri.size() : 0; + + if ((flags & FLAG_APPEND_TO_GROUP) == 0) { + removeGroup(groupId); + } + + for (int i=0; i= 0) { + outSpecificItems[ri.specificIndex] = item; + } + } + + return N; + } + + public SubMenu addSubMenu(CharSequence title) { + // TODO Implement submenus + return null; + } + + public SubMenu addSubMenu(int titleRes) { + // TODO Implement submenus + return null; + } + + public SubMenu addSubMenu(int groupId, int itemId, int order, + CharSequence title) { + // TODO Implement submenus + return null; + } + + public SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes) { + // TODO Implement submenus + return null; + } + + public void clear() { + mItems.clear(); + } + + public void close() { + } + + private int findItemIndex(int id) { + final ArrayList items = mItems; + final int itemCount = items.size(); + for (int i = 0; i < itemCount; i++) { + if (items.get(i).getItemId() == id) { + return i; + } + } + + return -1; + } + + public MenuItem findItem(int id) { + return mItems.get(findItemIndex(id)); + } + + public MenuItem getItem(int index) { + return mItems.get(index); + } + + public boolean hasVisibleItems() { + final ArrayList items = mItems; + final int itemCount = items.size(); + + for (int i = 0; i < itemCount; i++) { + if (items.get(i).isVisible()) { + return true; + } + } + + return false; + } + + private ActionMenuItem findItemWithShortcut(int keyCode, KeyEvent event) { + // TODO Make this smarter. + final boolean qwerty = mIsQwerty; + final ArrayList items = mItems; + final int itemCount = items.size(); + + for (int i = 0; i < itemCount; i++) { + ActionMenuItem item = items.get(i); + final char shortcut = qwerty ? item.getAlphabeticShortcut() : + item.getNumericShortcut(); + if (keyCode == shortcut) { + return item; + } + } + return null; + } + + public boolean isShortcutKey(int keyCode, KeyEvent event) { + return findItemWithShortcut(keyCode, event) != null; + } + + public boolean performIdentifierAction(int id, int flags) { + final int index = findItemIndex(id); + if (index < 0) { + return false; + } + + return mItems.get(index).invoke(); + } + + public boolean performShortcut(int keyCode, KeyEvent event, int flags) { + ActionMenuItem item = findItemWithShortcut(keyCode, event); + if (item == null) { + return false; + } + + return item.invoke(); + } + + public void removeGroup(int groupId) { + final ArrayList items = mItems; + int itemCount = items.size(); + int i = 0; + while (i < itemCount) { + if (items.get(i).getGroupId() == groupId) { + items.remove(i); + itemCount--; + } else { + i++; + } + } + } + + public void removeItem(int id) { + mItems.remove(findItemIndex(id)); + } + + public void setGroupCheckable(int group, boolean checkable, + boolean exclusive) { + final ArrayList items = mItems; + final int itemCount = items.size(); + + for (int i = 0; i < itemCount; i++) { + ActionMenuItem item = items.get(i); + if (item.getGroupId() == group) { + item.setCheckable(checkable); + item.setExclusiveCheckable(exclusive); + } + } + } + + public void setGroupEnabled(int group, boolean enabled) { + final ArrayList items = mItems; + final int itemCount = items.size(); + + for (int i = 0; i < itemCount; i++) { + ActionMenuItem item = items.get(i); + if (item.getGroupId() == group) { + item.setEnabled(enabled); + } + } + } + + public void setGroupVisible(int group, boolean visible) { + final ArrayList items = mItems; + final int itemCount = items.size(); + + for (int i = 0; i < itemCount; i++) { + ActionMenuItem item = items.get(i); + if (item.getGroupId() == group) { + item.setVisible(visible); + } + } + } + + public void setQwertyMode(boolean isQwerty) { + mIsQwerty = isQwerty; + } + + public int size() { + return mItems.size(); + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java new file mode 100644 index 0000000000..510b974886 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItem.java @@ -0,0 +1,278 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.view.menu; + +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.View; + +import com.actionbarsherlock.view.ActionProvider; +import com.actionbarsherlock.view.MenuItem; +import com.actionbarsherlock.view.SubMenu; + +/** + * @hide + */ +public class ActionMenuItem implements MenuItem { + private final int mId; + private final int mGroup; + //UNUSED private final int mCategoryOrder; + private final int mOrdering; + + private CharSequence mTitle; + private CharSequence mTitleCondensed; + private Intent mIntent; + private char mShortcutNumericChar; + private char mShortcutAlphabeticChar; + + private Drawable mIconDrawable; + //UNUSED private int mIconResId = NO_ICON; + + private Context mContext; + + private MenuItem.OnMenuItemClickListener mClickListener; + + //UNUSED private static final int NO_ICON = 0; + + private int mFlags = ENABLED; + private static final int CHECKABLE = 0x00000001; + private static final int CHECKED = 0x00000002; + private static final int EXCLUSIVE = 0x00000004; + private static final int HIDDEN = 0x00000008; + private static final int ENABLED = 0x00000010; + + public ActionMenuItem(Context context, int group, int id, int categoryOrder, int ordering, + CharSequence title) { + mContext = context; + mId = id; + mGroup = group; + //UNUSED mCategoryOrder = categoryOrder; + mOrdering = ordering; + mTitle = title; + } + + public char getAlphabeticShortcut() { + return mShortcutAlphabeticChar; + } + + public int getGroupId() { + return mGroup; + } + + public Drawable getIcon() { + return mIconDrawable; + } + + public Intent getIntent() { + return mIntent; + } + + public int getItemId() { + return mId; + } + + public ContextMenuInfo getMenuInfo() { + return null; + } + + public char getNumericShortcut() { + return mShortcutNumericChar; + } + + public int getOrder() { + return mOrdering; + } + + public SubMenu getSubMenu() { + return null; + } + + public CharSequence getTitle() { + return mTitle; + } + + public CharSequence getTitleCondensed() { + return mTitleCondensed; + } + + public boolean hasSubMenu() { + return false; + } + + public boolean isCheckable() { + return (mFlags & CHECKABLE) != 0; + } + + public boolean isChecked() { + return (mFlags & CHECKED) != 0; + } + + public boolean isEnabled() { + return (mFlags & ENABLED) != 0; + } + + public boolean isVisible() { + return (mFlags & HIDDEN) == 0; + } + + public MenuItem setAlphabeticShortcut(char alphaChar) { + mShortcutAlphabeticChar = alphaChar; + return this; + } + + public MenuItem setCheckable(boolean checkable) { + mFlags = (mFlags & ~CHECKABLE) | (checkable ? CHECKABLE : 0); + return this; + } + + public ActionMenuItem setExclusiveCheckable(boolean exclusive) { + mFlags = (mFlags & ~EXCLUSIVE) | (exclusive ? EXCLUSIVE : 0); + return this; + } + + public MenuItem setChecked(boolean checked) { + mFlags = (mFlags & ~CHECKED) | (checked ? CHECKED : 0); + return this; + } + + public MenuItem setEnabled(boolean enabled) { + mFlags = (mFlags & ~ENABLED) | (enabled ? ENABLED : 0); + return this; + } + + public MenuItem setIcon(Drawable icon) { + mIconDrawable = icon; + //UNUSED mIconResId = NO_ICON; + return this; + } + + public MenuItem setIcon(int iconRes) { + //UNUSED mIconResId = iconRes; + mIconDrawable = mContext.getResources().getDrawable(iconRes); + return this; + } + + public MenuItem setIntent(Intent intent) { + mIntent = intent; + return this; + } + + public MenuItem setNumericShortcut(char numericChar) { + mShortcutNumericChar = numericChar; + return this; + } + + public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) { + mClickListener = menuItemClickListener; + return this; + } + + public MenuItem setShortcut(char numericChar, char alphaChar) { + mShortcutNumericChar = numericChar; + mShortcutAlphabeticChar = alphaChar; + return this; + } + + public MenuItem setTitle(CharSequence title) { + mTitle = title; + return this; + } + + public MenuItem setTitle(int title) { + mTitle = mContext.getResources().getString(title); + return this; + } + + public MenuItem setTitleCondensed(CharSequence title) { + mTitleCondensed = title; + return this; + } + + public MenuItem setVisible(boolean visible) { + mFlags = (mFlags & HIDDEN) | (visible ? 0 : HIDDEN); + return this; + } + + public boolean invoke() { + if (mClickListener != null && mClickListener.onMenuItemClick(this)) { + return true; + } + + if (mIntent != null) { + mContext.startActivity(mIntent); + return true; + } + + return false; + } + + public void setShowAsAction(int show) { + // Do nothing. ActionMenuItems always show as action buttons. + } + + public MenuItem setActionView(View actionView) { + throw new UnsupportedOperationException(); + } + + public View getActionView() { + return null; + } + + @Override + public MenuItem setActionView(int resId) { + throw new UnsupportedOperationException(); + } + + @Override + public ActionProvider getActionProvider() { + return null; + } + + @Override + public MenuItem setActionProvider(ActionProvider actionProvider) { + throw new UnsupportedOperationException(); + } + + @Override + public MenuItem setShowAsActionFlags(int actionEnum) { + setShowAsAction(actionEnum); + return this; + } + + @Override + public boolean expandActionView() { + return false; + } + + @Override + public boolean collapseActionView() { + return false; + } + + @Override + public boolean isActionViewExpanded() { + return false; + } + + @Override + public MenuItem setOnActionExpandListener(OnActionExpandListener listener) { + // No need to save the listener; ActionMenuItem does not support collapsing items. + return this; + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java new file mode 100644 index 0000000000..dcb50f3621 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuItemView.java @@ -0,0 +1,295 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.view.menu; + +import java.util.HashSet; +import java.util.Set; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.view.accessibility.AccessibilityEvent; +import android.widget.ImageButton; +import android.widget.LinearLayout; +import android.widget.Toast; + +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 static com.actionbarsherlock.internal.ResourcesCompat.getResources_getBoolean; + +/** + * @hide + */ +public class ActionMenuItemView extends LinearLayout + implements MenuView.ItemView, View.OnClickListener, View.OnLongClickListener, + ActionMenuView.ActionMenuChildView, View_HasStateListenerSupport { + //UNUSED private static final String TAG = "ActionMenuItemView"; + + private MenuItemImpl mItemData; + private CharSequence mTitle; + private MenuBuilder.ItemInvoker mItemInvoker; + + private ImageButton mImageButton; + private CapitalizingButton mTextButton; + private boolean mAllowTextWithIcon; + private boolean mExpandedFormat; + private int mMinWidth; + + private final Set mListeners = new HashSet(); + + public ActionMenuItemView(Context context) { + this(context, null); + } + + public ActionMenuItemView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public ActionMenuItemView(Context context, AttributeSet attrs, int defStyle) { + //TODO super(context, attrs, defStyle); + super(context, attrs); + mAllowTextWithIcon = getResources_getBoolean(context, + R.bool.abs__config_allowActionMenuItemTextWithIcon); + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.SherlockActionMenuItemView, 0, 0); + mMinWidth = a.getDimensionPixelSize( + R.styleable.SherlockActionMenuItemView_android_minWidth, 0); + a.recycle(); + } + + @Override + public void addOnAttachStateChangeListener(View_OnAttachStateChangeListener listener) { + mListeners.add(listener); + } + + @Override + public void removeOnAttachStateChangeListener(View_OnAttachStateChangeListener listener) { + mListeners.remove(listener); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + for (View_OnAttachStateChangeListener listener : mListeners) { + listener.onViewAttachedToWindow(this); + } + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + for (View_OnAttachStateChangeListener listener : mListeners) { + listener.onViewDetachedFromWindow(this); + } + } + + @Override + public void onFinishInflate() { + + mImageButton = (ImageButton) findViewById(R.id.abs__imageButton); + mTextButton = (CapitalizingButton) findViewById(R.id.abs__textButton); + mImageButton.setOnClickListener(this); + mTextButton.setOnClickListener(this); + mImageButton.setOnLongClickListener(this); + setOnClickListener(this); + setOnLongClickListener(this); + } + + public MenuItemImpl getItemData() { + return mItemData; + } + + public void initialize(MenuItemImpl itemData, int menuType) { + mItemData = itemData; + + setIcon(itemData.getIcon()); + setTitle(itemData.getTitleForItemView(this)); // Title only takes effect if there is no icon + setId(itemData.getItemId()); + + setVisibility(itemData.isVisible() ? View.VISIBLE : View.GONE); + setEnabled(itemData.isEnabled()); + } + + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + mImageButton.setEnabled(enabled); + mTextButton.setEnabled(enabled); + } + + public void onClick(View v) { + if (mItemInvoker != null) { + mItemInvoker.invokeItem(mItemData); + } + } + + public void setItemInvoker(MenuBuilder.ItemInvoker invoker) { + mItemInvoker = invoker; + } + + public boolean prefersCondensedTitle() { + return true; + } + + public void setCheckable(boolean checkable) { + // TODO Support checkable action items + } + + public void setChecked(boolean checked) { + // TODO Support checkable action items + } + + public void setExpandedFormat(boolean expandedFormat) { + if (mExpandedFormat != expandedFormat) { + mExpandedFormat = expandedFormat; + if (mItemData != null) { + mItemData.actionFormatChanged(); + } + } + } + + private void updateTextButtonVisibility() { + boolean visible = !TextUtils.isEmpty(mTextButton.getText()); + visible &= mImageButton.getDrawable() == null || + (mItemData.showsTextAsAction() && (mAllowTextWithIcon || mExpandedFormat)); + + mTextButton.setVisibility(visible ? VISIBLE : GONE); + } + + public void setIcon(Drawable icon) { + mImageButton.setImageDrawable(icon); + if (icon != null) { + mImageButton.setVisibility(VISIBLE); + } else { + mImageButton.setVisibility(GONE); + } + + updateTextButtonVisibility(); + } + + public boolean hasText() { + return mTextButton.getVisibility() != GONE; + } + + public void setShortcut(boolean showShortcut, char shortcutKey) { + // Action buttons don't show text for shortcut keys. + } + + public void setTitle(CharSequence title) { + mTitle = title; + + mTextButton.setTextCompat(mTitle); + + setContentDescription(mTitle); + updateTextButtonVisibility(); + } + + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + onPopulateAccessibilityEvent(event); + return true; + } + + @Override + public void onPopulateAccessibilityEvent(AccessibilityEvent event) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + super.onPopulateAccessibilityEvent(event); + } + final CharSequence cdesc = getContentDescription(); + if (!TextUtils.isEmpty(cdesc)) { + event.getText().add(cdesc); + } + } + + @Override + public boolean dispatchHoverEvent(MotionEvent event) { + // Don't allow children to hover; we want this to be treated as a single component. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + return onHoverEvent(event); + } + return false; + } + + public boolean showsIcon() { + return true; + } + + public boolean needsDividerBefore() { + return hasText() && mItemData.getIcon() == null; + } + + public boolean needsDividerAfter() { + return hasText(); + } + + @Override + public boolean onLongClick(View v) { + if (hasText()) { + // Don't show the cheat sheet for items that already show text. + return false; + } + + final int[] screenPos = new int[2]; + final Rect displayFrame = new Rect(); + getLocationOnScreen(screenPos); + getWindowVisibleDisplayFrame(displayFrame); + + final Context context = getContext(); + final int width = getWidth(); + final int height = getHeight(); + final int midy = screenPos[1] + height / 2; + final int screenWidth = context.getResources().getDisplayMetrics().widthPixels; + + Toast cheatSheet = Toast.makeText(context, mItemData.getTitle(), Toast.LENGTH_SHORT); + if (midy < displayFrame.height()) { + // Show along the top; follow action buttons + cheatSheet.setGravity(Gravity.TOP | Gravity.RIGHT, + screenWidth - screenPos[0] - width / 2, height); + } else { + // Show along the bottom center + cheatSheet.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, height); + } + cheatSheet.show(); + return true; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + final int widthMode = MeasureSpec.getMode(widthMeasureSpec); + final int specSize = MeasureSpec.getSize(widthMeasureSpec); + final int oldMeasuredWidth = getMeasuredWidth(); + final int targetWidth = widthMode == MeasureSpec.AT_MOST ? Math.min(specSize, mMinWidth) + : mMinWidth; + + if (widthMode != MeasureSpec.EXACTLY && mMinWidth > 0 && oldMeasuredWidth < targetWidth) { + // Remeasure at exactly the minimum width. + super.onMeasure(MeasureSpec.makeMeasureSpec(targetWidth, MeasureSpec.EXACTLY), + heightMeasureSpec); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java new file mode 100644 index 0000000000..876a22c589 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuPresenter.java @@ -0,0 +1,714 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.view.menu; + +import static com.actionbarsherlock.internal.ResourcesCompat.getResources_getInteger; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.Build; +import android.os.Parcel; +import android.os.Parcelable; +import android.util.SparseBooleanArray; +import android.view.SoundEffectConstants; +import android.view.View; +import android.view.View.MeasureSpec; +import android.view.ViewConfiguration; +import android.view.ViewGroup; +import android.widget.ImageButton; +import com.actionbarsherlock.R; +import com.actionbarsherlock.internal.view.View_HasStateListenerSupport; +import com.actionbarsherlock.internal.view.View_OnAttachStateChangeListener; +import com.actionbarsherlock.internal.view.menu.ActionMenuView.ActionMenuChildView; +import com.actionbarsherlock.view.ActionProvider; +import com.actionbarsherlock.view.MenuItem; + +/** + * MenuPresenter for building action menus as seen in the action bar and action modes. + */ +public class ActionMenuPresenter extends BaseMenuPresenter + implements ActionProvider.SubUiVisibilityListener { + //UNUSED private static final String TAG = "ActionMenuPresenter"; + + private View mOverflowButton; + private boolean mReserveOverflow; + private boolean mReserveOverflowSet; + private int mWidthLimit; + private int mActionItemWidthLimit; + private int mMaxItems; + private boolean mMaxItemsSet; + private boolean mStrictWidthLimit; + private boolean mWidthLimitSet; + private boolean mExpandedActionViewsExclusive; + + private int mMinCellSize; + + // Group IDs that have been added as actions - used temporarily, allocated here for reuse. + private final SparseBooleanArray mActionButtonGroups = new SparseBooleanArray(); + + private View mScrapActionButtonView; + + private OverflowPopup mOverflowPopup; + private ActionButtonSubmenu mActionButtonPopup; + + private OpenOverflowRunnable mPostedOpenRunnable; + + final PopupPresenterCallback mPopupPresenterCallback = new PopupPresenterCallback(); + int mOpenSubMenuId; + + public ActionMenuPresenter(Context context) { + super(context, R.layout.abs__action_menu_layout, + R.layout.abs__action_menu_item_layout); + } + + @Override + public void initForMenu(Context context, MenuBuilder menu) { + super.initForMenu(context, menu); + + final Resources res = context.getResources(); + + if (!mReserveOverflowSet) { + mReserveOverflow = reserveOverflow(mContext); + } + + if (!mWidthLimitSet) { + mWidthLimit = res.getDisplayMetrics().widthPixels / 2; + } + + // Measure for initial configuration + if (!mMaxItemsSet) { + mMaxItems = getResources_getInteger(context, R.integer.abs__max_action_buttons); + } + + int width = mWidthLimit; + if (mReserveOverflow) { + if (mOverflowButton == null) { + mOverflowButton = new OverflowMenuButton(mSystemContext); + final int spec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + mOverflowButton.measure(spec, spec); + } + width -= mOverflowButton.getMeasuredWidth(); + } else { + mOverflowButton = null; + } + + mActionItemWidthLimit = width; + + mMinCellSize = (int) (ActionMenuView.MIN_CELL_SIZE * res.getDisplayMetrics().density); + + // Drop a scrap view as it may no longer reflect the proper context/config. + mScrapActionButtonView = null; + } + + public static boolean reserveOverflow(Context context) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + return (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB); + } else { + return !HasPermanentMenuKey.get(context); + } + } + + private static class HasPermanentMenuKey { + public static boolean get(Context context) { + return ViewConfiguration.get(context).hasPermanentMenuKey(); + } + } + + public void onConfigurationChanged(Configuration newConfig) { + if (!mMaxItemsSet) { + mMaxItems = getResources_getInteger(mContext, + R.integer.abs__max_action_buttons); + if (mMenu != null) { + mMenu.onItemsChanged(true); + } + } + } + + public void setWidthLimit(int width, boolean strict) { + mWidthLimit = width; + mStrictWidthLimit = strict; + mWidthLimitSet = true; + } + + public void setReserveOverflow(boolean reserveOverflow) { + mReserveOverflow = reserveOverflow; + mReserveOverflowSet = true; + } + + public void setItemLimit(int itemCount) { + mMaxItems = itemCount; + mMaxItemsSet = true; + } + + public void setExpandedActionViewsExclusive(boolean isExclusive) { + mExpandedActionViewsExclusive = isExclusive; + } + + @Override + public MenuView getMenuView(ViewGroup root) { + MenuView result = super.getMenuView(root); + ((ActionMenuView) result).setPresenter(this); + return result; + } + + @Override + public View getItemView(MenuItemImpl item, View convertView, ViewGroup parent) { + View actionView = item.getActionView(); + if (actionView == null || item.hasCollapsibleActionView()) { + if (!(convertView instanceof ActionMenuItemView)) { + convertView = null; + } + actionView = super.getItemView(item, convertView, parent); + } + actionView.setVisibility(item.isActionViewExpanded() ? View.GONE : View.VISIBLE); + + final ActionMenuView menuParent = (ActionMenuView) parent; + final ViewGroup.LayoutParams lp = actionView.getLayoutParams(); + if (!menuParent.checkLayoutParams(lp)) { + actionView.setLayoutParams(menuParent.generateLayoutParams(lp)); + } + return actionView; + } + + @Override + public void bindItemView(MenuItemImpl item, MenuView.ItemView itemView) { + itemView.initialize(item, 0); + + final ActionMenuView menuView = (ActionMenuView) mMenuView; + ActionMenuItemView actionItemView = (ActionMenuItemView) itemView; + actionItemView.setItemInvoker(menuView); + } + + @Override + public boolean shouldIncludeItem(int childIndex, MenuItemImpl item) { + return item.isActionButton(); + } + + @Override + public void updateMenuView(boolean cleared) { + super.updateMenuView(cleared); + + if (mMenu != null) { + final ArrayList actionItems = mMenu.getActionItems(); + final int count = actionItems.size(); + for (int i = 0; i < count; i++) { + final ActionProvider provider = actionItems.get(i).getActionProvider(); + if (provider != null) { + provider.setSubUiVisibilityListener(this); + } + } + } + + final ArrayList nonActionItems = mMenu != null ? + mMenu.getNonActionItems() : null; + + boolean hasOverflow = false; + if (mReserveOverflow && nonActionItems != null) { + final int count = nonActionItems.size(); + if (count == 1) { + hasOverflow = !nonActionItems.get(0).isActionViewExpanded(); + } else { + hasOverflow = count > 0; + } + } + + if (hasOverflow) { + if (mOverflowButton == null) { + mOverflowButton = new OverflowMenuButton(mSystemContext); + } + ViewGroup parent = (ViewGroup) mOverflowButton.getParent(); + if (parent != mMenuView) { + if (parent != null) { + parent.removeView(mOverflowButton); + } + ActionMenuView menuView = (ActionMenuView) mMenuView; + menuView.addView(mOverflowButton, menuView.generateOverflowButtonLayoutParams()); + } + } else if (mOverflowButton != null && mOverflowButton.getParent() == mMenuView) { + ((ViewGroup) mMenuView).removeView(mOverflowButton); + } + + ((ActionMenuView) mMenuView).setOverflowReserved(mReserveOverflow); + } + + @Override + public boolean filterLeftoverView(ViewGroup parent, int childIndex) { + if (parent.getChildAt(childIndex) == mOverflowButton) return false; + return super.filterLeftoverView(parent, childIndex); + } + + public boolean onSubMenuSelected(SubMenuBuilder subMenu) { + if (!subMenu.hasVisibleItems()) return false; + + SubMenuBuilder topSubMenu = subMenu; + while (topSubMenu.getParentMenu() != mMenu) { + topSubMenu = (SubMenuBuilder) topSubMenu.getParentMenu(); + } + View anchor = findViewForItem(topSubMenu.getItem()); + if (anchor == null) { + if (mOverflowButton == null) return false; + anchor = mOverflowButton; + } + + mOpenSubMenuId = subMenu.getItem().getItemId(); + mActionButtonPopup = new ActionButtonSubmenu(mContext, subMenu); + mActionButtonPopup.setAnchorView(anchor); + mActionButtonPopup.show(); + super.onSubMenuSelected(subMenu); + return true; + } + + private View findViewForItem(MenuItem item) { + final ViewGroup parent = (ViewGroup) mMenuView; + if (parent == null) return null; + + final int count = parent.getChildCount(); + for (int i = 0; i < count; i++) { + final View child = parent.getChildAt(i); + if (child instanceof MenuView.ItemView && + ((MenuView.ItemView) child).getItemData() == item) { + return child; + } + } + return null; + } + + /** + * Display the overflow menu if one is present. + * @return true if the overflow menu was shown, false otherwise. + */ + public boolean showOverflowMenu() { + if (mReserveOverflow && !isOverflowMenuShowing() && mMenu != null && mMenuView != null && + mPostedOpenRunnable == null && !mMenu.getNonActionItems().isEmpty()) { + OverflowPopup popup = new OverflowPopup(mContext, mMenu, mOverflowButton, true); + mPostedOpenRunnable = new OpenOverflowRunnable(popup); + // Post this for later; we might still need a layout for the anchor to be right. + ((View) mMenuView).post(mPostedOpenRunnable); + + // ActionMenuPresenter uses null as a callback argument here + // to indicate overflow is opening. + super.onSubMenuSelected(null); + + return true; + } + return false; + } + + /** + * Hide the overflow menu if it is currently showing. + * + * @return true if the overflow menu was hidden, false otherwise. + */ + public boolean hideOverflowMenu() { + if (mPostedOpenRunnable != null && mMenuView != null) { + ((View) mMenuView).removeCallbacks(mPostedOpenRunnable); + mPostedOpenRunnable = null; + return true; + } + + MenuPopupHelper popup = mOverflowPopup; + if (popup != null) { + popup.dismiss(); + return true; + } + return false; + } + + /** + * Dismiss all popup menus - overflow and submenus. + * @return true if popups were dismissed, false otherwise. (This can be because none were open.) + */ + public boolean dismissPopupMenus() { + boolean result = hideOverflowMenu(); + result |= hideSubMenus(); + return result; + } + + /** + * Dismiss all submenu popups. + * + * @return true if popups were dismissed, false otherwise. (This can be because none were open.) + */ + public boolean hideSubMenus() { + if (mActionButtonPopup != null) { + mActionButtonPopup.dismiss(); + return true; + } + return false; + } + + /** + * @return true if the overflow menu is currently showing + */ + public boolean isOverflowMenuShowing() { + return mOverflowPopup != null && mOverflowPopup.isShowing(); + } + + /** + * @return true if space has been reserved in the action menu for an overflow item. + */ + public boolean isOverflowReserved() { + return mReserveOverflow; + } + + public boolean flagActionItems() { + final ArrayList visibleItems = mMenu.getVisibleItems(); + final int itemsSize = visibleItems.size(); + int maxActions = mMaxItems; + int widthLimit = mActionItemWidthLimit; + final int querySpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + final ViewGroup parent = (ViewGroup) mMenuView; + + int requiredItems = 0; + int requestedItems = 0; + int firstActionWidth = 0; + boolean hasOverflow = false; + for (int i = 0; i < itemsSize; i++) { + MenuItemImpl item = visibleItems.get(i); + if (item.requiresActionButton()) { + requiredItems++; + } else if (item.requestsActionButton()) { + requestedItems++; + } else { + hasOverflow = true; + } + if (mExpandedActionViewsExclusive && item.isActionViewExpanded()) { + // Overflow everything if we have an expanded action view and we're + // space constrained. + maxActions = 0; + } + } + + // Reserve a spot for the overflow item if needed. + if (mReserveOverflow && + (hasOverflow || requiredItems + requestedItems > maxActions)) { + maxActions--; + } + maxActions -= requiredItems; + + final SparseBooleanArray seenGroups = mActionButtonGroups; + seenGroups.clear(); + + int cellSize = 0; + int cellsRemaining = 0; + if (mStrictWidthLimit) { + cellsRemaining = widthLimit / mMinCellSize; + final int cellSizeRemaining = widthLimit % mMinCellSize; + cellSize = mMinCellSize + cellSizeRemaining / cellsRemaining; + } + + // Flag as many more requested items as will fit. + for (int i = 0; i < itemsSize; i++) { + MenuItemImpl item = visibleItems.get(i); + + if (item.requiresActionButton()) { + View v = getItemView(item, mScrapActionButtonView, parent); + if (mScrapActionButtonView == null) { + mScrapActionButtonView = v; + } + if (mStrictWidthLimit) { + cellsRemaining -= ActionMenuView.measureChildForCells(v, + cellSize, cellsRemaining, querySpec, 0); + } else { + v.measure(querySpec, querySpec); + } + final int measuredWidth = v.getMeasuredWidth(); + widthLimit -= measuredWidth; + if (firstActionWidth == 0) { + firstActionWidth = measuredWidth; + } + final int groupId = item.getGroupId(); + if (groupId != 0) { + seenGroups.put(groupId, true); + } + item.setIsActionButton(true); + } else if (item.requestsActionButton()) { + // Items in a group with other items that already have an action slot + // can break the max actions rule, but not the width limit. + final int groupId = item.getGroupId(); + final boolean inGroup = seenGroups.get(groupId); + boolean isAction = (maxActions > 0 || inGroup) && widthLimit > 0 && + (!mStrictWidthLimit || cellsRemaining > 0); + + if (isAction) { + View v = getItemView(item, mScrapActionButtonView, parent); + if (mScrapActionButtonView == null) { + mScrapActionButtonView = v; + } + if (mStrictWidthLimit) { + final int cells = ActionMenuView.measureChildForCells(v, + cellSize, cellsRemaining, querySpec, 0); + cellsRemaining -= cells; + if (cells == 0) { + isAction = false; + } + } else { + v.measure(querySpec, querySpec); + } + final int measuredWidth = v.getMeasuredWidth(); + widthLimit -= measuredWidth; + if (firstActionWidth == 0) { + firstActionWidth = measuredWidth; + } + + if (mStrictWidthLimit) { + isAction &= widthLimit >= 0; + } else { + // Did this push the entire first item past the limit? + isAction &= widthLimit + firstActionWidth > 0; + } + } + + if (isAction && groupId != 0) { + seenGroups.put(groupId, true); + } else if (inGroup) { + // We broke the width limit. Demote the whole group, they all overflow now. + seenGroups.put(groupId, false); + for (int j = 0; j < i; j++) { + MenuItemImpl areYouMyGroupie = visibleItems.get(j); + if (areYouMyGroupie.getGroupId() == groupId) { + // Give back the action slot + if (areYouMyGroupie.isActionButton()) maxActions++; + areYouMyGroupie.setIsActionButton(false); + } + } + } + + if (isAction) maxActions--; + + item.setIsActionButton(isAction); + } + } + return true; + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + dismissPopupMenus(); + super.onCloseMenu(menu, allMenusAreClosing); + } + + @Override + public Parcelable onSaveInstanceState() { + SavedState state = new SavedState(); + state.openSubMenuId = mOpenSubMenuId; + return state; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + SavedState saved = (SavedState) state; + if (saved.openSubMenuId > 0) { + MenuItem item = mMenu.findItem(saved.openSubMenuId); + if (item != null) { + SubMenuBuilder subMenu = (SubMenuBuilder) item.getSubMenu(); + onSubMenuSelected(subMenu); + } + } + } + + @Override + public void onSubUiVisibilityChanged(boolean isVisible) { + if (isVisible) { + // Not a submenu, but treat it like one. + super.onSubMenuSelected(null); + } else { + mMenu.close(false); + } + } + + private static class SavedState implements Parcelable { + public int openSubMenuId; + + SavedState() { + } + + SavedState(Parcel in) { + openSubMenuId = in.readInt(); + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(openSubMenuId); + } + + @SuppressWarnings("unused") + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } + + private class OverflowMenuButton extends ImageButton implements ActionMenuChildView, View_HasStateListenerSupport { + private final Set mListeners = new HashSet(); + + public OverflowMenuButton(Context context) { + super(context, null, R.attr.actionOverflowButtonStyle); + + setClickable(true); + setFocusable(true); + setVisibility(VISIBLE); + setEnabled(true); + } + + @Override + public boolean performClick() { + if (super.performClick()) { + return true; + } + + playSoundEffect(SoundEffectConstants.CLICK); + showOverflowMenu(); + return true; + } + + public boolean needsDividerBefore() { + return false; + } + + public boolean needsDividerAfter() { + return false; + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + for (View_OnAttachStateChangeListener listener : mListeners) { + listener.onViewAttachedToWindow(this); + } + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + for (View_OnAttachStateChangeListener listener : mListeners) { + listener.onViewDetachedFromWindow(this); + } + + if (mOverflowPopup != null) mOverflowPopup.dismiss(); + } + + @Override + public void addOnAttachStateChangeListener(View_OnAttachStateChangeListener listener) { + mListeners.add(listener); + } + + @Override + public void removeOnAttachStateChangeListener(View_OnAttachStateChangeListener listener) { + mListeners.remove(listener); + } + } + + private class OverflowPopup extends MenuPopupHelper { + public OverflowPopup(Context context, MenuBuilder menu, View anchorView, + boolean overflowOnly) { + super(context, menu, anchorView, overflowOnly); + setCallback(mPopupPresenterCallback); + } + + @Override + public void onDismiss() { + super.onDismiss(); + mMenu.close(); + mOverflowPopup = null; + } + } + + private class ActionButtonSubmenu extends MenuPopupHelper { + //UNUSED private SubMenuBuilder mSubMenu; + + public ActionButtonSubmenu(Context context, SubMenuBuilder subMenu) { + super(context, subMenu); + //UNUSED mSubMenu = subMenu; + + MenuItemImpl item = (MenuItemImpl) subMenu.getItem(); + if (!item.isActionButton()) { + // Give a reasonable anchor to nested submenus. + setAnchorView(mOverflowButton == null ? (View) mMenuView : mOverflowButton); + } + + setCallback(mPopupPresenterCallback); + + boolean preserveIconSpacing = false; + final int count = subMenu.size(); + for (int i = 0; i < count; i++) { + MenuItem childItem = subMenu.getItem(i); + if (childItem.isVisible() && childItem.getIcon() != null) { + preserveIconSpacing = true; + break; + } + } + setForceShowIcon(preserveIconSpacing); + } + + @Override + public void onDismiss() { + super.onDismiss(); + mActionButtonPopup = null; + mOpenSubMenuId = 0; + } + } + + private class PopupPresenterCallback implements MenuPresenter.Callback { + + @Override + public boolean onOpenSubMenu(MenuBuilder subMenu) { + if (subMenu == null) return false; + + mOpenSubMenuId = ((SubMenuBuilder) subMenu).getItem().getItemId(); + return false; + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (menu instanceof SubMenuBuilder) { + ((SubMenuBuilder) menu).getRootMenu().close(false); + } + } + } + + private class OpenOverflowRunnable implements Runnable { + private OverflowPopup mPopup; + + public OpenOverflowRunnable(OverflowPopup popup) { + mPopup = popup; + } + + public void run() { + mMenu.changeMenuMode(); + final View menuView = (View) mMenuView; + if (menuView != null && menuView.getWindowToken() != null && mPopup.tryShow()) { + mOverflowPopup = mPopup; + } + mPostedOpenRunnable = null; + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java new file mode 100644 index 0000000000..0e3b1ae0d7 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ActionMenuView.java @@ -0,0 +1,575 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.actionbarsherlock.internal.view.menu; + +import android.content.Context; +import android.content.res.Configuration; +import android.graphics.Canvas; +import android.os.Build; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; +import android.widget.LinearLayout; +import com.actionbarsherlock.internal.widget.IcsLinearLayout; + +/** + * @hide + */ +public class ActionMenuView extends IcsLinearLayout implements MenuBuilder.ItemInvoker, MenuView { + //UNUSED private static final String TAG = "ActionMenuView"; + private static final boolean IS_FROYO = Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO; + + static final int MIN_CELL_SIZE = 56; // dips + static final int GENERATED_ITEM_PADDING = 4; // dips + + private MenuBuilder mMenu; + + private boolean mReserveOverflow; + private ActionMenuPresenter mPresenter; + private boolean mFormatItems; + private int mFormatItemsWidth; + private int mMinCellSize; + private int mGeneratedItemPadding; + //UNUSED private int mMeasuredExtraWidth; + + private boolean mFirst = true; + + public ActionMenuView(Context context) { + this(context, null); + } + + public ActionMenuView(Context context, AttributeSet attrs) { + super(context, attrs); + setBaselineAligned(false); + final float density = context.getResources().getDisplayMetrics().density; + mMinCellSize = (int) (MIN_CELL_SIZE * density); + mGeneratedItemPadding = (int) (GENERATED_ITEM_PADDING * density); + } + + public void setPresenter(ActionMenuPresenter presenter) { + mPresenter = presenter; + } + + public boolean isExpandedFormat() { + return mFormatItems; + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + if (IS_FROYO) { + super.onConfigurationChanged(newConfig); + } + mPresenter.updateMenuView(false); + + if (mPresenter != null && mPresenter.isOverflowMenuShowing()) { + mPresenter.hideOverflowMenu(); + mPresenter.showOverflowMenu(); + } + } + + @Override + protected void onDraw(Canvas canvas) { + //Need to trigger a relayout since we may have been added extremely + //late in the initial rendering (e.g., when contained in a ViewPager). + //See: https://github.com/JakeWharton/ActionBarSherlock/issues/272 + if (!IS_FROYO && mFirst) { + mFirst = false; + requestLayout(); + return; + } + super.onDraw(canvas); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // If we've been given an exact size to match, apply special formatting during layout. + final boolean wasFormatted = mFormatItems; + mFormatItems = MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY; + + if (wasFormatted != mFormatItems) { + mFormatItemsWidth = 0; // Reset this when switching modes + } + + // Special formatting can change whether items can fit as action buttons. + // Kick the menu and update presenters when this changes. + final int widthSize = MeasureSpec.getMode(widthMeasureSpec); + if (mFormatItems && mMenu != null && widthSize != mFormatItemsWidth) { + mFormatItemsWidth = widthSize; + mMenu.onItemsChanged(true); + } + + if (mFormatItems) { + onMeasureExactFormat(widthMeasureSpec, heightMeasureSpec); + } else { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } + + private void onMeasureExactFormat(int widthMeasureSpec, int heightMeasureSpec) { + // We already know the width mode is EXACTLY if we're here. + final int heightMode = MeasureSpec.getMode(heightMeasureSpec); + int widthSize = MeasureSpec.getSize(widthMeasureSpec); + int heightSize = MeasureSpec.getSize(heightMeasureSpec); + + final int widthPadding = getPaddingLeft() + getPaddingRight(); + final int heightPadding = getPaddingTop() + getPaddingBottom(); + + widthSize -= widthPadding; + + // Divide the view into cells. + final int cellCount = widthSize / mMinCellSize; + final int cellSizeRemaining = widthSize % mMinCellSize; + + if (cellCount == 0) { + // Give up, nothing fits. + setMeasuredDimension(widthSize, 0); + return; + } + + final int cellSize = mMinCellSize + cellSizeRemaining / cellCount; + + int cellsRemaining = cellCount; + int maxChildHeight = 0; + int maxCellsUsed = 0; + int expandableItemCount = 0; + int visibleItemCount = 0; + boolean hasOverflow = false; + + // This is used as a bitfield to locate the smallest items present. Assumes childCount < 64. + long smallestItemsAt = 0; + + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + if (child.getVisibility() == GONE) continue; + + final boolean isGeneratedItem = child instanceof ActionMenuItemView; + visibleItemCount++; + + if (isGeneratedItem) { + // Reset padding for generated menu item views; it may change below + // and views are recycled. + child.setPadding(mGeneratedItemPadding, 0, mGeneratedItemPadding, 0); + } + + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + lp.expanded = false; + lp.extraPixels = 0; + lp.cellsUsed = 0; + lp.expandable = false; + lp.leftMargin = 0; + lp.rightMargin = 0; + lp.preventEdgeOffset = isGeneratedItem && ((ActionMenuItemView) child).hasText(); + + // Overflow always gets 1 cell. No more, no less. + final int cellsAvailable = lp.isOverflowButton ? 1 : cellsRemaining; + + final int cellsUsed = measureChildForCells(child, cellSize, cellsAvailable, + heightMeasureSpec, heightPadding); + + maxCellsUsed = Math.max(maxCellsUsed, cellsUsed); + if (lp.expandable) expandableItemCount++; + if (lp.isOverflowButton) hasOverflow = true; + + cellsRemaining -= cellsUsed; + maxChildHeight = Math.max(maxChildHeight, child.getMeasuredHeight()); + if (cellsUsed == 1) smallestItemsAt |= (1 << i); + } + + // When we have overflow and a single expanded (text) item, we want to try centering it + // visually in the available space even though overflow consumes some of it. + final boolean centerSingleExpandedItem = hasOverflow && visibleItemCount == 2; + + // Divide space for remaining cells if we have items that can expand. + // Try distributing whole leftover cells to smaller items first. + + boolean needsExpansion = false; + while (expandableItemCount > 0 && cellsRemaining > 0) { + int minCells = Integer.MAX_VALUE; + long minCellsAt = 0; // Bit locations are indices of relevant child views + int minCellsItemCount = 0; + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + + // Don't try to expand items that shouldn't. + if (!lp.expandable) continue; + + // Mark indices of children that can receive an extra cell. + if (lp.cellsUsed < minCells) { + minCells = lp.cellsUsed; + minCellsAt = 1 << i; + minCellsItemCount = 1; + } else if (lp.cellsUsed == minCells) { + minCellsAt |= 1 << i; + minCellsItemCount++; + } + } + + // Items that get expanded will always be in the set of smallest items when we're done. + smallestItemsAt |= minCellsAt; + + if (minCellsItemCount > cellsRemaining) break; // Couldn't expand anything evenly. Stop. + + // We have enough cells, all minimum size items will be incremented. + minCells++; + + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if ((minCellsAt & (1 << i)) == 0) { + // If this item is already at our small item count, mark it for later. + if (lp.cellsUsed == minCells) smallestItemsAt |= 1 << i; + continue; + } + + if (centerSingleExpandedItem && lp.preventEdgeOffset && cellsRemaining == 1) { + // Add padding to this item such that it centers. + child.setPadding(mGeneratedItemPadding + cellSize, 0, mGeneratedItemPadding, 0); + } + lp.cellsUsed++; + lp.expanded = true; + cellsRemaining--; + } + + needsExpansion = true; + } + + // Divide any space left that wouldn't divide along cell boundaries + // evenly among the smallest items + + final boolean singleItem = !hasOverflow && visibleItemCount == 1; + if (cellsRemaining > 0 && smallestItemsAt != 0 && + (cellsRemaining < visibleItemCount - 1 || singleItem || maxCellsUsed > 1)) { + float expandCount = Long.bitCount(smallestItemsAt); + + if (!singleItem) { + // The items at the far edges may only expand by half in order to pin to either side. + if ((smallestItemsAt & 1) != 0) { + LayoutParams lp = (LayoutParams) getChildAt(0).getLayoutParams(); + if (!lp.preventEdgeOffset) expandCount -= 0.5f; + } + if ((smallestItemsAt & (1 << (childCount - 1))) != 0) { + LayoutParams lp = ((LayoutParams) getChildAt(childCount - 1).getLayoutParams()); + if (!lp.preventEdgeOffset) expandCount -= 0.5f; + } + } + + final int extraPixels = expandCount > 0 ? + (int) (cellsRemaining * cellSize / expandCount) : 0; + + for (int i = 0; i < childCount; i++) { + if ((smallestItemsAt & (1 << i)) == 0) continue; + + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if (child instanceof ActionMenuItemView) { + // If this is one of our views, expand and measure at the larger size. + lp.extraPixels = extraPixels; + lp.expanded = true; + if (i == 0 && !lp.preventEdgeOffset) { + // First item gets part of its new padding pushed out of sight. + // The last item will get this implicitly from layout. + lp.leftMargin = -extraPixels / 2; + } + needsExpansion = true; + } else if (lp.isOverflowButton) { + lp.extraPixels = extraPixels; + lp.expanded = true; + lp.rightMargin = -extraPixels / 2; + needsExpansion = true; + } else { + // If we don't know what it is, give it some margins instead + // and let it center within its space. We still want to pin + // against the edges. + if (i != 0) { + lp.leftMargin = extraPixels / 2; + } + if (i != childCount - 1) { + lp.rightMargin = extraPixels / 2; + } + } + } + + cellsRemaining = 0; + } + + // Remeasure any items that have had extra space allocated to them. + if (needsExpansion) { + int heightSpec = MeasureSpec.makeMeasureSpec(heightSize - heightPadding, heightMode); + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + + if (!lp.expanded) continue; + + final int width = lp.cellsUsed * cellSize + lp.extraPixels; + child.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), heightSpec); + } + } + + if (heightMode != MeasureSpec.EXACTLY) { + heightSize = maxChildHeight; + } + + setMeasuredDimension(widthSize, heightSize); + //UNUSED mMeasuredExtraWidth = cellsRemaining * cellSize; + } + + /** + * Measure a child view to fit within cell-based formatting. The child's width + * will be measured to a whole multiple of cellSize. + * + *

Sets the expandable and cellsUsed fields of LayoutParams. + * + * @param child Child to measure + * @param cellSize Size of one cell + * @param cellsRemaining Number of cells remaining that this view can expand to fill + * @param parentHeightMeasureSpec MeasureSpec used by the parent view + * @param parentHeightPadding Padding present in the parent view + * @return Number of cells this child was measured to occupy + */ + static int measureChildForCells(View child, int cellSize, int cellsRemaining, + int parentHeightMeasureSpec, int parentHeightPadding) { + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + + final int childHeightSize = MeasureSpec.getSize(parentHeightMeasureSpec) - + parentHeightPadding; + final int childHeightMode = MeasureSpec.getMode(parentHeightMeasureSpec); + final int childHeightSpec = MeasureSpec.makeMeasureSpec(childHeightSize, childHeightMode); + + int cellsUsed = 0; + if (cellsRemaining > 0) { + final int childWidthSpec = MeasureSpec.makeMeasureSpec( + cellSize * cellsRemaining, MeasureSpec.AT_MOST); + child.measure(childWidthSpec, childHeightSpec); + + final int measuredWidth = child.getMeasuredWidth(); + cellsUsed = measuredWidth / cellSize; + if (measuredWidth % cellSize != 0) cellsUsed++; + } + + final ActionMenuItemView itemView = child instanceof ActionMenuItemView ? + (ActionMenuItemView) child : null; + final boolean expandable = !lp.isOverflowButton && itemView != null && itemView.hasText(); + lp.expandable = expandable; + + lp.cellsUsed = cellsUsed; + final int targetWidth = cellsUsed * cellSize; + child.measure(MeasureSpec.makeMeasureSpec(targetWidth, MeasureSpec.EXACTLY), + childHeightSpec); + return cellsUsed; + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + if (!mFormatItems) { + super.onLayout(changed, left, top, right, bottom); + return; + } + + final int childCount = getChildCount(); + final int midVertical = (top + bottom) / 2; + final int dividerWidth = 0;//getDividerWidth(); + int overflowWidth = 0; + //UNUSED int nonOverflowWidth = 0; + int nonOverflowCount = 0; + int widthRemaining = right - left - getPaddingRight() - getPaddingLeft(); + boolean hasOverflow = false; + for (int i = 0; i < childCount; i++) { + final View v = getChildAt(i); + if (v.getVisibility() == GONE) { + continue; + } + + LayoutParams p = (LayoutParams) v.getLayoutParams(); + if (p.isOverflowButton) { + overflowWidth = v.getMeasuredWidth(); + if (hasDividerBeforeChildAt(i)) { + overflowWidth += dividerWidth; + } + + int height = v.getMeasuredHeight(); + int r = getWidth() - getPaddingRight() - p.rightMargin; + int l = r - overflowWidth; + int t = midVertical - (height / 2); + int b = t + height; + v.layout(l, t, r, b); + + widthRemaining -= overflowWidth; + hasOverflow = true; + } else { + final int size = v.getMeasuredWidth() + p.leftMargin + p.rightMargin; + //UNUSED nonOverflowWidth += size; + widthRemaining -= size; + //if (hasDividerBeforeChildAt(i)) { + //UNUSED nonOverflowWidth += dividerWidth; + //} + nonOverflowCount++; + } + } + + if (childCount == 1 && !hasOverflow) { + // Center a single child + final View v = getChildAt(0); + final int width = v.getMeasuredWidth(); + final int height = v.getMeasuredHeight(); + final int midHorizontal = (right - left) / 2; + final int l = midHorizontal - width / 2; + final int t = midVertical - height / 2; + v.layout(l, t, l + width, t + height); + return; + } + + final int spacerCount = nonOverflowCount - (hasOverflow ? 0 : 1); + final int spacerSize = Math.max(0, spacerCount > 0 ? widthRemaining / spacerCount : 0); + + int startLeft = getPaddingLeft(); + for (int i = 0; i < childCount; i++) { + final View v = getChildAt(i); + final LayoutParams lp = (LayoutParams) v.getLayoutParams(); + if (v.getVisibility() == GONE || lp.isOverflowButton) { + continue; + } + + startLeft += lp.leftMargin; + int width = v.getMeasuredWidth(); + int height = v.getMeasuredHeight(); + int t = midVertical - height / 2; + v.layout(startLeft, t, startLeft + width, t + height); + startLeft += width + lp.rightMargin + spacerSize; + } + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + mPresenter.dismissPopupMenus(); + } + + public boolean isOverflowReserved() { + return mReserveOverflow; + } + + public void setOverflowReserved(boolean reserveOverflow) { + mReserveOverflow = reserveOverflow; + } + + @Override + protected LayoutParams generateDefaultLayoutParams() { + LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT); + params.gravity = Gravity.CENTER_VERTICAL; + return params; + } + + @Override + public LayoutParams generateLayoutParams(AttributeSet attrs) { + return new LayoutParams(getContext(), attrs); + } + + @Override + protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) { + if (p instanceof LayoutParams) { + LayoutParams result = new LayoutParams((LayoutParams) p); + if (result.gravity <= Gravity.NO_GRAVITY) { + result.gravity = Gravity.CENTER_VERTICAL; + } + return result; + } + return generateDefaultLayoutParams(); + } + + @Override + protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { + return p != null && p instanceof LayoutParams; + } + + public LayoutParams generateOverflowButtonLayoutParams() { + LayoutParams result = generateDefaultLayoutParams(); + result.isOverflowButton = true; + return result; + } + + public boolean invokeItem(MenuItemImpl item) { + return mMenu.performItemAction(item, 0); + } + + public int getWindowAnimations() { + return 0; + } + + public void initialize(MenuBuilder menu) { + mMenu = menu; + } + + //@Override + protected boolean hasDividerBeforeChildAt(int childIndex) { + if (childIndex == 0) { + return false; + } + final View childBefore = getChildAt(childIndex - 1); + final View child = getChildAt(childIndex); + boolean result = false; + if (childIndex < getChildCount() && childBefore instanceof ActionMenuChildView) { + result |= ((ActionMenuChildView) childBefore).needsDividerAfter(); + } + if (childIndex > 0 && child instanceof ActionMenuChildView) { + result |= ((ActionMenuChildView) child).needsDividerBefore(); + } + return result; + } + + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + return false; + } + + public interface ActionMenuChildView { + public boolean needsDividerBefore(); + public boolean needsDividerAfter(); + } + + public static class LayoutParams extends LinearLayout.LayoutParams { + public boolean isOverflowButton; + public int cellsUsed; + public int extraPixels; + public boolean expandable; + public boolean preventEdgeOffset; + + public boolean expanded; + + public LayoutParams(Context c, AttributeSet attrs) { + super(c, attrs); + } + + public LayoutParams(LayoutParams other) { + super((LinearLayout.LayoutParams) other); + isOverflowButton = other.isOverflowButton; + } + + public LayoutParams(int width, int height) { + super(width, height); + isOverflowButton = false; + } + + public LayoutParams(int width, int height, boolean isOverflowButton) { + super(width, height); + this.isOverflowButton = isOverflowButton; + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java new file mode 100644 index 0000000000..6da26f2ae7 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/BaseMenuPresenter.java @@ -0,0 +1,231 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.view.menu; + +import java.util.ArrayList; +import android.content.Context; +import android.os.Build; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +/** + * Base class for MenuPresenters that have a consistent container view and item + * views. Behaves similarly to an AdapterView in that existing item views will + * be reused if possible when items change. + */ +public abstract class BaseMenuPresenter implements MenuPresenter { + private static final boolean IS_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; + + protected Context mSystemContext; + protected Context mContext; + protected MenuBuilder mMenu; + protected LayoutInflater mSystemInflater; + protected LayoutInflater mInflater; + private Callback mCallback; + + private int mMenuLayoutRes; + private int mItemLayoutRes; + + protected MenuView mMenuView; + + private int mId; + + /** + * Construct a new BaseMenuPresenter. + * + * @param context Context for generating system-supplied views + * @param menuLayoutRes Layout resource ID for the menu container view + * @param itemLayoutRes Layout resource ID for a single item view + */ + public BaseMenuPresenter(Context context, int menuLayoutRes, int itemLayoutRes) { + mSystemContext = context; + mSystemInflater = LayoutInflater.from(context); + mMenuLayoutRes = menuLayoutRes; + mItemLayoutRes = itemLayoutRes; + } + + @Override + public void initForMenu(Context context, MenuBuilder menu) { + mContext = context; + mInflater = LayoutInflater.from(mContext); + mMenu = menu; + } + + @Override + public MenuView getMenuView(ViewGroup root) { + if (mMenuView == null) { + mMenuView = (MenuView) mSystemInflater.inflate(mMenuLayoutRes, root, false); + mMenuView.initialize(mMenu); + updateMenuView(true); + } + + return mMenuView; + } + + /** + * Reuses item views when it can + */ + public void updateMenuView(boolean cleared) { + final ViewGroup parent = (ViewGroup) mMenuView; + if (parent == null) return; + + int childIndex = 0; + if (mMenu != null) { + mMenu.flagActionItems(); + ArrayList visibleItems = mMenu.getVisibleItems(); + final int itemCount = visibleItems.size(); + for (int i = 0; i < itemCount; i++) { + MenuItemImpl item = visibleItems.get(i); + if (shouldIncludeItem(childIndex, item)) { + final View convertView = parent.getChildAt(childIndex); + final MenuItemImpl oldItem = convertView instanceof MenuView.ItemView ? + ((MenuView.ItemView) convertView).getItemData() : null; + final View itemView = getItemView(item, convertView, parent); + if (item != oldItem) { + // Don't let old states linger with new data. + itemView.setPressed(false); + if (IS_HONEYCOMB) itemView.jumpDrawablesToCurrentState(); + } + if (itemView != convertView) { + addItemView(itemView, childIndex); + } + childIndex++; + } + } + } + + // Remove leftover views. + while (childIndex < parent.getChildCount()) { + if (!filterLeftoverView(parent, childIndex)) { + childIndex++; + } + } + } + + /** + * Add an item view at the given index. + * + * @param itemView View to add + * @param childIndex Index within the parent to insert at + */ + protected void addItemView(View itemView, int childIndex) { + final ViewGroup currentParent = (ViewGroup) itemView.getParent(); + if (currentParent != null) { + currentParent.removeView(itemView); + } + ((ViewGroup) mMenuView).addView(itemView, childIndex); + } + + /** + * Filter the child view at index and remove it if appropriate. + * @param parent Parent to filter from + * @param childIndex Index to filter + * @return true if the child view at index was removed + */ + protected boolean filterLeftoverView(ViewGroup parent, int childIndex) { + parent.removeViewAt(childIndex); + return true; + } + + public void setCallback(Callback cb) { + mCallback = cb; + } + + /** + * Create a new item view that can be re-bound to other item data later. + * + * @return The new item view + */ + public MenuView.ItemView createItemView(ViewGroup parent) { + return (MenuView.ItemView) mSystemInflater.inflate(mItemLayoutRes, parent, false); + } + + /** + * Prepare an item view for use. See AdapterView for the basic idea at work here. + * This may require creating a new item view, but well-behaved implementations will + * re-use the view passed as convertView if present. The returned view will be populated + * with data from the item parameter. + * + * @param item Item to present + * @param convertView Existing view to reuse + * @param parent Intended parent view - use for inflation. + * @return View that presents the requested menu item + */ + public View getItemView(MenuItemImpl item, View convertView, ViewGroup parent) { + MenuView.ItemView itemView; + if (convertView instanceof MenuView.ItemView) { + itemView = (MenuView.ItemView) convertView; + } else { + itemView = createItemView(parent); + } + bindItemView(item, itemView); + return (View) itemView; + } + + /** + * Bind item data to an existing item view. + * + * @param item Item to bind + * @param itemView View to populate with item data + */ + public abstract void bindItemView(MenuItemImpl item, MenuView.ItemView itemView); + + /** + * Filter item by child index and item data. + * + * @param childIndex Indended presentation index of this item + * @param item Item to present + * @return true if this item should be included in this menu presentation; false otherwise + */ + public boolean shouldIncludeItem(int childIndex, MenuItemImpl item) { + return true; + } + + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + if (mCallback != null) { + mCallback.onCloseMenu(menu, allMenusAreClosing); + } + } + + public boolean onSubMenuSelected(SubMenuBuilder menu) { + if (mCallback != null) { + return mCallback.onOpenSubMenu(menu); + } + return false; + } + + public boolean flagActionItems() { + return false; + } + + public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) { + return false; + } + + public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) { + return false; + } + + public int getId() { + return mId; + } + + public void setId(int id) { + mId = id; + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java new file mode 100644 index 0000000000..ac25c37369 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/ListMenuItemView.java @@ -0,0 +1,278 @@ +/* + * Copyright (C) 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. + */ + +package com.actionbarsherlock.internal.view.menu; + +import com.actionbarsherlock.R; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.TextView; + +/** + * The item view for each item in the ListView-based MenuViews. + */ +public class ListMenuItemView extends LinearLayout implements MenuView.ItemView { + private MenuItemImpl mItemData; + + private ImageView mIconView; + private RadioButton mRadioButton; + private TextView mTitleView; + private CheckBox mCheckBox; + private TextView mShortcutView; + + private Drawable mBackground; + private int mTextAppearance; + private Context mTextAppearanceContext; + private boolean mPreserveIconSpacing; + + //UNUSED private int mMenuType; + + private LayoutInflater mInflater; + + private boolean mForceShowIcon; + + final Context mContext; + + public ListMenuItemView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs); + mContext = context; + + TypedArray a = + context.obtainStyledAttributes( + attrs, R.styleable.SherlockMenuView, defStyle, 0); + + mBackground = a.getDrawable(R.styleable.SherlockMenuView_itemBackground); + mTextAppearance = a.getResourceId(R.styleable. + SherlockMenuView_itemTextAppearance, -1); + mPreserveIconSpacing = a.getBoolean( + R.styleable.SherlockMenuView_preserveIconSpacing, false); + mTextAppearanceContext = context; + + a.recycle(); + } + + public ListMenuItemView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + setBackgroundDrawable(mBackground); + + mTitleView = (TextView) findViewById(R.id.abs__title); + if (mTextAppearance != -1) { + mTitleView.setTextAppearance(mTextAppearanceContext, + mTextAppearance); + } + + mShortcutView = (TextView) findViewById(R.id.abs__shortcut); + } + + public void initialize(MenuItemImpl itemData, int menuType) { + mItemData = itemData; + //UNUSED mMenuType = menuType; + + setVisibility(itemData.isVisible() ? View.VISIBLE : View.GONE); + + setTitle(itemData.getTitleForItemView(this)); + setCheckable(itemData.isCheckable()); + setShortcut(itemData.shouldShowShortcut(), itemData.getShortcut()); + setIcon(itemData.getIcon()); + setEnabled(itemData.isEnabled()); + } + + public void setForceShowIcon(boolean forceShow) { + mPreserveIconSpacing = mForceShowIcon = forceShow; + } + + public void setTitle(CharSequence title) { + if (title != null) { + mTitleView.setText(title); + + if (mTitleView.getVisibility() != VISIBLE) mTitleView.setVisibility(VISIBLE); + } else { + if (mTitleView.getVisibility() != GONE) mTitleView.setVisibility(GONE); + } + } + + public MenuItemImpl getItemData() { + return mItemData; + } + + public void setCheckable(boolean checkable) { + + if (!checkable && mRadioButton == null && mCheckBox == null) { + return; + } + + if (mRadioButton == null) { + insertRadioButton(); + } + if (mCheckBox == null) { + insertCheckBox(); + } + + // Depending on whether its exclusive check or not, the checkbox or + // radio button will be the one in use (and the other will be otherCompoundButton) + final CompoundButton compoundButton; + final CompoundButton otherCompoundButton; + + if (mItemData.isExclusiveCheckable()) { + compoundButton = mRadioButton; + otherCompoundButton = mCheckBox; + } else { + compoundButton = mCheckBox; + otherCompoundButton = mRadioButton; + } + + if (checkable) { + compoundButton.setChecked(mItemData.isChecked()); + + final int newVisibility = checkable ? VISIBLE : GONE; + if (compoundButton.getVisibility() != newVisibility) { + compoundButton.setVisibility(newVisibility); + } + + // Make sure the other compound button isn't visible + if (otherCompoundButton.getVisibility() != GONE) { + otherCompoundButton.setVisibility(GONE); + } + } else { + mCheckBox.setVisibility(GONE); + mRadioButton.setVisibility(GONE); + } + } + + public void setChecked(boolean checked) { + CompoundButton compoundButton; + + if (mItemData.isExclusiveCheckable()) { + if (mRadioButton == null) { + insertRadioButton(); + } + compoundButton = mRadioButton; + } else { + if (mCheckBox == null) { + insertCheckBox(); + } + compoundButton = mCheckBox; + } + + compoundButton.setChecked(checked); + } + + public void setShortcut(boolean showShortcut, char shortcutKey) { + final int newVisibility = (showShortcut && mItemData.shouldShowShortcut()) + ? VISIBLE : GONE; + + if (newVisibility == VISIBLE) { + mShortcutView.setText(mItemData.getShortcutLabel()); + } + + if (mShortcutView.getVisibility() != newVisibility) { + mShortcutView.setVisibility(newVisibility); + } + } + + public void setIcon(Drawable icon) { + final boolean showIcon = mItemData.shouldShowIcon() || mForceShowIcon; + if (!showIcon && !mPreserveIconSpacing) { + return; + } + + if (mIconView == null && icon == null && !mPreserveIconSpacing) { + return; + } + + if (mIconView == null) { + insertIconView(); + } + + if (icon != null || mPreserveIconSpacing) { + mIconView.setImageDrawable(showIcon ? icon : null); + + if (mIconView.getVisibility() != VISIBLE) { + mIconView.setVisibility(VISIBLE); + } + } else { + mIconView.setVisibility(GONE); + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (mIconView != null && mPreserveIconSpacing) { + // Enforce minimum icon spacing + ViewGroup.LayoutParams lp = getLayoutParams(); + LayoutParams iconLp = (LayoutParams) mIconView.getLayoutParams(); + if (lp.height > 0 && iconLp.width <= 0) { + iconLp.width = lp.height; + } + } + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + private void insertIconView() { + LayoutInflater inflater = getInflater(); + mIconView = (ImageView) inflater.inflate(R.layout.abs__list_menu_item_icon, + this, false); + addView(mIconView, 0); + } + + private void insertRadioButton() { + LayoutInflater inflater = getInflater(); + mRadioButton = + (RadioButton) inflater.inflate(R.layout.abs__list_menu_item_radio, + this, false); + addView(mRadioButton); + } + + private void insertCheckBox() { + LayoutInflater inflater = getInflater(); + mCheckBox = + (CheckBox) inflater.inflate(R.layout.abs__list_menu_item_checkbox, + this, false); + addView(mCheckBox); + } + + public boolean prefersCondensedTitle() { + return false; + } + + public boolean showsIcon() { + return mForceShowIcon; + } + + private LayoutInflater getInflater() { + if (mInflater == null) { + mInflater = LayoutInflater.from(mContext); + } + return mInflater; + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java new file mode 100644 index 0000000000..179b8f0379 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuBuilder.java @@ -0,0 +1,1335 @@ +/* + * Copyright (C) 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. + */ + +package com.actionbarsherlock.internal.view.menu; + + +import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.os.Parcelable; +import android.util.SparseArray; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.KeyCharacterMap; +import android.view.KeyEvent; +import android.view.View; + +import com.actionbarsherlock.R; +import com.actionbarsherlock.view.ActionProvider; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; +import com.actionbarsherlock.view.SubMenu; + +/** + * Implementation of the {@link android.view.Menu} interface for creating a + * standard menu UI. + */ +public class MenuBuilder implements Menu { + //UNUSED private static final String TAG = "MenuBuilder"; + + private static final String PRESENTER_KEY = "android:menu:presenters"; + private static final String ACTION_VIEW_STATES_KEY = "android:menu:actionviewstates"; + private static final String EXPANDED_ACTION_VIEW_ID = "android:menu:expandedactionview"; + + private static final int[] sCategoryToOrder = new int[] { + 1, /* No category */ + 4, /* CONTAINER */ + 5, /* SYSTEM */ + 3, /* SECONDARY */ + 2, /* ALTERNATIVE */ + 0, /* SELECTED_ALTERNATIVE */ + }; + + private final Context mContext; + private final Resources mResources; + + /** + * Whether the shortcuts should be qwerty-accessible. Use isQwertyMode() + * instead of accessing this directly. + */ + private boolean mQwertyMode; + + /** + * Whether the shortcuts should be visible on menus. Use isShortcutsVisible() + * instead of accessing this directly. + */ + private boolean mShortcutsVisible; + + /** + * Callback that will receive the various menu-related events generated by + * this class. Use getCallback to get a reference to the callback. + */ + private Callback mCallback; + + /** Contains all of the items for this menu */ + private ArrayList mItems; + + /** Contains only the items that are currently visible. This will be created/refreshed from + * {@link #getVisibleItems()} */ + private ArrayList mVisibleItems; + /** + * Whether or not the items (or any one item's shown state) has changed since it was last + * fetched from {@link #getVisibleItems()} + */ + private boolean mIsVisibleItemsStale; + + /** + * Contains only the items that should appear in the Action Bar, if present. + */ + private ArrayList mActionItems; + /** + * Contains items that should NOT appear in the Action Bar, if present. + */ + private ArrayList mNonActionItems; + + /** + * Whether or not the items (or any one item's action state) has changed since it was + * last fetched. + */ + private boolean mIsActionItemsStale; + + /** + * Default value for how added items should show in the action list. + */ + private int mDefaultShowAsAction = MenuItem.SHOW_AS_ACTION_NEVER; + + /** + * Current use case is Context Menus: As Views populate the context menu, each one has + * extra information that should be passed along. This is the current menu info that + * should be set on all items added to this menu. + */ + private ContextMenuInfo mCurrentMenuInfo; + + /** Header title for menu types that have a header (context and submenus) */ + CharSequence mHeaderTitle; + /** Header icon for menu types that have a header and support icons (context) */ + Drawable mHeaderIcon; + /** Header custom view for menu types that have a header and support custom views (context) */ + View mHeaderView; + + /** + * Contains the state of the View hierarchy for all menu views when the menu + * was frozen. + */ + //UNUSED private SparseArray mFrozenViewStates; + + /** + * Prevents onItemsChanged from doing its junk, useful for batching commands + * that may individually call onItemsChanged. + */ + private boolean mPreventDispatchingItemsChanged = false; + private boolean mItemsChangedWhileDispatchPrevented = false; + + private boolean mOptionalIconsVisible = false; + + private boolean mIsClosing = false; + + private ArrayList mTempShortcutItemList = new ArrayList(); + + private CopyOnWriteArrayList> mPresenters = + new CopyOnWriteArrayList>(); + + /** + * Currently expanded menu item; must be collapsed when we clear. + */ + private MenuItemImpl mExpandedItem; + + /** + * Called by menu to notify of close and selection changes. + */ + public interface Callback { + /** + * Called when a menu item is selected. + * @param menu The menu that is the parent of the item + * @param item The menu item that is selected + * @return whether the menu item selection was handled + */ + public boolean onMenuItemSelected(MenuBuilder menu, MenuItem item); + + /** + * Called when the mode of the menu changes (for example, from icon to expanded). + * + * @param menu the menu that has changed modes + */ + public void onMenuModeChange(MenuBuilder menu); + } + + /** + * Called by menu items to execute their associated action + */ + public interface ItemInvoker { + public boolean invokeItem(MenuItemImpl item); + } + + public MenuBuilder(Context context) { + mContext = context; + mResources = context.getResources(); + + mItems = new ArrayList(); + + mVisibleItems = new ArrayList(); + mIsVisibleItemsStale = true; + + mActionItems = new ArrayList(); + mNonActionItems = new ArrayList(); + mIsActionItemsStale = true; + + setShortcutsVisibleInner(true); + } + + public MenuBuilder setDefaultShowAsAction(int defaultShowAsAction) { + mDefaultShowAsAction = defaultShowAsAction; + return this; + } + + /** + * Add a presenter to this menu. This will only hold a WeakReference; + * you do not need to explicitly remove a presenter, but you can using + * {@link #removeMenuPresenter(MenuPresenter)}. + * + * @param presenter The presenter to add + */ + public void addMenuPresenter(MenuPresenter presenter) { + mPresenters.add(new WeakReference(presenter)); + presenter.initForMenu(mContext, this); + mIsActionItemsStale = true; + } + + /** + * Remove a presenter from this menu. That presenter will no longer + * receive notifications of updates to this menu's data. + * + * @param presenter The presenter to remove + */ + public void removeMenuPresenter(MenuPresenter presenter) { + for (WeakReference ref : mPresenters) { + final MenuPresenter item = ref.get(); + if (item == null || item == presenter) { + mPresenters.remove(ref); + } + } + } + + private void dispatchPresenterUpdate(boolean cleared) { + if (mPresenters.isEmpty()) return; + + stopDispatchingItemsChanged(); + for (WeakReference ref : mPresenters) { + final MenuPresenter presenter = ref.get(); + if (presenter == null) { + mPresenters.remove(ref); + } else { + presenter.updateMenuView(cleared); + } + } + startDispatchingItemsChanged(); + } + + private boolean dispatchSubMenuSelected(SubMenuBuilder subMenu) { + if (mPresenters.isEmpty()) return false; + + boolean result = false; + + for (WeakReference ref : mPresenters) { + final MenuPresenter presenter = ref.get(); + if (presenter == null) { + mPresenters.remove(ref); + } else if (!result) { + result = presenter.onSubMenuSelected(subMenu); + } + } + return result; + } + + private void dispatchSaveInstanceState(Bundle outState) { + if (mPresenters.isEmpty()) return; + + SparseArray presenterStates = new SparseArray(); + + for (WeakReference ref : mPresenters) { + final MenuPresenter presenter = ref.get(); + if (presenter == null) { + mPresenters.remove(ref); + } else { + final int id = presenter.getId(); + if (id > 0) { + final Parcelable state = presenter.onSaveInstanceState(); + if (state != null) { + presenterStates.put(id, state); + } + } + } + } + + outState.putSparseParcelableArray(PRESENTER_KEY, presenterStates); + } + + private void dispatchRestoreInstanceState(Bundle state) { + SparseArray presenterStates = state.getSparseParcelableArray(PRESENTER_KEY); + + if (presenterStates == null || mPresenters.isEmpty()) return; + + for (WeakReference ref : mPresenters) { + final MenuPresenter presenter = ref.get(); + if (presenter == null) { + mPresenters.remove(ref); + } else { + final int id = presenter.getId(); + if (id > 0) { + Parcelable parcel = presenterStates.get(id); + if (parcel != null) { + presenter.onRestoreInstanceState(parcel); + } + } + } + } + } + + public void savePresenterStates(Bundle outState) { + dispatchSaveInstanceState(outState); + } + + public void restorePresenterStates(Bundle state) { + dispatchRestoreInstanceState(state); + } + + public void saveActionViewStates(Bundle outStates) { + SparseArray viewStates = null; + + final int itemCount = size(); + for (int i = 0; i < itemCount; i++) { + final MenuItem item = getItem(i); + final View v = item.getActionView(); + if (v != null && v.getId() != View.NO_ID) { + if (viewStates == null) { + viewStates = new SparseArray(); + } + v.saveHierarchyState(viewStates); + if (item.isActionViewExpanded()) { + outStates.putInt(EXPANDED_ACTION_VIEW_ID, item.getItemId()); + } + } + if (item.hasSubMenu()) { + final SubMenuBuilder subMenu = (SubMenuBuilder) item.getSubMenu(); + subMenu.saveActionViewStates(outStates); + } + } + + if (viewStates != null) { + outStates.putSparseParcelableArray(getActionViewStatesKey(), viewStates); + } + } + + public void restoreActionViewStates(Bundle states) { + if (states == null) { + return; + } + + SparseArray viewStates = states.getSparseParcelableArray( + getActionViewStatesKey()); + + final int itemCount = size(); + for (int i = 0; i < itemCount; i++) { + final MenuItem item = getItem(i); + final View v = item.getActionView(); + if (v != null && v.getId() != View.NO_ID) { + v.restoreHierarchyState(viewStates); + } + if (item.hasSubMenu()) { + final SubMenuBuilder subMenu = (SubMenuBuilder) item.getSubMenu(); + subMenu.restoreActionViewStates(states); + } + } + + final int expandedId = states.getInt(EXPANDED_ACTION_VIEW_ID); + if (expandedId > 0) { + MenuItem itemToExpand = findItem(expandedId); + if (itemToExpand != null) { + itemToExpand.expandActionView(); + } + } + } + + protected String getActionViewStatesKey() { + return ACTION_VIEW_STATES_KEY; + } + + public void setCallback(Callback cb) { + mCallback = cb; + } + + /** + * Adds an item to the menu. The other add methods funnel to this. + */ + private MenuItem addInternal(int group, int id, int categoryOrder, CharSequence title) { + final int ordering = getOrdering(categoryOrder); + + final MenuItemImpl item = new MenuItemImpl(this, group, id, categoryOrder, + ordering, title, mDefaultShowAsAction); + + if (mCurrentMenuInfo != null) { + // Pass along the current menu info + item.setMenuInfo(mCurrentMenuInfo); + } + + mItems.add(findInsertIndex(mItems, ordering), item); + onItemsChanged(true); + + return item; + } + + public MenuItem add(CharSequence title) { + return addInternal(0, 0, 0, title); + } + + public MenuItem add(int titleRes) { + return addInternal(0, 0, 0, mResources.getString(titleRes)); + } + + public MenuItem add(int group, int id, int categoryOrder, CharSequence title) { + return addInternal(group, id, categoryOrder, title); + } + + public MenuItem add(int group, int id, int categoryOrder, int title) { + return addInternal(group, id, categoryOrder, mResources.getString(title)); + } + + public SubMenu addSubMenu(CharSequence title) { + return addSubMenu(0, 0, 0, title); + } + + public SubMenu addSubMenu(int titleRes) { + return addSubMenu(0, 0, 0, mResources.getString(titleRes)); + } + + public SubMenu addSubMenu(int group, int id, int categoryOrder, CharSequence title) { + final MenuItemImpl item = (MenuItemImpl) addInternal(group, id, categoryOrder, title); + final SubMenuBuilder subMenu = new SubMenuBuilder(mContext, this, item); + item.setSubMenu(subMenu); + + return subMenu; + } + + public SubMenu addSubMenu(int group, int id, int categoryOrder, int title) { + return addSubMenu(group, id, categoryOrder, mResources.getString(title)); + } + + public int addIntentOptions(int group, int id, int categoryOrder, ComponentName caller, + Intent[] specifics, Intent intent, int flags, MenuItem[] outSpecificItems) { + PackageManager pm = mContext.getPackageManager(); + final List lri = + pm.queryIntentActivityOptions(caller, specifics, intent, 0); + final int N = lri != null ? lri.size() : 0; + + if ((flags & FLAG_APPEND_TO_GROUP) == 0) { + removeGroup(group); + } + + for (int i=0; i= 0) { + outSpecificItems[ri.specificIndex] = item; + } + } + + return N; + } + + public void removeItem(int id) { + removeItemAtInt(findItemIndex(id), true); + } + + public void removeGroup(int group) { + final int i = findGroupIndex(group); + + if (i >= 0) { + final int maxRemovable = mItems.size() - i; + int numRemoved = 0; + while ((numRemoved++ < maxRemovable) && (mItems.get(i).getGroupId() == group)) { + // Don't force update for each one, this method will do it at the end + removeItemAtInt(i, false); + } + + // Notify menu views + onItemsChanged(true); + } + } + + /** + * Remove the item at the given index and optionally forces menu views to + * update. + * + * @param index The index of the item to be removed. If this index is + * invalid an exception is thrown. + * @param updateChildrenOnMenuViews Whether to force update on menu views. + * Please make sure you eventually call this after your batch of + * removals. + */ + private void removeItemAtInt(int index, boolean updateChildrenOnMenuViews) { + if ((index < 0) || (index >= mItems.size())) return; + + mItems.remove(index); + + if (updateChildrenOnMenuViews) onItemsChanged(true); + } + + public void removeItemAt(int index) { + removeItemAtInt(index, true); + } + + public void clearAll() { + mPreventDispatchingItemsChanged = true; + clear(); + clearHeader(); + mPreventDispatchingItemsChanged = false; + mItemsChangedWhileDispatchPrevented = false; + onItemsChanged(true); + } + + public void clear() { + if (mExpandedItem != null) { + collapseItemActionView(mExpandedItem); + } + mItems.clear(); + + onItemsChanged(true); + } + + void setExclusiveItemChecked(MenuItem item) { + final int group = item.getGroupId(); + + final int N = mItems.size(); + for (int i = 0; i < N; i++) { + MenuItemImpl curItem = mItems.get(i); + if (curItem.getGroupId() == group) { + if (!curItem.isExclusiveCheckable()) continue; + if (!curItem.isCheckable()) continue; + + // Check the item meant to be checked, uncheck the others (that are in the group) + curItem.setCheckedInt(curItem == item); + } + } + } + + public void setGroupCheckable(int group, boolean checkable, boolean exclusive) { + final int N = mItems.size(); + + for (int i = 0; i < N; i++) { + MenuItemImpl item = mItems.get(i); + if (item.getGroupId() == group) { + item.setExclusiveCheckable(exclusive); + item.setCheckable(checkable); + } + } + } + + public void setGroupVisible(int group, boolean visible) { + final int N = mItems.size(); + + // We handle the notification of items being changed ourselves, so we use setVisibleInt rather + // than setVisible and at the end notify of items being changed + + boolean changedAtLeastOneItem = false; + for (int i = 0; i < N; i++) { + MenuItemImpl item = mItems.get(i); + if (item.getGroupId() == group) { + if (item.setVisibleInt(visible)) changedAtLeastOneItem = true; + } + } + + if (changedAtLeastOneItem) onItemsChanged(true); + } + + public void setGroupEnabled(int group, boolean enabled) { + final int N = mItems.size(); + + for (int i = 0; i < N; i++) { + MenuItemImpl item = mItems.get(i); + if (item.getGroupId() == group) { + item.setEnabled(enabled); + } + } + } + + public boolean hasVisibleItems() { + final int size = size(); + + for (int i = 0; i < size; i++) { + MenuItemImpl item = mItems.get(i); + if (item.isVisible()) { + return true; + } + } + + return false; + } + + public MenuItem findItem(int id) { + final int size = size(); + for (int i = 0; i < size; i++) { + MenuItemImpl item = mItems.get(i); + if (item.getItemId() == id) { + return item; + } else if (item.hasSubMenu()) { + MenuItem possibleItem = item.getSubMenu().findItem(id); + + if (possibleItem != null) { + return possibleItem; + } + } + } + + return null; + } + + public int findItemIndex(int id) { + final int size = size(); + + for (int i = 0; i < size; i++) { + MenuItemImpl item = mItems.get(i); + if (item.getItemId() == id) { + return i; + } + } + + return -1; + } + + public int findGroupIndex(int group) { + return findGroupIndex(group, 0); + } + + public int findGroupIndex(int group, int start) { + final int size = size(); + + if (start < 0) { + start = 0; + } + + for (int i = start; i < size; i++) { + final MenuItemImpl item = mItems.get(i); + + if (item.getGroupId() == group) { + return i; + } + } + + return -1; + } + + public int size() { + return mItems.size(); + } + + /** {@inheritDoc} */ + public MenuItem getItem(int index) { + return mItems.get(index); + } + + public boolean isShortcutKey(int keyCode, KeyEvent event) { + return findItemWithShortcutForKey(keyCode, event) != null; + } + + public void setQwertyMode(boolean isQwerty) { + mQwertyMode = isQwerty; + + onItemsChanged(false); + } + + /** + * Returns the ordering across all items. This will grab the category from + * the upper bits, find out how to order the category with respect to other + * categories, and combine it with the lower bits. + * + * @param categoryOrder The category order for a particular item (if it has + * not been or/add with a category, the default category is + * assumed). + * @return An ordering integer that can be used to order this item across + * all the items (even from other categories). + */ + private static int getOrdering(int categoryOrder) { + final int index = (categoryOrder & CATEGORY_MASK) >> CATEGORY_SHIFT; + + if (index < 0 || index >= sCategoryToOrder.length) { + throw new IllegalArgumentException("order does not contain a valid category."); + } + + return (sCategoryToOrder[index] << CATEGORY_SHIFT) | (categoryOrder & USER_MASK); + } + + /** + * @return whether the menu shortcuts are in qwerty mode or not + */ + boolean isQwertyMode() { + return mQwertyMode; + } + + /** + * Sets whether the shortcuts should be visible on menus. Devices without hardware + * key input will never make shortcuts visible even if this method is passed 'true'. + * + * @param shortcutsVisible Whether shortcuts should be visible (if true and a + * menu item does not have a shortcut defined, that item will + * still NOT show a shortcut) + */ + public void setShortcutsVisible(boolean shortcutsVisible) { + if (mShortcutsVisible == shortcutsVisible) return; + + setShortcutsVisibleInner(shortcutsVisible); + onItemsChanged(false); + } + + private void setShortcutsVisibleInner(boolean shortcutsVisible) { + mShortcutsVisible = shortcutsVisible + && mResources.getConfiguration().keyboard != Configuration.KEYBOARD_NOKEYS + && mResources.getBoolean( + R.bool.abs__config_showMenuShortcutsWhenKeyboardPresent); + } + + /** + * @return Whether shortcuts should be visible on menus. + */ + public boolean isShortcutsVisible() { + return mShortcutsVisible; + } + + Resources getResources() { + return mResources; + } + + public Context getContext() { + return mContext; + } + + boolean dispatchMenuItemSelected(MenuBuilder menu, MenuItem item) { + return mCallback != null && mCallback.onMenuItemSelected(menu, item); + } + + /** + * Dispatch a mode change event to this menu's callback. + */ + public void changeMenuMode() { + if (mCallback != null) { + mCallback.onMenuModeChange(this); + } + } + + private static int findInsertIndex(ArrayList items, int ordering) { + for (int i = items.size() - 1; i >= 0; i--) { + MenuItemImpl item = items.get(i); + if (item.getOrdering() <= ordering) { + return i + 1; + } + } + + return 0; + } + + public boolean performShortcut(int keyCode, KeyEvent event, int flags) { + final MenuItemImpl item = findItemWithShortcutForKey(keyCode, event); + + boolean handled = false; + + if (item != null) { + handled = performItemAction(item, flags); + } + + if ((flags & FLAG_ALWAYS_PERFORM_CLOSE) != 0) { + close(true); + } + + return handled; + } + + /* + * This function will return all the menu and sub-menu items that can + * be directly (the shortcut directly corresponds) and indirectly + * (the ALT-enabled char corresponds to the shortcut) associated + * with the keyCode. + */ + @SuppressWarnings("deprecation") + void findItemsWithShortcutForKey(List items, int keyCode, KeyEvent event) { + final boolean qwerty = isQwertyMode(); + final int metaState = event.getMetaState(); + final KeyCharacterMap.KeyData possibleChars = new KeyCharacterMap.KeyData(); + // Get the chars associated with the keyCode (i.e using any chording combo) + final boolean isKeyCodeMapped = event.getKeyData(possibleChars); + // The delete key is not mapped to '\b' so we treat it specially + if (!isKeyCodeMapped && (keyCode != KeyEvent.KEYCODE_DEL)) { + return; + } + + // Look for an item whose shortcut is this key. + final int N = mItems.size(); + for (int i = 0; i < N; i++) { + MenuItemImpl item = mItems.get(i); + if (item.hasSubMenu()) { + ((MenuBuilder)item.getSubMenu()).findItemsWithShortcutForKey(items, keyCode, event); + } + final char shortcutChar = qwerty ? item.getAlphabeticShortcut() : item.getNumericShortcut(); + if (((metaState & (KeyEvent.META_SHIFT_ON | KeyEvent.META_SYM_ON)) == 0) && + (shortcutChar != 0) && + (shortcutChar == possibleChars.meta[0] + || shortcutChar == possibleChars.meta[2] + || (qwerty && shortcutChar == '\b' && + keyCode == KeyEvent.KEYCODE_DEL)) && + item.isEnabled()) { + items.add(item); + } + } + } + + /* + * We want to return the menu item associated with the key, but if there is no + * ambiguity (i.e. there is only one menu item corresponding to the key) we want + * to return it even if it's not an exact match; this allow the user to + * _not_ use the ALT key for example, making the use of shortcuts slightly more + * user-friendly. An example is on the G1, '!' and '1' are on the same key, and + * in Gmail, Menu+1 will trigger Menu+! (the actual shortcut). + * + * On the other hand, if two (or more) shortcuts corresponds to the same key, + * we have to only return the exact match. + */ + @SuppressWarnings("deprecation") + MenuItemImpl findItemWithShortcutForKey(int keyCode, KeyEvent event) { + // Get all items that can be associated directly or indirectly with the keyCode + ArrayList items = mTempShortcutItemList; + items.clear(); + findItemsWithShortcutForKey(items, keyCode, event); + + if (items.isEmpty()) { + return null; + } + + final int metaState = event.getMetaState(); + final KeyCharacterMap.KeyData possibleChars = new KeyCharacterMap.KeyData(); + // Get the chars associated with the keyCode (i.e using any chording combo) + event.getKeyData(possibleChars); + + // If we have only one element, we can safely returns it + final int size = items.size(); + if (size == 1) { + return items.get(0); + } + + final boolean qwerty = isQwertyMode(); + // If we found more than one item associated with the key, + // we have to return the exact match + for (int i = 0; i < size; i++) { + final MenuItemImpl item = items.get(i); + final char shortcutChar = qwerty ? item.getAlphabeticShortcut() : + item.getNumericShortcut(); + if ((shortcutChar == possibleChars.meta[0] && + (metaState & KeyEvent.META_ALT_ON) == 0) + || (shortcutChar == possibleChars.meta[2] && + (metaState & KeyEvent.META_ALT_ON) != 0) + || (qwerty && shortcutChar == '\b' && + keyCode == KeyEvent.KEYCODE_DEL)) { + return item; + } + } + return null; + } + + public boolean performIdentifierAction(int id, int flags) { + // Look for an item whose identifier is the id. + return performItemAction(findItem(id), flags); + } + + public boolean performItemAction(MenuItem item, int flags) { + MenuItemImpl itemImpl = (MenuItemImpl) item; + + if (itemImpl == null || !itemImpl.isEnabled()) { + return false; + } + + boolean invoked = itemImpl.invoke(); + + if (itemImpl.hasCollapsibleActionView()) { + invoked |= itemImpl.expandActionView(); + if (invoked) close(true); + } else if (item.hasSubMenu()) { + close(false); + + final SubMenuBuilder subMenu = (SubMenuBuilder) item.getSubMenu(); + final ActionProvider provider = item.getActionProvider(); + if (provider != null && provider.hasSubMenu()) { + provider.onPrepareSubMenu(subMenu); + } + invoked |= dispatchSubMenuSelected(subMenu); + if (!invoked) close(true); + } else { + if ((flags & FLAG_PERFORM_NO_CLOSE) == 0) { + close(true); + } + } + + return invoked; + } + + /** + * Closes the visible menu. + * + * @param allMenusAreClosing Whether the menus are completely closing (true), + * or whether there is another menu coming in this menu's place + * (false). For example, if the menu is closing because a + * sub menu is about to be shown, allMenusAreClosing + * is false. + */ + final void close(boolean allMenusAreClosing) { + if (mIsClosing) return; + + mIsClosing = true; + for (WeakReference ref : mPresenters) { + final MenuPresenter presenter = ref.get(); + if (presenter == null) { + mPresenters.remove(ref); + } else { + presenter.onCloseMenu(this, allMenusAreClosing); + } + } + mIsClosing = false; + } + + /** {@inheritDoc} */ + public void close() { + close(true); + } + + /** + * Called when an item is added or removed. + * + * @param structureChanged true if the menu structure changed, + * false if only item properties changed. + * (Visibility is a structural property since it affects layout.) + */ + void onItemsChanged(boolean structureChanged) { + if (!mPreventDispatchingItemsChanged) { + if (structureChanged) { + mIsVisibleItemsStale = true; + mIsActionItemsStale = true; + } + + dispatchPresenterUpdate(structureChanged); + } else { + mItemsChangedWhileDispatchPrevented = true; + } + } + + /** + * Stop dispatching item changed events to presenters until + * {@link #startDispatchingItemsChanged()} is called. Useful when + * many menu operations are going to be performed as a batch. + */ + public void stopDispatchingItemsChanged() { + if (!mPreventDispatchingItemsChanged) { + mPreventDispatchingItemsChanged = true; + mItemsChangedWhileDispatchPrevented = false; + } + } + + public void startDispatchingItemsChanged() { + mPreventDispatchingItemsChanged = false; + + if (mItemsChangedWhileDispatchPrevented) { + mItemsChangedWhileDispatchPrevented = false; + onItemsChanged(true); + } + } + + /** + * Called by {@link MenuItemImpl} when its visible flag is changed. + * @param item The item that has gone through a visibility change. + */ + void onItemVisibleChanged(MenuItemImpl item) { + // Notify of items being changed + mIsVisibleItemsStale = true; + onItemsChanged(true); + } + + /** + * Called by {@link MenuItemImpl} when its action request status is changed. + * @param item The item that has gone through a change in action request status. + */ + void onItemActionRequestChanged(MenuItemImpl item) { + // Notify of items being changed + mIsActionItemsStale = true; + onItemsChanged(true); + } + + ArrayList getVisibleItems() { + if (!mIsVisibleItemsStale) return mVisibleItems; + + // Refresh the visible items + mVisibleItems.clear(); + + final int itemsSize = mItems.size(); + MenuItemImpl item; + for (int i = 0; i < itemsSize; i++) { + item = mItems.get(i); + if (item.isVisible()) mVisibleItems.add(item); + } + + mIsVisibleItemsStale = false; + mIsActionItemsStale = true; + + return mVisibleItems; + } + + /** + * This method determines which menu items get to be 'action items' that will appear + * in an action bar and which items should be 'overflow items' in a secondary menu. + * The rules are as follows: + * + *

Items are considered for inclusion in the order specified within the menu. + * There is a limit of mMaxActionItems as a total count, optionally including the overflow + * menu button itself. This is a soft limit; if an item shares a group ID with an item + * previously included as an action item, the new item will stay with its group and become + * an action item itself even if it breaks the max item count limit. This is done to + * limit the conceptual complexity of the items presented within an action bar. Only a few + * unrelated concepts should be presented to the user in this space, and groups are treated + * as a single concept. + * + *

There is also a hard limit of consumed measurable space: mActionWidthLimit. This + * limit may be broken by a single item that exceeds the remaining space, but no further + * items may be added. If an item that is part of a group cannot fit within the remaining + * measured width, the entire group will be demoted to overflow. This is done to ensure room + * for navigation and other affordances in the action bar as well as reduce general UI clutter. + * + *

The space freed by demoting a full group cannot be consumed by future menu items. + * Once items begin to overflow, all future items become overflow items as well. This is + * to avoid inadvertent reordering that may break the app's intended design. + */ + public void flagActionItems() { + if (!mIsActionItemsStale) { + return; + } + + // Presenters flag action items as needed. + boolean flagged = false; + for (WeakReference ref : mPresenters) { + final MenuPresenter presenter = ref.get(); + if (presenter == null) { + mPresenters.remove(ref); + } else { + flagged |= presenter.flagActionItems(); + } + } + + if (flagged) { + mActionItems.clear(); + mNonActionItems.clear(); + ArrayList visibleItems = getVisibleItems(); + final int itemsSize = visibleItems.size(); + for (int i = 0; i < itemsSize; i++) { + MenuItemImpl item = visibleItems.get(i); + if (item.isActionButton()) { + mActionItems.add(item); + } else { + mNonActionItems.add(item); + } + } + } else { + // Nobody flagged anything, everything is a non-action item. + // (This happens during a first pass with no action-item presenters.) + mActionItems.clear(); + mNonActionItems.clear(); + mNonActionItems.addAll(getVisibleItems()); + } + mIsActionItemsStale = false; + } + + ArrayList getActionItems() { + flagActionItems(); + return mActionItems; + } + + ArrayList getNonActionItems() { + flagActionItems(); + return mNonActionItems; + } + + public void clearHeader() { + mHeaderIcon = null; + mHeaderTitle = null; + mHeaderView = null; + + onItemsChanged(false); + } + + private void setHeaderInternal(final int titleRes, final CharSequence title, final int iconRes, + final Drawable icon, final View view) { + final Resources r = getResources(); + + if (view != null) { + mHeaderView = view; + + // If using a custom view, then the title and icon aren't used + mHeaderTitle = null; + mHeaderIcon = null; + } else { + if (titleRes > 0) { + mHeaderTitle = r.getText(titleRes); + } else if (title != null) { + mHeaderTitle = title; + } + + if (iconRes > 0) { + mHeaderIcon = r.getDrawable(iconRes); + } else if (icon != null) { + mHeaderIcon = icon; + } + + // If using the title or icon, then a custom view isn't used + mHeaderView = null; + } + + // Notify of change + onItemsChanged(false); + } + + /** + * Sets the header's title. This replaces the header view. Called by the + * builder-style methods of subclasses. + * + * @param title The new title. + * @return This MenuBuilder so additional setters can be called. + */ + protected MenuBuilder setHeaderTitleInt(CharSequence title) { + setHeaderInternal(0, title, 0, null, null); + return this; + } + + /** + * Sets the header's title. This replaces the header view. Called by the + * builder-style methods of subclasses. + * + * @param titleRes The new title (as a resource ID). + * @return This MenuBuilder so additional setters can be called. + */ + protected MenuBuilder setHeaderTitleInt(int titleRes) { + setHeaderInternal(titleRes, null, 0, null, null); + return this; + } + + /** + * Sets the header's icon. This replaces the header view. Called by the + * builder-style methods of subclasses. + * + * @param icon The new icon. + * @return This MenuBuilder so additional setters can be called. + */ + protected MenuBuilder setHeaderIconInt(Drawable icon) { + setHeaderInternal(0, null, 0, icon, null); + return this; + } + + /** + * Sets the header's icon. This replaces the header view. Called by the + * builder-style methods of subclasses. + * + * @param iconRes The new icon (as a resource ID). + * @return This MenuBuilder so additional setters can be called. + */ + protected MenuBuilder setHeaderIconInt(int iconRes) { + setHeaderInternal(0, null, iconRes, null, null); + return this; + } + + /** + * Sets the header's view. This replaces the title and icon. Called by the + * builder-style methods of subclasses. + * + * @param view The new view. + * @return This MenuBuilder so additional setters can be called. + */ + protected MenuBuilder setHeaderViewInt(View view) { + setHeaderInternal(0, null, 0, null, view); + return this; + } + + public CharSequence getHeaderTitle() { + return mHeaderTitle; + } + + public Drawable getHeaderIcon() { + return mHeaderIcon; + } + + public View getHeaderView() { + return mHeaderView; + } + + /** + * Gets the root menu (if this is a submenu, find its root menu). + * @return The root menu. + */ + public MenuBuilder getRootMenu() { + return this; + } + + /** + * Sets the current menu info that is set on all items added to this menu + * (until this is called again with different menu info, in which case that + * one will be added to all subsequent item additions). + * + * @param menuInfo The extra menu information to add. + */ + public void setCurrentMenuInfo(ContextMenuInfo menuInfo) { + mCurrentMenuInfo = menuInfo; + } + + void setOptionalIconsVisible(boolean visible) { + mOptionalIconsVisible = visible; + } + + boolean getOptionalIconsVisible() { + return mOptionalIconsVisible; + } + + public boolean expandItemActionView(MenuItemImpl item) { + if (mPresenters.isEmpty()) return false; + + boolean expanded = false; + + stopDispatchingItemsChanged(); + for (WeakReference ref : mPresenters) { + final MenuPresenter presenter = ref.get(); + if (presenter == null) { + mPresenters.remove(ref); + } else if ((expanded = presenter.expandItemActionView(this, item))) { + break; + } + } + startDispatchingItemsChanged(); + + if (expanded) { + mExpandedItem = item; + } + return expanded; + } + + public boolean collapseItemActionView(MenuItemImpl item) { + if (mPresenters.isEmpty() || mExpandedItem != item) return false; + + boolean collapsed = false; + + stopDispatchingItemsChanged(); + for (WeakReference ref : mPresenters) { + final MenuPresenter presenter = ref.get(); + if (presenter == null) { + mPresenters.remove(ref); + } else if ((collapsed = presenter.collapseItemActionView(this, item))) { + break; + } + } + startDispatchingItemsChanged(); + + if (collapsed) { + mExpandedItem = null; + } + return collapsed; + } + + public MenuItemImpl getExpandedItem() { + return mExpandedItem; + } + + public boolean bindNativeOverflow(android.view.Menu menu, android.view.MenuItem.OnMenuItemClickListener listener, HashMap map) { + final List nonActionItems = getNonActionItems(); + if (nonActionItems == null || nonActionItems.size() == 0) { + return false; + } + + boolean visible = false; + menu.clear(); + for (MenuItemImpl nonActionItem : nonActionItems) { + if (!nonActionItem.isVisible()) { + continue; + } + visible = true; + + android.view.MenuItem nativeItem; + if (nonActionItem.hasSubMenu()) { + android.view.SubMenu nativeSub = menu.addSubMenu(nonActionItem.getGroupId(), nonActionItem.getItemId(), + nonActionItem.getOrder(), nonActionItem.getTitle()); + + SubMenuBuilder subMenu = (SubMenuBuilder)nonActionItem.getSubMenu(); + for (MenuItemImpl subItem : subMenu.getVisibleItems()) { + android.view.MenuItem nativeSubItem = nativeSub.add(subItem.getGroupId(), subItem.getItemId(), + subItem.getOrder(), subItem.getTitle()); + + nativeSubItem.setIcon(subItem.getIcon()); + nativeSubItem.setOnMenuItemClickListener(listener); + nativeSubItem.setEnabled(subItem.isEnabled()); + nativeSubItem.setIntent(subItem.getIntent()); + nativeSubItem.setNumericShortcut(subItem.getNumericShortcut()); + nativeSubItem.setAlphabeticShortcut(subItem.getAlphabeticShortcut()); + nativeSubItem.setTitleCondensed(subItem.getTitleCondensed()); + nativeSubItem.setCheckable(subItem.isCheckable()); + nativeSubItem.setChecked(subItem.isChecked()); + + if (subItem.isExclusiveCheckable()) { + nativeSub.setGroupCheckable(subItem.getGroupId(), true, true); + } + + map.put(nativeSubItem, subItem); + } + + nativeItem = nativeSub.getItem(); + } else { + nativeItem = menu.add(nonActionItem.getGroupId(), nonActionItem.getItemId(), + nonActionItem.getOrder(), nonActionItem.getTitle()); + } + nativeItem.setIcon(nonActionItem.getIcon()); + nativeItem.setOnMenuItemClickListener(listener); + nativeItem.setEnabled(nonActionItem.isEnabled()); + nativeItem.setIntent(nonActionItem.getIntent()); + nativeItem.setNumericShortcut(nonActionItem.getNumericShortcut()); + nativeItem.setAlphabeticShortcut(nonActionItem.getAlphabeticShortcut()); + nativeItem.setTitleCondensed(nonActionItem.getTitleCondensed()); + nativeItem.setCheckable(nonActionItem.isCheckable()); + nativeItem.setChecked(nonActionItem.isChecked()); + + if (nonActionItem.isExclusiveCheckable()) { + menu.setGroupCheckable(nonActionItem.getGroupId(), true, true); + } + + map.put(nativeItem, nonActionItem); + } + return visible; + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java new file mode 100644 index 0000000000..f5359fb407 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemImpl.java @@ -0,0 +1,647 @@ +/* + * Copyright (C) 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. + */ + +package com.actionbarsherlock.internal.view.menu; + +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.util.Log; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewDebug; +import android.widget.LinearLayout; + +import com.actionbarsherlock.view.ActionProvider; +import com.actionbarsherlock.view.MenuItem; +import com.actionbarsherlock.view.SubMenu; + +/** + * @hide + */ +public final class MenuItemImpl implements MenuItem { + private static final String TAG = "MenuItemImpl"; + + private static final int SHOW_AS_ACTION_MASK = SHOW_AS_ACTION_NEVER | + SHOW_AS_ACTION_IF_ROOM | + SHOW_AS_ACTION_ALWAYS; + + private final int mId; + private final int mGroup; + private final int mCategoryOrder; + private final int mOrdering; + private CharSequence mTitle; + private CharSequence mTitleCondensed; + private Intent mIntent; + private char mShortcutNumericChar; + private char mShortcutAlphabeticChar; + + /** The icon's drawable which is only created as needed */ + private Drawable mIconDrawable; + /** + * The icon's resource ID which is used to get the Drawable when it is + * needed (if the Drawable isn't already obtained--only one of the two is + * needed). + */ + private int mIconResId = NO_ICON; + + /** The menu to which this item belongs */ + private MenuBuilder mMenu; + /** If this item should launch a sub menu, this is the sub menu to launch */ + private SubMenuBuilder mSubMenu; + + private Runnable mItemCallback; + private MenuItem.OnMenuItemClickListener mClickListener; + + private int mFlags = ENABLED; + private static final int CHECKABLE = 0x00000001; + private static final int CHECKED = 0x00000002; + private static final int EXCLUSIVE = 0x00000004; + private static final int HIDDEN = 0x00000008; + private static final int ENABLED = 0x00000010; + private static final int IS_ACTION = 0x00000020; + + private int mShowAsAction = SHOW_AS_ACTION_NEVER; + + private View mActionView; + private ActionProvider mActionProvider; + private OnActionExpandListener mOnActionExpandListener; + private boolean mIsActionViewExpanded = false; + + /** Used for the icon resource ID if this item does not have an icon */ + static final int NO_ICON = 0; + + /** + * Current use case is for context menu: Extra information linked to the + * View that added this item to the context menu. + */ + private ContextMenuInfo mMenuInfo; + + private static String sPrependShortcutLabel; + private static String sEnterShortcutLabel; + private static String sDeleteShortcutLabel; + private static String sSpaceShortcutLabel; + + + /** + * Instantiates this menu item. + * + * @param menu + * @param group Item ordering grouping control. The item will be added after + * all other items whose order is <= this number, and before any + * that are larger than it. This can also be used to define + * groups of items for batch state changes. Normally use 0. + * @param id Unique item ID. Use 0 if you do not need a unique ID. + * @param categoryOrder The ordering for this item. + * @param title The text to display for the item. + */ + MenuItemImpl(MenuBuilder menu, int group, int id, int categoryOrder, int ordering, + CharSequence title, int showAsAction) { + + /* TODO if (sPrependShortcutLabel == null) { + // This is instantiated from the UI thread, so no chance of sync issues + sPrependShortcutLabel = menu.getContext().getResources().getString( + com.android.internal.R.string.prepend_shortcut_label); + sEnterShortcutLabel = menu.getContext().getResources().getString( + com.android.internal.R.string.menu_enter_shortcut_label); + sDeleteShortcutLabel = menu.getContext().getResources().getString( + com.android.internal.R.string.menu_delete_shortcut_label); + sSpaceShortcutLabel = menu.getContext().getResources().getString( + com.android.internal.R.string.menu_space_shortcut_label); + }*/ + + mMenu = menu; + mId = id; + mGroup = group; + mCategoryOrder = categoryOrder; + mOrdering = ordering; + mTitle = title; + mShowAsAction = showAsAction; + } + + /** + * Invokes the item by calling various listeners or callbacks. + * + * @return true if the invocation was handled, false otherwise + */ + public boolean invoke() { + if (mClickListener != null && + mClickListener.onMenuItemClick(this)) { + return true; + } + + if (mMenu.dispatchMenuItemSelected(mMenu.getRootMenu(), this)) { + return true; + } + + if (mItemCallback != null) { + mItemCallback.run(); + return true; + } + + if (mIntent != null) { + try { + mMenu.getContext().startActivity(mIntent); + return true; + } catch (ActivityNotFoundException e) { + Log.e(TAG, "Can't find activity to handle intent; ignoring", e); + } + } + + if (mActionProvider != null && mActionProvider.onPerformDefaultAction()) { + return true; + } + + return false; + } + + public boolean isEnabled() { + return (mFlags & ENABLED) != 0; + } + + public MenuItem setEnabled(boolean enabled) { + if (enabled) { + mFlags |= ENABLED; + } else { + mFlags &= ~ENABLED; + } + + mMenu.onItemsChanged(false); + + return this; + } + + public int getGroupId() { + return mGroup; + } + + @ViewDebug.CapturedViewProperty + public int getItemId() { + return mId; + } + + public int getOrder() { + return mCategoryOrder; + } + + public int getOrdering() { + return mOrdering; + } + + public Intent getIntent() { + return mIntent; + } + + public MenuItem setIntent(Intent intent) { + mIntent = intent; + return this; + } + + Runnable getCallback() { + return mItemCallback; + } + + public MenuItem setCallback(Runnable callback) { + mItemCallback = callback; + return this; + } + + public char getAlphabeticShortcut() { + return mShortcutAlphabeticChar; + } + + public MenuItem setAlphabeticShortcut(char alphaChar) { + if (mShortcutAlphabeticChar == alphaChar) return this; + + mShortcutAlphabeticChar = Character.toLowerCase(alphaChar); + + mMenu.onItemsChanged(false); + + return this; + } + + public char getNumericShortcut() { + return mShortcutNumericChar; + } + + public MenuItem setNumericShortcut(char numericChar) { + if (mShortcutNumericChar == numericChar) return this; + + mShortcutNumericChar = numericChar; + + mMenu.onItemsChanged(false); + + return this; + } + + public MenuItem setShortcut(char numericChar, char alphaChar) { + mShortcutNumericChar = numericChar; + mShortcutAlphabeticChar = Character.toLowerCase(alphaChar); + + mMenu.onItemsChanged(false); + + return this; + } + + /** + * @return The active shortcut (based on QWERTY-mode of the menu). + */ + char getShortcut() { + return (mMenu.isQwertyMode() ? mShortcutAlphabeticChar : mShortcutNumericChar); + } + + /** + * @return The label to show for the shortcut. This includes the chording + * key (for example 'Menu+a'). Also, any non-human readable + * characters should be human readable (for example 'Menu+enter'). + */ + String getShortcutLabel() { + + char shortcut = getShortcut(); + if (shortcut == 0) { + return ""; + } + + StringBuilder sb = new StringBuilder(sPrependShortcutLabel); + switch (shortcut) { + + case '\n': + sb.append(sEnterShortcutLabel); + break; + + case '\b': + sb.append(sDeleteShortcutLabel); + break; + + case ' ': + sb.append(sSpaceShortcutLabel); + break; + + default: + sb.append(shortcut); + break; + } + + return sb.toString(); + } + + /** + * @return Whether this menu item should be showing shortcuts (depends on + * whether the menu should show shortcuts and whether this item has + * a shortcut defined) + */ + boolean shouldShowShortcut() { + // Show shortcuts if the menu is supposed to show shortcuts AND this item has a shortcut + return mMenu.isShortcutsVisible() && (getShortcut() != 0); + } + + public SubMenu getSubMenu() { + return mSubMenu; + } + + public boolean hasSubMenu() { + return mSubMenu != null; + } + + void setSubMenu(SubMenuBuilder subMenu) { + mSubMenu = subMenu; + + subMenu.setHeaderTitle(getTitle()); + } + + @ViewDebug.CapturedViewProperty + public CharSequence getTitle() { + return mTitle; + } + + /** + * Gets the title for a particular {@link ItemView} + * + * @param itemView The ItemView that is receiving the title + * @return Either the title or condensed title based on what the ItemView + * prefers + */ + CharSequence getTitleForItemView(MenuView.ItemView itemView) { + return ((itemView != null) && itemView.prefersCondensedTitle()) + ? getTitleCondensed() + : getTitle(); + } + + public MenuItem setTitle(CharSequence title) { + mTitle = title; + + mMenu.onItemsChanged(false); + + if (mSubMenu != null) { + mSubMenu.setHeaderTitle(title); + } + + return this; + } + + public MenuItem setTitle(int title) { + return setTitle(mMenu.getContext().getString(title)); + } + + public CharSequence getTitleCondensed() { + return mTitleCondensed != null ? mTitleCondensed : mTitle; + } + + public MenuItem setTitleCondensed(CharSequence title) { + mTitleCondensed = title; + + // Could use getTitle() in the loop below, but just cache what it would do here + if (title == null) { + title = mTitle; + } + + mMenu.onItemsChanged(false); + + return this; + } + + public Drawable getIcon() { + if (mIconDrawable != null) { + return mIconDrawable; + } + + if (mIconResId != NO_ICON) { + return mMenu.getResources().getDrawable(mIconResId); + } + + return null; + } + + public MenuItem setIcon(Drawable icon) { + mIconResId = NO_ICON; + mIconDrawable = icon; + mMenu.onItemsChanged(false); + + return this; + } + + public MenuItem setIcon(int iconResId) { + mIconDrawable = null; + mIconResId = iconResId; + + // If we have a view, we need to push the Drawable to them + mMenu.onItemsChanged(false); + + return this; + } + + public boolean isCheckable() { + return (mFlags & CHECKABLE) == CHECKABLE; + } + + public MenuItem setCheckable(boolean checkable) { + final int oldFlags = mFlags; + mFlags = (mFlags & ~CHECKABLE) | (checkable ? CHECKABLE : 0); + if (oldFlags != mFlags) { + mMenu.onItemsChanged(false); + } + + return this; + } + + public void setExclusiveCheckable(boolean exclusive) { + mFlags = (mFlags & ~EXCLUSIVE) | (exclusive ? EXCLUSIVE : 0); + } + + public boolean isExclusiveCheckable() { + return (mFlags & EXCLUSIVE) != 0; + } + + public boolean isChecked() { + return (mFlags & CHECKED) == CHECKED; + } + + public MenuItem setChecked(boolean checked) { + if ((mFlags & EXCLUSIVE) != 0) { + // Call the method on the Menu since it knows about the others in this + // exclusive checkable group + mMenu.setExclusiveItemChecked(this); + } else { + setCheckedInt(checked); + } + + return this; + } + + void setCheckedInt(boolean checked) { + final int oldFlags = mFlags; + mFlags = (mFlags & ~CHECKED) | (checked ? CHECKED : 0); + if (oldFlags != mFlags) { + mMenu.onItemsChanged(false); + } + } + + public boolean isVisible() { + return (mFlags & HIDDEN) == 0; + } + + /** + * Changes the visibility of the item. This method DOES NOT notify the + * parent menu of a change in this item, so this should only be called from + * methods that will eventually trigger this change. If unsure, use {@link #setVisible(boolean)} + * instead. + * + * @param shown Whether to show (true) or hide (false). + * @return Whether the item's shown state was changed + */ + boolean setVisibleInt(boolean shown) { + final int oldFlags = mFlags; + mFlags = (mFlags & ~HIDDEN) | (shown ? 0 : HIDDEN); + return oldFlags != mFlags; + } + + public MenuItem setVisible(boolean shown) { + // Try to set the shown state to the given state. If the shown state was changed + // (i.e. the previous state isn't the same as given state), notify the parent menu that + // the shown state has changed for this item + if (setVisibleInt(shown)) mMenu.onItemVisibleChanged(this); + + return this; + } + + public MenuItem setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener clickListener) { + mClickListener = clickListener; + return this; + } + + @Override + public String toString() { + return mTitle.toString(); + } + + void setMenuInfo(ContextMenuInfo menuInfo) { + mMenuInfo = menuInfo; + } + + public ContextMenuInfo getMenuInfo() { + return mMenuInfo; + } + + public void actionFormatChanged() { + mMenu.onItemActionRequestChanged(this); + } + + /** + * @return Whether the menu should show icons for menu items. + */ + public boolean shouldShowIcon() { + return mMenu.getOptionalIconsVisible(); + } + + public boolean isActionButton() { + return (mFlags & IS_ACTION) == IS_ACTION; + } + + public boolean requestsActionButton() { + return (mShowAsAction & SHOW_AS_ACTION_IF_ROOM) == SHOW_AS_ACTION_IF_ROOM; + } + + public boolean requiresActionButton() { + return (mShowAsAction & SHOW_AS_ACTION_ALWAYS) == SHOW_AS_ACTION_ALWAYS; + } + + public void setIsActionButton(boolean isActionButton) { + if (isActionButton) { + mFlags |= IS_ACTION; + } else { + mFlags &= ~IS_ACTION; + } + } + + public boolean showsTextAsAction() { + return (mShowAsAction & SHOW_AS_ACTION_WITH_TEXT) == SHOW_AS_ACTION_WITH_TEXT; + } + + public void setShowAsAction(int actionEnum) { + switch (actionEnum & SHOW_AS_ACTION_MASK) { + case SHOW_AS_ACTION_ALWAYS: + case SHOW_AS_ACTION_IF_ROOM: + case SHOW_AS_ACTION_NEVER: + // Looks good! + break; + + default: + // Mutually exclusive options selected! + throw new IllegalArgumentException("SHOW_AS_ACTION_ALWAYS, SHOW_AS_ACTION_IF_ROOM," + + " and SHOW_AS_ACTION_NEVER are mutually exclusive."); + } + mShowAsAction = actionEnum; + mMenu.onItemActionRequestChanged(this); + } + + public MenuItem setActionView(View view) { + mActionView = view; + mActionProvider = null; + if (view != null && view.getId() == View.NO_ID && mId > 0) { + view.setId(mId); + } + mMenu.onItemActionRequestChanged(this); + return this; + } + + public MenuItem setActionView(int resId) { + final Context context = mMenu.getContext(); + final LayoutInflater inflater = LayoutInflater.from(context); + setActionView(inflater.inflate(resId, new LinearLayout(context), false)); + return this; + } + + public View getActionView() { + if (mActionView != null) { + return mActionView; + } else if (mActionProvider != null) { + mActionView = mActionProvider.onCreateActionView(); + return mActionView; + } else { + return null; + } + } + + public ActionProvider getActionProvider() { + return mActionProvider; + } + + public MenuItem setActionProvider(ActionProvider actionProvider) { + mActionView = null; + mActionProvider = actionProvider; + mMenu.onItemsChanged(true); // Measurement can be changed + return this; + } + + @Override + public MenuItem setShowAsActionFlags(int actionEnum) { + setShowAsAction(actionEnum); + return this; + } + + @Override + public boolean expandActionView() { + if ((mShowAsAction & SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW) == 0 || mActionView == null) { + return false; + } + + if (mOnActionExpandListener == null || + mOnActionExpandListener.onMenuItemActionExpand(this)) { + return mMenu.expandItemActionView(this); + } + + return false; + } + + @Override + public boolean collapseActionView() { + if ((mShowAsAction & SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW) == 0) { + return false; + } + if (mActionView == null) { + // We're already collapsed if we have no action view. + return true; + } + + if (mOnActionExpandListener == null || + mOnActionExpandListener.onMenuItemActionCollapse(this)) { + return mMenu.collapseItemActionView(this); + } + + return false; + } + + @Override + public MenuItem setOnActionExpandListener(OnActionExpandListener listener) { + mOnActionExpandListener = listener; + return this; + } + + public boolean hasCollapsibleActionView() { + return (mShowAsAction & SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW) != 0 && mActionView != null; + } + + public void setActionViewExpanded(boolean isExpanded) { + mIsActionViewExpanded = isExpanded; + mMenu.onItemsChanged(false); + } + + public boolean isActionViewExpanded() { + return mIsActionViewExpanded; + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java new file mode 100644 index 0000000000..aaf2997b74 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuItemWrapper.java @@ -0,0 +1,310 @@ +package com.actionbarsherlock.internal.view.menu; + +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.View; +import com.actionbarsherlock.internal.view.ActionProviderWrapper; +import com.actionbarsherlock.internal.widget.CollapsibleActionViewWrapper; +import com.actionbarsherlock.view.ActionProvider; +import com.actionbarsherlock.view.CollapsibleActionView; +import com.actionbarsherlock.view.MenuItem; +import com.actionbarsherlock.view.SubMenu; + +public class MenuItemWrapper implements MenuItem, android.view.MenuItem.OnMenuItemClickListener { + private final android.view.MenuItem mNativeItem; + private SubMenu mSubMenu = null; + private OnMenuItemClickListener mMenuItemClickListener = null; + private OnActionExpandListener mActionExpandListener = null; + private android.view.MenuItem.OnActionExpandListener mNativeActionExpandListener = null; + + + public MenuItemWrapper(android.view.MenuItem nativeItem) { + if (nativeItem == null) { + throw new IllegalStateException("Wrapped menu item cannot be null."); + } + mNativeItem = nativeItem; + } + + + @Override + public int getItemId() { + return mNativeItem.getItemId(); + } + + @Override + public int getGroupId() { + return mNativeItem.getGroupId(); + } + + @Override + public int getOrder() { + return mNativeItem.getOrder(); + } + + @Override + public MenuItem setTitle(CharSequence title) { + mNativeItem.setTitle(title); + return this; + } + + @Override + public MenuItem setTitle(int title) { + mNativeItem.setTitle(title); + return this; + } + + @Override + public CharSequence getTitle() { + return mNativeItem.getTitle(); + } + + @Override + public MenuItem setTitleCondensed(CharSequence title) { + mNativeItem.setTitleCondensed(title); + return this; + } + + @Override + public CharSequence getTitleCondensed() { + return mNativeItem.getTitleCondensed(); + } + + @Override + public MenuItem setIcon(Drawable icon) { + mNativeItem.setIcon(icon); + return this; + } + + @Override + public MenuItem setIcon(int iconRes) { + mNativeItem.setIcon(iconRes); + return this; + } + + @Override + public Drawable getIcon() { + return mNativeItem.getIcon(); + } + + @Override + public MenuItem setIntent(Intent intent) { + mNativeItem.setIntent(intent); + return this; + } + + @Override + public Intent getIntent() { + return mNativeItem.getIntent(); + } + + @Override + public MenuItem setShortcut(char numericChar, char alphaChar) { + mNativeItem.setShortcut(numericChar, alphaChar); + return this; + } + + @Override + public MenuItem setNumericShortcut(char numericChar) { + mNativeItem.setNumericShortcut(numericChar); + return this; + } + + @Override + public char getNumericShortcut() { + return mNativeItem.getNumericShortcut(); + } + + @Override + public MenuItem setAlphabeticShortcut(char alphaChar) { + mNativeItem.setAlphabeticShortcut(alphaChar); + return this; + } + + @Override + public char getAlphabeticShortcut() { + return mNativeItem.getAlphabeticShortcut(); + } + + @Override + public MenuItem setCheckable(boolean checkable) { + mNativeItem.setCheckable(checkable); + return this; + } + + @Override + public boolean isCheckable() { + return mNativeItem.isCheckable(); + } + + @Override + public MenuItem setChecked(boolean checked) { + mNativeItem.setChecked(checked); + return this; + } + + @Override + public boolean isChecked() { + return mNativeItem.isChecked(); + } + + @Override + public MenuItem setVisible(boolean visible) { + mNativeItem.setVisible(visible); + return this; + } + + @Override + public boolean isVisible() { + return mNativeItem.isVisible(); + } + + @Override + public MenuItem setEnabled(boolean enabled) { + mNativeItem.setEnabled(enabled); + return this; + } + + @Override + public boolean isEnabled() { + return mNativeItem.isEnabled(); + } + + @Override + public boolean hasSubMenu() { + return mNativeItem.hasSubMenu(); + } + + @Override + public SubMenu getSubMenu() { + if (hasSubMenu() && (mSubMenu == null)) { + mSubMenu = new SubMenuWrapper(mNativeItem.getSubMenu()); + } + return mSubMenu; + } + + @Override + public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) { + mMenuItemClickListener = menuItemClickListener; + //Register ourselves as the listener to proxy + mNativeItem.setOnMenuItemClickListener(this); + return this; + } + + @Override + public boolean onMenuItemClick(android.view.MenuItem item) { + if (mMenuItemClickListener != null) { + return mMenuItemClickListener.onMenuItemClick(this); + } + return false; + } + + @Override + public ContextMenuInfo getMenuInfo() { + return mNativeItem.getMenuInfo(); + } + + @Override + public void setShowAsAction(int actionEnum) { + mNativeItem.setShowAsAction(actionEnum); + } + + @Override + public MenuItem setShowAsActionFlags(int actionEnum) { + mNativeItem.setShowAsActionFlags(actionEnum); + return this; + } + + @Override + public MenuItem setActionView(View view) { + if (view != null && view instanceof CollapsibleActionView) { + view = new CollapsibleActionViewWrapper(view); + } + mNativeItem.setActionView(view); + return this; + } + + @Override + public MenuItem setActionView(int resId) { + //Allow the native menu to inflate the resource + mNativeItem.setActionView(resId); + if (resId != 0) { + //Get newly created view + View view = mNativeItem.getActionView(); + if (view instanceof CollapsibleActionView) { + //Wrap it and re-set it + mNativeItem.setActionView(new CollapsibleActionViewWrapper(view)); + } + } + return this; + } + + @Override + public View getActionView() { + View actionView = mNativeItem.getActionView(); + if (actionView instanceof CollapsibleActionViewWrapper) { + return ((CollapsibleActionViewWrapper)actionView).unwrap(); + } + return actionView; + } + + @Override + public MenuItem setActionProvider(ActionProvider actionProvider) { + mNativeItem.setActionProvider(new ActionProviderWrapper(actionProvider)); + return this; + } + + @Override + public ActionProvider getActionProvider() { + android.view.ActionProvider nativeProvider = mNativeItem.getActionProvider(); + if (nativeProvider != null && nativeProvider instanceof ActionProviderWrapper) { + return ((ActionProviderWrapper)nativeProvider).unwrap(); + } + return null; + } + + @Override + public boolean expandActionView() { + return mNativeItem.expandActionView(); + } + + @Override + public boolean collapseActionView() { + return mNativeItem.collapseActionView(); + } + + @Override + public boolean isActionViewExpanded() { + return mNativeItem.isActionViewExpanded(); + } + + @Override + public MenuItem setOnActionExpandListener(OnActionExpandListener listener) { + mActionExpandListener = listener; + + if (mNativeActionExpandListener == null) { + mNativeActionExpandListener = new android.view.MenuItem.OnActionExpandListener() { + @Override + public boolean onMenuItemActionExpand(android.view.MenuItem menuItem) { + if (mActionExpandListener != null) { + return mActionExpandListener.onMenuItemActionExpand(MenuItemWrapper.this); + } + return false; + } + + @Override + public boolean onMenuItemActionCollapse(android.view.MenuItem menuItem) { + if (mActionExpandListener != null) { + return mActionExpandListener.onMenuItemActionCollapse(MenuItemWrapper.this); + } + return false; + } + }; + + //Register our inner-class as the listener to proxy method calls + mNativeItem.setOnActionExpandListener(mNativeActionExpandListener); + } + + return this; + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java new file mode 100644 index 0000000000..f030de310a --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPopupHelper.java @@ -0,0 +1,376 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.view.menu; + +import java.util.ArrayList; +import android.content.Context; +import android.content.res.Resources; +import android.database.DataSetObserver; +import android.os.Parcelable; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.MeasureSpec; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.FrameLayout; +import android.widget.ListAdapter; +import android.widget.PopupWindow; +import com.actionbarsherlock.R; +import com.actionbarsherlock.internal.view.View_HasStateListenerSupport; +import com.actionbarsherlock.internal.view.View_OnAttachStateChangeListener; +import com.actionbarsherlock.internal.widget.IcsListPopupWindow; +import com.actionbarsherlock.view.MenuItem; + +/** + * Presents a menu as a small, simple popup anchored to another view. + * @hide + */ +public class MenuPopupHelper implements AdapterView.OnItemClickListener, View.OnKeyListener, + ViewTreeObserver.OnGlobalLayoutListener, PopupWindow.OnDismissListener, + View_OnAttachStateChangeListener, MenuPresenter { + //UNUSED private static final String TAG = "MenuPopupHelper"; + + static final int ITEM_LAYOUT = R.layout.abs__popup_menu_item_layout; + + private Context mContext; + private LayoutInflater mInflater; + private IcsListPopupWindow mPopup; + private MenuBuilder mMenu; + private int mPopupMaxWidth; + private View mAnchorView; + private boolean mOverflowOnly; + private ViewTreeObserver mTreeObserver; + + private MenuAdapter mAdapter; + + private Callback mPresenterCallback; + + boolean mForceShowIcon; + + private ViewGroup mMeasureParent; + + public MenuPopupHelper(Context context, MenuBuilder menu) { + this(context, menu, null, false); + } + + public MenuPopupHelper(Context context, MenuBuilder menu, View anchorView) { + this(context, menu, anchorView, false); + } + + public MenuPopupHelper(Context context, MenuBuilder menu, + View anchorView, boolean overflowOnly) { + mContext = context; + mInflater = LayoutInflater.from(context); + mMenu = menu; + mOverflowOnly = overflowOnly; + + final Resources res = context.getResources(); + mPopupMaxWidth = Math.max(res.getDisplayMetrics().widthPixels / 2, + res.getDimensionPixelSize(R.dimen.abs__config_prefDialogWidth)); + + mAnchorView = anchorView; + + menu.addMenuPresenter(this); + } + + public void setAnchorView(View anchor) { + mAnchorView = anchor; + } + + public void setForceShowIcon(boolean forceShow) { + mForceShowIcon = forceShow; + } + + public void show() { + if (!tryShow()) { + throw new IllegalStateException("MenuPopupHelper cannot be used without an anchor"); + } + } + + public boolean tryShow() { + mPopup = new IcsListPopupWindow(mContext, null, R.attr.popupMenuStyle); + mPopup.setOnDismissListener(this); + mPopup.setOnItemClickListener(this); + + mAdapter = new MenuAdapter(mMenu); + mPopup.setAdapter(mAdapter); + mPopup.setModal(true); + + View anchor = mAnchorView; + if (anchor != null) { + final boolean addGlobalListener = mTreeObserver == null; + mTreeObserver = anchor.getViewTreeObserver(); // Refresh to latest + if (addGlobalListener) mTreeObserver.addOnGlobalLayoutListener(this); + ((View_HasStateListenerSupport)anchor).addOnAttachStateChangeListener(this); + mPopup.setAnchorView(anchor); + } else { + return false; + } + + mPopup.setContentWidth(Math.min(measureContentWidth(mAdapter), mPopupMaxWidth)); + mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); + mPopup.show(); + mPopup.getListView().setOnKeyListener(this); + return true; + } + + public void dismiss() { + if (isShowing()) { + mPopup.dismiss(); + } + } + + public void onDismiss() { + mPopup = null; + mMenu.close(); + if (mTreeObserver != null) { + if (!mTreeObserver.isAlive()) mTreeObserver = mAnchorView.getViewTreeObserver(); + mTreeObserver.removeGlobalOnLayoutListener(this); + mTreeObserver = null; + } + ((View_HasStateListenerSupport)mAnchorView).removeOnAttachStateChangeListener(this); + } + + public boolean isShowing() { + return mPopup != null && mPopup.isShowing(); + } + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + MenuAdapter adapter = mAdapter; + adapter.mAdapterMenu.performItemAction(adapter.getItem(position), 0); + } + + public boolean onKey(View v, int keyCode, KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_MENU) { + dismiss(); + return true; + } + return false; + } + + private int measureContentWidth(ListAdapter adapter) { + // Menus don't tend to be long, so this is more sane than it looks. + int width = 0; + View itemView = null; + int itemType = 0; + final int widthMeasureSpec = + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + final int heightMeasureSpec = + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + final int count = adapter.getCount(); + for (int i = 0; i < count; i++) { + final int positionType = adapter.getItemViewType(i); + if (positionType != itemType) { + itemType = positionType; + itemView = null; + } + if (mMeasureParent == null) { + mMeasureParent = new FrameLayout(mContext); + } + itemView = adapter.getView(i, itemView, mMeasureParent); + itemView.measure(widthMeasureSpec, heightMeasureSpec); + width = Math.max(width, itemView.getMeasuredWidth()); + } + return width; + } + + @Override + public void onGlobalLayout() { + if (isShowing()) { + final View anchor = mAnchorView; + if (anchor == null || !anchor.isShown()) { + dismiss(); + } else if (isShowing()) { + // Recompute window size and position + mPopup.show(); + } + } + } + + @Override + public void onViewAttachedToWindow(View v) { + } + + @Override + public void onViewDetachedFromWindow(View v) { + if (mTreeObserver != null) { + if (!mTreeObserver.isAlive()) mTreeObserver = v.getViewTreeObserver(); + mTreeObserver.removeGlobalOnLayoutListener(this); + } + ((View_HasStateListenerSupport)v).removeOnAttachStateChangeListener(this); + } + + @Override + public void initForMenu(Context context, MenuBuilder menu) { + // Don't need to do anything; we added as a presenter in the constructor. + } + + @Override + public MenuView getMenuView(ViewGroup root) { + throw new UnsupportedOperationException("MenuPopupHelpers manage their own views"); + } + + @Override + public void updateMenuView(boolean cleared) { + if (mAdapter != null) mAdapter.notifyDataSetChanged(); + } + + @Override + public void setCallback(Callback cb) { + mPresenterCallback = cb; + } + + @Override + public boolean onSubMenuSelected(SubMenuBuilder subMenu) { + if (subMenu.hasVisibleItems()) { + MenuPopupHelper subPopup = new MenuPopupHelper(mContext, subMenu, mAnchorView, false); + subPopup.setCallback(mPresenterCallback); + + boolean preserveIconSpacing = false; + final int count = subMenu.size(); + for (int i = 0; i < count; i++) { + MenuItem childItem = subMenu.getItem(i); + if (childItem.isVisible() && childItem.getIcon() != null) { + preserveIconSpacing = true; + break; + } + } + subPopup.setForceShowIcon(preserveIconSpacing); + + if (subPopup.tryShow()) { + if (mPresenterCallback != null) { + mPresenterCallback.onOpenSubMenu(subMenu); + } + return true; + } + } + return false; + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + // Only care about the (sub)menu we're presenting. + if (menu != mMenu) return; + + dismiss(); + if (mPresenterCallback != null) { + mPresenterCallback.onCloseMenu(menu, allMenusAreClosing); + } + } + + @Override + public boolean flagActionItems() { + return false; + } + + public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) { + return false; + } + + public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) { + return false; + } + + @Override + public int getId() { + return 0; + } + + @Override + public Parcelable onSaveInstanceState() { + return null; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + } + + private class MenuAdapter extends BaseAdapter { + private MenuBuilder mAdapterMenu; + private int mExpandedIndex = -1; + + public MenuAdapter(MenuBuilder menu) { + mAdapterMenu = menu; + registerDataSetObserver(new ExpandedIndexObserver()); + findExpandedIndex(); + } + + public int getCount() { + ArrayList items = mOverflowOnly ? + mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems(); + if (mExpandedIndex < 0) { + return items.size(); + } + return items.size() - 1; + } + + public MenuItemImpl getItem(int position) { + ArrayList items = mOverflowOnly ? + mAdapterMenu.getNonActionItems() : mAdapterMenu.getVisibleItems(); + if (mExpandedIndex >= 0 && position >= mExpandedIndex) { + position++; + } + return items.get(position); + } + + public long getItemId(int position) { + // Since a menu item's ID is optional, we'll use the position as an + // ID for the item in the AdapterView + return position; + } + + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = mInflater.inflate(ITEM_LAYOUT, parent, false); + } + + MenuView.ItemView itemView = (MenuView.ItemView) convertView; + if (mForceShowIcon) { + ((ListMenuItemView) convertView).setForceShowIcon(true); + } + itemView.initialize(getItem(position), 0); + return convertView; + } + + void findExpandedIndex() { + final MenuItemImpl expandedItem = mMenu.getExpandedItem(); + if (expandedItem != null) { + final ArrayList items = mMenu.getNonActionItems(); + final int count = items.size(); + for (int i = 0; i < count; i++) { + final MenuItemImpl item = items.get(i); + if (item == expandedItem) { + mExpandedIndex = i; + return; + } + } + } + mExpandedIndex = -1; + } + } + + private class ExpandedIndexObserver extends DataSetObserver { + @Override + public void onChanged() { + mAdapter.findExpandedIndex(); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java new file mode 100644 index 0000000000..c3f35472c5 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuPresenter.java @@ -0,0 +1,148 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.view.menu; + +import android.content.Context; +import android.os.Parcelable; +import android.view.ViewGroup; + +/** + * A MenuPresenter is responsible for building views for a Menu object. + * It takes over some responsibility from the old style monolithic MenuBuilder class. + */ +public interface MenuPresenter { + /** + * Called by menu implementation to notify another component of open/close events. + */ + public interface Callback { + /** + * Called when a menu is closing. + * @param menu + * @param allMenusAreClosing + */ + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing); + + /** + * Called when a submenu opens. Useful for notifying the application + * of menu state so that it does not attempt to hide the action bar + * while a submenu is open or similar. + * + * @param subMenu Submenu currently being opened + * @return true if the Callback will handle presenting the submenu, false if + * the presenter should attempt to do so. + */ + public boolean onOpenSubMenu(MenuBuilder subMenu); + } + + /** + * Initialize this presenter for the given context and menu. + * This method is called by MenuBuilder when a presenter is + * added. See {@link MenuBuilder#addMenuPresenter(MenuPresenter)} + * + * @param context Context for this presenter; used for view creation and resource management + * @param menu Menu to host + */ + public void initForMenu(Context context, MenuBuilder menu); + + /** + * Retrieve a MenuView to display the menu specified in + * {@link #initForMenu(Context, Menu)}. + * + * @param root Intended parent of the MenuView. + * @return A freshly created MenuView. + */ + public MenuView getMenuView(ViewGroup root); + + /** + * Update the menu UI in response to a change. Called by + * MenuBuilder during the normal course of operation. + * + * @param cleared true if the menu was entirely cleared + */ + public void updateMenuView(boolean cleared); + + /** + * Set a callback object that will be notified of menu events + * related to this specific presentation. + * @param cb Callback that will be notified of future events + */ + public void setCallback(Callback cb); + + /** + * Called by Menu implementations to indicate that a submenu item + * has been selected. An active Callback should be notified, and + * if applicable the presenter should present the submenu. + * + * @param subMenu SubMenu being opened + * @return true if the the event was handled, false otherwise. + */ + public boolean onSubMenuSelected(SubMenuBuilder subMenu); + + /** + * Called by Menu implementations to indicate that a menu or submenu is + * closing. Presenter implementations should close the representation + * of the menu indicated as necessary and notify a registered callback. + * + * @param menu Menu or submenu that is closing. + * @param allMenusAreClosing True if all associated menus are closing. + */ + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing); + + /** + * Called by Menu implementations to flag items that will be shown as actions. + * @return true if this presenter changed the action status of any items. + */ + public boolean flagActionItems(); + + /** + * Called when a menu item with a collapsable action view should expand its action view. + * + * @param menu Menu containing the item to be expanded + * @param item Item to be expanded + * @return true if this presenter expanded the action view, false otherwise. + */ + public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item); + + /** + * Called when a menu item with a collapsable action view should collapse its action view. + * + * @param menu Menu containing the item to be collapsed + * @param item Item to be collapsed + * @return true if this presenter collapsed the action view, false otherwise. + */ + public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item); + + /** + * Returns an ID for determining how to save/restore instance state. + * @return a valid ID value. + */ + public int getId(); + + /** + * Returns a Parcelable describing the current state of the presenter. + * It will be passed to the {@link #onRestoreInstanceState(Parcelable)} + * method of the presenter sharing the same ID later. + * @return The saved instance state + */ + public Parcelable onSaveInstanceState(); + + /** + * Supplies the previously saved instance state to be restored. + * @param state The previously saved instance state + */ + public void onRestoreInstanceState(Parcelable state); +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuView.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuView.java new file mode 100644 index 0000000000..323ba2d88d --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuView.java @@ -0,0 +1,120 @@ +/* + * Copyright (C) 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. + */ + +package com.actionbarsherlock.internal.view.menu; + +import android.graphics.drawable.Drawable; + +/** + * Minimal interface for a menu view. {@link #initialize(MenuBuilder)} must be called for the + * menu to be functional. + * + * @hide + */ +public interface MenuView { + /** + * Initializes the menu to the given menu. This should be called after the + * view is inflated. + * + * @param menu The menu that this MenuView should display. + */ + public void initialize(MenuBuilder menu); + + /** + * Returns the default animations to be used for this menu when entering/exiting. + * @return A resource ID for the default animations to be used for this menu. + */ + public int getWindowAnimations(); + + /** + * Minimal interface for a menu item view. {@link #initialize(MenuItemImpl, int)} must be called + * for the item to be functional. + */ + public interface ItemView { + /** + * Initializes with the provided MenuItemData. This should be called after the view is + * inflated. + * @param itemData The item that this ItemView should display. + * @param menuType The type of this menu, one of + * {@link MenuBuilder#TYPE_ICON}, {@link MenuBuilder#TYPE_EXPANDED}, + * {@link MenuBuilder#TYPE_DIALOG}). + */ + public void initialize(MenuItemImpl itemData, int menuType); + + /** + * Gets the item data that this view is displaying. + * @return the item data, or null if there is not one + */ + public MenuItemImpl getItemData(); + + /** + * Sets the title of the item view. + * @param title The title to set. + */ + public void setTitle(CharSequence title); + + /** + * Sets the enabled state of the item view. + * @param enabled Whether the item view should be enabled. + */ + public void setEnabled(boolean enabled); + + /** + * Displays the checkbox for the item view. This does not ensure the item view will be + * checked, for that use {@link #setChecked}. + * @param checkable Whether to display the checkbox or to hide it + */ + public void setCheckable(boolean checkable); + + /** + * Checks the checkbox for the item view. If the checkbox is hidden, it will NOT be + * made visible, call {@link #setCheckable(boolean)} for that. + * @param checked Whether the checkbox should be checked + */ + public void setChecked(boolean checked); + + /** + * Sets the shortcut for the item. + * @param showShortcut Whether a shortcut should be shown(if false, the value of + * shortcutKey should be ignored). + * @param shortcutKey The shortcut key that should be shown on the ItemView. + */ + public void setShortcut(boolean showShortcut, char shortcutKey); + + /** + * Set the icon of this item view. + * @param icon The icon of this item. null to hide the icon. + */ + public void setIcon(Drawable icon); + + /** + * Whether this item view prefers displaying the condensed title rather + * than the normal title. If a condensed title is not available, the + * normal title will be used. + * + * @return Whether this item view prefers displaying the condensed + * title. + */ + public boolean prefersCondensedTitle(); + + /** + * Whether this item view shows an icon. + * + * @return Whether this item view shows an icon. + */ + public boolean showsIcon(); + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java new file mode 100644 index 0000000000..3d4dd42fda --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/MenuWrapper.java @@ -0,0 +1,185 @@ +package com.actionbarsherlock.internal.view.menu; + +import java.util.WeakHashMap; +import android.content.ComponentName; +import android.content.Intent; +import android.view.KeyEvent; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; +import com.actionbarsherlock.view.SubMenu; + +public class MenuWrapper implements Menu { + private final android.view.Menu mNativeMenu; + + private final WeakHashMap mNativeMap = + new WeakHashMap(); + + + public MenuWrapper(android.view.Menu nativeMenu) { + mNativeMenu = nativeMenu; + } + + public android.view.Menu unwrap() { + return mNativeMenu; + } + + private MenuItem addInternal(android.view.MenuItem nativeItem) { + MenuItem item = new MenuItemWrapper(nativeItem); + mNativeMap.put(nativeItem, item); + return item; + } + + @Override + public MenuItem add(CharSequence title) { + return addInternal(mNativeMenu.add(title)); + } + + @Override + public MenuItem add(int titleRes) { + return addInternal(mNativeMenu.add(titleRes)); + } + + @Override + public MenuItem add(int groupId, int itemId, int order, CharSequence title) { + return addInternal(mNativeMenu.add(groupId, itemId, order, title)); + } + + @Override + public MenuItem add(int groupId, int itemId, int order, int titleRes) { + return addInternal(mNativeMenu.add(groupId, itemId, order, titleRes)); + } + + private SubMenu addInternal(android.view.SubMenu nativeSubMenu) { + SubMenu subMenu = new SubMenuWrapper(nativeSubMenu); + android.view.MenuItem nativeItem = nativeSubMenu.getItem(); + MenuItem item = subMenu.getItem(); + mNativeMap.put(nativeItem, item); + return subMenu; + } + + @Override + public SubMenu addSubMenu(CharSequence title) { + return addInternal(mNativeMenu.addSubMenu(title)); + } + + @Override + public SubMenu addSubMenu(int titleRes) { + return addInternal(mNativeMenu.addSubMenu(titleRes)); + } + + @Override + public SubMenu addSubMenu(int groupId, int itemId, int order, CharSequence title) { + return addInternal(mNativeMenu.addSubMenu(groupId, itemId, order, title)); + } + + @Override + public SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes) { + return addInternal(mNativeMenu.addSubMenu(groupId, itemId, order, titleRes)); + } + + @Override + public int addIntentOptions(int groupId, int itemId, int order, ComponentName caller, Intent[] specifics, Intent intent, int flags, MenuItem[] outSpecificItems) { + int result; + if (outSpecificItems != null) { + android.view.MenuItem[] nativeOutItems = new android.view.MenuItem[outSpecificItems.length]; + result = mNativeMenu.addIntentOptions(groupId, itemId, order, caller, specifics, intent, flags, nativeOutItems); + for (int i = 0, length = outSpecificItems.length; i < length; i++) { + outSpecificItems[i] = new MenuItemWrapper(nativeOutItems[i]); + } + } else { + result = mNativeMenu.addIntentOptions(groupId, itemId, order, caller, specifics, intent, flags, null); + } + return result; + } + + @Override + public void removeItem(int id) { + mNativeMenu.removeItem(id); + } + + @Override + public void removeGroup(int groupId) { + mNativeMenu.removeGroup(groupId); + } + + @Override + public void clear() { + mNativeMap.clear(); + mNativeMenu.clear(); + } + + @Override + public void setGroupCheckable(int group, boolean checkable, boolean exclusive) { + mNativeMenu.setGroupCheckable(group, checkable, exclusive); + } + + @Override + public void setGroupVisible(int group, boolean visible) { + mNativeMenu.setGroupVisible(group, visible); + } + + @Override + public void setGroupEnabled(int group, boolean enabled) { + mNativeMenu.setGroupEnabled(group, enabled); + } + + @Override + public boolean hasVisibleItems() { + return mNativeMenu.hasVisibleItems(); + } + + @Override + public MenuItem findItem(int id) { + android.view.MenuItem nativeItem = mNativeMenu.findItem(id); + return findItem(nativeItem); + } + + public MenuItem findItem(android.view.MenuItem nativeItem) { + if (nativeItem == null) { + return null; + } + + MenuItem wrapped = mNativeMap.get(nativeItem); + if (wrapped != null) { + return wrapped; + } + + return addInternal(nativeItem); + } + + @Override + public int size() { + return mNativeMenu.size(); + } + + @Override + public MenuItem getItem(int index) { + android.view.MenuItem nativeItem = mNativeMenu.getItem(index); + return findItem(nativeItem); + } + + @Override + public void close() { + mNativeMenu.close(); + } + + @Override + public boolean performShortcut(int keyCode, KeyEvent event, int flags) { + return mNativeMenu.performShortcut(keyCode, event, flags); + } + + @Override + public boolean isShortcutKey(int keyCode, KeyEvent event) { + return mNativeMenu.isShortcutKey(keyCode, event); + } + + @Override + public boolean performIdentifierAction(int id, int flags) { + return mNativeMenu.performIdentifierAction(id, flags); + } + + @Override + public void setQwertyMode(boolean isQwerty) { + mNativeMenu.setQwertyMode(isQwerty); + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java new file mode 100644 index 0000000000..6679cf3860 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuBuilder.java @@ -0,0 +1,134 @@ +/* + * Copyright (C) 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. + */ + +package com.actionbarsherlock.internal.view.menu; + +import android.content.Context; +import android.graphics.drawable.Drawable; +import android.view.View; + +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; +import com.actionbarsherlock.view.SubMenu; + +/** + * The model for a sub menu, which is an extension of the menu. Most methods are proxied to + * the parent menu. + */ +public class SubMenuBuilder extends MenuBuilder implements SubMenu { + private MenuBuilder mParentMenu; + private MenuItemImpl mItem; + + public SubMenuBuilder(Context context, MenuBuilder parentMenu, MenuItemImpl item) { + super(context); + + mParentMenu = parentMenu; + mItem = item; + } + + @Override + public void setQwertyMode(boolean isQwerty) { + mParentMenu.setQwertyMode(isQwerty); + } + + @Override + public boolean isQwertyMode() { + return mParentMenu.isQwertyMode(); + } + + @Override + public void setShortcutsVisible(boolean shortcutsVisible) { + mParentMenu.setShortcutsVisible(shortcutsVisible); + } + + @Override + public boolean isShortcutsVisible() { + return mParentMenu.isShortcutsVisible(); + } + + public Menu getParentMenu() { + return mParentMenu; + } + + public MenuItem getItem() { + return mItem; + } + + @Override + public void setCallback(Callback callback) { + mParentMenu.setCallback(callback); + } + + @Override + public MenuBuilder getRootMenu() { + return mParentMenu; + } + + @Override + boolean dispatchMenuItemSelected(MenuBuilder menu, MenuItem item) { + return super.dispatchMenuItemSelected(menu, item) || + mParentMenu.dispatchMenuItemSelected(menu, item); + } + + public SubMenu setIcon(Drawable icon) { + mItem.setIcon(icon); + return this; + } + + public SubMenu setIcon(int iconRes) { + mItem.setIcon(iconRes); + return this; + } + + public SubMenu setHeaderIcon(Drawable icon) { + return (SubMenu) super.setHeaderIconInt(icon); + } + + public SubMenu setHeaderIcon(int iconRes) { + return (SubMenu) super.setHeaderIconInt(iconRes); + } + + public SubMenu setHeaderTitle(CharSequence title) { + return (SubMenu) super.setHeaderTitleInt(title); + } + + public SubMenu setHeaderTitle(int titleRes) { + return (SubMenu) super.setHeaderTitleInt(titleRes); + } + + public SubMenu setHeaderView(View view) { + return (SubMenu) super.setHeaderViewInt(view); + } + + @Override + public boolean expandItemActionView(MenuItemImpl item) { + return mParentMenu.expandItemActionView(item); + } + + @Override + public boolean collapseItemActionView(MenuItemImpl item) { + return mParentMenu.collapseItemActionView(item); + } + + @Override + public String getActionViewStatesKey() { + final int itemId = mItem != null ? mItem.getItemId() : 0; + if (itemId == 0) { + return null; + } + return super.getActionViewStatesKey() + ":" + itemId; + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java new file mode 100644 index 0000000000..7d307acb10 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/view/menu/SubMenuWrapper.java @@ -0,0 +1,72 @@ +package com.actionbarsherlock.internal.view.menu; + +import android.graphics.drawable.Drawable; +import android.view.View; +import com.actionbarsherlock.view.MenuItem; +import com.actionbarsherlock.view.SubMenu; + +public class SubMenuWrapper extends MenuWrapper implements SubMenu { + private final android.view.SubMenu mNativeSubMenu; + private MenuItem mItem = null; + + public SubMenuWrapper(android.view.SubMenu nativeSubMenu) { + super(nativeSubMenu); + mNativeSubMenu = nativeSubMenu; + } + + + @Override + public SubMenu setHeaderTitle(int titleRes) { + mNativeSubMenu.setHeaderTitle(titleRes); + return this; + } + + @Override + public SubMenu setHeaderTitle(CharSequence title) { + mNativeSubMenu.setHeaderTitle(title); + return this; + } + + @Override + public SubMenu setHeaderIcon(int iconRes) { + mNativeSubMenu.setHeaderIcon(iconRes); + return this; + } + + @Override + public SubMenu setHeaderIcon(Drawable icon) { + mNativeSubMenu.setHeaderIcon(icon); + return this; + } + + @Override + public SubMenu setHeaderView(View view) { + mNativeSubMenu.setHeaderView(view); + return this; + } + + @Override + public void clearHeader() { + mNativeSubMenu.clearHeader(); + } + + @Override + public SubMenu setIcon(int iconRes) { + mNativeSubMenu.setIcon(iconRes); + return this; + } + + @Override + public SubMenu setIcon(Drawable icon) { + mNativeSubMenu.setIcon(icon); + return this; + } + + @Override + public MenuItem getItem() { + if (mItem == null) { + mItem = new MenuItemWrapper(mNativeSubMenu.getItem()); + } + return mItem; + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/AbsActionBarView.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/AbsActionBarView.java new file mode 100644 index 0000000000..3a4a446756 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/AbsActionBarView.java @@ -0,0 +1,291 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.actionbarsherlock.internal.widget; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.os.Build; +import android.util.AttributeSet; +import android.view.View; +import android.view.animation.DecelerateInterpolator; +import android.view.animation.Interpolator; + +import com.actionbarsherlock.R; +import com.actionbarsherlock.internal.nineoldandroids.animation.Animator; +import com.actionbarsherlock.internal.nineoldandroids.animation.AnimatorSet; +import com.actionbarsherlock.internal.nineoldandroids.animation.ObjectAnimator; +import com.actionbarsherlock.internal.nineoldandroids.view.NineViewGroup; +import com.actionbarsherlock.internal.view.menu.ActionMenuPresenter; +import com.actionbarsherlock.internal.view.menu.ActionMenuView; + +import static com.actionbarsherlock.internal.ResourcesCompat.getResources_getBoolean; + +public abstract class AbsActionBarView extends NineViewGroup { + protected ActionMenuView mMenuView; + protected ActionMenuPresenter mActionMenuPresenter; + protected ActionBarContainer mSplitView; + protected boolean mSplitActionBar; + protected boolean mSplitWhenNarrow; + protected int mContentHeight; + + final Context mContext; + + protected Animator mVisibilityAnim; + protected final VisibilityAnimListener mVisAnimListener = new VisibilityAnimListener(); + + private static final /*Time*/Interpolator sAlphaInterpolator = new DecelerateInterpolator(); + + private static final int FADE_DURATION = 200; + + public AbsActionBarView(Context context) { + super(context); + mContext = context; + } + + public AbsActionBarView(Context context, AttributeSet attrs) { + super(context, attrs); + mContext = context; + } + + public AbsActionBarView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mContext = context; + } + + /* + * Must be public so we can dispatch pre-2.2 via ActionBarImpl. + */ + @Override + public void onConfigurationChanged(Configuration newConfig) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) { + super.onConfigurationChanged(newConfig); + } else if (mMenuView != null) { + mMenuView.onConfigurationChanged(newConfig); + } + + // Action bar can change size on configuration changes. + // Reread the desired height from the theme-specified style. + TypedArray a = getContext().obtainStyledAttributes(null, R.styleable.SherlockActionBar, + R.attr.actionBarStyle, 0); + setContentHeight(a.getLayoutDimension(R.styleable.SherlockActionBar_height, 0)); + a.recycle(); + if (mSplitWhenNarrow) { + setSplitActionBar(getResources_getBoolean(getContext(), + R.bool.abs__split_action_bar_is_narrow)); + } + if (mActionMenuPresenter != null) { + mActionMenuPresenter.onConfigurationChanged(newConfig); + } + } + + /** + * Sets whether the bar should be split right now, no questions asked. + * @param split true if the bar should split + */ + public void setSplitActionBar(boolean split) { + mSplitActionBar = split; + } + + /** + * Sets whether the bar should split if we enter a narrow screen configuration. + * @param splitWhenNarrow true if the bar should check to split after a config change + */ + public void setSplitWhenNarrow(boolean splitWhenNarrow) { + mSplitWhenNarrow = splitWhenNarrow; + } + + public void setContentHeight(int height) { + mContentHeight = height; + requestLayout(); + } + + public int getContentHeight() { + return mContentHeight; + } + + public void setSplitView(ActionBarContainer splitView) { + mSplitView = splitView; + } + + /** + * @return Current visibility or if animating, the visibility being animated to. + */ + public int getAnimatedVisibility() { + if (mVisibilityAnim != null) { + return mVisAnimListener.mFinalVisibility; + } + return getVisibility(); + } + + public void animateToVisibility(int visibility) { + if (mVisibilityAnim != null) { + mVisibilityAnim.cancel(); + } + if (visibility == VISIBLE) { + if (getVisibility() != VISIBLE) { + setAlpha(0); + if (mSplitView != null && mMenuView != null) { + mMenuView.setAlpha(0); + } + } + ObjectAnimator anim = ObjectAnimator.ofFloat(this, "alpha", 1); + anim.setDuration(FADE_DURATION); + anim.setInterpolator(sAlphaInterpolator); + if (mSplitView != null && mMenuView != null) { + AnimatorSet set = new AnimatorSet(); + ObjectAnimator splitAnim = ObjectAnimator.ofFloat(mMenuView, "alpha", 1); + splitAnim.setDuration(FADE_DURATION); + set.addListener(mVisAnimListener.withFinalVisibility(visibility)); + set.play(anim).with(splitAnim); + set.start(); + } else { + anim.addListener(mVisAnimListener.withFinalVisibility(visibility)); + anim.start(); + } + } else { + ObjectAnimator anim = ObjectAnimator.ofFloat(this, "alpha", 0); + anim.setDuration(FADE_DURATION); + anim.setInterpolator(sAlphaInterpolator); + if (mSplitView != null && mMenuView != null) { + AnimatorSet set = new AnimatorSet(); + ObjectAnimator splitAnim = ObjectAnimator.ofFloat(mMenuView, "alpha", 0); + splitAnim.setDuration(FADE_DURATION); + set.addListener(mVisAnimListener.withFinalVisibility(visibility)); + set.play(anim).with(splitAnim); + set.start(); + } else { + anim.addListener(mVisAnimListener.withFinalVisibility(visibility)); + anim.start(); + } + } + } + + @Override + public void setVisibility(int visibility) { + if (mVisibilityAnim != null) { + mVisibilityAnim.end(); + } + super.setVisibility(visibility); + } + + public boolean showOverflowMenu() { + if (mActionMenuPresenter != null) { + return mActionMenuPresenter.showOverflowMenu(); + } + return false; + } + + public void postShowOverflowMenu() { + post(new Runnable() { + public void run() { + showOverflowMenu(); + } + }); + } + + public boolean hideOverflowMenu() { + if (mActionMenuPresenter != null) { + return mActionMenuPresenter.hideOverflowMenu(); + } + return false; + } + + public boolean isOverflowMenuShowing() { + if (mActionMenuPresenter != null) { + return mActionMenuPresenter.isOverflowMenuShowing(); + } + return false; + } + + public boolean isOverflowReserved() { + return mActionMenuPresenter != null && mActionMenuPresenter.isOverflowReserved(); + } + + public void dismissPopupMenus() { + if (mActionMenuPresenter != null) { + mActionMenuPresenter.dismissPopupMenus(); + } + } + + protected int measureChildView(View child, int availableWidth, int childSpecHeight, + int spacing) { + child.measure(MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), + childSpecHeight); + + availableWidth -= child.getMeasuredWidth(); + availableWidth -= spacing; + + return Math.max(0, availableWidth); + } + + protected int positionChild(View child, int x, int y, int contentHeight) { + int childWidth = child.getMeasuredWidth(); + int childHeight = child.getMeasuredHeight(); + int childTop = y + (contentHeight - childHeight) / 2; + + child.layout(x, childTop, x + childWidth, childTop + childHeight); + + return childWidth; + } + + protected int positionChildInverse(View child, int x, int y, int contentHeight) { + int childWidth = child.getMeasuredWidth(); + int childHeight = child.getMeasuredHeight(); + int childTop = y + (contentHeight - childHeight) / 2; + + child.layout(x - childWidth, childTop, x, childTop + childHeight); + + return childWidth; + } + + protected class VisibilityAnimListener implements Animator.AnimatorListener { + private boolean mCanceled = false; + int mFinalVisibility; + + public VisibilityAnimListener withFinalVisibility(int visibility) { + mFinalVisibility = visibility; + return this; + } + + @Override + public void onAnimationStart(Animator animation) { + setVisibility(VISIBLE); + mVisibilityAnim = animation; + mCanceled = false; + } + + @Override + public void onAnimationEnd(Animator animation) { + if (mCanceled) return; + + mVisibilityAnim = null; + setVisibility(mFinalVisibility); + if (mSplitView != null && mMenuView != null) { + mMenuView.setVisibility(mFinalVisibility); + } + } + + @Override + public void onAnimationCancel(Animator animation) { + mCanceled = true; + } + + @Override + public void onAnimationRepeat(Animator animation) { + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java new file mode 100644 index 0000000000..1d9c68b37d --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContainer.java @@ -0,0 +1,258 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.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; +import android.os.Build; +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; + +/** + * This class acts as a container for the action bar view and action mode context views. + * It applies special styles as needed to help handle animated transitions between them. + * @hide + */ +public class ActionBarContainer extends NineFrameLayout { + private boolean mIsTransitioning; + private View mTabContainer; + private ActionBarView mActionBarView; + + private Drawable mBackground; + private Drawable mStackedBackground; + private Drawable mSplitBackground; + private boolean mIsSplit; + private boolean mIsStacked; + + public ActionBarContainer(Context context) { + this(context, null); + } + + public ActionBarContainer(Context context, AttributeSet attrs) { + super(context, attrs); + + setBackgroundDrawable(null); + + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.SherlockActionBar); + mBackground = a.getDrawable(R.styleable.SherlockActionBar_background); + mStackedBackground = a.getDrawable( + R.styleable.SherlockActionBar_backgroundStacked); + + //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); + } + + if (getId() == R.id.abs__split_action_bar) { + mIsSplit = true; + mSplitBackground = a.getDrawable( + R.styleable.SherlockActionBar_backgroundSplit); + } + a.recycle(); + + setWillNotDraw(mIsSplit ? mSplitBackground == null : + mBackground == null && mStackedBackground == null); + } + + @Override + public void onFinishInflate() { + super.onFinishInflate(); + mActionBarView = (ActionBarView) findViewById(R.id.abs__action_bar); + } + + public void setPrimaryBackground(Drawable bg) { + mBackground = bg; + invalidate(); + } + + public void setStackedBackground(Drawable bg) { + mStackedBackground = bg; + invalidate(); + } + + public void setSplitBackground(Drawable bg) { + mSplitBackground = bg; + invalidate(); + } + + /** + * Set the action bar into a "transitioning" state. While transitioning + * the bar will block focus and touch from all of its descendants. This + * prevents the user from interacting with the bar while it is animating + * in or out. + * + * @param isTransitioning true if the bar is currently transitioning, false otherwise. + */ + public void setTransitioning(boolean isTransitioning) { + mIsTransitioning = isTransitioning; + setDescendantFocusability(isTransitioning ? FOCUS_BLOCK_DESCENDANTS + : FOCUS_AFTER_DESCENDANTS); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + return mIsTransitioning || super.onInterceptTouchEvent(ev); + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + super.onTouchEvent(ev); + + // An action bar always eats touch events. + return true; + } + + @Override + public boolean onHoverEvent(MotionEvent ev) { + super.onHoverEvent(ev); + + // An action bar always eats hover events. + return true; + } + + public void setTabContainer(ScrollingTabContainerView tabView) { + if (mTabContainer != null) { + removeView(mTabContainer); + } + mTabContainer = tabView; + if (tabView != null) { + addView(tabView); + final ViewGroup.LayoutParams lp = tabView.getLayoutParams(); + lp.width = LayoutParams.MATCH_PARENT; + lp.height = LayoutParams.WRAP_CONTENT; + tabView.setAllowCollapse(false); + } + } + + public View getTabContainer() { + return mTabContainer; + } + + @Override + public void onDraw(Canvas canvas) { + if (getWidth() == 0 || getHeight() == 0) { + return; + } + + if (mIsSplit) { + if (mSplitBackground != null) mSplitBackground.draw(canvas); + } else { + if (mBackground != null) { + mBackground.draw(canvas); + } + if (mStackedBackground != null && mIsStacked) { + mStackedBackground.draw(canvas); + } + } + } + + //This causes the animation reflection to fail on pre-HC platforms + //@Override + //public android.view.ActionMode startActionModeForChild(View child, android.view.ActionMode.Callback callback) { + // // No starting an action mode for an action bar child! (Where would it go?) + // return null; + //} + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + if (mActionBarView == null) return; + + final LayoutParams lp = (LayoutParams) mActionBarView.getLayoutParams(); + final int actionBarViewHeight = mActionBarView.isCollapsed() ? 0 : + mActionBarView.getMeasuredHeight() + lp.topMargin + lp.bottomMargin; + + if (mTabContainer != null && mTabContainer.getVisibility() != GONE) { + final int mode = MeasureSpec.getMode(heightMeasureSpec); + if (mode == MeasureSpec.AT_MOST) { + final int maxHeight = MeasureSpec.getSize(heightMeasureSpec); + setMeasuredDimension(getMeasuredWidth(), + Math.min(actionBarViewHeight + mTabContainer.getMeasuredHeight(), + maxHeight)); + } + } + } + + @Override + public void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + + final boolean hasTabs = mTabContainer != null && mTabContainer.getVisibility() != GONE; + + if (mTabContainer != null && mTabContainer.getVisibility() != GONE) { + final int containerHeight = getMeasuredHeight(); + final int tabHeight = mTabContainer.getMeasuredHeight(); + + if ((mActionBarView.getDisplayOptions() & ActionBar.DISPLAY_SHOW_HOME) == 0) { + // Not showing home, put tabs on top. + final int count = getChildCount(); + for (int i = 0; i < count; i++) { + final View child = getChildAt(i); + + if (child == mTabContainer) continue; + + if (!mActionBarView.isCollapsed()) { + child.offsetTopAndBottom(tabHeight); + } + } + mTabContainer.layout(l, 0, r, tabHeight); + } else { + mTabContainer.layout(l, containerHeight - tabHeight, r, containerHeight); + } + } + + boolean needsInvalidate = false; + if (mIsSplit) { + if (mSplitBackground != null) { + mSplitBackground.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight()); + needsInvalidate = true; + } + } else { + if (mBackground != null) { + mBackground.setBounds(mActionBarView.getLeft(), mActionBarView.getTop(), + mActionBarView.getRight(), mActionBarView.getBottom()); + needsInvalidate = true; + } + if ((mIsStacked = hasTabs && mStackedBackground != null)) { + mStackedBackground.setBounds(mTabContainer.getLeft(), mTabContainer.getTop(), + mTabContainer.getRight(), mTabContainer.getBottom()); + needsInvalidate = true; + } + } + + if (needsInvalidate) { + invalidate(); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContextView.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContextView.java new file mode 100644 index 0000000000..9ec250f387 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarContextView.java @@ -0,0 +1,518 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.actionbarsherlock.internal.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; +import android.view.animation.DecelerateInterpolator; +import android.widget.LinearLayout; +import android.widget.TextView; + +import com.actionbarsherlock.R; +import com.actionbarsherlock.internal.nineoldandroids.animation.Animator; +import com.actionbarsherlock.internal.nineoldandroids.animation.Animator.AnimatorListener; +import com.actionbarsherlock.internal.nineoldandroids.animation.AnimatorSet; +import com.actionbarsherlock.internal.nineoldandroids.animation.ObjectAnimator; +import com.actionbarsherlock.internal.nineoldandroids.view.animation.AnimatorProxy; +import com.actionbarsherlock.internal.nineoldandroids.widget.NineLinearLayout; +import com.actionbarsherlock.internal.view.menu.ActionMenuPresenter; +import com.actionbarsherlock.internal.view.menu.ActionMenuView; +import com.actionbarsherlock.internal.view.menu.MenuBuilder; +import com.actionbarsherlock.view.ActionMode; + +/** + * @hide + */ +public class ActionBarContextView extends AbsActionBarView implements AnimatorListener { + //UNUSED private static final String TAG = "ActionBarContextView"; + + private CharSequence mTitle; + private CharSequence mSubtitle; + + private NineLinearLayout mClose; + private View mCustomView; + private LinearLayout mTitleLayout; + private TextView mTitleView; + private TextView mSubtitleView; + private int mTitleStyleRes; + private int mSubtitleStyleRes; + private Drawable mSplitBackground; + + private Animator mCurrentAnimation; + private boolean mAnimateInOnLayout; + private int mAnimationMode; + + private static final int ANIMATE_IDLE = 0; + private static final int ANIMATE_IN = 1; + private static final int ANIMATE_OUT = 2; + + public ActionBarContextView(Context context) { + this(context, null); + } + + public ActionBarContextView(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.actionModeStyle); + } + + public ActionBarContextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SherlockActionMode, defStyle, 0); + setBackgroundDrawable(a.getDrawable( + R.styleable.SherlockActionMode_background)); + mTitleStyleRes = a.getResourceId( + R.styleable.SherlockActionMode_titleTextStyle, 0); + mSubtitleStyleRes = a.getResourceId( + R.styleable.SherlockActionMode_subtitleTextStyle, 0); + + mContentHeight = a.getLayoutDimension( + R.styleable.SherlockActionMode_height, 0); + + mSplitBackground = a.getDrawable( + R.styleable.SherlockActionMode_backgroundSplit); + + a.recycle(); + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (mActionMenuPresenter != null) { + mActionMenuPresenter.hideOverflowMenu(); + mActionMenuPresenter.hideSubMenus(); + } + } + + @Override + public void setSplitActionBar(boolean split) { + if (mSplitActionBar != split) { + if (mActionMenuPresenter != null) { + // Mode is already active; move everything over and adjust the menu itself. + final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.MATCH_PARENT); + if (!split) { + mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); + mMenuView.setBackgroundDrawable(null); + final ViewGroup oldParent = (ViewGroup) mMenuView.getParent(); + if (oldParent != null) oldParent.removeView(mMenuView); + addView(mMenuView, layoutParams); + } else { + // Allow full screen width in split mode. + mActionMenuPresenter.setWidthLimit( + getContext().getResources().getDisplayMetrics().widthPixels, true); + // No limit to the item count; use whatever will fit. + mActionMenuPresenter.setItemLimit(Integer.MAX_VALUE); + // Span the whole width + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = mContentHeight; + mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); + mMenuView.setBackgroundDrawable(mSplitBackground); + final ViewGroup oldParent = (ViewGroup) mMenuView.getParent(); + if (oldParent != null) oldParent.removeView(mMenuView); + mSplitView.addView(mMenuView, layoutParams); + } + } + super.setSplitActionBar(split); + } + } + + public void setContentHeight(int height) { + mContentHeight = height; + } + + public void setCustomView(View view) { + if (mCustomView != null) { + removeView(mCustomView); + } + mCustomView = view; + if (mTitleLayout != null) { + removeView(mTitleLayout); + mTitleLayout = null; + } + if (view != null) { + addView(view); + } + requestLayout(); + } + + public void setTitle(CharSequence title) { + mTitle = title; + initTitle(); + } + + public void setSubtitle(CharSequence subtitle) { + mSubtitle = subtitle; + initTitle(); + } + + public CharSequence getTitle() { + return mTitle; + } + + public CharSequence getSubtitle() { + return mSubtitle; + } + + private void initTitle() { + if (mTitleLayout == null) { + LayoutInflater inflater = LayoutInflater.from(getContext()); + inflater.inflate(R.layout.abs__action_bar_title_item, this); + mTitleLayout = (LinearLayout) getChildAt(getChildCount() - 1); + mTitleView = (TextView) mTitleLayout.findViewById(R.id.abs__action_bar_title); + mSubtitleView = (TextView) mTitleLayout.findViewById(R.id.abs__action_bar_subtitle); + if (mTitleStyleRes != 0) { + mTitleView.setTextAppearance(mContext, mTitleStyleRes); + } + if (mSubtitleStyleRes != 0) { + mSubtitleView.setTextAppearance(mContext, mSubtitleStyleRes); + } + } + + mTitleView.setText(mTitle); + mSubtitleView.setText(mSubtitle); + + final boolean hasTitle = !TextUtils.isEmpty(mTitle); + final boolean hasSubtitle = !TextUtils.isEmpty(mSubtitle); + mSubtitleView.setVisibility(hasSubtitle ? VISIBLE : GONE); + mTitleLayout.setVisibility(hasTitle || hasSubtitle ? VISIBLE : GONE); + if (mTitleLayout.getParent() == null) { + addView(mTitleLayout); + } + } + + public void initForMode(final ActionMode mode) { + if (mClose == null) { + LayoutInflater inflater = LayoutInflater.from(mContext); + mClose = (NineLinearLayout)inflater.inflate(R.layout.abs__action_mode_close_item, this, false); + addView(mClose); + } else if (mClose.getParent() == null) { + addView(mClose); + } + + View closeButton = mClose.findViewById(R.id.abs__action_mode_close_button); + closeButton.setOnClickListener(new OnClickListener() { + public void onClick(View v) { + mode.finish(); + } + }); + + final MenuBuilder menu = (MenuBuilder) mode.getMenu(); + if (mActionMenuPresenter != null) { + mActionMenuPresenter.dismissPopupMenus(); + } + mActionMenuPresenter = new ActionMenuPresenter(mContext); + mActionMenuPresenter.setReserveOverflow(true); + + final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.MATCH_PARENT); + if (!mSplitActionBar) { + menu.addMenuPresenter(mActionMenuPresenter); + mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); + mMenuView.setBackgroundDrawable(null); + addView(mMenuView, layoutParams); + } else { + // Allow full screen width in split mode. + mActionMenuPresenter.setWidthLimit( + getContext().getResources().getDisplayMetrics().widthPixels, true); + // No limit to the item count; use whatever will fit. + mActionMenuPresenter.setItemLimit(Integer.MAX_VALUE); + // Span the whole width + layoutParams.width = LayoutParams.MATCH_PARENT; + layoutParams.height = mContentHeight; + menu.addMenuPresenter(mActionMenuPresenter); + mMenuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); + mMenuView.setBackgroundDrawable(mSplitBackground); + mSplitView.addView(mMenuView, layoutParams); + } + + mAnimateInOnLayout = true; + } + + public void closeMode() { + if (mAnimationMode == ANIMATE_OUT) { + // Called again during close; just finish what we were doing. + return; + } + if (mClose == null) { + killMode(); + return; + } + + finishAnimation(); + mAnimationMode = ANIMATE_OUT; + mCurrentAnimation = makeOutAnimation(); + mCurrentAnimation.start(); + } + + private void finishAnimation() { + final Animator a = mCurrentAnimation; + if (a != null) { + mCurrentAnimation = null; + a.end(); + } + } + + public void killMode() { + finishAnimation(); + removeAllViews(); + if (mSplitView != null) { + mSplitView.removeView(mMenuView); + } + mCustomView = null; + mMenuView = null; + mAnimateInOnLayout = false; + } + + @Override + public boolean showOverflowMenu() { + if (mActionMenuPresenter != null) { + return mActionMenuPresenter.showOverflowMenu(); + } + return false; + } + + @Override + public boolean hideOverflowMenu() { + if (mActionMenuPresenter != null) { + return mActionMenuPresenter.hideOverflowMenu(); + } + return false; + } + + @Override + public boolean isOverflowMenuShowing() { + if (mActionMenuPresenter != null) { + return mActionMenuPresenter.isOverflowMenuShowing(); + } + return false; + } + + @Override + protected ViewGroup.LayoutParams generateDefaultLayoutParams() { + // Used by custom views if they don't supply layout params. Everything else + // added to an ActionBarContextView should have them already. + return new MarginLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); + } + + @Override + public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { + return new MarginLayoutParams(getContext(), attrs); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final int widthMode = MeasureSpec.getMode(widthMeasureSpec); + if (widthMode != MeasureSpec.EXACTLY) { + throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + + "with android:layout_width=\"match_parent\" (or fill_parent)"); + } + + final int heightMode = MeasureSpec.getMode(heightMeasureSpec); + if (heightMode == MeasureSpec.UNSPECIFIED) { + throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + + "with android:layout_height=\"wrap_content\""); + } + + final int contentWidth = MeasureSpec.getSize(widthMeasureSpec); + + int maxHeight = mContentHeight > 0 ? + mContentHeight : MeasureSpec.getSize(heightMeasureSpec); + + final int verticalPadding = getPaddingTop() + getPaddingBottom(); + int availableWidth = contentWidth - getPaddingLeft() - getPaddingRight(); + final int height = maxHeight - verticalPadding; + final int childSpecHeight = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST); + + if (mClose != null) { + availableWidth = measureChildView(mClose, availableWidth, childSpecHeight, 0); + MarginLayoutParams lp = (MarginLayoutParams) mClose.getLayoutParams(); + availableWidth -= lp.leftMargin + lp.rightMargin; + } + + if (mMenuView != null && mMenuView.getParent() == this) { + availableWidth = measureChildView(mMenuView, availableWidth, + childSpecHeight, 0); + } + + if (mTitleLayout != null && mCustomView == null) { + availableWidth = measureChildView(mTitleLayout, availableWidth, childSpecHeight, 0); + } + + if (mCustomView != null) { + ViewGroup.LayoutParams lp = mCustomView.getLayoutParams(); + final int customWidthMode = lp.width != LayoutParams.WRAP_CONTENT ? + MeasureSpec.EXACTLY : MeasureSpec.AT_MOST; + final int customWidth = lp.width >= 0 ? + Math.min(lp.width, availableWidth) : availableWidth; + final int customHeightMode = lp.height != LayoutParams.WRAP_CONTENT ? + MeasureSpec.EXACTLY : MeasureSpec.AT_MOST; + final int customHeight = lp.height >= 0 ? + Math.min(lp.height, height) : height; + mCustomView.measure(MeasureSpec.makeMeasureSpec(customWidth, customWidthMode), + MeasureSpec.makeMeasureSpec(customHeight, customHeightMode)); + } + + if (mContentHeight <= 0) { + int measuredHeight = 0; + final int count = getChildCount(); + for (int i = 0; i < count; i++) { + View v = getChildAt(i); + int paddedViewHeight = v.getMeasuredHeight() + verticalPadding; + if (paddedViewHeight > measuredHeight) { + measuredHeight = paddedViewHeight; + } + } + setMeasuredDimension(contentWidth, measuredHeight); + } else { + setMeasuredDimension(contentWidth, maxHeight); + } + } + + private Animator makeInAnimation() { + mClose.setTranslationX(-mClose.getWidth() - + ((MarginLayoutParams) mClose.getLayoutParams()).leftMargin); + ObjectAnimator buttonAnimator = ObjectAnimator.ofFloat(mClose, "translationX", 0); + buttonAnimator.setDuration(200); + buttonAnimator.addListener(this); + buttonAnimator.setInterpolator(new DecelerateInterpolator()); + + AnimatorSet set = new AnimatorSet(); + AnimatorSet.Builder b = set.play(buttonAnimator); + + if (mMenuView != null) { + final int count = mMenuView.getChildCount(); + if (count > 0) { + for (int i = count - 1, j = 0; i >= 0; i--, j++) { + AnimatorProxy child = AnimatorProxy.wrap(mMenuView.getChildAt(i)); + child.setScaleY(0); + ObjectAnimator a = ObjectAnimator.ofFloat(child, "scaleY", 0, 1); + a.setDuration(100); + a.setStartDelay(j * 70); + b.with(a); + } + } + } + + return set; + } + + private Animator makeOutAnimation() { + ObjectAnimator buttonAnimator = ObjectAnimator.ofFloat(mClose, "translationX", + -mClose.getWidth() - ((MarginLayoutParams) mClose.getLayoutParams()).leftMargin); + buttonAnimator.setDuration(200); + buttonAnimator.addListener(this); + buttonAnimator.setInterpolator(new DecelerateInterpolator()); + + AnimatorSet set = new AnimatorSet(); + AnimatorSet.Builder b = set.play(buttonAnimator); + + if (mMenuView != null) { + final int count = mMenuView.getChildCount(); + if (count > 0) { + for (int i = 0; i < 0; i++) { + AnimatorProxy child = AnimatorProxy.wrap(mMenuView.getChildAt(i)); + child.setScaleY(0); + ObjectAnimator a = ObjectAnimator.ofFloat(child, "scaleY", 0); + a.setDuration(100); + a.setStartDelay(i * 70); + b.with(a); + } + } + } + + return set; + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + int x = getPaddingLeft(); + final int y = getPaddingTop(); + final int contentHeight = b - t - getPaddingTop() - getPaddingBottom(); + + if (mClose != null && mClose.getVisibility() != GONE) { + MarginLayoutParams lp = (MarginLayoutParams) mClose.getLayoutParams(); + x += lp.leftMargin; + x += positionChild(mClose, x, y, contentHeight); + x += lp.rightMargin; + + if (mAnimateInOnLayout) { + mAnimationMode = ANIMATE_IN; + mCurrentAnimation = makeInAnimation(); + mCurrentAnimation.start(); + mAnimateInOnLayout = false; + } + } + + if (mTitleLayout != null && mCustomView == null) { + x += positionChild(mTitleLayout, x, y, contentHeight); + } + + if (mCustomView != null) { + x += positionChild(mCustomView, x, y, contentHeight); + } + + x = r - l - getPaddingRight(); + + if (mMenuView != null) { + x -= positionChildInverse(mMenuView, x, y, contentHeight); + } + } + + @Override + public void onAnimationStart(Animator animation) { + } + + @Override + public void onAnimationEnd(Animator animation) { + if (mAnimationMode == ANIMATE_OUT) { + killMode(); + } + mAnimationMode = ANIMATE_IDLE; + } + + @Override + public void onAnimationCancel(Animator animation) { + } + + @Override + public void onAnimationRepeat(Animator animation) { + } + + @Override + public boolean shouldDelayChildPressedState() { + return false; + } + + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { + // Action mode started + //TODO event.setSource(this); + event.setClassName(getClass().getName()); + event.setPackageName(getContext().getPackageName()); + event.setContentDescription(mTitle); + } else { + //TODO super.onInitializeAccessibilityEvent(event); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarView.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarView.java new file mode 100644 index 0000000000..4636de17f0 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ActionBarView.java @@ -0,0 +1,1548 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.internal.widget; + +import org.xmlpull.v1.XmlPullParser; +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; +import android.os.Parcelable; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.util.Log; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.view.accessibility.AccessibilityEvent; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.SpinnerAdapter; +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; +import com.actionbarsherlock.internal.view.menu.MenuBuilder; +import com.actionbarsherlock.internal.view.menu.MenuItemImpl; +import com.actionbarsherlock.internal.view.menu.MenuPresenter; +import com.actionbarsherlock.internal.view.menu.MenuView; +import com.actionbarsherlock.internal.view.menu.SubMenuBuilder; +import com.actionbarsherlock.view.CollapsibleActionView; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; +import com.actionbarsherlock.view.Window; + +import static com.actionbarsherlock.internal.ResourcesCompat.getResources_getBoolean; + +/** + * @hide + */ +public class ActionBarView extends AbsActionBarView { + private static final String TAG = "ActionBarView"; + private static final boolean DEBUG = false; + + /** + * Display options applied by default + */ + public static final int DISPLAY_DEFAULT = 0; + + /** + * Display options that require re-layout as opposed to a simple invalidate + */ + private static final int DISPLAY_RELAYOUT_MASK = + ActionBar.DISPLAY_SHOW_HOME | + ActionBar.DISPLAY_USE_LOGO | + ActionBar.DISPLAY_HOME_AS_UP | + ActionBar.DISPLAY_SHOW_CUSTOM | + ActionBar.DISPLAY_SHOW_TITLE; + + private static final int DEFAULT_CUSTOM_GRAVITY = Gravity.LEFT | Gravity.CENTER_VERTICAL; + + private int mNavigationMode; + private int mDisplayOptions = -1; + private CharSequence mTitle; + private CharSequence mSubtitle; + private Drawable mIcon; + private Drawable mLogo; + + private HomeView mHomeLayout; + private HomeView mExpandedHomeLayout; + private LinearLayout mTitleLayout; + private TextView mTitleView; + private TextView mSubtitleView; + private View mTitleUpView; + + private IcsSpinner mSpinner; + private IcsLinearLayout mListNavLayout; + private ScrollingTabContainerView mTabScrollView; + private View mCustomNavView; + private IcsProgressBar mProgressView; + private IcsProgressBar mIndeterminateProgressView; + + private int mProgressBarPadding; + private int mItemPadding; + + private int mTitleStyleRes; + private int mSubtitleStyleRes; + private int mProgressStyle; + private int mIndeterminateProgressStyle; + + private boolean mUserTitle; + private boolean mIncludeTabs; + private boolean mIsCollapsable; + private boolean mIsCollapsed; + + private MenuBuilder mOptionsMenu; + + private ActionBarContextView mContextView; + + private ActionMenuItem mLogoNavItem; + + private SpinnerAdapter mSpinnerAdapter; + private OnNavigationListener mCallback; + + //UNUSED private Runnable mTabSelector; + + private ExpandedActionViewMenuPresenter mExpandedMenuPresenter; + View mExpandedActionView; + + Window.Callback mWindowCallback; + + @SuppressWarnings("rawtypes") + private final IcsAdapterView.OnItemSelectedListener mNavItemSelectedListener = + new IcsAdapterView.OnItemSelectedListener() { + public void onItemSelected(IcsAdapterView parent, View view, int position, long id) { + if (mCallback != null) { + mCallback.onNavigationItemSelected(position, id); + } + } + public void onNothingSelected(IcsAdapterView parent) { + // Do nothing + } + }; + + private final OnClickListener mExpandedActionViewUpListener = new OnClickListener() { + @Override + public void onClick(View v) { + final MenuItemImpl item = mExpandedMenuPresenter.mCurrentExpandedItem; + if (item != null) { + item.collapseActionView(); + } + } + }; + + private final OnClickListener mUpClickListener = new OnClickListener() { + public void onClick(View v) { + mWindowCallback.onMenuItemSelected(Window.FEATURE_OPTIONS_PANEL, mLogoNavItem); + } + }; + + public ActionBarView(Context context, AttributeSet attrs) { + super(context, attrs); + + // Background is always provided by the container. + setBackgroundResource(0); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SherlockActionBar, + R.attr.actionBarStyle, 0); + + ApplicationInfo appInfo = context.getApplicationInfo(); + PackageManager pm = context.getPackageManager(); + mNavigationMode = a.getInt(R.styleable.SherlockActionBar_navigationMode, + ActionBar.NAVIGATION_MODE_STANDARD); + mTitle = a.getText(R.styleable.SherlockActionBar_title); + mSubtitle = a.getText(R.styleable.SherlockActionBar_subtitle); + + mLogo = a.getDrawable(R.styleable.SherlockActionBar_logo); + if (mLogo == null) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { + 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); + if (resId != 0) { + mLogo = context.getResources().getDrawable(resId); + } + } + } else { + if (context instanceof Activity) { + try { + mLogo = pm.getActivityLogo(((Activity) context).getComponentName()); + } catch (NameNotFoundException e) { + Log.e(TAG, "Activity component name not found!", e); + } + } + if (mLogo == null) { + mLogo = appInfo.loadLogo(pm); + } + } + } + + mIcon = a.getDrawable(R.styleable.SherlockActionBar_icon); + if (mIcon == null) { + if (context instanceof Activity) { + try { + mIcon = pm.getActivityIcon(((Activity) context).getComponentName()); + } catch (NameNotFoundException e) { + Log.e(TAG, "Activity component name not found!", e); + } + } + if (mIcon == null) { + mIcon = appInfo.loadIcon(pm); + } + } + + final LayoutInflater inflater = LayoutInflater.from(context); + + final int homeResId = a.getResourceId( + R.styleable.SherlockActionBar_homeLayout, + R.layout.abs__action_bar_home); + + mHomeLayout = (HomeView) inflater.inflate(homeResId, this, false); + + mExpandedHomeLayout = (HomeView) inflater.inflate(homeResId, this, false); + mExpandedHomeLayout.setUp(true); + mExpandedHomeLayout.setOnClickListener(mExpandedActionViewUpListener); + mExpandedHomeLayout.setContentDescription(getResources().getText( + R.string.abs__action_bar_up_description)); + + mTitleStyleRes = a.getResourceId(R.styleable.SherlockActionBar_titleTextStyle, 0); + mSubtitleStyleRes = a.getResourceId(R.styleable.SherlockActionBar_subtitleTextStyle, 0); + mProgressStyle = a.getResourceId(R.styleable.SherlockActionBar_progressBarStyle, 0); + mIndeterminateProgressStyle = a.getResourceId( + R.styleable.SherlockActionBar_indeterminateProgressStyle, 0); + + mProgressBarPadding = a.getDimensionPixelOffset(R.styleable.SherlockActionBar_progressBarPadding, 0); + mItemPadding = a.getDimensionPixelOffset(R.styleable.SherlockActionBar_itemPadding, 0); + + setDisplayOptions(a.getInt(R.styleable.SherlockActionBar_displayOptions, DISPLAY_DEFAULT)); + + final int customNavId = a.getResourceId(R.styleable.SherlockActionBar_customNavigationLayout, 0); + if (customNavId != 0) { + mCustomNavView = inflater.inflate(customNavId, this, false); + mNavigationMode = ActionBar.NAVIGATION_MODE_STANDARD; + setDisplayOptions(mDisplayOptions | ActionBar.DISPLAY_SHOW_CUSTOM); + } + + mContentHeight = a.getLayoutDimension(R.styleable.SherlockActionBar_height, 0); + + a.recycle(); + + mLogoNavItem = new ActionMenuItem(context, 0, android.R.id.home, 0, 0, mTitle); + mHomeLayout.setOnClickListener(mUpClickListener); + mHomeLayout.setClickable(true); + mHomeLayout.setFocusable(true); + } + + /** + * Attempt to programmatically load the logo from the manifest file of an + * activity by using an XML pull parser. This should allow us to read the + * logo attribute regardless of the platform it is being run on. + * + * @param activity Activity instance. + * @return Logo resource ID. + */ + private static int loadLogoFromManifest(Activity activity) { + int logo = 0; + try { + final String thisPackage = activity.getClass().getName(); + if (DEBUG) Log.i(TAG, "Parsing AndroidManifest.xml for " + thisPackage); + + final String packageName = activity.getApplicationInfo().packageName; + final AssetManager am = activity.createPackageContext(packageName, 0).getAssets(); + final XmlResourceParser xml = am.openXmlResourceParser("AndroidManifest.xml"); + + int eventType = xml.getEventType(); + while (eventType != XmlPullParser.END_DOCUMENT) { + if (eventType == XmlPullParser.START_TAG) { + String name = xml.getName(); + + if ("application".equals(name)) { + //Check if the has the attribute + if (DEBUG) Log.d(TAG, "Got "); + + for (int i = xml.getAttributeCount() - 1; i >= 0; i--) { + if (DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i)); + + if ("logo".equals(xml.getAttributeName(i))) { + logo = xml.getAttributeResourceValue(i, 0); + break; //out of for loop + } + } + } else if ("activity".equals(name)) { + //Check if the is us and has the attribute + if (DEBUG) Log.d(TAG, "Got "); + Integer activityLogo = null; + String activityPackage = null; + boolean isOurActivity = false; + + for (int i = xml.getAttributeCount() - 1; i >= 0; i--) { + if (DEBUG) Log.d(TAG, xml.getAttributeName(i) + ": " + xml.getAttributeValue(i)); + + //We need both uiOptions and name attributes + String attrName = xml.getAttributeName(i); + if ("logo".equals(attrName)) { + activityLogo = xml.getAttributeResourceValue(i, 0); + } else if ("name".equals(attrName)) { + activityPackage = ActionBarSherlockCompat.cleanActivityName(packageName, xml.getAttributeValue(i)); + if (!thisPackage.equals(activityPackage)) { + break; //on to the next + } + isOurActivity = true; + } + + //Make sure we have both attributes before processing + if ((activityLogo != null) && (activityPackage != null)) { + //Our activity, logo specified, override with our value + logo = activityLogo.intValue(); + } + } + if (isOurActivity) { + //If we matched our activity but it had no logo don't + //do any more processing of the manifest + break; + } + } + } + eventType = xml.nextToken(); + } + } catch (Exception e) { + e.printStackTrace(); + } + if (DEBUG) Log.i(TAG, "Returning " + Integer.toHexString(logo)); + return logo; + } + + /* + * Must be public so we can dispatch pre-2.2 via ActionBarImpl. + */ + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + + mTitleView = null; + mSubtitleView = null; + mTitleUpView = null; + if (mTitleLayout != null && mTitleLayout.getParent() == this) { + removeView(mTitleLayout); + } + mTitleLayout = null; + if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0) { + initTitle(); + } + + if (mTabScrollView != null && mIncludeTabs) { + ViewGroup.LayoutParams lp = mTabScrollView.getLayoutParams(); + if (lp != null) { + lp.width = LayoutParams.WRAP_CONTENT; + lp.height = LayoutParams.MATCH_PARENT; + } + mTabScrollView.setAllowCollapse(true); + } + } + + /** + * Set the window callback used to invoke menu items; used for dispatching home button presses. + * @param cb Window callback to dispatch to + */ + public void setWindowCallback(Window.Callback cb) { + mWindowCallback = cb; + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + //UNUSED removeCallbacks(mTabSelector); + if (mActionMenuPresenter != null) { + mActionMenuPresenter.hideOverflowMenu(); + mActionMenuPresenter.hideSubMenus(); + } + } + + @Override + public boolean shouldDelayChildPressedState() { + return false; + } + + public void initProgress() { + mProgressView = new IcsProgressBar(mContext, null, 0, mProgressStyle); + mProgressView.setId(R.id.abs__progress_horizontal); + mProgressView.setMax(10000); + addView(mProgressView); + } + + public void initIndeterminateProgress() { + mIndeterminateProgressView = new IcsProgressBar(mContext, null, 0, mIndeterminateProgressStyle); + mIndeterminateProgressView.setId(R.id.abs__progress_circular); + addView(mIndeterminateProgressView); + } + + @Override + public void setSplitActionBar(boolean splitActionBar) { + if (mSplitActionBar != splitActionBar) { + if (mMenuView != null) { + final ViewGroup oldParent = (ViewGroup) mMenuView.getParent(); + if (oldParent != null) { + oldParent.removeView(mMenuView); + } + if (splitActionBar) { + if (mSplitView != null) { + mSplitView.addView(mMenuView); + } + } else { + addView(mMenuView); + } + } + if (mSplitView != null) { + mSplitView.setVisibility(splitActionBar ? VISIBLE : GONE); + } + super.setSplitActionBar(splitActionBar); + } + } + + public boolean isSplitActionBar() { + return mSplitActionBar; + } + + public boolean hasEmbeddedTabs() { + return mIncludeTabs; + } + + public void setEmbeddedTabView(ScrollingTabContainerView tabs) { + if (mTabScrollView != null) { + removeView(mTabScrollView); + } + mTabScrollView = tabs; + mIncludeTabs = tabs != null; + if (mIncludeTabs && mNavigationMode == ActionBar.NAVIGATION_MODE_TABS) { + addView(mTabScrollView); + ViewGroup.LayoutParams lp = mTabScrollView.getLayoutParams(); + lp.width = LayoutParams.WRAP_CONTENT; + lp.height = LayoutParams.MATCH_PARENT; + tabs.setAllowCollapse(true); + } + } + + public void setCallback(OnNavigationListener callback) { + mCallback = callback; + } + + public void setMenu(Menu menu, MenuPresenter.Callback cb) { + if (menu == mOptionsMenu) return; + + if (mOptionsMenu != null) { + mOptionsMenu.removeMenuPresenter(mActionMenuPresenter); + mOptionsMenu.removeMenuPresenter(mExpandedMenuPresenter); + } + + MenuBuilder builder = (MenuBuilder) menu; + mOptionsMenu = builder; + if (mMenuView != null) { + final ViewGroup oldParent = (ViewGroup) mMenuView.getParent(); + if (oldParent != null) { + oldParent.removeView(mMenuView); + } + } + if (mActionMenuPresenter == null) { + mActionMenuPresenter = new ActionMenuPresenter(mContext); + mActionMenuPresenter.setCallback(cb); + mActionMenuPresenter.setId(R.id.abs__action_menu_presenter); + mExpandedMenuPresenter = new ExpandedActionViewMenuPresenter(); + } + + ActionMenuView menuView; + final LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.MATCH_PARENT); + if (!mSplitActionBar) { + mActionMenuPresenter.setExpandedActionViewsExclusive( + getResources_getBoolean(getContext(), + R.bool.abs__action_bar_expanded_action_views_exclusive)); + configPresenters(builder); + menuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); + final ViewGroup oldParent = (ViewGroup) menuView.getParent(); + if (oldParent != null && oldParent != this) { + oldParent.removeView(menuView); + } + addView(menuView, layoutParams); + } else { + mActionMenuPresenter.setExpandedActionViewsExclusive(false); + // Allow full screen width in split mode. + mActionMenuPresenter.setWidthLimit( + getContext().getResources().getDisplayMetrics().widthPixels, true); + // No limit to the item count; use whatever will fit. + mActionMenuPresenter.setItemLimit(Integer.MAX_VALUE); + // Span the whole width + layoutParams.width = LayoutParams.MATCH_PARENT; + configPresenters(builder); + menuView = (ActionMenuView) mActionMenuPresenter.getMenuView(this); + if (mSplitView != null) { + final ViewGroup oldParent = (ViewGroup) menuView.getParent(); + if (oldParent != null && oldParent != mSplitView) { + oldParent.removeView(menuView); + } + menuView.setVisibility(getAnimatedVisibility()); + mSplitView.addView(menuView, layoutParams); + } else { + // We'll add this later if we missed it this time. + menuView.setLayoutParams(layoutParams); + } + } + mMenuView = menuView; + } + + private void configPresenters(MenuBuilder builder) { + if (builder != null) { + builder.addMenuPresenter(mActionMenuPresenter); + builder.addMenuPresenter(mExpandedMenuPresenter); + } else { + mActionMenuPresenter.initForMenu(mContext, null); + mExpandedMenuPresenter.initForMenu(mContext, null); + mActionMenuPresenter.updateMenuView(true); + mExpandedMenuPresenter.updateMenuView(true); + } + } + + public boolean hasExpandedActionView() { + return mExpandedMenuPresenter != null && + mExpandedMenuPresenter.mCurrentExpandedItem != null; + } + + public void collapseActionView() { + final MenuItemImpl item = mExpandedMenuPresenter == null ? null : + mExpandedMenuPresenter.mCurrentExpandedItem; + if (item != null) { + item.collapseActionView(); + } + } + + public void setCustomNavigationView(View view) { + final boolean showCustom = (mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0; + if (mCustomNavView != null && showCustom) { + removeView(mCustomNavView); + } + mCustomNavView = view; + if (mCustomNavView != null && showCustom) { + addView(mCustomNavView); + } + } + + public CharSequence getTitle() { + return mTitle; + } + + /** + * Set the action bar title. This will always replace or override window titles. + * @param title Title to set + * + * @see #setWindowTitle(CharSequence) + */ + public void setTitle(CharSequence title) { + mUserTitle = true; + setTitleImpl(title); + } + + /** + * Set the window title. A window title will always be replaced or overridden by a user title. + * @param title Title to set + * + * @see #setTitle(CharSequence) + */ + public void setWindowTitle(CharSequence title) { + if (!mUserTitle) { + setTitleImpl(title); + } + } + + private void setTitleImpl(CharSequence title) { + mTitle = title; + if (mTitleView != null) { + mTitleView.setText(title); + final boolean visible = mExpandedActionView == null && + (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0 && + (!TextUtils.isEmpty(mTitle) || !TextUtils.isEmpty(mSubtitle)); + mTitleLayout.setVisibility(visible ? VISIBLE : GONE); + } + if (mLogoNavItem != null) { + mLogoNavItem.setTitle(title); + } + } + + public CharSequence getSubtitle() { + return mSubtitle; + } + + public void setSubtitle(CharSequence subtitle) { + mSubtitle = subtitle; + if (mSubtitleView != null) { + mSubtitleView.setText(subtitle); + mSubtitleView.setVisibility(subtitle != null ? VISIBLE : GONE); + final boolean visible = mExpandedActionView == null && + (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0 && + (!TextUtils.isEmpty(mTitle) || !TextUtils.isEmpty(mSubtitle)); + mTitleLayout.setVisibility(visible ? VISIBLE : GONE); + } + } + + public void setHomeButtonEnabled(boolean enable) { + mHomeLayout.setEnabled(enable); + mHomeLayout.setFocusable(enable); + // Make sure the home button has an accurate content description for accessibility. + if (!enable) { + mHomeLayout.setContentDescription(null); + } else if ((mDisplayOptions & ActionBar.DISPLAY_HOME_AS_UP) != 0) { + mHomeLayout.setContentDescription(mContext.getResources().getText( + R.string.abs__action_bar_up_description)); + } else { + mHomeLayout.setContentDescription(mContext.getResources().getText( + R.string.abs__action_bar_home_description)); + } + } + + public void setDisplayOptions(int options) { + final int flagsChanged = mDisplayOptions == -1 ? -1 : options ^ mDisplayOptions; + mDisplayOptions = options; + + if ((flagsChanged & DISPLAY_RELAYOUT_MASK) != 0) { + final boolean showHome = (options & ActionBar.DISPLAY_SHOW_HOME) != 0; + final int vis = showHome && mExpandedActionView == null ? VISIBLE : GONE; + mHomeLayout.setVisibility(vis); + + if ((flagsChanged & ActionBar.DISPLAY_HOME_AS_UP) != 0) { + final boolean setUp = (options & ActionBar.DISPLAY_HOME_AS_UP) != 0; + mHomeLayout.setUp(setUp); + + // Showing home as up implicitly enables interaction with it. + // In honeycomb it was always enabled, so make this transition + // a bit easier for developers in the common case. + // (It would be silly to show it as up without responding to it.) + if (setUp) { + setHomeButtonEnabled(true); + } + } + + if ((flagsChanged & ActionBar.DISPLAY_USE_LOGO) != 0) { + final boolean logoVis = mLogo != null && (options & ActionBar.DISPLAY_USE_LOGO) != 0; + mHomeLayout.setIcon(logoVis ? mLogo : mIcon); + } + + if ((flagsChanged & ActionBar.DISPLAY_SHOW_TITLE) != 0) { + if ((options & ActionBar.DISPLAY_SHOW_TITLE) != 0) { + initTitle(); + } else { + removeView(mTitleLayout); + } + } + + if (mTitleLayout != null && (flagsChanged & + (ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_HOME)) != 0) { + final boolean homeAsUp = (mDisplayOptions & ActionBar.DISPLAY_HOME_AS_UP) != 0; + mTitleUpView.setVisibility(!showHome ? (homeAsUp ? VISIBLE : INVISIBLE) : GONE); + mTitleLayout.setEnabled(!showHome && homeAsUp); + } + + if ((flagsChanged & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && mCustomNavView != null) { + if ((options & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { + addView(mCustomNavView); + } else { + removeView(mCustomNavView); + } + } + + requestLayout(); + } else { + invalidate(); + } + + // Make sure the home button has an accurate content description for accessibility. + if (!mHomeLayout.isEnabled()) { + mHomeLayout.setContentDescription(null); + } else if ((options & ActionBar.DISPLAY_HOME_AS_UP) != 0) { + mHomeLayout.setContentDescription(mContext.getResources().getText( + R.string.abs__action_bar_up_description)); + } else { + mHomeLayout.setContentDescription(mContext.getResources().getText( + R.string.abs__action_bar_home_description)); + } + } + + public void setIcon(Drawable icon) { + mIcon = icon; + if (icon != null && + ((mDisplayOptions & ActionBar.DISPLAY_USE_LOGO) == 0 || mLogo == null)) { + mHomeLayout.setIcon(icon); + } + } + + public void setIcon(int resId) { + setIcon(mContext.getResources().getDrawable(resId)); + } + + public void setLogo(Drawable logo) { + mLogo = logo; + if (logo != null && (mDisplayOptions & ActionBar.DISPLAY_USE_LOGO) != 0) { + mHomeLayout.setIcon(logo); + } + } + + public void setLogo(int resId) { + setLogo(mContext.getResources().getDrawable(resId)); + } + + public void setNavigationMode(int mode) { + final int oldMode = mNavigationMode; + if (mode != oldMode) { + switch (oldMode) { + case ActionBar.NAVIGATION_MODE_LIST: + if (mListNavLayout != null) { + removeView(mListNavLayout); + } + break; + case ActionBar.NAVIGATION_MODE_TABS: + if (mTabScrollView != null && mIncludeTabs) { + removeView(mTabScrollView); + } + } + + switch (mode) { + case ActionBar.NAVIGATION_MODE_LIST: + if (mSpinner == null) { + mSpinner = new IcsSpinner(mContext, null, + R.attr.actionDropDownStyle); + mListNavLayout = (IcsLinearLayout) LayoutInflater.from(mContext) + .inflate(R.layout.abs__action_bar_tab_bar_view, null); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( + LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); + params.gravity = Gravity.CENTER; + mListNavLayout.addView(mSpinner, params); + } + if (mSpinner.getAdapter() != mSpinnerAdapter) { + mSpinner.setAdapter(mSpinnerAdapter); + } + mSpinner.setOnItemSelectedListener(mNavItemSelectedListener); + addView(mListNavLayout); + break; + case ActionBar.NAVIGATION_MODE_TABS: + if (mTabScrollView != null && mIncludeTabs) { + addView(mTabScrollView); + } + break; + } + mNavigationMode = mode; + requestLayout(); + } + } + + public void setDropdownAdapter(SpinnerAdapter adapter) { + mSpinnerAdapter = adapter; + if (mSpinner != null) { + mSpinner.setAdapter(adapter); + } + } + + public SpinnerAdapter getDropdownAdapter() { + return mSpinnerAdapter; + } + + public void setDropdownSelectedPosition(int position) { + mSpinner.setSelection(position); + } + + public int getDropdownSelectedPosition() { + return mSpinner.getSelectedItemPosition(); + } + + public View getCustomNavigationView() { + return mCustomNavView; + } + + public int getNavigationMode() { + return mNavigationMode; + } + + public int getDisplayOptions() { + return mDisplayOptions; + } + + @Override + protected ViewGroup.LayoutParams generateDefaultLayoutParams() { + // Used by custom nav views if they don't supply layout params. Everything else + // added to an ActionBarView should have them already. + return new ActionBar.LayoutParams(DEFAULT_CUSTOM_GRAVITY); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + addView(mHomeLayout); + + if (mCustomNavView != null && (mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { + final ViewParent parent = mCustomNavView.getParent(); + if (parent != this) { + if (parent instanceof ViewGroup) { + ((ViewGroup) parent).removeView(mCustomNavView); + } + addView(mCustomNavView); + } + } + } + + private void initTitle() { + if (mTitleLayout == null) { + LayoutInflater inflater = LayoutInflater.from(getContext()); + mTitleLayout = (LinearLayout) inflater.inflate(R.layout.abs__action_bar_title_item, + this, false); + mTitleView = (TextView) mTitleLayout.findViewById(R.id.abs__action_bar_title); + mSubtitleView = (TextView) mTitleLayout.findViewById(R.id.abs__action_bar_subtitle); + mTitleUpView = mTitleLayout.findViewById(R.id.abs__up); + + mTitleLayout.setOnClickListener(mUpClickListener); + + if (mTitleStyleRes != 0) { + mTitleView.setTextAppearance(mContext, mTitleStyleRes); + } + if (mTitle != null) { + mTitleView.setText(mTitle); + } + + if (mSubtitleStyleRes != 0) { + mSubtitleView.setTextAppearance(mContext, mSubtitleStyleRes); + } + if (mSubtitle != null) { + mSubtitleView.setText(mSubtitle); + mSubtitleView.setVisibility(VISIBLE); + } + + final boolean homeAsUp = (mDisplayOptions & ActionBar.DISPLAY_HOME_AS_UP) != 0; + final boolean showHome = (mDisplayOptions & ActionBar.DISPLAY_SHOW_HOME) != 0; + mTitleUpView.setVisibility(!showHome ? (homeAsUp ? VISIBLE : INVISIBLE) : GONE); + mTitleLayout.setEnabled(homeAsUp && !showHome); + } + + addView(mTitleLayout); + if (mExpandedActionView != null || + (TextUtils.isEmpty(mTitle) && TextUtils.isEmpty(mSubtitle))) { + // Don't show while in expanded mode or with empty text + mTitleLayout.setVisibility(GONE); + } + } + + public void setContextView(ActionBarContextView view) { + mContextView = view; + } + + public void setCollapsable(boolean collapsable) { + mIsCollapsable = collapsable; + } + + public boolean isCollapsed() { + return mIsCollapsed; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final int childCount = getChildCount(); + if (mIsCollapsable) { + int visibleChildren = 0; + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + if (child.getVisibility() != GONE && + !(child == mMenuView && mMenuView.getChildCount() == 0)) { + visibleChildren++; + } + } + + if (visibleChildren == 0) { + // No size for an empty action bar when collapsable. + setMeasuredDimension(0, 0); + mIsCollapsed = true; + return; + } + } + mIsCollapsed = false; + + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + if (widthMode != MeasureSpec.EXACTLY) { + throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + + "with android:layout_width=\"match_parent\" (or fill_parent)"); + } + + int heightMode = MeasureSpec.getMode(heightMeasureSpec); + if (heightMode != MeasureSpec.AT_MOST) { + throw new IllegalStateException(getClass().getSimpleName() + " can only be used " + + "with android:layout_height=\"wrap_content\""); + } + + int contentWidth = MeasureSpec.getSize(widthMeasureSpec); + + int maxHeight = mContentHeight > 0 ? + mContentHeight : MeasureSpec.getSize(heightMeasureSpec); + + final int verticalPadding = getPaddingTop() + getPaddingBottom(); + final int paddingLeft = getPaddingLeft(); + final int paddingRight = getPaddingRight(); + final int height = maxHeight - verticalPadding; + final int childSpecHeight = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST); + + int availableWidth = contentWidth - paddingLeft - paddingRight; + int leftOfCenter = availableWidth / 2; + int rightOfCenter = leftOfCenter; + + HomeView homeLayout = mExpandedActionView != null ? mExpandedHomeLayout : mHomeLayout; + + if (homeLayout.getVisibility() != GONE) { + final ViewGroup.LayoutParams lp = homeLayout.getLayoutParams(); + int homeWidthSpec; + if (lp.width < 0) { + homeWidthSpec = MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST); + } else { + homeWidthSpec = MeasureSpec.makeMeasureSpec(lp.width, MeasureSpec.EXACTLY); + } + homeLayout.measure(homeWidthSpec, + MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); + final int homeWidth = homeLayout.getMeasuredWidth() + homeLayout.getLeftOffset(); + availableWidth = Math.max(0, availableWidth - homeWidth); + leftOfCenter = Math.max(0, availableWidth - homeWidth); + } + + if (mMenuView != null && mMenuView.getParent() == this) { + availableWidth = measureChildView(mMenuView, availableWidth, + childSpecHeight, 0); + rightOfCenter = Math.max(0, rightOfCenter - mMenuView.getMeasuredWidth()); + } + + if (mIndeterminateProgressView != null && + mIndeterminateProgressView.getVisibility() != GONE) { + availableWidth = measureChildView(mIndeterminateProgressView, availableWidth, + childSpecHeight, 0); + rightOfCenter = Math.max(0, + rightOfCenter - mIndeterminateProgressView.getMeasuredWidth()); + } + + final boolean showTitle = mTitleLayout != null && mTitleLayout.getVisibility() != GONE && + (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0; + + if (mExpandedActionView == null) { + switch (mNavigationMode) { + case ActionBar.NAVIGATION_MODE_LIST: + if (mListNavLayout != null) { + final int itemPaddingSize = showTitle ? mItemPadding * 2 : mItemPadding; + availableWidth = Math.max(0, availableWidth - itemPaddingSize); + leftOfCenter = Math.max(0, leftOfCenter - itemPaddingSize); + mListNavLayout.measure( + MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), + MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); + final int listNavWidth = mListNavLayout.getMeasuredWidth(); + availableWidth = Math.max(0, availableWidth - listNavWidth); + leftOfCenter = Math.max(0, leftOfCenter - listNavWidth); + } + break; + case ActionBar.NAVIGATION_MODE_TABS: + if (mTabScrollView != null) { + final int itemPaddingSize = showTitle ? mItemPadding * 2 : mItemPadding; + availableWidth = Math.max(0, availableWidth - itemPaddingSize); + leftOfCenter = Math.max(0, leftOfCenter - itemPaddingSize); + mTabScrollView.measure( + MeasureSpec.makeMeasureSpec(availableWidth, MeasureSpec.AT_MOST), + MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); + final int tabWidth = mTabScrollView.getMeasuredWidth(); + availableWidth = Math.max(0, availableWidth - tabWidth); + leftOfCenter = Math.max(0, leftOfCenter - tabWidth); + } + break; + } + } + + View customView = null; + if (mExpandedActionView != null) { + customView = mExpandedActionView; + } else if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && + mCustomNavView != null) { + customView = mCustomNavView; + } + + if (customView != null) { + final ViewGroup.LayoutParams lp = generateLayoutParams(customView.getLayoutParams()); + final ActionBar.LayoutParams ablp = lp instanceof ActionBar.LayoutParams ? + (ActionBar.LayoutParams) lp : null; + + int horizontalMargin = 0; + int verticalMargin = 0; + if (ablp != null) { + horizontalMargin = ablp.leftMargin + ablp.rightMargin; + verticalMargin = ablp.topMargin + ablp.bottomMargin; + } + + // If the action bar is wrapping to its content height, don't allow a custom + // view to MATCH_PARENT. + int customNavHeightMode; + if (mContentHeight <= 0) { + customNavHeightMode = MeasureSpec.AT_MOST; + } else { + customNavHeightMode = lp.height != LayoutParams.WRAP_CONTENT ? + MeasureSpec.EXACTLY : MeasureSpec.AT_MOST; + } + final int customNavHeight = Math.max(0, + (lp.height >= 0 ? Math.min(lp.height, height) : height) - verticalMargin); + + final int customNavWidthMode = lp.width != LayoutParams.WRAP_CONTENT ? + MeasureSpec.EXACTLY : MeasureSpec.AT_MOST; + int customNavWidth = Math.max(0, + (lp.width >= 0 ? Math.min(lp.width, availableWidth) : availableWidth) + - horizontalMargin); + final int hgrav = (ablp != null ? ablp.gravity : DEFAULT_CUSTOM_GRAVITY) & + Gravity.HORIZONTAL_GRAVITY_MASK; + + // Centering a custom view is treated specially; we try to center within the whole + // action bar rather than in the available space. + if (hgrav == Gravity.CENTER_HORIZONTAL && lp.width == LayoutParams.MATCH_PARENT) { + customNavWidth = Math.min(leftOfCenter, rightOfCenter) * 2; + } + + customView.measure( + MeasureSpec.makeMeasureSpec(customNavWidth, customNavWidthMode), + MeasureSpec.makeMeasureSpec(customNavHeight, customNavHeightMode)); + availableWidth -= horizontalMargin + customView.getMeasuredWidth(); + } + + if (mExpandedActionView == null && showTitle) { + availableWidth = measureChildView(mTitleLayout, availableWidth, + MeasureSpec.makeMeasureSpec(mContentHeight, MeasureSpec.EXACTLY), 0); + leftOfCenter = Math.max(0, leftOfCenter - mTitleLayout.getMeasuredWidth()); + } + + if (mContentHeight <= 0) { + int measuredHeight = 0; + for (int i = 0; i < childCount; i++) { + View v = getChildAt(i); + int paddedViewHeight = v.getMeasuredHeight() + verticalPadding; + if (paddedViewHeight > measuredHeight) { + measuredHeight = paddedViewHeight; + } + } + setMeasuredDimension(contentWidth, measuredHeight); + } else { + setMeasuredDimension(contentWidth, maxHeight); + } + + if (mContextView != null) { + mContextView.setContentHeight(getMeasuredHeight()); + } + + if (mProgressView != null && mProgressView.getVisibility() != GONE) { + mProgressView.measure(MeasureSpec.makeMeasureSpec( + contentWidth - mProgressBarPadding * 2, MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.AT_MOST)); + } + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + int x = getPaddingLeft(); + final int y = getPaddingTop(); + final int contentHeight = b - t - getPaddingTop() - getPaddingBottom(); + + if (contentHeight <= 0) { + // Nothing to do if we can't see anything. + return; + } + + HomeView homeLayout = mExpandedActionView != null ? mExpandedHomeLayout : mHomeLayout; + if (homeLayout.getVisibility() != GONE) { + final int leftOffset = homeLayout.getLeftOffset(); + x += positionChild(homeLayout, x + leftOffset, y, contentHeight) + leftOffset; + } + + if (mExpandedActionView == null) { + final boolean showTitle = mTitleLayout != null && mTitleLayout.getVisibility() != GONE && + (mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0; + if (showTitle) { + x += positionChild(mTitleLayout, x, y, contentHeight); + } + + switch (mNavigationMode) { + case ActionBar.NAVIGATION_MODE_STANDARD: + break; + case ActionBar.NAVIGATION_MODE_LIST: + if (mListNavLayout != null) { + if (showTitle) x += mItemPadding; + x += positionChild(mListNavLayout, x, y, contentHeight) + mItemPadding; + } + break; + case ActionBar.NAVIGATION_MODE_TABS: + if (mTabScrollView != null) { + if (showTitle) x += mItemPadding; + x += positionChild(mTabScrollView, x, y, contentHeight) + mItemPadding; + } + break; + } + } + + int menuLeft = r - l - getPaddingRight(); + if (mMenuView != null && mMenuView.getParent() == this) { + positionChildInverse(mMenuView, menuLeft, y, contentHeight); + menuLeft -= mMenuView.getMeasuredWidth(); + } + + if (mIndeterminateProgressView != null && + mIndeterminateProgressView.getVisibility() != GONE) { + positionChildInverse(mIndeterminateProgressView, menuLeft, y, contentHeight); + menuLeft -= mIndeterminateProgressView.getMeasuredWidth(); + } + + View customView = null; + if (mExpandedActionView != null) { + customView = mExpandedActionView; + } else if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0 && + mCustomNavView != null) { + customView = mCustomNavView; + } + if (customView != null) { + ViewGroup.LayoutParams lp = customView.getLayoutParams(); + final ActionBar.LayoutParams ablp = lp instanceof ActionBar.LayoutParams ? + (ActionBar.LayoutParams) lp : null; + + final int gravity = ablp != null ? ablp.gravity : DEFAULT_CUSTOM_GRAVITY; + final int navWidth = customView.getMeasuredWidth(); + + int topMargin = 0; + int bottomMargin = 0; + if (ablp != null) { + x += ablp.leftMargin; + menuLeft -= ablp.rightMargin; + topMargin = ablp.topMargin; + bottomMargin = ablp.bottomMargin; + } + + int hgravity = gravity & Gravity.HORIZONTAL_GRAVITY_MASK; + // See if we actually have room to truly center; if not push against left or right. + if (hgravity == Gravity.CENTER_HORIZONTAL) { + final int centeredLeft = ((getRight() - getLeft()) - navWidth) / 2; + if (centeredLeft < x) { + hgravity = Gravity.LEFT; + } else if (centeredLeft + navWidth > menuLeft) { + hgravity = Gravity.RIGHT; + } + } else if (gravity == -1) { + hgravity = Gravity.LEFT; + } + + int xpos = 0; + switch (hgravity) { + case Gravity.CENTER_HORIZONTAL: + xpos = ((getRight() - getLeft()) - navWidth) / 2; + break; + case Gravity.LEFT: + xpos = x; + break; + case Gravity.RIGHT: + xpos = menuLeft - navWidth; + break; + } + + int vgravity = gravity & Gravity.VERTICAL_GRAVITY_MASK; + + if (gravity == -1) { + vgravity = Gravity.CENTER_VERTICAL; + } + + int ypos = 0; + switch (vgravity) { + case Gravity.CENTER_VERTICAL: + final int paddedTop = getPaddingTop(); + final int paddedBottom = getBottom() - getTop() - getPaddingBottom(); + ypos = ((paddedBottom - paddedTop) - customView.getMeasuredHeight()) / 2; + break; + case Gravity.TOP: + ypos = getPaddingTop() + topMargin; + break; + case Gravity.BOTTOM: + ypos = getHeight() - getPaddingBottom() - customView.getMeasuredHeight() + - bottomMargin; + break; + } + final int customWidth = customView.getMeasuredWidth(); + customView.layout(xpos, ypos, xpos + customWidth, + ypos + customView.getMeasuredHeight()); + x += customWidth; + } + + if (mProgressView != null) { + mProgressView.bringToFront(); + final int halfProgressHeight = mProgressView.getMeasuredHeight() / 2; + mProgressView.layout(mProgressBarPadding, -halfProgressHeight, + mProgressBarPadding + mProgressView.getMeasuredWidth(), halfProgressHeight); + } + } + + @Override + public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { + return new ActionBar.LayoutParams(getContext(), attrs); + } + + @Override + public ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams lp) { + if (lp == null) { + lp = generateDefaultLayoutParams(); + } + return lp; + } + + @Override + public Parcelable onSaveInstanceState() { + Parcelable superState = super.onSaveInstanceState(); + SavedState state = new SavedState(superState); + + if (mExpandedMenuPresenter != null && mExpandedMenuPresenter.mCurrentExpandedItem != null) { + state.expandedMenuItemId = mExpandedMenuPresenter.mCurrentExpandedItem.getItemId(); + } + + state.isOverflowOpen = isOverflowMenuShowing(); + + return state; + } + + @Override + public void onRestoreInstanceState(Parcelable p) { + SavedState state = (SavedState) p; + + super.onRestoreInstanceState(state.getSuperState()); + + if (state.expandedMenuItemId != 0 && + mExpandedMenuPresenter != null && mOptionsMenu != null) { + final MenuItem item = mOptionsMenu.findItem(state.expandedMenuItemId); + if (item != null) { + item.expandActionView(); + } + } + + if (state.isOverflowOpen) { + postShowOverflowMenu(); + } + } + + static class SavedState extends BaseSavedState { + int expandedMenuItemId; + boolean isOverflowOpen; + + SavedState(Parcelable superState) { + super(superState); + } + + private SavedState(Parcel in) { + super(in); + expandedMenuItemId = in.readInt(); + isOverflowOpen = in.readInt() != 0; + } + + @Override + public void writeToParcel(Parcel out, int flags) { + super.writeToParcel(out, flags); + out.writeInt(expandedMenuItemId); + out.writeInt(isOverflowOpen ? 1 : 0); + } + + public static final Parcelable.Creator CREATOR = + new Parcelable.Creator() { + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } + + public static class HomeView extends FrameLayout { + private View mUpView; + private ImageView mIconView; + private int mUpWidth; + + public HomeView(Context context) { + this(context, null); + } + + public HomeView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public void setUp(boolean isUp) { + mUpView.setVisibility(isUp ? VISIBLE : GONE); + } + + public void setIcon(Drawable icon) { + mIconView.setImageDrawable(icon); + } + + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + onPopulateAccessibilityEvent(event); + return true; + } + + @Override + public void onPopulateAccessibilityEvent(AccessibilityEvent event) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + super.onPopulateAccessibilityEvent(event); + } + final CharSequence cdesc = getContentDescription(); + if (!TextUtils.isEmpty(cdesc)) { + event.getText().add(cdesc); + } + } + + @Override + public boolean dispatchHoverEvent(MotionEvent event) { + // Don't allow children to hover; we want this to be treated as a single component. + return onHoverEvent(event); + } + + @Override + protected void onFinishInflate() { + mUpView = findViewById(R.id.abs__up); + mIconView = (ImageView) findViewById(R.id.abs__home); + } + + public int getLeftOffset() { + return mUpView.getVisibility() == GONE ? mUpWidth : 0; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + measureChildWithMargins(mUpView, widthMeasureSpec, 0, heightMeasureSpec, 0); + final LayoutParams upLp = (LayoutParams) mUpView.getLayoutParams(); + mUpWidth = upLp.leftMargin + mUpView.getMeasuredWidth() + upLp.rightMargin; + int width = mUpView.getVisibility() == GONE ? 0 : mUpWidth; + int height = upLp.topMargin + mUpView.getMeasuredHeight() + upLp.bottomMargin; + measureChildWithMargins(mIconView, widthMeasureSpec, width, heightMeasureSpec, 0); + final LayoutParams iconLp = (LayoutParams) mIconView.getLayoutParams(); + width += iconLp.leftMargin + mIconView.getMeasuredWidth() + iconLp.rightMargin; + height = Math.max(height, + iconLp.topMargin + mIconView.getMeasuredHeight() + iconLp.bottomMargin); + + final int widthMode = MeasureSpec.getMode(widthMeasureSpec); + final int heightMode = MeasureSpec.getMode(heightMeasureSpec); + final int widthSize = MeasureSpec.getSize(widthMeasureSpec); + final int heightSize = MeasureSpec.getSize(heightMeasureSpec); + + switch (widthMode) { + case MeasureSpec.AT_MOST: + width = Math.min(width, widthSize); + break; + case MeasureSpec.EXACTLY: + width = widthSize; + break; + case MeasureSpec.UNSPECIFIED: + default: + break; + } + switch (heightMode) { + case MeasureSpec.AT_MOST: + height = Math.min(height, heightSize); + break; + case MeasureSpec.EXACTLY: + height = heightSize; + break; + case MeasureSpec.UNSPECIFIED: + default: + break; + } + setMeasuredDimension(width, height); + } + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + final int vCenter = (b - t) / 2; + //UNUSED int width = r - l; + int upOffset = 0; + if (mUpView.getVisibility() != GONE) { + final LayoutParams upLp = (LayoutParams) mUpView.getLayoutParams(); + final int upHeight = mUpView.getMeasuredHeight(); + final int upWidth = mUpView.getMeasuredWidth(); + final int upTop = vCenter - upHeight / 2; + mUpView.layout(0, upTop, upWidth, upTop + upHeight); + upOffset = upLp.leftMargin + upWidth + upLp.rightMargin; + //UNUSED width -= upOffset; + l += upOffset; + } + final LayoutParams iconLp = (LayoutParams) mIconView.getLayoutParams(); + final int iconHeight = mIconView.getMeasuredHeight(); + final int iconWidth = mIconView.getMeasuredWidth(); + final int hCenter = (r - l) / 2; + final int iconLeft = upOffset + Math.max(iconLp.leftMargin, hCenter - iconWidth / 2); + final int iconTop = Math.max(iconLp.topMargin, vCenter - iconHeight / 2); + mIconView.layout(iconLeft, iconTop, iconLeft + iconWidth, iconTop + iconHeight); + } + } + + private class ExpandedActionViewMenuPresenter implements MenuPresenter { + MenuBuilder mMenu; + MenuItemImpl mCurrentExpandedItem; + + @Override + public void initForMenu(Context context, MenuBuilder menu) { + // Clear the expanded action view when menus change. + if (mMenu != null && mCurrentExpandedItem != null) { + mMenu.collapseItemActionView(mCurrentExpandedItem); + } + mMenu = menu; + } + + @Override + public MenuView getMenuView(ViewGroup root) { + return null; + } + + @Override + public void updateMenuView(boolean cleared) { + // Make sure the expanded item we have is still there. + if (mCurrentExpandedItem != null) { + boolean found = false; + + if (mMenu != null) { + final int count = mMenu.size(); + for (int i = 0; i < count; i++) { + final MenuItem item = mMenu.getItem(i); + if (item == mCurrentExpandedItem) { + found = true; + break; + } + } + } + + if (!found) { + // The item we had expanded disappeared. Collapse. + collapseItemActionView(mMenu, mCurrentExpandedItem); + } + } + } + + @Override + public void setCallback(Callback cb) { + } + + @Override + public boolean onSubMenuSelected(SubMenuBuilder subMenu) { + return false; + } + + @Override + public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) { + } + + @Override + public boolean flagActionItems() { + return false; + } + + @Override + public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) { + mExpandedActionView = item.getActionView(); + mExpandedHomeLayout.setIcon(mIcon.getConstantState().newDrawable(/* TODO getResources() */)); + mCurrentExpandedItem = item; + if (mExpandedActionView.getParent() != ActionBarView.this) { + addView(mExpandedActionView); + } + if (mExpandedHomeLayout.getParent() != ActionBarView.this) { + addView(mExpandedHomeLayout); + } + mHomeLayout.setVisibility(GONE); + if (mTitleLayout != null) mTitleLayout.setVisibility(GONE); + if (mTabScrollView != null) mTabScrollView.setVisibility(GONE); + if (mSpinner != null) mSpinner.setVisibility(GONE); + if (mCustomNavView != null) mCustomNavView.setVisibility(GONE); + requestLayout(); + item.setActionViewExpanded(true); + + if (mExpandedActionView instanceof CollapsibleActionView) { + ((CollapsibleActionView) mExpandedActionView).onActionViewExpanded(); + } + + return true; + } + + @Override + public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) { + // Do this before detaching the actionview from the hierarchy, in case + // it needs to dismiss the soft keyboard, etc. + if (mExpandedActionView instanceof CollapsibleActionView) { + ((CollapsibleActionView) mExpandedActionView).onActionViewCollapsed(); + } + + removeView(mExpandedActionView); + removeView(mExpandedHomeLayout); + mExpandedActionView = null; + if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_HOME) != 0) { + mHomeLayout.setVisibility(VISIBLE); + } + if ((mDisplayOptions & ActionBar.DISPLAY_SHOW_TITLE) != 0) { + if (mTitleLayout == null) { + initTitle(); + } else { + mTitleLayout.setVisibility(VISIBLE); + } + } + if (mTabScrollView != null && mNavigationMode == ActionBar.NAVIGATION_MODE_TABS) { + mTabScrollView.setVisibility(VISIBLE); + } + if (mSpinner != null && mNavigationMode == ActionBar.NAVIGATION_MODE_LIST) { + mSpinner.setVisibility(VISIBLE); + } + if (mCustomNavView != null && (mDisplayOptions & ActionBar.DISPLAY_SHOW_CUSTOM) != 0) { + mCustomNavView.setVisibility(VISIBLE); + } + mExpandedHomeLayout.setIcon(null); + mCurrentExpandedItem = null; + requestLayout(); + item.setActionViewExpanded(false); + + return true; + } + + @Override + public int getId() { + return 0; + } + + @Override + public Parcelable onSaveInstanceState() { + return null; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java new file mode 100644 index 0000000000..fa3698f3b4 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingButton.java @@ -0,0 +1,40 @@ +package com.actionbarsherlock.internal.widget; + +import java.util.Locale; +import android.content.Context; +import android.content.res.TypedArray; +import android.os.Build; +import android.util.AttributeSet; +import android.widget.Button; + +public class CapitalizingButton extends Button { + private static final boolean SANS_ICE_CREAM = Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH; + 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.textAllCaps + }; + private static final int R_styleable_Button_textAllCaps = 0; + + private boolean mAllCaps; + + public CapitalizingButton(Context context, AttributeSet attrs) { + super(context, attrs); + + TypedArray a = context.obtainStyledAttributes(attrs, R_styleable_Button); + mAllCaps = a.getBoolean(R_styleable_Button_textAllCaps, true); + a.recycle(); + } + + public void setTextCompat(CharSequence text) { + if (SANS_ICE_CREAM && mAllCaps && text != null) { + if (IS_GINGERBREAD) { + setText(text.toString().toUpperCase(Locale.ROOT)); + } else { + setText(text.toString().toUpperCase()); + } + } else { + setText(text); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingTextView.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingTextView.java new file mode 100644 index 0000000000..cae8b8aed3 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CapitalizingTextView.java @@ -0,0 +1,50 @@ +package com.actionbarsherlock.internal.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.os.Build; +import android.util.AttributeSet; +import android.widget.TextView; + +import java.util.Locale; + +public class CapitalizingTextView extends TextView { + private static final boolean SANS_ICE_CREAM = Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH; + private static final boolean IS_GINGERBREAD = Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD; + + private static final int[] R_styleable_TextView = new int[] { + android.R.attr.textAllCaps + }; + private static final int R_styleable_TextView_textAllCaps = 0; + + private boolean mAllCaps; + + public CapitalizingTextView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public CapitalizingTextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + TypedArray a = context.obtainStyledAttributes(attrs, R_styleable_TextView, defStyle, 0); + mAllCaps = a.getBoolean(R_styleable_TextView_textAllCaps, true); + a.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()); + } + } else { + setText(text); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CollapsibleActionViewWrapper.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CollapsibleActionViewWrapper.java new file mode 100644 index 0000000000..14f092c81f --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/CollapsibleActionViewWrapper.java @@ -0,0 +1,30 @@ +package com.actionbarsherlock.internal.widget; + +import android.view.View; +import android.widget.FrameLayout; +import com.actionbarsherlock.view.CollapsibleActionView; + +/** + * Wraps an ABS collapsible action view in a native container that delegates the calls. + */ +public class CollapsibleActionViewWrapper extends FrameLayout implements android.view.CollapsibleActionView { + private final CollapsibleActionView child; + + public CollapsibleActionViewWrapper(View child) { + super(child.getContext()); + this.child = (CollapsibleActionView) child; + addView(child); + } + + @Override public void onActionViewExpanded() { + child.onActionViewExpanded(); + } + + @Override public void onActionViewCollapsed() { + child.onActionViewCollapsed(); + } + + public View unwrap() { + return getChildAt(0); + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java new file mode 100644 index 0000000000..ad1b4f0a85 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/FakeDialogPhoneWindow.java @@ -0,0 +1,64 @@ +package com.actionbarsherlock.internal.widget; + +import static android.view.View.MeasureSpec.EXACTLY; +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.util.TypedValue; +import android.widget.LinearLayout; +import com.actionbarsherlock.R; + +public class FakeDialogPhoneWindow extends LinearLayout { + final TypedValue mMinWidthMajor = new TypedValue(); + final TypedValue mMinWidthMinor = new TypedValue(); + + public FakeDialogPhoneWindow(Context context, AttributeSet attrs) { + super(context, attrs); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SherlockTheme); + + a.getValue(R.styleable.SherlockTheme_windowMinWidthMajor, mMinWidthMajor); + a.getValue(R.styleable.SherlockTheme_windowMinWidthMinor, mMinWidthMinor); + + a.recycle(); + } + + /* Stolen from PhoneWindow */ + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final DisplayMetrics metrics = getContext().getResources().getDisplayMetrics(); + final boolean isPortrait = metrics.widthPixels < metrics.heightPixels; + + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + int width = getMeasuredWidth(); + boolean measure = false; + + widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, EXACTLY); + + final TypedValue tv = isPortrait ? mMinWidthMinor : mMinWidthMajor; + + if (tv.type != TypedValue.TYPE_NULL) { + final int min; + if (tv.type == TypedValue.TYPE_DIMENSION) { + min = (int)tv.getDimension(metrics); + } else if (tv.type == TypedValue.TYPE_FRACTION) { + min = (int)tv.getFraction(metrics.widthPixels, metrics.widthPixels); + } else { + min = 0; + } + + if (width < min) { + widthMeasureSpec = MeasureSpec.makeMeasureSpec(min, EXACTLY); + measure = true; + } + } + + // TODO: Support height? + + if (measure) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAbsSpinner.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAbsSpinner.java new file mode 100644 index 0000000000..ce0cb3bcaa --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAbsSpinner.java @@ -0,0 +1,479 @@ +/* + * Copyright (C) 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. + */ + +package com.actionbarsherlock.internal.widget; + +import android.content.Context; +import android.database.DataSetObserver; +import android.graphics.Rect; +import android.os.Build; +import android.os.Parcel; +import android.os.Parcelable; +import android.util.AttributeSet; +import android.util.SparseArray; +import android.view.View; +import android.view.ViewGroup; +import android.widget.SpinnerAdapter; + +/** + * An abstract base class for spinner widgets. SDK users will probably not + * need to use this class. + * + * @attr ref android.R.styleable#AbsSpinner_entries + */ +public abstract class IcsAbsSpinner extends IcsAdapterView { + private static final boolean IS_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; + + SpinnerAdapter mAdapter; + + int mHeightMeasureSpec; + int mWidthMeasureSpec; + boolean mBlockLayoutRequests; + + int mSelectionLeftPadding = 0; + int mSelectionTopPadding = 0; + int mSelectionRightPadding = 0; + int mSelectionBottomPadding = 0; + final Rect mSpinnerPadding = new Rect(); + + final RecycleBin mRecycler = new RecycleBin(); + private DataSetObserver mDataSetObserver; + + /** Temporary frame to hold a child View's frame rectangle */ + private Rect mTouchFrame; + + public IcsAbsSpinner(Context context) { + super(context); + initAbsSpinner(); + } + + public IcsAbsSpinner(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public IcsAbsSpinner(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + initAbsSpinner(); + + /* + TypedArray a = context.obtainStyledAttributes(attrs, + com.android.internal.R.styleable.AbsSpinner, defStyle, 0); + + CharSequence[] entries = a.getTextArray(R.styleable.AbsSpinner_entries); + if (entries != null) { + ArrayAdapter adapter = + new ArrayAdapter(context, + R.layout.simple_spinner_item, entries); + adapter.setDropDownViewResource(R.layout.simple_spinner_dropdown_item); + setAdapter(adapter); + } + + a.recycle(); + */ + } + + /** + * Common code for different constructor flavors + */ + private void initAbsSpinner() { + setFocusable(true); + setWillNotDraw(false); + } + + /** + * The Adapter is used to provide the data which backs this Spinner. + * It also provides methods to transform spinner items based on their position + * relative to the selected item. + * @param adapter The SpinnerAdapter to use for this Spinner + */ + @Override + public void setAdapter(SpinnerAdapter adapter) { + if (null != mAdapter) { + mAdapter.unregisterDataSetObserver(mDataSetObserver); + resetList(); + } + + mAdapter = adapter; + + mOldSelectedPosition = INVALID_POSITION; + mOldSelectedRowId = INVALID_ROW_ID; + + if (mAdapter != null) { + mOldItemCount = mItemCount; + mItemCount = mAdapter.getCount(); + checkFocus(); + + mDataSetObserver = new AdapterDataSetObserver(); + mAdapter.registerDataSetObserver(mDataSetObserver); + + int position = mItemCount > 0 ? 0 : INVALID_POSITION; + + setSelectedPositionInt(position); + setNextSelectedPositionInt(position); + + if (mItemCount == 0) { + // Nothing selected + checkSelectionChanged(); + } + + } else { + checkFocus(); + resetList(); + // Nothing selected + checkSelectionChanged(); + } + + requestLayout(); + } + + /** + * Clear out all children from the list + */ + void resetList() { + mDataChanged = false; + mNeedSync = false; + + removeAllViewsInLayout(); + mOldSelectedPosition = INVALID_POSITION; + mOldSelectedRowId = INVALID_ROW_ID; + + setSelectedPositionInt(INVALID_POSITION); + setNextSelectedPositionInt(INVALID_POSITION); + invalidate(); + } + + /** + * @see android.view.View#measure(int, int) + * + * Figure out the dimensions of this Spinner. The width comes from + * the widthMeasureSpec as Spinnners can't have their width set to + * UNSPECIFIED. The height is based on the height of the selected item + * plus padding. + */ + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + int widthSize; + int heightSize; + + final int mPaddingLeft = getPaddingLeft(); + final int mPaddingTop = getPaddingTop(); + final int mPaddingRight = getPaddingRight(); + final int mPaddingBottom = getPaddingBottom(); + + mSpinnerPadding.left = mPaddingLeft > mSelectionLeftPadding ? mPaddingLeft + : mSelectionLeftPadding; + mSpinnerPadding.top = mPaddingTop > mSelectionTopPadding ? mPaddingTop + : mSelectionTopPadding; + mSpinnerPadding.right = mPaddingRight > mSelectionRightPadding ? mPaddingRight + : mSelectionRightPadding; + mSpinnerPadding.bottom = mPaddingBottom > mSelectionBottomPadding ? mPaddingBottom + : mSelectionBottomPadding; + + if (mDataChanged) { + handleDataChanged(); + } + + int preferredHeight = 0; + int preferredWidth = 0; + boolean needsMeasuring = true; + + int selectedPosition = getSelectedItemPosition(); + if (selectedPosition >= 0 && mAdapter != null && selectedPosition < mAdapter.getCount()) { + // Try looking in the recycler. (Maybe we were measured once already) + View view = mRecycler.get(selectedPosition); + if (view == null) { + // Make a new one + view = mAdapter.getView(selectedPosition, null, this); + } + + if (view != null) { + // Put in recycler for re-measuring and/or layout + mRecycler.put(selectedPosition, view); + } + + if (view != null) { + if (view.getLayoutParams() == null) { + mBlockLayoutRequests = true; + view.setLayoutParams(generateDefaultLayoutParams()); + mBlockLayoutRequests = false; + } + measureChild(view, widthMeasureSpec, heightMeasureSpec); + + preferredHeight = getChildHeight(view) + mSpinnerPadding.top + mSpinnerPadding.bottom; + preferredWidth = getChildWidth(view) + mSpinnerPadding.left + mSpinnerPadding.right; + + needsMeasuring = false; + } + } + + if (needsMeasuring) { + // No views -- just use padding + preferredHeight = mSpinnerPadding.top + mSpinnerPadding.bottom; + if (widthMode == MeasureSpec.UNSPECIFIED) { + preferredWidth = mSpinnerPadding.left + mSpinnerPadding.right; + } + } + + preferredHeight = Math.max(preferredHeight, getSuggestedMinimumHeight()); + preferredWidth = Math.max(preferredWidth, getSuggestedMinimumWidth()); + + if (IS_HONEYCOMB) { + heightSize = resolveSizeAndState(preferredHeight, heightMeasureSpec, 0); + widthSize = resolveSizeAndState(preferredWidth, widthMeasureSpec, 0); + } else { + heightSize = resolveSize(preferredHeight, heightMeasureSpec); + widthSize = resolveSize(preferredWidth, widthMeasureSpec); + } + + setMeasuredDimension(widthSize, heightSize); + mHeightMeasureSpec = heightMeasureSpec; + mWidthMeasureSpec = widthMeasureSpec; + } + + int getChildHeight(View child) { + return child.getMeasuredHeight(); + } + + int getChildWidth(View child) { + return child.getMeasuredWidth(); + } + + @Override + protected ViewGroup.LayoutParams generateDefaultLayoutParams() { + return new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT); + } + + void recycleAllViews() { + final int childCount = getChildCount(); + final IcsAbsSpinner.RecycleBin recycleBin = mRecycler; + final int position = mFirstPosition; + + // All views go in recycler + for (int i = 0; i < childCount; i++) { + View v = getChildAt(i); + int index = position + i; + recycleBin.put(index, v); + } + } + + /** + * Jump directly to a specific item in the adapter data. + */ + public void setSelection(int position, boolean animate) { + // Animate only if requested position is already on screen somewhere + boolean shouldAnimate = animate && mFirstPosition <= position && + position <= mFirstPosition + getChildCount() - 1; + setSelectionInt(position, shouldAnimate); + } + + @Override + public void setSelection(int position) { + setNextSelectedPositionInt(position); + requestLayout(); + invalidate(); + } + + + /** + * Makes the item at the supplied position selected. + * + * @param position Position to select + * @param animate Should the transition be animated + * + */ + void setSelectionInt(int position, boolean animate) { + if (position != mOldSelectedPosition) { + mBlockLayoutRequests = true; + int delta = position - mSelectedPosition; + setNextSelectedPositionInt(position); + layout(delta, animate); + mBlockLayoutRequests = false; + } + } + + abstract void layout(int delta, boolean animate); + + @Override + public View getSelectedView() { + if (mItemCount > 0 && mSelectedPosition >= 0) { + return getChildAt(mSelectedPosition - mFirstPosition); + } else { + return null; + } + } + + /** + * Override to prevent spamming ourselves with layout requests + * as we place views + * + * @see android.view.View#requestLayout() + */ + @Override + public void requestLayout() { + if (!mBlockLayoutRequests) { + super.requestLayout(); + } + } + + @Override + public SpinnerAdapter getAdapter() { + return mAdapter; + } + + @Override + public int getCount() { + return mItemCount; + } + + /** + * Maps a point to a position in the list. + * + * @param x X in local coordinate + * @param y Y in local coordinate + * @return The position of the item which contains the specified point, or + * {@link #INVALID_POSITION} if the point does not intersect an item. + */ + public int pointToPosition(int x, int y) { + Rect frame = mTouchFrame; + if (frame == null) { + mTouchFrame = new Rect(); + frame = mTouchFrame; + } + + final int count = getChildCount(); + for (int i = count - 1; i >= 0; i--) { + View child = getChildAt(i); + if (child.getVisibility() == View.VISIBLE) { + child.getHitRect(frame); + if (frame.contains(x, y)) { + return mFirstPosition + i; + } + } + } + return INVALID_POSITION; + } + + static class SavedState extends BaseSavedState { + long selectedId; + int position; + + /** + * Constructor called from {@link AbsSpinner#onSaveInstanceState()} + */ + SavedState(Parcelable superState) { + super(superState); + } + + /** + * Constructor called from {@link #CREATOR} + */ + private SavedState(Parcel in) { + super(in); + selectedId = in.readLong(); + position = in.readInt(); + } + + @Override + public void writeToParcel(Parcel out, int flags) { + super.writeToParcel(out, flags); + out.writeLong(selectedId); + out.writeInt(position); + } + + @Override + public String toString() { + return "AbsSpinner.SavedState{" + + Integer.toHexString(System.identityHashCode(this)) + + " selectedId=" + selectedId + + " position=" + position + "}"; + } + + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } + + @Override + public Parcelable onSaveInstanceState() { + Parcelable superState = super.onSaveInstanceState(); + SavedState ss = new SavedState(superState); + ss.selectedId = getSelectedItemId(); + if (ss.selectedId >= 0) { + ss.position = getSelectedItemPosition(); + } else { + ss.position = INVALID_POSITION; + } + return ss; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + SavedState ss = (SavedState) state; + + super.onRestoreInstanceState(ss.getSuperState()); + + if (ss.selectedId >= 0) { + mDataChanged = true; + mNeedSync = true; + mSyncRowId = ss.selectedId; + mSyncPosition = ss.position; + mSyncMode = SYNC_SELECTED_POSITION; + requestLayout(); + } + } + + class RecycleBin { + private final SparseArray mScrapHeap = new SparseArray(); + + public void put(int position, View v) { + mScrapHeap.put(position, v); + } + + View get(int position) { + // System.out.print("Looking for " + position); + View result = mScrapHeap.get(position); + if (result != null) { + // System.out.println(" HIT"); + mScrapHeap.delete(position); + } else { + // System.out.println(" MISS"); + } + return result; + } + + void clear() { + final SparseArray scrapHeap = mScrapHeap; + final int count = scrapHeap.size(); + for (int i = 0; i < count; i++) { + final View view = scrapHeap.valueAt(i); + if (view != null) { + removeDetachedView(view, true); + } + } + scrapHeap.clear(); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAdapterView.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAdapterView.java new file mode 100644 index 0000000000..c786dc5c19 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsAdapterView.java @@ -0,0 +1,1160 @@ +/* + * Copyright (C) 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. + */ + +package com.actionbarsherlock.internal.widget; + +import android.content.Context; +import android.database.DataSetObserver; +import android.os.Parcelable; +import android.os.SystemClock; +import android.util.AttributeSet; +import android.util.SparseArray; +import android.view.ContextMenu; +import android.view.SoundEffectConstants; +import android.view.View; +import android.view.ViewDebug; +import android.view.ViewGroup; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; +import android.widget.Adapter; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ListView; + + +/** + * An AdapterView is a view whose children are determined by an {@link Adapter}. + * + *

+ * See {@link ListView}, {@link GridView}, {@link Spinner} and + * {@link Gallery} for commonly used subclasses of AdapterView. + * + *

+ *

Developer Guides

+ *

For more information about using AdapterView, read the + * Binding to Data with AdapterView + * developer guide.

+ */ +public abstract class IcsAdapterView extends ViewGroup { + + /** + * The item view type returned by {@link Adapter#getItemViewType(int)} when + * the adapter does not want the item's view recycled. + */ + public static final int ITEM_VIEW_TYPE_IGNORE = -1; + + /** + * The item view type returned by {@link Adapter#getItemViewType(int)} when + * the item is a header or footer. + */ + public static final int ITEM_VIEW_TYPE_HEADER_OR_FOOTER = -2; + + /** + * The position of the first child displayed + */ + @ViewDebug.ExportedProperty(category = "scrolling") + int mFirstPosition = 0; + + /** + * The offset in pixels from the top of the AdapterView to the top + * of the view to select during the next layout. + */ + int mSpecificTop; + + /** + * Position from which to start looking for mSyncRowId + */ + int mSyncPosition; + + /** + * Row id to look for when data has changed + */ + long mSyncRowId = INVALID_ROW_ID; + + /** + * Height of the view when mSyncPosition and mSyncRowId where set + */ + long mSyncHeight; + + /** + * True if we need to sync to mSyncRowId + */ + boolean mNeedSync = false; + + /** + * Indicates whether to sync based on the selection or position. Possible + * values are {@link #SYNC_SELECTED_POSITION} or + * {@link #SYNC_FIRST_POSITION}. + */ + int mSyncMode; + + /** + * Our height after the last layout + */ + private int mLayoutHeight; + + /** + * Sync based on the selected child + */ + static final int SYNC_SELECTED_POSITION = 0; + + /** + * Sync based on the first child displayed + */ + static final int SYNC_FIRST_POSITION = 1; + + /** + * Maximum amount of time to spend in {@link #findSyncPosition()} + */ + static final int SYNC_MAX_DURATION_MILLIS = 100; + + /** + * Indicates that this view is currently being laid out. + */ + boolean mInLayout = false; + + /** + * The listener that receives notifications when an item is selected. + */ + OnItemSelectedListener mOnItemSelectedListener; + + /** + * The listener that receives notifications when an item is clicked. + */ + OnItemClickListener mOnItemClickListener; + + /** + * The listener that receives notifications when an item is long clicked. + */ + OnItemLongClickListener mOnItemLongClickListener; + + /** + * True if the data has changed since the last layout + */ + boolean mDataChanged; + + /** + * The position within the adapter's data set of the item to select + * during the next layout. + */ + @ViewDebug.ExportedProperty(category = "list") + int mNextSelectedPosition = INVALID_POSITION; + + /** + * The item id of the item to select during the next layout. + */ + long mNextSelectedRowId = INVALID_ROW_ID; + + /** + * The position within the adapter's data set of the currently selected item. + */ + @ViewDebug.ExportedProperty(category = "list") + int mSelectedPosition = INVALID_POSITION; + + /** + * The item id of the currently selected item. + */ + long mSelectedRowId = INVALID_ROW_ID; + + /** + * View to show if there are no items to show. + */ + private View mEmptyView; + + /** + * The number of items in the current adapter. + */ + @ViewDebug.ExportedProperty(category = "list") + int mItemCount; + + /** + * The number of items in the adapter before a data changed event occurred. + */ + int mOldItemCount; + + /** + * Represents an invalid position. All valid positions are in the range 0 to 1 less than the + * number of items in the current adapter. + */ + public static final int INVALID_POSITION = -1; + + /** + * Represents an empty or invalid row id + */ + public static final long INVALID_ROW_ID = Long.MIN_VALUE; + + /** + * The last selected position we used when notifying + */ + int mOldSelectedPosition = INVALID_POSITION; + + /** + * The id of the last selected position we used when notifying + */ + long mOldSelectedRowId = INVALID_ROW_ID; + + /** + * Indicates what focusable state is requested when calling setFocusable(). + * In addition to this, this view has other criteria for actually + * determining the focusable state (such as whether its empty or the text + * filter is shown). + * + * @see #setFocusable(boolean) + * @see #checkFocus() + */ + private boolean mDesiredFocusableState; + private boolean mDesiredFocusableInTouchModeState; + + private SelectionNotifier mSelectionNotifier; + /** + * When set to true, calls to requestLayout() will not propagate up the parent hierarchy. + * This is used to layout the children during a layout pass. + */ + boolean mBlockLayoutRequests = false; + + public IcsAdapterView(Context context) { + super(context); + } + + public IcsAdapterView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public IcsAdapterView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + } + + /** + * Register a callback to be invoked when an item in this AdapterView has + * been clicked. + * + * @param listener The callback that will be invoked. + */ + public void setOnItemClickListener(OnItemClickListener listener) { + mOnItemClickListener = listener; + } + + /** + * @return The callback to be invoked with an item in this AdapterView has + * been clicked, or null id no callback has been set. + */ + public final OnItemClickListener getOnItemClickListener() { + return mOnItemClickListener; + } + + /** + * Call the OnItemClickListener, if it is defined. + * + * @param view The view within the AdapterView that was clicked. + * @param position The position of the view in the adapter. + * @param id The row id of the item that was clicked. + * @return True if there was an assigned OnItemClickListener that was + * called, false otherwise is returned. + */ + public boolean performItemClick(View view, int position, long id) { + if (mOnItemClickListener != null) { + playSoundEffect(SoundEffectConstants.CLICK); + if (view != null) { + view.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); + } + mOnItemClickListener.onItemClick(/*this*/null, view, position, id); + return true; + } + + return false; + } + + /** + * Interface definition for a callback to be invoked when an item in this + * view has been clicked and held. + */ + public interface OnItemLongClickListener { + /** + * Callback method to be invoked when an item in this view has been + * clicked and held. + * + * Implementers can call getItemAtPosition(position) if they need to access + * the data associated with the selected item. + * + * @param parent The AbsListView where the click happened + * @param view The view within the AbsListView that was clicked + * @param position The position of the view in the list + * @param id The row id of the item that was clicked + * + * @return true if the callback consumed the long click, false otherwise + */ + boolean onItemLongClick(IcsAdapterView parent, View view, int position, long id); + } + + + /** + * Register a callback to be invoked when an item in this AdapterView has + * been clicked and held + * + * @param listener The callback that will run + */ + public void setOnItemLongClickListener(OnItemLongClickListener listener) { + if (!isLongClickable()) { + setLongClickable(true); + } + mOnItemLongClickListener = listener; + } + + /** + * @return The callback to be invoked with an item in this AdapterView has + * been clicked and held, or null id no callback as been set. + */ + public final OnItemLongClickListener getOnItemLongClickListener() { + return mOnItemLongClickListener; + } + + /** + * Interface definition for a callback to be invoked when + * an item in this view has been selected. + */ + public interface OnItemSelectedListener { + /** + *

Callback method to be invoked when an item in this view has been + * selected. This callback is invoked only when the newly selected + * position is different from the previously selected position or if + * there was no selected item.

+ * + * Impelmenters can call getItemAtPosition(position) if they need to access the + * data associated with the selected item. + * + * @param parent The AdapterView where the selection happened + * @param view The view within the AdapterView that was clicked + * @param position The position of the view in the adapter + * @param id The row id of the item that is selected + */ + void onItemSelected(IcsAdapterView parent, View view, int position, long id); + + /** + * Callback method to be invoked when the selection disappears from this + * view. The selection can disappear for instance when touch is activated + * or when the adapter becomes empty. + * + * @param parent The AdapterView that now contains no selected item. + */ + void onNothingSelected(IcsAdapterView parent); + } + + + /** + * Register a callback to be invoked when an item in this AdapterView has + * been selected. + * + * @param listener The callback that will run + */ + public void setOnItemSelectedListener(OnItemSelectedListener listener) { + mOnItemSelectedListener = listener; + } + + public final OnItemSelectedListener getOnItemSelectedListener() { + return mOnItemSelectedListener; + } + + /** + * Extra menu information provided to the + * {@link android.view.View.OnCreateContextMenuListener#onCreateContextMenu(ContextMenu, View, ContextMenuInfo) } + * callback when a context menu is brought up for this AdapterView. + * + */ + public static class AdapterContextMenuInfo implements ContextMenu.ContextMenuInfo { + + public AdapterContextMenuInfo(View targetView, int position, long id) { + this.targetView = targetView; + this.position = position; + this.id = id; + } + + /** + * The child view for which the context menu is being displayed. This + * will be one of the children of this AdapterView. + */ + public View targetView; + + /** + * The position in the adapter for which the context menu is being + * displayed. + */ + public int position; + + /** + * The row id of the item for which the context menu is being displayed. + */ + public long id; + } + + /** + * Returns the adapter currently associated with this widget. + * + * @return The adapter used to provide this view's content. + */ + public abstract T getAdapter(); + + /** + * Sets the adapter that provides the data and the views to represent the data + * in this widget. + * + * @param adapter The adapter to use to create this view's content. + */ + public abstract void setAdapter(T adapter); + + /** + * This method is not supported and throws an UnsupportedOperationException when called. + * + * @param child Ignored. + * + * @throws UnsupportedOperationException Every time this method is invoked. + */ + @Override + public void addView(View child) { + throw new UnsupportedOperationException("addView(View) is not supported in AdapterView"); + } + + /** + * This method is not supported and throws an UnsupportedOperationException when called. + * + * @param child Ignored. + * @param index Ignored. + * + * @throws UnsupportedOperationException Every time this method is invoked. + */ + @Override + public void addView(View child, int index) { + throw new UnsupportedOperationException("addView(View, int) is not supported in AdapterView"); + } + + /** + * This method is not supported and throws an UnsupportedOperationException when called. + * + * @param child Ignored. + * @param params Ignored. + * + * @throws UnsupportedOperationException Every time this method is invoked. + */ + @Override + public void addView(View child, LayoutParams params) { + throw new UnsupportedOperationException("addView(View, LayoutParams) " + + "is not supported in AdapterView"); + } + + /** + * This method is not supported and throws an UnsupportedOperationException when called. + * + * @param child Ignored. + * @param index Ignored. + * @param params Ignored. + * + * @throws UnsupportedOperationException Every time this method is invoked. + */ + @Override + public void addView(View child, int index, LayoutParams params) { + throw new UnsupportedOperationException("addView(View, int, LayoutParams) " + + "is not supported in AdapterView"); + } + + /** + * This method is not supported and throws an UnsupportedOperationException when called. + * + * @param child Ignored. + * + * @throws UnsupportedOperationException Every time this method is invoked. + */ + @Override + public void removeView(View child) { + throw new UnsupportedOperationException("removeView(View) is not supported in AdapterView"); + } + + /** + * This method is not supported and throws an UnsupportedOperationException when called. + * + * @param index Ignored. + * + * @throws UnsupportedOperationException Every time this method is invoked. + */ + @Override + public void removeViewAt(int index) { + throw new UnsupportedOperationException("removeViewAt(int) is not supported in AdapterView"); + } + + /** + * This method is not supported and throws an UnsupportedOperationException when called. + * + * @throws UnsupportedOperationException Every time this method is invoked. + */ + @Override + public void removeAllViews() { + throw new UnsupportedOperationException("removeAllViews() is not supported in AdapterView"); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + mLayoutHeight = getHeight(); + } + + /** + * Return the position of the currently selected item within the adapter's data set + * + * @return int Position (starting at 0), or {@link #INVALID_POSITION} if there is nothing selected. + */ + @ViewDebug.CapturedViewProperty + public int getSelectedItemPosition() { + return mNextSelectedPosition; + } + + /** + * @return The id corresponding to the currently selected item, or {@link #INVALID_ROW_ID} + * if nothing is selected. + */ + @ViewDebug.CapturedViewProperty + public long getSelectedItemId() { + return mNextSelectedRowId; + } + + /** + * @return The view corresponding to the currently selected item, or null + * if nothing is selected + */ + public abstract View getSelectedView(); + + /** + * @return The data corresponding to the currently selected item, or + * null if there is nothing selected. + */ + public Object getSelectedItem() { + T adapter = getAdapter(); + int selection = getSelectedItemPosition(); + if (adapter != null && adapter.getCount() > 0 && selection >= 0) { + return adapter.getItem(selection); + } else { + return null; + } + } + + /** + * @return The number of items owned by the Adapter associated with this + * AdapterView. (This is the number of data items, which may be + * larger than the number of visible views.) + */ + @ViewDebug.CapturedViewProperty + public int getCount() { + return mItemCount; + } + + /** + * Get the position within the adapter's data set for the view, where view is a an adapter item + * or a descendant of an adapter item. + * + * @param view an adapter item, or a descendant of an adapter item. This must be visible in this + * AdapterView at the time of the call. + * @return the position within the adapter's data set of the view, or {@link #INVALID_POSITION} + * if the view does not correspond to a list item (or it is not currently visible). + */ + public int getPositionForView(View view) { + View listItem = view; + try { + View v; + while (!(v = (View) listItem.getParent()).equals(this)) { + listItem = v; + } + } catch (ClassCastException e) { + // We made it up to the window without find this list view + return INVALID_POSITION; + } + + // Search the children for the list item + final int childCount = getChildCount(); + for (int i = 0; i < childCount; i++) { + if (getChildAt(i).equals(listItem)) { + return mFirstPosition + i; + } + } + + // Child not found! + return INVALID_POSITION; + } + + /** + * Returns the position within the adapter's data set for the first item + * displayed on screen. + * + * @return The position within the adapter's data set + */ + public int getFirstVisiblePosition() { + return mFirstPosition; + } + + /** + * Returns the position within the adapter's data set for the last item + * displayed on screen. + * + * @return The position within the adapter's data set + */ + public int getLastVisiblePosition() { + return mFirstPosition + getChildCount() - 1; + } + + /** + * Sets the currently selected item. To support accessibility subclasses that + * override this method must invoke the overriden super method first. + * + * @param position Index (starting at 0) of the data item to be selected. + */ + public abstract void setSelection(int position); + + /** + * Sets the view to show if the adapter is empty + */ + public void setEmptyView(View emptyView) { + mEmptyView = emptyView; + + final T adapter = getAdapter(); + final boolean empty = ((adapter == null) || adapter.isEmpty()); + updateEmptyStatus(empty); + } + + /** + * When the current adapter is empty, the AdapterView can display a special view + * call the empty view. The empty view is used to provide feedback to the user + * that no data is available in this AdapterView. + * + * @return The view to show if the adapter is empty. + */ + public View getEmptyView() { + return mEmptyView; + } + + /** + * Indicates whether this view is in filter mode. Filter mode can for instance + * be enabled by a user when typing on the keyboard. + * + * @return True if the view is in filter mode, false otherwise. + */ + boolean isInFilterMode() { + return false; + } + + @Override + public void setFocusable(boolean focusable) { + final T adapter = getAdapter(); + final boolean empty = adapter == null || adapter.getCount() == 0; + + mDesiredFocusableState = focusable; + if (!focusable) { + mDesiredFocusableInTouchModeState = false; + } + + super.setFocusable(focusable && (!empty || isInFilterMode())); + } + + @Override + public void setFocusableInTouchMode(boolean focusable) { + final T adapter = getAdapter(); + final boolean empty = adapter == null || adapter.getCount() == 0; + + mDesiredFocusableInTouchModeState = focusable; + if (focusable) { + mDesiredFocusableState = true; + } + + super.setFocusableInTouchMode(focusable && (!empty || isInFilterMode())); + } + + void checkFocus() { + final T adapter = getAdapter(); + final boolean empty = adapter == null || adapter.getCount() == 0; + final boolean focusable = !empty || isInFilterMode(); + // The order in which we set focusable in touch mode/focusable may matter + // for the client, see View.setFocusableInTouchMode() comments for more + // details + super.setFocusableInTouchMode(focusable && mDesiredFocusableInTouchModeState); + super.setFocusable(focusable && mDesiredFocusableState); + if (mEmptyView != null) { + updateEmptyStatus((adapter == null) || adapter.isEmpty()); + } + } + + /** + * Update the status of the list based on the empty parameter. If empty is true and + * we have an empty view, display it. In all the other cases, make sure that the listview + * is VISIBLE and that the empty view is GONE (if it's not null). + */ + private void updateEmptyStatus(boolean empty) { + if (isInFilterMode()) { + empty = false; + } + + if (empty) { + if (mEmptyView != null) { + mEmptyView.setVisibility(View.VISIBLE); + setVisibility(View.GONE); + } else { + // If the caller just removed our empty view, make sure the list view is visible + setVisibility(View.VISIBLE); + } + + // We are now GONE, so pending layouts will not be dispatched. + // Force one here to make sure that the state of the list matches + // the state of the adapter. + if (mDataChanged) { + this.onLayout(false, getLeft(), getTop(), getRight(), getBottom()); + } + } else { + if (mEmptyView != null) mEmptyView.setVisibility(View.GONE); + setVisibility(View.VISIBLE); + } + } + + /** + * Gets the data associated with the specified position in the list. + * + * @param position Which data to get + * @return The data associated with the specified position in the list + */ + public Object getItemAtPosition(int position) { + T adapter = getAdapter(); + return (adapter == null || position < 0) ? null : adapter.getItem(position); + } + + public long getItemIdAtPosition(int position) { + T adapter = getAdapter(); + return (adapter == null || position < 0) ? INVALID_ROW_ID : adapter.getItemId(position); + } + + @Override + public void setOnClickListener(OnClickListener l) { + throw new RuntimeException("Don't call setOnClickListener for an AdapterView. " + + "You probably want setOnItemClickListener instead"); + } + + /** + * Override to prevent freezing of any views created by the adapter. + */ + @Override + protected void dispatchSaveInstanceState(SparseArray container) { + dispatchFreezeSelfOnly(container); + } + + /** + * Override to prevent thawing of any views created by the adapter. + */ + @Override + protected void dispatchRestoreInstanceState(SparseArray container) { + dispatchThawSelfOnly(container); + } + + class AdapterDataSetObserver extends DataSetObserver { + + private Parcelable mInstanceState = null; + + @Override + public void onChanged() { + mDataChanged = true; + mOldItemCount = mItemCount; + mItemCount = getAdapter().getCount(); + + // Detect the case where a cursor that was previously invalidated has + // been repopulated with new data. + if (IcsAdapterView.this.getAdapter().hasStableIds() && mInstanceState != null + && mOldItemCount == 0 && mItemCount > 0) { + IcsAdapterView.this.onRestoreInstanceState(mInstanceState); + mInstanceState = null; + } else { + rememberSyncState(); + } + checkFocus(); + requestLayout(); + } + + @Override + public void onInvalidated() { + mDataChanged = true; + + if (IcsAdapterView.this.getAdapter().hasStableIds()) { + // Remember the current state for the case where our hosting activity is being + // stopped and later restarted + mInstanceState = IcsAdapterView.this.onSaveInstanceState(); + } + + // Data is invalid so we should reset our state + mOldItemCount = mItemCount; + mItemCount = 0; + mSelectedPosition = INVALID_POSITION; + mSelectedRowId = INVALID_ROW_ID; + mNextSelectedPosition = INVALID_POSITION; + mNextSelectedRowId = INVALID_ROW_ID; + mNeedSync = false; + + checkFocus(); + requestLayout(); + } + + public void clearSavedState() { + mInstanceState = null; + } + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + removeCallbacks(mSelectionNotifier); + } + + private class SelectionNotifier implements Runnable { + public void run() { + if (mDataChanged) { + // Data has changed between when this SelectionNotifier + // was posted and now. We need to wait until the AdapterView + // has been synched to the new data. + if (getAdapter() != null) { + post(this); + } + } else { + fireOnSelected(); + } + } + } + + void selectionChanged() { + if (mOnItemSelectedListener != null) { + if (mInLayout || mBlockLayoutRequests) { + // If we are in a layout traversal, defer notification + // by posting. This ensures that the view tree is + // in a consistent state and is able to accomodate + // new layout or invalidate requests. + if (mSelectionNotifier == null) { + mSelectionNotifier = new SelectionNotifier(); + } + post(mSelectionNotifier); + } else { + fireOnSelected(); + } + } + + // we fire selection events here not in View + if (mSelectedPosition != ListView.INVALID_POSITION && isShown() && !isInTouchMode()) { + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); + } + } + + private void fireOnSelected() { + if (mOnItemSelectedListener == null) + return; + + int selection = this.getSelectedItemPosition(); + if (selection >= 0) { + View v = getSelectedView(); + mOnItemSelectedListener.onItemSelected(this, v, selection, + getAdapter().getItemId(selection)); + } else { + mOnItemSelectedListener.onNothingSelected(this); + } + } + + @Override + public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { + View selectedView = getSelectedView(); + if (selectedView != null && selectedView.getVisibility() == VISIBLE + && selectedView.dispatchPopulateAccessibilityEvent(event)) { + return true; + } + return false; + } + + @Override + public boolean onRequestSendAccessibilityEvent(View child, AccessibilityEvent event) { + if (super.onRequestSendAccessibilityEvent(child, event)) { + // Add a record for ourselves as well. + AccessibilityEvent record = AccessibilityEvent.obtain(); + onInitializeAccessibilityEvent(record); + // Populate with the text of the requesting child. + child.dispatchPopulateAccessibilityEvent(record); + event.appendRecord(record); + return true; + } + return false; + } + + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setScrollable(isScrollableForAccessibility()); + View selectedView = getSelectedView(); + if (selectedView != null) { + info.setEnabled(selectedView.isEnabled()); + } + } + + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setScrollable(isScrollableForAccessibility()); + View selectedView = getSelectedView(); + if (selectedView != null) { + event.setEnabled(selectedView.isEnabled()); + } + event.setCurrentItemIndex(getSelectedItemPosition()); + event.setFromIndex(getFirstVisiblePosition()); + event.setToIndex(getLastVisiblePosition()); + event.setItemCount(getCount()); + } + + private boolean isScrollableForAccessibility() { + T adapter = getAdapter(); + if (adapter != null) { + final int itemCount = adapter.getCount(); + return itemCount > 0 + && (getFirstVisiblePosition() > 0 || getLastVisiblePosition() < itemCount - 1); + } + return false; + } + + @Override + protected boolean canAnimate() { + return super.canAnimate() && mItemCount > 0; + } + + void handleDataChanged() { + final int count = mItemCount; + boolean found = false; + + if (count > 0) { + + int newPos; + + // Find the row we are supposed to sync to + if (mNeedSync) { + // Update this first, since setNextSelectedPositionInt inspects + // it + mNeedSync = false; + + // See if we can find a position in the new data with the same + // id as the old selection + newPos = findSyncPosition(); + if (newPos >= 0) { + // Verify that new selection is selectable + int selectablePos = lookForSelectablePosition(newPos, true); + if (selectablePos == newPos) { + // Same row id is selected + setNextSelectedPositionInt(newPos); + found = true; + } + } + } + if (!found) { + // Try to use the same position if we can't find matching data + newPos = getSelectedItemPosition(); + + // Pin position to the available range + if (newPos >= count) { + newPos = count - 1; + } + if (newPos < 0) { + newPos = 0; + } + + // Make sure we select something selectable -- first look down + int selectablePos = lookForSelectablePosition(newPos, true); + if (selectablePos < 0) { + // Looking down didn't work -- try looking up + selectablePos = lookForSelectablePosition(newPos, false); + } + if (selectablePos >= 0) { + setNextSelectedPositionInt(selectablePos); + checkSelectionChanged(); + found = true; + } + } + } + if (!found) { + // Nothing is selected + mSelectedPosition = INVALID_POSITION; + mSelectedRowId = INVALID_ROW_ID; + mNextSelectedPosition = INVALID_POSITION; + mNextSelectedRowId = INVALID_ROW_ID; + mNeedSync = false; + checkSelectionChanged(); + } + } + + void checkSelectionChanged() { + if ((mSelectedPosition != mOldSelectedPosition) || (mSelectedRowId != mOldSelectedRowId)) { + selectionChanged(); + mOldSelectedPosition = mSelectedPosition; + mOldSelectedRowId = mSelectedRowId; + } + } + + /** + * Searches the adapter for a position matching mSyncRowId. The search starts at mSyncPosition + * and then alternates between moving up and moving down until 1) we find the right position, or + * 2) we run out of time, or 3) we have looked at every position + * + * @return Position of the row that matches mSyncRowId, or {@link #INVALID_POSITION} if it can't + * be found + */ + int findSyncPosition() { + int count = mItemCount; + + if (count == 0) { + return INVALID_POSITION; + } + + long idToMatch = mSyncRowId; + int seed = mSyncPosition; + + // If there isn't a selection don't hunt for it + if (idToMatch == INVALID_ROW_ID) { + return INVALID_POSITION; + } + + // Pin seed to reasonable values + seed = Math.max(0, seed); + seed = Math.min(count - 1, seed); + + long endTime = SystemClock.uptimeMillis() + SYNC_MAX_DURATION_MILLIS; + + long rowId; + + // first position scanned so far + int first = seed; + + // last position scanned so far + int last = seed; + + // True if we should move down on the next iteration + boolean next = false; + + // True when we have looked at the first item in the data + boolean hitFirst; + + // True when we have looked at the last item in the data + boolean hitLast; + + // Get the item ID locally (instead of getItemIdAtPosition), so + // we need the adapter + T adapter = getAdapter(); + if (adapter == null) { + return INVALID_POSITION; + } + + while (SystemClock.uptimeMillis() <= endTime) { + rowId = adapter.getItemId(seed); + if (rowId == idToMatch) { + // Found it! + return seed; + } + + hitLast = last == count - 1; + hitFirst = first == 0; + + if (hitLast && hitFirst) { + // Looked at everything + break; + } + + if (hitFirst || (next && !hitLast)) { + // Either we hit the top, or we are trying to move down + last++; + seed = last; + // Try going up next time + next = false; + } else if (hitLast || (!next && !hitFirst)) { + // Either we hit the bottom, or we are trying to move up + first--; + seed = first; + // Try going down next time + next = true; + } + + } + + return INVALID_POSITION; + } + + /** + * Find a position that can be selected (i.e., is not a separator). + * + * @param position The starting position to look at. + * @param lookDown Whether to look down for other positions. + * @return The next selectable position starting at position and then searching either up or + * down. Returns {@link #INVALID_POSITION} if nothing can be found. + */ + int lookForSelectablePosition(int position, boolean lookDown) { + return position; + } + + /** + * Utility to keep mSelectedPosition and mSelectedRowId in sync + * @param position Our current position + */ + void setSelectedPositionInt(int position) { + mSelectedPosition = position; + mSelectedRowId = getItemIdAtPosition(position); + } + + /** + * Utility to keep mNextSelectedPosition and mNextSelectedRowId in sync + * @param position Intended value for mSelectedPosition the next time we go + * through layout + */ + void setNextSelectedPositionInt(int position) { + mNextSelectedPosition = position; + mNextSelectedRowId = getItemIdAtPosition(position); + // If we are trying to sync to the selection, update that too + if (mNeedSync && mSyncMode == SYNC_SELECTED_POSITION && position >= 0) { + mSyncPosition = position; + mSyncRowId = mNextSelectedRowId; + } + } + + /** + * Remember enough information to restore the screen state when the data has + * changed. + * + */ + void rememberSyncState() { + if (getChildCount() > 0) { + mNeedSync = true; + mSyncHeight = mLayoutHeight; + if (mSelectedPosition >= 0) { + // Sync the selection state + View v = getChildAt(mSelectedPosition - mFirstPosition); + mSyncRowId = mNextSelectedRowId; + mSyncPosition = mNextSelectedPosition; + if (v != null) { + mSpecificTop = v.getTop(); + } + mSyncMode = SYNC_SELECTED_POSITION; + } else { + // Sync the based on the offset of the first view + View v = getChildAt(0); + T adapter = getAdapter(); + if (mFirstPosition >= 0 && mFirstPosition < adapter.getCount()) { + mSyncRowId = adapter.getItemId(mFirstPosition); + } else { + mSyncRowId = NO_ID; + } + mSyncPosition = mFirstPosition; + if (v != null) { + mSpecificTop = v.getTop(); + } + mSyncMode = SYNC_FIRST_POSITION; + } + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java new file mode 100644 index 0000000000..a78b3f71b3 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsColorDrawable.java @@ -0,0 +1,41 @@ +package com.actionbarsherlock.internal.widget; + +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.drawable.Drawable; + +/** + * A version of {@link android.graphics.drawable.ColorDrawable} that respects bounds. + */ +public class IcsColorDrawable extends Drawable { + private int color; + private final Paint paint = new Paint(); + + public IcsColorDrawable(int color) { + this.color = color; + } + + @Override public void draw(Canvas canvas) { + if ((color >>> 24) != 0) { + paint.setColor(color); + canvas.drawRect(getBounds(), paint); + } + } + + @Override + public void setAlpha(int alpha) { + if (alpha != (color >>> 24)) { + color = (color & 0x00FFFFFF) & (alpha << 24); + invalidateSelf(); + } + } + + @Override public void setColorFilter(ColorFilter colorFilter) { + //Ignored + } + + @Override public int getOpacity() { + return color >>> 24; + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java new file mode 100644 index 0000000000..4947c41df5 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsLinearLayout.java @@ -0,0 +1,410 @@ +package com.actionbarsherlock.internal.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.View; +import android.widget.LinearLayout; + +import com.actionbarsherlock.internal.nineoldandroids.widget.NineLinearLayout; + +/** + * A simple extension of a regular linear layout that supports the divider API + * of Android 4.0+. The dividers are added adjacent to the children by changing + * their layout params. If you need to rely on the margins which fall in the + * same orientation as the layout you should wrap the child in a simple + * {@link android.widget.FrameLayout} so it can receive the margin. + */ +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; + + /** + * Don't show any dividers. + */ + public static final int SHOW_DIVIDER_NONE = 0; + /** + * Show a divider at the beginning of the group. + */ + public static final int SHOW_DIVIDER_BEGINNING = 1; + /** + * Show dividers between each item in the group. + */ + public static final int SHOW_DIVIDER_MIDDLE = 2; + /** + * Show a divider at the end of the group. + */ + public static final int SHOW_DIVIDER_END = 4; + + + private Drawable mDivider; + private int mDividerWidth; + private int mDividerHeight; + private int mShowDividers; + private int mDividerPadding; + + private boolean mUseLargestChild; + + public IcsLinearLayout(Context context, AttributeSet attrs) { + super(context, attrs); + + TypedArray a = context.obtainStyledAttributes(attrs, /*com.android.internal.R.styleable.*/R_styleable_LinearLayout); + + 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(); + } + + /** + * Set how dividers should be shown between items in this layout + * + * @param showDividers One or more of {@link #SHOW_DIVIDER_BEGINNING}, + * {@link #SHOW_DIVIDER_MIDDLE}, or {@link #SHOW_DIVIDER_END}, + * or {@link #SHOW_DIVIDER_NONE} to show no dividers. + */ + public void setShowDividers(int showDividers) { + if (showDividers != mShowDividers) { + requestLayout(); + invalidate(); //XXX This is required if you are toggling a divider off + } + mShowDividers = showDividers; + } + + /** + * @return A flag set indicating how dividers should be shown around items. + * @see #setShowDividers(int) + */ + public int getShowDividers() { + return mShowDividers; + } + + /** + * Set a drawable to be used as a divider between items. + * @param divider Drawable that will divide each item. + * @see #setShowDividers(int) + */ + public void setDividerDrawable(Drawable divider) { + if (divider == mDivider) { + return; + } + mDivider = divider; + if (divider != null) { + mDividerWidth = divider.getIntrinsicWidth(); + mDividerHeight = divider.getIntrinsicHeight(); + } else { + mDividerWidth = 0; + mDividerHeight = 0; + } + setWillNotDraw(divider == null); + requestLayout(); + } + + /** + * Set padding displayed on both ends of dividers. + * + * @param padding Padding value in pixels that will be applied to each end + * + * @see #setShowDividers(int) + * @see #setDividerDrawable(Drawable) + * @see #getDividerPadding() + */ + public void setDividerPadding(int padding) { + mDividerPadding = padding; + } + + /** + * Get the padding size used to inset dividers in pixels + * + * @see #setShowDividers(int) + * @see #setDividerDrawable(Drawable) + * @see #setDividerPadding(int) + */ + public int getDividerPadding() { + return mDividerPadding; + } + + /** + * Get the width of the current divider drawable. + * + * @hide Used internally by framework. + */ + public int getDividerWidth() { + return mDividerWidth; + } + + @Override + protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) { + final int index = indexOfChild(child); + final int orientation = getOrientation(); + final LayoutParams params = (LayoutParams) child.getLayoutParams(); + if (hasDividerBeforeChildAt(index)) { + if (orientation == VERTICAL) { + //Account for the divider by pushing everything up + params.topMargin = mDividerHeight; + } else { + //Account for the divider by pushing everything left + params.leftMargin = mDividerWidth; + } + } + + final int count = getChildCount(); + if (index == count - 1) { + if (hasDividerBeforeChildAt(count)) { + if (orientation == VERTICAL) { + params.bottomMargin = mDividerHeight; + } else { + params.rightMargin = mDividerWidth; + } + } + } + super.measureChildWithMargins(child, parentWidthMeasureSpec, widthUsed, parentHeightMeasureSpec, heightUsed); + } + + @Override + protected void onDraw(Canvas canvas) { + if (mDivider != null) { + if (getOrientation() == VERTICAL) { + drawDividersVertical(canvas); + } else { + drawDividersHorizontal(canvas); + } + } + super.onDraw(canvas); + } + + void drawDividersVertical(Canvas canvas) { + final int count = getChildCount(); + for (int i = 0; i < count; i++) { + final View child = getChildAt(i); + + if (child != null && child.getVisibility() != GONE) { + if (hasDividerBeforeChildAt(i)) { + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + final int top = child.getTop() - lp.topMargin/* - mDividerHeight*/; + drawHorizontalDivider(canvas, top); + } + } + } + + if (hasDividerBeforeChildAt(count)) { + final View child = getChildAt(count - 1); + int bottom = 0; + if (child == null) { + bottom = getHeight() - getPaddingBottom() - mDividerHeight; + } else { + //final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + bottom = child.getBottom()/* + lp.bottomMargin*/; + } + drawHorizontalDivider(canvas, bottom); + } + } + + void drawDividersHorizontal(Canvas canvas) { + final int count = getChildCount(); + for (int i = 0; i < count; i++) { + final View child = getChildAt(i); + + if (child != null && child.getVisibility() != GONE) { + if (hasDividerBeforeChildAt(i)) { + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + final int left = child.getLeft() - lp.leftMargin/* - mDividerWidth*/; + drawVerticalDivider(canvas, left); + } + } + } + + if (hasDividerBeforeChildAt(count)) { + final View child = getChildAt(count - 1); + int right = 0; + if (child == null) { + right = getWidth() - getPaddingRight() - mDividerWidth; + } else { + //final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + right = child.getRight()/* + lp.rightMargin*/; + } + drawVerticalDivider(canvas, right); + } + } + + void drawHorizontalDivider(Canvas canvas, int top) { + mDivider.setBounds(getPaddingLeft() + mDividerPadding, top, + getWidth() - getPaddingRight() - mDividerPadding, top + mDividerHeight); + mDivider.draw(canvas); + } + + void drawVerticalDivider(Canvas canvas, int left) { + mDivider.setBounds(left, getPaddingTop() + mDividerPadding, + left + mDividerWidth, getHeight() - getPaddingBottom() - mDividerPadding); + mDivider.draw(canvas); + } + + /** + * Determines where to position dividers between children. + * + * @param childIndex Index of child to check for preceding divider + * @return true if there should be a divider before the child at childIndex + * @hide Pending API consideration. Currently only used internally by the system. + */ + protected boolean hasDividerBeforeChildAt(int childIndex) { + if (childIndex == 0) { + return (mShowDividers & SHOW_DIVIDER_BEGINNING) != 0; + } else if (childIndex == getChildCount()) { + return (mShowDividers & SHOW_DIVIDER_END) != 0; + } else if ((mShowDividers & SHOW_DIVIDER_MIDDLE) != 0) { + boolean hasVisibleViewBefore = false; + for (int i = childIndex - 1; i >= 0; i--) { + if (getChildAt(i).getVisibility() != GONE) { + hasVisibleViewBefore = true; + break; + } + } + return hasVisibleViewBefore; + } + return false; + } + + /** + * When true, all children with a weight will be considered having + * the minimum size of the largest child. If false, all children are + * measured normally. + * + * @return True to measure children with a weight using the minimum + * size of the largest child, false otherwise. + * + * @attr ref android.R.styleable#LinearLayout_measureWithLargestChild + */ + public boolean isMeasureWithLargestChildEnabled() { + return mUseLargestChild; + } + + /** + * When set to true, all children with a weight will be considered having + * the minimum size of the largest child. If false, all children are + * measured normally. + * + * Disabled by default. + * + * @param enabled True to measure children with a weight using the + * minimum size of the largest child, false otherwise. + * + * @attr ref android.R.styleable#LinearLayout_measureWithLargestChild + */ + public void setMeasureWithLargestChildEnabled(boolean enabled) { + mUseLargestChild = enabled; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + if (mUseLargestChild) { + final int orientation = getOrientation(); + switch (orientation) { + case HORIZONTAL: + useLargestChildHorizontal(); + break; + + case VERTICAL: + useLargestChildVertical(); + break; + } + } + } + + private void useLargestChildHorizontal() { + final int childCount = getChildCount(); + + // Find largest child width + int largestChildWidth = 0; + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + largestChildWidth = Math.max(child.getMeasuredWidth(), largestChildWidth); + } + + int totalWidth = 0; + // Re-measure childs + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + + if (child == null || child.getVisibility() == View.GONE) { + continue; + } + + final LinearLayout.LayoutParams lp = + (LinearLayout.LayoutParams) child.getLayoutParams(); + + float childExtra = lp.weight; + if (childExtra > 0) { + child.measure( + MeasureSpec.makeMeasureSpec(largestChildWidth, + MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(child.getMeasuredHeight(), + MeasureSpec.EXACTLY)); + totalWidth += largestChildWidth; + + } else { + totalWidth += child.getMeasuredWidth(); + } + + totalWidth += lp.leftMargin + lp.rightMargin; + } + + totalWidth += getPaddingLeft() + getPaddingRight(); + setMeasuredDimension(totalWidth, getMeasuredHeight()); + } + + private void useLargestChildVertical() { + final int childCount = getChildCount(); + + // Find largest child width + int largestChildHeight = 0; + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + largestChildHeight = Math.max(child.getMeasuredHeight(), largestChildHeight); + } + + int totalHeight = 0; + // Re-measure childs + for (int i = 0; i < childCount; i++) { + final View child = getChildAt(i); + + if (child == null || child.getVisibility() == View.GONE) { + continue; + } + + final LinearLayout.LayoutParams lp = + (LinearLayout.LayoutParams) child.getLayoutParams(); + + float childExtra = lp.weight; + if (childExtra > 0) { + child.measure( + MeasureSpec.makeMeasureSpec(child.getMeasuredWidth(), + MeasureSpec.EXACTLY), + MeasureSpec.makeMeasureSpec(largestChildHeight, + MeasureSpec.EXACTLY)); + totalHeight += largestChildHeight; + + } else { + totalHeight += child.getMeasuredHeight(); + } + + totalHeight += lp.leftMargin + lp.rightMargin; + } + + totalHeight += getPaddingLeft() + getPaddingRight(); + setMeasuredDimension(getMeasuredWidth(), totalHeight); + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java new file mode 100644 index 0000000000..d13c6cea97 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsListPopupWindow.java @@ -0,0 +1,644 @@ +package com.actionbarsherlock.internal.widget; + +import com.actionbarsherlock.R; + +import android.content.Context; +import android.content.res.Resources; +import android.database.DataSetObserver; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Handler; +import android.util.AttributeSet; +import android.view.ContextThemeWrapper; +import android.view.MotionEvent; +import android.view.View; +import android.view.View.MeasureSpec; +import android.view.View.OnTouchListener; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.widget.AbsListView; +import android.widget.AdapterView; +import android.widget.LinearLayout; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.PopupWindow; + +/** + * A proxy between pre- and post-Honeycomb implementations of this class. + */ +public class IcsListPopupWindow { + /** + * This value controls the length of time that the user + * must leave a pointer down without scrolling to expand + * the autocomplete dropdown list to cover the IME. + */ + private static final int EXPAND_LIST_TIMEOUT = 250; + + private Context mContext; + private PopupWindow mPopup; + private ListAdapter mAdapter; + private DropDownListView mDropDownList; + + private int mDropDownHeight = ViewGroup.LayoutParams.WRAP_CONTENT; + private int mDropDownWidth = ViewGroup.LayoutParams.WRAP_CONTENT; + private int mDropDownHorizontalOffset; + private int mDropDownVerticalOffset; + private boolean mDropDownVerticalOffsetSet; + + private int mListItemExpandMaximum = Integer.MAX_VALUE; + + private View mPromptView; + private int mPromptPosition = POSITION_PROMPT_ABOVE; + + private DataSetObserver mObserver; + + private View mDropDownAnchorView; + + private Drawable mDropDownListHighlight; + + private AdapterView.OnItemClickListener mItemClickListener; + private AdapterView.OnItemSelectedListener mItemSelectedListener; + + private final ResizePopupRunnable mResizePopupRunnable = new ResizePopupRunnable(); + private final PopupTouchInterceptor mTouchInterceptor = new PopupTouchInterceptor(); + private final PopupScrollListener mScrollListener = new PopupScrollListener(); + private final ListSelectorHider mHideSelector = new ListSelectorHider(); + + private Handler mHandler = new Handler(); + + private Rect mTempRect = new Rect(); + + private boolean mModal; + + public static final int POSITION_PROMPT_ABOVE = 0; + public static final int POSITION_PROMPT_BELOW = 1; + + public IcsListPopupWindow(Context context) { + this(context, null, R.attr.listPopupWindowStyle); + } + + public IcsListPopupWindow(Context context, AttributeSet attrs, int defStyleAttr) { + mContext = context; + mPopup = new PopupWindow(context, attrs, defStyleAttr); + mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); + } + + public IcsListPopupWindow(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + mContext = context; + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { + Context wrapped = new ContextThemeWrapper(context, defStyleRes); + mPopup = new PopupWindow(wrapped, attrs, defStyleAttr); + } else { + mPopup = new PopupWindow(context, attrs, defStyleAttr, defStyleRes); + } + mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); + } + + public void setAdapter(ListAdapter adapter) { + if (mObserver == null) { + mObserver = new PopupDataSetObserver(); + } else if (mAdapter != null) { + mAdapter.unregisterDataSetObserver(mObserver); + } + mAdapter = adapter; + if (mAdapter != null) { + adapter.registerDataSetObserver(mObserver); + } + + if (mDropDownList != null) { + mDropDownList.setAdapter(mAdapter); + } + } + + public void setPromptPosition(int position) { + mPromptPosition = position; + } + + public void setModal(boolean modal) { + mModal = true; + mPopup.setFocusable(modal); + } + + public void setBackgroundDrawable(Drawable d) { + mPopup.setBackgroundDrawable(d); + } + + public void setAnchorView(View anchor) { + mDropDownAnchorView = anchor; + } + + public void setHorizontalOffset(int offset) { + mDropDownHorizontalOffset = offset; + } + + public void setVerticalOffset(int offset) { + mDropDownVerticalOffset = offset; + mDropDownVerticalOffsetSet = true; + } + + public void setContentWidth(int width) { + Drawable popupBackground = mPopup.getBackground(); + if (popupBackground != null) { + popupBackground.getPadding(mTempRect); + mDropDownWidth = mTempRect.left + mTempRect.right + width; + } else { + mDropDownWidth = width; + } + } + + public void setOnItemClickListener(AdapterView.OnItemClickListener clickListener) { + mItemClickListener = clickListener; + } + + public void show() { + int height = buildDropDown(); + + int widthSpec = 0; + int heightSpec = 0; + + boolean noInputMethod = isInputMethodNotNeeded(); + //XXX mPopup.setAllowScrollingAnchorParent(!noInputMethod); + + if (mPopup.isShowing()) { + if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) { + // The call to PopupWindow's update method below can accept -1 for any + // value you do not want to update. + widthSpec = -1; + } else if (mDropDownWidth == ViewGroup.LayoutParams.WRAP_CONTENT) { + widthSpec = mDropDownAnchorView.getWidth(); + } else { + widthSpec = mDropDownWidth; + } + + if (mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) { + // The call to PopupWindow's update method below can accept -1 for any + // value you do not want to update. + heightSpec = noInputMethod ? height : ViewGroup.LayoutParams.MATCH_PARENT; + if (noInputMethod) { + mPopup.setWindowLayoutMode( + mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT ? + ViewGroup.LayoutParams.MATCH_PARENT : 0, 0); + } else { + mPopup.setWindowLayoutMode( + mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT ? + ViewGroup.LayoutParams.MATCH_PARENT : 0, + ViewGroup.LayoutParams.MATCH_PARENT); + } + } else if (mDropDownHeight == ViewGroup.LayoutParams.WRAP_CONTENT) { + heightSpec = height; + } else { + heightSpec = mDropDownHeight; + } + + mPopup.setOutsideTouchable(true); + + mPopup.update(mDropDownAnchorView, mDropDownHorizontalOffset, + mDropDownVerticalOffset, widthSpec, heightSpec); + } else { + if (mDropDownWidth == ViewGroup.LayoutParams.MATCH_PARENT) { + widthSpec = ViewGroup.LayoutParams.MATCH_PARENT; + } else { + if (mDropDownWidth == ViewGroup.LayoutParams.WRAP_CONTENT) { + mPopup.setWidth(mDropDownAnchorView.getWidth()); + } else { + mPopup.setWidth(mDropDownWidth); + } + } + + if (mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) { + heightSpec = ViewGroup.LayoutParams.MATCH_PARENT; + } else { + if (mDropDownHeight == ViewGroup.LayoutParams.WRAP_CONTENT) { + mPopup.setHeight(height); + } else { + mPopup.setHeight(mDropDownHeight); + } + } + + mPopup.setWindowLayoutMode(widthSpec, heightSpec); + //XXX mPopup.setClipToScreenEnabled(true); + + // use outside touchable to dismiss drop down when touching outside of it, so + // only set this if the dropdown is not always visible + mPopup.setOutsideTouchable(true); + mPopup.setTouchInterceptor(mTouchInterceptor); + mPopup.showAsDropDown(mDropDownAnchorView, + mDropDownHorizontalOffset, mDropDownVerticalOffset); + mDropDownList.setSelection(ListView.INVALID_POSITION); + + if (!mModal || mDropDownList.isInTouchMode()) { + clearListSelection(); + } + if (!mModal) { + mHandler.post(mHideSelector); + } + } + } + + public void dismiss() { + mPopup.dismiss(); + if (mPromptView != null) { + final ViewParent parent = mPromptView.getParent(); + if (parent instanceof ViewGroup) { + final ViewGroup group = (ViewGroup) parent; + group.removeView(mPromptView); + } + } + mPopup.setContentView(null); + mDropDownList = null; + mHandler.removeCallbacks(mResizePopupRunnable); + } + + public void setOnDismissListener(PopupWindow.OnDismissListener listener) { + mPopup.setOnDismissListener(listener); + } + + public void setInputMethodMode(int mode) { + mPopup.setInputMethodMode(mode); + } + + public void clearListSelection() { + final DropDownListView list = mDropDownList; + if (list != null) { + // WARNING: Please read the comment where mListSelectionHidden is declared + list.mListSelectionHidden = true; + //XXX list.hideSelector(); + list.requestLayout(); + } + } + + public boolean isShowing() { + return mPopup.isShowing(); + } + + private boolean isInputMethodNotNeeded() { + return mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED; + } + + public ListView getListView() { + return mDropDownList; + } + + private int buildDropDown() { + ViewGroup dropDownView; + int otherHeights = 0; + + if (mDropDownList == null) { + Context context = mContext; + + mDropDownList = new DropDownListView(context, !mModal); + if (mDropDownListHighlight != null) { + mDropDownList.setSelector(mDropDownListHighlight); + } + mDropDownList.setAdapter(mAdapter); + mDropDownList.setOnItemClickListener(mItemClickListener); + mDropDownList.setFocusable(true); + mDropDownList.setFocusableInTouchMode(true); + mDropDownList.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + public void onItemSelected(AdapterView parent, View view, + int position, long id) { + + if (position != -1) { + DropDownListView dropDownList = mDropDownList; + + if (dropDownList != null) { + dropDownList.mListSelectionHidden = false; + } + } + } + + public void onNothingSelected(AdapterView parent) { + } + }); + mDropDownList.setOnScrollListener(mScrollListener); + + if (mItemSelectedListener != null) { + mDropDownList.setOnItemSelectedListener(mItemSelectedListener); + } + + dropDownView = mDropDownList; + + View hintView = mPromptView; + if (hintView != null) { + // if an hint has been specified, we accomodate more space for it and + // add a text view in the drop down menu, at the bottom of the list + LinearLayout hintContainer = new LinearLayout(context); + hintContainer.setOrientation(LinearLayout.VERTICAL); + + LinearLayout.LayoutParams hintParams = new LinearLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, 0, 1.0f + ); + + switch (mPromptPosition) { + case POSITION_PROMPT_BELOW: + hintContainer.addView(dropDownView, hintParams); + hintContainer.addView(hintView); + break; + + case POSITION_PROMPT_ABOVE: + hintContainer.addView(hintView); + hintContainer.addView(dropDownView, hintParams); + break; + + default: + break; + } + + // measure the hint's height to find how much more vertical space + // we need to add to the drop down's height + int widthSpec = MeasureSpec.makeMeasureSpec(mDropDownWidth, MeasureSpec.AT_MOST); + int heightSpec = MeasureSpec.UNSPECIFIED; + hintView.measure(widthSpec, heightSpec); + + hintParams = (LinearLayout.LayoutParams) hintView.getLayoutParams(); + otherHeights = hintView.getMeasuredHeight() + hintParams.topMargin + + hintParams.bottomMargin; + + dropDownView = hintContainer; + } + + mPopup.setContentView(dropDownView); + } else { + dropDownView = (ViewGroup) mPopup.getContentView(); + final View view = mPromptView; + if (view != null) { + LinearLayout.LayoutParams hintParams = + (LinearLayout.LayoutParams) view.getLayoutParams(); + otherHeights = view.getMeasuredHeight() + hintParams.topMargin + + hintParams.bottomMargin; + } + } + + // getMaxAvailableHeight() subtracts the padding, so we put it back + // to get the available height for the whole window + int padding = 0; + Drawable background = mPopup.getBackground(); + if (background != null) { + background.getPadding(mTempRect); + padding = mTempRect.top + mTempRect.bottom; + + // If we don't have an explicit vertical offset, determine one from the window + // background so that content will line up. + if (!mDropDownVerticalOffsetSet) { + mDropDownVerticalOffset = -mTempRect.top; + } + } + + // Max height available on the screen for a popup. + boolean ignoreBottomDecorations = + mPopup.getInputMethodMode() == PopupWindow.INPUT_METHOD_NOT_NEEDED; + final int maxHeight = /*mPopup.*/getMaxAvailableHeight( + mDropDownAnchorView, mDropDownVerticalOffset, ignoreBottomDecorations); + + if (mDropDownHeight == ViewGroup.LayoutParams.MATCH_PARENT) { + return maxHeight + padding; + } + + final int listContent = /*mDropDownList.*/measureHeightOfChildren(MeasureSpec.UNSPECIFIED, + 0, -1/*ListView.NO_POSITION*/, maxHeight - otherHeights, -1); + // add padding only if the list has items in it, that way we don't show + // the popup if it is not needed + if (listContent > 0) otherHeights += padding; + + return listContent + otherHeights; + } + + private int getMaxAvailableHeight(View anchor, int yOffset, boolean ignoreBottomDecorations) { + final Rect displayFrame = new Rect(); + anchor.getWindowVisibleDisplayFrame(displayFrame); + + final int[] anchorPos = new int[2]; + anchor.getLocationOnScreen(anchorPos); + + int bottomEdge = displayFrame.bottom; + if (ignoreBottomDecorations) { + Resources res = anchor.getContext().getResources(); + bottomEdge = res.getDisplayMetrics().heightPixels; + } + final int distanceToBottom = bottomEdge - (anchorPos[1] + anchor.getHeight()) - yOffset; + final int distanceToTop = anchorPos[1] - displayFrame.top + yOffset; + + // anchorPos[1] is distance from anchor to top of screen + int returnedHeight = Math.max(distanceToBottom, distanceToTop); + if (mPopup.getBackground() != null) { + mPopup.getBackground().getPadding(mTempRect); + returnedHeight -= mTempRect.top + mTempRect.bottom; + } + + return returnedHeight; + } + + private int measureHeightOfChildren(int widthMeasureSpec, int startPosition, int endPosition, + final int maxHeight, int disallowPartialChildPosition) { + + final ListAdapter adapter = mAdapter; + if (adapter == null) { + return mDropDownList.getListPaddingTop() + mDropDownList.getListPaddingBottom(); + } + + // Include the padding of the list + int returnedHeight = mDropDownList.getListPaddingTop() + mDropDownList.getListPaddingBottom(); + final int dividerHeight = ((mDropDownList.getDividerHeight() > 0) && mDropDownList.getDivider() != null) ? mDropDownList.getDividerHeight() : 0; + // The previous height value that was less than maxHeight and contained + // no partial children + int prevHeightWithoutPartialChild = 0; + int i; + View child; + + // mItemCount - 1 since endPosition parameter is inclusive + endPosition = (endPosition == -1/*NO_POSITION*/) ? adapter.getCount() - 1 : endPosition; + + for (i = startPosition; i <= endPosition; ++i) { + child = mAdapter.getView(i, null, mDropDownList); + if (mDropDownList.getCacheColorHint() != 0) { + child.setDrawingCacheBackgroundColor(mDropDownList.getCacheColorHint()); + } + + measureScrapChild(child, i, widthMeasureSpec); + + if (i > 0) { + // Count the divider for all but one child + returnedHeight += dividerHeight; + } + + returnedHeight += child.getMeasuredHeight(); + + if (returnedHeight >= maxHeight) { + // We went over, figure out which height to return. If returnedHeight > maxHeight, + // then the i'th position did not fit completely. + return (disallowPartialChildPosition >= 0) // Disallowing is enabled (> -1) + && (i > disallowPartialChildPosition) // We've past the min pos + && (prevHeightWithoutPartialChild > 0) // We have a prev height + && (returnedHeight != maxHeight) // i'th child did not fit completely + ? prevHeightWithoutPartialChild + : maxHeight; + } + + if ((disallowPartialChildPosition >= 0) && (i >= disallowPartialChildPosition)) { + prevHeightWithoutPartialChild = returnedHeight; + } + } + + // At this point, we went through the range of children, and they each + // completely fit, so return the returnedHeight + return returnedHeight; + } + private void measureScrapChild(View child, int position, int widthMeasureSpec) { + ListView.LayoutParams p = (ListView.LayoutParams) child.getLayoutParams(); + if (p == null) { + p = new ListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT, 0); + child.setLayoutParams(p); + } + //XXX p.viewType = mAdapter.getItemViewType(position); + //XXX p.forceAdd = true; + + int childWidthSpec = ViewGroup.getChildMeasureSpec(widthMeasureSpec, + mDropDownList.getPaddingLeft() + mDropDownList.getPaddingRight(), p.width); + int lpHeight = p.height; + int childHeightSpec; + if (lpHeight > 0) { + childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY); + } else { + childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + } + child.measure(childWidthSpec, childHeightSpec); + } + + private static class DropDownListView extends ListView { + /* + * WARNING: This is a workaround for a touch mode issue. + * + * Touch mode is propagated lazily to windows. This causes problems in + * the following scenario: + * - Type something in the AutoCompleteTextView and get some results + * - Move down with the d-pad to select an item in the list + * - Move up with the d-pad until the selection disappears + * - Type more text in the AutoCompleteTextView *using the soft keyboard* + * and get new results; you are now in touch mode + * - The selection comes back on the first item in the list, even though + * the list is supposed to be in touch mode + * + * Using the soft keyboard triggers the touch mode change but that change + * is propagated to our window only after the first list layout, therefore + * after the list attempts to resurrect the selection. + * + * The trick to work around this issue is to pretend the list is in touch + * mode when we know that the selection should not appear, that is when + * we know the user moved the selection away from the list. + * + * This boolean is set to true whenever we explicitly hide the list's + * selection and reset to false whenever we know the user moved the + * selection back to the list. + * + * When this boolean is true, isInTouchMode() returns true, otherwise it + * returns super.isInTouchMode(). + */ + private boolean mListSelectionHidden; + + private boolean mHijackFocus; + + public DropDownListView(Context context, boolean hijackFocus) { + super(context, null, /*com.android.internal.*/R.attr.dropDownListViewStyle); + mHijackFocus = hijackFocus; + // TODO: Add an API to control this + setCacheColorHint(0); // Transparent, since the background drawable could be anything. + } + + //XXX @Override + //View obtainView(int position, boolean[] isScrap) { + // View view = super.obtainView(position, isScrap); + + // if (view instanceof TextView) { + // ((TextView) view).setHorizontallyScrolling(true); + // } + + // return view; + //} + + @Override + public boolean isInTouchMode() { + // WARNING: Please read the comment where mListSelectionHidden is declared + return (mHijackFocus && mListSelectionHidden) || super.isInTouchMode(); + } + + @Override + public boolean hasWindowFocus() { + return mHijackFocus || super.hasWindowFocus(); + } + + @Override + public boolean isFocused() { + return mHijackFocus || super.isFocused(); + } + + @Override + public boolean hasFocus() { + return mHijackFocus || super.hasFocus(); + } + } + + private class PopupDataSetObserver extends DataSetObserver { + @Override + public void onChanged() { + if (isShowing()) { + // Resize the popup to fit new content + show(); + } + } + + @Override + public void onInvalidated() { + dismiss(); + } + } + + private class ListSelectorHider implements Runnable { + public void run() { + clearListSelection(); + } + } + + private class ResizePopupRunnable implements Runnable { + public void run() { + if (mDropDownList != null && mDropDownList.getCount() > mDropDownList.getChildCount() && + mDropDownList.getChildCount() <= mListItemExpandMaximum) { + mPopup.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); + show(); + } + } + } + + private class PopupTouchInterceptor implements OnTouchListener { + public boolean onTouch(View v, MotionEvent event) { + final int action = event.getAction(); + final int x = (int) event.getX(); + final int y = (int) event.getY(); + + if (action == MotionEvent.ACTION_DOWN && + mPopup != null && mPopup.isShowing() && + (x >= 0 && x < mPopup.getWidth() && y >= 0 && y < mPopup.getHeight())) { + mHandler.postDelayed(mResizePopupRunnable, EXPAND_LIST_TIMEOUT); + } else if (action == MotionEvent.ACTION_UP) { + mHandler.removeCallbacks(mResizePopupRunnable); + } + return false; + } + } + + private class PopupScrollListener implements ListView.OnScrollListener { + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, + int totalItemCount) { + + } + + public void onScrollStateChanged(AbsListView view, int scrollState) { + if (scrollState == SCROLL_STATE_TOUCH_SCROLL && + !isInputMethodNotNeeded() && mPopup.getContentView() != null) { + mHandler.removeCallbacks(mResizePopupRunnable); + mResizePopupRunnable.run(); + } + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsProgressBar.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsProgressBar.java new file mode 100644 index 0000000000..1c02d4acad --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsProgressBar.java @@ -0,0 +1,1193 @@ +/* + * Copyright (C) 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. + */ + +package com.actionbarsherlock.internal.widget; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.BitmapShader; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.Shader; +import android.graphics.drawable.Animatable; +import android.graphics.drawable.AnimationDrawable; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.ClipDrawable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; +import android.graphics.drawable.ShapeDrawable; +import android.graphics.drawable.shapes.RoundRectShape; +import android.graphics.drawable.shapes.Shape; +import android.os.Build; +import android.os.Parcel; +import android.os.Parcelable; +import android.os.SystemClock; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.view.ViewDebug; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityManager; +import android.view.animation.AlphaAnimation; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.view.animation.Interpolator; +import android.view.animation.LinearInterpolator; +import android.view.animation.Transformation; +import android.widget.RemoteViews.RemoteView; + + +/** + *

+ * Visual indicator of progress in some operation. Displays a bar to the user + * representing how far the operation has progressed; the application can + * change the amount of progress (modifying the length of the bar) as it moves + * forward. There is also a secondary progress displayable on a progress bar + * which is useful for displaying intermediate progress, such as the buffer + * level during a streaming playback progress bar. + *

+ * + *

+ * A progress bar can also be made indeterminate. In indeterminate mode, the + * progress bar shows a cyclic animation without an indication of progress. This mode is used by + * applications when the length of the task is unknown. The indeterminate progress bar can be either + * a spinning wheel or a horizontal bar. + *

+ * + *

The following code example shows how a progress bar can be used from + * a worker thread to update the user interface to notify the user of progress: + *

+ * + *
+ * public class MyActivity extends Activity {
+ *     private static final int PROGRESS = 0x1;
+ *
+ *     private ProgressBar mProgress;
+ *     private int mProgressStatus = 0;
+ *
+ *     private Handler mHandler = new Handler();
+ *
+ *     protected void onCreate(Bundle icicle) {
+ *         super.onCreate(icicle);
+ *
+ *         setContentView(R.layout.progressbar_activity);
+ *
+ *         mProgress = (ProgressBar) findViewById(R.id.progress_bar);
+ *
+ *         // Start lengthy operation in a background thread
+ *         new Thread(new Runnable() {
+ *             public void run() {
+ *                 while (mProgressStatus < 100) {
+ *                     mProgressStatus = doWork();
+ *
+ *                     // Update the progress bar
+ *                     mHandler.post(new Runnable() {
+ *                         public void run() {
+ *                             mProgress.setProgress(mProgressStatus);
+ *                         }
+ *                     });
+ *                 }
+ *             }
+ *         }).start();
+ *     }
+ * }
+ * + *

To add a progress bar to a layout file, you can use the {@code <ProgressBar>} element. + * By default, the progress bar is a spinning wheel (an indeterminate indicator). To change to a + * horizontal progress bar, apply the {@link android.R.style#Widget_ProgressBar_Horizontal + * Widget.ProgressBar.Horizontal} style, like so:

+ * + *
+ * <ProgressBar
+ *     style="@android:style/Widget.ProgressBar.Horizontal"
+ *     ... />
+ * + *

If you will use the progress bar to show real progress, you must use the horizontal bar. You + * can then increment the progress with {@link #incrementProgressBy incrementProgressBy()} or + * {@link #setProgress setProgress()}. By default, the progress bar is full when it reaches 100. If + * necessary, you can adjust the maximum value (the value for a full bar) using the {@link + * android.R.styleable#ProgressBar_max android:max} attribute. Other attributes available are listed + * below.

+ * + *

Another common style to apply to the progress bar is {@link + * android.R.style#Widget_ProgressBar_Small Widget.ProgressBar.Small}, which shows a smaller + * version of the spinning wheel—useful when waiting for content to load. + * For example, you can insert this kind of progress bar into your default layout for + * a view that will be populated by some content fetched from the Internet—the spinning wheel + * appears immediately and when your application receives the content, it replaces the progress bar + * with the loaded content. For example:

+ * + *
+ * <LinearLayout
+ *     android:orientation="horizontal"
+ *     ... >
+ *     <ProgressBar
+ *         android:layout_width="wrap_content"
+ *         android:layout_height="wrap_content"
+ *         style="@android:style/Widget.ProgressBar.Small"
+ *         android:layout_marginRight="5dp" />
+ *     <TextView
+ *         android:layout_width="wrap_content"
+ *         android:layout_height="wrap_content"
+ *         android:text="@string/loading" />
+ * </LinearLayout>
+ * + *

Other progress bar styles provided by the system include:

+ *
    + *
  • {@link android.R.style#Widget_ProgressBar_Horizontal Widget.ProgressBar.Horizontal}
  • + *
  • {@link android.R.style#Widget_ProgressBar_Small Widget.ProgressBar.Small}
  • + *
  • {@link android.R.style#Widget_ProgressBar_Large Widget.ProgressBar.Large}
  • + *
  • {@link android.R.style#Widget_ProgressBar_Inverse Widget.ProgressBar.Inverse}
  • + *
  • {@link android.R.style#Widget_ProgressBar_Small_Inverse + * Widget.ProgressBar.Small.Inverse}
  • + *
  • {@link android.R.style#Widget_ProgressBar_Large_Inverse + * Widget.ProgressBar.Large.Inverse}
  • + *
+ *

The "inverse" styles provide an inverse color scheme for the spinner, which may be necessary + * if your application uses a light colored theme (a white background).

+ * + *

+ * See {@link android.R.styleable#ProgressBar ProgressBar Attributes}, + * {@link android.R.styleable#View View Attributes} + *

+ * + * @attr ref android.R.styleable#ProgressBar_animationResolution + * @attr ref android.R.styleable#ProgressBar_indeterminate + * @attr ref android.R.styleable#ProgressBar_indeterminateBehavior + * @attr ref android.R.styleable#ProgressBar_indeterminateDrawable + * @attr ref android.R.styleable#ProgressBar_indeterminateDuration + * @attr ref android.R.styleable#ProgressBar_indeterminateOnly + * @attr ref android.R.styleable#ProgressBar_interpolator + * @attr ref android.R.styleable#ProgressBar_max + * @attr ref android.R.styleable#ProgressBar_maxHeight + * @attr ref android.R.styleable#ProgressBar_maxWidth + * @attr ref android.R.styleable#ProgressBar_minHeight + * @attr ref android.R.styleable#ProgressBar_minWidth + * @attr ref android.R.styleable#ProgressBar_progress + * @attr ref android.R.styleable#ProgressBar_progressDrawable + * @attr ref android.R.styleable#ProgressBar_secondaryProgress + */ +@RemoteView +public class IcsProgressBar extends View { + private static final boolean IS_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; + private static final int MAX_LEVEL = 10000; + private static final int ANIMATION_RESOLUTION = 200; + private static final int TIMEOUT_SEND_ACCESSIBILITY_EVENT = 200; + + private static final int[] ProgressBar = new int[] { + android.R.attr.maxWidth, + android.R.attr.maxHeight, + android.R.attr.max, + android.R.attr.progress, + android.R.attr.secondaryProgress, + android.R.attr.indeterminate, + android.R.attr.indeterminateOnly, + android.R.attr.indeterminateDrawable, + android.R.attr.progressDrawable, + android.R.attr.indeterminateDuration, + android.R.attr.indeterminateBehavior, + android.R.attr.minWidth, + android.R.attr.minHeight, + android.R.attr.interpolator, + android.R.attr.animationResolution, + }; + private static final int ProgressBar_maxWidth = 0; + private static final int ProgressBar_maxHeight = 1; + private static final int ProgressBar_max = 2; + private static final int ProgressBar_progress = 3; + private static final int ProgressBar_secondaryProgress = 4; + private static final int ProgressBar_indeterminate = 5; + private static final int ProgressBar_indeterminateOnly = 6; + private static final int ProgressBar_indeterminateDrawable = 7; + private static final int ProgressBar_progressDrawable = 8; + private static final int ProgressBar_indeterminateDuration = 9; + private static final int ProgressBar_indeterminateBehavior = 10; + private static final int ProgressBar_minWidth = 11; + private static final int ProgressBar_minHeight = 12; + private static final int ProgressBar_interpolator = 13; + private static final int ProgressBar_animationResolution = 14; + + int mMinWidth; + int mMaxWidth; + int mMinHeight; + int mMaxHeight; + + private int mProgress; + private int mSecondaryProgress; + private int mMax; + + private int mBehavior; + private int mDuration; + private boolean mIndeterminate; + private boolean mOnlyIndeterminate; + private Transformation mTransformation; + private AlphaAnimation mAnimation; + private Drawable mIndeterminateDrawable; + private int mIndeterminateRealLeft; + private int mIndeterminateRealTop; + private Drawable mProgressDrawable; + private Drawable mCurrentDrawable; + Bitmap mSampleTile; + private boolean mNoInvalidate; + private Interpolator mInterpolator; + private RefreshProgressRunnable mRefreshProgressRunnable; + private long mUiThreadId; + private boolean mShouldStartAnimationDrawable; + private long mLastDrawTime; + + private boolean mInDrawing; + + private int mAnimationResolution; + + private AccessibilityManager mAccessibilityManager; + private AccessibilityEventSender mAccessibilityEventSender; + + /** + * Create a new progress bar with range 0...100 and initial progress of 0. + * @param context the application environment + */ + public IcsProgressBar(Context context) { + this(context, null); + } + + public IcsProgressBar(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.progressBarStyle); + } + + public IcsProgressBar(Context context, AttributeSet attrs, int defStyle) { + this(context, attrs, defStyle, 0); + } + + /** + * @hide + */ + public IcsProgressBar(Context context, AttributeSet attrs, int defStyle, int styleRes) { + super(context, attrs, defStyle); + mUiThreadId = Thread.currentThread().getId(); + initProgressBar(); + + TypedArray a = + context.obtainStyledAttributes(attrs, /*R.styleable.*/ProgressBar, defStyle, styleRes); + + mNoInvalidate = true; + + Drawable drawable = a.getDrawable(/*R.styleable.*/ProgressBar_progressDrawable); + if (drawable != null) { + drawable = tileify(drawable, false); + // Calling this method can set mMaxHeight, make sure the corresponding + // XML attribute for mMaxHeight is read after calling this method + setProgressDrawable(drawable); + } + + + mDuration = a.getInt(/*R.styleable.*/ProgressBar_indeterminateDuration, mDuration); + + mMinWidth = a.getDimensionPixelSize(/*R.styleable.*/ProgressBar_minWidth, mMinWidth); + mMaxWidth = a.getDimensionPixelSize(/*R.styleable.*/ProgressBar_maxWidth, mMaxWidth); + mMinHeight = a.getDimensionPixelSize(/*R.styleable.*/ProgressBar_minHeight, mMinHeight); + mMaxHeight = a.getDimensionPixelSize(/*R.styleable.*/ProgressBar_maxHeight, mMaxHeight); + + mBehavior = a.getInt(/*R.styleable.*/ProgressBar_indeterminateBehavior, mBehavior); + + final int resID = a.getResourceId( + /*com.android.internal.R.styleable.*/ProgressBar_interpolator, + android.R.anim.linear_interpolator); // default to linear interpolator + if (resID > 0) { + setInterpolator(context, resID); + } + + setMax(a.getInt(/*R.styleable.*/ProgressBar_max, mMax)); + + setProgress(a.getInt(/*R.styleable.*/ProgressBar_progress, mProgress)); + + setSecondaryProgress( + a.getInt(/*R.styleable.*/ProgressBar_secondaryProgress, mSecondaryProgress)); + + drawable = a.getDrawable(/*R.styleable.*/ProgressBar_indeterminateDrawable); + if (drawable != null) { + drawable = tileifyIndeterminate(drawable); + setIndeterminateDrawable(drawable); + } + + mOnlyIndeterminate = a.getBoolean( + /*R.styleable.*/ProgressBar_indeterminateOnly, mOnlyIndeterminate); + + mNoInvalidate = false; + + setIndeterminate(mOnlyIndeterminate || a.getBoolean( + /*R.styleable.*/ProgressBar_indeterminate, mIndeterminate)); + + mAnimationResolution = a.getInteger(/*R.styleable.*/ProgressBar_animationResolution, + ANIMATION_RESOLUTION); + + a.recycle(); + + mAccessibilityManager = (AccessibilityManager)context.getSystemService(Context.ACCESSIBILITY_SERVICE); + } + + /** + * Converts a drawable to a tiled version of itself. It will recursively + * traverse layer and state list drawables. + */ + private Drawable tileify(Drawable drawable, boolean clip) { + + if (drawable instanceof LayerDrawable) { + LayerDrawable background = (LayerDrawable) drawable; + final int N = background.getNumberOfLayers(); + Drawable[] outDrawables = new Drawable[N]; + + for (int i = 0; i < N; i++) { + int id = background.getId(i); + outDrawables[i] = tileify(background.getDrawable(i), + (id == android.R.id.progress || id == android.R.id.secondaryProgress)); + } + + LayerDrawable newBg = new LayerDrawable(outDrawables); + + for (int i = 0; i < N; i++) { + newBg.setId(i, background.getId(i)); + } + + return newBg; + + }/* else if (drawable instanceof StateListDrawable) { + StateListDrawable in = (StateListDrawable) drawable; + StateListDrawable out = new StateListDrawable(); + int numStates = in.getStateCount(); + for (int i = 0; i < numStates; i++) { + out.addState(in.getStateSet(i), tileify(in.getStateDrawable(i), clip)); + } + return out; + + }*/ else if (drawable instanceof BitmapDrawable) { + final Bitmap tileBitmap = ((BitmapDrawable) drawable).getBitmap(); + if (mSampleTile == null) { + mSampleTile = tileBitmap; + } + + final ShapeDrawable shapeDrawable = new ShapeDrawable(getDrawableShape()); + + final BitmapShader bitmapShader = new BitmapShader(tileBitmap, + Shader.TileMode.REPEAT, Shader.TileMode.CLAMP); + shapeDrawable.getPaint().setShader(bitmapShader); + + return (clip) ? new ClipDrawable(shapeDrawable, Gravity.LEFT, + ClipDrawable.HORIZONTAL) : shapeDrawable; + } + + return drawable; + } + + Shape getDrawableShape() { + final float[] roundedCorners = new float[] { 5, 5, 5, 5, 5, 5, 5, 5 }; + return new RoundRectShape(roundedCorners, null, null); + } + + /** + * Convert a AnimationDrawable for use as a barberpole animation. + * Each frame of the animation is wrapped in a ClipDrawable and + * given a tiling BitmapShader. + */ + private Drawable tileifyIndeterminate(Drawable drawable) { + if (drawable instanceof AnimationDrawable) { + AnimationDrawable background = (AnimationDrawable) drawable; + final int N = background.getNumberOfFrames(); + AnimationDrawable newBg = new AnimationDrawable(); + newBg.setOneShot(background.isOneShot()); + + for (int i = 0; i < N; i++) { + Drawable frame = tileify(background.getFrame(i), true); + frame.setLevel(10000); + newBg.addFrame(frame, background.getDuration(i)); + } + newBg.setLevel(10000); + drawable = newBg; + } + return drawable; + } + + /** + *

+ * Initialize the progress bar's default values: + *

+ *
    + *
  • progress = 0
  • + *
  • max = 100
  • + *
  • animation duration = 4000 ms
  • + *
  • indeterminate = false
  • + *
  • behavior = repeat
  • + *
+ */ + private void initProgressBar() { + mMax = 100; + mProgress = 0; + mSecondaryProgress = 0; + mIndeterminate = false; + mOnlyIndeterminate = false; + mDuration = 4000; + mBehavior = AlphaAnimation.RESTART; + mMinWidth = 24; + mMaxWidth = 48; + mMinHeight = 24; + mMaxHeight = 48; + } + + /** + *

Indicate whether this progress bar is in indeterminate mode.

+ * + * @return true if the progress bar is in indeterminate mode + */ + @ViewDebug.ExportedProperty(category = "progress") + public synchronized boolean isIndeterminate() { + return mIndeterminate; + } + + /** + *

Change the indeterminate mode for this progress bar. In indeterminate + * mode, the progress is ignored and the progress bar shows an infinite + * animation instead.

+ * + * If this progress bar's style only supports indeterminate mode (such as the circular + * progress bars), then this will be ignored. + * + * @param indeterminate true to enable the indeterminate mode + */ + public synchronized void setIndeterminate(boolean indeterminate) { + if ((!mOnlyIndeterminate || !mIndeterminate) && indeterminate != mIndeterminate) { + mIndeterminate = indeterminate; + + if (indeterminate) { + // swap between indeterminate and regular backgrounds + mCurrentDrawable = mIndeterminateDrawable; + startAnimation(); + } else { + mCurrentDrawable = mProgressDrawable; + stopAnimation(); + } + } + } + + /** + *

Get the drawable used to draw the progress bar in + * indeterminate mode.

+ * + * @return a {@link android.graphics.drawable.Drawable} instance + * + * @see #setIndeterminateDrawable(android.graphics.drawable.Drawable) + * @see #setIndeterminate(boolean) + */ + public Drawable getIndeterminateDrawable() { + return mIndeterminateDrawable; + } + + /** + *

Define the drawable used to draw the progress bar in + * indeterminate mode.

+ * + * @param d the new drawable + * + * @see #getIndeterminateDrawable() + * @see #setIndeterminate(boolean) + */ + public void setIndeterminateDrawable(Drawable d) { + if (d != null) { + d.setCallback(this); + } + mIndeterminateDrawable = d; + if (mIndeterminate) { + mCurrentDrawable = d; + postInvalidate(); + } + } + + /** + *

Get the drawable used to draw the progress bar in + * progress mode.

+ * + * @return a {@link android.graphics.drawable.Drawable} instance + * + * @see #setProgressDrawable(android.graphics.drawable.Drawable) + * @see #setIndeterminate(boolean) + */ + public Drawable getProgressDrawable() { + return mProgressDrawable; + } + + /** + *

Define the drawable used to draw the progress bar in + * progress mode.

+ * + * @param d the new drawable + * + * @see #getProgressDrawable() + * @see #setIndeterminate(boolean) + */ + public void setProgressDrawable(Drawable d) { + boolean needUpdate; + if (mProgressDrawable != null && d != mProgressDrawable) { + mProgressDrawable.setCallback(null); + needUpdate = true; + } else { + needUpdate = false; + } + + if (d != null) { + d.setCallback(this); + + // Make sure the ProgressBar is always tall enough + int drawableHeight = d.getMinimumHeight(); + if (mMaxHeight < drawableHeight) { + mMaxHeight = drawableHeight; + requestLayout(); + } + } + mProgressDrawable = d; + if (!mIndeterminate) { + mCurrentDrawable = d; + postInvalidate(); + } + + if (needUpdate) { + updateDrawableBounds(getWidth(), getHeight()); + updateDrawableState(); + doRefreshProgress(android.R.id.progress, mProgress, false, false); + doRefreshProgress(android.R.id.secondaryProgress, mSecondaryProgress, false, false); + } + } + + /** + * @return The drawable currently used to draw the progress bar + */ + Drawable getCurrentDrawable() { + return mCurrentDrawable; + } + + @Override + protected boolean verifyDrawable(Drawable who) { + return who == mProgressDrawable || who == mIndeterminateDrawable + || super.verifyDrawable(who); + } + + @Override + public void jumpDrawablesToCurrentState() { + super.jumpDrawablesToCurrentState(); + if (mProgressDrawable != null) mProgressDrawable.jumpToCurrentState(); + if (mIndeterminateDrawable != null) mIndeterminateDrawable.jumpToCurrentState(); + } + + @Override + public void postInvalidate() { + if (!mNoInvalidate) { + super.postInvalidate(); + } + } + + private class RefreshProgressRunnable implements Runnable { + + private int mId; + private int mProgress; + private boolean mFromUser; + + RefreshProgressRunnable(int id, int progress, boolean fromUser) { + mId = id; + mProgress = progress; + mFromUser = fromUser; + } + + public void run() { + doRefreshProgress(mId, mProgress, mFromUser, true); + // Put ourselves back in the cache when we are done + mRefreshProgressRunnable = this; + } + + public void setup(int id, int progress, boolean fromUser) { + mId = id; + mProgress = progress; + mFromUser = fromUser; + } + + } + + private synchronized void doRefreshProgress(int id, int progress, boolean fromUser, + boolean callBackToApp) { + float scale = mMax > 0 ? (float) progress / (float) mMax : 0; + final Drawable d = mCurrentDrawable; + if (d != null) { + Drawable progressDrawable = null; + + if (d instanceof LayerDrawable) { + progressDrawable = ((LayerDrawable) d).findDrawableByLayerId(id); + } + + final int level = (int) (scale * MAX_LEVEL); + (progressDrawable != null ? progressDrawable : d).setLevel(level); + } else { + invalidate(); + } + + if (callBackToApp && id == android.R.id.progress) { + onProgressRefresh(scale, fromUser); + } + } + + void onProgressRefresh(float scale, boolean fromUser) { + if (mAccessibilityManager.isEnabled()) { + scheduleAccessibilityEventSender(); + } + } + + private synchronized void refreshProgress(int id, int progress, boolean fromUser) { + if (mUiThreadId == Thread.currentThread().getId()) { + doRefreshProgress(id, progress, fromUser, true); + } else { + RefreshProgressRunnable r; + if (mRefreshProgressRunnable != null) { + // Use cached RefreshProgressRunnable if available + r = mRefreshProgressRunnable; + // Uncache it + mRefreshProgressRunnable = null; + r.setup(id, progress, fromUser); + } else { + // Make a new one + r = new RefreshProgressRunnable(id, progress, fromUser); + } + post(r); + } + } + + /** + *

Set the current progress to the specified value. Does not do anything + * if the progress bar is in indeterminate mode.

+ * + * @param progress the new progress, between 0 and {@link #getMax()} + * + * @see #setIndeterminate(boolean) + * @see #isIndeterminate() + * @see #getProgress() + * @see #incrementProgressBy(int) + */ + public synchronized void setProgress(int progress) { + setProgress(progress, false); + } + + synchronized void setProgress(int progress, boolean fromUser) { + if (mIndeterminate) { + return; + } + + if (progress < 0) { + progress = 0; + } + + if (progress > mMax) { + progress = mMax; + } + + if (progress != mProgress) { + mProgress = progress; + refreshProgress(android.R.id.progress, mProgress, fromUser); + } + } + + /** + *

+ * Set the current secondary progress to the specified value. Does not do + * anything if the progress bar is in indeterminate mode. + *

+ * + * @param secondaryProgress the new secondary progress, between 0 and {@link #getMax()} + * @see #setIndeterminate(boolean) + * @see #isIndeterminate() + * @see #getSecondaryProgress() + * @see #incrementSecondaryProgressBy(int) + */ + public synchronized void setSecondaryProgress(int secondaryProgress) { + if (mIndeterminate) { + return; + } + + if (secondaryProgress < 0) { + secondaryProgress = 0; + } + + if (secondaryProgress > mMax) { + secondaryProgress = mMax; + } + + if (secondaryProgress != mSecondaryProgress) { + mSecondaryProgress = secondaryProgress; + refreshProgress(android.R.id.secondaryProgress, mSecondaryProgress, false); + } + } + + /** + *

Get the progress bar's current level of progress. Return 0 when the + * progress bar is in indeterminate mode.

+ * + * @return the current progress, between 0 and {@link #getMax()} + * + * @see #setIndeterminate(boolean) + * @see #isIndeterminate() + * @see #setProgress(int) + * @see #setMax(int) + * @see #getMax() + */ + @ViewDebug.ExportedProperty(category = "progress") + public synchronized int getProgress() { + return mIndeterminate ? 0 : mProgress; + } + + /** + *

Get the progress bar's current level of secondary progress. Return 0 when the + * progress bar is in indeterminate mode.

+ * + * @return the current secondary progress, between 0 and {@link #getMax()} + * + * @see #setIndeterminate(boolean) + * @see #isIndeterminate() + * @see #setSecondaryProgress(int) + * @see #setMax(int) + * @see #getMax() + */ + @ViewDebug.ExportedProperty(category = "progress") + public synchronized int getSecondaryProgress() { + return mIndeterminate ? 0 : mSecondaryProgress; + } + + /** + *

Return the upper limit of this progress bar's range.

+ * + * @return a positive integer + * + * @see #setMax(int) + * @see #getProgress() + * @see #getSecondaryProgress() + */ + @ViewDebug.ExportedProperty(category = "progress") + public synchronized int getMax() { + return mMax; + } + + /** + *

Set the range of the progress bar to 0...max.

+ * + * @param max the upper range of this progress bar + * + * @see #getMax() + * @see #setProgress(int) + * @see #setSecondaryProgress(int) + */ + public synchronized void setMax(int max) { + if (max < 0) { + max = 0; + } + if (max != mMax) { + mMax = max; + postInvalidate(); + + if (mProgress > max) { + mProgress = max; + } + refreshProgress(android.R.id.progress, mProgress, false); + } + } + + /** + *

Increase the progress bar's progress by the specified amount.

+ * + * @param diff the amount by which the progress must be increased + * + * @see #setProgress(int) + */ + public synchronized final void incrementProgressBy(int diff) { + setProgress(mProgress + diff); + } + + /** + *

Increase the progress bar's secondary progress by the specified amount.

+ * + * @param diff the amount by which the secondary progress must be increased + * + * @see #setSecondaryProgress(int) + */ + public synchronized final void incrementSecondaryProgressBy(int diff) { + setSecondaryProgress(mSecondaryProgress + diff); + } + + /** + *

Start the indeterminate progress animation.

+ */ + void startAnimation() { + if (getVisibility() != VISIBLE) { + return; + } + + if (mIndeterminateDrawable instanceof Animatable) { + mShouldStartAnimationDrawable = true; + mAnimation = null; + } else { + if (mInterpolator == null) { + mInterpolator = new LinearInterpolator(); + } + + mTransformation = new Transformation(); + mAnimation = new AlphaAnimation(0.0f, 1.0f); + mAnimation.setRepeatMode(mBehavior); + mAnimation.setRepeatCount(Animation.INFINITE); + mAnimation.setDuration(mDuration); + mAnimation.setInterpolator(mInterpolator); + mAnimation.setStartTime(Animation.START_ON_FIRST_FRAME); + } + postInvalidate(); + } + + /** + *

Stop the indeterminate progress animation.

+ */ + void stopAnimation() { + mAnimation = null; + mTransformation = null; + if (mIndeterminateDrawable instanceof Animatable) { + ((Animatable) mIndeterminateDrawable).stop(); + mShouldStartAnimationDrawable = false; + } + postInvalidate(); + } + + /** + * Sets the acceleration curve for the indeterminate animation. + * The interpolator is loaded as a resource from the specified context. + * + * @param context The application environment + * @param resID The resource identifier of the interpolator to load + */ + public void setInterpolator(Context context, int resID) { + setInterpolator(AnimationUtils.loadInterpolator(context, resID)); + } + + /** + * Sets the acceleration curve for the indeterminate animation. + * Defaults to a linear interpolation. + * + * @param interpolator The interpolator which defines the acceleration curve + */ + public void setInterpolator(Interpolator interpolator) { + mInterpolator = interpolator; + } + + /** + * Gets the acceleration curve type for the indeterminate animation. + * + * @return the {@link Interpolator} associated to this animation + */ + public Interpolator getInterpolator() { + return mInterpolator; + } + + @Override + public void setVisibility(int v) { + if (getVisibility() != v) { + super.setVisibility(v); + + if (mIndeterminate) { + // let's be nice with the UI thread + if (v == GONE || v == INVISIBLE) { + stopAnimation(); + } else { + startAnimation(); + } + } + } + } + + @Override + protected void onVisibilityChanged(View changedView, int visibility) { + super.onVisibilityChanged(changedView, visibility); + + if (mIndeterminate) { + // let's be nice with the UI thread + if (visibility == GONE || visibility == INVISIBLE) { + stopAnimation(); + } else { + startAnimation(); + } + } + } + + @Override + public void invalidateDrawable(Drawable dr) { + if (!mInDrawing) { + if (verifyDrawable(dr)) { + final Rect dirty = dr.getBounds(); + final int scrollX = getScrollX() + getPaddingLeft(); + final int scrollY = getScrollY() + getPaddingTop(); + + invalidate(dirty.left + scrollX, dirty.top + scrollY, + dirty.right + scrollX, dirty.bottom + scrollY); + } else { + super.invalidateDrawable(dr); + } + } + } + + /** + * @hide + * + @Override + public int getResolvedLayoutDirection(Drawable who) { + return (who == mProgressDrawable || who == mIndeterminateDrawable) ? + getResolvedLayoutDirection() : super.getResolvedLayoutDirection(who); + } + */ + + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + updateDrawableBounds(w, h); + } + + private void updateDrawableBounds(int w, int h) { + // onDraw will translate the canvas so we draw starting at 0,0 + int right = w - getPaddingRight() - getPaddingLeft(); + int bottom = h - getPaddingBottom() - getPaddingTop(); + int top = 0; + int left = 0; + + if (mIndeterminateDrawable != null) { + // Aspect ratio logic does not apply to AnimationDrawables + if (mOnlyIndeterminate && !(mIndeterminateDrawable instanceof AnimationDrawable)) { + // Maintain aspect ratio. Certain kinds of animated drawables + // get very confused otherwise. + final int intrinsicWidth = mIndeterminateDrawable.getIntrinsicWidth(); + final int intrinsicHeight = mIndeterminateDrawable.getIntrinsicHeight(); + final float intrinsicAspect = (float) intrinsicWidth / intrinsicHeight; + final float boundAspect = (float) w / h; + if (intrinsicAspect != boundAspect) { + if (boundAspect > intrinsicAspect) { + // New width is larger. Make it smaller to match height. + final int width = (int) (h * intrinsicAspect); + left = (w - width) / 2; + right = left + width; + } else { + // New height is larger. Make it smaller to match width. + final int height = (int) (w * (1 / intrinsicAspect)); + top = (h - height) / 2; + bottom = top + height; + } + } + } + mIndeterminateDrawable.setBounds(0, 0, right - left, bottom - top); + mIndeterminateRealLeft = left; + mIndeterminateRealTop = top; + } + + if (mProgressDrawable != null) { + mProgressDrawable.setBounds(0, 0, right, bottom); + } + } + + @Override + protected synchronized void onDraw(Canvas canvas) { + super.onDraw(canvas); + + Drawable d = mCurrentDrawable; + if (d != null) { + // Translate canvas so a indeterminate circular progress bar with padding + // rotates properly in its animation + canvas.save(); + canvas.translate(getPaddingLeft() + mIndeterminateRealLeft, getPaddingTop() + mIndeterminateRealTop); + long time = getDrawingTime(); + if (mAnimation != null) { + mAnimation.getTransformation(time, mTransformation); + float scale = mTransformation.getAlpha(); + try { + mInDrawing = true; + d.setLevel((int) (scale * MAX_LEVEL)); + } finally { + mInDrawing = false; + } + if (SystemClock.uptimeMillis() - mLastDrawTime >= mAnimationResolution) { + mLastDrawTime = SystemClock.uptimeMillis(); + postInvalidateDelayed(mAnimationResolution); + } + } + d.draw(canvas); + canvas.restore(); + if (mShouldStartAnimationDrawable && d instanceof Animatable) { + ((Animatable) d).start(); + mShouldStartAnimationDrawable = false; + } + } + } + + @Override + protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + Drawable d = mCurrentDrawable; + + int dw = 0; + int dh = 0; + if (d != null) { + dw = Math.max(mMinWidth, Math.min(mMaxWidth, d.getIntrinsicWidth())); + dh = Math.max(mMinHeight, Math.min(mMaxHeight, d.getIntrinsicHeight())); + } + updateDrawableState(); + dw += getPaddingLeft() + getPaddingRight(); + dh += getPaddingTop() + getPaddingBottom(); + + if (IS_HONEYCOMB) { + setMeasuredDimension(View.resolveSizeAndState(dw, widthMeasureSpec, 0), + View.resolveSizeAndState(dh, heightMeasureSpec, 0)); + } else { + setMeasuredDimension(View.resolveSize(dw, widthMeasureSpec), + View.resolveSize(dh, heightMeasureSpec)); + } + } + + @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + updateDrawableState(); + } + + private void updateDrawableState() { + int[] state = getDrawableState(); + + if (mProgressDrawable != null && mProgressDrawable.isStateful()) { + mProgressDrawable.setState(state); + } + + if (mIndeterminateDrawable != null && mIndeterminateDrawable.isStateful()) { + mIndeterminateDrawable.setState(state); + } + } + + static class SavedState extends BaseSavedState { + int progress; + int secondaryProgress; + + /** + * Constructor called from {@link IcsProgressBar#onSaveInstanceState()} + */ + SavedState(Parcelable superState) { + super(superState); + } + + /** + * Constructor called from {@link #CREATOR} + */ + private SavedState(Parcel in) { + super(in); + progress = in.readInt(); + secondaryProgress = in.readInt(); + } + + @Override + public void writeToParcel(Parcel out, int flags) { + super.writeToParcel(out, flags); + out.writeInt(progress); + out.writeInt(secondaryProgress); + } + + public static final Parcelable.Creator CREATOR + = new Parcelable.Creator() { + public SavedState createFromParcel(Parcel in) { + return new SavedState(in); + } + + public SavedState[] newArray(int size) { + return new SavedState[size]; + } + }; + } + + @Override + public Parcelable onSaveInstanceState() { + // Force our ancestor class to save its state + Parcelable superState = super.onSaveInstanceState(); + SavedState ss = new SavedState(superState); + + ss.progress = mProgress; + ss.secondaryProgress = mSecondaryProgress; + + return ss; + } + + @Override + public void onRestoreInstanceState(Parcelable state) { + SavedState ss = (SavedState) state; + super.onRestoreInstanceState(ss.getSuperState()); + + setProgress(ss.progress); + setSecondaryProgress(ss.secondaryProgress); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + if (mIndeterminate) { + startAnimation(); + } + } + + @Override + protected void onDetachedFromWindow() { + if (mIndeterminate) { + stopAnimation(); + } + if(mRefreshProgressRunnable != null) { + removeCallbacks(mRefreshProgressRunnable); + } + if (mAccessibilityEventSender != null) { + removeCallbacks(mAccessibilityEventSender); + } + // This should come after stopAnimation(), otherwise an invalidate message remains in the + // queue, which can prevent the entire view hierarchy from being GC'ed during a rotation + super.onDetachedFromWindow(); + } + + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setItemCount(mMax); + event.setCurrentItemIndex(mProgress); + } + + /** + * Schedule a command for sending an accessibility event. + *
+ * Note: A command is used to ensure that accessibility events + * are sent at most one in a given time frame to save + * system resources while the progress changes quickly. + */ + private void scheduleAccessibilityEventSender() { + if (mAccessibilityEventSender == null) { + mAccessibilityEventSender = new AccessibilityEventSender(); + } else { + removeCallbacks(mAccessibilityEventSender); + } + postDelayed(mAccessibilityEventSender, TIMEOUT_SEND_ACCESSIBILITY_EVENT); + } + + /** + * Command for sending an accessibility event. + */ + private class AccessibilityEventSender implements Runnable { + public void run() { + sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsSpinner.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsSpinner.java new file mode 100644 index 0000000000..038d1e0318 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsSpinner.java @@ -0,0 +1,703 @@ +/* + * 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. + */ + +package com.actionbarsherlock.internal.widget; + +import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; +import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; +import com.actionbarsherlock.R; +import android.content.Context; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.content.res.TypedArray; +import android.database.DataSetObserver; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.PopupWindow; +import android.widget.SpinnerAdapter; + + +/** + * A view that displays one child at a time and lets the user pick among them. + * The items in the Spinner come from the {@link Adapter} associated with + * this view. + * + *

See the Spinner + * tutorial.

+ * + * @attr ref android.R.styleable#Spinner_prompt + */ +public class IcsSpinner extends IcsAbsSpinner implements OnClickListener { + //private static final String TAG = "Spinner"; + + // Only measure this many items to get a decent max width. + private static final int MAX_ITEMS_MEASURED = 15; + + /** + * Use a dialog window for selecting spinner options. + */ + //public static final int MODE_DIALOG = 0; + + /** + * Use a dropdown anchored to the Spinner for selecting spinner options. + */ + public static final int MODE_DROPDOWN = 1; + + /** + * Use the theme-supplied value to select the dropdown mode. + */ + //private static final int MODE_THEME = -1; + + private SpinnerPopup mPopup; + private DropDownAdapter mTempAdapter; + int mDropDownWidth; + + private int mGravity; + private boolean mDisableChildrenWhenDisabled; + + private Rect mTempRect = new Rect(); + + public IcsSpinner(Context context, AttributeSet attrs) { + this(context, attrs, R.attr.actionDropDownStyle); + } + + /** + * Construct a new spinner with the given context's theme, the supplied attribute set, + * and default style. + * + * @param context The Context the view is running in, through which it can + * access the current theme, resources, etc. + * @param attrs The attributes of the XML tag that is inflating the view. + * @param defStyle The default style to apply to this view. If 0, no style + * will be applied (beyond what is included in the theme). This may + * either be an attribute resource, whose value will be retrieved + * from the current theme, or an explicit style resource. + */ + public IcsSpinner(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + TypedArray a = context.obtainStyledAttributes(attrs, + R.styleable.SherlockSpinner, defStyle, 0); + + + DropdownPopup popup = new DropdownPopup(context, attrs, defStyle); + + mDropDownWidth = a.getLayoutDimension( + R.styleable.SherlockSpinner_android_dropDownWidth, + ViewGroup.LayoutParams.WRAP_CONTENT); + popup.setBackgroundDrawable(a.getDrawable( + R.styleable.SherlockSpinner_android_popupBackground)); + final int verticalOffset = a.getDimensionPixelOffset( + R.styleable.SherlockSpinner_android_dropDownVerticalOffset, 0); + if (verticalOffset != 0) { + popup.setVerticalOffset(verticalOffset); + } + + final int horizontalOffset = a.getDimensionPixelOffset( + R.styleable.SherlockSpinner_android_dropDownHorizontalOffset, 0); + if (horizontalOffset != 0) { + popup.setHorizontalOffset(horizontalOffset); + } + + mPopup = popup; + + mGravity = a.getInt(R.styleable.SherlockSpinner_android_gravity, Gravity.CENTER); + + mPopup.setPromptText(a.getString(R.styleable.SherlockSpinner_android_prompt)); + + mDisableChildrenWhenDisabled = true; + + a.recycle(); + + // Base constructor can call setAdapter before we initialize mPopup. + // Finish setting things up if this happened. + if (mTempAdapter != null) { + mPopup.setAdapter(mTempAdapter); + mTempAdapter = null; + } + } + + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + if (mDisableChildrenWhenDisabled) { + final int count = getChildCount(); + for (int i = 0; i < count; i++) { + getChildAt(i).setEnabled(enabled); + } + } + } + + /** + * Describes how the selected item view is positioned. Currently only the horizontal component + * is used. The default is determined by the current theme. + * + * @param gravity See {@link android.view.Gravity} + * + * @attr ref android.R.styleable#Spinner_gravity + */ + public void setGravity(int gravity) { + if (mGravity != gravity) { + if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == 0) { + gravity |= Gravity.LEFT; + } + mGravity = gravity; + requestLayout(); + } + } + + @Override + public void setAdapter(SpinnerAdapter adapter) { + super.setAdapter(adapter); + + if (mPopup != null) { + mPopup.setAdapter(new DropDownAdapter(adapter)); + } else { + mTempAdapter = new DropDownAdapter(adapter); + } + } + + @Override + public int getBaseline() { + View child = null; + + if (getChildCount() > 0) { + child = getChildAt(0); + } else if (mAdapter != null && mAdapter.getCount() > 0) { + child = makeAndAddView(0); + mRecycler.put(0, child); + removeAllViewsInLayout(); + } + + if (child != null) { + final int childBaseline = child.getBaseline(); + return childBaseline >= 0 ? child.getTop() + childBaseline : -1; + } else { + return -1; + } + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + + if (mPopup != null && mPopup.isShowing()) { + mPopup.dismiss(); + } + } + + /** + *

A spinner does not support item click events. Calling this method + * will raise an exception.

+ * + * @param l this listener will be ignored + */ + @Override + public void setOnItemClickListener(OnItemClickListener l) { + throw new RuntimeException("setOnItemClickListener cannot be used with a spinner."); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + if (mPopup != null && MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.AT_MOST) { + final int measuredWidth = getMeasuredWidth(); + setMeasuredDimension(Math.min(Math.max(measuredWidth, + measureContentWidth(getAdapter(), getBackground())), + MeasureSpec.getSize(widthMeasureSpec)), + getMeasuredHeight()); + } + } + + /** + * @see android.view.View#onLayout(boolean,int,int,int,int) + * + * Creates and positions all views + * + */ + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + super.onLayout(changed, l, t, r, b); + mInLayout = true; + layout(0, false); + mInLayout = false; + } + + /** + * Creates and positions all views for this Spinner. + * + * @param delta Change in the selected position. +1 moves selection is moving to the right, + * so views are scrolling to the left. -1 means selection is moving to the left. + */ + @Override + void layout(int delta, boolean animate) { + int childrenLeft = mSpinnerPadding.left; + int childrenWidth = getRight() - getLeft() - mSpinnerPadding.left - mSpinnerPadding.right; + + if (mDataChanged) { + handleDataChanged(); + } + + // Handle the empty set by removing all views + if (mItemCount == 0) { + resetList(); + return; + } + + if (mNextSelectedPosition >= 0) { + setSelectedPositionInt(mNextSelectedPosition); + } + + recycleAllViews(); + + // Clear out old views + removeAllViewsInLayout(); + + // Make selected view and position it + mFirstPosition = mSelectedPosition; + View sel = makeAndAddView(mSelectedPosition); + int width = sel.getMeasuredWidth(); + int selectedOffset = childrenLeft; + switch (mGravity & Gravity.HORIZONTAL_GRAVITY_MASK) { + case Gravity.CENTER_HORIZONTAL: + selectedOffset = childrenLeft + (childrenWidth / 2) - (width / 2); + break; + case Gravity.RIGHT: + selectedOffset = childrenLeft + childrenWidth - width; + break; + } + sel.offsetLeftAndRight(selectedOffset); + + // Flush any cached views that did not get reused above + mRecycler.clear(); + + invalidate(); + + checkSelectionChanged(); + + mDataChanged = false; + mNeedSync = false; + setNextSelectedPositionInt(mSelectedPosition); + } + + /** + * Obtain a view, either by pulling an existing view from the recycler or + * by getting a new one from the adapter. If we are animating, make sure + * there is enough information in the view's layout parameters to animate + * from the old to new positions. + * + * @param position Position in the spinner for the view to obtain + * @return A view that has been added to the spinner + */ + private View makeAndAddView(int position) { + + View child; + + if (!mDataChanged) { + child = mRecycler.get(position); + if (child != null) { + // Position the view + setUpChild(child); + + return child; + } + } + + // Nothing found in the recycler -- ask the adapter for a view + child = mAdapter.getView(position, null, this); + + // Position the view + setUpChild(child); + + return child; + } + + /** + * Helper for makeAndAddView to set the position of a view + * and fill out its layout paramters. + * + * @param child The view to position + */ + private void setUpChild(View child) { + + // Respect layout params that are already in the view. Otherwise + // make some up... + ViewGroup.LayoutParams lp = child.getLayoutParams(); + if (lp == null) { + lp = generateDefaultLayoutParams(); + } + + addViewInLayout(child, 0, lp); + + child.setSelected(hasFocus()); + if (mDisableChildrenWhenDisabled) { + child.setEnabled(isEnabled()); + } + + // Get measure specs + int childHeightSpec = ViewGroup.getChildMeasureSpec(mHeightMeasureSpec, + mSpinnerPadding.top + mSpinnerPadding.bottom, lp.height); + int childWidthSpec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec, + mSpinnerPadding.left + mSpinnerPadding.right, lp.width); + + // Measure child + child.measure(childWidthSpec, childHeightSpec); + + int childLeft; + int childRight; + + // Position vertically based on gravity setting + int childTop = mSpinnerPadding.top + + ((getMeasuredHeight() - mSpinnerPadding.bottom - + mSpinnerPadding.top - child.getMeasuredHeight()) / 2); + int childBottom = childTop + child.getMeasuredHeight(); + + int width = child.getMeasuredWidth(); + childLeft = 0; + childRight = childLeft + width; + + child.layout(childLeft, childTop, childRight, childBottom); + } + + @Override + public boolean performClick() { + boolean handled = super.performClick(); + + if (!handled) { + handled = true; + + if (!mPopup.isShowing()) { + mPopup.show(); + } + } + + return handled; + } + + public void onClick(DialogInterface dialog, int which) { + setSelection(which); + dialog.dismiss(); + } + + /** + * Sets the prompt to display when the dialog is shown. + * @param prompt the prompt to set + */ + public void setPrompt(CharSequence prompt) { + mPopup.setPromptText(prompt); + } + + /** + * Sets the prompt to display when the dialog is shown. + * @param promptId the resource ID of the prompt to display when the dialog is shown + */ + public void setPromptId(int promptId) { + setPrompt(getContext().getText(promptId)); + } + + /** + * @return The prompt to display when the dialog is shown + */ + public CharSequence getPrompt() { + return mPopup.getHintText(); + } + + int measureContentWidth(SpinnerAdapter adapter, Drawable background) { + if (adapter == null) { + return 0; + } + + int width = 0; + View itemView = null; + int itemType = 0; + final int widthMeasureSpec = + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + final int heightMeasureSpec = + MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + + // Make sure the number of items we'll measure is capped. If it's a huge data set + // with wildly varying sizes, oh well. + int start = Math.max(0, getSelectedItemPosition()); + final int end = Math.min(adapter.getCount(), start + MAX_ITEMS_MEASURED); + final int count = end - start; + start = Math.max(0, start - (MAX_ITEMS_MEASURED - count)); + for (int i = start; i < end; i++) { + final int positionType = adapter.getItemViewType(i); + if (positionType != itemType) { + itemType = positionType; + itemView = null; + } + itemView = adapter.getView(i, itemView, this); + if (itemView.getLayoutParams() == null) { + itemView.setLayoutParams(new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT)); + } + itemView.measure(widthMeasureSpec, heightMeasureSpec); + width = Math.max(width, itemView.getMeasuredWidth()); + } + + // Add background padding to measured width + if (background != null) { + background.getPadding(mTempRect); + width += mTempRect.left + mTempRect.right; + } + + return width; + } + + /** + *

Wrapper class for an Adapter. Transforms the embedded Adapter instance + * into a ListAdapter.

+ */ + private static class DropDownAdapter implements ListAdapter, SpinnerAdapter { + private SpinnerAdapter mAdapter; + private ListAdapter mListAdapter; + + /** + *

Creates a new ListAdapter wrapper for the specified adapter.

+ * + * @param adapter the Adapter to transform into a ListAdapter + */ + public DropDownAdapter(SpinnerAdapter adapter) { + this.mAdapter = adapter; + if (adapter instanceof ListAdapter) { + this.mListAdapter = (ListAdapter) adapter; + } + } + + public int getCount() { + return mAdapter == null ? 0 : mAdapter.getCount(); + } + + public Object getItem(int position) { + return mAdapter == null ? null : mAdapter.getItem(position); + } + + public long getItemId(int position) { + return mAdapter == null ? -1 : mAdapter.getItemId(position); + } + + public View getView(int position, View convertView, ViewGroup parent) { + return getDropDownView(position, convertView, parent); + } + + public View getDropDownView(int position, View convertView, ViewGroup parent) { + return mAdapter == null ? null : + mAdapter.getDropDownView(position, convertView, parent); + } + + public boolean hasStableIds() { + return mAdapter != null && mAdapter.hasStableIds(); + } + + public void registerDataSetObserver(DataSetObserver observer) { + if (mAdapter != null) { + mAdapter.registerDataSetObserver(observer); + } + } + + public void unregisterDataSetObserver(DataSetObserver observer) { + if (mAdapter != null) { + mAdapter.unregisterDataSetObserver(observer); + } + } + + /** + * If the wrapped SpinnerAdapter is also a ListAdapter, delegate this call. + * Otherwise, return true. + */ + public boolean areAllItemsEnabled() { + final ListAdapter adapter = mListAdapter; + if (adapter != null) { + return adapter.areAllItemsEnabled(); + } else { + return true; + } + } + + /** + * If the wrapped SpinnerAdapter is also a ListAdapter, delegate this call. + * Otherwise, return true. + */ + public boolean isEnabled(int position) { + final ListAdapter adapter = mListAdapter; + if (adapter != null) { + return adapter.isEnabled(position); + } else { + return true; + } + } + + public int getItemViewType(int position) { + return 0; + } + + public int getViewTypeCount() { + return 1; + } + + public boolean isEmpty() { + return getCount() == 0; + } + } + + /** + * Implements some sort of popup selection interface for selecting a spinner option. + * Allows for different spinner modes. + */ + private interface SpinnerPopup { + public void setAdapter(ListAdapter adapter); + + /** + * Show the popup + */ + public void show(); + + /** + * Dismiss the popup + */ + public void dismiss(); + + /** + * @return true if the popup is showing, false otherwise. + */ + public boolean isShowing(); + + /** + * Set hint text to be displayed to the user. This should provide + * a description of the choice being made. + * @param hintText Hint text to set. + */ + public void setPromptText(CharSequence hintText); + public CharSequence getHintText(); + } + + /* + private class DialogPopup implements SpinnerPopup, DialogInterface.OnClickListener { + private AlertDialog mPopup; + private ListAdapter mListAdapter; + private CharSequence mPrompt; + + public void dismiss() { + mPopup.dismiss(); + mPopup = null; + } + + public boolean isShowing() { + return mPopup != null ? mPopup.isShowing() : false; + } + + public void setAdapter(ListAdapter adapter) { + mListAdapter = adapter; + } + + public void setPromptText(CharSequence hintText) { + mPrompt = hintText; + } + + public CharSequence getHintText() { + return mPrompt; + } + + public void show() { + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); + if (mPrompt != null) { + builder.setTitle(mPrompt); + } + mPopup = builder.setSingleChoiceItems(mListAdapter, + getSelectedItemPosition(), this).show(); + } + + public void onClick(DialogInterface dialog, int which) { + setSelection(which); + dismiss(); + } + } + */ + + private class DropdownPopup extends IcsListPopupWindow implements SpinnerPopup { + private CharSequence mHintText; + private ListAdapter mAdapter; + + public DropdownPopup(Context context, AttributeSet attrs, int defStyleRes) { + super(context, attrs, 0, defStyleRes); + + setAnchorView(IcsSpinner.this); + setModal(true); + setPromptPosition(POSITION_PROMPT_ABOVE); + setOnItemClickListener(new OnItemClickListener() { + @SuppressWarnings("rawtypes") + public void onItemClick(AdapterView parent, View v, int position, long id) { + IcsSpinner.this.setSelection(position); + dismiss(); + } + }); + } + + @Override + public void setAdapter(ListAdapter adapter) { + super.setAdapter(adapter); + mAdapter = adapter; + } + + public CharSequence getHintText() { + return mHintText; + } + + public void setPromptText(CharSequence hintText) { + // Hint text is ignored for dropdowns, but maintain it here. + mHintText = hintText; + } + + @Override + public void show() { + final int spinnerPaddingLeft = IcsSpinner.this.getPaddingLeft(); + if (mDropDownWidth == WRAP_CONTENT) { + final int spinnerWidth = IcsSpinner.this.getWidth(); + final int spinnerPaddingRight = IcsSpinner.this.getPaddingRight(); + setContentWidth(Math.max( + measureContentWidth((SpinnerAdapter) mAdapter, getBackground()), + spinnerWidth - spinnerPaddingLeft - spinnerPaddingRight)); + } else if (mDropDownWidth == MATCH_PARENT) { + final int spinnerWidth = IcsSpinner.this.getWidth(); + final int spinnerPaddingRight = IcsSpinner.this.getPaddingRight(); + setContentWidth(spinnerWidth - spinnerPaddingLeft - spinnerPaddingRight); + } else { + setContentWidth(mDropDownWidth); + } + final Drawable background = getBackground(); + int bgOffset = 0; + if (background != null) { + background.getPadding(mTempRect); + bgOffset = -mTempRect.left; + } + setHorizontalOffset(bgOffset + spinnerPaddingLeft); + setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); + super.show(); + getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); + setSelection(IcsSpinner.this.getSelectedItemPosition()); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsView.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsView.java new file mode 100644 index 0000000000..a7185d082c --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/IcsView.java @@ -0,0 +1,21 @@ +package com.actionbarsherlock.internal.widget; + +import android.view.View; + +final class IcsView { + //No instances + private IcsView() {} + + /** + * Return only the state bits of {@link #getMeasuredWidthAndState()} + * and {@link #getMeasuredHeightAndState()}, combined into one integer. + * The width component is in the regular bits {@link #MEASURED_STATE_MASK} + * and the height component is at the shifted bits + * {@link #MEASURED_HEIGHT_STATE_SHIFT}>>{@link #MEASURED_STATE_MASK}. + */ + public static int getMeasuredStateInt(View child) { + return (child.getMeasuredWidth()&View.MEASURED_STATE_MASK) + | ((child.getMeasuredHeight()>>View.MEASURED_HEIGHT_STATE_SHIFT) + & (View.MEASURED_STATE_MASK>>View.MEASURED_HEIGHT_STATE_SHIFT)); + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java new file mode 100644 index 0000000000..48fb5d8b4f --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/internal/widget/ScrollingTabContainerView.java @@ -0,0 +1,546 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.actionbarsherlock.internal.widget; + +import android.content.Context; +import android.content.res.Configuration; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.text.TextUtils.TruncateAt; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewParent; +import android.view.animation.DecelerateInterpolator; +import android.view.animation.Interpolator; +import android.widget.BaseAdapter; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import com.actionbarsherlock.R; +import com.actionbarsherlock.app.ActionBar; +import com.actionbarsherlock.internal.nineoldandroids.animation.Animator; +import com.actionbarsherlock.internal.nineoldandroids.animation.ObjectAnimator; +import com.actionbarsherlock.internal.nineoldandroids.widget.NineHorizontalScrollView; + +/** + * This widget implements the dynamic action bar tab behavior that can change + * across different configurations or circumstances. + */ +public class ScrollingTabContainerView extends NineHorizontalScrollView + implements IcsAdapterView.OnItemSelectedListener { + //UNUSED private static final String TAG = "ScrollingTabContainerView"; + Runnable mTabSelector; + private TabClickListener mTabClickListener; + + private IcsLinearLayout mTabLayout; + private IcsSpinner mTabSpinner; + private boolean mAllowCollapse; + + private LayoutInflater mInflater; + + int mMaxTabWidth; + private int mContentHeight; + private int mSelectedTabIndex; + + protected Animator mVisibilityAnim; + protected final VisibilityAnimListener mVisAnimListener = new VisibilityAnimListener(); + + private static final /*Time*/Interpolator sAlphaInterpolator = new DecelerateInterpolator(); + + private static final int FADE_DURATION = 200; + + public ScrollingTabContainerView(Context context) { + super(context); + setHorizontalScrollBarEnabled(false); + + TypedArray a = getContext().obtainStyledAttributes(null, R.styleable.SherlockActionBar, + R.attr.actionBarStyle, 0); + setContentHeight(a.getLayoutDimension(R.styleable.SherlockActionBar_height, 0)); + a.recycle(); + + mInflater = LayoutInflater.from(context); + + mTabLayout = createTabLayout(); + addView(mTabLayout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.MATCH_PARENT)); + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + final int widthMode = MeasureSpec.getMode(widthMeasureSpec); + final boolean lockedExpanded = widthMode == MeasureSpec.EXACTLY; + setFillViewport(lockedExpanded); + + final int childCount = mTabLayout.getChildCount(); + if (childCount > 1 && + (widthMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST)) { + if (childCount > 2) { + mMaxTabWidth = (int) (MeasureSpec.getSize(widthMeasureSpec) * 0.4f); + } else { + mMaxTabWidth = MeasureSpec.getSize(widthMeasureSpec) / 2; + } + } else { + mMaxTabWidth = -1; + } + + heightMeasureSpec = MeasureSpec.makeMeasureSpec(mContentHeight, MeasureSpec.EXACTLY); + + final boolean canCollapse = !lockedExpanded && mAllowCollapse; + + if (canCollapse) { + // See if we should expand + mTabLayout.measure(MeasureSpec.UNSPECIFIED, heightMeasureSpec); + if (mTabLayout.getMeasuredWidth() > MeasureSpec.getSize(widthMeasureSpec)) { + performCollapse(); + } else { + performExpand(); + } + } else { + performExpand(); + } + + final int oldWidth = getMeasuredWidth(); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + final int newWidth = getMeasuredWidth(); + + if (lockedExpanded && oldWidth != newWidth) { + // Recenter the tab display if we're at a new (scrollable) size. + setTabSelected(mSelectedTabIndex); + } + } + + /** + * Indicates whether this view is collapsed into a dropdown menu instead + * of traditional tabs. + * @return true if showing as a spinner + */ + private boolean isCollapsed() { + return mTabSpinner != null && mTabSpinner.getParent() == this; + } + + public void setAllowCollapse(boolean allowCollapse) { + mAllowCollapse = allowCollapse; + } + + private void performCollapse() { + if (isCollapsed()) return; + + if (mTabSpinner == null) { + mTabSpinner = createSpinner(); + } + removeView(mTabLayout); + addView(mTabSpinner, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.MATCH_PARENT)); + if (mTabSpinner.getAdapter() == null) { + mTabSpinner.setAdapter(new TabAdapter()); + } + if (mTabSelector != null) { + removeCallbacks(mTabSelector); + mTabSelector = null; + } + mTabSpinner.setSelection(mSelectedTabIndex); + } + + private boolean performExpand() { + if (!isCollapsed()) return false; + + removeView(mTabSpinner); + addView(mTabLayout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.MATCH_PARENT)); + setTabSelected(mTabSpinner.getSelectedItemPosition()); + return false; + } + + public void setTabSelected(int position) { + mSelectedTabIndex = position; + final int tabCount = mTabLayout.getChildCount(); + for (int i = 0; i < tabCount; i++) { + final View child = mTabLayout.getChildAt(i); + final boolean isSelected = i == position; + child.setSelected(isSelected); + if (isSelected) { + animateToTab(position); + } + } + } + + public void setContentHeight(int contentHeight) { + mContentHeight = contentHeight; + requestLayout(); + } + + private IcsLinearLayout createTabLayout() { + final IcsLinearLayout tabLayout = (IcsLinearLayout) LayoutInflater.from(getContext()) + .inflate(R.layout.abs__action_bar_tab_bar_view, null); + tabLayout.setMeasureWithLargestChildEnabled(true); + tabLayout.setLayoutParams(new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT)); + return tabLayout; + } + + private IcsSpinner createSpinner() { + final IcsSpinner spinner = new IcsSpinner(getContext(), null, + R.attr.actionDropDownStyle); + spinner.setLayoutParams(new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT)); + spinner.setOnItemSelectedListener(this); + return spinner; + } + + @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + + // Action bar can change size on configuration changes. + // Reread the desired height from the theme-specified style. + TypedArray a = getContext().obtainStyledAttributes(null, R.styleable.SherlockActionBar, + R.attr.actionBarStyle, 0); + setContentHeight(a.getLayoutDimension(R.styleable.SherlockActionBar_height, 0)); + a.recycle(); + } + + public void animateToVisibility(int visibility) { + if (mVisibilityAnim != null) { + mVisibilityAnim.cancel(); + } + if (visibility == VISIBLE) { + if (getVisibility() != VISIBLE) { + setAlpha(0); + } + ObjectAnimator anim = ObjectAnimator.ofFloat(this, "alpha", 1); + anim.setDuration(FADE_DURATION); + anim.setInterpolator(sAlphaInterpolator); + + anim.addListener(mVisAnimListener.withFinalVisibility(visibility)); + anim.start(); + } else { + ObjectAnimator anim = ObjectAnimator.ofFloat(this, "alpha", 0); + anim.setDuration(FADE_DURATION); + anim.setInterpolator(sAlphaInterpolator); + + anim.addListener(mVisAnimListener.withFinalVisibility(visibility)); + anim.start(); + } + } + + public void animateToTab(final int position) { + final View tabView = mTabLayout.getChildAt(position); + if (mTabSelector != null) { + removeCallbacks(mTabSelector); + } + mTabSelector = new Runnable() { + public void run() { + final int scrollPos = tabView.getLeft() - (getWidth() - tabView.getWidth()) / 2; + smoothScrollTo(scrollPos, 0); + mTabSelector = null; + } + }; + post(mTabSelector); + } + + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + if (mTabSelector != null) { + // Re-post the selector we saved + post(mTabSelector); + } + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (mTabSelector != null) { + removeCallbacks(mTabSelector); + } + } + + private TabView createTabView(ActionBar.Tab tab, boolean forAdapter) { + //Workaround for not being able to pass a defStyle on pre-3.0 + final TabView tabView = (TabView)mInflater.inflate(R.layout.abs__action_bar_tab, null); + tabView.init(this, tab, forAdapter); + + if (forAdapter) { + tabView.setBackgroundDrawable(null); + tabView.setLayoutParams(new ListView.LayoutParams(ListView.LayoutParams.MATCH_PARENT, + mContentHeight)); + } else { + tabView.setFocusable(true); + + if (mTabClickListener == null) { + mTabClickListener = new TabClickListener(); + } + tabView.setOnClickListener(mTabClickListener); + } + return tabView; + } + + public void addTab(ActionBar.Tab tab, boolean setSelected) { + TabView tabView = createTabView(tab, false); + mTabLayout.addView(tabView, new IcsLinearLayout.LayoutParams(0, + LayoutParams.MATCH_PARENT, 1)); + if (mTabSpinner != null) { + ((TabAdapter) mTabSpinner.getAdapter()).notifyDataSetChanged(); + } + if (setSelected) { + tabView.setSelected(true); + } + if (mAllowCollapse) { + requestLayout(); + } + } + + public void addTab(ActionBar.Tab tab, int position, boolean setSelected) { + final TabView tabView = createTabView(tab, false); + mTabLayout.addView(tabView, position, new IcsLinearLayout.LayoutParams( + 0, LayoutParams.MATCH_PARENT, 1)); + if (mTabSpinner != null) { + ((TabAdapter) mTabSpinner.getAdapter()).notifyDataSetChanged(); + } + if (setSelected) { + tabView.setSelected(true); + } + if (mAllowCollapse) { + requestLayout(); + } + } + + public void updateTab(int position) { + ((TabView) mTabLayout.getChildAt(position)).update(); + if (mTabSpinner != null) { + ((TabAdapter) mTabSpinner.getAdapter()).notifyDataSetChanged(); + } + if (mAllowCollapse) { + requestLayout(); + } + } + + public void removeTabAt(int position) { + mTabLayout.removeViewAt(position); + if (mTabSpinner != null) { + ((TabAdapter) mTabSpinner.getAdapter()).notifyDataSetChanged(); + } + if (mAllowCollapse) { + requestLayout(); + } + } + + public void removeAllTabs() { + mTabLayout.removeAllViews(); + if (mTabSpinner != null) { + ((TabAdapter) mTabSpinner.getAdapter()).notifyDataSetChanged(); + } + if (mAllowCollapse) { + requestLayout(); + } + } + + @Override + public void onItemSelected(IcsAdapterView parent, View view, int position, long id) { + TabView tabView = (TabView) view; + tabView.getTab().select(); + } + + @Override + public void onNothingSelected(IcsAdapterView parent) { + } + + public static class TabView extends LinearLayout { + private ScrollingTabContainerView mParent; + private ActionBar.Tab mTab; + private CapitalizingTextView mTextView; + private ImageView mIconView; + private View mCustomView; + + public TabView(Context context, AttributeSet attrs) { + //TODO super(context, null, R.attr.actionBarTabStyle); + super(context, attrs); + } + + public void init(ScrollingTabContainerView parent, ActionBar.Tab tab, boolean forList) { + mParent = parent; + mTab = tab; + + if (forList) { + setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); + } + + update(); + } + + public void bindTab(ActionBar.Tab tab) { + mTab = tab; + update(); + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + + // Re-measure if we went beyond our maximum size. + if (mParent.mMaxTabWidth > 0 && getMeasuredWidth() > mParent.mMaxTabWidth) { + super.onMeasure(MeasureSpec.makeMeasureSpec(mParent.mMaxTabWidth, MeasureSpec.EXACTLY), + heightMeasureSpec); + } + } + + public void update() { + final ActionBar.Tab tab = mTab; + final View custom = tab.getCustomView(); + if (custom != null) { + final ViewParent customParent = custom.getParent(); + if (customParent != this) { + if (customParent != null) ((ViewGroup) customParent).removeView(custom); + addView(custom); + } + mCustomView = custom; + if (mTextView != null) mTextView.setVisibility(GONE); + if (mIconView != null) { + mIconView.setVisibility(GONE); + mIconView.setImageDrawable(null); + } + } else { + if (mCustomView != null) { + removeView(mCustomView); + mCustomView = null; + } + + final Drawable icon = tab.getIcon(); + final CharSequence text = tab.getText(); + + if (icon != null) { + if (mIconView == null) { + ImageView iconView = new ImageView(getContext()); + LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT); + lp.gravity = Gravity.CENTER_VERTICAL; + iconView.setLayoutParams(lp); + addView(iconView, 0); + mIconView = iconView; + } + mIconView.setImageDrawable(icon); + mIconView.setVisibility(VISIBLE); + } else if (mIconView != null) { + mIconView.setVisibility(GONE); + mIconView.setImageDrawable(null); + } + + if (text != null) { + if (mTextView == null) { + CapitalizingTextView textView = new CapitalizingTextView(getContext(), null, + R.attr.actionBarTabTextStyle); + textView.setEllipsize(TruncateAt.END); + LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, + LayoutParams.WRAP_CONTENT); + lp.gravity = Gravity.CENTER_VERTICAL; + textView.setLayoutParams(lp); + addView(textView); + mTextView = textView; + } + mTextView.setTextCompat(text); + mTextView.setVisibility(VISIBLE); + } else if (mTextView != null) { + mTextView.setVisibility(GONE); + mTextView.setText(null); + } + + if (mIconView != null) { + mIconView.setContentDescription(tab.getContentDescription()); + } + } + } + + public ActionBar.Tab getTab() { + return mTab; + } + } + + private class TabAdapter extends BaseAdapter { + @Override + public int getCount() { + return mTabLayout.getChildCount(); + } + + @Override + public Object getItem(int position) { + return ((TabView) mTabLayout.getChildAt(position)).getTab(); + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = createTabView((ActionBar.Tab) getItem(position), true); + } else { + ((TabView) convertView).bindTab((ActionBar.Tab) getItem(position)); + } + return convertView; + } + } + + private class TabClickListener implements OnClickListener { + public void onClick(View view) { + TabView tabView = (TabView) view; + tabView.getTab().select(); + final int tabCount = mTabLayout.getChildCount(); + for (int i = 0; i < tabCount; i++) { + final View child = mTabLayout.getChildAt(i); + child.setSelected(child == view); + } + } + } + + protected class VisibilityAnimListener implements Animator.AnimatorListener { + private boolean mCanceled = false; + private int mFinalVisibility; + + public VisibilityAnimListener withFinalVisibility(int visibility) { + mFinalVisibility = visibility; + return this; + } + + @Override + public void onAnimationStart(Animator animation) { + setVisibility(VISIBLE); + mVisibilityAnim = animation; + mCanceled = false; + } + + @Override + public void onAnimationEnd(Animator animation) { + if (mCanceled) return; + + mVisibilityAnim = null; + setVisibility(mFinalVisibility); + } + + @Override + public void onAnimationCancel(Animator animation) { + mCanceled = true; + } + + @Override + public void onAnimationRepeat(Animator animation) { + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionMode.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionMode.java new file mode 100644 index 0000000000..81b4cd4d20 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionMode.java @@ -0,0 +1,224 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.view; + +import android.view.View; + + +/** + * Represents a contextual mode of the user interface. Action modes can be used for + * modal interactions with content and replace parts of the normal UI until finished. + * Examples of good action modes include selection modes, search, content editing, etc. + */ +public abstract class ActionMode { + private Object mTag; + + /** + * Set a tag object associated with this ActionMode. + * + *

Like the tag available to views, this allows applications to associate arbitrary + * data with an ActionMode for later reference. + * + * @param tag Tag to associate with this ActionMode + * + * @see #getTag() + */ + public void setTag(Object tag) { + mTag = tag; + } + + /** + * Retrieve the tag object associated with this ActionMode. + * + *

Like the tag available to views, this allows applications to associate arbitrary + * data with an ActionMode for later reference. + * + * @return Tag associated with this ActionMode + * + * @see #setTag(Object) + */ + public Object getTag() { + return mTag; + } + + /** + * Set the title of the action mode. This method will have no visible effect if + * a custom view has been set. + * + * @param title Title string to set + * + * @see #setTitle(int) + * @see #setCustomView(View) + */ + public abstract void setTitle(CharSequence title); + + /** + * Set the title of the action mode. This method will have no visible effect if + * a custom view has been set. + * + * @param resId Resource ID of a string to set as the title + * + * @see #setTitle(CharSequence) + * @see #setCustomView(View) + */ + public abstract void setTitle(int resId); + + /** + * Set the subtitle of the action mode. This method will have no visible effect if + * a custom view has been set. + * + * @param subtitle Subtitle string to set + * + * @see #setSubtitle(int) + * @see #setCustomView(View) + */ + public abstract void setSubtitle(CharSequence subtitle); + + /** + * Set the subtitle of the action mode. This method will have no visible effect if + * a custom view has been set. + * + * @param resId Resource ID of a string to set as the subtitle + * + * @see #setSubtitle(CharSequence) + * @see #setCustomView(View) + */ + public abstract void setSubtitle(int resId); + + /** + * Set a custom view for this action mode. The custom view will take the place of + * the title and subtitle. Useful for things like search boxes. + * + * @param view Custom view to use in place of the title/subtitle. + * + * @see #setTitle(CharSequence) + * @see #setSubtitle(CharSequence) + */ + public abstract void setCustomView(View view); + + /** + * Invalidate the action mode and refresh menu content. The mode's + * {@link ActionMode.Callback} will have its + * {@link Callback#onPrepareActionMode(ActionMode, Menu)} method called. + * If it returns true the menu will be scanned for updated content and any relevant changes + * will be reflected to the user. + */ + public abstract void invalidate(); + + /** + * Finish and close this action mode. The action mode's {@link ActionMode.Callback} will + * have its {@link Callback#onDestroyActionMode(ActionMode)} method called. + */ + public abstract void finish(); + + /** + * Returns the menu of actions that this action mode presents. + * @return The action mode's menu. + */ + public abstract Menu getMenu(); + + /** + * Returns the current title of this action mode. + * @return Title text + */ + public abstract CharSequence getTitle(); + + /** + * Returns the current subtitle of this action mode. + * @return Subtitle text + */ + public abstract CharSequence getSubtitle(); + + /** + * Returns the current custom view for this action mode. + * @return The current custom view + */ + public abstract View getCustomView(); + + /** + * Returns a {@link MenuInflater} with the ActionMode's context. + */ + public abstract MenuInflater getMenuInflater(); + + /** + * Returns whether the UI presenting this action mode can take focus or not. + * This is used by internal components within the framework that would otherwise + * present an action mode UI that requires focus, such as an EditText as a custom view. + * + * @return true if the UI used to show this action mode can take focus + * @hide Internal use only + */ + public boolean isUiFocusable() { + return true; + } + + /** + * Callback interface for action modes. Supplied to + * {@link View#startActionMode(Callback)}, a Callback + * configures and handles events raised by a user's interaction with an action mode. + * + *

An action mode's lifecycle is as follows: + *

    + *
  • {@link Callback#onCreateActionMode(ActionMode, Menu)} once on initial + * creation
  • + *
  • {@link Callback#onPrepareActionMode(ActionMode, Menu)} after creation + * and any time the {@link ActionMode} is invalidated
  • + *
  • {@link Callback#onActionItemClicked(ActionMode, MenuItem)} any time a + * contextual action button is clicked
  • + *
  • {@link Callback#onDestroyActionMode(ActionMode)} when the action mode + * is closed
  • + *
+ */ + public interface Callback { + /** + * Called when action mode is first created. The menu supplied will be used to + * generate action buttons for the action mode. + * + * @param mode ActionMode being created + * @param menu Menu used to populate action buttons + * @return true if the action mode should be created, false if entering this + * mode should be aborted. + */ + public boolean onCreateActionMode(ActionMode mode, Menu menu); + + /** + * Called to refresh an action mode's action menu whenever it is invalidated. + * + * @param mode ActionMode being prepared + * @param menu Menu used to populate action buttons + * @return true if the menu or action mode was updated, false otherwise. + */ + public boolean onPrepareActionMode(ActionMode mode, Menu menu); + + /** + * Called to report a user click on an action button. + * + * @param mode The current ActionMode + * @param item The item that was clicked + * @return true if this callback handled the event, false if the standard MenuItem + * invocation should continue. + */ + public boolean onActionItemClicked(ActionMode mode, MenuItem item); + + /** + * Called when an action mode is about to be exited and destroyed. + * + * @param mode The current ActionMode being destroyed + */ + public void onDestroyActionMode(ActionMode mode); + } +} \ No newline at end of file diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionProvider.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionProvider.java new file mode 100644 index 0000000000..ae7cb1fe03 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/ActionProvider.java @@ -0,0 +1,170 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.view; + +import android.content.Context; +import android.view.View; + +/** + * This class is a mediator for accomplishing a given task, for example sharing a file. + * It is responsible for creating a view that performs an action that accomplishes the task. + * This class also implements other functions such a performing a default action. + *

+ * An ActionProvider can be optionally specified for a {@link MenuItem} and in such a + * case it will be responsible for creating the action view that appears in the + * {@link android.app.ActionBar} as a substitute for the menu item when the item is + * displayed as an action item. Also the provider is responsible for performing a + * default action if a menu item placed on the overflow menu of the ActionBar is + * selected and none of the menu item callbacks has handled the selection. For this + * case the provider can also optionally provide a sub-menu for accomplishing the + * task at hand. + *

+ *

+ * There are two ways for using an action provider for creating and handling of action views: + *

    + *
  • + * Setting the action provider on a {@link MenuItem} directly by calling + * {@link MenuItem#setActionProvider(ActionProvider)}. + *
  • + *
  • + * Declaring the action provider in the menu XML resource. For example: + *
    + * 
    + *   <item android:id="@+id/my_menu_item"
    + *     android:title="Title"
    + *     android:icon="@drawable/my_menu_item_icon"
    + *     android:showAsAction="ifRoom"
    + *     android:actionProviderClass="foo.bar.SomeActionProvider" />
    + * 
    + * 
    + *
  • + *
+ *

+ * + * @see MenuItem#setActionProvider(ActionProvider) + * @see MenuItem#getActionProvider() + */ +public abstract class ActionProvider { + private SubUiVisibilityListener mSubUiVisibilityListener; + + /** + * Creates a new instance. + * + * @param context Context for accessing resources. + */ + public ActionProvider(Context context) { + } + + /** + * Factory method for creating new action views. + * + * @return A new action view. + */ + public abstract View onCreateActionView(); + + /** + * Performs an optional default action. + *

+ * For the case of an action provider placed in a menu item not shown as an action this + * method is invoked if previous callbacks for processing menu selection has handled + * the event. + *

+ *

+ * A menu item selection is processed in the following order: + *

    + *
  • + * Receiving a call to {@link MenuItem.OnMenuItemClickListener#onMenuItemClick + * MenuItem.OnMenuItemClickListener.onMenuItemClick}. + *
  • + *
  • + * Receiving a call to {@link android.app.Activity#onOptionsItemSelected(MenuItem) + * Activity.onOptionsItemSelected(MenuItem)} + *
  • + *
  • + * Receiving a call to {@link android.app.Fragment#onOptionsItemSelected(MenuItem) + * Fragment.onOptionsItemSelected(MenuItem)} + *
  • + *
  • + * Launching the {@link android.content.Intent} set via + * {@link MenuItem#setIntent(android.content.Intent) MenuItem.setIntent(android.content.Intent)} + *
  • + *
  • + * Invoking this method. + *
  • + *
+ *

+ *

+ * The default implementation does not perform any action and returns false. + *

+ */ + public boolean onPerformDefaultAction() { + return false; + } + + /** + * Determines if this ActionProvider has a submenu associated with it. + * + *

Associated submenus will be shown when an action view is not. This + * provider instance will receive a call to {@link #onPrepareSubMenu(SubMenu)} + * after the call to {@link #onPerformDefaultAction()} and before a submenu is + * displayed to the user. + * + * @return true if the item backed by this provider should have an associated submenu + */ + public boolean hasSubMenu() { + return false; + } + + /** + * Called to prepare an associated submenu for the menu item backed by this ActionProvider. + * + *

if {@link #hasSubMenu()} returns true, this method will be called when the + * menu item is selected to prepare the submenu for presentation to the user. Apps + * may use this to create or alter submenu content right before display. + * + * @param subMenu Submenu that will be displayed + */ + public void onPrepareSubMenu(SubMenu subMenu) { + } + + /** + * Notify the system that the visibility of an action view's sub-UI such as + * an anchored popup has changed. This will affect how other system + * visibility notifications occur. + * + * @hide Pending future API approval + */ + public void subUiVisibilityChanged(boolean isVisible) { + if (mSubUiVisibilityListener != null) { + mSubUiVisibilityListener.onSubUiVisibilityChanged(isVisible); + } + } + + /** + * @hide Internal use only + */ + public void setSubUiVisibilityListener(SubUiVisibilityListener listener) { + mSubUiVisibilityListener = listener; + } + + /** + * @hide Internal use only + */ + public interface SubUiVisibilityListener { + public void onSubUiVisibilityChanged(boolean isVisible); + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/CollapsibleActionView.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/CollapsibleActionView.java new file mode 100644 index 0000000000..43281b013c --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/CollapsibleActionView.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.view; + +/** + * When a {@link View} implements this interface it will receive callbacks + * when expanded or collapsed as an action view alongside the optional, + * app-specified callbacks to {@link OnActionExpandListener}. + * + *

See {@link MenuItem} for more information about action views. + * See {@link android.app.ActionBar} for more information about the action bar. + */ +public interface CollapsibleActionView { + /** + * Called when this view is expanded as an action view. + * See {@link MenuItem#expandActionView()}. + */ + public void onActionViewExpanded(); + + /** + * Called when this view is collapsed as an action view. + * See {@link MenuItem#collapseActionView()}. + */ + public void onActionViewCollapsed(); +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Menu.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Menu.java new file mode 100644 index 0000000000..951f4ccef8 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Menu.java @@ -0,0 +1,447 @@ +/* + * Copyright (C) 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. + */ + +package com.actionbarsherlock.view; + +import android.content.ComponentName; +import android.content.Intent; +import android.view.KeyEvent; + +/** + * Interface for managing the items in a menu. + *

+ * By default, every Activity supports an options menu of actions or options. + * You can add items to this menu and handle clicks on your additions. The + * easiest way of adding menu items is inflating an XML file into the + * {@link Menu} via {@link MenuInflater}. The easiest way of attaching code to + * clicks is via {@link Activity#onOptionsItemSelected(MenuItem)} and + * {@link Activity#onContextItemSelected(MenuItem)}. + *

+ * Different menu types support different features: + *

    + *
  1. Context menus: Do not support item shortcuts and item icons. + *
  2. Options menus: The icon menus do not support item check + * marks and only show the item's + * {@link MenuItem#setTitleCondensed(CharSequence) condensed title}. The + * expanded menus (only available if six or more menu items are visible, + * reached via the 'More' item in the icon menu) do not show item icons, and + * item check marks are discouraged. + *
  3. Sub menus: Do not support item icons, or nested sub menus. + *
+ * + *
+ *

Developer Guides

+ *

For more information about creating menus, read the + * Menus developer guide.

+ *
+ */ +public interface Menu { + + /** + * This is the part of an order integer that the user can provide. + * @hide + */ + static final int USER_MASK = 0x0000ffff; + /** + * Bit shift of the user portion of the order integer. + * @hide + */ + static final int USER_SHIFT = 0; + + /** + * This is the part of an order integer that supplies the category of the + * item. + * @hide + */ + static final int CATEGORY_MASK = 0xffff0000; + /** + * Bit shift of the category portion of the order integer. + * @hide + */ + static final int CATEGORY_SHIFT = 16; + + /** + * Value to use for group and item identifier integers when you don't care + * about them. + */ + static final int NONE = 0; + + /** + * First value for group and item identifier integers. + */ + static final int FIRST = 1; + + // Implementation note: Keep these CATEGORY_* in sync with the category enum + // in attrs.xml + + /** + * Category code for the order integer for items/groups that are part of a + * container -- or/add this with your base value. + */ + static final int CATEGORY_CONTAINER = 0x00010000; + + /** + * Category code for the order integer for items/groups that are provided by + * the system -- or/add this with your base value. + */ + static final int CATEGORY_SYSTEM = 0x00020000; + + /** + * Category code for the order integer for items/groups that are + * user-supplied secondary (infrequently used) options -- or/add this with + * your base value. + */ + static final int CATEGORY_SECONDARY = 0x00030000; + + /** + * Category code for the order integer for items/groups that are + * alternative actions on the data that is currently displayed -- or/add + * this with your base value. + */ + static final int CATEGORY_ALTERNATIVE = 0x00040000; + + /** + * Flag for {@link #addIntentOptions}: if set, do not automatically remove + * any existing menu items in the same group. + */ + static final int FLAG_APPEND_TO_GROUP = 0x0001; + + /** + * Flag for {@link #performShortcut}: if set, do not close the menu after + * executing the shortcut. + */ + static final int FLAG_PERFORM_NO_CLOSE = 0x0001; + + /** + * Flag for {@link #performShortcut(int, KeyEvent, int)}: if set, always + * close the menu after executing the shortcut. Closing the menu also resets + * the prepared state. + */ + static final int FLAG_ALWAYS_PERFORM_CLOSE = 0x0002; + + /** + * Add a new item to the menu. This item displays the given title for its + * label. + * + * @param title The text to display for the item. + * @return The newly added menu item. + */ + public MenuItem add(CharSequence title); + + /** + * Add a new item to the menu. This item displays the given title for its + * label. + * + * @param titleRes Resource identifier of title string. + * @return The newly added menu item. + */ + public MenuItem add(int titleRes); + + /** + * Add a new item to the menu. This item displays the given title for its + * label. + * + * @param groupId The group identifier that this item should be part of. + * This can be used to define groups of items for batch state + * changes. Normally use {@link #NONE} if an item should not be in a + * group. + * @param itemId Unique item ID. Use {@link #NONE} if you do not need a + * unique ID. + * @param order The order for the item. Use {@link #NONE} if you do not care + * about the order. See {@link MenuItem#getOrder()}. + * @param title The text to display for the item. + * @return The newly added menu item. + */ + public MenuItem add(int groupId, int itemId, int order, CharSequence title); + + /** + * Variation on {@link #add(int, int, int, CharSequence)} that takes a + * string resource identifier instead of the string itself. + * + * @param groupId The group identifier that this item should be part of. + * This can also be used to define groups of items for batch state + * changes. Normally use {@link #NONE} if an item should not be in a + * group. + * @param itemId Unique item ID. Use {@link #NONE} if you do not need a + * unique ID. + * @param order The order for the item. Use {@link #NONE} if you do not care + * about the order. See {@link MenuItem#getOrder()}. + * @param titleRes Resource identifier of title string. + * @return The newly added menu item. + */ + public MenuItem add(int groupId, int itemId, int order, int titleRes); + + /** + * Add a new sub-menu to the menu. This item displays the given title for + * its label. To modify other attributes on the submenu's menu item, use + * {@link SubMenu#getItem()}. + * + * @param title The text to display for the item. + * @return The newly added sub-menu + */ + SubMenu addSubMenu(final CharSequence title); + + /** + * Add a new sub-menu to the menu. This item displays the given title for + * its label. To modify other attributes on the submenu's menu item, use + * {@link SubMenu#getItem()}. + * + * @param titleRes Resource identifier of title string. + * @return The newly added sub-menu + */ + SubMenu addSubMenu(final int titleRes); + + /** + * Add a new sub-menu to the menu. This item displays the given + * title for its label. To modify other attributes on the + * submenu's menu item, use {@link SubMenu#getItem()}. + *

+ * Note that you can only have one level of sub-menus, i.e. you cannnot add + * a subMenu to a subMenu: An {@link UnsupportedOperationException} will be + * thrown if you try. + * + * @param groupId The group identifier that this item should be part of. + * This can also be used to define groups of items for batch state + * changes. Normally use {@link #NONE} if an item should not be in a + * group. + * @param itemId Unique item ID. Use {@link #NONE} if you do not need a + * unique ID. + * @param order The order for the item. Use {@link #NONE} if you do not care + * about the order. See {@link MenuItem#getOrder()}. + * @param title The text to display for the item. + * @return The newly added sub-menu + */ + SubMenu addSubMenu(final int groupId, final int itemId, int order, final CharSequence title); + + /** + * Variation on {@link #addSubMenu(int, int, int, CharSequence)} that takes + * a string resource identifier for the title instead of the string itself. + * + * @param groupId The group identifier that this item should be part of. + * This can also be used to define groups of items for batch state + * changes. Normally use {@link #NONE} if an item should not be in a group. + * @param itemId Unique item ID. Use {@link #NONE} if you do not need a unique ID. + * @param order The order for the item. Use {@link #NONE} if you do not care about the + * order. See {@link MenuItem#getOrder()}. + * @param titleRes Resource identifier of title string. + * @return The newly added sub-menu + */ + SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes); + + /** + * Add a group of menu items corresponding to actions that can be performed + * for a particular Intent. The Intent is most often configured with a null + * action, the data that the current activity is working with, and includes + * either the {@link Intent#CATEGORY_ALTERNATIVE} or + * {@link Intent#CATEGORY_SELECTED_ALTERNATIVE} to find activities that have + * said they would like to be included as optional action. You can, however, + * use any Intent you want. + * + *

+ * See {@link android.content.pm.PackageManager#queryIntentActivityOptions} + * for more * details on the caller, specifics, and + * intent arguments. The list returned by that function is used + * to populate the resulting menu items. + * + *

+ * All of the menu items of possible options for the intent will be added + * with the given group and id. You can use the group to control ordering of + * the items in relation to other items in the menu. Normally this function + * will automatically remove any existing items in the menu in the same + * group and place a divider above and below the added items; this behavior + * can be modified with the flags parameter. For each of the + * generated items {@link MenuItem#setIntent} is called to associate the + * appropriate Intent with the item; this means the activity will + * automatically be started for you without having to do anything else. + * + * @param groupId The group identifier that the items should be part of. + * This can also be used to define groups of items for batch state + * changes. Normally use {@link #NONE} if the items should not be in + * a group. + * @param itemId Unique item ID. Use {@link #NONE} if you do not need a + * unique ID. + * @param order The order for the items. Use {@link #NONE} if you do not + * care about the order. See {@link MenuItem#getOrder()}. + * @param caller The current activity component name as defined by + * queryIntentActivityOptions(). + * @param specifics Specific items to place first as defined by + * queryIntentActivityOptions(). + * @param intent Intent describing the kinds of items to populate in the + * list as defined by queryIntentActivityOptions(). + * @param flags Additional options controlling how the items are added. + * @param outSpecificItems Optional array in which to place the menu items + * that were generated for each of the specifics that were + * requested. Entries may be null if no activity was found for that + * specific action. + * @return The number of menu items that were added. + * + * @see #FLAG_APPEND_TO_GROUP + * @see MenuItem#setIntent + * @see android.content.pm.PackageManager#queryIntentActivityOptions + */ + public int addIntentOptions(int groupId, int itemId, int order, + ComponentName caller, Intent[] specifics, + Intent intent, int flags, MenuItem[] outSpecificItems); + + /** + * Remove the item with the given identifier. + * + * @param id The item to be removed. If there is no item with this + * identifier, nothing happens. + */ + public void removeItem(int id); + + /** + * Remove all items in the given group. + * + * @param groupId The group to be removed. If there are no items in this + * group, nothing happens. + */ + public void removeGroup(int groupId); + + /** + * Remove all existing items from the menu, leaving it empty as if it had + * just been created. + */ + public void clear(); + + /** + * Control whether a particular group of items can show a check mark. This + * is similar to calling {@link MenuItem#setCheckable} on all of the menu items + * with the given group identifier, but in addition you can control whether + * this group contains a mutually-exclusive set items. This should be called + * after the items of the group have been added to the menu. + * + * @param group The group of items to operate on. + * @param checkable Set to true to allow a check mark, false to + * disallow. The default is false. + * @param exclusive If set to true, only one item in this group can be + * checked at a time; checking an item will automatically + * uncheck all others in the group. If set to false, each + * item can be checked independently of the others. + * + * @see MenuItem#setCheckable + * @see MenuItem#setChecked + */ + public void setGroupCheckable(int group, boolean checkable, boolean exclusive); + + /** + * Show or hide all menu items that are in the given group. + * + * @param group The group of items to operate on. + * @param visible If true the items are visible, else they are hidden. + * + * @see MenuItem#setVisible + */ + public void setGroupVisible(int group, boolean visible); + + /** + * Enable or disable all menu items that are in the given group. + * + * @param group The group of items to operate on. + * @param enabled If true the items will be enabled, else they will be disabled. + * + * @see MenuItem#setEnabled + */ + public void setGroupEnabled(int group, boolean enabled); + + /** + * Return whether the menu currently has item items that are visible. + * + * @return True if there is one or more item visible, + * else false. + */ + public boolean hasVisibleItems(); + + /** + * Return the menu item with a particular identifier. + * + * @param id The identifier to find. + * + * @return The menu item object, or null if there is no item with + * this identifier. + */ + public MenuItem findItem(int id); + + /** + * Get the number of items in the menu. Note that this will change any + * times items are added or removed from the menu. + * + * @return The item count. + */ + public int size(); + + /** + * Gets the menu item at the given index. + * + * @param index The index of the menu item to return. + * @return The menu item. + * @exception IndexOutOfBoundsException + * when {@code index < 0 || >= size()} + */ + public MenuItem getItem(int index); + + /** + * Closes the menu, if open. + */ + public void close(); + + /** + * Execute the menu item action associated with the given shortcut + * character. + * + * @param keyCode The keycode of the shortcut key. + * @param event Key event message. + * @param flags Additional option flags or 0. + * + * @return If the given shortcut exists and is shown, returns + * true; else returns false. + * + * @see #FLAG_PERFORM_NO_CLOSE + */ + public boolean performShortcut(int keyCode, KeyEvent event, int flags); + + /** + * Is a keypress one of the defined shortcut keys for this window. + * @param keyCode the key code from {@link KeyEvent} to check. + * @param event the {@link KeyEvent} to use to help check. + */ + boolean isShortcutKey(int keyCode, KeyEvent event); + + /** + * Execute the menu item action associated with the given menu identifier. + * + * @param id Identifier associated with the menu item. + * @param flags Additional option flags or 0. + * + * @return If the given identifier exists and is shown, returns + * true; else returns false. + * + * @see #FLAG_PERFORM_NO_CLOSE + */ + public boolean performIdentifierAction(int id, int flags); + + + /** + * Control whether the menu should be running in qwerty mode (alphabetic + * shortcuts) or 12-key mode (numeric shortcuts). + * + * @param isQwerty If true the menu will use alphabetic shortcuts; else it + * will use numeric shortcuts. + */ + public void setQwertyMode(boolean isQwerty); +} + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuInflater.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuInflater.java new file mode 100644 index 0000000000..5a0f40859b --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuInflater.java @@ -0,0 +1,495 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * 2011 Jake Wharton + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.view; + +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import android.content.Context; +import android.content.res.TypedArray; +import android.content.res.XmlResourceParser; +import android.util.AttributeSet; +import android.util.Log; +import android.util.TypedValue; +import android.util.Xml; +import android.view.InflateException; +import android.view.View; + +import com.actionbarsherlock.R; +import com.actionbarsherlock.internal.view.menu.MenuItemImpl; + +/** + * This class is used to instantiate menu XML files into Menu objects. + *

+ * For performance reasons, menu inflation relies heavily on pre-processing of + * XML files that is done at build time. Therefore, it is not currently possible + * to use MenuInflater with an XmlPullParser over a plain XML file at runtime; + * it only works with an XmlPullParser returned from a compiled resource (R. + * something file.) + */ +public class MenuInflater { + private static final String LOG_TAG = "MenuInflater"; + + /** Menu tag name in XML. */ + private static final String XML_MENU = "menu"; + + /** Group tag name in XML. */ + private static final String XML_GROUP = "group"; + + /** Item tag name in XML. */ + private static final String XML_ITEM = "item"; + + private static final int NO_ID = 0; + + private static final Class[] ACTION_VIEW_CONSTRUCTOR_SIGNATURE = new Class[] {Context.class}; + + private static final Class[] ACTION_PROVIDER_CONSTRUCTOR_SIGNATURE = ACTION_VIEW_CONSTRUCTOR_SIGNATURE; + + private final Object[] mActionViewConstructorArguments; + + private final Object[] mActionProviderConstructorArguments; + + private Context mContext; + private Object mRealOwner; + + /** + * Constructs a menu inflater. + * + * @see Activity#getMenuInflater() + */ + public MenuInflater(Context context) { + mContext = context; + mRealOwner = context; + mActionViewConstructorArguments = new Object[] {context}; + mActionProviderConstructorArguments = mActionViewConstructorArguments; + } + + /** + * Constructs a menu inflater. + * + * @see Activity#getMenuInflater() + * @hide + */ + public MenuInflater(Context context, Object realOwner) { + mContext = context; + mRealOwner = realOwner; + mActionViewConstructorArguments = new Object[] {context}; + mActionProviderConstructorArguments = mActionViewConstructorArguments; + } + + /** + * Inflate a menu hierarchy from the specified XML resource. Throws + * {@link InflateException} if there is an error. + * + * @param menuRes Resource ID for an XML layout resource to load (e.g., + * R.menu.main_activity) + * @param menu The Menu to inflate into. The items and submenus will be + * added to this Menu. + */ + public void inflate(int menuRes, Menu menu) { + XmlResourceParser parser = null; + try { + parser = mContext.getResources().getLayout(menuRes); + AttributeSet attrs = Xml.asAttributeSet(parser); + + parseMenu(parser, attrs, menu); + } catch (XmlPullParserException e) { + throw new InflateException("Error inflating menu XML", e); + } catch (IOException e) { + throw new InflateException("Error inflating menu XML", e); + } finally { + if (parser != null) parser.close(); + } + } + + /** + * Called internally to fill the given menu. If a sub menu is seen, it will + * call this recursively. + */ + private void parseMenu(XmlPullParser parser, AttributeSet attrs, Menu menu) + throws XmlPullParserException, IOException { + MenuState menuState = new MenuState(menu); + + int eventType = parser.getEventType(); + String tagName; + boolean lookingForEndOfUnknownTag = false; + String unknownTagName = null; + + // This loop will skip to the menu start tag + do { + if (eventType == XmlPullParser.START_TAG) { + tagName = parser.getName(); + if (tagName.equals(XML_MENU)) { + // Go to next tag + eventType = parser.next(); + break; + } + + throw new RuntimeException("Expecting menu, got " + tagName); + } + eventType = parser.next(); + } while (eventType != XmlPullParser.END_DOCUMENT); + + boolean reachedEndOfMenu = false; + while (!reachedEndOfMenu) { + switch (eventType) { + case XmlPullParser.START_TAG: + if (lookingForEndOfUnknownTag) { + break; + } + + tagName = parser.getName(); + if (tagName.equals(XML_GROUP)) { + menuState.readGroup(attrs); + } else if (tagName.equals(XML_ITEM)) { + menuState.readItem(attrs); + } else if (tagName.equals(XML_MENU)) { + // A menu start tag denotes a submenu for an item + SubMenu subMenu = menuState.addSubMenuItem(); + + // Parse the submenu into returned SubMenu + parseMenu(parser, attrs, subMenu); + } else { + lookingForEndOfUnknownTag = true; + unknownTagName = tagName; + } + break; + + case XmlPullParser.END_TAG: + tagName = parser.getName(); + if (lookingForEndOfUnknownTag && tagName.equals(unknownTagName)) { + lookingForEndOfUnknownTag = false; + unknownTagName = null; + } else if (tagName.equals(XML_GROUP)) { + menuState.resetGroup(); + } else if (tagName.equals(XML_ITEM)) { + // Add the item if it hasn't been added (if the item was + // a submenu, it would have been added already) + if (!menuState.hasAddedItem()) { + if (menuState.itemActionProvider != null && + menuState.itemActionProvider.hasSubMenu()) { + menuState.addSubMenuItem(); + } else { + menuState.addItem(); + } + } + } else if (tagName.equals(XML_MENU)) { + reachedEndOfMenu = true; + } + break; + + case XmlPullParser.END_DOCUMENT: + throw new RuntimeException("Unexpected end of document"); + } + + eventType = parser.next(); + } + } + + private static class InflatedOnMenuItemClickListener + implements MenuItem.OnMenuItemClickListener { + private static final Class[] PARAM_TYPES = new Class[] { MenuItem.class }; + + private Object mRealOwner; + private Method mMethod; + + public InflatedOnMenuItemClickListener(Object realOwner, String methodName) { + mRealOwner = realOwner; + Class c = realOwner.getClass(); + try { + mMethod = c.getMethod(methodName, PARAM_TYPES); + } catch (Exception e) { + InflateException ex = new InflateException( + "Couldn't resolve menu item onClick handler " + methodName + + " in class " + c.getName()); + ex.initCause(e); + throw ex; + } + } + + public boolean onMenuItemClick(MenuItem item) { + try { + if (mMethod.getReturnType() == Boolean.TYPE) { + return (Boolean) mMethod.invoke(mRealOwner, item); + } else { + mMethod.invoke(mRealOwner, item); + return true; + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + /** + * State for the current menu. + *

+ * Groups can not be nested unless there is another menu (which will have + * its state class). + */ + private class MenuState { + private Menu menu; + + /* + * Group state is set on items as they are added, allowing an item to + * override its group state. (As opposed to set on items at the group end tag.) + */ + private int groupId; + private int groupCategory; + private int groupOrder; + private int groupCheckable; + private boolean groupVisible; + private boolean groupEnabled; + + private boolean itemAdded; + private int itemId; + private int itemCategoryOrder; + private CharSequence itemTitle; + private CharSequence itemTitleCondensed; + private int itemIconResId; + private char itemAlphabeticShortcut; + private char itemNumericShortcut; + /** + * Sync to attrs.xml enum: + * - 0: none + * - 1: all + * - 2: exclusive + */ + private int itemCheckable; + private boolean itemChecked; + private boolean itemVisible; + private boolean itemEnabled; + + /** + * Sync to attrs.xml enum, values in MenuItem: + * - 0: never + * - 1: ifRoom + * - 2: always + * - -1: Safe sentinel for "no value". + */ + private int itemShowAsAction; + + private int itemActionViewLayout; + private String itemActionViewClassName; + private String itemActionProviderClassName; + + private String itemListenerMethodName; + + private ActionProvider itemActionProvider; + + private static final int defaultGroupId = NO_ID; + private static final int defaultItemId = NO_ID; + private static final int defaultItemCategory = 0; + private static final int defaultItemOrder = 0; + private static final int defaultItemCheckable = 0; + private static final boolean defaultItemChecked = false; + private static final boolean defaultItemVisible = true; + private static final boolean defaultItemEnabled = true; + + public MenuState(final Menu menu) { + this.menu = menu; + + resetGroup(); + } + + public void resetGroup() { + groupId = defaultGroupId; + groupCategory = defaultItemCategory; + groupOrder = defaultItemOrder; + groupCheckable = defaultItemCheckable; + groupVisible = defaultItemVisible; + groupEnabled = defaultItemEnabled; + } + + /** + * Called when the parser is pointing to a group tag. + */ + public void readGroup(AttributeSet attrs) { + TypedArray a = mContext.obtainStyledAttributes(attrs, + R.styleable.SherlockMenuGroup); + + groupId = a.getResourceId(R.styleable.SherlockMenuGroup_android_id, defaultGroupId); + groupCategory = a.getInt(R.styleable.SherlockMenuGroup_android_menuCategory, defaultItemCategory); + groupOrder = a.getInt(R.styleable.SherlockMenuGroup_android_orderInCategory, defaultItemOrder); + groupCheckable = a.getInt(R.styleable.SherlockMenuGroup_android_checkableBehavior, defaultItemCheckable); + groupVisible = a.getBoolean(R.styleable.SherlockMenuGroup_android_visible, defaultItemVisible); + groupEnabled = a.getBoolean(R.styleable.SherlockMenuGroup_android_enabled, defaultItemEnabled); + + a.recycle(); + } + + /** + * Called when the parser is pointing to an item tag. + */ + public void readItem(AttributeSet attrs) { + TypedArray a = mContext.obtainStyledAttributes(attrs, + R.styleable.SherlockMenuItem); + + // Inherit attributes from the group as default value + itemId = a.getResourceId(R.styleable.SherlockMenuItem_android_id, defaultItemId); + final int category = a.getInt(R.styleable.SherlockMenuItem_android_menuCategory, groupCategory); + final int order = a.getInt(R.styleable.SherlockMenuItem_android_orderInCategory, groupOrder); + itemCategoryOrder = (category & Menu.CATEGORY_MASK) | (order & Menu.USER_MASK); + itemTitle = a.getText(R.styleable.SherlockMenuItem_android_title); + itemTitleCondensed = a.getText(R.styleable.SherlockMenuItem_android_titleCondensed); + itemIconResId = a.getResourceId(R.styleable.SherlockMenuItem_android_icon, 0); + itemAlphabeticShortcut = + getShortcut(a.getString(R.styleable.SherlockMenuItem_android_alphabeticShortcut)); + itemNumericShortcut = + getShortcut(a.getString(R.styleable.SherlockMenuItem_android_numericShortcut)); + if (a.hasValue(R.styleable.SherlockMenuItem_android_checkable)) { + // Item has attribute checkable, use it + itemCheckable = a.getBoolean(R.styleable.SherlockMenuItem_android_checkable, false) ? 1 : 0; + } else { + // Item does not have attribute, use the group's (group can have one more state + // for checkable that represents the exclusive checkable) + itemCheckable = groupCheckable; + } + + itemChecked = a.getBoolean(R.styleable.SherlockMenuItem_android_checked, defaultItemChecked); + itemVisible = a.getBoolean(R.styleable.SherlockMenuItem_android_visible, groupVisible); + itemEnabled = a.getBoolean(R.styleable.SherlockMenuItem_android_enabled, groupEnabled); + + TypedValue value = new TypedValue(); + a.getValue(R.styleable.SherlockMenuItem_android_showAsAction, value); + itemShowAsAction = value.type == TypedValue.TYPE_INT_HEX ? value.data : -1; + + itemListenerMethodName = a.getString(R.styleable.SherlockMenuItem_android_onClick); + itemActionViewLayout = a.getResourceId(R.styleable.SherlockMenuItem_android_actionLayout, 0); + + // itemActionViewClassName = a.getString(R.styleable.SherlockMenuItem_android_actionViewClass); + value = new TypedValue(); + a.getValue(R.styleable.SherlockMenuItem_android_actionViewClass, value); + itemActionViewClassName = value.type == TypedValue.TYPE_STRING ? value.string.toString() : null; + + // itemActionProviderClassName = a.getString(R.styleable.SherlockMenuItem_android_actionProviderClass); + value = new TypedValue(); + a.getValue(R.styleable.SherlockMenuItem_android_actionProviderClass, value); + itemActionProviderClassName = value.type == TypedValue.TYPE_STRING ? value.string.toString() : null; + + final boolean hasActionProvider = itemActionProviderClassName != null; + if (hasActionProvider && itemActionViewLayout == 0 && itemActionViewClassName == null) { + itemActionProvider = newInstance(itemActionProviderClassName, + ACTION_PROVIDER_CONSTRUCTOR_SIGNATURE, + mActionProviderConstructorArguments); + } else { + if (hasActionProvider) { + Log.w(LOG_TAG, "Ignoring attribute 'actionProviderClass'." + + " Action view already specified."); + } + itemActionProvider = null; + } + + a.recycle(); + + itemAdded = false; + } + + private char getShortcut(String shortcutString) { + if (shortcutString == null) { + return 0; + } else { + return shortcutString.charAt(0); + } + } + + private void setItem(MenuItem item) { + item.setChecked(itemChecked) + .setVisible(itemVisible) + .setEnabled(itemEnabled) + .setCheckable(itemCheckable >= 1) + .setTitleCondensed(itemTitleCondensed) + .setIcon(itemIconResId) + .setAlphabeticShortcut(itemAlphabeticShortcut) + .setNumericShortcut(itemNumericShortcut); + + if (itemShowAsAction >= 0) { + item.setShowAsAction(itemShowAsAction); + } + + if (itemListenerMethodName != null) { + if (mContext.isRestricted()) { + throw new IllegalStateException("The android:onClick attribute cannot " + + "be used within a restricted context"); + } + item.setOnMenuItemClickListener( + new InflatedOnMenuItemClickListener(mRealOwner, itemListenerMethodName)); + } + + if (itemCheckable >= 2) { + if (item instanceof MenuItemImpl) { + MenuItemImpl impl = (MenuItemImpl) item; + impl.setExclusiveCheckable(true); + } else { + menu.setGroupCheckable(groupId, true, true); + } + } + + boolean actionViewSpecified = false; + if (itemActionViewClassName != null) { + View actionView = (View) newInstance(itemActionViewClassName, + ACTION_VIEW_CONSTRUCTOR_SIGNATURE, mActionViewConstructorArguments); + item.setActionView(actionView); + actionViewSpecified = true; + } + if (itemActionViewLayout > 0) { + if (!actionViewSpecified) { + item.setActionView(itemActionViewLayout); + actionViewSpecified = true; + } else { + Log.w(LOG_TAG, "Ignoring attribute 'itemActionViewLayout'." + + " Action view already specified."); + } + } + if (itemActionProvider != null) { + item.setActionProvider(itemActionProvider); + } + } + + public void addItem() { + itemAdded = true; + setItem(menu.add(groupId, itemId, itemCategoryOrder, itemTitle)); + } + + public SubMenu addSubMenuItem() { + itemAdded = true; + SubMenu subMenu = menu.addSubMenu(groupId, itemId, itemCategoryOrder, itemTitle); + setItem(subMenu.getItem()); + return subMenu; + } + + public boolean hasAddedItem() { + return itemAdded; + } + + @SuppressWarnings("unchecked") + private T newInstance(String className, Class[] constructorSignature, + Object[] arguments) { + try { + Class clazz = mContext.getClassLoader().loadClass(className); + Constructor constructor = clazz.getConstructor(constructorSignature); + return (T) constructor.newInstance(arguments); + } catch (Exception e) { + Log.w(LOG_TAG, "Cannot instantiate class: " + className, e); + } + return null; + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuItem.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuItem.java new file mode 100644 index 0000000000..7fc3aa4306 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/MenuItem.java @@ -0,0 +1,598 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.view; + +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.view.ContextMenu.ContextMenuInfo; +import android.view.View; + +/** + * Interface for direct access to a previously created menu item. + *

+ * An Item is returned by calling one of the {@link android.view.Menu#add} + * methods. + *

+ * For a feature set of specific menu types, see {@link Menu}. + * + *

+ *

Developer Guides

+ *

For information about creating menus, read the + * Menus developer guide.

+ *
+ */ +public interface MenuItem { + /* + * These should be kept in sync with attrs.xml enum constants for showAsAction + */ + /** Never show this item as a button in an Action Bar. */ + public static final int SHOW_AS_ACTION_NEVER = android.view.MenuItem.SHOW_AS_ACTION_NEVER; + /** Show this item as a button in an Action Bar if the system decides there is room for it. */ + public static final int SHOW_AS_ACTION_IF_ROOM = android.view.MenuItem.SHOW_AS_ACTION_IF_ROOM; + /** + * Always show this item as a button in an Action Bar. + * Use sparingly! If too many items are set to always show in the Action Bar it can + * crowd the Action Bar and degrade the user experience on devices with smaller screens. + * A good rule of thumb is to have no more than 2 items set to always show at a time. + */ + public static final int SHOW_AS_ACTION_ALWAYS = android.view.MenuItem.SHOW_AS_ACTION_ALWAYS; + + /** + * When this item is in the action bar, always show it with a text label even if + * it also has an icon specified. + */ + public static final int SHOW_AS_ACTION_WITH_TEXT = android.view.MenuItem.SHOW_AS_ACTION_WITH_TEXT; + + /** + * This item's action view collapses to a normal menu item. + * When expanded, the action view temporarily takes over + * a larger segment of its container. + */ + public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = android.view.MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW; + + /** + * Interface definition for a callback to be invoked when a menu item is + * clicked. + * + * @see Activity#onContextItemSelected(MenuItem) + * @see Activity#onOptionsItemSelected(MenuItem) + */ + public interface OnMenuItemClickListener { + /** + * Called when a menu item has been invoked. This is the first code + * that is executed; if it returns true, no other callbacks will be + * executed. + * + * @param item The menu item that was invoked. + * + * @return Return true to consume this click and prevent others from + * executing. + */ + public boolean onMenuItemClick(MenuItem item); + } + + /** + * Interface definition for a callback to be invoked when a menu item + * marked with {@link MenuItem#SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW} is + * expanded or collapsed. + * + * @see MenuItem#expandActionView() + * @see MenuItem#collapseActionView() + * @see MenuItem#setShowAsActionFlags(int) + */ + public interface OnActionExpandListener { + /** + * Called when a menu item with {@link MenuItem#SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW} + * is expanded. + * @param item Item that was expanded + * @return true if the item should expand, false if expansion should be suppressed. + */ + public boolean onMenuItemActionExpand(MenuItem item); + + /** + * Called when a menu item with {@link MenuItem#SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW} + * is collapsed. + * @param item Item that was collapsed + * @return true if the item should collapse, false if collapsing should be suppressed. + */ + public boolean onMenuItemActionCollapse(MenuItem item); + } + + /** + * Return the identifier for this menu item. The identifier can not + * be changed after the menu is created. + * + * @return The menu item's identifier. + */ + public int getItemId(); + + /** + * Return the group identifier that this menu item is part of. The group + * identifier can not be changed after the menu is created. + * + * @return The menu item's group identifier. + */ + public int getGroupId(); + + /** + * Return the category and order within the category of this item. This + * item will be shown before all items (within its category) that have + * order greater than this value. + *

+ * An order integer contains the item's category (the upper bits of the + * integer; set by or/add the category with the order within the + * category) and the ordering of the item within that category (the + * lower bits). Example categories are {@link Menu#CATEGORY_SYSTEM}, + * {@link Menu#CATEGORY_SECONDARY}, {@link Menu#CATEGORY_ALTERNATIVE}, + * {@link Menu#CATEGORY_CONTAINER}. See {@link Menu} for a full list. + * + * @return The order of this item. + */ + public int getOrder(); + + /** + * Change the title associated with this item. + * + * @param title The new text to be displayed. + * @return This Item so additional setters can be called. + */ + public MenuItem setTitle(CharSequence title); + + /** + * Change the title associated with this item. + *

+ * Some menu types do not sufficient space to show the full title, and + * instead a condensed title is preferred. See {@link Menu} for more + * information. + * + * @param title The resource id of the new text to be displayed. + * @return This Item so additional setters can be called. + * @see #setTitleCondensed(CharSequence) + */ + + public MenuItem setTitle(int title); + + /** + * Retrieve the current title of the item. + * + * @return The title. + */ + public CharSequence getTitle(); + + /** + * Change the condensed title associated with this item. The condensed + * title is used in situations where the normal title may be too long to + * be displayed. + * + * @param title The new text to be displayed as the condensed title. + * @return This Item so additional setters can be called. + */ + public MenuItem setTitleCondensed(CharSequence title); + + /** + * Retrieve the current condensed title of the item. If a condensed + * title was never set, it will return the normal title. + * + * @return The condensed title, if it exists. + * Otherwise the normal title. + */ + public CharSequence getTitleCondensed(); + + /** + * Change the icon associated with this item. This icon will not always be + * shown, so the title should be sufficient in describing this item. See + * {@link Menu} for the menu types that support icons. + * + * @param icon The new icon (as a Drawable) to be displayed. + * @return This Item so additional setters can be called. + */ + public MenuItem setIcon(Drawable icon); + + /** + * Change the icon associated with this item. This icon will not always be + * shown, so the title should be sufficient in describing this item. See + * {@link Menu} for the menu types that support icons. + *

+ * This method will set the resource ID of the icon which will be used to + * lazily get the Drawable when this item is being shown. + * + * @param iconRes The new icon (as a resource ID) to be displayed. + * @return This Item so additional setters can be called. + */ + public MenuItem setIcon(int iconRes); + + /** + * Returns the icon for this item as a Drawable (getting it from resources if it hasn't been + * loaded before). + * + * @return The icon as a Drawable. + */ + public Drawable getIcon(); + + /** + * Change the Intent associated with this item. By default there is no + * Intent associated with a menu item. If you set one, and nothing + * else handles the item, then the default behavior will be to call + * {@link android.content.Context#startActivity} with the given Intent. + * + *

Note that setIntent() can not be used with the versions of + * {@link Menu#add} that take a Runnable, because {@link Runnable#run} + * does not return a value so there is no way to tell if it handled the + * item. In this case it is assumed that the Runnable always handles + * the item, and the intent will never be started. + * + * @see #getIntent + * @param intent The Intent to associated with the item. This Intent + * object is not copied, so be careful not to + * modify it later. + * @return This Item so additional setters can be called. + */ + public MenuItem setIntent(Intent intent); + + /** + * Return the Intent associated with this item. This returns a + * reference to the Intent which you can change as desired to modify + * what the Item is holding. + * + * @see #setIntent + * @return Returns the last value supplied to {@link #setIntent}, or + * null. + */ + public Intent getIntent(); + + /** + * Change both the numeric and alphabetic shortcut associated with this + * item. Note that the shortcut will be triggered when the key that + * generates the given character is pressed alone or along with with the alt + * key. Also note that case is not significant and that alphabetic shortcut + * characters will be displayed in lower case. + *

+ * See {@link Menu} for the menu types that support shortcuts. + * + * @param numericChar The numeric shortcut key. This is the shortcut when + * using a numeric (e.g., 12-key) keyboard. + * @param alphaChar The alphabetic shortcut key. This is the shortcut when + * using a keyboard with alphabetic keys. + * @return This Item so additional setters can be called. + */ + public MenuItem setShortcut(char numericChar, char alphaChar); + + /** + * Change the numeric shortcut associated with this item. + *

+ * See {@link Menu} for the menu types that support shortcuts. + * + * @param numericChar The numeric shortcut key. This is the shortcut when + * using a 12-key (numeric) keyboard. + * @return This Item so additional setters can be called. + */ + public MenuItem setNumericShortcut(char numericChar); + + /** + * Return the char for this menu item's numeric (12-key) shortcut. + * + * @return Numeric character to use as a shortcut. + */ + public char getNumericShortcut(); + + /** + * Change the alphabetic shortcut associated with this item. The shortcut + * will be triggered when the key that generates the given character is + * pressed alone or along with with the alt key. Case is not significant and + * shortcut characters will be displayed in lower case. Note that menu items + * with the characters '\b' or '\n' as shortcuts will get triggered by the + * Delete key or Carriage Return key, respectively. + *

+ * See {@link Menu} for the menu types that support shortcuts. + * + * @param alphaChar The alphabetic shortcut key. This is the shortcut when + * using a keyboard with alphabetic keys. + * @return This Item so additional setters can be called. + */ + public MenuItem setAlphabeticShortcut(char alphaChar); + + /** + * Return the char for this menu item's alphabetic shortcut. + * + * @return Alphabetic character to use as a shortcut. + */ + public char getAlphabeticShortcut(); + + /** + * Control whether this item can display a check mark. Setting this does + * not actually display a check mark (see {@link #setChecked} for that); + * rather, it ensures there is room in the item in which to display a + * check mark. + *

+ * See {@link Menu} for the menu types that support check marks. + * + * @param checkable Set to true to allow a check mark, false to + * disallow. The default is false. + * @see #setChecked + * @see #isCheckable + * @see Menu#setGroupCheckable + * @return This Item so additional setters can be called. + */ + public MenuItem setCheckable(boolean checkable); + + /** + * Return whether the item can currently display a check mark. + * + * @return If a check mark can be displayed, returns true. + * + * @see #setCheckable + */ + public boolean isCheckable(); + + /** + * Control whether this item is shown with a check mark. Note that you + * must first have enabled checking with {@link #setCheckable} or else + * the check mark will not appear. If this item is a member of a group that contains + * mutually-exclusive items (set via {@link Menu#setGroupCheckable(int, boolean, boolean)}, + * the other items in the group will be unchecked. + *

+ * See {@link Menu} for the menu types that support check marks. + * + * @see #setCheckable + * @see #isChecked + * @see Menu#setGroupCheckable + * @param checked Set to true to display a check mark, false to hide + * it. The default value is false. + * @return This Item so additional setters can be called. + */ + public MenuItem setChecked(boolean checked); + + /** + * Return whether the item is currently displaying a check mark. + * + * @return If a check mark is displayed, returns true. + * + * @see #setChecked + */ + public boolean isChecked(); + + /** + * Sets the visibility of the menu item. Even if a menu item is not visible, + * it may still be invoked via its shortcut (to completely disable an item, + * set it to invisible and {@link #setEnabled(boolean) disabled}). + * + * @param visible If true then the item will be visible; if false it is + * hidden. + * @return This Item so additional setters can be called. + */ + public MenuItem setVisible(boolean visible); + + /** + * Return the visibility of the menu item. + * + * @return If true the item is visible; else it is hidden. + */ + public boolean isVisible(); + + /** + * Sets whether the menu item is enabled. Disabling a menu item will not + * allow it to be invoked via its shortcut. The menu item will still be + * visible. + * + * @param enabled If true then the item will be invokable; if false it is + * won't be invokable. + * @return This Item so additional setters can be called. + */ + public MenuItem setEnabled(boolean enabled); + + /** + * Return the enabled state of the menu item. + * + * @return If true the item is enabled and hence invokable; else it is not. + */ + public boolean isEnabled(); + + /** + * Check whether this item has an associated sub-menu. I.e. it is a + * sub-menu of another menu. + * + * @return If true this item has a menu; else it is a + * normal item. + */ + public boolean hasSubMenu(); + + /** + * Get the sub-menu to be invoked when this item is selected, if it has + * one. See {@link #hasSubMenu()}. + * + * @return The associated menu if there is one, else null + */ + public SubMenu getSubMenu(); + + /** + * Set a custom listener for invocation of this menu item. In most + * situations, it is more efficient and easier to use + * {@link Activity#onOptionsItemSelected(MenuItem)} or + * {@link Activity#onContextItemSelected(MenuItem)}. + * + * @param menuItemClickListener The object to receive invokations. + * @return This Item so additional setters can be called. + * @see Activity#onOptionsItemSelected(MenuItem) + * @see Activity#onContextItemSelected(MenuItem) + */ + public MenuItem setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener menuItemClickListener); + + /** + * Gets the extra information linked to this menu item. This extra + * information is set by the View that added this menu item to the + * menu. + * + * @see OnCreateContextMenuListener + * @return The extra information linked to the View that added this + * menu item to the menu. This can be null. + */ + public ContextMenuInfo getMenuInfo(); + + /** + * Sets how this item should display in the presence of an Action Bar. + * The parameter actionEnum is a flag set. One of {@link #SHOW_AS_ACTION_ALWAYS}, + * {@link #SHOW_AS_ACTION_IF_ROOM}, or {@link #SHOW_AS_ACTION_NEVER} should + * be used, and you may optionally OR the value with {@link #SHOW_AS_ACTION_WITH_TEXT}. + * SHOW_AS_ACTION_WITH_TEXT requests that when the item is shown as an action, + * it should be shown with a text label. + * + * @param actionEnum How the item should display. One of + * {@link #SHOW_AS_ACTION_ALWAYS}, {@link #SHOW_AS_ACTION_IF_ROOM}, or + * {@link #SHOW_AS_ACTION_NEVER}. SHOW_AS_ACTION_NEVER is the default. + * + * @see android.app.ActionBar + * @see #setActionView(View) + */ + public void setShowAsAction(int actionEnum); + + /** + * Sets how this item should display in the presence of an Action Bar. + * The parameter actionEnum is a flag set. One of {@link #SHOW_AS_ACTION_ALWAYS}, + * {@link #SHOW_AS_ACTION_IF_ROOM}, or {@link #SHOW_AS_ACTION_NEVER} should + * be used, and you may optionally OR the value with {@link #SHOW_AS_ACTION_WITH_TEXT}. + * SHOW_AS_ACTION_WITH_TEXT requests that when the item is shown as an action, + * it should be shown with a text label. + * + *

Note: This method differs from {@link #setShowAsAction(int)} only in that it + * returns the current MenuItem instance for call chaining. + * + * @param actionEnum How the item should display. One of + * {@link #SHOW_AS_ACTION_ALWAYS}, {@link #SHOW_AS_ACTION_IF_ROOM}, or + * {@link #SHOW_AS_ACTION_NEVER}. SHOW_AS_ACTION_NEVER is the default. + * + * @see android.app.ActionBar + * @see #setActionView(View) + * @return This MenuItem instance for call chaining. + */ + public MenuItem setShowAsActionFlags(int actionEnum); + + /** + * Set an action view for this menu item. An action view will be displayed in place + * of an automatically generated menu item element in the UI when this item is shown + * as an action within a parent. + *

+ * Note: Setting an action view overrides the action provider + * set via {@link #setActionProvider(ActionProvider)}. + *

+ * + * @param view View to use for presenting this item to the user. + * @return This Item so additional setters can be called. + * + * @see #setShowAsAction(int) + */ + public MenuItem setActionView(View view); + + /** + * Set an action view for this menu item. An action view will be displayed in place + * of an automatically generated menu item element in the UI when this item is shown + * as an action within a parent. + *

+ * Note: Setting an action view overrides the action provider + * set via {@link #setActionProvider(ActionProvider)}. + *

+ * + * @param resId Layout resource to use for presenting this item to the user. + * @return This Item so additional setters can be called. + * + * @see #setShowAsAction(int) + */ + public MenuItem setActionView(int resId); + + /** + * Returns the currently set action view for this menu item. + * + * @return This item's action view + * + * @see #setActionView(View) + * @see #setShowAsAction(int) + */ + public View getActionView(); + + /** + * Sets the {@link ActionProvider} responsible for creating an action view if + * the item is placed on the action bar. The provider also provides a default + * action invoked if the item is placed in the overflow menu. + *

+ * Note: Setting an action provider overrides the action view + * set via {@link #setActionView(int)} or {@link #setActionView(View)}. + *

+ * + * @param actionProvider The action provider. + * @return This Item so additional setters can be called. + * + * @see ActionProvider + */ + public MenuItem setActionProvider(ActionProvider actionProvider); + + /** + * Gets the {@link ActionProvider}. + * + * @return The action provider. + * + * @see ActionProvider + * @see #setActionProvider(ActionProvider) + */ + public ActionProvider getActionProvider(); + + /** + * Expand the action view associated with this menu item. + * The menu item must have an action view set, as well as + * the showAsAction flag {@link #SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW}. + * If a listener has been set using {@link #setOnActionExpandListener(OnActionExpandListener)} + * it will have its {@link OnActionExpandListener#onMenuItemActionExpand(MenuItem)} + * method invoked. The listener may return false from this method to prevent expanding + * the action view. + * + * @return true if the action view was expanded, false otherwise. + */ + public boolean expandActionView(); + + /** + * Collapse the action view associated with this menu item. + * The menu item must have an action view set, as well as the showAsAction flag + * {@link #SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW}. If a listener has been set using + * {@link #setOnActionExpandListener(OnActionExpandListener)} it will have its + * {@link OnActionExpandListener#onMenuItemActionCollapse(MenuItem)} method invoked. + * The listener may return false from this method to prevent collapsing the action view. + * + * @return true if the action view was collapsed, false otherwise. + */ + public boolean collapseActionView(); + + /** + * Returns true if this menu item's action view has been expanded. + * + * @return true if the item's action view is expanded, false otherwise. + * + * @see #expandActionView() + * @see #collapseActionView() + * @see #SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW + * @see OnActionExpandListener + */ + public boolean isActionViewExpanded(); + + /** + * Set an {@link OnActionExpandListener} on this menu item to be notified when + * the associated action view is expanded or collapsed. The menu item must + * be configured to expand or collapse its action view using the flag + * {@link #SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW}. + * + * @param listener Listener that will respond to expand/collapse events + * @return This menu item instance for call chaining + */ + public MenuItem setOnActionExpandListener(OnActionExpandListener listener); +} \ No newline at end of file diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/SubMenu.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/SubMenu.java new file mode 100644 index 0000000000..397fd1c2d7 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/SubMenu.java @@ -0,0 +1,110 @@ +/* + * 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. + */ + +package com.actionbarsherlock.view; + +import android.graphics.drawable.Drawable; +import android.view.View; + +/** + * Subclass of {@link Menu} for sub menus. + *

+ * Sub menus do not support item icons, or nested sub menus. + * + *

+ *

Developer Guides

+ *

For information about creating menus, read the + * Menus developer guide.

+ *
+ */ + +public interface SubMenu extends Menu { + /** + * Sets the submenu header's title to the title given in titleRes + * resource identifier. + * + * @param titleRes The string resource identifier used for the title. + * @return This SubMenu so additional setters can be called. + */ + public SubMenu setHeaderTitle(int titleRes); + + /** + * Sets the submenu header's title to the title given in title. + * + * @param title The character sequence used for the title. + * @return This SubMenu so additional setters can be called. + */ + public SubMenu setHeaderTitle(CharSequence title); + + /** + * Sets the submenu header's icon to the icon given in iconRes + * resource id. + * + * @param iconRes The resource identifier used for the icon. + * @return This SubMenu so additional setters can be called. + */ + public SubMenu setHeaderIcon(int iconRes); + + /** + * Sets the submenu header's icon to the icon given in icon + * {@link Drawable}. + * + * @param icon The {@link Drawable} used for the icon. + * @return This SubMenu so additional setters can be called. + */ + public SubMenu setHeaderIcon(Drawable icon); + + /** + * Sets the header of the submenu to the {@link View} given in + * view. This replaces the header title and icon (and those + * replace this). + * + * @param view The {@link View} used for the header. + * @return This SubMenu so additional setters can be called. + */ + public SubMenu setHeaderView(View view); + + /** + * Clears the header of the submenu. + */ + public void clearHeader(); + + /** + * Change the icon associated with this submenu's item in its parent menu. + * + * @see MenuItem#setIcon(int) + * @param iconRes The new icon (as a resource ID) to be displayed. + * @return This SubMenu so additional setters can be called. + */ + public SubMenu setIcon(int iconRes); + + /** + * Change the icon associated with this submenu's item in its parent menu. + * + * @see MenuItem#setIcon(Drawable) + * @param icon The new icon (as a Drawable) to be displayed. + * @return This SubMenu so additional setters can be called. + */ + public SubMenu setIcon(Drawable icon); + + /** + * Gets the {@link MenuItem} that represents this submenu in the parent + * menu. Use this for setting additional item attributes. + * + * @return The {@link MenuItem} that launches the submenu when invoked. + */ + public MenuItem getItem(); +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Window.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Window.java new file mode 100644 index 0000000000..a340a4291f --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/view/Window.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * Copyright (C) 2011 Jake Wharton + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.view; + +import android.content.Context; + +/** + *

Abstract base class for a top-level window look and behavior policy. An + * instance of this class should be used as the top-level view added to the + * window manager. It provides standard UI policies such as a background, title + * area, default key processing, etc.

+ * + *

The only existing implementation of this abstract class is + * android.policy.PhoneWindow, which you should instantiate when needing a + * Window. Eventually that class will be refactored and a factory method added + * for creating Window instances without knowing about a particular + * implementation.

+ */ +public abstract class Window extends android.view.Window { + public static final long FEATURE_ACTION_BAR = android.view.Window.FEATURE_ACTION_BAR; + public static final long FEATURE_ACTION_BAR_OVERLAY = android.view.Window.FEATURE_ACTION_BAR_OVERLAY; + public static final long FEATURE_ACTION_MODE_OVERLAY = android.view.Window.FEATURE_ACTION_MODE_OVERLAY; + public static final long FEATURE_NO_TITLE = android.view.Window.FEATURE_NO_TITLE; + public static final long FEATURE_PROGRESS = android.view.Window.FEATURE_PROGRESS; + public static final long FEATURE_INDETERMINATE_PROGRESS = android.view.Window.FEATURE_INDETERMINATE_PROGRESS; + + /** + * Create a new instance for a context. + * + * @param context Context. + */ + private Window(Context context) { + super(context); + } + + + public interface Callback { + /** + * Called when a panel's menu item has been selected by the user. + * + * @param featureId The panel that the menu is in. + * @param item The menu item that was selected. + * + * @return boolean Return true to finish processing of selection, or + * false to perform the normal menu handling (calling its + * Runnable or sending a Message to its target Handler). + */ + public boolean onMenuItemSelected(int featureId, MenuItem item); + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserModel.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserModel.java new file mode 100644 index 0000000000..d7f110fc62 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserModel.java @@ -0,0 +1,1104 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.widget; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ResolveInfo; +import android.database.DataSetObservable; +import android.os.Handler; +import android.text.TextUtils; +import android.util.Log; +import android.util.Xml; +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlSerializer; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +/** + *

+ * This class represents a data model for choosing a component for handing a + * given {@link Intent}. The model is responsible for querying the system for + * activities that can handle the given intent and order found activities + * based on historical data of previous choices. The historical data is stored + * in an application private file. If a client does not want to have persistent + * choice history the file can be omitted, thus the activities will be ordered + * based on historical usage for the current session. + *

+ *

+ * For each backing history file there is a singleton instance of this class. Thus, + * several clients that specify the same history file will share the same model. Note + * that if multiple clients are sharing the same model they should implement semantically + * equivalent functionality since setting the model intent will change the found + * activities and they may be inconsistent with the functionality of some of the clients. + * For example, choosing a share activity can be implemented by a single backing + * model and two different views for performing the selection. If however, one of the + * views is used for sharing but the other for importing, for example, then each + * view should be backed by a separate model. + *

+ *

+ * The way clients interact with this class is as follows: + *

+ *

+ *

+ * 
+ *  // Get a model and set it to a couple of clients with semantically similar function.
+ *  ActivityChooserModel dataModel =
+ *      ActivityChooserModel.get(context, "task_specific_history_file_name.xml");
+ *
+ *  ActivityChooserModelClient modelClient1 = getActivityChooserModelClient1();
+ *  modelClient1.setActivityChooserModel(dataModel);
+ *
+ *  ActivityChooserModelClient modelClient2 = getActivityChooserModelClient2();
+ *  modelClient2.setActivityChooserModel(dataModel);
+ *
+ *  // Set an intent to choose a an activity for.
+ *  dataModel.setIntent(intent);
+ * 
+ * 
+ * 

+ *

+ * Note: This class is thread safe. + *

+ * + * @hide + */ +class ActivityChooserModel extends DataSetObservable { + + /** + * Client that utilizes an {@link ActivityChooserModel}. + */ + public interface ActivityChooserModelClient { + + /** + * Sets the {@link ActivityChooserModel}. + * + * @param dataModel The model. + */ + public void setActivityChooserModel(ActivityChooserModel dataModel); + } + + /** + * Defines a sorter that is responsible for sorting the activities + * based on the provided historical choices and an intent. + */ + public interface ActivitySorter { + + /** + * Sorts the activities in descending order of relevance + * based on previous history and an intent. + * + * @param intent The {@link Intent}. + * @param activities Activities to be sorted. + * @param historicalRecords Historical records. + */ + // This cannot be done by a simple comparator since an Activity weight + // is computed from history. Note that Activity implements Comparable. + public void sort(Intent intent, List activities, + List historicalRecords); + } + + /** + * Listener for choosing an activity. + */ + public interface OnChooseActivityListener { + + /** + * Called when an activity has been chosen. The client can decide whether + * an activity can be chosen and if so the caller of + * {@link ActivityChooserModel#chooseActivity(int)} will receive and {@link Intent} + * for launching it. + *

+ * Note: Modifying the intent is not permitted and + * any changes to the latter will be ignored. + *

+ * + * @param host The listener's host model. + * @param intent The intent for launching the chosen activity. + * @return Whether the intent is handled and should not be delivered to clients. + * + * @see ActivityChooserModel#chooseActivity(int) + */ + public boolean onChooseActivity(ActivityChooserModel host, Intent intent); + } + + /** + * Flag for selecting debug mode. + */ + private static final boolean DEBUG = false; + + /** + * Tag used for logging. + */ + private static final String LOG_TAG = ActivityChooserModel.class.getSimpleName(); + + /** + * The root tag in the history file. + */ + private static final String TAG_HISTORICAL_RECORDS = "historical-records"; + + /** + * The tag for a record in the history file. + */ + private static final String TAG_HISTORICAL_RECORD = "historical-record"; + + /** + * Attribute for the activity. + */ + private static final String ATTRIBUTE_ACTIVITY = "activity"; + + /** + * Attribute for the choice time. + */ + private static final String ATTRIBUTE_TIME = "time"; + + /** + * Attribute for the choice weight. + */ + private static final String ATTRIBUTE_WEIGHT = "weight"; + + /** + * The default name of the choice history file. + */ + public static final String DEFAULT_HISTORY_FILE_NAME = + "activity_choser_model_history.xml"; + + /** + * The default maximal length of the choice history. + */ + public static final int DEFAULT_HISTORY_MAX_LENGTH = 50; + + /** + * The amount with which to inflate a chosen activity when set as default. + */ + private static final int DEFAULT_ACTIVITY_INFLATION = 5; + + /** + * Default weight for a choice record. + */ + private static final float DEFAULT_HISTORICAL_RECORD_WEIGHT = 1.0f; + + /** + * The extension of the history file. + */ + private static final String HISTORY_FILE_EXTENSION = ".xml"; + + /** + * An invalid item index. + */ + private static final int INVALID_INDEX = -1; + + /** + * Lock to guard the model registry. + */ + private static final Object sRegistryLock = new Object(); + + /** + * This the registry for data models. + */ + private static final Map sDataModelRegistry = + new HashMap(); + + /** + * Lock for synchronizing on this instance. + */ + private final Object mInstanceLock = new Object(); + + /** + * List of activities that can handle the current intent. + */ + private final List mActivites = new ArrayList(); + + /** + * List with historical choice records. + */ + private final List mHistoricalRecords = new ArrayList(); + + /** + * Context for accessing resources. + */ + private final Context mContext; + + /** + * The name of the history file that backs this model. + */ + private final String mHistoryFileName; + + /** + * The intent for which a activity is being chosen. + */ + private Intent mIntent; + + /** + * The sorter for ordering activities based on intent and past choices. + */ + private ActivitySorter mActivitySorter = new DefaultSorter(); + + /** + * The maximal length of the choice history. + */ + private int mHistoryMaxSize = DEFAULT_HISTORY_MAX_LENGTH; + + /** + * Flag whether choice history can be read. In general many clients can + * share the same data model and {@link #readHistoricalData()} may be called + * by arbitrary of them any number of times. Therefore, this class guarantees + * that the very first read succeeds and subsequent reads can be performed + * only after a call to {@link #persistHistoricalData()} followed by change + * of the share records. + */ + private boolean mCanReadHistoricalData = true; + + /** + * Flag whether the choice history was read. This is used to enforce that + * before calling {@link #persistHistoricalData()} a call to + * {@link #persistHistoricalData()} has been made. This aims to avoid a + * scenario in which a choice history file exits, it is not read yet and + * it is overwritten. Note that always all historical records are read in + * full and the file is rewritten. This is necessary since we need to + * purge old records that are outside of the sliding window of past choices. + */ + private boolean mReadShareHistoryCalled = false; + + /** + * Flag whether the choice records have changed. In general many clients can + * share the same data model and {@link #persistHistoricalData()} may be called + * by arbitrary of them any number of times. Therefore, this class guarantees + * that choice history will be persisted only if it has changed. + */ + private boolean mHistoricalRecordsChanged = true; + + /** + * Hander for scheduling work on client tread. + */ + private final Handler mHandler = new Handler(); + + /** + * Policy for controlling how the model handles chosen activities. + */ + private OnChooseActivityListener mActivityChoserModelPolicy; + + /** + * Gets the data model backed by the contents of the provided file with historical data. + * Note that only one data model is backed by a given file, thus multiple calls with + * the same file name will return the same model instance. If no such instance is present + * it is created. + *

+ * Note: To use the default historical data file clients should explicitly + * pass as file name {@link #DEFAULT_HISTORY_FILE_NAME}. If no persistence of the choice + * history is desired clients should pass null for the file name. In such + * case a new model is returned for each invocation. + *

+ * + *

+ * Always use difference historical data files for semantically different actions. + * For example, sharing is different from importing. + *

+ * + * @param context Context for loading resources. + * @param historyFileName File name with choice history, null + * if the model should not be backed by a file. In this case the activities + * will be ordered only by data from the current session. + * + * @return The model. + */ + public static ActivityChooserModel get(Context context, String historyFileName) { + synchronized (sRegistryLock) { + ActivityChooserModel dataModel = sDataModelRegistry.get(historyFileName); + if (dataModel == null) { + dataModel = new ActivityChooserModel(context, historyFileName); + sDataModelRegistry.put(historyFileName, dataModel); + } + dataModel.readHistoricalData(); + return dataModel; + } + } + + /** + * Creates a new instance. + * + * @param context Context for loading resources. + * @param historyFileName The history XML file. + */ + private ActivityChooserModel(Context context, String historyFileName) { + mContext = context.getApplicationContext(); + if (!TextUtils.isEmpty(historyFileName) + && !historyFileName.endsWith(HISTORY_FILE_EXTENSION)) { + mHistoryFileName = historyFileName + HISTORY_FILE_EXTENSION; + } else { + mHistoryFileName = historyFileName; + } + } + + /** + * Sets an intent for which to choose a activity. + *

+ * Note: Clients must set only semantically similar + * intents for each data model. + *

+ * + * @param intent The intent. + */ + public void setIntent(Intent intent) { + synchronized (mInstanceLock) { + if (mIntent == intent) { + return; + } + mIntent = intent; + loadActivitiesLocked(); + } + } + + /** + * Gets the intent for which a activity is being chosen. + * + * @return The intent. + */ + public Intent getIntent() { + synchronized (mInstanceLock) { + return mIntent; + } + } + + /** + * Gets the number of activities that can handle the intent. + * + * @return The activity count. + * + * @see #setIntent(Intent) + */ + public int getActivityCount() { + synchronized (mInstanceLock) { + return mActivites.size(); + } + } + + /** + * Gets an activity at a given index. + * + * @return The activity. + * + * @see ActivityResolveInfo + * @see #setIntent(Intent) + */ + public ResolveInfo getActivity(int index) { + synchronized (mInstanceLock) { + return mActivites.get(index).resolveInfo; + } + } + + /** + * Gets the index of a the given activity. + * + * @param activity The activity index. + * + * @return The index if found, -1 otherwise. + */ + public int getActivityIndex(ResolveInfo activity) { + List activities = mActivites; + final int activityCount = activities.size(); + for (int i = 0; i < activityCount; i++) { + ActivityResolveInfo currentActivity = activities.get(i); + if (currentActivity.resolveInfo == activity) { + return i; + } + } + return INVALID_INDEX; + } + + /** + * Chooses a activity to handle the current intent. This will result in + * adding a historical record for that action and construct intent with + * its component name set such that it can be immediately started by the + * client. + *

+ * Note: By calling this method the client guarantees + * that the returned intent will be started. This intent is returned to + * the client solely to let additional customization before the start. + *

+ * + * @return An {@link Intent} for launching the activity or null if the + * policy has consumed the intent. + * + * @see HistoricalRecord + * @see OnChooseActivityListener + */ + public Intent chooseActivity(int index) { + ActivityResolveInfo chosenActivity = mActivites.get(index); + + ComponentName chosenName = new ComponentName( + chosenActivity.resolveInfo.activityInfo.packageName, + chosenActivity.resolveInfo.activityInfo.name); + + Intent choiceIntent = new Intent(mIntent); + choiceIntent.setComponent(chosenName); + + if (mActivityChoserModelPolicy != null) { + // Do not allow the policy to change the intent. + Intent choiceIntentCopy = new Intent(choiceIntent); + final boolean handled = mActivityChoserModelPolicy.onChooseActivity(this, + choiceIntentCopy); + if (handled) { + return null; + } + } + + HistoricalRecord historicalRecord = new HistoricalRecord(chosenName, + System.currentTimeMillis(), DEFAULT_HISTORICAL_RECORD_WEIGHT); + addHisoricalRecord(historicalRecord); + + return choiceIntent; + } + + /** + * Sets the listener for choosing an activity. + * + * @param listener The listener. + */ + public void setOnChooseActivityListener(OnChooseActivityListener listener) { + mActivityChoserModelPolicy = listener; + } + + /** + * Gets the default activity, The default activity is defined as the one + * with highest rank i.e. the first one in the list of activities that can + * handle the intent. + * + * @return The default activity, null id not activities. + * + * @see #getActivity(int) + */ + public ResolveInfo getDefaultActivity() { + synchronized (mInstanceLock) { + if (!mActivites.isEmpty()) { + return mActivites.get(0).resolveInfo; + } + } + return null; + } + + /** + * Sets the default activity. The default activity is set by adding a + * historical record with weight high enough that this activity will + * become the highest ranked. Such a strategy guarantees that the default + * will eventually change if not used. Also the weight of the record for + * setting a default is inflated with a constant amount to guarantee that + * it will stay as default for awhile. + * + * @param index The index of the activity to set as default. + */ + public void setDefaultActivity(int index) { + ActivityResolveInfo newDefaultActivity = mActivites.get(index); + ActivityResolveInfo oldDefaultActivity = mActivites.get(0); + + final float weight; + if (oldDefaultActivity != null) { + // Add a record with weight enough to boost the chosen at the top. + weight = oldDefaultActivity.weight - newDefaultActivity.weight + + DEFAULT_ACTIVITY_INFLATION; + } else { + weight = DEFAULT_HISTORICAL_RECORD_WEIGHT; + } + + ComponentName defaultName = new ComponentName( + newDefaultActivity.resolveInfo.activityInfo.packageName, + newDefaultActivity.resolveInfo.activityInfo.name); + HistoricalRecord historicalRecord = new HistoricalRecord(defaultName, + System.currentTimeMillis(), weight); + addHisoricalRecord(historicalRecord); + } + + /** + * Reads the history data from the backing file if the latter + * was provided. Calling this method more than once before a call + * to {@link #persistHistoricalData()} has been made has no effect. + *

+ * Note: Historical data is read asynchronously and + * as soon as the reading is completed any registered + * {@link DataSetObserver}s will be notified. Also no historical + * data is read until this method is invoked. + *

+ */ + private void readHistoricalData() { + synchronized (mInstanceLock) { + if (!mCanReadHistoricalData || !mHistoricalRecordsChanged) { + return; + } + mCanReadHistoricalData = false; + mReadShareHistoryCalled = true; + if (!TextUtils.isEmpty(mHistoryFileName)) { + /*AsyncTask.*/SERIAL_EXECUTOR.execute(new HistoryLoader()); + } + } + } + + private static final Executor SERIAL_EXECUTOR = Executors.newSingleThreadExecutor(); + + /** + * Persists the history data to the backing file if the latter + * was provided. Calling this method before a call to {@link #readHistoricalData()} + * throws an exception. Calling this method more than one without choosing an + * activity has not effect. + * + * @throws IllegalStateException If this method is called before a call to + * {@link #readHistoricalData()}. + */ + private void persistHistoricalData() { + synchronized (mInstanceLock) { + if (!mReadShareHistoryCalled) { + throw new IllegalStateException("No preceding call to #readHistoricalData"); + } + if (!mHistoricalRecordsChanged) { + return; + } + mHistoricalRecordsChanged = false; + mCanReadHistoricalData = true; + if (!TextUtils.isEmpty(mHistoryFileName)) { + /*AsyncTask.*/SERIAL_EXECUTOR.execute(new HistoryPersister()); + } + } + } + + /** + * Sets the sorter for ordering activities based on historical data and an intent. + * + * @param activitySorter The sorter. + * + * @see ActivitySorter + */ + public void setActivitySorter(ActivitySorter activitySorter) { + synchronized (mInstanceLock) { + if (mActivitySorter == activitySorter) { + return; + } + mActivitySorter = activitySorter; + sortActivities(); + } + } + + /** + * Sorts the activities based on history and an intent. If + * a sorter is not specified this a default implementation is used. + * + * @see #setActivitySorter(ActivitySorter) + */ + private void sortActivities() { + synchronized (mInstanceLock) { + if (mActivitySorter != null && !mActivites.isEmpty()) { + mActivitySorter.sort(mIntent, mActivites, + Collections.unmodifiableList(mHistoricalRecords)); + notifyChanged(); + } + } + } + + /** + * Sets the maximal size of the historical data. Defaults to + * {@link #DEFAULT_HISTORY_MAX_LENGTH} + *

+ * Note: Setting this property will immediately + * enforce the specified max history size by dropping enough old + * historical records to enforce the desired size. Thus, any + * records that exceed the history size will be discarded and + * irreversibly lost. + *

+ * + * @param historyMaxSize The max history size. + */ + public void setHistoryMaxSize(int historyMaxSize) { + synchronized (mInstanceLock) { + if (mHistoryMaxSize == historyMaxSize) { + return; + } + mHistoryMaxSize = historyMaxSize; + pruneExcessiveHistoricalRecordsLocked(); + sortActivities(); + } + } + + /** + * Gets the history max size. + * + * @return The history max size. + */ + public int getHistoryMaxSize() { + synchronized (mInstanceLock) { + return mHistoryMaxSize; + } + } + + /** + * Gets the history size. + * + * @return The history size. + */ + public int getHistorySize() { + synchronized (mInstanceLock) { + return mHistoricalRecords.size(); + } + } + + /** + * Adds a historical record. + * + * @param historicalRecord The record to add. + * @return True if the record was added. + */ + private boolean addHisoricalRecord(HistoricalRecord historicalRecord) { + synchronized (mInstanceLock) { + final boolean added = mHistoricalRecords.add(historicalRecord); + if (added) { + mHistoricalRecordsChanged = true; + pruneExcessiveHistoricalRecordsLocked(); + persistHistoricalData(); + sortActivities(); + } + return added; + } + } + + /** + * Prunes older excessive records to guarantee {@link #mHistoryMaxSize}. + */ + private void pruneExcessiveHistoricalRecordsLocked() { + List choiceRecords = mHistoricalRecords; + final int pruneCount = choiceRecords.size() - mHistoryMaxSize; + if (pruneCount <= 0) { + return; + } + mHistoricalRecordsChanged = true; + for (int i = 0; i < pruneCount; i++) { + HistoricalRecord prunedRecord = choiceRecords.remove(0); + if (DEBUG) { + Log.i(LOG_TAG, "Pruned: " + prunedRecord); + } + } + } + + /** + * Loads the activities. + */ + private void loadActivitiesLocked() { + mActivites.clear(); + if (mIntent != null) { + List resolveInfos = + mContext.getPackageManager().queryIntentActivities(mIntent, 0); + final int resolveInfoCount = resolveInfos.size(); + for (int i = 0; i < resolveInfoCount; i++) { + ResolveInfo resolveInfo = resolveInfos.get(i); + mActivites.add(new ActivityResolveInfo(resolveInfo)); + } + sortActivities(); + } else { + notifyChanged(); + } + } + + /** + * Represents a record in the history. + */ + public final static class HistoricalRecord { + + /** + * The activity name. + */ + public final ComponentName activity; + + /** + * The choice time. + */ + public final long time; + + /** + * The record weight. + */ + public final float weight; + + /** + * Creates a new instance. + * + * @param activityName The activity component name flattened to string. + * @param time The time the activity was chosen. + * @param weight The weight of the record. + */ + public HistoricalRecord(String activityName, long time, float weight) { + this(ComponentName.unflattenFromString(activityName), time, weight); + } + + /** + * Creates a new instance. + * + * @param activityName The activity name. + * @param time The time the activity was chosen. + * @param weight The weight of the record. + */ + public HistoricalRecord(ComponentName activityName, long time, float weight) { + this.activity = activityName; + this.time = time; + this.weight = weight; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((activity == null) ? 0 : activity.hashCode()); + result = prime * result + (int) (time ^ (time >>> 32)); + result = prime * result + Float.floatToIntBits(weight); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + HistoricalRecord other = (HistoricalRecord) obj; + if (activity == null) { + if (other.activity != null) { + return false; + } + } else if (!activity.equals(other.activity)) { + return false; + } + if (time != other.time) { + return false; + } + if (Float.floatToIntBits(weight) != Float.floatToIntBits(other.weight)) { + return false; + } + return true; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("["); + builder.append("; activity:").append(activity); + builder.append("; time:").append(time); + builder.append("; weight:").append(new BigDecimal(weight)); + builder.append("]"); + return builder.toString(); + } + } + + /** + * Represents an activity. + */ + public final class ActivityResolveInfo implements Comparable { + + /** + * The {@link ResolveInfo} of the activity. + */ + public final ResolveInfo resolveInfo; + + /** + * Weight of the activity. Useful for sorting. + */ + public float weight; + + /** + * Creates a new instance. + * + * @param resolveInfo activity {@link ResolveInfo}. + */ + public ActivityResolveInfo(ResolveInfo resolveInfo) { + this.resolveInfo = resolveInfo; + } + + @Override + public int hashCode() { + return 31 + Float.floatToIntBits(weight); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + ActivityResolveInfo other = (ActivityResolveInfo) obj; + if (Float.floatToIntBits(weight) != Float.floatToIntBits(other.weight)) { + return false; + } + return true; + } + + public int compareTo(ActivityResolveInfo another) { + return Float.floatToIntBits(another.weight) - Float.floatToIntBits(weight); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("["); + builder.append("resolveInfo:").append(resolveInfo.toString()); + builder.append("; weight:").append(new BigDecimal(weight)); + builder.append("]"); + return builder.toString(); + } + } + + /** + * Default activity sorter implementation. + */ + private final class DefaultSorter implements ActivitySorter { + private static final float WEIGHT_DECAY_COEFFICIENT = 0.95f; + + private final Map mPackageNameToActivityMap = + new HashMap(); + + public void sort(Intent intent, List activities, + List historicalRecords) { + Map packageNameToActivityMap = + mPackageNameToActivityMap; + packageNameToActivityMap.clear(); + + final int activityCount = activities.size(); + for (int i = 0; i < activityCount; i++) { + ActivityResolveInfo activity = activities.get(i); + activity.weight = 0.0f; + String packageName = activity.resolveInfo.activityInfo.packageName; + packageNameToActivityMap.put(packageName, activity); + } + + final int lastShareIndex = historicalRecords.size() - 1; + float nextRecordWeight = 1; + for (int i = lastShareIndex; i >= 0; i--) { + HistoricalRecord historicalRecord = historicalRecords.get(i); + String packageName = historicalRecord.activity.getPackageName(); + ActivityResolveInfo activity = packageNameToActivityMap.get(packageName); + if (activity != null) { + activity.weight += historicalRecord.weight * nextRecordWeight; + nextRecordWeight = nextRecordWeight * WEIGHT_DECAY_COEFFICIENT; + } + } + + Collections.sort(activities); + + if (DEBUG) { + for (int i = 0; i < activityCount; i++) { + Log.i(LOG_TAG, "Sorted: " + activities.get(i)); + } + } + } + } + + /** + * Command for reading the historical records from a file off the UI thread. + */ + private final class HistoryLoader implements Runnable { + + public void run() { + FileInputStream fis = null; + try { + fis = mContext.openFileInput(mHistoryFileName); + } catch (FileNotFoundException fnfe) { + if (DEBUG) { + Log.i(LOG_TAG, "Could not open historical records file: " + mHistoryFileName); + } + return; + } + try { + XmlPullParser parser = Xml.newPullParser(); + parser.setInput(fis, null); + + int type = XmlPullParser.START_DOCUMENT; + while (type != XmlPullParser.END_DOCUMENT && type != XmlPullParser.START_TAG) { + type = parser.next(); + } + + if (!TAG_HISTORICAL_RECORDS.equals(parser.getName())) { + throw new XmlPullParserException("Share records file does not start with " + + TAG_HISTORICAL_RECORDS + " tag."); + } + + List readRecords = new ArrayList(); + + while (true) { + type = parser.next(); + if (type == XmlPullParser.END_DOCUMENT) { + break; + } + if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { + continue; + } + String nodeName = parser.getName(); + if (!TAG_HISTORICAL_RECORD.equals(nodeName)) { + throw new XmlPullParserException("Share records file not well-formed."); + } + + String activity = parser.getAttributeValue(null, ATTRIBUTE_ACTIVITY); + final long time = + Long.parseLong(parser.getAttributeValue(null, ATTRIBUTE_TIME)); + final float weight = + Float.parseFloat(parser.getAttributeValue(null, ATTRIBUTE_WEIGHT)); + + HistoricalRecord readRecord = new HistoricalRecord(activity, time, + weight); + readRecords.add(readRecord); + + if (DEBUG) { + Log.i(LOG_TAG, "Read " + readRecord.toString()); + } + } + + if (DEBUG) { + Log.i(LOG_TAG, "Read " + readRecords.size() + " historical records."); + } + + synchronized (mInstanceLock) { + Set uniqueShareRecords = + new LinkedHashSet(readRecords); + + // Make sure no duplicates. Example: Read a file with + // one record, add one record, persist the two records, + // add a record, read the persisted records - the + // read two records should not be added again. + List historicalRecords = mHistoricalRecords; + final int historicalRecordsCount = historicalRecords.size(); + for (int i = historicalRecordsCount - 1; i >= 0; i--) { + HistoricalRecord historicalRecord = historicalRecords.get(i); + uniqueShareRecords.add(historicalRecord); + } + + if (historicalRecords.size() == uniqueShareRecords.size()) { + return; + } + + // Make sure the oldest records go to the end. + historicalRecords.clear(); + historicalRecords.addAll(uniqueShareRecords); + + mHistoricalRecordsChanged = true; + + // Do this on the client thread since the client may be on the UI + // thread, wait for data changes which happen during sorting, and + // perform UI modification based on the data change. + mHandler.post(new Runnable() { + public void run() { + pruneExcessiveHistoricalRecordsLocked(); + sortActivities(); + } + }); + } + } catch (XmlPullParserException xppe) { + Log.e(LOG_TAG, "Error reading historical recrod file: " + mHistoryFileName, xppe); + } catch (IOException ioe) { + Log.e(LOG_TAG, "Error reading historical recrod file: " + mHistoryFileName, ioe); + } finally { + if (fis != null) { + try { + fis.close(); + } catch (IOException ioe) { + /* ignore */ + } + } + } + } + } + + /** + * Command for persisting the historical records to a file off the UI thread. + */ + private final class HistoryPersister implements Runnable { + + public void run() { + FileOutputStream fos = null; + List records = null; + + synchronized (mInstanceLock) { + records = new ArrayList(mHistoricalRecords); + } + + try { + fos = mContext.openFileOutput(mHistoryFileName, Context.MODE_PRIVATE); + } catch (FileNotFoundException fnfe) { + Log.e(LOG_TAG, "Error writing historical recrod file: " + mHistoryFileName, fnfe); + return; + } + + XmlSerializer serializer = Xml.newSerializer(); + + try { + serializer.setOutput(fos, null); + serializer.startDocument("UTF-8", true); + serializer.startTag(null, TAG_HISTORICAL_RECORDS); + + final int recordCount = records.size(); + for (int i = 0; i < recordCount; i++) { + HistoricalRecord record = records.remove(0); + serializer.startTag(null, TAG_HISTORICAL_RECORD); + serializer.attribute(null, ATTRIBUTE_ACTIVITY, record.activity.flattenToString()); + serializer.attribute(null, ATTRIBUTE_TIME, String.valueOf(record.time)); + serializer.attribute(null, ATTRIBUTE_WEIGHT, String.valueOf(record.weight)); + serializer.endTag(null, TAG_HISTORICAL_RECORD); + if (DEBUG) { + Log.i(LOG_TAG, "Wrote " + record.toString()); + } + } + + serializer.endTag(null, TAG_HISTORICAL_RECORDS); + serializer.endDocument(); + + if (DEBUG) { + Log.i(LOG_TAG, "Wrote " + recordCount + " historical records."); + } + } catch (IllegalArgumentException iae) { + Log.e(LOG_TAG, "Error writing historical recrod file: " + mHistoryFileName, iae); + } catch (IllegalStateException ise) { + Log.e(LOG_TAG, "Error writing historical recrod file: " + mHistoryFileName, ise); + } catch (IOException ioe) { + Log.e(LOG_TAG, "Error writing historical recrod file: " + mHistoryFileName, ioe); + } finally { + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + /* ignore */ + } + } + } + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserView.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserView.java new file mode 100644 index 0000000000..e19ea9e9e1 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ActivityChooserView.java @@ -0,0 +1,827 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.widget; + +import android.os.Build; +import com.actionbarsherlock.R; +import com.actionbarsherlock.internal.widget.IcsLinearLayout; +import com.actionbarsherlock.internal.widget.IcsListPopupWindow; +import com.actionbarsherlock.view.ActionProvider; +import com.actionbarsherlock.widget.ActivityChooserModel.ActivityChooserModelClient; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.database.DataSetObserver; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.view.ViewTreeObserver.OnGlobalLayoutListener; +import android.widget.AdapterView; +import android.widget.BaseAdapter; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.PopupWindow; +import android.widget.TextView; + +/** + * This class is a view for choosing an activity for handling a given {@link Intent}. + *

+ * The view is composed of two adjacent buttons: + *

    + *
  • + * The left button is an immediate action and allows one click activity choosing. + * Tapping this button immediately executes the intent without requiring any further + * user input. Long press on this button shows a popup for changing the default + * activity. + *
  • + *
  • + * The right button is an overflow action and provides an optimized menu + * of additional activities. Tapping this button shows a popup anchored to this + * view, listing the most frequently used activities. This list is initially + * limited to a small number of items in frequency used order. The last item, + * "Show all..." serves as an affordance to display all available activities. + *
  • + *
+ *

+ * + * @hide + */ +class ActivityChooserView extends ViewGroup implements ActivityChooserModelClient { + + /** + * An adapter for displaying the activities in an {@link AdapterView}. + */ + private final ActivityChooserViewAdapter mAdapter; + + /** + * Implementation of various interfaces to avoid publishing them in the APIs. + */ + private final Callbacks mCallbacks; + + /** + * The content of this view. + */ + private final IcsLinearLayout mActivityChooserContent; + + /** + * Stores the background drawable to allow hiding and latter showing. + */ + private final Drawable mActivityChooserContentBackground; + + /** + * The expand activities action button; + */ + private final FrameLayout mExpandActivityOverflowButton; + + /** + * The image for the expand activities action button; + */ + private final ImageView mExpandActivityOverflowButtonImage; + + /** + * The default activities action button; + */ + private final FrameLayout mDefaultActivityButton; + + /** + * The image for the default activities action button; + */ + private final ImageView mDefaultActivityButtonImage; + + /** + * The maximal width of the list popup. + */ + private final int mListPopupMaxWidth; + + /** + * The ActionProvider hosting this view, if applicable. + */ + ActionProvider mProvider; + + /** + * Observer for the model data. + */ + private final DataSetObserver mModelDataSetOberver = new DataSetObserver() { + + @Override + public void onChanged() { + super.onChanged(); + mAdapter.notifyDataSetChanged(); + } + @Override + public void onInvalidated() { + super.onInvalidated(); + mAdapter.notifyDataSetInvalidated(); + } + }; + + private final OnGlobalLayoutListener mOnGlobalLayoutListener = new OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + if (isShowingPopup()) { + if (!isShown()) { + getListPopupWindow().dismiss(); + } else { + getListPopupWindow().show(); + if (mProvider != null) { + mProvider.subUiVisibilityChanged(true); + } + } + } + } + }; + + /** + * Popup window for showing the activity overflow list. + */ + private IcsListPopupWindow mListPopupWindow; + + /** + * Listener for the dismissal of the popup/alert. + */ + private PopupWindow.OnDismissListener mOnDismissListener; + + /** + * Flag whether a default activity currently being selected. + */ + private boolean mIsSelectingDefaultActivity; + + /** + * The count of activities in the popup. + */ + private int mInitialActivityCount = ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_DEFAULT; + + /** + * Flag whether this view is attached to a window. + */ + private boolean mIsAttachedToWindow; + + /** + * String resource for formatting content description of the default target. + */ + private int mDefaultActionButtonContentDescription; + + private final Context mContext; + + /** + * Create a new instance. + * + * @param context The application environment. + */ + public ActivityChooserView(Context context) { + this(context, null); + } + + /** + * Create a new instance. + * + * @param context The application environment. + * @param attrs A collection of attributes. + */ + public ActivityChooserView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + /** + * Create a new instance. + * + * @param context The application environment. + * @param attrs A collection of attributes. + * @param defStyle The default style to apply to this view. + */ + public ActivityChooserView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mContext = context; + + TypedArray attributesArray = context.obtainStyledAttributes(attrs, + R.styleable.SherlockActivityChooserView, defStyle, 0); + + mInitialActivityCount = attributesArray.getInt( + R.styleable.SherlockActivityChooserView_initialActivityCount, + ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_DEFAULT); + + Drawable expandActivityOverflowButtonDrawable = attributesArray.getDrawable( + R.styleable.SherlockActivityChooserView_expandActivityOverflowButtonDrawable); + + attributesArray.recycle(); + + LayoutInflater inflater = LayoutInflater.from(mContext); + inflater.inflate(R.layout.abs__activity_chooser_view, this, true); + + mCallbacks = new Callbacks(); + + mActivityChooserContent = (IcsLinearLayout) findViewById(R.id.abs__activity_chooser_view_content); + mActivityChooserContentBackground = mActivityChooserContent.getBackground(); + + mDefaultActivityButton = (FrameLayout) findViewById(R.id.abs__default_activity_button); + mDefaultActivityButton.setOnClickListener(mCallbacks); + mDefaultActivityButton.setOnLongClickListener(mCallbacks); + mDefaultActivityButtonImage = (ImageView) mDefaultActivityButton.findViewById(R.id.abs__image); + + mExpandActivityOverflowButton = (FrameLayout) findViewById(R.id.abs__expand_activities_button); + mExpandActivityOverflowButton.setOnClickListener(mCallbacks); + mExpandActivityOverflowButtonImage = + (ImageView) mExpandActivityOverflowButton.findViewById(R.id.abs__image); + mExpandActivityOverflowButtonImage.setImageDrawable(expandActivityOverflowButtonDrawable); + + mAdapter = new ActivityChooserViewAdapter(); + mAdapter.registerDataSetObserver(new DataSetObserver() { + @Override + public void onChanged() { + super.onChanged(); + updateAppearance(); + } + }); + + Resources resources = context.getResources(); + mListPopupMaxWidth = Math.max(resources.getDisplayMetrics().widthPixels / 2, + resources.getDimensionPixelSize(R.dimen.abs__config_prefDialogWidth)); + } + + /** + * {@inheritDoc} + */ + public void setActivityChooserModel(ActivityChooserModel dataModel) { + mAdapter.setDataModel(dataModel); + if (isShowingPopup()) { + dismissPopup(); + showPopup(); + } + } + + /** + * Sets the background for the button that expands the activity + * overflow list. + * + * Note: Clients would like to set this drawable + * as a clue about the action the chosen activity will perform. For + * example, if a share activity is to be chosen the drawable should + * give a clue that sharing is to be performed. + * + * @param drawable The drawable. + */ + public void setExpandActivityOverflowButtonDrawable(Drawable drawable) { + mExpandActivityOverflowButtonImage.setImageDrawable(drawable); + } + + /** + * Sets the content description for the button that expands the activity + * overflow list. + * + * description as a clue about the action performed by the button. + * For example, if a share activity is to be chosen the content + * description should be something like "Share with". + * + * @param resourceId The content description resource id. + */ + public void setExpandActivityOverflowButtonContentDescription(int resourceId) { + CharSequence contentDescription = mContext.getString(resourceId); + mExpandActivityOverflowButtonImage.setContentDescription(contentDescription); + } + + /** + * Set the provider hosting this view, if applicable. + * @hide Internal use only + */ + public void setProvider(ActionProvider provider) { + mProvider = provider; + } + + /** + * Shows the popup window with activities. + * + * @return True if the popup was shown, false if already showing. + */ + public boolean showPopup() { + if (isShowingPopup() || !mIsAttachedToWindow) { + return false; + } + mIsSelectingDefaultActivity = false; + showPopupUnchecked(mInitialActivityCount); + return true; + } + + /** + * Shows the popup no matter if it was already showing. + * + * @param maxActivityCount The max number of activities to display. + */ + private void showPopupUnchecked(int maxActivityCount) { + if (mAdapter.getDataModel() == null) { + throw new IllegalStateException("No data model. Did you call #setDataModel?"); + } + + getViewTreeObserver().addOnGlobalLayoutListener(mOnGlobalLayoutListener); + + final boolean defaultActivityButtonShown = + mDefaultActivityButton.getVisibility() == VISIBLE; + + final int activityCount = mAdapter.getActivityCount(); + final int maxActivityCountOffset = defaultActivityButtonShown ? 1 : 0; + if (maxActivityCount != ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_UNLIMITED + && activityCount > maxActivityCount + maxActivityCountOffset) { + mAdapter.setShowFooterView(true); + mAdapter.setMaxActivityCount(maxActivityCount - 1); + } else { + mAdapter.setShowFooterView(false); + mAdapter.setMaxActivityCount(maxActivityCount); + } + + IcsListPopupWindow popupWindow = getListPopupWindow(); + if (!popupWindow.isShowing()) { + if (mIsSelectingDefaultActivity || !defaultActivityButtonShown) { + mAdapter.setShowDefaultActivity(true, defaultActivityButtonShown); + } else { + mAdapter.setShowDefaultActivity(false, false); + } + final int contentWidth = Math.min(mAdapter.measureContentWidth(), mListPopupMaxWidth); + popupWindow.setContentWidth(contentWidth); + popupWindow.show(); + if (mProvider != null) { + mProvider.subUiVisibilityChanged(true); + } + popupWindow.getListView().setContentDescription(mContext.getString( + R.string.abs__activitychooserview_choose_application)); + } + } + + /** + * Dismisses the popup window with activities. + * + * @return True if dismissed, false if already dismissed. + */ + public boolean dismissPopup() { + if (isShowingPopup()) { + getListPopupWindow().dismiss(); + ViewTreeObserver viewTreeObserver = getViewTreeObserver(); + if (viewTreeObserver.isAlive()) { + viewTreeObserver.removeGlobalOnLayoutListener(mOnGlobalLayoutListener); + } + } + return true; + } + + /** + * Gets whether the popup window with activities is shown. + * + * @return True if the popup is shown. + */ + public boolean isShowingPopup() { + return getListPopupWindow().isShowing(); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + ActivityChooserModel dataModel = mAdapter.getDataModel(); + if (dataModel != null) { + dataModel.registerObserver(mModelDataSetOberver); + } + mIsAttachedToWindow = true; + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + ActivityChooserModel dataModel = mAdapter.getDataModel(); + if (dataModel != null) { + try { + dataModel.unregisterObserver(mModelDataSetOberver); + } catch (IllegalStateException e) { + //Oh, well... fixes issue #557 + } + } + ViewTreeObserver viewTreeObserver = getViewTreeObserver(); + if (viewTreeObserver.isAlive()) { + viewTreeObserver.removeGlobalOnLayoutListener(mOnGlobalLayoutListener); + } + mIsAttachedToWindow = false; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + View child = mActivityChooserContent; + // If the default action is not visible we want to be as tall as the + // ActionBar so if this widget is used in the latter it will look as + // a normal action button. + if (mDefaultActivityButton.getVisibility() != VISIBLE) { + heightMeasureSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec), + MeasureSpec.EXACTLY); + } + measureChild(child, widthMeasureSpec, heightMeasureSpec); + setMeasuredDimension(child.getMeasuredWidth(), child.getMeasuredHeight()); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + mActivityChooserContent.layout(0, 0, right - left, bottom - top); + if (getListPopupWindow().isShowing()) { + showPopupUnchecked(mAdapter.getMaxActivityCount()); + } else { + dismissPopup(); + } + } + + public ActivityChooserModel getDataModel() { + return mAdapter.getDataModel(); + } + + /** + * Sets a listener to receive a callback when the popup is dismissed. + * + * @param listener The listener to be notified. + */ + public void setOnDismissListener(PopupWindow.OnDismissListener listener) { + mOnDismissListener = listener; + } + + /** + * Sets the initial count of items shown in the activities popup + * i.e. the items before the popup is expanded. This is an upper + * bound since it is not guaranteed that such number of intent + * handlers exist. + * + * @param itemCount The initial popup item count. + */ + public void setInitialActivityCount(int itemCount) { + mInitialActivityCount = itemCount; + } + + /** + * Sets a content description of the default action button. This + * resource should be a string taking one formatting argument and + * will be used for formatting the content description of the button + * dynamically as the default target changes. For example, a resource + * pointing to the string "share with %1$s" will result in a content + * description "share with Bluetooth" for the Bluetooth activity. + * + * @param resourceId The resource id. + */ + public void setDefaultActionButtonContentDescription(int resourceId) { + mDefaultActionButtonContentDescription = resourceId; + } + + /** + * Gets the list popup window which is lazily initialized. + * + * @return The popup. + */ + private IcsListPopupWindow getListPopupWindow() { + if (mListPopupWindow == null) { + mListPopupWindow = new IcsListPopupWindow(getContext()); + mListPopupWindow.setAdapter(mAdapter); + mListPopupWindow.setAnchorView(ActivityChooserView.this); + mListPopupWindow.setModal(true); + mListPopupWindow.setOnItemClickListener(mCallbacks); + mListPopupWindow.setOnDismissListener(mCallbacks); + } + return mListPopupWindow; + } + + /** + * Updates the buttons state. + */ + private void updateAppearance() { + // Expand overflow button. + if (mAdapter.getCount() > 0) { + mExpandActivityOverflowButton.setEnabled(true); + } else { + mExpandActivityOverflowButton.setEnabled(false); + } + // Default activity button. + final int activityCount = mAdapter.getActivityCount(); + final int historySize = mAdapter.getHistorySize(); + if (activityCount > 0 && historySize > 0) { + mDefaultActivityButton.setVisibility(VISIBLE); + ResolveInfo activity = mAdapter.getDefaultActivity(); + PackageManager packageManager = mContext.getPackageManager(); + mDefaultActivityButtonImage.setImageDrawable(activity.loadIcon(packageManager)); + if (mDefaultActionButtonContentDescription != 0) { + CharSequence label = activity.loadLabel(packageManager); + String contentDescription = mContext.getString( + mDefaultActionButtonContentDescription, label); + mDefaultActivityButton.setContentDescription(contentDescription); + } + } else { + mDefaultActivityButton.setVisibility(View.GONE); + } + // Activity chooser content. + if (mDefaultActivityButton.getVisibility() == VISIBLE) { + mActivityChooserContent.setBackgroundDrawable(mActivityChooserContentBackground); + } else { + mActivityChooserContent.setBackgroundDrawable(null); + mActivityChooserContent.setPadding(0, 0, 0, 0); + } + } + + /** + * Interface implementation to avoid publishing them in the APIs. + */ + private class Callbacks implements AdapterView.OnItemClickListener, + View.OnClickListener, View.OnLongClickListener, PopupWindow.OnDismissListener { + + // AdapterView#OnItemClickListener + public void onItemClick(AdapterView parent, View view, int position, long id) { + ActivityChooserViewAdapter adapter = (ActivityChooserViewAdapter) parent.getAdapter(); + final int itemViewType = adapter.getItemViewType(position); + switch (itemViewType) { + case ActivityChooserViewAdapter.ITEM_VIEW_TYPE_FOOTER: { + showPopupUnchecked(ActivityChooserViewAdapter.MAX_ACTIVITY_COUNT_UNLIMITED); + } break; + case ActivityChooserViewAdapter.ITEM_VIEW_TYPE_ACTIVITY: { + dismissPopup(); + if (mIsSelectingDefaultActivity) { + // The item at position zero is the default already. + if (position > 0) { + mAdapter.getDataModel().setDefaultActivity(position); + } + } else { + // If the default target is not shown in the list, the first + // item in the model is default action => adjust index + position = mAdapter.getShowDefaultActivity() ? position : position + 1; + Intent launchIntent = mAdapter.getDataModel().chooseActivity(position); + if (launchIntent != null) { + mContext.startActivity(launchIntent); + } + } + } break; + default: + throw new IllegalArgumentException(); + } + } + + // View.OnClickListener + public void onClick(View view) { + if (view == mDefaultActivityButton) { + dismissPopup(); + ResolveInfo defaultActivity = mAdapter.getDefaultActivity(); + final int index = mAdapter.getDataModel().getActivityIndex(defaultActivity); + Intent launchIntent = mAdapter.getDataModel().chooseActivity(index); + if (launchIntent != null) { + mContext.startActivity(launchIntent); + } + } else if (view == mExpandActivityOverflowButton) { + mIsSelectingDefaultActivity = false; + showPopupUnchecked(mInitialActivityCount); + } else { + throw new IllegalArgumentException(); + } + } + + // OnLongClickListener#onLongClick + @Override + public boolean onLongClick(View view) { + if (view == mDefaultActivityButton) { + if (mAdapter.getCount() > 0) { + mIsSelectingDefaultActivity = true; + showPopupUnchecked(mInitialActivityCount); + } + } else { + throw new IllegalArgumentException(); + } + return true; + } + + // PopUpWindow.OnDismissListener#onDismiss + public void onDismiss() { + notifyOnDismissListener(); + if (mProvider != null) { + mProvider.subUiVisibilityChanged(false); + } + } + + private void notifyOnDismissListener() { + if (mOnDismissListener != null) { + mOnDismissListener.onDismiss(); + } + } + } + + private static class SetActivated { + public static void invoke(View view, boolean activated) { + view.setActivated(activated); + } + } + + private static final boolean IS_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB; + + /** + * Adapter for backing the list of activities shown in the popup. + */ + private class ActivityChooserViewAdapter extends BaseAdapter { + + public static final int MAX_ACTIVITY_COUNT_UNLIMITED = Integer.MAX_VALUE; + + public static final int MAX_ACTIVITY_COUNT_DEFAULT = 4; + + private static final int ITEM_VIEW_TYPE_ACTIVITY = 0; + + private static final int ITEM_VIEW_TYPE_FOOTER = 1; + + private static final int ITEM_VIEW_TYPE_COUNT = 3; + + private ActivityChooserModel mDataModel; + + private int mMaxActivityCount = MAX_ACTIVITY_COUNT_DEFAULT; + + private boolean mShowDefaultActivity; + + private boolean mHighlightDefaultActivity; + + private boolean mShowFooterView; + + public void setDataModel(ActivityChooserModel dataModel) { + ActivityChooserModel oldDataModel = mAdapter.getDataModel(); + if (oldDataModel != null && isShown()) { + try { + oldDataModel.unregisterObserver(mModelDataSetOberver); + } catch (IllegalStateException e) { + //Oh, well... fixes issue #557 + } + } + mDataModel = dataModel; + if (dataModel != null && isShown()) { + dataModel.registerObserver(mModelDataSetOberver); + } + notifyDataSetChanged(); + } + + @Override + public int getItemViewType(int position) { + if (mShowFooterView && position == getCount() - 1) { + return ITEM_VIEW_TYPE_FOOTER; + } else { + return ITEM_VIEW_TYPE_ACTIVITY; + } + } + + @Override + public int getViewTypeCount() { + return ITEM_VIEW_TYPE_COUNT; + } + + public int getCount() { + int count = 0; + int activityCount = mDataModel.getActivityCount(); + if (!mShowDefaultActivity && mDataModel.getDefaultActivity() != null) { + activityCount--; + } + count = Math.min(activityCount, mMaxActivityCount); + if (mShowFooterView) { + count++; + } + return count; + } + + public Object getItem(int position) { + final int itemViewType = getItemViewType(position); + switch (itemViewType) { + case ITEM_VIEW_TYPE_FOOTER: + return null; + case ITEM_VIEW_TYPE_ACTIVITY: + if (!mShowDefaultActivity && mDataModel.getDefaultActivity() != null) { + position++; + } + return mDataModel.getActivity(position); + default: + throw new IllegalArgumentException(); + } + } + + public long getItemId(int position) { + return position; + } + + public View getView(int position, View convertView, ViewGroup parent) { + final int itemViewType = getItemViewType(position); + switch (itemViewType) { + case ITEM_VIEW_TYPE_FOOTER: + if (convertView == null || convertView.getId() != ITEM_VIEW_TYPE_FOOTER) { + convertView = LayoutInflater.from(getContext()).inflate( + R.layout.abs__activity_chooser_view_list_item, parent, false); + convertView.setId(ITEM_VIEW_TYPE_FOOTER); + TextView titleView = (TextView) convertView.findViewById(R.id.abs__title); + titleView.setText(mContext.getString( + R.string.abs__activity_chooser_view_see_all)); + } + return convertView; + case ITEM_VIEW_TYPE_ACTIVITY: + if (convertView == null || convertView.getId() != R.id.abs__list_item) { + convertView = LayoutInflater.from(getContext()).inflate( + R.layout.abs__activity_chooser_view_list_item, parent, false); + } + PackageManager packageManager = mContext.getPackageManager(); + // Set the icon + ImageView iconView = (ImageView) convertView.findViewById(R.id.abs__icon); + ResolveInfo activity = (ResolveInfo) getItem(position); + iconView.setImageDrawable(activity.loadIcon(packageManager)); + // Set the title. + TextView titleView = (TextView) convertView.findViewById(R.id.abs__title); + titleView.setText(activity.loadLabel(packageManager)); + if (IS_HONEYCOMB) { + // Highlight the default. + if (mShowDefaultActivity && position == 0 && mHighlightDefaultActivity) { + SetActivated.invoke(convertView, true); + } else { + SetActivated.invoke(convertView, false); + } + } + return convertView; + default: + throw new IllegalArgumentException(); + } + } + + public int measureContentWidth() { + // The user may have specified some of the target not to be shown but we + // want to measure all of them since after expansion they should fit. + final int oldMaxActivityCount = mMaxActivityCount; + mMaxActivityCount = MAX_ACTIVITY_COUNT_UNLIMITED; + + int contentWidth = 0; + View itemView = null; + + final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + final int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); + final int count = getCount(); + + for (int i = 0; i < count; i++) { + itemView = getView(i, itemView, null); + itemView.measure(widthMeasureSpec, heightMeasureSpec); + contentWidth = Math.max(contentWidth, itemView.getMeasuredWidth()); + } + + mMaxActivityCount = oldMaxActivityCount; + + return contentWidth; + } + + public void setMaxActivityCount(int maxActivityCount) { + if (mMaxActivityCount != maxActivityCount) { + mMaxActivityCount = maxActivityCount; + notifyDataSetChanged(); + } + } + + public ResolveInfo getDefaultActivity() { + return mDataModel.getDefaultActivity(); + } + + public void setShowFooterView(boolean showFooterView) { + if (mShowFooterView != showFooterView) { + mShowFooterView = showFooterView; + notifyDataSetChanged(); + } + } + + public int getActivityCount() { + return mDataModel.getActivityCount(); + } + + public int getHistorySize() { + return mDataModel.getHistorySize(); + } + + public int getMaxActivityCount() { + return mMaxActivityCount; + } + + public ActivityChooserModel getDataModel() { + return mDataModel; + } + + public void setShowDefaultActivity(boolean showDefaultActivity, + boolean highlightDefaultActivity) { + if (mShowDefaultActivity != showDefaultActivity + || mHighlightDefaultActivity != highlightDefaultActivity) { + mShowDefaultActivity = showDefaultActivity; + mHighlightDefaultActivity = highlightDefaultActivity; + notifyDataSetChanged(); + } + } + + public boolean getShowDefaultActivity() { + return mShowDefaultActivity; + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SearchView.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SearchView.java new file mode 100644 index 0000000000..c9e7897d43 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SearchView.java @@ -0,0 +1,1811 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.widget; + +import android.app.PendingIntent; +import android.app.SearchManager; +import android.app.SearchableInfo; +import android.content.ActivityNotFoundException; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.database.Cursor; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.ResultReceiver; +import android.speech.RecognizerIntent; +import android.support.v4.view.KeyEventCompat; +import android.support.v4.widget.CursorAdapter; +import android.text.Editable; +import android.text.InputType; +import android.text.Spannable; +import android.text.SpannableStringBuilder; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.text.style.ImageSpan; +import android.util.AttributeSet; +import android.util.Log; +import android.util.TypedValue; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewTreeObserver; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.AdapterView.OnItemSelectedListener; +import android.widget.AutoCompleteTextView; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.TextView.OnEditorActionListener; +import com.actionbarsherlock.R; +import com.actionbarsherlock.view.CollapsibleActionView; + +import java.lang.reflect.Method; +import java.util.WeakHashMap; + +import static com.actionbarsherlock.widget.SuggestionsAdapter.getColumnString; + +/** + * A widget that provides a user interface for the user to enter a search query and submit a request + * to a search provider. Shows a list of query suggestions or results, if available, and allows the + * user to pick a suggestion or result to launch into. + * + *

+ * When the SearchView is used in an ActionBar as an action view for a collapsible menu item, it + * needs to be set to iconified by default using {@link #setIconifiedByDefault(boolean) + * setIconifiedByDefault(true)}. This is the default, so nothing needs to be done. + *

+ *

+ * If you want the search field to always be visible, then call setIconifiedByDefault(false). + *

+ * + *
+ *

Developer Guides

+ *

For information about using {@code SearchView}, read the + * Search developer guide.

+ *
+ * + * @see android.view.MenuItem#SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW + * @attr ref android.R.styleable#SearchView_iconifiedByDefault + * @attr ref android.R.styleable#SearchView_imeOptions + * @attr ref android.R.styleable#SearchView_inputType + * @attr ref android.R.styleable#SearchView_maxWidth + * @attr ref android.R.styleable#SearchView_queryHint + */ +public class SearchView extends LinearLayout implements CollapsibleActionView { + + private static final boolean DBG = false; + private static final String LOG_TAG = "SearchView"; + + /** + * Private constant for removing the microphone in the keyboard. + */ + private static final String IME_OPTION_NO_MICROPHONE = "nm"; + + private OnQueryTextListener mOnQueryChangeListener; + private OnCloseListener mOnCloseListener; + private OnFocusChangeListener mOnQueryTextFocusChangeListener; + private OnSuggestionListener mOnSuggestionListener; + private OnClickListener mOnSearchClickListener; + + private boolean mIconifiedByDefault; + private boolean mIconified; + private CursorAdapter mSuggestionsAdapter; + private View mSearchButton; + private View mSubmitButton; + private View mSearchPlate; + private View mSubmitArea; + private ImageView mCloseButton; + private View mSearchEditFrame; + private View mVoiceButton; + private SearchAutoComplete mQueryTextView; + private View mDropDownAnchor; + private ImageView mSearchHintIcon; + private boolean mSubmitButtonEnabled; + private CharSequence mQueryHint; + private boolean mQueryRefinement; + private boolean mClearingFocus; + private int mMaxWidth; + private boolean mVoiceButtonEnabled; + private CharSequence mOldQueryText; + private CharSequence mUserQuery; + private boolean mExpandedInActionView; + private int mCollapsedImeOptions; + + private SearchableInfo mSearchable; + private Bundle mAppSearchData; + + /* + * SearchView can be set expanded before the IME is ready to be shown during + * initial UI setup. The show operation is asynchronous to account for this. + */ + private Runnable mShowImeRunnable = new Runnable() { + public void run() { + InputMethodManager imm = (InputMethodManager) + getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + + if (imm != null) { + showSoftInputUnchecked(SearchView.this, imm, 0); + } + } + }; + + private Runnable mUpdateDrawableStateRunnable = new Runnable() { + public void run() { + updateFocusedState(); + } + }; + + private Runnable mReleaseCursorRunnable = new Runnable() { + public void run() { + if (mSuggestionsAdapter != null && mSuggestionsAdapter instanceof SuggestionsAdapter) { + mSuggestionsAdapter.changeCursor(null); + } + } + }; + + // For voice searching + private final Intent mVoiceWebSearchIntent; + private final Intent mVoiceAppSearchIntent; + + // A weak map of drawables we've gotten from other packages, so we don't load them + // more than once. + private final WeakHashMap mOutsideDrawablesCache = + new WeakHashMap(); + + /** + * Callbacks for changes to the query text. + */ + public interface OnQueryTextListener { + + /** + * Called when the user submits the query. This could be due to a key press on the + * keyboard or due to pressing a submit button. + * The listener can override the standard behavior by returning true + * to indicate that it has handled the submit request. Otherwise return false to + * let the SearchView handle the submission by launching any associated intent. + * + * @param query the query text that is to be submitted + * + * @return true if the query has been handled by the listener, false to let the + * SearchView perform the default action. + */ + boolean onQueryTextSubmit(String query); + + /** + * Called when the query text is changed by the user. + * + * @param newText the new content of the query text field. + * + * @return false if the SearchView should perform the default action of showing any + * suggestions if available, true if the action was handled by the listener. + */ + boolean onQueryTextChange(String newText); + } + + public interface OnCloseListener { + + /** + * The user is attempting to close the SearchView. + * + * @return true if the listener wants to override the default behavior of clearing the + * text field and dismissing it, false otherwise. + */ + boolean onClose(); + } + + /** + * Callback interface for selection events on suggestions. These callbacks + * are only relevant when a SearchableInfo has been specified by {@link #setSearchableInfo}. + */ + public interface OnSuggestionListener { + + /** + * Called when a suggestion was selected by navigating to it. + * @param position the absolute position in the list of suggestions. + * + * @return true if the listener handles the event and wants to override the default + * behavior of possibly rewriting the query based on the selected item, false otherwise. + */ + boolean onSuggestionSelect(int position); + + /** + * Called when a suggestion was clicked. + * @param position the absolute position of the clicked item in the list of suggestions. + * + * @return true if the listener handles the event and wants to override the default + * behavior of launching any intent or submitting a search query specified on that item. + * Return false otherwise. + */ + boolean onSuggestionClick(int position); + } + + public SearchView(Context context) { + this(context, null); + } + + public SearchView(Context context, AttributeSet attrs) { + super(context, attrs); + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.FROYO) { + throw new IllegalStateException("SearchView is API 8+ only."); + } + + LayoutInflater inflater = (LayoutInflater) context + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + inflater.inflate(R.layout.abs__search_view, this, true); + + mSearchButton = findViewById(R.id.abs__search_button); + mQueryTextView = (SearchAutoComplete) findViewById(R.id.abs__search_src_text); + mQueryTextView.setSearchView(this); + + mSearchEditFrame = findViewById(R.id.abs__search_edit_frame); + mSearchPlate = findViewById(R.id.abs__search_plate); + mSubmitArea = findViewById(R.id.abs__submit_area); + mSubmitButton = findViewById(R.id.abs__search_go_btn); + mCloseButton = (ImageView) findViewById(R.id.abs__search_close_btn); + mVoiceButton = findViewById(R.id.abs__search_voice_btn); + mSearchHintIcon = (ImageView) findViewById(R.id.abs__search_mag_icon); + + mSearchButton.setOnClickListener(mOnClickListener); + mCloseButton.setOnClickListener(mOnClickListener); + mSubmitButton.setOnClickListener(mOnClickListener); + mVoiceButton.setOnClickListener(mOnClickListener); + mQueryTextView.setOnClickListener(mOnClickListener); + + mQueryTextView.addTextChangedListener(mTextWatcher); + mQueryTextView.setOnEditorActionListener(mOnEditorActionListener); + mQueryTextView.setOnItemClickListener(mOnItemClickListener); + mQueryTextView.setOnItemSelectedListener(mOnItemSelectedListener); + mQueryTextView.setOnKeyListener(mTextKeyListener); + // Inform any listener of focus changes + mQueryTextView.setOnFocusChangeListener(new OnFocusChangeListener() { + + public void onFocusChange(View v, boolean hasFocus) { + if (mOnQueryTextFocusChangeListener != null) { + mOnQueryTextFocusChangeListener.onFocusChange(SearchView.this, hasFocus); + } + } + }); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SherlockSearchView, 0, 0); + setIconifiedByDefault(a.getBoolean(R.styleable.SherlockSearchView_iconifiedByDefault, true)); + int maxWidth = a.getDimensionPixelSize(R.styleable.SherlockSearchView_android_maxWidth, -1); + if (maxWidth != -1) { + setMaxWidth(maxWidth); + } + CharSequence queryHint = a.getText(R.styleable.SherlockSearchView_queryHint); + if (!TextUtils.isEmpty(queryHint)) { + setQueryHint(queryHint); + } + int imeOptions = a.getInt(R.styleable.SherlockSearchView_android_imeOptions, -1); + if (imeOptions != -1) { + setImeOptions(imeOptions); + } + int inputType = a.getInt(R.styleable.SherlockSearchView_android_inputType, -1); + if (inputType != -1) { + setInputType(inputType); + } + + a.recycle(); + + boolean focusable = true; + + a = context.obtainStyledAttributes(attrs, R.styleable.SherlockView, 0, 0); + focusable = a.getBoolean(R.styleable.SherlockView_android_focusable, focusable); + a.recycle(); + setFocusable(focusable); + + // Save voice intent for later queries/launching + mVoiceWebSearchIntent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH); + mVoiceWebSearchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + mVoiceWebSearchIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, + RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH); + + mVoiceAppSearchIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); + mVoiceAppSearchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + mDropDownAnchor = findViewById(mQueryTextView.getDropDownAnchor()); + if (mDropDownAnchor != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + mDropDownAnchor.addOnLayoutChangeListener(new OnLayoutChangeListener() { + @Override + public void onLayoutChange(View v, int left, int top, int right, int bottom, + int oldLeft, int oldTop, int oldRight, int oldBottom) { + adjustDropDownSizeAndPosition(); + } + }); + } else { + mDropDownAnchor.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override public void onGlobalLayout() { + adjustDropDownSizeAndPosition(); + } + }); + } + } + + updateViewsVisibility(mIconifiedByDefault); + updateQueryHint(); + } + + /** + * Sets the SearchableInfo for this SearchView. Properties in the SearchableInfo are used + * to display labels, hints, suggestions, create intents for launching search results screens + * and controlling other affordances such as a voice button. + * + * @param searchable a SearchableInfo can be retrieved from the SearchManager, for a specific + * activity or a global search provider. + */ + public void setSearchableInfo(SearchableInfo searchable) { + mSearchable = searchable; + if (mSearchable != null) { + updateSearchAutoComplete(); + updateQueryHint(); + } + // Cache the voice search capability + mVoiceButtonEnabled = hasVoiceSearch(); + + if (mVoiceButtonEnabled) { + // Disable the microphone on the keyboard, as a mic is displayed near the text box + // TODO: use imeOptions to disable voice input when the new API will be available + mQueryTextView.setPrivateImeOptions(IME_OPTION_NO_MICROPHONE); + } + updateViewsVisibility(isIconified()); + } + + /** + * Sets the APP_DATA for legacy SearchDialog use. + * @param appSearchData bundle provided by the app when launching the search dialog + * @hide + */ + public void setAppSearchData(Bundle appSearchData) { + mAppSearchData = appSearchData; + } + + /** + * Sets the IME options on the query text field. + * + * @see TextView#setImeOptions(int) + * @param imeOptions the options to set on the query text field + * + * @attr ref android.R.styleable#SearchView_imeOptions + */ + public void setImeOptions(int imeOptions) { + mQueryTextView.setImeOptions(imeOptions); + } + + /** + * Returns the IME options set on the query text field. + * @return the ime options + * @see TextView#setImeOptions(int) + * + * @attr ref android.R.styleable#SearchView_imeOptions + */ + public int getImeOptions() { + return mQueryTextView.getImeOptions(); + } + + /** + * Sets the input type on the query text field. + * + * @see TextView#setInputType(int) + * @param inputType the input type to set on the query text field + * + * @attr ref android.R.styleable#SearchView_inputType + */ + public void setInputType(int inputType) { + mQueryTextView.setInputType(inputType); + } + + /** + * Returns the input type set on the query text field. + * @return the input type + * + * @attr ref android.R.styleable#SearchView_inputType + */ + public int getInputType() { + return mQueryTextView.getInputType(); + } + + /** @hide */ + @Override + public boolean requestFocus(int direction, Rect previouslyFocusedRect) { + // Don't accept focus if in the middle of clearing focus + if (mClearingFocus) return false; + // Check if SearchView is focusable. + if (!isFocusable()) return false; + // If it is not iconified, then give the focus to the text field + if (!isIconified()) { + boolean result = mQueryTextView.requestFocus(direction, previouslyFocusedRect); + if (result) { + updateViewsVisibility(false); + } + return result; + } else { + return super.requestFocus(direction, previouslyFocusedRect); + } + } + + /** @hide */ + @Override + public void clearFocus() { + mClearingFocus = true; + setImeVisibility(false); + super.clearFocus(); + mQueryTextView.clearFocus(); + mClearingFocus = false; + } + + /** + * Sets a listener for user actions within the SearchView. + * + * @param listener the listener object that receives callbacks when the user performs + * actions in the SearchView such as clicking on buttons or typing a query. + */ + public void setOnQueryTextListener(OnQueryTextListener listener) { + mOnQueryChangeListener = listener; + } + + /** + * Sets a listener to inform when the user closes the SearchView. + * + * @param listener the listener to call when the user closes the SearchView. + */ + public void setOnCloseListener(OnCloseListener listener) { + mOnCloseListener = listener; + } + + /** + * Sets a listener to inform when the focus of the query text field changes. + * + * @param listener the listener to inform of focus changes. + */ + public void setOnQueryTextFocusChangeListener(OnFocusChangeListener listener) { + mOnQueryTextFocusChangeListener = listener; + } + + /** + * Sets a listener to inform when a suggestion is focused or clicked. + * + * @param listener the listener to inform of suggestion selection events. + */ + public void setOnSuggestionListener(OnSuggestionListener listener) { + mOnSuggestionListener = listener; + } + + /** + * Sets a listener to inform when the search button is pressed. This is only + * relevant when the text field is not visible by default. Calling {@link #setIconified + * setIconified(false)} can also cause this listener to be informed. + * + * @param listener the listener to inform when the search button is clicked or + * the text field is programmatically de-iconified. + */ + public void setOnSearchClickListener(OnClickListener listener) { + mOnSearchClickListener = listener; + } + + /** + * Returns the query string currently in the text field. + * + * @return the query string + */ + public CharSequence getQuery() { + return mQueryTextView.getText(); + } + + /** + * Sets a query string in the text field and optionally submits the query as well. + * + * @param query the query string. This replaces any query text already present in the + * text field. + * @param submit whether to submit the query right now or only update the contents of + * text field. + */ + public void setQuery(CharSequence query, boolean submit) { + mQueryTextView.setText(query); + if (query != null) { + mQueryTextView.setSelection(mQueryTextView.length()); + mUserQuery = query; + } + + // If the query is not empty and submit is requested, submit the query + if (submit && !TextUtils.isEmpty(query)) { + onSubmitQuery(); + } + } + + /** + * Sets the hint text to display in the query text field. This overrides any hint specified + * in the SearchableInfo. + * + * @param hint the hint text to display + * + * @attr ref android.R.styleable#SearchView_queryHint + */ + public void setQueryHint(CharSequence hint) { + mQueryHint = hint; + updateQueryHint(); + } + + /** + * Gets the hint text to display in the query text field. + * @return the query hint text, if specified, null otherwise. + * + * @attr ref android.R.styleable#SearchView_queryHint + */ + public CharSequence getQueryHint() { + if (mQueryHint != null) { + return mQueryHint; + } else if (mSearchable != null) { + CharSequence hint = null; + int hintId = mSearchable.getHintId(); + if (hintId != 0) { + hint = getContext().getString(hintId); + } + return hint; + } + return null; + } + + /** + * Sets the default or resting state of the search field. If true, a single search icon is + * shown by default and expands to show the text field and other buttons when pressed. Also, + * if the default state is iconified, then it collapses to that state when the close button + * is pressed. Changes to this property will take effect immediately. + * + *

The default value is true.

+ * + * @param iconified whether the search field should be iconified by default + * + * @attr ref android.R.styleable#SearchView_iconifiedByDefault + */ + public void setIconifiedByDefault(boolean iconified) { + if (mIconifiedByDefault == iconified) return; + mIconifiedByDefault = iconified; + updateViewsVisibility(iconified); + updateQueryHint(); + } + + /** + * Returns the default iconified state of the search field. + * @return + * + * @attr ref android.R.styleable#SearchView_iconifiedByDefault + */ + public boolean isIconfiedByDefault() { + return mIconifiedByDefault; + } + + /** + * Iconifies or expands the SearchView. Any query text is cleared when iconified. This is + * a temporary state and does not override the default iconified state set by + * {@link #setIconifiedByDefault(boolean)}. If the default state is iconified, then + * a false here will only be valid until the user closes the field. And if the default + * state is expanded, then a true here will only clear the text field and not close it. + * + * @param iconify a true value will collapse the SearchView to an icon, while a false will + * expand it. + */ + public void setIconified(boolean iconify) { + if (iconify) { + onCloseClicked(); + } else { + onSearchClicked(); + } + } + + /** + * Returns the current iconified state of the SearchView. + * + * @return true if the SearchView is currently iconified, false if the search field is + * fully visible. + */ + public boolean isIconified() { + return mIconified; + } + + /** + * Enables showing a submit button when the query is non-empty. In cases where the SearchView + * is being used to filter the contents of the current activity and doesn't launch a separate + * results activity, then the submit button should be disabled. + * + * @param enabled true to show a submit button for submitting queries, false if a submit + * button is not required. + */ + public void setSubmitButtonEnabled(boolean enabled) { + mSubmitButtonEnabled = enabled; + updateViewsVisibility(isIconified()); + } + + /** + * Returns whether the submit button is enabled when necessary or never displayed. + * + * @return whether the submit button is enabled automatically when necessary + */ + public boolean isSubmitButtonEnabled() { + return mSubmitButtonEnabled; + } + + /** + * Specifies if a query refinement button should be displayed alongside each suggestion + * or if it should depend on the flags set in the individual items retrieved from the + * suggestions provider. Clicking on the query refinement button will replace the text + * in the query text field with the text from the suggestion. This flag only takes effect + * if a SearchableInfo has been specified with {@link #setSearchableInfo(SearchableInfo)} + * and not when using a custom adapter. + * + * @param enable true if all items should have a query refinement button, false if only + * those items that have a query refinement flag set should have the button. + * + * @see SearchManager#SUGGEST_COLUMN_FLAGS + * @see SearchManager#FLAG_QUERY_REFINEMENT + */ + public void setQueryRefinementEnabled(boolean enable) { + mQueryRefinement = enable; + if (mSuggestionsAdapter instanceof SuggestionsAdapter) { + ((SuggestionsAdapter) mSuggestionsAdapter).setQueryRefinement( + enable ? SuggestionsAdapter.REFINE_ALL : SuggestionsAdapter.REFINE_BY_ENTRY); + } + } + + /** + * Returns whether query refinement is enabled for all items or only specific ones. + * @return true if enabled for all items, false otherwise. + */ + public boolean isQueryRefinementEnabled() { + return mQueryRefinement; + } + + /** + * You can set a custom adapter if you wish. Otherwise the default adapter is used to + * display the suggestions from the suggestions provider associated with the SearchableInfo. + * + * @see #setSearchableInfo(SearchableInfo) + */ + public void setSuggestionsAdapter(CursorAdapter adapter) { + mSuggestionsAdapter = adapter; + + mQueryTextView.setAdapter(mSuggestionsAdapter); + } + + /** + * Returns the adapter used for suggestions, if any. + * @return the suggestions adapter + */ + public CursorAdapter getSuggestionsAdapter() { + return mSuggestionsAdapter; + } + + /** + * Makes the view at most this many pixels wide + * + * @attr ref android.R.styleable#SearchView_maxWidth + */ + public void setMaxWidth(int maxpixels) { + mMaxWidth = maxpixels; + + requestLayout(); + } + + /** + * Gets the specified maximum width in pixels, if set. Returns zero if + * no maximum width was specified. + * @return the maximum width of the view + * + * @attr ref android.R.styleable#SearchView_maxWidth + */ + public int getMaxWidth() { + return mMaxWidth; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // Let the standard measurements take effect in iconified state. + if (isIconified()) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + return; + } + + int widthMode = MeasureSpec.getMode(widthMeasureSpec); + int width = MeasureSpec.getSize(widthMeasureSpec); + + switch (widthMode) { + case MeasureSpec.AT_MOST: + // If there is an upper limit, don't exceed maximum width (explicit or implicit) + if (mMaxWidth > 0) { + width = Math.min(mMaxWidth, width); + } else { + width = Math.min(getPreferredWidth(), width); + } + break; + case MeasureSpec.EXACTLY: + // If an exact width is specified, still don't exceed any specified maximum width + if (mMaxWidth > 0) { + width = Math.min(mMaxWidth, width); + } + break; + case MeasureSpec.UNSPECIFIED: + // Use maximum width, if specified, else preferred width + width = mMaxWidth > 0 ? mMaxWidth : getPreferredWidth(); + break; + } + widthMode = MeasureSpec.EXACTLY; + super.onMeasure(MeasureSpec.makeMeasureSpec(width, widthMode), heightMeasureSpec); + } + + private int getPreferredWidth() { + return getContext().getResources() + .getDimensionPixelSize(R.dimen.abs__search_view_preferred_width); + } + + private void updateViewsVisibility(final boolean collapsed) { + mIconified = collapsed; + // Visibility of views that are visible when collapsed + final int visCollapsed = collapsed ? VISIBLE : GONE; + // Is there text in the query + final boolean hasText = !TextUtils.isEmpty(mQueryTextView.getText()); + + mSearchButton.setVisibility(visCollapsed); + updateSubmitButton(hasText); + mSearchEditFrame.setVisibility(collapsed ? GONE : VISIBLE); + mSearchHintIcon.setVisibility(mIconifiedByDefault ? GONE : VISIBLE); + updateCloseButton(); + updateVoiceButton(!hasText); + updateSubmitArea(); + } + + private boolean hasVoiceSearch() { + if (mSearchable != null && mSearchable.getVoiceSearchEnabled()) { + Intent testIntent = null; + if (mSearchable.getVoiceSearchLaunchWebSearch()) { + testIntent = mVoiceWebSearchIntent; + } else if (mSearchable.getVoiceSearchLaunchRecognizer()) { + testIntent = mVoiceAppSearchIntent; + } + if (testIntent != null) { + ResolveInfo ri = getContext().getPackageManager().resolveActivity(testIntent, + PackageManager.MATCH_DEFAULT_ONLY); + return ri != null; + } + } + return false; + } + + private boolean isSubmitAreaEnabled() { + return (mSubmitButtonEnabled || mVoiceButtonEnabled) && !isIconified(); + } + + private void updateSubmitButton(boolean hasText) { + int visibility = GONE; + if (mSubmitButtonEnabled && isSubmitAreaEnabled() && hasFocus() + && (hasText || !mVoiceButtonEnabled)) { + visibility = VISIBLE; + } + mSubmitButton.setVisibility(visibility); + } + + private void updateSubmitArea() { + int visibility = GONE; + if (isSubmitAreaEnabled() + && (mSubmitButton.getVisibility() == VISIBLE + || mVoiceButton.getVisibility() == VISIBLE)) { + visibility = VISIBLE; + } + mSubmitArea.setVisibility(visibility); + } + + private void updateCloseButton() { + final boolean hasText = !TextUtils.isEmpty(mQueryTextView.getText()); + // Should we show the close button? It is not shown if there's no focus, + // field is not iconified by default and there is no text in it. + final boolean showClose = hasText || (mIconifiedByDefault && !mExpandedInActionView); + mCloseButton.setVisibility(showClose ? VISIBLE : GONE); + mCloseButton.getDrawable().setState(hasText ? ENABLED_STATE_SET : EMPTY_STATE_SET); + } + + private void postUpdateFocusedState() { + post(mUpdateDrawableStateRunnable); + } + + private void updateFocusedState() { + boolean focused = mQueryTextView.hasFocus(); + mSearchPlate.getBackground().setState(focused ? FOCUSED_STATE_SET : EMPTY_STATE_SET); + mSubmitArea.getBackground().setState(focused ? FOCUSED_STATE_SET : EMPTY_STATE_SET); + invalidate(); + } + + @Override + protected void onDetachedFromWindow() { + removeCallbacks(mUpdateDrawableStateRunnable); + post(mReleaseCursorRunnable); + super.onDetachedFromWindow(); + } + + private void setImeVisibility(final boolean visible) { + if (visible) { + post(mShowImeRunnable); + } else { + removeCallbacks(mShowImeRunnable); + InputMethodManager imm = (InputMethodManager) + getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + + if (imm != null) { + imm.hideSoftInputFromWindow(getWindowToken(), 0); + } + } + } + + /** + * Called by the SuggestionsAdapter + * @hide + */ + /* package */void onQueryRefine(CharSequence queryText) { + setQuery(queryText); + } + + private final OnClickListener mOnClickListener = new OnClickListener() { + + public void onClick(View v) { + if (v == mSearchButton) { + onSearchClicked(); + } else if (v == mCloseButton) { + onCloseClicked(); + } else if (v == mSubmitButton) { + onSubmitQuery(); + } else if (v == mVoiceButton) { + onVoiceClicked(); + } else if (v == mQueryTextView) { + forceSuggestionQuery(); + } + } + }; + + /** + * Handles the key down event for dealing with action keys. + * + * @param keyCode This is the keycode of the typed key, and is the same value as + * found in the KeyEvent parameter. + * @param event The complete event record for the typed key + * + * @return true if the event was handled here, or false if not. + */ + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (mSearchable == null) { + return false; + } + + // if it's an action specified by the searchable activity, launch the + // entered query with the action key + // TODO SearchableInfo.ActionKeyInfo actionKey = mSearchable.findActionKey(keyCode); + // TODO if ((actionKey != null) && (actionKey.getQueryActionMsg() != null)) { + // TODO launchQuerySearch(keyCode, actionKey.getQueryActionMsg(), mQueryTextView.getText() + // TODO .toString()); + // TODO return true; + // TODO } + + return super.onKeyDown(keyCode, event); + } + + /** + * React to the user typing "enter" or other hardwired keys while typing in + * the search box. This handles these special keys while the edit box has + * focus. + */ + View.OnKeyListener mTextKeyListener = new View.OnKeyListener() { + public boolean onKey(View v, int keyCode, KeyEvent event) { + // guard against possible race conditions + if (mSearchable == null) { + return false; + } + + if (DBG) { + Log.d(LOG_TAG, "mTextListener.onKey(" + keyCode + "," + event + "), selection: " + + mQueryTextView.getListSelection()); + } + + // If a suggestion is selected, handle enter, search key, and action keys + // as presses on the selected suggestion + if (mQueryTextView.isPopupShowing() + && mQueryTextView.getListSelection() != ListView.INVALID_POSITION) { + return onSuggestionsKey(v, keyCode, event); + } + + // If there is text in the query box, handle enter, and action keys + // The search key is handled by the dialog's onKeyDown(). + if (!mQueryTextView.isEmpty() && KeyEventCompat.hasNoModifiers(event)) { + if (event.getAction() == KeyEvent.ACTION_UP) { + if (keyCode == KeyEvent.KEYCODE_ENTER) { + v.cancelLongPress(); + + // Launch as a regular search. + launchQuerySearch(KeyEvent.KEYCODE_UNKNOWN, null, mQueryTextView.getText() + .toString()); + return true; + } + } + if (event.getAction() == KeyEvent.ACTION_DOWN) { + // TODO SearchableInfo.ActionKeyInfo actionKey = mSearchable.findActionKey(keyCode); + // TODO if ((actionKey != null) && (actionKey.getQueryActionMsg() != null)) { + // TODO launchQuerySearch(keyCode, actionKey.getQueryActionMsg(), mQueryTextView + // TODO .getText().toString()); + // TODO return true; + // TODO } + } + } + return false; + } + }; + + /** + * React to the user typing while in the suggestions list. First, check for + * action keys. If not handled, try refocusing regular characters into the + * EditText. + */ + private boolean onSuggestionsKey(View v, int keyCode, KeyEvent event) { + // guard against possible race conditions (late arrival after dismiss) + if (mSearchable == null) { + return false; + } + if (mSuggestionsAdapter == null) { + return false; + } + if (event.getAction() == KeyEvent.ACTION_DOWN && KeyEventCompat.hasNoModifiers(event)) { + // First, check for enter or search (both of which we'll treat as a + // "click") + if (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_SEARCH + || keyCode == KeyEvent.KEYCODE_TAB) { + int position = mQueryTextView.getListSelection(); + return onItemClicked(position, KeyEvent.KEYCODE_UNKNOWN, null); + } + + // Next, check for left/right moves, which we use to "return" the + // user to the edit view + if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT || keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) { + // give "focus" to text editor, with cursor at the beginning if + // left key, at end if right key + // TODO: Reverse left/right for right-to-left languages, e.g. + // Arabic + int selPoint = (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) ? 0 : mQueryTextView + .length(); + mQueryTextView.setSelection(selPoint); + mQueryTextView.setListSelection(0); + mQueryTextView.clearListSelection(); + ensureImeVisible(mQueryTextView, true); + + return true; + } + + // Next, check for an "up and out" move + if (keyCode == KeyEvent.KEYCODE_DPAD_UP && 0 == mQueryTextView.getListSelection()) { + // TODO: restoreUserQuery(); + // let ACTV complete the move + return false; + } + + // Next, check for an "action key" + // TODO SearchableInfo.ActionKeyInfo actionKey = mSearchable.findActionKey(keyCode); + // TODO if ((actionKey != null) + // TODO && ((actionKey.getSuggestActionMsg() != null) || (actionKey + // TODO .getSuggestActionMsgColumn() != null))) { + // TODO // launch suggestion using action key column + // TODO int position = mQueryTextView.getListSelection(); + // TODO if (position != ListView.INVALID_POSITION) { + // TODO Cursor c = mSuggestionsAdapter.getCursor(); + // TODO if (c.moveToPosition(position)) { + // TODO final String actionMsg = getActionKeyMessage(c, actionKey); + // TODO if (actionMsg != null && (actionMsg.length() > 0)) { + // TODO return onItemClicked(position, keyCode, actionMsg); + // TODO } + // TODO } + // TODO } + // TODO } + } + return false; + } + + /** + * For a given suggestion and a given cursor row, get the action message. If + * not provided by the specific row/column, also check for a single + * definition (for the action key). + * + * @param c The cursor providing suggestions + * @param actionKey The actionkey record being examined + * + * @return Returns a string, or null if no action key message for this + * suggestion + */ + // TODO private static String getActionKeyMessage(Cursor c, SearchableInfo.ActionKeyInfo actionKey) { + // TODO String result = null; + // TODO // check first in the cursor data, for a suggestion-specific message + // TODO final String column = actionKey.getSuggestActionMsgColumn(); + // TODO if (column != null) { + // TODO result = SuggestionsAdapter.getColumnString(c, column); + // TODO } + // TODO // If the cursor didn't give us a message, see if there's a single + // TODO // message defined + // TODO // for the actionkey (for all suggestions) + // TODO if (result == null) { + // TODO result = actionKey.getSuggestActionMsg(); + // TODO } + // TODO return result; + // TODO } + + private int getSearchIconId() { + TypedValue outValue = new TypedValue(); + getContext().getTheme().resolveAttribute(R.attr.searchViewSearchIcon, + outValue, true); + return outValue.resourceId; + } + + private CharSequence getDecoratedHint(CharSequence hintText) { + // If the field is always expanded, then don't add the search icon to the hint + if (!mIconifiedByDefault) return hintText; + + SpannableStringBuilder ssb = new SpannableStringBuilder(" "); // for the icon + ssb.append(hintText); + Drawable searchIcon = getContext().getResources().getDrawable(getSearchIconId()); + int textSize = (int) (mQueryTextView.getTextSize() * 1.25); + searchIcon.setBounds(0, 0, textSize, textSize); + ssb.setSpan(new ImageSpan(searchIcon), 1, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + return ssb; + } + + private void updateQueryHint() { + if (mQueryHint != null) { + mQueryTextView.setHint(getDecoratedHint(mQueryHint)); + } else if (mSearchable != null) { + CharSequence hint = null; + int hintId = mSearchable.getHintId(); + if (hintId != 0) { + hint = getContext().getString(hintId); + } + if (hint != null) { + mQueryTextView.setHint(getDecoratedHint(hint)); + } + } else { + mQueryTextView.setHint(getDecoratedHint("")); + } + } + + /** + * Updates the auto-complete text view. + */ + private void updateSearchAutoComplete() { + // TODO mQueryTextView.setDropDownAnimationStyle(0); // no animation + mQueryTextView.setThreshold(mSearchable.getSuggestThreshold()); + mQueryTextView.setImeOptions(mSearchable.getImeOptions()); + int inputType = mSearchable.getInputType(); + // We only touch this if the input type is set up for text (which it almost certainly + // should be, in the case of search!) + if ((inputType & InputType.TYPE_MASK_CLASS) == InputType.TYPE_CLASS_TEXT) { + // The existence of a suggestions authority is the proxy for "suggestions + // are available here" + inputType &= ~InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE; + if (mSearchable.getSuggestAuthority() != null) { + inputType |= InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE; + // TYPE_TEXT_FLAG_AUTO_COMPLETE means that the text editor is performing + // auto-completion based on its own semantics, which it will present to the user + // as they type. This generally means that the input method should not show its + // own candidates, and the spell checker should not be in action. The text editor + // supplies its candidates by calling InputMethodManager.displayCompletions(), + // which in turn will call InputMethodSession.displayCompletions(). + inputType |= InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS; + } + } + mQueryTextView.setInputType(inputType); + if (mSuggestionsAdapter != null) { + mSuggestionsAdapter.changeCursor(null); + } + // attach the suggestions adapter, if suggestions are available + // The existence of a suggestions authority is the proxy for "suggestions available here" + if (mSearchable.getSuggestAuthority() != null) { + mSuggestionsAdapter = new SuggestionsAdapter(getContext(), + this, mSearchable, mOutsideDrawablesCache); + mQueryTextView.setAdapter(mSuggestionsAdapter); + ((SuggestionsAdapter) mSuggestionsAdapter).setQueryRefinement( + mQueryRefinement ? SuggestionsAdapter.REFINE_ALL + : SuggestionsAdapter.REFINE_BY_ENTRY); + } + } + + /** + * Update the visibility of the voice button. There are actually two voice search modes, + * either of which will activate the button. + * @param empty whether the search query text field is empty. If it is, then the other + * criteria apply to make the voice button visible. + */ + private void updateVoiceButton(boolean empty) { + int visibility = GONE; + if (mVoiceButtonEnabled && !isIconified() && empty) { + visibility = VISIBLE; + mSubmitButton.setVisibility(GONE); + } + mVoiceButton.setVisibility(visibility); + } + + private final OnEditorActionListener mOnEditorActionListener = new OnEditorActionListener() { + + /** + * Called when the input method default action key is pressed. + */ + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + onSubmitQuery(); + return true; + } + }; + + private void onTextChanged(CharSequence newText) { + CharSequence text = mQueryTextView.getText(); + mUserQuery = text; + boolean hasText = !TextUtils.isEmpty(text); + updateSubmitButton(hasText); + updateVoiceButton(!hasText); + updateCloseButton(); + updateSubmitArea(); + if (mOnQueryChangeListener != null && !TextUtils.equals(newText, mOldQueryText)) { + mOnQueryChangeListener.onQueryTextChange(newText.toString()); + } + mOldQueryText = newText.toString(); + } + + private void onSubmitQuery() { + CharSequence query = mQueryTextView.getText(); + if (query != null && TextUtils.getTrimmedLength(query) > 0) { + if (mOnQueryChangeListener == null + || !mOnQueryChangeListener.onQueryTextSubmit(query.toString())) { + if (mSearchable != null) { + launchQuerySearch(KeyEvent.KEYCODE_UNKNOWN, null, query.toString()); + setImeVisibility(false); + } + dismissSuggestions(); + } + } + } + + private void dismissSuggestions() { + mQueryTextView.dismissDropDown(); + } + + private void onCloseClicked() { + CharSequence text = mQueryTextView.getText(); + if (TextUtils.isEmpty(text)) { + if (mIconifiedByDefault) { + // If the app doesn't override the close behavior + if (mOnCloseListener == null || !mOnCloseListener.onClose()) { + // hide the keyboard and remove focus + clearFocus(); + // collapse the search field + updateViewsVisibility(true); + } + } + } else { + mQueryTextView.setText(""); + mQueryTextView.requestFocus(); + setImeVisibility(true); + } + + } + + private void onSearchClicked() { + updateViewsVisibility(false); + mQueryTextView.requestFocus(); + setImeVisibility(true); + if (mOnSearchClickListener != null) { + mOnSearchClickListener.onClick(this); + } + } + + private void onVoiceClicked() { + // guard against possible race conditions + if (mSearchable == null) { + return; + } + SearchableInfo searchable = mSearchable; + try { + if (searchable.getVoiceSearchLaunchWebSearch()) { + Intent webSearchIntent = createVoiceWebSearchIntent(mVoiceWebSearchIntent, + searchable); + getContext().startActivity(webSearchIntent); + } else if (searchable.getVoiceSearchLaunchRecognizer()) { + Intent appSearchIntent = createVoiceAppSearchIntent(mVoiceAppSearchIntent, + searchable); + getContext().startActivity(appSearchIntent); + } + } catch (ActivityNotFoundException e) { + // Should not happen, since we check the availability of + // voice search before showing the button. But just in case... + Log.w(LOG_TAG, "Could not find voice search activity"); + } + } + + void onTextFocusChanged() { + updateViewsVisibility(isIconified()); + // Delayed update to make sure that the focus has settled down and window focus changes + // don't affect it. A synchronous update was not working. + postUpdateFocusedState(); + if (mQueryTextView.hasFocus()) { + forceSuggestionQuery(); + } + } + + @Override + public void onWindowFocusChanged(boolean hasWindowFocus) { + super.onWindowFocusChanged(hasWindowFocus); + + postUpdateFocusedState(); + } + + /** + * {@inheritDoc} + */ + @Override + public void onActionViewCollapsed() { + clearFocus(); + updateViewsVisibility(true); + mQueryTextView.setImeOptions(mCollapsedImeOptions); + mExpandedInActionView = false; + } + + /** + * {@inheritDoc} + */ + @Override + public void onActionViewExpanded() { + if (mExpandedInActionView) return; + + mExpandedInActionView = true; + mCollapsedImeOptions = mQueryTextView.getImeOptions(); + mQueryTextView.setImeOptions(mCollapsedImeOptions | EditorInfo.IME_FLAG_NO_FULLSCREEN); + mQueryTextView.setText(""); + setIconified(false); + } + + @Override + public void onInitializeAccessibilityEvent(AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(event); + event.setClassName(SearchView.class.getName()); + } + + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(SearchView.class.getName()); + } + + private void adjustDropDownSizeAndPosition() { + if (mDropDownAnchor.getWidth() > 1) { + Resources res = getContext().getResources(); + int anchorPadding = mSearchPlate.getPaddingLeft(); + Rect dropDownPadding = new Rect(); + int iconOffset = mIconifiedByDefault + ? res.getDimensionPixelSize(R.dimen.abs__dropdownitem_icon_width) + + res.getDimensionPixelSize(R.dimen.abs__dropdownitem_text_padding_left) + : 0; + mQueryTextView.getDropDownBackground().getPadding(dropDownPadding); + mQueryTextView.setDropDownHorizontalOffset(-(dropDownPadding.left + iconOffset) + + anchorPadding); + mQueryTextView.setDropDownWidth(mDropDownAnchor.getWidth() + dropDownPadding.left + + dropDownPadding.right + iconOffset - (anchorPadding)); + } + } + + private boolean onItemClicked(int position, int actionKey, String actionMsg) { + if (mOnSuggestionListener == null + || !mOnSuggestionListener.onSuggestionClick(position)) { + launchSuggestion(position, KeyEvent.KEYCODE_UNKNOWN, null); + setImeVisibility(false); + dismissSuggestions(); + return true; + } + return false; + } + + private boolean onItemSelected(int position) { + if (mOnSuggestionListener == null + || !mOnSuggestionListener.onSuggestionSelect(position)) { + rewriteQueryFromSuggestion(position); + return true; + } + return false; + } + + private final OnItemClickListener mOnItemClickListener = new OnItemClickListener() { + + /** + * Implements OnItemClickListener + */ + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (DBG) Log.d(LOG_TAG, "onItemClick() position " + position); + onItemClicked(position, KeyEvent.KEYCODE_UNKNOWN, null); + } + }; + + private final OnItemSelectedListener mOnItemSelectedListener = new OnItemSelectedListener() { + + /** + * Implements OnItemSelectedListener + */ + public void onItemSelected(AdapterView parent, View view, int position, long id) { + if (DBG) Log.d(LOG_TAG, "onItemSelected() position " + position); + SearchView.this.onItemSelected(position); + } + + /** + * Implements OnItemSelectedListener + */ + public void onNothingSelected(AdapterView parent) { + if (DBG) + Log.d(LOG_TAG, "onNothingSelected()"); + } + }; + + /** + * Query rewriting. + */ + private void rewriteQueryFromSuggestion(int position) { + CharSequence oldQuery = mQueryTextView.getText(); + Cursor c = mSuggestionsAdapter.getCursor(); + if (c == null) { + return; + } + if (c.moveToPosition(position)) { + // Get the new query from the suggestion. + CharSequence newQuery = mSuggestionsAdapter.convertToString(c); + if (newQuery != null) { + // The suggestion rewrites the query. + // Update the text field, without getting new suggestions. + setQuery(newQuery); + } else { + // The suggestion does not rewrite the query, restore the user's query. + setQuery(oldQuery); + } + } else { + // We got a bad position, restore the user's query. + setQuery(oldQuery); + } + } + + /** + * Launches an intent based on a suggestion. + * + * @param position The index of the suggestion to create the intent from. + * @param actionKey The key code of the action key that was pressed, + * or {@link KeyEvent#KEYCODE_UNKNOWN} if none. + * @param actionMsg The message for the action key that was pressed, + * or null if none. + * @return true if a successful launch, false if could not (e.g. bad position). + */ + private boolean launchSuggestion(int position, int actionKey, String actionMsg) { + Cursor c = mSuggestionsAdapter.getCursor(); + if ((c != null) && c.moveToPosition(position)) { + + Intent intent = createIntentFromSuggestion(c, actionKey, actionMsg); + + // launch the intent + launchIntent(intent); + + return true; + } + return false; + } + + /** + * Launches an intent, including any special intent handling. + */ + private void launchIntent(Intent intent) { + if (intent == null) { + return; + } + try { + // If the intent was created from a suggestion, it will always have an explicit + // component here. + getContext().startActivity(intent); + } catch (RuntimeException ex) { + Log.e(LOG_TAG, "Failed launch activity: " + intent, ex); + } + } + + /** + * Sets the text in the query box, without updating the suggestions. + */ + private void setQuery(CharSequence query) { + setText(mQueryTextView, query, true); + // Move the cursor to the end + mQueryTextView.setSelection(TextUtils.isEmpty(query) ? 0 : query.length()); + } + + private void launchQuerySearch(int actionKey, String actionMsg, String query) { + String action = Intent.ACTION_SEARCH; + Intent intent = createIntent(action, null, null, query, actionKey, actionMsg); + getContext().startActivity(intent); + } + + /** + * Constructs an intent from the given information and the search dialog state. + * + * @param action Intent action. + * @param data Intent data, or null. + * @param extraData Data for {@link SearchManager#EXTRA_DATA_KEY} or null. + * @param query Intent query, or null. + * @param actionKey The key code of the action key that was pressed, + * or {@link KeyEvent#KEYCODE_UNKNOWN} if none. + * @param actionMsg The message for the action key that was pressed, + * or null if none. + * @return The intent. + */ + private Intent createIntent(String action, Uri data, String extraData, String query, + int actionKey, String actionMsg) { + // Now build the Intent + Intent intent = new Intent(action); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + // We need CLEAR_TOP to avoid reusing an old task that has other activities + // on top of the one we want. We don't want to do this in in-app search though, + // as it can be destructive to the activity stack. + if (data != null) { + intent.setData(data); + } + intent.putExtra(SearchManager.USER_QUERY, mUserQuery); + if (query != null) { + intent.putExtra(SearchManager.QUERY, query); + } + if (extraData != null) { + intent.putExtra(SearchManager.EXTRA_DATA_KEY, extraData); + } + if (mAppSearchData != null) { + intent.putExtra(SearchManager.APP_DATA, mAppSearchData); + } + if (actionKey != KeyEvent.KEYCODE_UNKNOWN) { + intent.putExtra(SearchManager.ACTION_KEY, actionKey); + intent.putExtra(SearchManager.ACTION_MSG, actionMsg); + } + intent.setComponent(mSearchable.getSearchActivity()); + return intent; + } + + /** + * Create and return an Intent that can launch the voice search activity for web search. + */ + private Intent createVoiceWebSearchIntent(Intent baseIntent, SearchableInfo searchable) { + Intent voiceIntent = new Intent(baseIntent); + ComponentName searchActivity = searchable.getSearchActivity(); + voiceIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, searchActivity == null ? null + : searchActivity.flattenToShortString()); + return voiceIntent; + } + + /** + * Create and return an Intent that can launch the voice search activity, perform a specific + * voice transcription, and forward the results to the searchable activity. + * + * @param baseIntent The voice app search intent to start from + * @return A completely-configured intent ready to send to the voice search activity + */ + private Intent createVoiceAppSearchIntent(Intent baseIntent, SearchableInfo searchable) { + ComponentName searchActivity = searchable.getSearchActivity(); + + // create the necessary intent to set up a search-and-forward operation + // in the voice search system. We have to keep the bundle separate, + // because it becomes immutable once it enters the PendingIntent + Intent queryIntent = new Intent(Intent.ACTION_SEARCH); + queryIntent.setComponent(searchActivity); + PendingIntent pending = PendingIntent.getActivity(getContext(), 0, queryIntent, + PendingIntent.FLAG_ONE_SHOT); + + // Now set up the bundle that will be inserted into the pending intent + // when it's time to do the search. We always build it here (even if empty) + // because the voice search activity will always need to insert "QUERY" into + // it anyway. + Bundle queryExtras = new Bundle(); + + // Now build the intent to launch the voice search. Add all necessary + // extras to launch the voice recognizer, and then all the necessary extras + // to forward the results to the searchable activity + Intent voiceIntent = new Intent(baseIntent); + + // Add all of the configuration options supplied by the searchable's metadata + String languageModel = RecognizerIntent.LANGUAGE_MODEL_FREE_FORM; + String prompt = null; + String language = null; + int maxResults = 1; + + Resources resources = getResources(); + if (searchable.getVoiceLanguageModeId() != 0) { + languageModel = resources.getString(searchable.getVoiceLanguageModeId()); + } + if (searchable.getVoicePromptTextId() != 0) { + prompt = resources.getString(searchable.getVoicePromptTextId()); + } + if (searchable.getVoiceLanguageId() != 0) { + language = resources.getString(searchable.getVoiceLanguageId()); + } + if (searchable.getVoiceMaxResults() != 0) { + maxResults = searchable.getVoiceMaxResults(); + } + voiceIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, languageModel); + voiceIntent.putExtra(RecognizerIntent.EXTRA_PROMPT, prompt); + voiceIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, language); + voiceIntent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, maxResults); + voiceIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, searchActivity == null ? null + : searchActivity.flattenToShortString()); + + // Add the values that configure forwarding the results + voiceIntent.putExtra(RecognizerIntent.EXTRA_RESULTS_PENDINGINTENT, pending); + voiceIntent.putExtra(RecognizerIntent.EXTRA_RESULTS_PENDINGINTENT_BUNDLE, queryExtras); + + return voiceIntent; + } + + /** + * When a particular suggestion has been selected, perform the various lookups required + * to use the suggestion. This includes checking the cursor for suggestion-specific data, + * and/or falling back to the XML for defaults; It also creates REST style Uri data when + * the suggestion includes a data id. + * + * @param c The suggestions cursor, moved to the row of the user's selection + * @param actionKey The key code of the action key that was pressed, + * or {@link KeyEvent#KEYCODE_UNKNOWN} if none. + * @param actionMsg The message for the action key that was pressed, + * or null if none. + * @return An intent for the suggestion at the cursor's position. + */ + private Intent createIntentFromSuggestion(Cursor c, int actionKey, String actionMsg) { + try { + // use specific action if supplied, or default action if supplied, or fixed default + String action = getColumnString(c, SearchManager.SUGGEST_COLUMN_INTENT_ACTION); + + if (action == null) { + action = mSearchable.getSuggestIntentAction(); + } + if (action == null) { + action = Intent.ACTION_SEARCH; + } + + // use specific data if supplied, or default data if supplied + String data = getColumnString(c, SearchManager.SUGGEST_COLUMN_INTENT_DATA); + if (data == null) { + data = mSearchable.getSuggestIntentData(); + } + // then, if an ID was provided, append it. + if (data != null) { + String id = getColumnString(c, SearchManager.SUGGEST_COLUMN_INTENT_DATA_ID); + if (id != null) { + data = data + "/" + Uri.encode(id); + } + } + Uri dataUri = (data == null) ? null : Uri.parse(data); + + String query = getColumnString(c, SearchManager.SUGGEST_COLUMN_QUERY); + String extraData = getColumnString(c, SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA); + + return createIntent(action, dataUri, extraData, query, actionKey, actionMsg); + } catch (RuntimeException e ) { + int rowNum; + try { // be really paranoid now + rowNum = c.getPosition(); + } catch (RuntimeException e2 ) { + rowNum = -1; + } + Log.w(LOG_TAG, "Search suggestions cursor at row " + rowNum + + " returned exception.", e); + return null; + } + } + + private void forceSuggestionQuery() { + try { + Method before = SearchAutoComplete.class.getMethod("doBeforeTextChanged"); + Method after = SearchAutoComplete.class.getMethod("doAfterTextChanged"); + before.setAccessible(true); + after.setAccessible(true); + before.invoke(mQueryTextView); + after.invoke(mQueryTextView); + } catch (Exception e) { + // Oh well... + } + } + + static boolean isLandscapeMode(Context context) { + return context.getResources().getConfiguration().orientation + == Configuration.ORIENTATION_LANDSCAPE; + } + + /** + * Callback to watch the text field for empty/non-empty + */ + private TextWatcher mTextWatcher = new TextWatcher() { + + public void beforeTextChanged(CharSequence s, int start, int before, int after) { } + + public void onTextChanged(CharSequence s, int start, + int before, int after) { + SearchView.this.onTextChanged(s); + } + + public void afterTextChanged(Editable s) { + } + }; + + /** + * Local subclass for AutoCompleteTextView. + * @hide + */ + public static class SearchAutoComplete extends AutoCompleteTextView { + + private int mThreshold; + private SearchView mSearchView; + + public SearchAutoComplete(Context context) { + super(context); + mThreshold = getThreshold(); + } + + public SearchAutoComplete(Context context, AttributeSet attrs) { + super(context, attrs); + mThreshold = getThreshold(); + } + + public SearchAutoComplete(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mThreshold = getThreshold(); + } + + void setSearchView(SearchView searchView) { + mSearchView = searchView; + } + + @Override + public void setThreshold(int threshold) { + super.setThreshold(threshold); + mThreshold = threshold; + } + + /** + * Returns true if the text field is empty, or contains only whitespace. + */ + private boolean isEmpty() { + return TextUtils.getTrimmedLength(getText()) == 0; + } + + /** + * We override this method to avoid replacing the query box text when a + * suggestion is clicked. + */ + @Override + protected void replaceText(CharSequence text) { + } + + /** + * We override this method to avoid an extra onItemClick being called on + * the drop-down's OnItemClickListener by + * {@link AutoCompleteTextView#onKeyUp(int, KeyEvent)} when an item is + * clicked with the trackball. + */ + @Override + public void performCompletion() { + } + + /** + * We override this method to be sure and show the soft keyboard if + * appropriate when the TextView has focus. + */ + @Override + public void onWindowFocusChanged(boolean hasWindowFocus) { + super.onWindowFocusChanged(hasWindowFocus); + + if (hasWindowFocus && mSearchView.hasFocus() && getVisibility() == VISIBLE) { + InputMethodManager inputManager = (InputMethodManager) getContext() + .getSystemService(Context.INPUT_METHOD_SERVICE); + inputManager.showSoftInput(this, 0); + // If in landscape mode, then make sure that + // the ime is in front of the dropdown. + if (isLandscapeMode(getContext())) { + ensureImeVisible(this, true); + } + } + } + + @Override + protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { + super.onFocusChanged(focused, direction, previouslyFocusedRect); + mSearchView.onTextFocusChanged(); + } + + /** + * We override this method so that we can allow a threshold of zero, + * which ACTV does not. + */ + @Override + public boolean enoughToFilter() { + return mThreshold <= 0 || super.enoughToFilter(); + } + + @Override + public boolean onKeyPreIme(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_BACK) { + // special case for the back key, we do not even try to send it + // to the drop down list but instead, consume it immediately + if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { + KeyEvent.DispatcherState state = getKeyDispatcherState(); + if (state != null) { + state.startTracking(event, this); + } + return true; + } else if (event.getAction() == KeyEvent.ACTION_UP) { + KeyEvent.DispatcherState state = getKeyDispatcherState(); + if (state != null) { + state.handleUpEvent(event); + } + if (event.isTracking() && !event.isCanceled()) { + mSearchView.clearFocus(); + mSearchView.setImeVisibility(false); + return true; + } + } + } + return super.onKeyPreIme(keyCode, event); + } + + } + + private static void ensureImeVisible(AutoCompleteTextView view, boolean visible) { + try { + Method method = AutoCompleteTextView.class.getMethod("ensureImeVisible", boolean.class); + method.setAccessible(true); + method.invoke(view, visible); + } catch (Exception e) { + //Oh well... + } + } + + private static void showSoftInputUnchecked(View view, InputMethodManager imm, int flags) { + try { + Method method = imm.getClass().getMethod("showSoftInputUnchecked", int.class, ResultReceiver.class); + method.setAccessible(true); + method.invoke(imm, flags, null); + } catch (Exception e) { + //Fallback to public API which hopefully does mostly the same thing + imm.showSoftInput(view, flags); + } + } + + private static void setText(AutoCompleteTextView view, CharSequence text, boolean filter) { + try { + Method method = AutoCompleteTextView.class.getMethod("setText", CharSequence.class, boolean.class); + method.setAccessible(true); + method.invoke(view, text, filter); + } catch (Exception e) { + //Fallback to public API which hopefully does mostly the same thing + view.setText(text); + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ShareActionProvider.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ShareActionProvider.java new file mode 100644 index 0000000000..83e9f0ca9f --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/ShareActionProvider.java @@ -0,0 +1,316 @@ +/* + * Copyright (C) 2011 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.widget; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.graphics.drawable.Drawable; +import android.util.TypedValue; +import android.view.View; + +import com.actionbarsherlock.R; +import com.actionbarsherlock.view.ActionProvider; +import com.actionbarsherlock.view.Menu; +import com.actionbarsherlock.view.MenuItem; +import com.actionbarsherlock.view.MenuItem.OnMenuItemClickListener; +import com.actionbarsherlock.view.SubMenu; +import com.actionbarsherlock.widget.ActivityChooserModel.OnChooseActivityListener; + +/** + * This is a provider for a share action. It is responsible for creating views + * that enable data sharing and also to show a sub menu with sharing activities + * if the hosting item is placed on the overflow menu. + *

+ * Here is how to use the action provider with custom backing file in a {@link MenuItem}: + *

+ *

+ *

+ * 
+ *  // In Activity#onCreateOptionsMenu
+ *  public boolean onCreateOptionsMenu(Menu menu) {
+ *      // Get the menu item.
+ *      MenuItem menuItem = menu.findItem(R.id.my_menu_item);
+ *      // Get the provider and hold onto it to set/change the share intent.
+ *      mShareActionProvider = (ShareActionProvider) menuItem.getActionProvider();
+ *      // Set history different from the default before getting the action
+ *      // view since a call to {@link MenuItem#getActionView() MenuItem.getActionView()} calls
+ *      // {@link ActionProvider#onCreateActionView()} which uses the backing file name. Omit this
+ *      // line if using the default share history file is desired.
+ *      mShareActionProvider.setShareHistoryFileName("custom_share_history.xml");
+ *      . . .
+ *  }
+ *
+ *  // Somewhere in the application.
+ *  public void doShare(Intent shareIntent) {
+ *      // When you want to share set the share intent.
+ *      mShareActionProvider.setShareIntent(shareIntent);
+ *  }
+ * 
+ * + *

+ *

+ * Note: While the sample snippet demonstrates how to use this provider + * in the context of a menu item, the use of the provider is not limited to menu items. + *

+ * + * @see ActionProvider + */ +public class ShareActionProvider extends ActionProvider { + + /** + * Listener for the event of selecting a share target. + */ + public interface OnShareTargetSelectedListener { + + /** + * Called when a share target has been selected. The client can + * decide whether to handle the intent or rely on the default + * behavior which is launching it. + *

+ * Note: Modifying the intent is not permitted and + * any changes to the latter will be ignored. + *

+ * + * @param source The source of the notification. + * @param intent The intent for launching the chosen share target. + * @return Whether the client has handled the intent. + */ + public boolean onShareTargetSelected(ShareActionProvider source, Intent intent); + } + + /** + * The default for the maximal number of activities shown in the sub-menu. + */ + private static final int DEFAULT_INITIAL_ACTIVITY_COUNT = 4; + + /** + * The the maximum number activities shown in the sub-menu. + */ + private int mMaxShownActivityCount = DEFAULT_INITIAL_ACTIVITY_COUNT; + + /** + * Listener for handling menu item clicks. + */ + private final ShareMenuItemOnMenuItemClickListener mOnMenuItemClickListener = + new ShareMenuItemOnMenuItemClickListener(); + + /** + * The default name for storing share history. + */ + public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml"; + + /** + * Context for accessing resources. + */ + private final Context mContext; + + /** + * The name of the file with share history data. + */ + private String mShareHistoryFileName = DEFAULT_SHARE_HISTORY_FILE_NAME; + + private OnShareTargetSelectedListener mOnShareTargetSelectedListener; + + private OnChooseActivityListener mOnChooseActivityListener; + + /** + * Creates a new instance. + * + * @param context Context for accessing resources. + */ + public ShareActionProvider(Context context) { + super(context); + mContext = context; + } + + /** + * Sets a listener to be notified when a share target has been selected. + * The listener can optionally decide to handle the selection and + * not rely on the default behavior which is to launch the activity. + *

+ * Note: If you choose the backing share history file + * you will still be notified in this callback. + *

+ * @param listener The listener. + */ + public void setOnShareTargetSelectedListener(OnShareTargetSelectedListener listener) { + mOnShareTargetSelectedListener = listener; + setActivityChooserPolicyIfNeeded(); + } + + /** + * {@inheritDoc} + */ + @Override + public View onCreateActionView() { + // Create the view and set its data model. + ActivityChooserModel dataModel = ActivityChooserModel.get(mContext, mShareHistoryFileName); + ActivityChooserView activityChooserView = new ActivityChooserView(mContext); + activityChooserView.setActivityChooserModel(dataModel); + + // Lookup and set the expand action icon. + TypedValue outTypedValue = new TypedValue(); + mContext.getTheme().resolveAttribute(R.attr.actionModeShareDrawable, outTypedValue, true); + Drawable drawable = mContext.getResources().getDrawable(outTypedValue.resourceId); + activityChooserView.setExpandActivityOverflowButtonDrawable(drawable); + activityChooserView.setProvider(this); + + // Set content description. + activityChooserView.setDefaultActionButtonContentDescription( + R.string.abs__shareactionprovider_share_with_application); + activityChooserView.setExpandActivityOverflowButtonContentDescription( + R.string.abs__shareactionprovider_share_with); + + return activityChooserView; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean hasSubMenu() { + return true; + } + + /** + * {@inheritDoc} + */ + @Override + public void onPrepareSubMenu(SubMenu subMenu) { + // Clear since the order of items may change. + subMenu.clear(); + + ActivityChooserModel dataModel = ActivityChooserModel.get(mContext, mShareHistoryFileName); + PackageManager packageManager = mContext.getPackageManager(); + + final int expandedActivityCount = dataModel.getActivityCount(); + final int collapsedActivityCount = Math.min(expandedActivityCount, mMaxShownActivityCount); + + // Populate the sub-menu with a sub set of the activities. + for (int i = 0; i < collapsedActivityCount; i++) { + ResolveInfo activity = dataModel.getActivity(i); + subMenu.add(0, i, i, activity.loadLabel(packageManager)) + .setIcon(activity.loadIcon(packageManager)) + .setOnMenuItemClickListener(mOnMenuItemClickListener); + } + + if (collapsedActivityCount < expandedActivityCount) { + // Add a sub-menu for showing all activities as a list item. + SubMenu expandedSubMenu = subMenu.addSubMenu(Menu.NONE, collapsedActivityCount, + collapsedActivityCount, + mContext.getString(R.string.abs__activity_chooser_view_see_all)); + for (int i = 0; i < expandedActivityCount; i++) { + ResolveInfo activity = dataModel.getActivity(i); + expandedSubMenu.add(0, i, i, activity.loadLabel(packageManager)) + .setIcon(activity.loadIcon(packageManager)) + .setOnMenuItemClickListener(mOnMenuItemClickListener); + } + } + } + + /** + * Sets the file name of a file for persisting the share history which + * history will be used for ordering share targets. This file will be used + * for all view created by {@link #onCreateActionView()}. Defaults to + * {@link #DEFAULT_SHARE_HISTORY_FILE_NAME}. Set to null + * if share history should not be persisted between sessions. + *

+ * Note: The history file name can be set any time, however + * only the action views created by {@link #onCreateActionView()} after setting + * the file name will be backed by the provided file. + *

+ * + * @param shareHistoryFile The share history file name. + */ + public void setShareHistoryFileName(String shareHistoryFile) { + mShareHistoryFileName = shareHistoryFile; + setActivityChooserPolicyIfNeeded(); + } + + /** + * Sets an intent with information about the share action. Here is a + * sample for constructing a share intent: + *

+ *

+     * 
+     *  Intent shareIntent = new Intent(Intent.ACTION_SEND);
+     *  shareIntent.setType("image/*");
+     *  Uri uri = Uri.fromFile(new File(getFilesDir(), "foo.jpg"));
+     *  shareIntent.putExtra(Intent.EXTRA_STREAM, uri.toString());
+     * 
+ * + *

+ * + * @param shareIntent The share intent. + * + * @see Intent#ACTION_SEND + * @see Intent#ACTION_SEND_MULTIPLE + */ + public void setShareIntent(Intent shareIntent) { + ActivityChooserModel dataModel = ActivityChooserModel.get(mContext, + mShareHistoryFileName); + dataModel.setIntent(shareIntent); + } + + /** + * Reusable listener for handling share item clicks. + */ + private class ShareMenuItemOnMenuItemClickListener implements OnMenuItemClickListener { + @Override + public boolean onMenuItemClick(MenuItem item) { + ActivityChooserModel dataModel = ActivityChooserModel.get(mContext, + mShareHistoryFileName); + final int itemId = item.getItemId(); + Intent launchIntent = dataModel.chooseActivity(itemId); + if (launchIntent != null) { + mContext.startActivity(launchIntent); + } + return true; + } + } + + /** + * Set the activity chooser policy of the model backed by the current + * share history file if needed which is if there is a registered callback. + */ + private void setActivityChooserPolicyIfNeeded() { + if (mOnShareTargetSelectedListener == null) { + return; + } + if (mOnChooseActivityListener == null) { + mOnChooseActivityListener = new ShareAcitivityChooserModelPolicy(); + } + ActivityChooserModel dataModel = ActivityChooserModel.get(mContext, mShareHistoryFileName); + dataModel.setOnChooseActivityListener(mOnChooseActivityListener); + } + + /** + * Policy that delegates to the {@link OnShareTargetSelectedListener}, if such. + */ + private class ShareAcitivityChooserModelPolicy implements OnChooseActivityListener { + @Override + public boolean onChooseActivity(ActivityChooserModel host, Intent intent) { + if (mOnShareTargetSelectedListener != null) { + return mOnShareTargetSelectedListener.onShareTargetSelected( + ShareActionProvider.this, intent); + } + return false; + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SuggestionsAdapter.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SuggestionsAdapter.java new file mode 100644 index 0000000000..bd5cbd718d --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/src/com/actionbarsherlock/widget/SuggestionsAdapter.java @@ -0,0 +1,733 @@ +/* + * Copyright (C) 2009 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.actionbarsherlock.widget; + +import android.app.SearchManager; +import android.app.SearchableInfo; +import android.content.ComponentName; +import android.content.ContentResolver; +import android.content.Context; +import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.content.res.ColorStateList; +import android.content.res.Resources; +import android.database.Cursor; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Bundle; +import android.support.v4.widget.ResourceCursorAdapter; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.TextUtils; +import android.text.style.TextAppearanceSpan; +import android.util.Log; +import android.util.TypedValue; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; +import com.actionbarsherlock.R; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.WeakHashMap; + +/** + * Provides the contents for the suggestion drop-down list. + * + * @hide + */ +class SuggestionsAdapter extends ResourceCursorAdapter implements OnClickListener { + + private static final boolean DBG = false; + private static final String LOG_TAG = "SuggestionsAdapter"; + private static final int QUERY_LIMIT = 50; + + static final int REFINE_NONE = 0; + static final int REFINE_BY_ENTRY = 1; + static final int REFINE_ALL = 2; + + private SearchManager mSearchManager; + private SearchView mSearchView; + private Context mProviderContext; + private WeakHashMap mOutsideDrawablesCache; + private boolean mClosed = false; + private int mQueryRefinement = REFINE_BY_ENTRY; + + // URL color + private ColorStateList mUrlColor; + + static final int INVALID_INDEX = -1; + + // Cached column indexes, updated when the cursor changes. + private int mText1Col = INVALID_INDEX; + private int mText2Col = INVALID_INDEX; + private int mText2UrlCol = INVALID_INDEX; + private int mIconName1Col = INVALID_INDEX; + private int mIconName2Col = INVALID_INDEX; + private int mFlagsCol = INVALID_INDEX; + + // private final Runnable mStartSpinnerRunnable; + // private final Runnable mStopSpinnerRunnable; + + /** + * The amount of time we delay in the filter when the user presses the delete key. + */ + //private static final long DELETE_KEY_POST_DELAY = 500L; + + public SuggestionsAdapter(Context context, SearchView searchView, + SearchableInfo mSearchable, WeakHashMap outsideDrawablesCache) { + super(context, + R.layout.abs__search_dropdown_item_icons_2line, + null, // no initial cursor + true); // auto-requery + mSearchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE); + mProviderContext = mContext; + mSearchView = searchView; + + mOutsideDrawablesCache = outsideDrawablesCache; + + // mStartSpinnerRunnable = new Runnable() { + // public void run() { + // // mSearchView.setWorking(true); // TODO: + // } + // }; + // + // mStopSpinnerRunnable = new Runnable() { + // public void run() { + // // mSearchView.setWorking(false); // TODO: + // } + // }; + + // delay 500ms when deleting +// TODO getFilter().setDelayer(new Filter.Delayer() { +// +// private int mPreviousLength = 0; +// +// public long getPostingDelay(CharSequence constraint) { +// if (constraint == null) return 0; +// +// long delay = constraint.length() < mPreviousLength ? DELETE_KEY_POST_DELAY : 0; +// mPreviousLength = constraint.length(); +// return delay; +// } +// }); + } + + /** + * Enables query refinement for all suggestions. This means that an additional icon + * will be shown for each entry. When clicked, the suggested text on that line will be + * copied to the query text field. + *

+ * + * @param refineWhat which queries to refine. Possible values are {@link #REFINE_NONE}, + * {@link #REFINE_BY_ENTRY}, and {@link #REFINE_ALL}. + */ + public void setQueryRefinement(int refineWhat) { + mQueryRefinement = refineWhat; + } + + /** + * Returns the current query refinement preference. + * @return value of query refinement preference + */ + public int getQueryRefinement() { + return mQueryRefinement; + } + + /** + * Overridden to always return false, since we cannot be sure that + * suggestion sources return stable IDs. + */ + @Override + public boolean hasStableIds() { + return false; + } + + /** + * Use the search suggestions provider to obtain a live cursor. This will be called + * in a worker thread, so it's OK if the query is slow (e.g. round trip for suggestions). + * The results will be processed in the UI thread and changeCursor() will be called. + */ + @Override + public Cursor runQueryOnBackgroundThread(CharSequence constraint) { + if (DBG) Log.d(LOG_TAG, "runQueryOnBackgroundThread(" + constraint + ")"); + String query = (constraint == null) ? "" : constraint.toString(); + /** + * for in app search we show the progress spinner until the cursor is returned with + * the results. + */ + Cursor cursor = null; + if (mSearchView.getVisibility() != View.VISIBLE + || mSearchView.getWindowVisibility() != View.VISIBLE) { + return null; + } + //mSearchView.getWindow().getDecorView().post(mStartSpinnerRunnable); // TODO: + try { + cursor = getSuggestions(query, QUERY_LIMIT); + // trigger fill window so the spinner stays up until the results are copied over and + // closer to being ready + if (cursor != null) { + cursor.getCount(); + return cursor; + } + } catch (RuntimeException e) { + Log.w(LOG_TAG, "Search suggestions query threw an exception.", e); + } + // If cursor is null or an exception was thrown, stop the spinner and return null. + // changeCursor doesn't get called if cursor is null + // mSearchView.getWindow().getDecorView().post(mStopSpinnerRunnable); // TODO: + return null; + } + + public Cursor getSuggestions(String query, int limit) { + Uri.Builder uriBuilder = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .query("") // TODO: Remove, workaround for a bug in Uri.writeToParcel() + .fragment(""); // TODO: Remove, workaround for a bug in Uri.writeToParcel() + + // append standard suggestion query path + uriBuilder.appendPath(SearchManager.SUGGEST_URI_PATH_QUERY); + + // inject query, either as selection args or inline + uriBuilder.appendPath(query); + + if (limit > 0) { + uriBuilder.appendQueryParameter(SearchManager.SUGGEST_PARAMETER_LIMIT, String.valueOf(limit)); + } + + Uri uri = uriBuilder.build(); + + // finally, make the query + return mContext.getContentResolver().query(uri, null, null, null, null); + } + + public void close() { + if (DBG) Log.d(LOG_TAG, "close()"); + changeCursor(null); + mClosed = true; + } + + @Override + public void notifyDataSetChanged() { + if (DBG) Log.d(LOG_TAG, "notifyDataSetChanged"); + super.notifyDataSetChanged(); + + // mSearchView.onDataSetChanged(); // TODO: + + updateSpinnerState(getCursor()); + } + + @Override + public void notifyDataSetInvalidated() { + if (DBG) Log.d(LOG_TAG, "notifyDataSetInvalidated"); + super.notifyDataSetInvalidated(); + + updateSpinnerState(getCursor()); + } + + private void updateSpinnerState(Cursor cursor) { + Bundle extras = cursor != null ? cursor.getExtras() : null; + if (DBG) { + Log.d(LOG_TAG, "updateSpinnerState - extra = " + + (extras != null + ? extras.getBoolean(SearchManager.CURSOR_EXTRA_KEY_IN_PROGRESS) + : null)); + } + // Check if the Cursor indicates that the query is not complete and show the spinner + if (extras != null + && extras.getBoolean(SearchManager.CURSOR_EXTRA_KEY_IN_PROGRESS)) { + // mSearchView.getWindow().getDecorView().post(mStartSpinnerRunnable); // TODO: + return; + } + // If cursor is null or is done, stop the spinner + // mSearchView.getWindow().getDecorView().post(mStopSpinnerRunnable); // TODO: + } + + /** + * Cache columns. + */ + @Override + public void changeCursor(Cursor c) { + if (DBG) Log.d(LOG_TAG, "changeCursor(" + c + ")"); + + if (mClosed) { + Log.w(LOG_TAG, "Tried to change cursor after adapter was closed."); + if (c != null) c.close(); + return; + } + + try { + super.changeCursor(c); + + if (c != null) { + mText1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_1); + mText2Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2); + mText2UrlCol = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_TEXT_2_URL); + mIconName1Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_1); + mIconName2Col = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_ICON_2); + mFlagsCol = c.getColumnIndex(SearchManager.SUGGEST_COLUMN_FLAGS); + } + } catch (Exception e) { + Log.e(LOG_TAG, "error changing cursor and caching columns", e); + } + } + + /** + * Tags the view with cached child view look-ups. + */ + @Override + public View newView(Context context, Cursor cursor, ViewGroup parent) { + View v = super.newView(context, cursor, parent); + v.setTag(new ChildViewCache(v)); + return v; + } + + /** + * Cache of the child views of drop-drown list items, to avoid looking up the children + * each time the contents of a list item are changed. + */ + private final static class ChildViewCache { + public final TextView mText1; + public final TextView mText2; + public final ImageView mIcon1; + public final ImageView mIcon2; + public final ImageView mIconRefine; + + public ChildViewCache(View v) { + mText1 = (TextView) v.findViewById(android.R.id.text1); + mText2 = (TextView) v.findViewById(android.R.id.text2); + mIcon1 = (ImageView) v.findViewById(android.R.id.icon1); + mIcon2 = (ImageView) v.findViewById(android.R.id.icon2); + mIconRefine = (ImageView) v.findViewById(R.id.edit_query); + } + } + + @Override + public void bindView(View view, Context context, Cursor cursor) { + ChildViewCache views = (ChildViewCache) view.getTag(); + + int flags = 0; + if (mFlagsCol != INVALID_INDEX) { + flags = cursor.getInt(mFlagsCol); + } + if (views.mText1 != null) { + String text1 = getStringOrNull(cursor, mText1Col); + setViewText(views.mText1, text1); + } + if (views.mText2 != null) { + // First check TEXT_2_URL + CharSequence text2 = getStringOrNull(cursor, mText2UrlCol); + if (text2 != null) { + text2 = formatUrl(text2); + } else { + text2 = getStringOrNull(cursor, mText2Col); + } + + // If no second line of text is indicated, allow the first line of text + // to be up to two lines if it wants to be. + if (TextUtils.isEmpty(text2)) { + if (views.mText1 != null) { + views.mText1.setSingleLine(false); + views.mText1.setMaxLines(2); + } + } else { + if (views.mText1 != null) { + views.mText1.setSingleLine(true); + views.mText1.setMaxLines(1); + } + } + setViewText(views.mText2, text2); + } + + if (views.mIcon1 != null) { + setViewDrawable(views.mIcon1, getIcon1(cursor), View.INVISIBLE); + } + if (views.mIcon2 != null) { + setViewDrawable(views.mIcon2, getIcon2(cursor), View.GONE); + } + if (mQueryRefinement == REFINE_ALL + || (mQueryRefinement == REFINE_BY_ENTRY + && (flags & SearchManager.FLAG_QUERY_REFINEMENT) != 0)) { + views.mIconRefine.setVisibility(View.VISIBLE); + views.mIconRefine.setTag(views.mText1.getText()); + views.mIconRefine.setOnClickListener(this); + } else { + views.mIconRefine.setVisibility(View.GONE); + } + } + + public void onClick(View v) { + Object tag = v.getTag(); + if (tag instanceof CharSequence) { + mSearchView.onQueryRefine((CharSequence) tag); + } + } + + private CharSequence formatUrl(CharSequence url) { + if (mUrlColor == null) { + // Lazily get the URL color from the current theme. + TypedValue colorValue = new TypedValue(); + mContext.getTheme().resolveAttribute(R.attr.textColorSearchUrl, colorValue, true); + mUrlColor = mContext.getResources().getColorStateList(colorValue.resourceId); + } + + SpannableString text = new SpannableString(url); + text.setSpan(new TextAppearanceSpan(null, 0, 0, mUrlColor, null), + 0, url.length(), + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + return text; + } + + private void setViewText(TextView v, CharSequence text) { + // Set the text even if it's null, since we need to clear any previous text. + v.setText(text); + + if (TextUtils.isEmpty(text)) { + v.setVisibility(View.GONE); + } else { + v.setVisibility(View.VISIBLE); + } + } + + private Drawable getIcon1(Cursor cursor) { + if (mIconName1Col == INVALID_INDEX) { + return null; + } + String value = cursor.getString(mIconName1Col); + Drawable drawable = getDrawableFromResourceValue(value); + if (drawable != null) { + return drawable; + } + return getDefaultIcon1(cursor); + } + + private Drawable getIcon2(Cursor cursor) { + if (mIconName2Col == INVALID_INDEX) { + return null; + } + String value = cursor.getString(mIconName2Col); + return getDrawableFromResourceValue(value); + } + + /** + * Sets the drawable in an image view, makes sure the view is only visible if there + * is a drawable. + */ + private void setViewDrawable(ImageView v, Drawable drawable, int nullVisibility) { + // Set the icon even if the drawable is null, since we need to clear any + // previous icon. + v.setImageDrawable(drawable); + + if (drawable == null) { + v.setVisibility(nullVisibility); + } else { + v.setVisibility(View.VISIBLE); + + // This is a hack to get any animated drawables (like a 'working' spinner) + // to animate. You have to setVisible true on an AnimationDrawable to get + // it to start animating, but it must first have been false or else the + // call to setVisible will be ineffective. We need to clear up the story + // about animated drawables in the future, see http://b/1878430. + drawable.setVisible(false, false); + drawable.setVisible(true, false); + } + } + + /** + * Gets the text to show in the query field when a suggestion is selected. + * + * @param cursor The Cursor to read the suggestion data from. The Cursor should already + * be moved to the suggestion that is to be read from. + * @return The text to show, or null if the query should not be + * changed when selecting this suggestion. + */ + @Override + public CharSequence convertToString(Cursor cursor) { + if (cursor == null) { + return null; + } + + String query = getColumnString(cursor, SearchManager.SUGGEST_COLUMN_QUERY); + if (query != null) { + return query; + } + + return null; + } + + /** + * This method is overridden purely to provide a bit of protection against + * flaky content providers. + * + * @see android.widget.ListAdapter#getView(int, View, ViewGroup) + */ + @Override + public View getView(int position, View convertView, ViewGroup parent) { + try { + return super.getView(position, convertView, parent); + } catch (RuntimeException e) { + Log.w(LOG_TAG, "Search suggestions cursor threw exception.", e); + // Put exception string in item title + View v = newView(mContext, mCursor, parent); + if (v != null) { + ChildViewCache views = (ChildViewCache) v.getTag(); + TextView tv = views.mText1; + tv.setText(e.toString()); + } + return v; + } + } + + /** + * Gets a drawable given a value provided by a suggestion provider. + * + * This value could be just the string value of a resource id + * (e.g., "2130837524"), in which case we will try to retrieve a drawable from + * the provider's resources. If the value is not an integer, it is + * treated as a Uri and opened with + * {@link ContentResolver#openOutputStream(android.net.Uri, String)}. + * + * All resources and URIs are read using the suggestion provider's context. + * + * If the string is not formatted as expected, or no drawable can be found for + * the provided value, this method returns null. + * + * @param drawableId a string like "2130837524", + * "android.resource://com.android.alarmclock/2130837524", + * or "content://contacts/photos/253". + * @return a Drawable, or null if none found + */ + private Drawable getDrawableFromResourceValue(String drawableId) { + if (drawableId == null || drawableId.length() == 0 || "0".equals(drawableId)) { + return null; + } + try { + // First, see if it's just an integer + int resourceId = Integer.parseInt(drawableId); + // It's an int, look for it in the cache + String drawableUri = ContentResolver.SCHEME_ANDROID_RESOURCE + + "://" + mProviderContext.getPackageName() + "/" + resourceId; + // Must use URI as cache key, since ints are app-specific + Drawable drawable = checkIconCache(drawableUri); + if (drawable != null) { + return drawable; + } + // Not cached, find it by resource ID + drawable = mProviderContext.getResources().getDrawable(resourceId); + // Stick it in the cache, using the URI as key + storeInIconCache(drawableUri, drawable); + return drawable; + } catch (NumberFormatException nfe) { + // It's not an integer, use it as a URI + Drawable drawable = checkIconCache(drawableId); + if (drawable != null) { + return drawable; + } + Uri uri = Uri.parse(drawableId); + drawable = getDrawable(uri); + storeInIconCache(drawableId, drawable); + return drawable; + } catch (Resources.NotFoundException nfe) { + // It was an integer, but it couldn't be found, bail out + Log.w(LOG_TAG, "Icon resource not found: " + drawableId); + return null; + } + } + + /** + * Gets a drawable by URI, without using the cache. + * + * @return A drawable, or {@code null} if the drawable could not be loaded. + */ + private Drawable getDrawable(Uri uri) { + try { + String scheme = uri.getScheme(); + if (ContentResolver.SCHEME_ANDROID_RESOURCE.equals(scheme)) { + // Load drawables through Resources, to get the source density information + try { + return getTheDrawable(uri); + } catch (Resources.NotFoundException ex) { + throw new FileNotFoundException("Resource does not exist: " + uri); + } + } else { + // Let the ContentResolver handle content and file URIs. + InputStream stream = mProviderContext.getContentResolver().openInputStream(uri); + if (stream == null) { + throw new FileNotFoundException("Failed to open " + uri); + } + try { + return Drawable.createFromStream(stream, null); + } finally { + try { + stream.close(); + } catch (IOException ex) { + Log.e(LOG_TAG, "Error closing icon stream for " + uri, ex); + } + } + } + } catch (FileNotFoundException fnfe) { + Log.w(LOG_TAG, "Icon not found: " + uri + ", " + fnfe.getMessage()); + return null; + } + } + + public Drawable getTheDrawable(Uri uri) throws FileNotFoundException { + String authority = uri.getAuthority(); + Resources r; + if (TextUtils.isEmpty(authority)) { + throw new FileNotFoundException("No authority: " + uri); + } else { + try { + r = mContext.getPackageManager().getResourcesForApplication(authority); + } catch (NameNotFoundException ex) { + throw new FileNotFoundException("No package found for authority: " + uri); + } + } + List path = uri.getPathSegments(); + if (path == null) { + throw new FileNotFoundException("No path: " + uri); + } + int len = path.size(); + int id; + if (len == 1) { + try { + id = Integer.parseInt(path.get(0)); + } catch (NumberFormatException e) { + throw new FileNotFoundException("Single path segment is not a resource ID: " + uri); + } + } else if (len == 2) { + id = r.getIdentifier(path.get(1), path.get(0), authority); + } else { + throw new FileNotFoundException("More than two path segments: " + uri); + } + if (id == 0) { + throw new FileNotFoundException("No resource found for: " + uri); + } + return r.getDrawable(id); + } + + private Drawable checkIconCache(String resourceUri) { + Drawable.ConstantState cached = mOutsideDrawablesCache.get(resourceUri); + if (cached == null) { + return null; + } + if (DBG) Log.d(LOG_TAG, "Found icon in cache: " + resourceUri); + return cached.newDrawable(); + } + + private void storeInIconCache(String resourceUri, Drawable drawable) { + if (drawable != null) { + mOutsideDrawablesCache.put(resourceUri, drawable.getConstantState()); + } + } + + /** + * Gets the left-hand side icon that will be used for the current suggestion + * if the suggestion contains an icon column but no icon or a broken icon. + * + * @param cursor A cursor positioned at the current suggestion. + * @return A non-null drawable. + */ + private Drawable getDefaultIcon1(Cursor cursor) { + // Fall back to a default icon + return mContext.getPackageManager().getDefaultActivityIcon(); + } + + /** + * Gets the activity or application icon for an activity. + * Uses the local icon cache for fast repeated lookups. + * + * @param component Name of an activity. + * @return A drawable, or {@code null} if neither the activity nor the application + * has an icon set. + */ + private Drawable getActivityIconWithCache(ComponentName component) { + // First check the icon cache + String componentIconKey = component.flattenToShortString(); + // Using containsKey() since we also store null values. + if (mOutsideDrawablesCache.containsKey(componentIconKey)) { + Drawable.ConstantState cached = mOutsideDrawablesCache.get(componentIconKey); + return cached == null ? null : cached.newDrawable(mProviderContext.getResources()); + } + // Then try the activity or application icon + Drawable drawable = getActivityIcon(component); + // Stick it in the cache so we don't do this lookup again. + Drawable.ConstantState toCache = drawable == null ? null : drawable.getConstantState(); + mOutsideDrawablesCache.put(componentIconKey, toCache); + return drawable; + } + + /** + * Gets the activity or application icon for an activity. + * + * @param component Name of an activity. + * @return A drawable, or {@code null} if neither the acitivy or the application + * have an icon set. + */ + private Drawable getActivityIcon(ComponentName component) { + PackageManager pm = mContext.getPackageManager(); + final ActivityInfo activityInfo; + try { + activityInfo = pm.getActivityInfo(component, PackageManager.GET_META_DATA); + } catch (NameNotFoundException ex) { + Log.w(LOG_TAG, ex.toString()); + return null; + } + int iconId = activityInfo.getIconResource(); + if (iconId == 0) return null; + String pkg = component.getPackageName(); + Drawable drawable = pm.getDrawable(pkg, iconId, activityInfo.applicationInfo); + if (drawable == null) { + Log.w(LOG_TAG, "Invalid icon resource " + iconId + " for " + + component.flattenToShortString()); + return null; + } + return drawable; + } + + /** + * Gets the value of a string column by name. + * + * @param cursor Cursor to read the value from. + * @param columnName The name of the column to read. + * @return The value of the given column, or null + * if the cursor does not contain the given column. + */ + public static String getColumnString(Cursor cursor, String columnName) { + int col = cursor.getColumnIndex(columnName); + return getStringOrNull(cursor, col); + } + + private static String getStringOrNull(Cursor cursor, int col) { + if (col == INVALID_INDEX) { + return null; + } + try { + return cursor.getString(col); + } catch (Exception e) { + Log.e(LOG_TAG, + "unexpected error retrieving valid column from cursor, " + + "did the remote process die?", e); + return null; + } + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/test/com/actionbarsherlock/internal/ManifestParsingTest.java b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/test/com/actionbarsherlock/internal/ManifestParsingTest.java new file mode 100644 index 0000000000..47475c5746 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/test/com/actionbarsherlock/internal/ManifestParsingTest.java @@ -0,0 +1,37 @@ +package com.actionbarsherlock.internal; + +import org.junit.Test; + +import static com.actionbarsherlock.internal.ActionBarSherlockCompat.cleanActivityName; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; + +public class ManifestParsingTest { + @Test + public void testFullyQualifiedClassName() { + String expected = "com.other.package.SomeClass"; + String actual = cleanActivityName("com.jakewharton.test", "com.other.package.SomeClass"); + assertThat(expected, equalTo(actual)); + } + + @Test + public void testFullyQualifiedClassNameSamePackage() { + String expected = "com.jakewharton.test.SomeClass"; + String actual = cleanActivityName("com.jakewharton.test", "com.jakewharton.test.SomeClass"); + assertThat(expected, equalTo(actual)); + } + + @Test + public void testUnqualifiedClassName() { + String expected = "com.jakewharton.test.SomeClass"; + String actual = cleanActivityName("com.jakewharton.test", "SomeClass"); + assertThat(expected, equalTo(actual)); + } + + @Test + public void testRelativeClassName() { + String expected = "com.jakewharton.test.ui.SomeClass"; + String actual = cleanActivityName("com.jakewharton.test", ".ui.SomeClass"); + assertThat(expected, equalTo(actual)); + } +} \ No newline at end of file diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/pom.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/pom.xml new file mode 100644 index 0000000000..ce4d4fca88 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/pom.xml @@ -0,0 +1,191 @@ + + + + 4.0.0 + + + org.sonatype.oss + oss-parent + 7 + + + com.actionbarsherlock + parent + pom + 4.2.0 + + ActionBarSherlock (Parent) + Android library for implementing the action bar design pattern using the backported sources of Ice Cream Sandwich. + http://actionbarsherlock.com + 2011 + + + library + samples + + + + https://github.com/JakeWharton/ActionBarSherlock/ + scm:git:git://github.com/JakeWharton/ActionBarSherlock.git + scm:git:git@github.com:JakeWharton/ActionBarSherlock.git + + + + + Jake Wharton + jakewharton@gmail.com + jakewharton + http://jakewharton.com + -5 + + developer + + + + + + + Apache License Version 2.0 + http://www.apache.org/licenses/LICENSE-2.0.txt + repo + + + + + Jake Wharton + http://jakewharton.com + + + + GitHub Issues + https://github.com/JakeWharton/ActionBarSherlock/issues + + + + UTF-8 + UTF-8 + + 1.6 + 4.0.1.2 + 14 + r99 + + 3.3.2 + 4.10 + + JakeWharton + ActionBarSherlock + + + + + + com.google.android + android + ${android.version} + + + com.google.android + support-v4 + ${android-support.version} + system + ${basedir}/libs/android-support-v4.jar + + + com.nineoldandroids + library + 2.4.0 + + + com.github.rtyley + roboguice-sherlock + 1.4 + + + junit + junit + ${junit.version} + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.5 + + ${java.version} + ${java.version} + + + + + com.jayway.maven.plugins.android.generation2 + android-maven-plugin + 3.3.2 + + + ${android.platform} + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.8 + + + + org.apache.maven.plugins + maven-checkstyle-plugin + 2.9.1 + + true + + + + + org.apache.maven.plugins + maven-site-plugin + 3.0 + + true + + + + + + + + org.apache.maven.plugins + maven-release-plugin + 2.2.2 + + true + + + + + com.github.github + site-maven-plugin + 0.5 + + + site + + site + + + + + Creating site for ${project.version}. + website + + + + + diff --git a/product/modules/agents/android/client/proguard-project.txt b/product/modules/agents/android/client/proguard-project.txt new file mode 100644 index 0000000000..f2fe1559a2 --- /dev/null +++ b/product/modules/agents/android/client/proguard-project.txt @@ -0,0 +1,20 @@ +# To enable ProGuard in your project, edit project.properties +# to define the proguard.config property as described in that file. +# +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in ${sdk.dir}/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the ProGuard +# include property in project.properties. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} diff --git a/product/modules/agents/android/client/project.properties b/product/modules/agents/android/client/project.properties new file mode 100644 index 0000000000..f1eace0071 --- /dev/null +++ b/product/modules/agents/android/client/project.properties @@ -0,0 +1,15 @@ +# This file is automatically generated by Android Tools. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file must be checked in Version Control Systems. +# +# To customize properties used by the Ant build system edit +# "ant.properties", and override values to adapt the script to your +# project structure. +# +# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): +#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt + +# Project target. +target=android-19 +android.library.reference.1=plugins/ActionBarSherlock/library diff --git a/product/modules/agents/android/client/res/drawable-hdpi/ic_bookmark.png b/product/modules/agents/android/client/res/drawable-hdpi/ic_bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..d14f46de0c4228593c8424026ed63ffeadeb4c03 GIT binary patch literal 4960 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-hdpi/ic_check_selected.png b/product/modules/agents/android/client/res/drawable-hdpi/ic_check_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..319b7124de17df057156773195b1b458bab382b8 GIT binary patch literal 8100 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 a3?Q#Vrbx+U|F6G(_ZaA!AWIQWQU3w%ka@`f literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-hdpi/ic_logo_dark.png b/product/modules/agents/android/client/res/drawable-hdpi/ic_logo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..5ac68d8a294811b395c9dd35996be3a36a415130 GIT binary patch literal 4699 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 a3?Q#Vrbx+U|F6G(_ZaA!AWIQWQU3w%ka@`f literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-hdpi/ic_stat_gcm.png b/product/modules/agents/android/client/res/drawable-hdpi/ic_stat_gcm.png new file mode 100644 index 0000000000000000000000000000000000000000..71ce86772dabb592fb1dcfc6080f24c0e460c022 GIT binary patch literal 1135 zcmV-#1d#iQP)f5@MrJD8Aj_ z-K)#+sSWkZs76pQPb1Y<1Pd%EG(34ZEcMnskdMh zxrc`b=MHDjC}CeAt@;d9335De}5nP`ubpQZcgu5 zT@EN0Ff=qI21`#**9&H8X$iHpwGa^zAzK558CqLgVQ_HpU2p_8Iyx!_OHEDH3zn9a z231v6!o_Lwii!%Li2C~a!o|e}Y;JA>>6AXBu@e&$VzA`oWEmKB02=W0^u*__udj!w zs3@K593CEmr>7^i80NFPy9*5s4Y0Sj_eVBbXL@>C42C%)SzBAP325T7vNGuC=z!bX zTfXb&=4SBo^V1gq+3(Z~%gf7wS`QiZVP|J&I5;@qezf_SnHe!yLP7!uOH53J)6-K3 z4-bctkrBXX0u~2&dwT=r*}qy-Qxl+0F(?x8yu3V?lO(KU1U5T6D+Y^+iQ!-+B_$ME z2nq@US65f4tgQT37McI*>MGRL)xqWEB@`DIQw2hFbTptuaIl4i1u+;pa_saD=X$mU=-fr;bEAZoct&gA5Zy~ zot@1-s^0eYcJ|xz^D`_jFN?v#!ooOMX=y23U0uQ0*ci(VrBZ1SIFb&`Wys0N0V*_Y z#0YF{ZA}ao930HSNRLqPAT%_Tse5&GwL!oZ7Z;(XrUv5T;@D0+mVyc!g)1rplyhC3|^!Au$$%1qKFkFw!xK z5)GterGbVpH#awkjg4ixcyx3GD=RA;YpNA&sJrw`FK-Y~<6@ z#<5F?!F+stWMGDb(Ki=?;VnfB=H=xj8T&7rEE~lT3D|n6*i?&8>IGketxbKOpWgr%9E25Q*r^lmEbXI5KR0;5Fa0} za&mI|va_?pRR8yzt1(FFbf_%_1O&j@+1bze`FY;=WKRV2425@km5Yl@A~9B|!tc|9{Q@7*>^ApatlRk1DJFwC;Oj}wnR0Qx^=4a(;mr;fpU2)S+v*$Zw4Hm!FMjcB8|GJfd{kv2PFKd@ zYM-^fQmxZ}`@p`qAWlp+7NstuPv2P3+qlViFo1Dq;-5mLDRW3%UpZ04<%vGG9BWLH@F4*_^C^Er-cNwUr@e?HKo$erUK1ZOdtK0%Q>k zG%<+eK>+L~FF6N#jGP?S$j_7q0OCS&ecdc|fFmG%e+Y6Cl64(U;^;2_z(m<%Yaj3= z5~Y-{2_hW(Y`#)^@l-A$l@mC*9!(-j0Z1tuFzjYJoCERm#TVuFr=VX4Y(8I>lugdxpMt#w zD}TV0qfydtIEWy18yl$wIXw^XNw5djO`Vua9`ps3{7{{WlS#ORt`(+;_CXzmOJ9CC zy91Vfxo|YSe&jlXtJ?hf!ylW9O_xW>u4)n`KQL1s>~_FaR-cv`@&!y~^r?;rf-cP) z_5n#b-mo$aHT1}K)1)OGM$_RtxnM`drfh6VrxOB-ej|C5cu(ZqcBx>sQ*&~qBfVUq zRR3=zS~=Ez(2zXF${9Y zE=&vX7zV(_++`&s(%%r-_KrJA3Y70yY{)Ah5gM?(u^PeG_o;@DD`hen^SS~ zTH}Uo^4#L=#&Gjy#=}xHj6UUkSRm+e8nvE{G6248ho(5+K0hAJLQDVLRei~!5d|J@ z0cAUWYX~ck&R{uKH~wst;?if&Am1q>dz@0XC^4I=tLj0el1`vxiqhKH@Y?;6{6df& zdmj=Urh4opo4ylV-ff$lN(T0n@P`p%v2}hJR8rPt?v}T!r{YSUw!h))dB5A`@+yQf zc$oX^XjHAUp{Szn<->eD?g+iXF9>^r_ul$>=agAqY{5ch7ZEs&Bh*>`6@*;04<}}X z2T7er4n0{apPfq_w*dz{Su@Swe51O*JDa9_u6Mwu$y#$DUw-!XF{e$>e-w`AyMqlb>GHVx zc%a*FnA)JzJn}``vxMvgTAB%UfZpH_i88Vz&O2@S8)18#uNun7D-ySYWa@jHKvF*(f z*ME*QoetlMK$r6+^v+aHr<0`dt+`ibmTh{7$Mv1_yhf`r&$qh*zR$q6PGGKgbSRfX z*ge)+(NZXmGa)I{oUIYab>A@Z`)$603zZ+*vYGd8XFKoqlOo$Vt%}gud6r6o#G98_ zt}4oyqHw6|>??qw&9?m7F!i0S{eu7YD!X3%VNZ=n;%WQ-sm&pQw+(UBxlG{N1W~Pc zr-ckL@~?$k!RLHeH|L6aILN-NJ=)TA0kOPip3$NcQ5mVXyY4z{pJZ;n^SQDbO?jW2 z_o4;2YB9{hNc6#hMmEY!le%v%Sj!#T1`_HFa>$@}-_Wj<4B``e4tCj!b8jhJQjr1M zbr+6oGpgz|OHGGsU<#g~ncG)s;7Ei`@4C4@sVIyp&N$A0&RMptbL|uVJ-^M+kly~q z%+7OeeZb2Hpac}LcN;Sr2}xaK_BfH5G{cONG1Klp!aHJWbomz0vQtYIGqP%3E*4ka zsns&82%W}EANoP&oS(!819j$-A06Lw?r0%^UskuaSyJ786=~T#6za70L@1A1Q05E6 zE_e-ZcAaS2qJN8QdKbRNoS~e_1BegUw141s-uxddG>e24qqGUhAz znylsICJb?7rg=#l6~{WD4!2!#+Tl_in-4dgJppzf!i{_>;ADAE7F>+FZHCJ#l_18c32kO@L%d23wqoEFWcP(H(hXbYPgs-RDEeKj z)6#8o1xW`E;Y&DYLVZICsTlCdZF>t>try}NzYzX4$@usO^ZzW!(1SX=O(#MRhAGFZ zEOE$LBHY5=D#;1ieY z8CWEA1L?1$HSa$7_I_hkvaxuOo87$RxsfC9`%$Q4{JOt~F@FU}&B;)}M)tikR>~CY zRLE4)M~BXwJJyHJgi12fciO)q1D~@Lt4Y3!^eQ5!wf*b?CoMet7wML}9fko)qk0$z zsOTKGeM<5K2K|0cO^Zrck-PW4K-E!=OZ4q9JxZrv+>`xEHC277iaDuc5^?PSNnQTr z$L0aEeWtVH#|Z6w>syzi!TqW@mB`Yj!&oKqmQ?A;&%qPb#Tkl@QJV0&T@K0uA!GCYTS3Qrr@9)Ln)KGEO zly;(VV#aa(5$8>Yr~DA4k(Z_D0wHkgd6wU35v?T$X@jNBc01+18@i{OU6ZcgUAwjU zMn*>dlY;GcD<;@jg)h2hn=Qx#?HwGfP;mB5!1f;;d4CV&Vc)^#Exn6#3B+8Cec3ZJ zXn%3d(A}U$_H7>^;@UrNAP_dF0es+ixjymmJ#zY&%hj$WtmyIbPQ=e8i|f)M+f7t6 z0JX|s`ReKA`&tqCN{98%^1xP@tVLu>49CJBwVHk;`sD1rvGD$L|I_Jy838F~dS6%V zKpo8i%ri#ubrGI^l@CEuKzu^e0mF<6>3)9O$X!){dE11?tO++65oJfC=3)w|>~VGf zd;_1Dr;|r_dC96Wnv|-Z2YLj1sZ_BZzTG7KV`<5sgd2W1i`4&T8W9M9zP#lFySQYQ zBx+=^Ai$IsA2^{|MhXL;n`Y))sl17-?73g$b2x7Kl-(Yq`d}lG$)}soUlpKnTx=>H zMa<4m#H*BdM*4o0;uJ`dN>5cz=%zNRA%1jp1dg#|7c70@q*B!yU`pg>XpjHBHJx0hgau1>{fN(p@dfwK57rV&avUL@j?sAF@TL< zxzO(ez5{@|{vP=qVcRtz?{B(A*AI$$5$4)zq!3*^w3bl# z=#d82esa-Amxko=!TMLYmtjY_FLz&)+J-t;JqyD0qRGIZ8CJY1y{r;dTlVR{8G$wR zZD*y1UCiCHZu@O6Utc!C+ugrm^J50mw~eU@XFA*JxRv>UZ0r^#8kNcxG({16$Cr)- zePPdE@tyWDXMVpmeAQdU25Gk#L!*&H7ITeMoP0x0PbSEL#6ZSH;Q0@q6RFj_5UNT< z(_9t=Oj=Ro!>p2vmW4+*F1xceH^v@qyzJchv5LnW&IO5aWUE`)cRHkxajA5eDwO%f zL91`sp#(7DhW~WfZji1YiI6rGJ9`9wA>3On?I4Ez)mp(-4FCwJ|87;z9BERb=^ZUP zSu|GkHa~MkDQ5LYaU)Ge1gYQI?7JzffF1)} z!Ko~4ivcdN5dw?hKM(oDGTBM6vfG4uZ5rQ` z13?!{N8|?A#>bc9Wk*9MUX|bT~ec`BVE(T4YPx|(Zqy+ z9_@KMB1rv|d};qb;#b4k-h{CP-Dy70$3LS3FDEbhkQ&{n7lG(-RQlU1@NCz{VDg4u za_r^RkI6rIp_Q>Z-oI88o_R}|k$_^GLhlLPqt;0PpoS_>_Cu);@=#-Borv`u)k#ed zGs+9iF8OQGq737n3l|DsRDs?+{>kVq3}fOFC46Iz+k9@Mjo7)`pblFnub<&1S#KZF z21lDDRh%DR?#FFa!#Y9x4CF6>yK&TjGWMl*W)!kzcwE;iI@oJ4G9NQL)Av)oq;Kp| zwbAU|w_L79rVd+z&V7(EB@}K2s6rYTdWrf;mp%oh{Yinm8R(Y$oB7QTv{{7O{fXy))>dd3pEkD*hu8V`o0 z#IPE=>5Zsh8Tt5hPNpOjc)1>3&Uy0f6Pv|3B^HyVF($E|jt_?AGB z(`nIC_rQoS68o`md_Iy@)n%}i?1alytX__>_NsG567Q%H+&-i*YKtUgBU zY%POK8|{-Klr2v}G22;HtUQfk6vX6NQwBQuktWiW%rq~r_6y<>oD0zwNHRGcIDt9c zL|{s2|B_iqy_yXm2gn8QAH2!fD(g@c4bXVq()%|~LaDKIl?>+J}NbiU@E2#O(x zwIGS}z1f~$D)eg$Berh|=oku3ZaP4!2rWe$=?M?rC8dFQCxhQH)$miH zYnl(?g%X7W*NMHY<&K0RDtoa(ED&PdfMTXP4mXFHo-9B%vE=M{OxT98Y+CAaNU-7p z;U~i-Ob?G|S}K_iT&jWlNw$tRGf^W$K7hg=Up@QeCwbv4(L&F@%Y!E#*BnT=iC6Z1 z*V6WnWb@^!vNF`zk-O^;%!10|ttmG%9ymB@qfW`H4R^%{7w3KL|0#@JzG~Rn@u`GP zWxrcsWi*N%s~xQ#JsluByevVnT#hA%vs&yDbb~1)c?~s5Whe4& z=ebUEMvHG#TL8(L@`APHjRj@k1mk2vIlAT>wr0wTI=$#W7Csx>IPmpFYb{5!b!gmz zlJ$KrjVaN*X`|az^{?^O(zW0D^Gtz+WlGj}lF0Vp-tZyYb=ZsvL6Z>Cv?)-@FH+87{jtPj7v7g-aE>1N}a&oK~R~ zC4e4MSqXO+S{L=2)eB?A`YCtLV^pfu^tkc9LDk)DtV2KhpJg?d$?^E2M%RGt{uzqO zq%x`=RmjGdiK}kh)=&cB8gY`ZCn@erY!B1(pqPSv73RKeD!6m`-@fqhV2kt?qNZ$e|P7zF*{q@UYtD3IUJ&4NQ z-vXbCtvt}Zxf$<% zBPPE=4q5PQ)&wQ0q6=1-2qgCS-mhJXBfHyM6hE@)l8HuBfV8*$ zIqUVe06=&C$F3#=Qwg6J3i-@0vOWU*39Y`H$48`kbpmFU?q{4CG@32eGZXs^wd^L7 zx${an)`rOXXM?=+`bM?!D$~OG`hGrAR!NFLWxp8aU3H(y9#KD^v@&xWiozi$I&|Et zLn~Q&R0AC0-+-f!xGZx<6)S$)$gO!zjOA2?GSyX($;%&ia6b(SG5%Tj>gfj&adrD7 zKf!6^m>s>Axyk#dhNTD#p-`Y=dF=&Wjl3%@w!G3NOjYK*q1rdKZPL)dd@Rf#pR?eW z=6PAs^Ty*Gc5~3uHfiAFTIR}Wc|ARs*f2e12av~4l*#rM_~QZ5+6o-vcVm6IdL6r# z9KWUjv&TOasFyZhGZlWnY9YK*IG-=PqMP_Icq5VX+npa=w12O9?V16fFrYgan=B`F z?%ZF`&IY~9`XrIKyjn5wt(@k^S2L?v;>b#7zYj06lGV=?pAC(?`1NVyN>cKg!NwoX YLpCP`4=;TDy-p&I6P$r6+w(X62e#%|Q2+n{ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-hdpi/repeat_bg.png b/product/modules/agents/android/client/res/drawable-hdpi/repeat_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..1282b9cde88b41bf74076f55af2f7a6f03332133 GIT binary patch literal 7114 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-mdpi/ic_bookmark.png b/product/modules/agents/android/client/res/drawable-mdpi/ic_bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..77598e5c393173fb8cf6e811659c0a4d3ea75425 GIT binary patch literal 2919 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-mdpi/ic_check_selected.png b/product/modules/agents/android/client/res/drawable-mdpi/ic_check_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..b44af9284b1e0fdd38a3f03beb19018ebe114620 GIT binary patch literal 4182 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-mdpi/ic_launcher.png b/product/modules/agents/android/client/res/drawable-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..5219466ac84bea4b1eac8c20238bbfea733b453f GIT binary patch literal 2425 zcmV-<35NEGP)$ z3rtjJ7XF4o1_q>ppwLB8qrnFVBcLeq5YSpgQR5p_6pPjey2iL!H`&-yWmjr^;bW0v zDNwW(ciZf$t65VR+EM{ose%u5f@pbK^XP2lNlBf)Z3)lKitgl-#h<3-+#_` zUcU^#@*(?`%a8vr06LvccIC>ID06f3_n$p`=B(9fP3VG*27jmftWf=?@c&(NdPN(~ z(K_{(mX`l|^ytz4B}T1`Wc{p+j#fmCE?()2Ck>G|P=sx6fxgfX*pt-sE zf53@gc_XZ>tT1xq$V$>`^t^fVF7yXPe*l=DI&~^enbQuX~xT_8h4zRGW&;w)v zA3S(~wzf9?Z$x0?r-_M)AhWZxbJl_d3zpK?&c1@^4*+FSQc@n-ty}jUHq?NjaNPy% z>3h}@{Usi{fD06aZCjf83=8$OqHPH>Aq z-na>RP6$xLhYv?!pg$HbS_E%zZ=>HZ09q5)*4CU5V$7H^`H_*4(rJL)sG1TvRY*vP z5rE3dO2ox|gtWAD3{e6;BdqY7K?=0CYjLfj8AT79U~4}V@q70mGBQFB;`Z&^AYOqJ zItD-{bd^Xfof~BUPoF+j&73(CUS3{;AT0dGO`CD?{CTXIG6b=Kju>gHpq!er6#8pu z?ZA~g^*H!VB{VJO_#`al^ z*}>FzJ+u#t(0TK`-ei9KsTrXsN)Zw^AD^Xu3XTH@4jh23t*wwwj2%0+kVq^YfFnna z2mn|EzP`TLvu7_3{CN-l_TE@{4YTSJR0p|RIOUU#fVnj~i@(wX;CgNS>3g`S>BQwr z|0J`KWB2aeu(PuxZ)MNviL@GE099300tYx2tXds~>cR`iTI&KiZ9gkOHqah&*SYA( z&wzZiKXeV1(EfCTa%MBg%q)rw#}T3c}Q>Q-uwo{7QNgs;HMMa$h1P2HIH$c_Y;Dg;C z;7n!)7P(qunWr7x-d19uLXJ+Y4w|3akbAEI>G^edqHv_hdxW&djt0od$uZIZ)fm#6 z5Cfp-sam*jAvhlr2NxrsQxX@y_fL3OuE975OANO$L(6k5{{5&K_0(es2=Jr0@sUvu z^@{^Ic<^9uNlA%EczC!zpD{ESP7ThU%|dZ;F&Y{gh5W{OgfoK3+=7FHgq+84bO*pB zrc^>Y4p7+7q2A~ucB3&dF+JM4ILZ8wQNzmQ1)SjLn8fT1n8fUbh!>KQSecNJkV9tV zxpU`EY}vAC&Z= zkyy|G)v#W4M!+o)qr(eBVS75%5QXP^Vtf9{lP9=-{W`eQ$7E&`A}=JJ32oiFHJjQX zUfjoglfwW2yHO@_pI^|g_BwfScP=*Vp$d5br*F zs=T~BkXsa5=e-TyeFo9xg`_hf671{J($ZiSOgy~nNic3`aka%Ht*fi+Rd{Y{ab)N6 zlFkQ;wr}4q8Hp8i6dFe7S&4L-;=o-s?&`}R@o zDNT1;P7B+Rmx!Sj$nU6+W6gcgmkG%LM7PS%iY}DrxfjId)zz7+rasdq;?LjdmLz9n z{7y5v?8ubXQ?eF8ZAJ$IVM=p`TP+r4dT@pS3^bx6ZR%(O;PL#LQYbd382-G54# zB&U?(yA|}smaf5cQ706vnf|zAaUBNA7Yo}&7n6mB=Wals$E&=U7w26c(DnJMYw$WE r2tM{_!TY@PBEr{sd7pPl$_M`gmhskYYxV`&00000NkvXXu0mjf1zCRx literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-mdpi/ic_logo.png b/product/modules/agents/android/client/res/drawable-mdpi/ic_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..943a716e4f4c7fd0ed2597b9120f1b068eece0a0 GIT binary patch literal 3104 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-mdpi/ic_logo_dark.png b/product/modules/agents/android/client/res/drawable-mdpi/ic_logo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..943a716e4f4c7fd0ed2597b9120f1b068eece0a0 GIT binary patch literal 3104 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-mdpi/option_icon.png b/product/modules/agents/android/client/res/drawable-mdpi/option_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..004c41b5bf85431a2e7352627329db41bbef7631 GIT binary patch literal 2894 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-mdpi/top_bar.png b/product/modules/agents/android/client/res/drawable-mdpi/top_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a9ebae11198155cacaaf58fd94fb1f63456b18 GIT binary patch literal 20898 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-xhdpi/applist.png b/product/modules/agents/android/client/res/drawable-xhdpi/applist.png new file mode 100644 index 0000000000000000000000000000000000000000..81aecad314289639a29ae258961b9bf2f1ee87ec GIT binary patch literal 11689 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ℜ#Mc##vGjoLQn$Yuk_=ek#6R|eqw=fjrEy{4E$Nn^4oXJ==30PTu( zre~ztwhBG#zR+&is3Nqw$O+0vhF~l4t?qht23)dpb)WQqU@jo}l1Hj>^-5%4k)! zr4E#PZ#UDYJVLVAMdK z?!K5-?tZvh4(~|^dz+PiF9L;$PK~xC+}!x<>FZ;@Q>>c#+ZX-@=s#NWKU`qV1 zo@4bn_l0Lob5|&0iV5LtEW11Y@ch9W%x4a*WP^o;R7q4Ka+Jd+-F~UGSf3SgOXigU zY5eIVoCYw`=|i8z)m5tdhK%izRR65(>@JTTc3{3C_iK`MEOldD-3egYGp-$&Q30eV zr%gWI3O2j3e=Wzlc${25VDC~P;Hu}#(Us*|H5xUqEpxdDTv}= z>JUtPYFxeF)E|7mtO{xDO26EJ-YDU*F|>3`a3}IEfbj+24<9m__BMK9KOv zA?S8ibP(Jfo;ZVjM88?TmK6>)R2B z-$@RNCx*-!0Wk_t6b89%z0*=_9C>?Usvgn9imJUm0nUK>OB1 zfT$MR-x>GP-%}5f?n9P#Go39mDe`wLRRmraMl&s8GYOqEVaU6XH;QQo?M83F24Ps0 z8B^z?uZLP~=|%(@#Dz60<#qJ{c%s`crY^g1j5P>u7WK!TQO7xxTLsFQ3976FCw0pdcuUC_d-AMl++pL}42P?sFuo|d97KqE4WZo<~H zL`(kIDT}ZK%<5*QY9|$AjrB6OkTwu22oUGwi9@0BoHWd7uga=B9QotBg}#3~?)k8z8DFMSK!`zKLBeRnBk2Xuk8zTmM@Ilb%j`b`4GJBl)jzEVfFVU-_n#?+$xd|<*O5fEA(z4vv+BaxN$;7Op5fdOa{A@4n6;P#u`iV*)BFA$bX zp|%zl7Bn6raVGj-bOFf|3e9S@n*y94N&I`l@{e7p{_Try?(<0zlP-@+gJnjnE75retv1uFNO(^m#GEFo?}u8IG}LHSI>7<1kvr4twMz(K zlJ|C#2QRLuF;pniPZ*}o2O;86_?sLbOD7keujX5vCOqRMl^H|KDifY?p`4v+b>7*N zVo@vjzcLTMF5|th(Y=#QnJ99KJ9U{YM~t-8`AzDAKv5eg!a_m!*E(U7sPih*%yUKo zFnAJ(el6X%Xg2D?jep|Y1Z{S}?^P>pUm#=1)^KubSJ&v#(OV$D0946CBT?&v{Tax7 z5q`1RSs;}KzWApJB$vg71#?f&bRe9a{&O^y|vIEv1=^ogJGZ|G%$M z07dZS%a;tQ;X*ZpgkrId4Nsyw(?tU`sWRi}+gS^6`EQ#7$SA-$CZ2hpAG|3UmJY8_ zUViu|d>7K6h9!L*Emp7**veVHe29noCjh3_v0T{o&n0i3U(ut5lR>t(O#>k`{sL`WD`P2_jY!%Gl^5a(s@`$!$ zTAeJFakTUWA2ZJo`nNJD^VGSP6!Y7!tW_Tk*fJ@s0=C91Z6no~G19kCRgc9qiJO7V zoSU1YrqJTw;w4Y)3wvIU$j~Y~FQCOTFf|=|>Hl#j;xa%C=y{2Ztf{wnr)%M*o6cOZ zVQ&`fQ|*CC%H=*{l|o?f$u<+D#d<_IV?F0-Zhrn&u3eD@;Af&!K<)s{W^Zp#;>oNx zs1Ue*JoC$-_e=n`1_V`}ZR;oyGqSnNJ{#3r)&t`yfRm4&ZVh7!og0$vHNBn&_t`bh zGmN(!+P1PW+q}R}kd6QekGH_>=iKLvDhK4wZA$cNbOb&B;sWC#b@lb&t)Z9y%Sixa z0aY8CjE|s&uEz$TYk+(SY*BMt+aOT!bbh+w0RmNlh;I_`SQFl9@B8BKi%m+U^h6A5 zDTz-wAbRj@)-IUbzF61z-V)$wENWB?Z7t`M=>d)$^-8pDlc9dBPs|hZ0(2(RTPS9rNy)* zDU-|StyB}r;suy(3nzulg-zeZ*%{CB@^bjL9hjJR`0yrg^39Pd0gR=5DLVH_us_UFNnYJ%>Xa4sO_lcGcD?g^_ z7TQL1Ui>gSJSQ}}kF^7kV#qNB(;?3Mxl3ymzf%FR3I}^dNxt3Wy*#aUGK0~u+ZrkUzI*psFi9X1^et%9NE=gTPa1$+fB`)mZlE}uWQf%d z*iSnx@V}gwO#C(^i4egJ#jAap6TwQ!9KaRaIO_tOZ~hFTZq^1@d1#GAOfK4 zy$}G_t$p=BX9lc=2=bH0TMOQ}`7OL85xmnh&}e8G_d8I2>RrQQ-J-Jx(B0k#Q$DHn zCaQg?9Xkub9ry*5|G^j0!Pn7i$i=Ckt5<5pAH=G!{B#0us{LB$Ph&9(2bw#^` zRG|1XEJ6f7iLBjBiYJ!+Bf1QDK&OQv`-NEWm1Dva{s{`+Juvn&cHWnODa}0#K~jQ< zX|*cPcen#?4Gj%Gg`O?PHPks?ee4TL--c`S)<*`yWe>#m`WlB&X!l UKa~O_)hH;6vT8C7Qs!a*0sJ2cUjP6A literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-xhdpi/appuninstall.png b/product/modules/agents/android/client/res/drawable-xhdpi/appuninstall.png new file mode 100644 index 0000000000000000000000000000000000000000..711149d214f5b97ef411a097296eb38a1f7e721e GIT binary patch literal 10092 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

>{V9l+d<6y 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-xhdpi/ic_bookmark.png b/product/modules/agents/android/client/res/drawable-xhdpi/ic_bookmark.png new file mode 100644 index 0000000000000000000000000000000000000000..82f18a7750326c2c2642e518e8703685690e3fc1 GIT binary patch literal 7078 zcmWkzWmFVg6TZ945=%%d4KJumcgfPbl$5Y^H%bdAol6LUw6rMQQUU^kvhE~@+bQzktDcF)_oQ>2tq*5c z<2#${4p2g4O|3(2|M&-^TIT$i*Id_N>y;v|(yE5YrsC?*rE zO8G%n8M{-Ib7M!TIbb@n-|}_ft@{g=rMy4AeMQ?>5-o8zA%zj@liL24me0@+PxHt| z40%RdjHf?yYP!)FxoM`36{03BhBj)NegA7TzZNFQ=8>aw``H|C7H-HXbYmt|cxCvr(z9Qm(oJdUM=|Ink@v*Gl<8F!!%Ab08U2e4Ts{XQiyUm1!(T_G&Y160JUrE4_G;Fd1?8H@uW9J;#jK>Le$-7SH1!jE zT$NUm;q&;)&l;1sKQ}CgQRx*eY4ydio!`)h_P@x6=N?9&uw7{Vj2>fZ&EE2a8@XI* ziNrAT#2Ye64wL-V;S!uOnn!tRy^P84pw)uMYQ#|ruWlTv(Zb$-sa&AhJD2M?`txhy zpd-M09#fyiV3uq?y&`A@NY#hKd{dKujuEEzigl zD^+`EEhh|`%gU-D8immkMwNz@Rj2cR;G;q4ch>yG%k1DJ*FU*JUPeqAGdv zQqM`wLgZF)h5@(rHeL&j9{vv8Q)|}{9vAX4dg@;V0+lB6q}=QL(QMZ&J^iy2Fo?m- zVj49oaoi_sJ-7K#@xBm`Vl81xwtir2VXhM0uBc=aK{^jxuj&9m%r*n(r7R4H~LmBHsoo-=XM77o|}g`USqg{9v9KlJycc|BCo;u?KvN=W8Wfa*9w&*eN{So`WbZ#GThgoN#|p(-noJDTWIY|W)+9FJZirm8 zD_WoCN5oKRWYHl%>=g&z)3~G{YkzD!kTuPb=BlT0Bf_?oHqdLhbt%|mQN&x+q_=Wb zzY1XoUTX`t$3R|2Q&Q^VE2^2nXMrjs!B9^H>npvQp%i?{Od1{~APVp+cO-MuSqZE= zuHG~I)L3GggHso22h*S@N-Ick;S;!uy!a`16K7$CcER^`)$&Ds6D5j;gxE8Qx>*p~n<|}8rw8u` zq*4a;yWYZa-I7DzQ}_9@Pj!oDKbbw~Ly>|us?Wjqm@TH{X>Su-ih(>!xfx0$?5)DV z$qTgSc7nkEQMReq`D{N0r{p~#{ARPb6R~TeM~p8k8z^A7Z?0!r3SlzfoFI2bBrvp0 zzF&EvNI;wgu6sJ+q3GUXEiDG3rIW%1=4^zq6pqNrV;&%02$r+p~dxeke5Ih49Z zXKbEC8mcBaPc+@T5IH`p@ujY9wMXWhHQgIeQV_}8tK$y_$hA4$T zr{Y|8UowtJfylS~){@`nI-8C^88UVJ#4} zam^Tz=*2W&_fG%9`<>x;@iakon8V6&ENWcNdmQ5OwFd$4VbhCR#D+f+g8)uX6mmAS z;8%&pZ|9`XT(4hJoII~qVTavg;G(nxVVOTg2YJo zu?eF5H2BSjjjd<8rlgi*h8rRkmoM@5X1KGVMrhRAGVu7z{Nf;F9a>mk&dr0zgs}!O zIzcOuj=mo}BJ&m(cx8`p1vYxOP5(2*RP|0@-vme2yh<>504Wa{YgU&xHl-d*J78B0|BSej^F1;2#_ke}HQRSn3ESgF3k)W^MihujU% z_dm#_!EbGC<;!r+h_Y*<>3Re~n@Aj-Z&Vp#`&QEse_v>!BU50e{px+elR7Kiin_OV ze#yzQWc(b%D|4K{gKMuX)d6)efOD!G)qcHngTW{n2r>+(#?D|?DR@_QB%WP`+PRgo0ucCNkCocN`uR`Sd<8DPm8g&2PvTE z^8*9S-Mj0uRtMDJI@ooBpdsMvXB84AThF-@h(O_Acj;@;!6Sn5DSmmCjXD~tYZ>x{ zcxC41Z0pJSTbi?}-nFrNT_hWLTzA~>u-gdkZ*facCPFUnI$`g(%1PtNcrXw~3jH31 zztkB(Rb%Lo9YHV9&*J3^XA2_1SD{$Xz=G-a;6NGNc+p z(lndwu#ETk0r=0X2dhEFw{>lOR%zmk*FApx^2A#ky}{GTUc_S+NX1f!#OzGe`0u0; zO#dsbV~?aSUAQaxo|eK&5^$En&|LTmhEHz00CN(MPs&tn93Z{-1HllPu|d#zzT7F~ zELUi@drBP*w(Y@Y;xGVkJITK0L(}LM;0A0!T3|z*^a{Pva(>JojLpA+wRlNyWfW=!}_gbjwVu3`Q*w+ z%gt=wlwhHS#j$&6+ePT2>db|riG6!9i?n){<@bSzUi~9HY~M<0qOoiWyuQs;7PIN;^3vNz!m{v#)_>$AwVfh6~5xh=V3eFXt05Kq!`Y9}@#DMDGXePa) zhVQ<7e6rRKcFQQ>pL_?#nB!!xhY(hfG?}y_ojT8@mug3L#@uDghzpLL;RAJD8M^1f zfRhA8!z1)qj17isV?ch$@p@F>0Np0RU#>$}K1qyDf;9t7=)U~E;K$}d6YY$zpEJcI zu&sqgVJ?^4TQ*@L+~2tgiuo&lyIAn`RysV(K_y?QG|nQ#d$niMHO-3Ns<~msk+`3~ z_;X+%slbI&1#~UzbP$q@XfVjX|AMAGsAb`19zyX2ok*9mH6Q4w?5e|`7-x^U283BQ zalV$m|9CHAfi@XMWYJ-bhtnJ2@#aNfh2u8RmHQ(pM3SRZemx8u&qp3>Mor>gE~UDh zmsUu8-bkFg|DAh_2=7b&(M0*W=tcX9G2;YZz`|p<%|_HGEe+@j8y;l^z)m(PaV0;F zsYhYn(U%v;ErW+NKwm+;g*3hbtNb)rIsxZeEu-T+{lWE(c3JQ=psRFwP?My-8a)$h zq(W!Nm|lOG&ISx34CvO74wAijh41EVi%zdCN|SQhdh(ctk3m$kZB+|84ue6Dui8;~ z*i~gYAnswv=$1$>;w$nYwi`<4T2@v0eGcsI6ukJ{!dceBj^G8Hlq1Cfx5hG+-WY24 z^$$UUlj4;aJNC7G_dTbd!v89_T%;QSl3Tej3KtUOHs!k!RwKIK!Z|TJx_lVkI5(G& z^Y5(ry7Ly%y`n_;xz~?7p9qiCP=o{Aa$%nj0q+QbI zb?*2-%435X+Z}m2tCsQ{vAT3zE3@5sK3t?Nbk`9PECyP=p6E|wm?4;(f)#MG2_}rI z41U#~D$r&2DM9UtO-QU0y!B=oyluvPK}S>XMG#q7;9gQ&TE7mI^Gz9g8+&srMVl#O z)OO#GAo+dKX;)qMiF z6Sm_gIg7ZaS1y3}a=ut)&K|o@*)zz!;ii)FVDPTzeyaMD7pfc)*5nd7obXk}|vhGM)*una;ybj%Q*E1gu z-e?U@GmhfP?pG)BTP{i@$5he|?=`Q!)D;gj!eFTm6osvJLYrBwC6jdgPuY6F*w!b? zm6)ePA>((;tU{K;s%5W@-R(YQben5>elY*_T*yDz?+0!0aRxc>7jahUtt1a&m!oWP z0E0b75_?Zr>MwM$sL(D+{+KZM{rAU+09D6>0>f%Ljmvh+W!dI1!3p$D8Mz8uAGtn0_OzXqw& z&505uBA)oSMNS{i@J|84D=|)3^Ib7vmDSo&-Z?jCRU?{&M z!(0~a9`~(3Z%soV)GQ~ibUA&7+;za_+)HK?os3dv>~V>eJ#K7cann+DaiD=`(Bowu z{-`y`P}K$HvlS%_k`@T`6_|xasb@{O!d%U=QPrl4UfH8j}pPCjEgo%X& z>b?1Xa{GQpSLDv57$an*zwokp`X(~r9~cXiS45Gx0A2a$P#z(UvRyVpzc-brfWBM8 z@y4A#7W{M{GQm-(?!h4BCEiRhOM>j#Mm`x>)qrr?={roKvH>SCkQ?SC8-1a``VW!j zG7Q{w$dW0DgC}vocYnK(e{FUbhOSt?1R(Vz93%M=F$l5SK7sbMa0;k1a1XzTV(?V} zF~e|-O6rrDpcf zr7Sf^{3LIByG2btLUM|bDxs%lA z4IalkU$aax%ZA_k?8Nr;0|68U8B59{fgYu=;6>jF6wkJjK^s#x@RuJCu_6JnI^ZW_ ztU@F#7~Du3q=us)iAr#E5?P)JMGrTimVz(j8vwn{)%7Qbw~sC&?R%MCL;Jq%T7;^o z3q6LQ=SNv>HJK3JO!Rp+{P==}h~eJjfZg$T9$0y&=a)=rEU|FA@ls9c7<0&``Zup> zXN_x6vj>L_nEfuMNhcY#=KkAwh(KB4#_4BG%Qce>UFOHK@$) z&$qk?DtJ~QOTsekSXTU(uP(xeyN-CGjUNucAsn#34S(ZrnCf8`!XdNLp>VDk3JoBE zhbmsxru549VD$)larU(@ZQNo4#id6f14fd0$>Yn(*Z=x2q@iKj13CjML601RJEX*q zl{Fh=;k}8O!%5zJFvTd_zA+OGkp}-!rWjk+jDTF@JibiO!^_)MuoR(3_z)72Qk4st zBr3^aPRFoiTwR5SSqLa`NRxkO+7pVCSBh~~-}}*H@`Nro>T|Vu`jnWV-&Y+5ewJUQ zTbjC!T~jyS{Gy0@hlMhj(o_6ErmlUjb*!T@!K)RS8*tXcT@is?8vad{C;xTtoWrcy zBL;%b#h7y;gDceiI#_1v!1ouA!%Yi~;G$qDJF|z=jPguE<=aTo)4Z6Ng#_j%38R{a zc`McKwACy%rFr+_%%rCTX9QGxJ*M$?L-Sa_L^$<-bpDnN4Ic5}jHBDjy7_$YVVkaQ zABEV2hm&Fbo&xs3mT40vedEth$?6*18_A&_51efOWpC7 zmQ2W`TXeWYJ~NXULe1po;B>nS8N{x1G@BdU#<$8?LOP{iCFu3SZj*!Hcy*+dP{# zG&pJ(HcPZRu!olpiz)q!?3TFHr!&cW|6URGlIQG6Tt93kr8H@*KjOxxig^Ai`%jTpwPLmm z=}XG)cz@N!{;4*>Tv5-|S)F()>R9TT__h1LBU5P6xmzXm5{VBgU$GP7Wk{k9r%Z+R zLgqTWx-Why$E4LAwRWw}oN~_il~|6wDGpO+ zT^gjWbh#oZ{jFkPb84hME}RfCder%M+m>pDC}1VzR`D-;9-EMcJzDyF?}-l1D>qPT ztHJ004rj(r1*+^jzF$Og08e8N zabHqzJa2pORgPBj+|XKGec8u&U6e1Y4Qsozl55f8LN z_SI0c$3B9dkxND^O%b^{5ao>|zXR*k&|ZD7ebGhS|7d2=3Gg<1I}NowEMSvB0#J zbbXK3ccHtaHY)m0TlSe1S0%C~@k7{y^=pf-4z4Jv&|bm)TmKZ@T;LtDZ^yZwa=(h9 zx%(FRnNhSfi|r9J{>$Uy+)H{s+C(+W!Cm literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-xhdpi/ic_check_default.png b/product/modules/agents/android/client/res/drawable-xhdpi/ic_check_default.png new file mode 100644 index 0000000000000000000000000000000000000000..cf411b455252f1ccd8bb6156490c88abb4d14fcb GIT binary patch literal 8569 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-xhdpi/ic_check_selected.png b/product/modules/agents/android/client/res/drawable-xhdpi/ic_check_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..88b1110261049a5768a200beb3ec64e251257e49 GIT binary patch literal 12609 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 j0q0pSZz}L3Yur={ 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 Y5751+GwB-bumAu607*qoM6N<$g2tis3IG5A literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-xhdpi/ic_logo.png b/product/modules/agents/android/client/res/drawable-xhdpi/ic_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ca46dfb347d6965411975945e08fe2c59aeaa5fc GIT binary patch literal 6475 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 VkPva6-|ycW%JMKsiL9~z{{X^0KqUYG literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-xhdpi/ic_logo_dark.png b/product/modules/agents/android/client/res/drawable-xhdpi/ic_logo_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..ca46dfb347d6965411975945e08fe2c59aeaa5fc GIT binary patch literal 6475 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 VkPva6-|ycW%JMKsiL9~z{{X^0KqUYG literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-xhdpi/info.png b/product/modules/agents/android/client/res/drawable-xhdpi/info.png new file mode 100644 index 0000000000000000000000000000000000000000..78b917243fe06ee4285fd23acfaa765860f0d5f6 GIT binary patch literal 12733 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 F{{vR1t=Rwo literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-xhdpi/location.png b/product/modules/agents/android/client/res/drawable-xhdpi/location.png new file mode 100644 index 0000000000000000000000000000000000000000..3c93225bb004916c4dd0bdb60512c5a353ad9611 GIT binary patch literal 13926 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 L5mYT^9Q=O(dlrfa literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-xhdpi/repeat_bg.png b/product/modules/agents/android/client/res/drawable-xhdpi/repeat_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..b15eedd675879df70ffd866b85cc70ff59cd3733 GIT binary patch literal 16939 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

@w9PXH786-xwV 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-xhdpi/wipe.png b/product/modules/agents/android/client/res/drawable-xhdpi/wipe.png new file mode 100644 index 0000000000000000000000000000000000000000..ca047ab527bbcc39c6bcb7e799738eadbf2b4890 GIT binary patch literal 14301 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 a=l=tlWajt_-Riyo0000RnD)5k1)n&3W|M}kk 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-xxhdpi/ic_launcher.png b/product/modules/agents/android/client/res/drawable-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2c36d39e78e4410901ba46e8461adc4bf845cc72 GIT binary patch literal 9581 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 literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/res/drawable-xxhdpi/ic_logo.png b/product/modules/agents/android/client/res/drawable-xxhdpi/ic_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..993ef9971fa6e91196686992607f0df7a1e4501f GIT binary patch literal 10459 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 + + + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/res/drawable/btn_orange.xml b/product/modules/agents/android/client/res/drawable/btn_orange.xml new file mode 100644 index 0000000000..c67fa13d1e --- /dev/null +++ b/product/modules/agents/android/client/res/drawable/btn_orange.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/res/drawable/custom_checkbox.xml b/product/modules/agents/android/client/res/drawable/custom_checkbox.xml new file mode 100644 index 0000000000..a0ad1a1a42 --- /dev/null +++ b/product/modules/agents/android/client/res/drawable/custom_checkbox.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/product/modules/agents/android/client/res/drawable/dot.png b/product/modules/agents/android/client/res/drawable/dot.png new file mode 100644 index 0000000000000000000000000000000000000000..7a3361fbec1fd1236c57bd34be595a5aaf9434eb GIT binary patch literal 85 zcmeAS@N?(olHy`uVBq!ia0vp^tRT$61|)m))t&+=8BZ6-5RU7~KmPx>KU~kIz + + + + + + + + \ No newline at end of file diff --git a/product/modules/agents/android/client/res/layout/activity_agent_settings.xml b/product/modules/agents/android/client/res/layout/activity_agent_settings.xml new file mode 100644 index 0000000000..ad864a9649 --- /dev/null +++ b/product/modules/agents/android/client/res/layout/activity_agent_settings.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/product/modules/agents/android/client/res/layout/activity_alert.xml b/product/modules/agents/android/client/res/layout/activity_alert.xml new file mode 100644 index 0000000000..50232ae14c --- /dev/null +++ b/product/modules/agents/android/client/res/layout/activity_alert.xml @@ -0,0 +1,35 @@ + + + + + + +

XML attributes + *

f4)&8pa{MTrd^Bdt^+KRphNNz9%3le_j=ZTL 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 z zwLY-|`7;5#hc8hPf&v0f^xiqdUkXN79)RihwpWrBO5zqs52P7L0I-r15)`YvulQx4 zm?yyf;p+gMf1xD%gXFiJxxcUDY%vSf_1m~ZP;7sLcx;Q3Sua~lZy2KxmDJEN@)b~6 ze**ndc*}J2PgI~?J36)=4xp*wW{c)PMRoGAOEW+Q_@JnRSHbG%(KD!O>Ex;CVd?n$ z(6{OZi0M$P5mo3IMF?1FftQPk!RRS}TfY6pG!yh5{k~NQhpsb_xEvT89WXXon26WI z(c>sv`pS8MMV#*=_!eQeKH70x#`drdAzIdv;5-5{dj}BVBV&j`kEjPU`vVQM;D5bC z@5qt6)S@v!QnUh#Jn)9RW;}Wv*d-vcmJXKIU?(#=ML~t#O#GsL3KT1VvaDeOthw}0 zFh6S$`1!#tUZmY@Evzkn{-a-BzTJARR7lR50j8jRM{F>rrhv<$2qE7b2a@VH3qrNN z4J9Lt34W&zKvn}747`(`nfhn4-z9hg#m*bZB)AVN3+x7T!7{^dNv=8l&vX^soIPEB z*agJ?w)dzl1A>z~8|?>`$BSSX@PHtgfgbL=Zz0XTg#%PG8;JD0%Y+)(27#ys>**0bjpzH+!;uK89Zr9Nx{lUCZo7+!ALoH6o19U?k zlDmU3V*+u)yCbi_>i(aMZM(M2QB2eziP{eexqwn0aTK^Ryc>Nh_Yc%99h}X<1}u;k z!936nodZJvgkQ~bN&s>_}z39#DX0b|YQ;s0~iV6KZQU_rvGEoxK41(~=T?60$caj4t& z&m8_Tpq+w)zJncr->yz5$*e5hBnRuKh$}#DaFhN3j_dt{b#1Fu(9Sgj?Cx^eg7}32 zqA7g2NUZOlK)2fny66K1Po+RS2X8Q1=p>>VO#bwsCryXGNV6pSH!SqNmY232h^e!dR>KjP=FX;yIW z8G^5X7j>W?xQxU=_WcJLZL>zWguZ?8M}8phu-(1izXr(Y9?%=yP}|4fl)&sW-NeW3%*hzuI6a64Th*f^-qY~eFD|=YWw#;!w72U zfwVJgMbsM%@_!6H0wD+E?=j6k@weTEcZvk^*UB0>3o+m_vS5A!Uj(`j&PD%&zd}R) zH9tWazMza+Pn}uO2;8*-VC%t#>T%?sap9B7p8`i0GRo{MzrF(I@D>;$d?D)Y(SPFM z&(84Y%*yL|aPSgHBig_lwfZE$4Pbf#n?u4dxsLr4CS3XO zNVWAHdh=KLP@dWh*r@`U)DFhZ5z+r=?0mBl=<*Nrd?}rNsSI`sA8^Y zV5)&j>Bm<;0w+4l%hI>7nH^eyl-L^Fui`Y?r^QA3XcYrSqQIH9T=w!TB3 zGN7Rr8}?s+4m1WWWE;Ymkk&%ago33zbQg!Lr3ct*<-FB^MfoY@>_6k9svC-1=^!=~ zpU4rff|C1w#qWDrGj-9k0U7Bx-J({b0L9AzTrf6XP^iMU-MlM9PgE6L>E`UTJq^p5 zJ0NY{wtfCbUx1S0u_yYcp!>D#0lF$os&19&kx|Nz3FW8gLumXXtS`_`NqJyd@Rc4~ za62Kou>O7F?B_~4%90Dx(=DSb3edijdaz#%zVAWcE_&+QMEBiNQS0lbU;6lYz&e=V z{8qY(fL7Z7$ojYS^lh60AW1YYDEtVh0tFcFn*$CE`Q*D%79=n4NJ5TK0I5R#58 zPACIFA_0*N+>E&G#s2nRk} z{HoSbQ)S*qoRS6Pq6t`s$FYL1=&3@o`4N>B{#qG8(&^E=Zb}AVo`WAr81toIYazPI zU@Q0jfZBTd*N{(pYSQdBK>7p*1 zyZ^7XD-VyVNaBNXi6DoZE?|^EAlx?yi@CUofe>!N3}HwHCo^$EfGB~0T!I_|awDe# zyWFsG1(q9?pb}V)2n1zOE(Jt1LUx7y)x1pR)qCANiJyOrGL!GCU)R~y)z#f4iaLm* zVkd3ybraW9SST6e;@(?Qj%{$VLiK-940dezW^Vs{G@kaIE-gn>M|)l)@GkOHg@JnG zAK#Dng^oBMhO|JY-74EdqbFt-FIcbGH#L6frG0}oRHfOq) z-q^SkTA2$GhA}o5R+o>(rk)fo4ffIfTKv=&RolV(oGKOd4#YEmrnCxw%nGj^q=b=U=X5JFWCRtl@G) zm*AosvU6v(M%%DXv7{npi(ra66(Gk_7)^nBh)jc2wLLR8_as?MLn6=(i_Mj z3^^O}v%tPMo8v%-yweuyaD-cv=;W1_ahQQAel%HnGnKl5&Vs)#40uf=Ik1VhK;18X z?QzkFE3cdaRtI2)GR(?N}L=lu^bcLDcT1{c#*4#$?ef$W>OazWBu zmY7#*Cm?>ohZlVIHj_gcITQ3N5%JcCKK*(HY$OXd!V40a&E>?|$jyA{ij5N3$ci<8 zraDtCSbsPZUk)x=F60bjOzyjdi-kz@&YpU^cVgLK$-`PKmI0n@BL@_w!18h+WhLIf zb^{X*Swg=3)r^xK=gEzhu z&O*j0(-sRw{sT{T>-CQ<0BDFh$;*tbnZx8DBrs1v4U9|`dV`rG3OYyMO|_unW?6vF zVcs3_+i*FU5Fp>-g@2PumB#Se%#~e=Bg|Yv?!?y!gW~05@GvXAjGOFZ?V8{g#~{F1 z*a#QoKOAzpK0!t~^T`)xH}FP_Yr*29NY~MNBr^?d3iKXDl5BhJ+gD{MU4pqEM!_?^ z&Pj68K0dS?oN(ENHBoXjr_#0foKZkn4=r$n4#|Z<@RjC7*(&Lx^7P(eOQ4IB`0({w zsWF8?h@khd%qC2vm#+M*7?sJV!;HBJ=lLNmDwER$sRbWhcva3?G=`6VyjZ6b@E2oi zp%L@hvZ-?R_`1o=9fh3x?Y`MYH&8Z%dU$HJe!QGAai9xwvg3Lgsgu*`OgieXhS?{2 zf||G%YCQjq8cvV9%kqfeI`f?CF!olM&qJAHCZ)?ESjaSIZ{n>w5?A$gS8kEGQUS?} z%nRO@!*NB(7AzF2-ajxg@&xD~fT#3j>_nipEpu~WOjO28EZfcYK$iBX@s;!Q!CZY< z8lQsZO_vWqvuN6n@nobLw0LGEDZaKc;49o{ZOH%-pTnomRDg&ofPSh0NxR?dKNCn} zVS#)d*8g2O64zItrZDf1ex3Ef<=WGzymuOyyay&`jvUiaM9kNoCtPs8{o+4f@%hw! znCouUFzy?r&6DG^slsd<>tP#T+pXuQF)AEt;|H?muapxuMLUf(&wil~$9w*fY*26a zf6;%jv|S~{iNmvfIAm@*^tgNG#Xecs?cVgfaeppJO(+t*pKfPpa;h_qZeH^Z(|dNB zeD!YIysRAPcnxZge9rj*37o)Jy~EV*HP*x+CjDN6y?3`l%KZ`5c$hhdXSNii4FeaQ z&!(aOx*)gSEl8GnG)#dobD_9$`mqC;*hEWr^Y z=d;%b(K&q-!wf0xuX~jMMrjRjxp8_rI>qS}zbZ&zE0$G_$^+OF0ON+x6sf1esPm1k ziwoD#X?EvvcXMLk4I+f5x3t>&FP6mzm1s$crZ{rHb?OY-AA1jBr;st!@g9KHd+>$vfF8ONUKS7VWewB zcrrCMZ-VfeFa?EWDbbLkkH#x{s#v@;HtT$8RB+nAXcSV`X(esFvx|i^WAlWE^RO~5 zU(0A$Ew3s`3w18WXqmY&BMmw}104r3(FEP|gCV|m-{Z<@i%Pcx(P@wi*Y3lIN}_t1 zpr}sshyO4*u-LtEF>noPhT%EsswYaQ0teHsB2y%mVshFZwgBW5K72|Xh~j}FI_YDr zX__+Y#Iu|mnA8Ei4VF$Q!SHSUqqr4TfmM)^#I06(jQd)Sx zIrxGS#c0X}QjE4Gr#J-dgM?;ldNOM?kUqg8m>c%JIz>VgbS+R`_u}P+Z3lvzWiT|J zPaF$U(${OrPdrP=>pVCH^tV7SotY&}YM{gr>ji0q&5kOJF`e+HT*h_Va}2T@Ub_{9 zwXt+V6<@Xyot6)N&0UC={A9BhcmxxXwd`v8!8DjFM*X17y9 z+Hk9Ig0A4w*YHDuU5M*1gx&0&3E7vSAgaOeZSi8Al-QmLTTA}(YuAC=w-^`QcIAvm zB!rO&->)R#7LpqU2fc zlU-D(oF}tK5J!g(z44GbgVrGo^5w|S4i#-911J@QJ6y>HH3C_tO_<~2uMEXiw3f4& z?|BMV-KE4dTZi)PZ^Akq5M1>>ERdFT{JEdAZ>X?f3uA3=&EhD$&==`@-xTYI{Njo| z0idn`>c>pJd9n(~D98f07E4ssd-q|&$d1{7?u;RDxlSCd9D=~z$#%l*PT`AOB-g6h zBQD&94mTry^V05-6eX5Ihhhue;r#EOEO11LbSM*S%~TZ<)1bBl@ux>(>_&^Ax;p^# z2p?XH8S<72P8X>1twxYd6Tp;dt)F=slG_LC@6Gs09Ipg0gbY&*DX<)hkfMqpp&van ze+czOoI?cT{+>HQiEh$cggu#RKwwr?5F*UEhZ=nNBQ*FbFnJG1_9P{yk>e<5pA?%r zH3lnruQSTx48_flqT|{(gw_0D+T-XrMTN`bW}rN!Am+ZTd)_?|AhQ9&*LYt{SAj6| z)GS7|wR$aXdj>V^j{y|-w^_4PFosDy!HT=5%>^}Yxtkc8_{6SleXwAyP}S%FXJ)IA zG#6udVuv2{-Gr*vhPW&VM=+Z+2bi{431BoqG5L1qR-O)qh2MgI@f@$q5hZz}wHYHb zxs@1l!}7oF=nmzOWAP4wtH)H3oskxI9yt=nS~W8c^!*?PBdeaUDmgYCU^@WDGn}QL zslW_YEolXFQ% zp$fN1#h?j`o_^;W82b6j#>U2Vr&OTKbG=ek2Z_Xe-wwc$Rm)Hm1h~#_UsOT)>_Hai z$YW#U0@89|4fH@t7?WO!Z;L`*Z+^0C`3Ud1(1#mhz|9hH!<)^bud48{6nCYdwqJ-C zalLK}J6_$iYyk|PGM>7wg3uXV{w(Y*K00j<`eQ+YYPJa~4P7|!{h;>1r4}3>n;PM* zANkVOup*S*U3+L$$yOhLd|R-^1I1B-?k$%zexcB;A0zJ7xl<6l$piJA5~zS zmq7ki9G55o&TAh1r42KDJ8Z=Ai7@X@;oG*JQQZA^Sx$Bajk zi%J{6JzV}{~Wku+15tslt>ZENTE+YIIPMsMzo_A9xqq%s~>(SFVFQDv^DTmLKl@XVO<(A&;)X9}v$C)&J-a6&6#juT#;i zQL>oZyo?3d=aq*-Q_P z;H`W0LTK3F{y)*VuU8<^aHhlhy;Wewq|I}7!S|zh1|=14Iy3AR^<1H-XAojl+zlY- zPGXs&I887$=EUVxgIzuaD4v8I?5Bd!govG8lzsEd!P=K_haFv6W{pv-4w%?tVJ?8& z5F#(9L<~@Y`Q)W#zS3Cz`_|n}tHB(yk&N<8ars~sfZ5Y@zpz=`%os^=OQrJt4t>_0_AQX)KCEGE6#1`9MV+a@JaC$ULnekcO@sn)Te4x=nDLg1G|$lmGca=> z?_M5lf$HU6UH`=rpC&|18Eto%8mF>5o+~vIYCMk2A&5~~sh|>LPqcZSd@>7zh8ElP za-DHyuzO|dS{gr9KD1sgXMEozt2@~i>ULWN4R=I(XwEa`@mPoj-A{&F9HQpQNk`a* zr^G7;91!%fH5YO2b%ccaObR_QD+}VcN0yy{8hGt}eiF{+D~ z$*J~or-WPM5+pPSeLMLXyv$)K1t;P9s{NsYrYnAc+b-PnBcYyuy~_2EQBRqIjt3r^ zns1a7)#=LUbY43p&(Jf@W!rhDkhoR5SJ643{j`Pu;aLO}OtWrH`3Zpw@cWq-ryzJ`_(^#ZVr++BE{|KRB4(+~}<+}lIPmBz3Z zArA7T!h?)IYiMS7piHy=kgrC351~AQ>qar5yt(hsLT1s@TN@{~JM^eFtSW4!8@$}X hz%T9pv%sbHf>G&n#}XI=o@FnFHlVe*a{my0{Xb=-Xb1oR literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/libs/commons-codec-1.2.jar b/product/modules/agents/android/client/libs/commons-codec-1.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..67cb720f5ed3f5c81a41accd02a09f4108d8b9ef GIT binary patch literal 30085 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 K2s`$_e*GU@T3ng{ literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/libs/json-simple-1.1.1.jar b/product/modules/agents/android/client/libs/json-simple-1.1.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..66347a6c86b7d6442358ca7643e4dc484fb01866 GIT binary patch literal 23737 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 A{Qv*} literal 0 HcmV?d00001 diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/.gitignore b/product/modules/agents/android/client/plugins/ActionBarSherlock/.gitignore new file mode 100644 index 0000000000..6d0dc1c163 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/.gitignore @@ -0,0 +1,34 @@ +#Android generated +bin +gen +lint.xml + +#Eclipse +.project +.classpath +.settings +.checkstyle + +#IntelliJ IDEA +.idea +*.iml +*.ipr +*.iws +classes +gen-external-apklibs + +#Maven +target +release.properties +pom.xml.* + +#Ant +build.xml +ant.properties +local.properties +proguard.cfg +proguard-project.txt + +#Other +.DS_Store +tmp diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/.travis.yml b/product/modules/agents/android/client/plugins/ActionBarSherlock/.travis.yml new file mode 100644 index 0000000000..e9a32d4fac --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/.travis.yml @@ -0,0 +1,11 @@ +language: java + +notifications: + email: false + +before_install: + - wget http://dl.google.com/android/android-sdk_r20.0.3-linux.tgz + - tar -zxf android-sdk_r20.0.3-linux.tgz + - export ANDROID_HOME=~/builds/JakeWharton/ActionBarSherlock/android-sdk-linux + - export PATH=${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools + - android update sdk --filter 1,5 --no-ui --force diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/CHANGELOG.md b/product/modules/agents/android/client/plugins/ActionBarSherlock/CHANGELOG.md new file mode 100644 index 0000000000..432230bf02 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/CHANGELOG.md @@ -0,0 +1,469 @@ +Change Log +=============================================================================== + +Version 4.2.0 *(2012-10-07)* +---------------------------- + +**Maven `artifactId` is now to 'actionbarsherlock'.** + +Note: The `.Dialog` themes are now deprecated. These will be removed in a future +version of the library. + + * Add `SearchView` widget for standard search interaction (API 8+ only) + * Fix: `ShareActionProvider` in the split action bar no longer fills the entire + screen. + * Fix: `ShareActionProvider` now does file I/O on a background thread. + * Fix: Automatically correct `ColorDrawable` not respecting bounds when used as + a stacked background. + * Fix: Ensure fragments collection is present before dispatching events. + * Fix: XML-defined `onClick` searches the correct context for the declared + method. + * Fix: Ensure action mode start/finish callbacks are invoked on the activity + for the native action bar. + * Fix: Allow tab callbacks to have a fragment transaction instance for any + `FragmentActivity`. + * Fix: Ensure `CollapsibleActionView` callbacks are dispatched in both native + and compatbility action bars. + * Fix: Remove `.ForceOverflow` themes. These never should have been included. + + +Version 4.1.0 *(2012-05-17)* +---------------------------- + + * Fix: Altered technique used for menu event dispatching through the fragment + manager for greater control. + * Fix: Do not dispatch menu creation event if the activity has been destroyed. + * Fix: Correct potential `NullPointerException` when expanding an action item. + * Fix: Correct potential `NullPointerException` when the hardware menu key was + pressed in an activity that is forcing the overflow menu. + * Fix: Do not set a listener on the native action bar tab wrapper unless a + compatibility listener has been set. + * Fix: Ensure the compatibility animation framework is always available on + views even if they were previously detached from the view hierarchy. + + +Version 4.0.2 *(2012-04-15)* +---------------------------- + + * Upgrade to r7 support library. + * Fix: Do not trigger menu creation after `onCreate` if activity is finishing. + * Fix: Prevent overflow from displaying if there are no overflow action items. + * Fix: Long-pressing menu key no longer triggers overflow. + * Fix: Use proper tab state-list drawable to mimic ICS. + * Fix: Ensure dispatching menu creation and preparation to fragments can + properly return `false` when appropriate to avoid rendering artifacts. + * Fix: Properly save and fetch action mode tag on ICS. + * Fix: Add missing density-specific resources for certain asssets and remove + unused assets. + + +Version 4.0.1 *(2012-03-25)* +---------------------------- + + * Add `ShareActionProvider` widget for use as action items. + * Re-add 'Styled' sample to provide a more comprehensive theming example. + * Fix: Do not dispatch options item selection to fragments if the activity + handles the callback. + * Fix: Prevent menu key from opening the overflow menu when an action mode is + currently displayed. + * Fix: Ensure fragment transaction instance is not `null` on initial tab + selection callback. + * Fix: Displaying an action mode while using stacked tab navigation no longer + throws an exception. + * Fix: Using expandable action item callbacks no longer results in a possible + exception on older devices. + + +Version 4.0.0 *(2012-03-07)* +---------------------------- + +Complete rewrite of the library to backport the Android 4.0 action bar. + + * The minimum supported version of Android is now 2.1 (API 7). + * New base activities are provided (e.g., `SherlockActivity` and + `SherlockFragmentActivity`) which extend from the native activities. + * The support library sources are no longer included in the library. You must + include `android-support-v4.jar` in your project separately. + * Theming now mirrors that of the native action bar through the use of multiple + styles rather than through `ab`- and `am`-prefixed attributes in the theme. + * The action bar can be statically attached to an activity view without the + requirement of using one of the provided base activities. + + +Version 3.5.1 *(2012-01-03)* +---------------------------- + + * Fix: `NullPointerException` in `FragmentManager` can no longer occur when an + attempt is being made to save to a `Bundle` that has not yet been created. + * Fix: Pre-3.0 action item submenu dialogs now properly dismiss themselves when + an item of theirs is selected. + + +Version 3.5.0 *(2011-12-18)* +---------------------------- + + * Library now uses the `r6` version of the compatibility library for its base. + Ice Cream Sandwich-specific implementations are currently disabled, however, + but will be added in a future version of the library. + + `MenuCompat`, `MenuItemCompat`, and `ActivityCompat` have be added back in + to ease transition to this library but all their methods and the classes + themselves have been deprecated. + * Rewritten menu and action item support from Ice Cream Sandwich. + + * Removed the need for the custom `Window.FEATURE_ACTION_ITEM_TEXT` flag. + You should now use the `showAsAction` attribute and/or the + `setShowAsAction(int)` method on each `MenuItem` to control whether or + not text is shown + * Action item dividers are now added automatically only when necessary + to distinguish possible confusion between action items. + * Fix: Action views now properly size themselves within the bounded space + of the menu. + + * Fix: List navigation no longer becomes unusable on certain device + configurations. + * Fix: `SubMenu`'s `findItem(int)` method now properly returns the support + version of `MenuItem`. + * Fix: Invisible sub-menu items are no longer shown on the pre-3.0 popup list. + + +Version 3.4.2 *(2001-11-09)* +---------------------------- + + * Fix: Stacked action bar now properly sets the tab bar background based on + the theme. + + +Version 3.4.1 *(2011-11-09)* +---------------------------- + + * The `makeFragmentName` method in `FragmentPagerAdapter` has been changed to + `public` scope to allow for easier access to your fragments that it is + managing. + * Action bar will now animate when calling `show()` or `hide()`. + * `SherlockPreferenceActivity` now provides full fragment and loader support. + * Examples for the plugins are now in their own sample application. + * Fix: Home icon no longer erroneously clipped when it exceeds the size of the + action bar. + * Fix: Tabs will now scroll horizontally to mimic the native action bar + behavior. + * Fix: Plugins now properly DO NOT inline their `R.java` integer constants. + * Fix: Tabs below the action bar are now styled with a default background so + that they do not incorrectly inherit an applied background unless explicity + declared. + + +Version 3.4.0 *(2011-10-30)* +---------------------------- + + * Library now uses the `r4` version of the compatibility library for its base. + Ice Cream Sandwich-specific implementations are currently disabled, however, + but will be added in a future version of the library. + * Context menu callbacks now use the support version of `MenuItem` to maintain + consistency. + * Added preference plugin which provides an action bar enhanced preference + screen. + * Fix: `abHomeLayout` theme attribute is now honored. + * Fix: `onPrepareOptionsMenu` is now properly dispatched upon menu + invalidation. + + +Version 3.3.1 *(2011-10-20)* +---------------------------- + +ADT 14 is now required. Maven 3 is required if building from the command line. + + * XML-defined `onClick` attributes will now check for an `onClick` method that + takes an `android.support.v4.view.MenuItem` instance. + * Tabs on medium screens in landscape now display inline rather than below the + action bar to mirror how Android 4.0 behaves with the same configuration. + * Fix: Menu inflater properly checks activity context for `onClick` method + declared in the XML. + * Fix: Dialog fragment properly saves its `showDialog` state when not being + used as a popup. + * Fix: Return `-1` when in tab navigation but no tab is selected. This brings + the library in line with the post-3.0 behavior. + * Fix: Removing a menu group no longer throws an `IndexOutOfBoundsException`. + * Fix: `getSelectedTab` and `getTabAt` no longer throw `NullPointerException`s + on post-3.0 when no tab was selected or no tab existed at the specified + position, respectively. + * Fix: `findFragmentById` now properly returns fragments attached to + `android.R.id.content` when run on pre-3.0 devices. + + +Version 3.3.0 *(2011-10-11)* +---------------------------- + + * Tabs are now displayed below the action bar on all medium-screen devices and + portrait large-screen devices. + * Fix: Dialog fragments no longer throw an `IllegalStateException` when being + used as a regular fragment (i.e., not as a popup). See + [StackOverflow](http://stackoverflow.com/questions/5637894/dialogfragments-with-devices-api-level-11/7560686#7560686) + for more information. + * Fix: Popping a fragment off of the back stack now properly assigns its parent + activity. + * Fix: An activity result no longer causes a `NullPointerException` when the + target fragment no longer exists. + * Fix: Action item dividers are now properly initially hidden when their + associated action items are as well. + + +Version 3.2.3 *(2011-09-16)* +---------------------------- + + * Fix: Fragments in a `ViewPager` that contributed items to the options menu + were caught in a race condition causing inconsistent results when a new page + was selected. This regression was introduced in version 3.2.2. + + +Version 3.2.2 *(2011-09-15)* +---------------------------- + + * Fix: Side-effects related to using `FragmentMapActivity` due to how it was + referencing resources from the main library. + * Fix: Fragments adjacent to the currently selected fragment in a `ViewPager` + no longer receive context menu events. + * Fix: Eliminate exception when inflating context menus on 3.0+ when using + `getMenuInflater()`. + * Fix: `ViewPager` now determines whether or not an activity menu invalidation + is required independently of whether or not fragments were created or + destroyed. This should fix an edge case where an activity with a `ViewPager` + containing only two fragments would not get its menu properly invalidated. + + +Version 3.2.1 *(2011-09-12)* +---------------------------- + + * Fix: Action mode API incorrectly using the native `Menu` and `MenuItem` + classes causing an easy pitfall for `ClassCastExceptions`. + * Fix: Large action bar backgrounds increasing the size beyond that alloted in + the theme. + + +Version 3.2.0 *(2011-09-05)* +---------------------------- + + * Added support for `MapView` and the Google APIs through the use of + `FragmentMapActivity`. If you are using a map within a fragment you must + ensure it is always attached to an activity which extends from this new base + class. + + Since supporting maps requires compiling against the Google APIs, this + functionality is implemented in the form of a plugin which is to be used + alongside the normal library. You can choose to add it as an additional + library project or by including it as a `.jar`. Maven users may simply + include the additional dependency (artifactId: `plugin-maps`). + * Fix: Fragments adjacent to the currently selected fragment in a `ViewPager` + no longer contribute to the activity menu. + * `ActionBar.Tab` has been changed from an interface to an abstract class to + mirror its native counterpart. + + +Version 3.1.3 *(2011-08-14)* +---------------------------- + + * Renamed all resources to be prefixed with `abs__` to avoid conflicts when + including in your project. + * Fix: Action bar background being set on two views causing artifacts to remain + on screen when the action bar was hidden. + * Fix: Incorrect sub-menu item being selected by default when the sub-menu was + triggered from the native options menu on pre-3.0. + * Fix: `MenuItem.setVisible` now properly updates the associated action item and + native menu item visible state. + * Fix: Adding items to a menu now honors its ordering and category. + * Fix: Fragment options item selected callback now uses the proper version of + `MenuItem`. + + +Version 3.1.2 *(2011-08-07)* +---------------------------- + + * Fix: `MenuItem.getMenuInfo()` was throwing runtime exception. Will now just + return `null`. + * Fix: Dragging over a `WebView` contained in a `ViewPager` would not register. + * Fix: Inflation of context menu incorrectly being handled by the custom menu + inflater for the library. + + +Version 3.1.1 *(2011-07-31)* +---------------------------- + + * Fix: `MenuItem.getSubMenu` now returns a support instance rather than a + native instance. + * Fix: Fragment methods `onAttach` and `onInflate` incorrectly regressed to use + `Activity` instead of a `FragmentActivity` in their method signatures. + * Fix: Retained fragments not being re-attached on pre-3.0 when attached to + `android.R.id.content` upon activity recreation. + * Fix: `onPrepareOptionsMenu` not dispatched to fragments. This still will only + occur if the activity method returns true (which is the default). + * Fix: `Menu.findItem` not returning `null` when the item was not found on + Android 3.0+. + + +Version 3.1.0 *(2011-07-22)* +---------------------------- + +Due to shortcomings in the Android theming system, a small change must be made +in how this library handles themes. If you were using a custom style for +`actionBarStyle` you must now specify its attributes in the root of the theme +and prefix them with 'ab'. + +You can see an example of this in the `SherlockCustom` theme in +`samples/demos/res/values/styles.xml`. + + * Library now uses the `r3` version of the compatibility library for its base. + * `actionBarStyle` is no longer a valid theme attribute (see note above). + * Added the demo project included with the new compatibility library under + `samples/demos/` and merged in the old 'featuredemo'. + * Dividers are now shown on pre-3.0 devices between all action items. + * `Window.FEATURE_ACTION_BAR_OVERLAY` is now honored on pre-3.0 devices. + * Inflation of XML menu resources will now honor `android:actionLayout` and + `android:actionViewClass` attributes. + * Buttons for displaying the determinate and indeterminate progress bars have + been added to the feature toggle demo. + * Added support for indeterminate progress bar. Due to the `final` modifier on + the native type, you must use `setIndeterminateProgressBarVisibility(Boolean)` + and pass `Boolean.TRUE` or `Boolean.FALSE`. + * Fix: `MenuBuilder#removeItem(int)` and `MenuBuilder#findItem(int)` throwing + `IndexOutOfBoundsException`s when the item was not found. + * Fix: Theme attributes for home item data (e.g., icon, logo) will not be + overwritten by the special `MenuItem` instance for home. + * Fix: Native strings can now be specified for an XML menu `` in + `android:title` and `android:titleCondensed`. + * `Window.FEATURE_ENABLE_ACTION_BAR_WATSON_TEXT` is now + `Window.FEATURE_ACTION_BAR_ITEM_TEXT`. + * `Widget.Sherlock.Spinner.DropDown.ActionBar` and + `Widget.Sherlock.Light.Spinner.DropDown.ActionBar` styles are now + `Widget.Sherlock.Spinner` and `Widget.Sherlock.Light.Spinner`, respectively. + * `Widget.Sherlock.ActionBarView_TabXXX` styles are now + `Widget.Sherlock.ActionBar.TabXXX`. + + +Version 3.0.3 *(2011-07-17)* +---------------------------- + +This version is a hotfix for incompatibilities introduced with the SDKs for +3.1 r2 and 3.2 r1. Due to unavoidable changes in the underlying SDK, the library +must now be compiled against API level 13. + + * `actionModeStyle` and `actionModePopupWindowStyle` are no longer valid theme + attributes. + + +Version 3.0.2 *(2011-06-23)* +---------------------------- + + * Sub-menus for action items are now shown in a list dialog. + * Moved certain classes to the `com.actionbarsherlock.internal` package which + were not meant for public consumption. Despite being given `public` scope in + this new package, these classes should **NOT** be used under any circumstances + as their API can be considered highly volatile and is subject to change often + and without warning. + + +Version 3.0.1 *(2011-06-08)* +---------------------------- + + * Fix: `onOptionsItemSelected()` not being called in fragments if the activity + version returns `false`. + * Fix: `onCreateOptionsMenu()` not being called in fragments on Android 3.0+. + * New: Enable action item text display on pre-Android 3.0 by calling + `requestWindowFeature` with `Window.FEATURE_ENABLE_ACTION_BAR_WATSON_TEXT`. + * Fix: `setCustomView()` no longer automatically enables the custom view on + pre-3.0. You must call `setDisplayShowCustomEnabled()` in order to display + the view. + + +Version 3.0.0 *(2011-06-05)* +---------------------------- + +The API has been rewritten to mimic that of the native action bar. As a result, +usage now only requires changing a few imports to use the support versions +of classes and calling `getSupportActionBar()`. See the README for more info. + +The rewrite necessitated tight interaction with the +[compatibility library](http://android-developers.blogspot.com/2011/03/fragments-for-all.html) +to the point where its sources are now included. You are no longer required to +have the standalone `.jar` file. + +Also included is a default custom action bar for use by default on pre-3.0 +devices. This custom implementation is based off of Johan Nilsson's +[Android-ActionBar](https://github.com/johannilsson/android-actionbar) and the +[work that I have done](https://github.com/johannilsson/android-actionbar/pull/25) +on it. + +More details are available at http://actionbarsherlock.com + + +Version 2.1.1 *(2011-03-21)* +---------------------------- + +**No changes to library code.** + + * Moved library to the root of the repository. + * Added `samples/dependencies.py` script to automatically download the needed + dependencies for the sample projects. + + +Version 2.1.0 *(2011-03-21)* +---------------------------- + +**WARNING**: The +[Android Compatibility Library (v4)](http://android-developers.blogspot.com/2011/03/fragments-for-all.html) +is now required. + + * Added `ActionBarSherlock.Activity`, `ActionBarSherlock.FragmentActivity`, + and `ActionBarSherlock.ListActivity` for extension by implementing + activities, the latter of which is deprecated. This affords a much tighter + integration and allows for the use of other new features listed below. + * New API method: `layout(Fragment)` will use the fragment argument as the + content to the activity. + * New API method: `menu(int)` allows for the inflation of menu XMLs from a + resource. For the non-native implementation, the XML can be inflated to a + custom Menu which can then be applied appropriately to the third-party + action bar. Sub-menus are also supported. Third-party action bar handlers + should implement `ActionBarSherlock.HasMenu` for this functionality. *This + feature requires that activities extend from one of the provided activity + base classes.* + * New API method: `homeAsUp(boolean)`. This mimics the native method + `setDisplayHomeAsUpEnalbed` on the native action bar. Third-party action bar + handlers should implement `ActionBarSherlock.HasHomeAsUp` for this + functionality. + * New API method: `useLogo(boolean)` will trigger the action bar to hide the + application icon/home button and title and show a larger logo representing + the application. Third-party action bar handlers should implement + `ActionBarSherlock.HasLogo` for this functionality. + * New API method: `listNavigation(SpinnerAdapter, OnNavigationListener)`. Tells + the action bar to use drop-down style navigation with the specified list of + items and callback listener. Third-party action bar handlers should + implement `ActionBarSherlock.HasListNavigation` for this functionality. + * Javadocs are now available at + [jakewharton.github.com/ActionBarSherlock](http://jakewharton.github.com/ActionBarSherlock/). + * A standalone JAR is now available via the + [GitHub downloads page](https://github.com/JakeWharton/ActionBarSherlock/downloads) + or in my + [personal maven repository](http://r.jakewharton.com/maven/) + as `com.jakewharton:android-actionbarsherlock:2.1.0`. + + +Version 2.0.1 *(2011-03-11)* +---------------------------- + + * Use `Class.forName()` for detection of native action bar. This provides + compatability all the way back to Android 1.5. + + +Version 2.0.0 *(2011-03-09)* +---------------------------- +Complete rewrite! + + * New and better API. + * More sane logic and attachment to activity. + * Extensible via generics. Implement any ActionBar or roll your own with + minimal effort. + * Now a library project for easy inclusion in applications. + + +Version 1.0.0 *(2011-03-07)* +---------------------------- +Initial release. diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/CONTRIBUTING.md b/product/modules/agents/android/client/plugins/ActionBarSherlock/CONTRIBUTING.md new file mode 100644 index 0000000000..30d383364e --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/CONTRIBUTING.md @@ -0,0 +1,11 @@ +Contributing +============ + +If you would like to contribute code to ActionBarSherlock you can do so through +GitHub by forking the repository and sending a pull request. + +When submitting code, please make every effort to follow existing conventions +and style in order to keep the code as readable as possible. Please also make +sure your code compiles by running `mvn clean verify`. Checkstyle failures +during compilation indicate errors in your style and can be viewed in the +`checkstyle-result.xml` file. diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/LICENSE.txt b/product/modules/agents/android/client/plugins/ActionBarSherlock/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/README.md b/product/modules/agents/android/client/plugins/ActionBarSherlock/README.md new file mode 100644 index 0000000000..6506c361d2 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/README.md @@ -0,0 +1,60 @@ +ActionBarSherlock +================= + +ActionBarSherlock is an standalone library designed to facilitate the use of +the action bar design pattern across all versions of Android through a single +API. + +The library will automatically use the [native ActionBar][2] implementation on +Android 4.0 or later. For previous versions which do not include ActionBar, a +custom action bar implementation based on the sources of Ice Cream Sandwich +will automatically be wrapped around the layout. This allows you to easily +develop an application with an action bar for every version of Android from 2.x +and up. + +**See http://actionbarsherlock.com for more information.** + +![Example Image][3] + +Try out the sample applications on the Android Market: [Feature Demos][4], +[Fragments][5], and [RoboGuice][6]. + +Continuous integration is provided by [Travis CI][7]. + + + +Developed By +============ + +* Jake Wharton - + + + +License +======= + + Copyright 2012 Jake Wharton + + 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. + + + + + + [1]: http://android-developers.blogspot.com/2011/03/fragments-for-all.html + [2]: http://developer.android.com/guide/topics/ui/actionbar.html + [3]: http://actionbarsherlock.com/static/feature.png + [4]: https://play.google.com/store/apps/details?id=com.actionbarsherlock.sample.demos + [5]: https://play.google.com/store/apps/details?id=com.actionbarsherlock.sample.fragments + [6]: https://play.google.com/store/apps/details?id=com.actionbarsherlock.sample.roboguice + [7]: https://travis-ci.org/JakeWharton/ActionBarSherlock diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/checkstyle.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/checkstyle.xml new file mode 100644 index 0000000000..cfde0eaf74 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/checkstyle.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/AndroidManifest.xml b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/AndroidManifest.xml new file mode 100644 index 0000000000..7b8a848240 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/AndroidManifest.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/README.md b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/README.md new file mode 100644 index 0000000000..e8a2c080e6 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/README.md @@ -0,0 +1,15 @@ +ActionBarSherlock Library +========================= + +This folder contains the main library which should be linked against as an +Android library project in your application. + +For more information see the "Including In Your Project" section of the +[usage page][1]. + + + + + + + [1]: http://actionbarsherlock.com/usage.html diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/build.gradle b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/build.gradle new file mode 100644 index 0000000000..88ae49ebf3 --- /dev/null +++ b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/build.gradle @@ -0,0 +1,32 @@ +buildscript { + repositories { + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:0.4' + } +} +apply plugin: 'android-library' + +dependencies { + compile fileTree(dir: 'libs', include: '*.jar') +} + +android { + compileSdkVersion 15 + buildToolsVersion "18.0.1" + + sourceSets { + main { + manifest.srcFile 'AndroidManifest.xml' + java.srcDirs = ['src'] + resources.srcDirs = ['src'] + aidl.srcDirs = ['src'] + renderscript.srcDirs = ['src'] + res.srcDirs = ['res'] + assets.srcDirs = ['assets'] + } + + instrumentTest.setRoot('tests') + } +} diff --git a/product/modules/agents/android/client/plugins/ActionBarSherlock/library/libs/android-support-v4.jar b/product/modules/agents/android/client/plugins/ActionBarSherlock/library/libs/android-support-v4.jar new file mode 100644 index 0000000000000000000000000000000000000000..428bdbc02a1aa32649e236e0734261bd68bc4e6f GIT binary patch literal 484258 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ПpHSAC30$g7yH$GiAcgHdf4hoNNNW2%pqu zqm$p?=GRMDf)wGe9H;r09RK&TjQ_Hv_fKyvIs3o#YMlOcZ8BTg>aQr}Re~xWmlV(? zs?N)M$fu!?PsQp%u!|&~RYs>FD#&9D94X_agdk;f?l|+*?Cc_nlWWB`!pX#_YNFxmH!C(N&tDvv;ZIOL8 zln~KycEM#t!65H6S7MIYG1cwkgJToX#!Uh7nD!v1YT~^O=yH5Baka@kZ`|#wbwy64 zGVk<#aTEU{gwHCimv*-{QOZ?=)-Oy$&YhLoiUXUqt?e~0l(rlvXm9#ypZqrh49bO8 zjF;);Ui~<$*V=Q*=8>KT7=_m#BR!X@Hr2?#-iNrqTp^2UeGL5SZhpy­S=@2b9k zA3eAHSw5HWdUIZ1FA~sHPZ`lLFjJC^-n>GokPAubRwzuqXJ7x=a^V*3ye!1c_b6E) zU!M|0<8*1MhLSvdR~q|H!_w49fJ2ze1Vc)XQ>~m+qmu$MxxI3*IPkP8V4HlQxJX&? zd@PZ3ca*?_t2$Sq8!ttbCas&IP|m8O(eTcdUte?SCPFdx#EC8D_RMF7(S@S};zU+s zusOgWDt%|rJ3x>_@mLthu(?1kFMRjE=+8zyA5&8NC&F z;`d1y&0eGHA&kApN~+`mGfQkXqa_X>%!SsViBOzqRVp6UiIXuay!C*uuXW=8geVwl z{vsTYz~#(Z$m%bv8ETmvv;b;eiOtKk6{FiA7_=UW4de)f*ayZ1ye};G1hE6Q-H+v6 zp&I48zObE*0nx*axV$|k8Mjzetz{e>ZZF?b2Eh(VFTIsUHZg!KW^Vf3NUu{F{wW4Ons z9n{ly(Hkrc`470}ydJ`H$WmiODNBMzC1f0iOC00_KRipirJtygu$(d`7rRgkzn5gZ zhMMs%kcMQhP?y;q{9nNC(=j*p_A9CQ{zd%h-+|qKX#xKnD*kD{CG28jPrcTl;4mbX-UpQ7sBw_Qx6(Q-Ow-C z%HP$XECqV;w_}maYCZhf0!ADfx$UNTn7M!Z`h7xfbLJex^#;fuCp)lZ4&4`(cXVJbLoA)e+Y*9zpOf|$mf5ZXdF@aZWOm+z_6 zm^5d>0n2X~rnlz9`4b)2f#;C7{^fS0rS>zdbw_%Qnj?Q(GPOnz$!w)Qqttui9OzM} zqgwE!<26~Mx*o;MH58GfY=)&ayYMB?-q)&KJ7>*q? zVwvFAV@kNrf;5lFWDj2d_-7_a6Mw1iIxlJrlRmS$QY-VSQ*cA+$t~sNw+Lu!2`PS0 zKBNkf*PZCj$A;3EySk-(SCqpTV8RW)Xz$mpC*~?T(-5X=XD}Fz7b#E2Ul)+=^JU_6 z@k<1}0%kRyK&l(>5d%jYWO9z-OZeu5!Nh_bqW-@Y$IVgdzYnym1xdn7fsi zG~tW;miY?oelJ(0eTHTKCBDozNtFbFZH}CaEa)wUk=-i!%;cwP65V~D))L;)ite-- zrf^}zIV2%ps^x4Nb^=Fr0{ELbmfJUcIFzsG+xV|XlFa`Zfc!K1{sG(mZLYBSnkx{7 zKcRK9GeSJRA#WYCnalzrCFHNTT*7=6{L;AKIbFgk0 z2?t|9fwNa$0XvT4$-4*UGl-|Km+t$cEpK#>aIKE_ZUB}(A$I+5fnDUq^02Ys{sgh} zyA7q@Ek_`QJ2PtePB$w%{rU6Co%{$)>qiNX!Iq&sD8(;mLN%2jt1<`hx=xFzc>T9G zLA&5nD;+8tLDK6%)R-xUKQZPMz1LMD{7lPIAE_?UNU;51gFSm5FrXBk5czjvhE29S z7CDhNRjn=XKj^VtKUOShZa;m zrfrY+(%rtXoKrgi*Gsq!6y(d!lSMAEfRR^iQYGwBZpU~Ed9ImE^&xDCb-RN@ z#@btC54+s!*l~9x8s#C0Rn1g6sDv?}wdaK6)W@h0#p$u0wX+}_|Kj(*hTB0=Md9{;9d5b)a}@p`V6cR(p`H8x1i?u*e>r## zf39^nHuG9gq96#1c$mW<2qWN2GRzH#&*e!V7G5@=LrVSW@Z2E2s%AlyV7dMhXNYQC zE>!jhai2}!XiMLk>bLd#e7=V6`L3EEZm{%&FC4=ZS-c>Q#GrgJ3+XZ0J+FHT+udB> zKfku^1TfAfRMR>B*orGYTc`KJ$4?R2Ov6M%Ww>_0bcGA{N|T!$Q{TH`)A6hSJ>r(r zemz4;yZE>pbqA_#EbjnX3&wM_5}8~Ft)>x?r84ICXeDfe@wjd@dvh!O0w2?uW5saTAT>f6pqY4iz;)EAcyCOGP$k^%_Q>Uz zeUl~TZbKj*Z|ua3T)A?9Y2qvRsVKvM<$_+|@|mSNOK=4G6YEj3d{+EC_!M0eUJlkETe^?MmV{<_d|COF1>+3%uP3sfO22hDi~ zansQTFxtCObus-VxdA>L0q&p=);m0sRXMyFuskb^q9&RUK|_o{9MOJeCX873%Mor- zu1EaojMtbaNEYbqJRwAuP(m9H5O}u$;yTTZ0g!x5+Z|Wu0q7eA-4Ir{FupS>^ooz) zc`^hw8>jx5I%)pg3+SL7Yr$PH`XvFFDZXJ=yaTf5^TJsIikav689Ei=UWhIgQnVrq zN%yc^Dmm_cRFfVgEFIu!r{9$j8A47NOu>kYhAEOstZ!tu!A={1XK&# zUd3O@aQrVQ``-b{PSd=P>pnRNpRa?ZpFsB9AK8PdD-AfK1p$SaV_7gUJFWJ^!Ie;I zs8fGE$X^fo6uPZwE9QM|aH8D?4@eQ)$UXi^V z)T44psT}m9G}!cR8%qxRwIJGi-MqWPajc1lL`tsl_1A5|S?$=3l7_G8?vaLd2(8?E z-vGVL+t@%Ytno&Dg-YdlllIz==_f|3B`RgwTE#R7;NeOb>|^^#-Bmu59tx~uXE*R} zZrkjKGeXi(qi_`m8+w`)SPHj^N5S!Hz>j81x48<8V^{bUA{x)8nHx!O%Ds!CBIgA< z=%Cp=MRaIZ;L0J|TAU}@w(Vso?o-`1OXPkkx4w*~@yS#&LFxt3L)c9gw_4TQ^y|Pn zhK_3e$qAGUH}gRp?m8=H$1Nb_+EKE)>KXX3wqwK^xIh^YA2p&CJ5bUNOBuEE58+%_ zCS=*c#y-y;w?}O)FJnseKgm1iNJognPJQQKFSk-JObml7G0!I7kMYdv9+x&OxYLqS zNh5tnD`YkNiC=}&pkle4FP08=@;~B#Ftw2Vp5cG@%-m}tq2@Fe;ozdqFHGF0JDD`6 zbT-Yty1SaQr6(S>pk_4Fm$+|B#eB!4&KvkqW4$ct&uk+_ILx}5gRg&5%Yn&}&wDcL zi>2P7ZXUtK%pxGQj9adWsw)?pR3Tw$5q`7^`CImUBZkCO1bM>rgf|$RvHFT@li?aW znAu&)0Q-XFS}VBYN+#HD$2Qn22s_0D#Eoj5y5YQGJ@i%PO?Kze@ezS|KN<-s(C7ifq_ zFtr2oO^+4WPPa{Vkn}KB+CL*$g~bn6z_#LK6qK7d@G|e1`0I{YHd-f|8D7xxMTa+m;x&toyly_?7g z{KEA0SxozU8n5seScju^;kC#p;3f`aJfbr%={>;S{;}F-HQdXarLs`R8_-7kn}G(} zisoc`2kpHTy{0@D?%g!}Amhhbz7lQJD+*>KO|b|9O@M?i=kfI_ON%GtK8%Z|)rq3) z!97FtCF|MA>1CnmpVGQueyirb9^5Qg&h)f5fz-tCa>~$>l1Gx)ouC*J&quPOHRLfy zsAp^$3NiBKdnT7B(Rgp{?r69hc*CqSp`@(hs%YoWZBUHBOe}M&JYGRd`*{y-^n9T* zOhQ@~WJ2m+%mGO4M1rX^7Z9BJ)WmlXI;i=NS-v*(%ah0Zp7@Hwi!#<$;gzu?Y)EQA z9mn&wITt%eKmg(~p9NiHqunF!KZ)-gJ=h_leDMUIdI9S;M0(W*>~*63WW2!4_k4=y zSluaR$Q4NMHE3Ph?^PBNM3+iSKySjaWTg`Q~0+!%eR%!rxPum(gX$Vwt-GHbOURLIQ8nd~}V zL{+HqD7!HG`QfJ_%)9$_Z^-vhy6u!4E$kJFVc30ajMlK;&?amrp!G-0YUgL+-bs>?6TW$I21Go~Qjzw?POEI;hPGb!KQSJwpxf7xROn%nb$o~aS$UoKdlZ@9GCX3IYl*IGMqD7psG`jBXUL%D$&L*wc9zoyAN z=HzHS&vi;8cc_d48%XqK)zsP)5osXfN=z@PqqvCPf4vzNTc!fra1lie17T_ zPEH6>Hr@KpyYK1{aegs^koQ*n8|1H6NZof6*7&7&ll$f9^1lz2|GgD5{%2hH&sO+9 zr<1>T#AFolO0Iv5RaWKB(LxtXxHEUCx!5gIR^+-Y?(^GX%zIRt!1PBbMD(N zkg`Scftg>D$@B%1{FQ#CYkO(w(f!#;&c-D_pC70_WbCf_fH;gABi1mh_VNsp5U_38 zs7!J6AVZ7-EcxPo3X@#fPICyi!$NsAtfhyfkY>M5z}JPXwv!Uli=&3Y0q)vFDHZlX z!+C4@WPB1usuFVyMN-iLU0YwWQBcO5F(3VHkUX7GSZYa7{gl-Z7vZ&7T*W+HM2c=! zj&_dT0z)-f3`)&8!d;Y!1i21MazqtEd!@T8X%hjC5Za)n!UNbx6tWf*bc#JY&XmE$ z<>ub!n7yic0Re9AZjhwQ`Y&m>00h~)S_C2s?rDS5#uCyaHp$944b`Whk}8|9-3WVW zR`@8y$EHzA7+gxKd|C&FNJdm%W6hvLAv8!>4-G~fCzTSLag&jV;j~Jn$00_YHtW}% zAmmVgv(9ylK2l*lR1yCcWV;$%_6UKGYf`U3A2aD>^>Mq2(B*-Wnb|;QEK}z!!PF2h zt_$MALQGmNyzTrL)n67PryTx?T&9erMtIQPJYpQ#n^GVM31TaKW`!%o5q(rehic13 zy%NoMf5?JremBGCKl<51p&G6v;CzIC+MG1WqNGd6b;grjuxv$mKUxcUr-J8xfKcT=xQTfCX3)n92~KqRguQNxudF0GaHKxxfA1K=gqhohSA(kd~8M z6@JE4#8kGH@1ZS0885Odu%=;Q!Q2X6sQrJWy;G28QMWBvS!vt0ZCBd1ZQIT-ZQHhO zJG0WZZKLZyeQ)=@{cxf?I$}NTmld&>#vF6bF+kz9Lx!Ib@f{~m3hZ2rFT=lmz;v#9 zpFQ{u^x1@T@jNA5vh&xD3(!M#XC=WDP)6plY&Ccys=Cu&fYru)=-hXruL$lb<-P;R zdD^GzlroQYcj7MJfrMoD(G*r1+;rUHJ=0Tq#mfMy8NGC0}KLNFmiB*>~J;$BP8_gZTUKO}ZL&ek&k%j&FCr%w&7brZcbQ_V)a% z`y8;uqN=Ijh-_!6G2n})ZmUVqh&v8}v8zxQR!uoXIfc5188p~{K~u$WRJq3JvBDb8 zJMgH%N9#Nydg^nIax-txtLKf3(Z=t}zzB;iXs5&pg41ho$|fLM>BBjUF7-+p7pEP=E^tFJa&BZg zOr}i1RGIYyUWjFQWUas?=ay#eqn3_aBGMb?lpeQLEN>e;X&W@{2^~Tgo)zU0yG{@P zO4tUzAbf+=I3tB~IR4c*&pTxAC&MXh`SOdB*Dv@HGRC85>>44J%lUG?+asE_t6!;W z*r{t!>K5Wa8DA_)!4usfoPori^PDwEF?Gs?5KgD)Ha$ z)c;QobpJ`|%3ByYyEvNsFN9X{e?%=6{t;Sc78)IND0c(X*b(b!CPzdOq#1L;;`0cJ zMDRV?wy{TP*S1?ZNN;FZPcl1;?67>l!r^^?@h3URb}B=$0a?taXK$tN{A-nU{Z~44 zhunvPMx#EaF0M}`aGb){+MK>P^7lA~O^M7@dWz}MU9PC|JYOGU#;F$ttl=<8NLMG- zc3LB8;$VqJsJ4}2(gQDLxB>eW=F7%GfCB6}D&I@sU6I%LRI+#l!>~P1c-L6>-LUu? zRiteq5|xWN4qjVV;~;<0!I`OK*(ACl9LIvHOva~Q_t^*Wn5s(^IVsNOtZJ!pi9mT~ zq-wBI#f((`zTLS!As`pJi%RVPTwMd%3Fg>PM^%!@I86#Sbg63Md}eAN&+wQZg2g{W zzK9n6Rr1wRg=*_$LHQeWXIB>RVM5+IGZ^Tuf!;&iaE9D8g`g($ElGOup*4&aX+XQ=z%NS{i+YBLzOg(>1@bh9Dy2Ay$0MD-7`=KrYJvU2V0pkd zVm)Q`@Jj-_RDa`isRUjE**Wp;M|Er$r<<)JOw9LuwNs$`Vrdl`>qg@vWmR`0Nb(vU zo8It!jC~lx2a4w1-uZ8?DcILVG>=S-HG3K!^BPcu=@|3<-4xxb8yACpNRC3R9Sh`(9p&?T3 zn6y};lJxXdQ8m*G|0?(}Z2Xu0DYU5})C~U+9h-hUF$S$c!}L|Qrw*4t`{YEvAtv5y zV$E90*egWm95p{uhA)KSdXTTxK||Ql7EGJg{p%zdnufE4;UpWYgyEgIBy8niiqRb` zVB@j!CchVwvilg`;zt~%4{T}f{_FC-TPD6K`FAAr|2G8j|Ag`XP2O0^#oom6AIB?X zU~O$;EaGlt@?Qz$|A8UodFB4e?edfo2FOz=?;GhG?+R5!4yh_bsxXM)LY!ZdsWM1j zj=4~Mqah;!^ZVli+$91)8TF-R-A>$YXnOs+dVt#g@C$->BXASCVg^zdCu1{TW)H<0 zQo0j5&mfy6&xn;WgZUXUjn73Urz~`2NqNy9gHnF278RsHR$_gVzF!N_VuaMsrL$5U zM0Qj}xp;ewi>TZc)f8o8u_KBQHfEM8tIA^X8lEOac459>Ai^jZT4qjYEs@}SF&fTc zbl%pFFudw<4c@ipyH@P3P&=wwl}f%Xgb?z)cbGD+Cke9>u#s&QGIMbI0eO)f5*A@K zp94MN8fMRZS3qMs2cg*%Y|N}%@^0k*=LWhNKAwR6S5Q*)zZI4I{{(FRqgXLnaZ+-K z0fpB=)XHk2x{QT>@=1 zUbZ`vHFmVVwbY}VP}#E&wHCU2Cu|UQ-$s&jffmfJ2X%jdQ^;C4ytn?TtX)eP5Epq?Av-N+6$N$fTX83;{9{&fK z|DR{7+6P=;S!MaQ{U}*F1mQQ3AQB{R(R{x=Fi2ROKZ$={m=IH(K3O=W^F_g`7qpBp z1Dp0AB!o*)=cVSCZI_jr&dTeW?~~1!4`%O|jIX-z=AV32m+T&qp{@78c)oEvcK1SH{FgxVeto;}o&+)c z!r6FiZ^U4Ji-Y(FvDlxGiTo1XvF>${lVZGci92F|Qkd^1@Pz6Cz0(I6pPcCafLVp> zS}?zDV4pW=Fu%XM^d9=Zc5LobDSZHZweu&e@QrV+c5mdT zJHh;7Cpym__CGQg$$m1&e{64S z&F5AY53qy$E&?n*xv@UF$Ng?^@!#a|UXygglrxnS?7|B ze@QJy;XulcjDk!`r1F|hO3$={Qp$v~#Yi$KHW4UP#d7=KN1mBP(er#Ir&1RDN{{SA zzu>cI!LSVDvcf9%0-Qv+Sm8>vL%^2(ZsaKwJxwu*Hh|G1an6&Z+F{;}iAIMINF-pM z!VC;K?q#FmkZVQ5(y%GXYb@4D$aUwN!XpahjfTu)F^FZO5IqcOqH)D;M;6R}yQGV| zB%UV9<&Hn53+9$TQs&LFobzmelENfrF!2X&?BrEquAn3{%t+?-E z)~9e)70!ApWyzdzmT;tU<%j_uWE_Bs{g{TqBG~Cvk1}t3 zmmRwZG)XNPhdvZ=8HZjm>K|*H=E&9i}00V+mJeL;QpUAK~2Cvj<3- zw{k*0=HZi)*MUK@NP45&AgB*^rO#}#uL%^r%zbPnZ>z8yo+@!~y9j)kyTZ_ELLpwU zPvKm@xs%+ISM=!bbdFEx{-0!;trw8zos!pB%5STP9qBu6IvB_j5u)vRsa)B|@IpDW_o0PSXdk501y)hl#PE!vbF}8=)ik=j zX@X>xEGsUsy_aAgd{m-+!5EoM(a~wLm^#gwf)?jL+ZUiEQ>SP-Jah#l&JrjaOVMa3 zDW~aa)eC-&Y+Th;w7mg9p*K;(A0(lU>C*Mo6*)Xq`x7t$!^NsTCw(}6E}Z*uddu?R z6#8<|-6J6r6`P+OTss*W$xpCh2GSBo_m+A>M!1HlnANi!=sHf=m6bkHm7hlByJM?= zEb`bueiqHYFq|P#s-9B`#nI_R{TrwqMi~E^J*uRxEGeg)EVC~!FE6ql*5JfnR8~)C ztDb1#-Kw#dojv{W^=R+K@xU3=JFBds684<@gy21JS4L4~e@*?kKtYkyZ>YVTN&x$0 zNP7*fa{!xpN?lq^rnb-it#tm`1Lo%u-`i22Q|9K$`RdYoYqJrDa?Vry8}Vu3@!Qf5 zx8*5A2luZ!p0&v?ZPkeLKc~K)oL!pt+%(O@%4b5g_g4P+0tPaM;(9nOY3aUxe z<9Z+w!Eig$e>(XLOL{xW?-(Z|Nh4hlb=p@ zFHZj=A(<}p_Tk9+J=Nv;2*Ad<^Fg+TJ+`}uh_+a*`m)`)}c+*lZs zU$T|Ryk@2%GK4ab>{bE&*lRhc5|kz`3>XK4n(DjS(R&3oFkgXAbyCNA z29=(WjLy&;niEt+Dhf&} zTA65wd#eRcab40n2h`{io5}KJLg1V@BHXfVbLhnFh{cXSJwTUQCFowuy_$ zAV|~0SS<6J`8fWtgD{JJn`1>e%sfKijfc&eiq<;zD;PJjv zhPZ8g^Fm=9$W6!2My7hwmAoSo5a8e2rC9xVeP;7=BuF}HsrPH6*+ix1=;`Wd(4*;5 za4A5Ko3^v|WH-&0Zr)@ED~Hfhi&LW;?0 zCBcK!xY=E;Ee1F25BBCZ+=V~EXvq|oK$RUlhNT2=I}T~vQXDuN>~J{SJe{V^n@Te( zU*+~pgs0yiV~YoPI1>MK-jdcFSo4bB^zn%HgT_M>x8U9$-d_L)=d{}O@!pWpU7Zll z;yJCGG{G5(nzdkVSH+0hb%yE4oto-i!2sO!N~@5eP2N@{57V?>HA+pRju4KWx=szah))5bc}ynUICbv>Rp>RUtSLA%t})5*H7%_u=iL$elZln7ZoQIW`J-{4bq=;i#-+y+Cq-!T~H9v%eG! z@k6)73mNOX_2o|4xioSPGOX9XCaL1Fc>{AKHz1Z9=I&=Bw=0bhi-lY5M9HR(#ogS# zjP-m>(zh7SV_(g$#r;zWj@4Aw>=Wh(JKANR4u=UefMeNX4-P6{e$Gk ztm?e!xL-FX;~}m|%0LamTw_Bh3=(m0Ox)u!MY1z3h~eg-E*MYR`lJ` z(XBUX;X|`g7@1*}Ppa;p=dx?N>XT3D-=%_N*=$;yN{x8$7oXe4{Gi*HCVps&OagV? ze1(ATmvPioO+w#zNLi!J5l*|pu+@UACkTP}OyugwyRE4=j!oR^JG(FOTCjZpF`=*T z@Fu??L`po@a@X*b-@;@=c>1Zm8ueh)k4lk zpB@^tR$ZGOEi6ujL~Ugvy3OKe0f-k9z2Grmu@=YVu!7J~$|* zjyp!A>Il(AKbrjPMl{t&JjO(dJ*3!^n7mEX@B-elm%%xi2Z^d|21Zr(`3ZG>zGdgX6!_Fu-Xvo?#>0E7ZlOafJ zdGT4jfpg`vWmv?za)jsBmKt&+Y|=>`_n_$a#f8X-XCt%)=0c$_oB`;zq+UHtBpyoF zW|2mAHK@Y$tXO#M@X(d~TCZ=>( zOh{%usU7sK7*t6i(!J&KAbE0itBi^b$V0df$x142(gdKUI*+zSyBfuJ=;#-;74X&P z`#6DWO>QdLz|D{P`2cw*87tirULycFyJyYbJJ?~-2E z1I_3BR7nmN7Kt}E%e6{a!l=3z&gX#gH1~Z{ht1v|3vY@xGgQXHnSG_LiwM?3UQWo- zvf?56BsT`TPcr8^xzfC5$z1Oct9_YzW&BCkgU#U%C&x(Knp-aCCKj-d9)M3z~p2=U_WbbQmHb6>cKkQULDvIQqD;&|28%UMU>LZR zsWR*b0V=$d&^2|E8pfkoO;@C)`ayrGXR7}GQZ)yVG2}2&d1PJNC8~Royn;x(GRa7I zmYQ@t+sxP*z>8Utt0m7=J66#f-)4`@N+y5M(2?Qa`F4DZhTc~)ma^t_tWKL*M!IGZ zK2kb;ihRo~0i{*;fWHI)UR*hiY80ql&-> zrZ5N^%56atLFq30Fk$KuN_g`)(FyUR0P=48c`G11&g;m2wSJ1^Z1E5=OnoB~8sL`b zC;ByBs-Ct^i4y?!@)vL6{L{DL0+Cj?UF`a4!Uu-+o^Nf1`UP181tc$-H>1QZUP!xB zA)^+`t?-`Jf=c#JlsTyYejSVim+iKycapW4v?lAiWtK~q8Xn1@6aSkR7l7Mhmyjug zD_g6q(PEgBa%1{;e2F?<1zR;Tn+YYDDJ%Fz*FD4Z?JvZ80#A;vI5{zV%ZOS{iIJG1 z(!W05875x~-jj34vO>@?ozg=(n|(&nl|#fL?fljMNR))j*CW)P_oiZBKUN~^8@Ukg zF>3sjSofpCdqx!aYm}iV7O09j)$pA>cM=O|M@*jpSI<+6N-AtBhJ}^ugTm+twgdC- z#K8TS`IP8wHzOTh4{G0g42$#Un+@2vHZ?v%1;SYI#i*!)k$12nrSguQ6oI}{??3a< z`;s;~u(ml*x~`o6G+?3%b>C1d9v6x<-+p$~Ms?rNHL)Tg4w>7YCe6n8u31Y& zCvgRq++&mO9Dn{uze)M`s^G_5qR1uhu&V zCyf0_OZTnCdz5-7`DQP|l6f5swqU8z2Afva@|>6b90x8{-a+Udk{=;{zempO=etcw zS@TAmda$~4ePgL1CI-Nzp|7Ofvtj;1n85cZ*@~GUYr|C2bIvrZzliK78Q;?bQZ2SC z@E5AhwvSa zvR``dgkGq4`%YebiTA>H-e<#U&~stwl;&#BK`w&M^`8%gsIVCWgL62Zn}RZx+UFg^ zy?%(~e26RZm_MSS=>;0BlM1mLJ}!u^CTe2@jO!|RvOBC>9%u&qLwV~0xKXOi7%PM@ z+N{NoIWi)vDx0(n#O{nNZ}9as*`?ZC&uZ-7YYMe=8-61Rf~`eY?C@VgV;XK<4Ly#u z-Bg;g^mIsrd$YP719~Mjk`9=n;-j{O3>CH>{EtIxaO$RF7alM}PwOKgf>7@lVIdR3 ze%q?zP9S#e1-#Bg5u5S-tWQ(}*s<5}mNtVKm_6@M7re&Gh6ujaLenrm=eu5oL*_80 zp(t0wOr`IsY;?Jy?VgVVsYn5&sH-*GT$LN=SriW~lb9|q8d3`KU?Gx~6&nIRe7u`w z^*iTeCGdQ#88`>Tf!0q=9EFcjl8w@8Y8&-ukAKP#e#DAro+R~S?x4Kt9I95@p-|v* zEO&GeJ`>C4BRh^gznJoL?DN^FBV@u-I+!3)KGfI`D^po?<}4KBDbTwF&TxHb7HsW_ z(;A0)^1saf;AT>QCHn%|YCGf36Z0B|E&YKXEL3Jb4K_Lx&2zLU>==KZxvws_uueOu zeE6GeYU*q+kh`?yQAOD6vbK2eD5|4bjD;(Bes&b&xo5c3HVjgwM4}Tq1ah1ZEpJ7| z#sKSM4~@}`q6+@t0EDgibpNSRG`e+(e(HSfkZ~H_b^l3(GoLdCHTeXq6Ssarc#_Ex-+BlaqD79KAPE<-6FoU~OSEkCLeKIgQM{0the}UxU@XiR{{E~I?+PGoY z+2qd}OP=TJZHU^iu|^kZCH^USKbGmwUzX>nl3lB6V`ozu#$Ts!XMzQJj@5%eu6EQF>l06TcNeN0MK z3T`aqx+SpL0~Nt8mp~hO!|J8EIt8;14e>78-n#v%8 zm&TbG`5C2OnJ?DS8NBIdo9;6}s`w#M()mx!l|AQnMty?ll&)#*NDDtiQ7OiGzoBAr zkVQB^WUOd(ju}X6Mdkxw-R)9Re|85((d<@SxAO~4>#w{vRPqxb{}qjHA;WUAh|^Bf zFdH^}DinsoOl_2QzEpd!W%g|GgK{2jz4;VJPi|YT2|f8dO;Jne=6U_Bj)G^1wX&o{ zb;}ie8Kg0MPj0!&a^nT+St9lvO3bB*wRrN;vJerKGrvUU5?)5eMuwJ?i>?NfBi&?? zYvaS3Awo*9t_w=59*LrjrEp#^v_^V3Lw}66+b0*0w#aNAzdjNgJ@Fp+ht`Ik_pWLw zCNl~9D$RQelNaKW!xsKo^VZMsuz(ka^oDV)pW`rx%S_{9)w2XcaBNAqSG_X!bd$O} zyXQP_Kf;s|;&Z1v@nZGHe$IX7$A~a9=3bsR*XD1klfoW0?B;yzS`9Mo-%BDU`zLjRlV39z^NP^~n39h+0474p4_$fdS}%D(x2fIdz^ znV}m2AWtMqXSWM~87h}l7Mj*R&q|(R{M^wlpz=WP0|~8qy0ZO(0ZXiDWL!zi9-RRn zq07@t3k*NvUwgvVetI!{6I6S%rO`X2+6g#{uDQqiA`(_l&`&XR7g`(>LDDE*+39x!j$>JU7a+2Jbzh{P(oXSWuQ~-ta|+Y z*gt-fNF8<7cLXF&f-9zDGl?8jj1qXk*U%Yz!BO&7v8Jb&w$t7i%?!{Z10bhhB6SF| zgNp_Fznw*+o&!R+z#*;qiwNq0)v1l^gBZ{_d4Ssa!f^u=8T5wm0s&*g3vrF5jbeF$ zyfqZrzqq6YA!h4)iNNLD9L4ixc#m?-=n2FW^U}JcjE|~Wc0F$uirved6^ASuN zCLHeD7RB`hhxA+lZ7qc!Y_(}~ibr~<_2e;Jbu$n(od7yThaHX0WB$R31LS=+a!o_liiVEkDGmYir`3{);Tr*vMvR>{d+iL(pPZ( z?@WVVo!?rMU481VMEaFDNn^F}^WdV*95t{OR769}pG|`_QS4)9Z4zsEXoY#`WSm!y zB4eHj3nZAMH--$k5KQliMkcYsoX;qZL~B{cQw|A>lCe{=yfdeNklK4Cuek~^f-g4w3{=wX@nolAbGwVwh=#W71ip_Y-~VbIp9rU|Pj z>e^Ea;&L&4mRh}{XW{Q`>haM&vNN)2QhK3yRTLHgMaBtn7NjR!hU5_vtd^Mc=QNMU z;`O&RNN9>&;~jWne-SZ#MADhfMr)4Jj#4Zc9WJ&d z3l3QUKd4cfmOOe};IBvV)5st2Q}e{H7MXuv>O$!pgmR^ItWSAkVZUH-&c)SOsSg$lFQeogcD7%1$2;Pyjs%g)}&Xg87Y!r$p-wuz?1O%heIF( zx4|f%F?x}DDs)^CQjjf24$3+`@T3!Y;Ej|307Vh(B&sbKf+Q+yuquw29Eyb8`p&Fy z`Ah5MXlb73`pVy~Dy*s+)K#5Zibky{0IrpF742!a6rBny!24w|Sm)v@6g8v9(%~;n zo7SoZ&E?<{b*t7Y0Tf0JGe&zI4B(XwpJh&%O{q~-K7icd6L0iv(W2%<6^0~(7Zl08 z5+NWr#eKbuUy=mnu>7}4AWoNwJi0j?t8eWyv(Fy_TO2g=@%O$2SuUEiM-}W(k zgWQ|UrI;^sYFGH^1Ga}-Pc-~~>#cz|ckYnetzl2%>_O-2*{7@SNTvsCZ&2;A+kND# z&L^2KdoS#y+dZ#0|ITFW{Xd}Qi~oZl#eb)2a0^TnkB{>8`b89kk3{@tz?j2NQF0$T zWc^*I-iMEh`pKv;i;sTtK%Q*#3FKKooLS9=g$!i?_JPZe4;+i5a%yHX2)k$TxLvjU z^TN(FOd^(d>JIAwbwu*rtP6AN$5CqsnSxBdh~Nx& zn%di%3tA*V9VzsEk{6rN?IM>GTuXa=0Ly%~yp(}cr!Oef^CKzb*dQX>C?Mnx?mQak z4sGj&*LekhY-P}))20U>)#Vu;sYjPn;qaW>;{iG$18-uNYlMHE4$BSb-ky<`5cxTb zP;Fz9lbVn5kHIO7AmdSs2lihJvPTW~Uw`DK%p6;ilHi3lYe?^>gn-Rj|2mFUjmnFHTfkCju=k{>Gz9sO6!Q_JA| z4=vqe%(IXZ@}s~2JF9?nh;_iU7qbX7i;404Hz5cfUu*E^53=|o5iHDK@O@$aQ>u3% zc1DDRAp#5nu+FTe0Jst0WQ}~{75&HRrB73`nOG^o&fh0H>mYd2Ed~ihZh>Uu)7{08 z`$}V5B0<9A?$CchCa}5dN@I9kju1*O5egZ$wn6ICHaj2>b*0^K0<(KwXWE4bRvJ z=Z04WwSDLcXdHitxY8`jFTNlycF9iNFyNYb`EcOy@bTO+ zIH-qO=uuZX84@ofS|8D3TqF(hbXoBIx^cp>D} zY30}gQmOX;R&o|(R0W7-DtJ=>Mim-p$P?=2nhh?WWo}U?7Z_ihkzdEQ@-M$`(cxnI zn2ot(Djwz=Gxa4yxHa!^0tRZ96-f4K(GE|_D^PXwD$s=zas8#aq)E?cZxzFqNq7@h z7YY!hmaYDXno?nfs=BAUMiQf)HA!?8=<_T?)w%|gKM&PvB!ZIOaW%6h%ECk)u3#g6 zS_0UWqOuv78g{f0zvRcaNA9_yn0&4+kMAtcE)PxZW$aC{bs|otluG&hRbK7bs^d|d zz>P&`9&E9_w~1Ljxk1&;u@86b7T$tTcqMz`Hy%GIL^gmvh(CNbMLpueC6*IjgHx7$ z+b$^5oK?S3etb+_IB*kF=VHZ3i9cFkk;YNCgGZO9lnug_ZRFF_Jwj-|aMLMi?X?no zG5GY-;*D|q={5JHNF5$=bP3&4rhY`Te8Tx+*Qk1duZd1&<|diMbtna{$Qp%%er#3T z6p_d7rt9bu#%k9Q!mXD3GHPj|=b(0Qte*U^HNV2KuAQGV$aB0`q8^x-*rP5X4H=dg zAG)};!$g_Dr@iPrwS@9}G2nuR%`xal`h?@b7luL7$jJu0O7NPAFV5#dIl5A0{GJJ_#x`eC`=_Xokh#mHP z25`jsL~qxje+|{_%XM|G_9+bmc+|9qMkAuVv)dAK>1+1c!>wM~9B6xWv`1eeF8*%x z0Ck^bz9Kp>`{`Qm+lA47Lf0q%NNo=M5ZfXvUZT_+rk+w|h{!p#ile@SIT*I4kvxa} zu2)Nn^eIr>B>!#LTZT+)Sj|B}hwu`~J!EkCW}JKY<38_Im5-_?bv6S3C~}|tE#o!RTkDgCAE9?_cDVK)d;Cx?VN$Osu2({5 z!MN%;Ubnh2YQfRi%%&)6MK(#N8L}ahO@qu5(9o$$nb>5xCS{d0zP`q!()lMR&n5}D zdGd&$xqC&B#t+4lVrA%$%v+S%JBJHTicd)K0+bkivXeZGrg8qyv zL=&}p&C!5d@E+PjJA|sv*0jE zxqxqc6`mh2;8j@WNOQ0BLDT}wTO@Jk^L$Ehfmok>_v{l0i#0SdkM_HubGeS~kS9N{_g7 zkkb)No4{;f+7WG&C{n*P>)^GiF~2v#ABfnXf(z=L0p|P_LTavV(%_0Nw7C<9-whq# zf)esLY|A+g^Jvq^W{7W*Evd}~#e-^ul$(ZRo?L?+NQuJH($u(lpqGu|aK01qx|&A7 zV^(PXLJ61f&Vr@RbjVV$S zRIYQwAi0)77@+z>(Lk{zx*2uhEnV_FCLhzW%p#jtHKlccKDMv6`qs`(E(_f2$4uZ* z^?v8Jnnc(c4j^@O)@GkduqQ<*ks^>m6Dr*fbARZVMyB?sodH`yJJ@r4$nfZ!#%iX3gAt)Q&*An=-42zNm zD`XWP)>(3Z*U~{4eb{DG9Q}<}v}jJ0 z8&WPIKI3-FN%LoF5 zm{tj+e34zSr3;eOk6C&&XV}~UeV6YjRm%X-1!{TdY97~0gzef<!dI5` zlF!wY$Ax2mif?yw>C9kj&+&KHzMy|kIA|Jjs^6>L@M*!ceFqc zC(|1d@F^tzZ9wt^MDim*@gT2*I6S?OPhCt)8X`j~Z35LQd;S|Q1HSWn{ z8+Npq2qAC&ai?ap4wPEQT7|=!W^;0hoM_8au$knY%#S+EHc{mNv+Wbs^#S4W!gzm; ze7IFAPrx6_c@JHd;1@J`w6h2HhH9OlH;8+Wy-M2~^l=nR$A{OQu2Ko}Yuio+*+ z1lq#&6-CR^FfkvU|2&*egP+@gxdNS{NE2GZfz2Cn`9*`MBSGsm3-;~xaC4(Ib11)& z3IUtpTqRH=e?oB@ob-b{{WyCH{T0|VS8Fcw6P@Q95`XW8QOd|6aloL5T&J8UA9IA7 zamEvK4(wn_jyeaL-Lr$5{gB;ZA&WbIVqY@hOEB=t!nd_dwskz983}E~6kA5!fi9L=y4PCE^Lt>F_;Ex7R+(gF!HF?k^oL2MX z@1ZGoYatosIsZw0M!rXu>3jG7vf>Xa@5&j-`Hmjv(u z^rDPR$(c6XW=^l;&lBk;O5cA*1`0;2yl!NlyI)kB_h?{=-OGKp_yp4D1?ZGK1Ha5m zs4uog%IH*RB&R(;@qXI`x#7yJ3racVJy}50s$}axXy;53i4wsgea;oUw&@kq+V@Is zeP#hZX#$0-F%+BD7{s|T9h=+h_S;@pqj#)h=p-Q`fV)e}Bw1PrbCziI^Qyq-RmM{n1tSCFA~_f;#!*h~|)o zNhg&w&aF?U!l(s3IaoreW-n*oe-$}L5yHspWzSM3RRw^M~N}R};!|g_Bm44c*xEV4usg+V_U7gJl&Dn zc%|&upaj15YvZ!1A)qr*Ca6pzs&T1)K=ahNi7i0lo_myTKcs(t2`I9dKdAxOkXaEg z7?n24+7?u$rJ+Bi+X!>7WyWT6OmCfptcb|p7%PeE(l=%NkBP=OSU|)xCTKF-xWja> z8nOShjC}$|EOC~*w5;fBP&e@$uS5lhs&>SLJcd=*?$-G)uPGc*ze33T1)@JOvhHVJIsa#H#jo?KG zCRKCwT$xSK(>kqvc?+)XqHCY&729h5Rq)n2-D>QckR~%v)fP~!rP~1V`qpifD?Cr> zRY+@-*PheW>}_HTxbKQ9vrK2~u=$5Z*75*SQ;_67v%S|ARJr9~kxoxaZb8e;Y<}q% z&8-K9Nh=>XC>4h2YjS2!OBV0=Z{1TWW_BAn4kGXH95;u!Em1lU63W%jhSFCf3is8!;jsOJ;8|0;#?ZD?u5i7!vJ>yu^PtK z$Hm>pCcq;o2_e|f$CFyd`D#t>&Zf6ylN?Rf%`7y1nO<~$DzipE(SyzL{m=edF}sS~ zam0o}2(!bNPAHTsA*ZNP&56*-PK_Xk#kvzWTOg*~%n3ZqE+NMNnsnNW5V`n`M)H9( z>~BtJ&N}p*oEPGJbEv3pooN^QCyFt+o2p|tDhZOosrt`>fw+)cF(kiNj7&31dRS6-W>zWy&w zxqH-C=&zz5?4ME}^mMH|>T=R@a{;jPnAjCgEq~Cf&>pD&560dxxYDrO+D*r{*|BZg zwy|Q{wr$(CZ9D1M>DcV>^oxDYx8M5quCwa?v)0d5qn>AudCz$bmzbIrxDpd}A>7BH zoe$V$E4Weruy=(i=km}1*K3ByCdX*u$j@;~5K~QrOapM7QkfR;??C>$l1t<#^UC0~ ziZZ4048c#63lGkhs$IQm^**q_{r-SsErZydUg_RxS8ZBz_HvA_DG#t(3`fT9XFk^- zStgu+tVUi@$GpLbKHkCHt+94MotWZ;s%w~C&^Gp`Qhh2~ z^>N3W`)OR#6Wr_Ay(v4o>wg?35E>^$4FmHbG$**%%w2HEY<2^3GaFD6SzN{#Scoqf zI747_N(1MWRnw#HjBbX%V3;2}V2H=cS%J4#{=f{zQ1JT)H zGVPIU6fBz0O2bOC0P<~{Pznq3a5U*TNssxb>&>vL8TM@}8E8sxCuFBKs=HN@H4Ft< zT%>0z=A(?3+oqkXSCRt}XBG~f*yma!r!U{n&gW#OrK27w)3w%Qto6J!@=Q-8z6(h0 z+p!hV(mUW;i39@b^4o$3NJsZ171u-9x{1OHF zwDli_RRe7&1dYhQm=1+~g6tXHfreUQT8=5?p$)gRNK6f%rqxO>XcdFm&4ti#kj$bq z6PL?Cv6=LOZ{nn=NSg2&w*)vTLNO;-EQLUBL1qi=s zxhv^I@SmRy_B}nM7wGqUp5kcOeF|;u)0r7PRcVyy4Ol*2X!iJmbP4n&*vx0GiTR*( zsq9YHF0?g}eWJIj?#{ZNwl#J=;avhg*<4k2C%%ey2b>4VtaYWbpHYlTdEa#RmU zq?T288h7ncUAU&r4S>YD%tb}*upwu7M{)gP#2mCcaOuX68D{VWvCCJFwkFOR#`z-^ z>_~|-r+&ARf5$r?RJU)1mh9r)(;{wJRRiPNz?3xY_nX*Sj`2FkslvZ@b!O7QxZ?Bv zzB+!u+{ro@Lx->R2r9G@ZAjvh?XtVe z(iHmfS!AR$23i?7!gnhYWS>UK{Ww@KUDht_WC^4g8qu}pX8lQXt73@DzGBGw_*Ikc z79aJLP3}t*Qr13d3fGr3z32>ys>PEC8`}`WujVM>)ko*4OeOUYQ0>Nk!|u#a$0Owl zBo53Y>xhwcQ9-@bpY(R6>lAquPD1H;BOwH)eX~CyDAuN)a2R8*VK?lzFlHTSKN^2b zIa>e-=F`CGT`RI?TJKG_-s7W1IZV!w*6>L3mx+FoO9)UR+k=&q!=8qvty6XPhe&xK zrqoW`FvziG&ZEeI(LY`{_#HVMy!4snTz zY2n(W?2CUIA*MT(FT4_#U5yh8{DOT8oh!6^#eEC)6V-m!SZoddgDj9e|3C z2D1Hh_cs)CL5k~$ZpgO{R8Hj^-A0D%?_r}L&60$(-s{$P z!&gUb1eJ&ev7!OcepXv30&J`iQjy@)2nV^K05j3h7YEM<84Ctz#MSGNR&pvDX&m)p z8}-o=$uy~H{+ z*x`<#`*F|*&=A8)I3n1J%jL1$Sb_ctchP0?tUi%MdU;rA5+oq9 z=Qqn^?;+SQ`x5m{=GKMf~Q!HJt+XWqNul*6m0pkMMm#JSwwDF5;t9{-#JIxA^1`wsDy`-S( z9)Dt+8@Du3r84}ZN8)&a)X{|0;e^=Xgw*ly6K{%h6#RrD6TI}3g&rK7gK=6X4Djpj z;z~Lj{8E-*XM>1rPjGy&NaNt!iP;Y>yKJy)2Z-_FT2J0jb@A zk!qZDkCiUO_>c*8_E_Q@jbXGM`98YJpwNMJnxQs?bB%Ae9Sa>tR>8zNuw~S=eRvI6 z-SCg+q1u}9R;jxy_PqrIY@=JwEQ9WyjIhkwtT)OvVF6~Es#A+6T}y^tLy94LEMd9Ph#XpbdrTT zt1Jt4!OJWCRg?vNum!&2wk*U!*Z!D?a;LUiV4u-lih|bx1*5i@u`cA;@7ZO1pO;hC zPz~`$;=4#_Vf_tk0l0E1#tW=VYP~aJK1n?rVw&Ly4t1@q^2~@AT7z%+Ek`@{pS&sYRS_A?ueBqWp{FP6H<4o{H8j3a1;yM>}vzl%hvz<7{20W3wgKbqVZWrINCz@k} z4^YDolEV*>2Og+*-q3g6*mvH@cOMtu{wMIho8Oi_=Y`sJX^2Bv5uywe`WnA6W$#iB1n{mvtN<0ww;CJZ(plug!8cYv23=`6f;n1@{= z%+fJ+4;Ge1@9%V%7he#&5EQuigJlklhHp_YO})X3qUm)RM;On~m_x+G?>18?qYA!X z)Y#O*a~9V#yt@Z2wNR@^H#Ck(*fj}#Y`mFClm*8E141~c(r5BVE)JE6kUk-Z-sD9d z%~0>@+oQkWjAFj~K@Zs}STd+T*q6kT9Y2><(ZYm$%M5ELZX8(xIj$nF4b zzbc*%`>0l~A`Ao+o%DYaJN`2zN#TDc zcKichX7@K4$x*}+;AY~eVrOP%Z9?*Y{q-L-4~F1K(m-fsxy61I@_!%!;NRxs-6DYAS#Ki!o_B+HmjIwGxro}I-ZG$~ z?wr}T5x6(n1)ucZfF&?)u(sdeWU#crOlZSKwT5?sFrwagFI`DTiR<;(s}q?0k>yQX zC{r`CZUwnUC`QBfIZ*w?ymA&UHpvCXOl^$7Och3oiF&8ztaF=v4ab3ZvpH0~k*~ zWW5z8_br9&UzHw&9qyr`e5OR<;IVRV#iyR@TRnTZt*(B znMS))#Qz|@Q-a-rKa@B8kl+BjMnq+C z26FmO`Tj2`$p5QQ|1D6B3pW*YwC|j05;rENhoA8R$P`Mz88Yz+&H0GXv`~yoWW~r5 zU^aJ5PDwi19n7;i!D2ObHFIy4EstOtR>_4e$-%%{yEUDuRvjO|G5Y?zf-E0v)gIrs z-Q;w5a0mxQAvn$Qom@A)*zwQqyv*8tJ6*8?ao>tz>QXEdMN(pwnsCq#4KYoR-wI;! zp%OlXg?N%g$L$pXykQB_j>%cPnW8ueeSoe((?ku7*nba01rLMePMOoHXlG8DGIUQeHJ8y}b%hSq#bjPoW+`POHY=+cj24QjYc7_2rYxj8oWNr; zZBzyeG3RtHt62`#{JU&(w9qnA1jTJa8Y9H!H;+zV`q$tKkvJJIP9s(@3ew>9u0?bw zWHl$s@u)s}b|3jhE=v>jC~J+z$m;=aW;ksmH7MO?3_HSP$+=VHm3*yCNz68Oh`H(v zHbQ)tB=J+1&8HqqnqoD-_A95$HE*xv)($m8N(+=nn~~&ko<+QmjwqQa`6}0~*3|%c zLVnHOplavWB18+Uqqyf&rI6i#@x~cp<&31}wW+Pr0_#PII4lq8)sYzkz#`Gc75gzy zAv~7v!D$8QnPQ&Sfq00^dL+KJteUGq4YLusIE+{T1&Crp^$H_Q$~`3}FC7hQ>D7A6 ztRq!}5@u2zsg?3!J1b)f`|xnDq?jnaoi3#CVi4+FmYg?~Q{8E0%goYF?ci^;Y(?|g z4PwrM9FYNI-{OoPg^f0X$IT|Wu?Shu$@Y)X^ZBBY>J`8+H)gG;y6hzr9Woo3VLLwr zai4{VaiFWF?C<2bh>VTBvwMHj;_c0fc#^SeZdA}yCRq`#X-`_9nDCW(Nsf1nj!_Ce zed0xTTHqA2M=ii#$(BaB31zW8z~hNs7G1~S){}JFm@GMVZPDQcaa0=7UoYOlU#>Pl z^l-h^ON;lxLYTCJxShYE=l*IycxUz29)o#}4b{Zk9eHuyiur{0`ucVx!lXNGhk$VI z4v)g_tviHpmmEWIP#go=sW>#zS#$suXYDRLWcuwq4Kswc#-*3CPgQHtUVAA1+7SE8 z_!Y{xa{q+OH$vAMsjXBP_8DqbpK{B~>PRw8dCir15EVO3T{I+zy2|6P2Ry!=l|(7m z?``-jz1%2Zu(!e;co(g=_2bTbutMxo2_f2TX}oSL-2$WC5+CqmXgrHsYyPz{A6g9}9>!p??TzUh6()BMRwKyNq&lwRF$vX&ugW zIe;jwcCIwK+}mFm9w%JA0kdrW?nQ|Z7Dv6Ncn9_fl0Gw)K6E5q8?N)G>#ZNlFOrqw z+I`)uN9k&Raa~l^VUZ-(yc*4xF=q|xPliF&=IpN-Jzl%irYi!_NZ z5_s67^9d!mY>ywM8xRS0qJVahEBv$727X{Ilv8CavqKZbsx~(Wy(?JZMRi#X0Kc#C z!b61fyI`(>&K2)z%rH&S4Ghl7oMdIK*%DutzRUCGa7`E{fV{#6yoF=vCabI-TiysS zcfiIyHILcskB?JqYR(wq`-URV99Hv!Xczz&SjRGWM}f|T|5Nc;>83E`M;ez5)u~cZ zaplAWylV54gZYl+0SsGB?ils~V)YwOrWq0vlTf153f5zI3yJnC%y^M#**qqFfmK%2A5w`Xoha$G@iFan+_-~Gt0cYQoAqJ|UImd?V5CSr-l!Jl{;7c807PF|g}#C&KXHn_F|Rua4D%?6QMa!kcXp6rH!9qr zJEEiZE^w5PaQe4GtF0M+y2iGRwijNNJ-l3lWf4&`B!_-^I?d@W!V0?5HJ(-4pLUKx zA7(5E^zC?lC0^gHkPc;W?Mdkbj!3!v?~zgjgmLy)*S>gN>9aK-wdUMmw)B^Hq%Vt4 zaHO7}G>^zVg!Kj{Fg3tmvwsMJ@8qq=`rPfldmtxm2_|hZInIP6iByB{F=r5kJxOXG z+HLZSEDllT3OuBPhhMAQrMD^JL8fPD@q}!#5l3mK7fb|I2!mBe%sos z;2^c2EO7leH`4!U-0E0BD1};vWm?bt++VjDy!EYqXnBP`r&DttW2x~qSFT~ z2ImT<+pj7fm>zvvp%~x23N(11Y%dIGbKU?7PD?4xVH=XgGTiUu6q4H%zmOsiY_i?# zuPdOK+v5(bV?LZ7nLmJA{#AlJfy!(WLjnOkA^)Eh^nWt%{(m6h6#!-?j)KMjduJ2J ze^nqk>Q+uDs+hj5>tv)fA?U&2U;N(hF2Ifg?gukHBEVHjT0viQDyElo&T| zBk$YvzAB?wISW`3v9lb$gIIpahYz{ir52JlPr|!S&)F~c-M_NGo?hzuK-PljlTL># zRM#Sxgk~W%-w9f2_t z*Zh@fZ;hWqKxxazxu}l}fzy!Ns|ndW_u@mJ3!HveXV7NK5qk05T9?)94`u%NbqBHp zH9BKBVmW{YHxtLZ!!PD*!z4zZ570f!H$#_7MZsmnYclY_UKB1(dePy|d!jyWyZ~EY z@6l}1nWZ}@4rwU~h-5#{h_(9-yy?PnsU_DQn+3fZ1spd)bSNtztZ zZ_MpFUsm8X;_en}H4m}XExIS%YJ^vlTuNiNoK2;LEXZz#J|;VtdUL9PU}~)|Jm-im zCh{H7tqHH9ky&~sQfL5H!0lEH;a1yUv@)H75uNg2DzK#edponGCTiUwQ8-tdlA2xZ zScjb94CG;@0hM^Wc?h_^f@yfMsaVS}yRKlr!bwd|pe0#%7hbsvj_I7O1@`wJhx7%9 zY2<`f8F9Y(knUrMT$~bzm&I0FHd4J2-4=a~Syqag-j;fqXp2;TerAjYmsWaocu!jk zj>RNfe*-^|%_L_rOpSOrP)yt1?3P%FNf|2MJegl}vFUoVR8k%BbGN5`7c&jllJolS*5qMBMW_upp274T0DDDgW z((dd1n4@srf$AvkGyNCtL;XE#R(rDDCVMtItheyBmZw^!Ca~Sqg*OqSFLwa}2zN+9 zjca*dk-94TmQjySZx~lU*^NAU!1+eWh4@SatLo-py<_P)RKA3Vng(#}tL`<&TMHVT zX=pum8yX2mMdUQWHZ>WX-OAE(=wZgLM@M}o&XWcwsAVpn+1NCE<%GYF6`S$_`ftA@ zH7A^>s&Rk9%)=2dVYR*|MEqBnbaO)#$Z z8l4Y|jk|Kxje3tOstTWiX_uID+l1=akGGU2;NelDu0=OgmyE}s{zx~kcN!m41+W@& zdh9H(Kd3H}4ejPQuuj?joqT$;KqohztRe^k=c8K?K;6p3|9H6oKQ#X8B()zRb`|Oz z*ji|N@L8TvmtmNTXB}UP(Jkiv;2L-! ztHojB7oIZzwLn6Wde#g7DNfpw) z2}|?jyAk$IWc8jbmOE1w`v8qupsWLaydYR7}t7vMsa5UHM!-5zQ)*xkuaXZH8&+=MDXruc~G znRT`Fpn+)u}2N;iI={Eu`X+ZuBG#_3W!^gN%RrbhW z?`7N(@YE;)TGYZ?vTLB=q8mun%$l^QY5VZXB$23BkTrK7^NlNg;9=+;fcAu3^=wk; z6*8`88Szfeh)TIz60I2bJVa!pPh}(Kj$^T84=PSPA^wVCwVa{9GEjaq z4S23Dbsf_v0uGu>lUV;$lrYlP`}R%fw7URCtEz~q(7D4Roy(P&V9bqNnBA@4KbmVV z@i9WnVpCsO$UP{ng1&B}aea6P^GMHMWI!O-07cGBiuAkxX8>dJmhip9Uprm+zeb$= zFKJ)OCXTKaMkfEt(*4(qEGAA+dPo2@_=MG>h_R)`6G=WW+|!=YQyCNrawOkCs6WX% zQM9diJ>L4hj|U3>NjWuUF=Ng$i!1)uAH)LV3 z&xd3_kl|TX(Ms<${UoMdCLFRzT2sPDv_3Z0DDbLE29Yd)W>~jLN(AkWgng1mfpX4B zZ^HH)&E}KHY7o#LRjtHi)=i^HQK?oss9u$L0TYN*St>OWbBXi)kxS<> z#aj)?vA@mZ8f=cL&&HU$g=0%3WmzjgLHIT850CFe8{G9yHJzfDG9MZJ0yTzf2->zwW-9Ae*oq($(_>OCw}7n!cY_mmC4nGCp@xb*?N2SENQ zh_CZH6@N7PJLfLT|1?kZmSO#^6UuJ<8Uowryi^C;Ul;NkgZo)C?MvRYJ9UZB_%4q1 zMKY9Uawxm*E^TVpbxKe7Ru%R2yU>q`(q{lpHwT2b$Exd7R|eOB%0_-z*@87!uTCti zMaVrbeUix=WI&+4N?C2ax6`qvPg|e1z7E`TwHjv9l2F+t&(FtfOhCMUccsfRpZ*lV z6(01nD!p5Ga~Y|HwQ>|f`+adj!rPuxIbxtjy0LukeAZUs7<}dW#^UDkz6~nqm$Cl# z=B`<#K_v_N=Es#;Bwus@JegTFeGhZx1WCJU6hH~tO8t@ zl7*4NI177YCv6lFlDWe$Bc_s$6<>~wXkX36ynICi?6q<2ExffzSh^%BA_rT}-JS?7 zs#pn}aPZKEy9;dCBEg-+hf5i-l>H6E&i|)kHgX$a^MRC@RFToRN-de2*r!PddZlIt(_z!}?Cs) z{@rD(g0kqWQfTx@&!F<}l-|z3l!G|XE;JC)qMfGxrG+E-qZQvv44OHJ+UP6$P@0pC zi=+BI%R=l~gCbyUY>6x@7gBpU9#F_^U75i~$IS$KJyom&R%pnz+8@=bXb8!ScZ>*f z^|c6>+6tmrD}rk+nXE`^YVQ=AwtXAP=>lzK2w6e4u!OVfsoPja&zKEsK~0>foigT{ z=%K_94Y#Nk!Y85&okKkoW+6}@%Tz98$+Rg1Lig4t^j+}Xd8!-o71lh`-6eM3=WUrED6vR*y7rIT~>0j)E`R`FD=Q+A&zckjS4gnF&Yo>ZNZC!uNq zy3n%`PGs8J$suO2g(sronuD|A*0|Qm!3VvR_5{^-j}qEPWs6~48Ld+~+V04Lj!$y` zj3>y#vNZ{;P|-#q=G@_mhrbvO%g6exp};B_1N$(-`OvgRaRo*nhP@Oe#~r2R3)NnnjT$X?>H*ajOsZ2oFeMof7w_fXI|$=m zFc{_DFevR_A@m|WE{~qt6P(NV5KPCI&Ldakc1J1mFjmoq)niKQCaScS7OKSODhV}w zw~4Rn;7~+`5lz2by;mI`$z#2BcjWcqXMf72TsH=-IdS&*Lt!ERsR<1 zZub~^qs9&{cfv;lA1x;`l;B4-&*)48?UU_JX^4oW!?YbQ&nR5#6)n>{sHQ^=ux_d) zKL4Gy7WOC~2owB5&PAa0AzMy54#h)hEoPHBsC!K2a+a=cuhZyn$Arwkw2HWXSCDwZ z#b?MVON?1Z`{!$cRa0FBN@*jl{X_?S9wV*F+I*=rwo))UUL*(3GG~v2Y#Gs+*(}jN z`0*ceMjbkIe`R?XxN=wP&GhW>mIl@C@RSx#6 z7JrvM9>Gxa5tK+}3z;imcF(u(vE+F3y=)$_=grnnTk_wno#V-txU}pRrUYI#PbXg8 zT4QP_q{DwKDK$Z1S*kA_QhB8WG{woi;P`jd07#qhNTR<9~} zM{Cd8AEMProsmQ-+3-!D{~(#6<;oxRPtd50evY|kAavw)De@ne9pMqaI+)4}w}egg zI7ziLW5@H`C?Id5{9gbUDwP?3V8u0aNLI8-YYBvy>DeI}85yNXPzSztyw@5G>1{(} zhX)D|&);uaVim=H*A$eW9i8;S*HPm^6K^52JI@pu9%HAJ1;0@hdQr4u?2x( z>F-mdn8-fwrJcf?cPydHm!Zu?-AmXXCDdae^CgJ` zPozar?!zs?VZ*xI5RD1m1#9alM5jQBTLgYYD|N&n0Im^#^^>|O#MmWM8AH$L@k+id zNH&HlxV9N6t?Rc%N$o9Ee)$~PaEx$rkIKM#FaZf;bvR~N*jLG+ zK*PA=)dO)pjbPa9P&IzU$fxs!!MvQ{`cmHPQ`4yDf!PkQD@M)%+|@1ZgtjSUr#nk! z;>M^E@2FH4tUBi{5A#jdMBdUZ*2c~zdDd_{*7WA0uBc!(&&b%y45%k%i`(pf+u+1o z6LFqdqKvb81fU)R{}I>w`6|SQP{$hJ?lTisfsGvLhI4j08+d$IBkeI)hh_@}2Kf~|Huw_*2 z^Y=!nO+Vd^X@q#Sfbd=flIJSsF54qq9Fpoh4&een{5CG)l%cP~E5Tw4!(x7qS*~Sy zHuW%zQ(AgpIRP@yL!1#hN@vc|;R%xRU{gH|@?m^Gh0T@!p(kPGj%0IC!scX{%E>sD zt$oI}lnu`ec`ROT0Lu1AX_UnDA?CFp zC~h(EI<-h8F1PEJA_c!d6sJ21VJY#1gh)e&s_!6EkxMhL5Reb{mur&VS4IS=%IcXC zv+$VHX;R)Fw&0Y_79JOYt8e@1jifTk7HrSWYM*TCgsaIJT+I{5#VNU+UFecs3da*2 zAFGh=rjSfuUwbE8UL!yB8R8LiIpTF`+bLeR>s8~aXH|8AmVr|>-(C{$Q)afHR-})p zAMM#2EcL2Hbuy)}ly*{c#+w?o%W^Y@>h;aC^1!M*wXUSX zn|I~_$DD6hg8V`D=p<|5hiyTNH_nGQcZfT?%?Y=8`b{I<6cyFNCk+&v;UACSYi8wd z->I%2O)2VwU3j5)_(QL=f0udbal0U5dk`q=fBjyTnyT=kZ8%96wDMm|30!V3kHGIF^1SNR)KG=DGFCw2;A*qycO0Z)<5ww!u{x0)}6Xr;Kv#DjqndM zCHlrE{0IvKl!Etvc3=O~Oo{)`X6nCe)c+g9CTC|WY-ej~Vdmlp_{V62q^*-Pz}Cpb z>0d^xByq}eQvfye+X0u_W&5|<$)a{6Wb;{}WkFPGx<6wuc5?DT;%5U(0{J+zAq&%M zLnpNH0>r6sO0J>|L&v-T2G=kB-RzE!FQ-2+{oqQ!rQI1Q2trj?C zDW)aL_S^P5qPGJCi0NR=MroqOsidoyfiKht7b|E!q()BD9o6`-%T$rN)%Hgz|aE&a|YLB+z^-=iFAfk z3`t+rvNG$Gn#T{C4cB6kCmVc>oo0_2Qqt0LSlhosi1DPaTi&#!H>b)eyf@x|rFJ!K zZg-_k2(v?!HaGAn`G!Bw=1pOO zKKw}SM+h&%&a@^da>?NbygS$SO(T8OuGKl9Hol~cxM3jjQ%`t?JdaT3HrVJw&5x?B z?ABg7SvT4_)`h06^{@UjyIjKHfvxJV(YE}X7y17s()_1B*#2jI{0(`sFtsrHrxgCx z()jmq%fEfM(v%zyBPwq!IaVV4joXrv9t`FW5Huxe!IVmg6e3a7h)7yTGVo|{uXK(N zj3~$mu)i}bsyf`Nnku5sPB(Ww&zxhwd_P>ifeaw3SXC723ZvcVy4?VT!-nCcp#mjh z%=Ki#>r`2ip&hFw?MRYjj~SaQnNy(MDgm{Q0Cfmd=ZMCv zIm(2$eMHEVHu1kWYEMzBKI$^wclL?YE~j7sjW{GDYC)t{FnhRAHG}nc9ad<=3E`Ky z{$#SAe_aP-Oa~!{)!4bHo8R!w{9{8gjKX|}QSpYTFA6PBWohlqhaO>zj4|#8BN#|@yXB%JQ zlNng+PP6xuv)5Cs|Ku(NC>L!$;==otX!i@5AQ$D9M-Ot3H1@I4pZ*Z-2mJvx?pf8= z`4eJqXdT2Y+>f4i{C;+@$Gbn;KfJRDv*Xq2G%Z)7Pwv;pW|_hrWR;^Us;x64C+2nj zd{tXh{qPP8rgFnNPfChoXqM4WQ9sg9TV-nSm{Mq&rVu_%uFXiT)`W3v%?G{H4J}=t z=y-@YI-aO7_9o2Lfj#ho?R}lTWEr|`t}cPol^vTF;;X|^vp#l~nLRNQ4H~1SMe)t* zsK#hKlm5d=YC_RiLSpiOJv1Q!6>cS8O5-BhVjG+4s@!QxnTZy)xn%yGBm$6`8gZmybY49WK+Nne zG#!tS{sR-5o0aBN%dN}0b*66siGD9?-cX&lyeo!$483y4uWip;U<8UR&_MII?2!xz4I25C^lg1=@E5l`Fw{Zlx|NeEV)=hn$Xw@5V* zKFArt7#7(9h+=QH5VP?4D#DRjUnaHH65VLQ0T^X=SAx<*x&#>jIa7rt+X@Xn!Qc4Z z?@+93$leCCc-?yqypdj+Z0v3zzR2;ukV$#ypv(Y2{Dj=;B1mt3reu#P=4wB2V%X$( zo|&y^Y8)eW*j`4pFZWG=bepf4Hphs&nS~JXreYH@SwAM-uA?i>6~Pu=k!cyTq>8<- zdfJq#+N9JpY9o<3(4exq0#{8DYB3fyLfP^A%CkNH9@Lt~64ohAq?-UC>J>;#L23)>9FlC1`lNJ&EZ3tcx+#G8O0@lN=I!k-}O6-uvU zQ&{RElG37+ly-_bl0;hWOu|u7x+q@SR8O)(x-t>p)LkVqTX|_ww&y49SvMc4blQ=# zR%5EX-esx-dTR4NZ0BM$|oW=I!t1vUgradvfubfkssW7I39-Z5V{ z*#Yh>Gwuc}b^Fnr2+aYC_tOKAFX2I&drstTmyXER;02NI@!G2kP#@Br_7?n}8!STK zRP}EOJJ4G%q^fq}1G=4~;4j4f%y78!WwD#GsQX&K17FlvGobAhuk!geVNL*@UPoo| zX((2G1g{$d$JHyk2T}KEz^1Ik32+{&Q_`%(tq9|u-&!C|dJwgO8BDIz@5$~tID;xNfc>QExW##2r zj9rnj^x1h?ar!a}FjRHF=XiZNb0roTRilc+eAh(I(v*2S9Rhv%8N1VR&+VagIdtzn z_&nuvB3FThx^)+_m>*dLGhJ8++F{V~)@0)~>_%gD@d3S3vnh zZiLf^H8CzV-?oQK$O>`F^YGill(lbZZ3p_=V?$H>u>%)agI9mfR~`cqi14v2)`#A5 zW$whnTj&3gixA-ctOeQ0cSwQVCS1ia_H7EB5B}T40WH-LTK3ctQdZr;s}{%7sn`Du z`R!)ut^ry+dJUXQhJ}w30AgEM5*uz4x2kVLvykA}z%f`P5<>iuQO-8cgS9PmVd!jt zXM^KzV0w%HVZE}0tt0M5#3j;Y=B?Z7g=oI+0JBf)tc2SYx;pPOx_hkOBA@wBFRlZDw!^Eqvz^en4=D+$Yb=x|?+cpeDnZ+^wseQUF1Kxd zE*Wp`Uf6gj3p0m3;#_qB`GAv^If^(XfI{S0q8U-X-Z#<|6~N|i%VwU%b>*K-WIrC` zPmt3dEuZL$DI4!F(o1@NRsKr#QG2MLQ@dMc{@eL;!3DRf63rEu&$W@L?^B`Pc#KFH z_%&UdQ2gfL)!fbL!ODC`h#v3CYX`I|WR&)CK{yz{a_YmQ@B#RhpAOGGgRWIwD%JaF zkx51StCCl5=;w^$;zbFJy+7vT0*}Z8!%Rcy&yFV|hkd`b52Opo&wm<*nckqvRtO*< zz<(Rp_|HP%f4O~;v2b$!FVjH6^zZvE6&t%n1yo-;XJ=;$Jmpd+rzOTQgT(?8Y|T{6 z17vh(0@GLD0`|*U$IaxyN3)FA#Mgn>bpjKfwrg3uU^1IIUY}W~T&L@f&p#KNZa}I$ zvPR%I=t}O!hD$;}L{YTKq{v#alolFrQC%_Fv~)TO=ylB)V1fCgvlVCd1^1eder_Om z)X}S`l=CkT94R3|sypuIve zd6RfXjSD3#$dj#<9vVwE#rrcjB~#p-Z}?w^|Vo#F>Jg+)R<-{)6LE#XEqdP?ewJ}IklM8hBB2e zShcsv;W137pj<9w_t>n*>EYH88pruC;~#C1C0IKsbfR`$k5JVgAQM+9-FIN2za>X` z)Ux-%Mplh#u`7r^u+my>i3uJyHHLFAZ4T*DDfF~o>R~~sF{oI+_%y2;7FmUO!)wAc z%Gw0Ku?=#sasQa!o-iqn9;&>t|D!Us{mK8z@wY0?|6k*oY5(WS^uNUTUk>))KGpjl z7lKc(oF}rTWJ%(wP(MOR7-)pXh1Nu1qe4jpNI*#hKvi%Pp`ztX52iuGwQH=jU$*xm zn-7H0C}1hBwG=LTS9@xtFZ5deevaK{ee8B*5~1e5^KPbm+;}&6H+$UpazAf^;(+=^ zY(ijq`)A-kN?;&wri14kqCjpO1;K4oN4Md-$H3%_j`YrUGABmrblnMdZia2(x2^+m zw=ReA?muH-+z#j}Ms(Y8UdEdta9{ILUMzti;M)xt_((7bkQETRFi(jWy;U;fB=6cE zdG`m&?H+)0!Bl1BT|Mt`YdzLOR49ML3?><|FzNl20Hj5B zrOcvYHmy{=1W_aN>hO0HEQ*8xhedU&A`{?Boi{3-Td19z{JW2mNt#Rn6y|**o_;Xd z#NG+I9kJCmMi$XX;*xZ#pK*!DOYUW7<`!yDTW3ns@c|i1S)|hh#4Sc(fEJ(}+9Fma z1!~cp>KtMpCta4fb6scL88@Y%D0GFQBy=gSgrr!vMZ*dadivvIDRtFqe<$LNx64iPNBhfDm~ja z$#hG3)~0T-!gsC;{^C6K46f!x+Rb$Jqi7v&0~f4A2>D3J%%{hG5=Y{R*;kO|SVq@a z!nzv)-dFIUz8%)wy(6ysbe~Ysj0Az6a_9|T|xrC#m>Oc{te^$*1>D$ z@U#Wy5+j|dRw0`4fX=o`Tc_D>zy`e9WE4OX+MI83T{+^i0tYvx&PuDw$WR|(m0+LW!h~DH;+27_?iI*S*0Gg|a&>tM zDQ=i@QL6IB#YKhUg#Iej%lakZ<0Y<8W5Q?HDee~0igNdE_@(ySE`$Z+ zy(s5u(Ycjvh|O`0%oqa`k*fS*xRovs0OK@qdo z(A7|X40Din8V=uQ(-+*z-cckGyrt5cN@4nX%CFRmeSQ(InbjK@Hfh{QjnWF&uLNsn z%w~h9x*M6jTlyJC*tyKpLu1+Afu;Q+`eBik)4H|+^uT+q;H9yR3{wp=+=;1g%aLq8 z@f*wta)k8h2|XBn$5u~KvyN{GP1Xjfp#UjtaB#kf=xd4lb0K{ogu0Lc6As6&DbB5f zUj`B@K%vSHBukZpW%HNg29X|KN)P_>l!n#nz1~EBdLm!HyR1pvL}bu(ykE~k6vH{g zYCRt_cFB2kFUbn1nOh_jRr%V$c{W$;IEKX?gozbqAoscUiJdG5x|&WvN**{WaEKP7 zCA=Go_{&8%rixzRwPF%Q|%}KlLtZLA0OKbjMsL@0aF)9CjtP2;$< z;6TqCpM$2`cZ>pTA%j8r`@wPr9O-@y5Yrac&SCR)iw{G2Yt7feqYyBN-)-%T(82FrwHgy_n!w5BOds9oTEt5_d z3I_`VvK3&6tc`zBLpQlfnC?C0YKKD!G}4c`2+O>y=&YkgjAw(PiF=EJ|HiU5_J)3p z0amSBY^J9oPsWJ8c|^Lu?kS=3wix(N0k2{*)R)09i!S+llZVJwYuVQ0%U$a0gJ$+fY0T{;1 zJt;2vtldAFkU`*oT6+DuQ??f z*eI!vbS*j}T0Ys7YEuP>+nO=Ah9#}hIw+07rwEGugsWm0&(0=(Riity(dHewdo7ej z21$c24vcS`#XOHM45bjTl(HVPYy}sXI7B}DXgn4((Oj(EsMdsh(8GpnrSwYovLZxA z<~7Q&U?g0_owqGo&wI2Pz}Nq2a+;!<_Q04-$VxteDLL=*SP!bJ(Q@)cl^48>pok-S z!eZriWv8yjTCg1UF10>@Dva|wIU@UTTJR(^TO!M8 zCUomS+v0I6+!4le>xi_s0DH=vz*~rKCsCuI@QMxD$%@c2NSX6l+w9)sa1fh+qPY%1 z;@J{uaCGB!q&IwdRU7Qe7>l`ecVO$l$ftqXU$MlIMAjO=RVJnc%uE`9A}w8xd^ z)tF*6^zu_Q(V*+3VD1n+{7^udHz3fRt6dO%s8fiCtv;w%DV02B&LJ$N#D7Ru_`B-^ zbGdQ~@|GB(_9V0X#~yd?-hmvYWt=5e~c zb=y9S9@Z?w1b?#k7`d6rmnN9Ly5(#aOu-^lb|G*v_!JU+rV8n%wX$ODHs*5n$>%k1 zR=AAoU74TO{*miDzsGHF^zi%Ml3MBsQEhEA$k5^DowYr8s_(5>`mC(_Dt;HCJmg}j zuzPZRQ!(jBftOw1S>?|v9xE_=ic-K4P$YQzKy1z92f1_pP>=Dex0UBZ`|T4P#`O(j z!u2giVC59y?Wd?*N^46aDUOw~p2*L<`ZS*mS4I??JNb^OzJ5rEy;Yq6vVRs2M&!PG zOoQTu6|E`UP01=6ei^vh47f{U*Wm8zm=G`@q~HB4NhfRurN8GndHkX&PagbU6m=}RV|$Ic zHG}@dPi-I_G9vRYwVrUT&amGl`(QeN z{zZq*YR#7(a1!CwgSR?3Y)h?{(o32Ex-4CGoWGfwxN$&O zMm)*t)Xl^B=n`=v?Ancw{ZBOmsTF<~6z3SOr_!*gqfqH!d4OEzn?T+WL_R+p9(tlP z-Kz^Rhiq77Zuf>TY5R+Zhm6zrW6xo0Z)byO8APT?(A~+UUWw8S<#)Eq(^a%Gr8fgd z7uFw)*w|>A?&3@Di*w~{MOmkjfwUGDEJA3fkUSDq1|_QSExcLg1!!+T{tytEuyRa; zW&EvHW_zC`xp?X1v&PqD)qxr8^UP?r3$dK;)Y5s~2S1;8V;<)|ByoTY=s*rvkM)dY zaK@ChcM4Z9vNSsQvqyG8FHw7TxZ2Tb;&pLTRKxanVcHVCeTCsDrG;d}vKnuIy5B#W zP0zN7X_ArV8G?jQ&ZnFYAnW#lX>~DLSCqS&@c!0reNWq2=Q@#3a#n`pvF~G(c4A?` znz^7vOLKO|TDeybKPlOCC;BMmaSZ9~+1YEg&(d-IJB+cacR^a@4=T<{;J^89zX%^K zKvq+hNj<9?cC^tmWs;Cghae7G3<1l0aW2V6+m(X^UU8qRr({ zIJP)I3)t+|m^OWhDFDcHO1KF;UnI})PGs+LFx^2wIe*>zifpQKZ^vTZjG1Ez6I1cN z11@=TDT|ES)}oLf9sesR@~cnUsUfi~*l|VA*iTCyBA%4LOUOjTzxXKn^;}M8Xk(+Y z5YP1x8`p6@ZjDlVKOtUNKvB4*R$P`Z(*khoHnogZxmYi>Ag|WGpUe(nl@SPT3aj=O zUe`o=3X<93UG-aXJfbB04o2~(x{ztk(z`7;o=|kbljnS@kcpfj+WSH8>=a5Xm4Z+Z zy4WSJzpV3`mmk5UI$l$)H8;UcOM%_`4@)lCL^A*U0I>@Y@OFc{|GC$ zdvL3&y#OGmE>l&PEB%&Gas~A+Kw(}MI_SxEiiS1sGSqa$1Tg_V_icnOQCSVDov@bd zj*zY9mnGa^p4+7^E2(&D_PxA_^)?p5^qOD%x^%X0eLsJufYfN^f2|rd>JhIafmOon z2YX}KBs$>6)3M-N92g@gB2t!4q&&X(zyAp3-JEVb4i){ZNp<{d z-7+uq=7FUsSR=zVuIR!#Grme(oeL+Tsn#uc1g*37;MJa85;HQ>Bp_ap8w5ZEGB;$9 zCU%*iT;*T^A?_?vO0tUkZEQa1_agT8;Jq0+f4RH(B=z$4(Jnbe;<&~ygr6mg)oG^j zalVDYvMkHiv}X_WVe4MI}k`#LIewe;y28%Rm; z2u>_1?k7x@AqX}c>67E}BH?H@^-yUDc}^7VV81uBnc0-cGTihGO-*skP0N{7W}Z^D z97SdbCdY_ODDsFzpsrq)or6@+T*#TR(8EZ^A%`y+xYfYUzK=hdekjvaNvhido5qxR~R*IhIDoYl(dJ%s7HS>4ATyRc6w*Onf@h#CGJ8{>jwYC|bqu#YEtS zb6k@w>am~xjda)L1^nA46Gl&<1K1w#Yb2i80P2gbj1PYN7ePVqnl7(V&0H2Ce{IRK^4h6)i*&=zSGRP-($^`r-wgLzp*+F3dHzvpQXuVQo#Rf+B zVpKA`RCT&dk@bKhmsQNE%7ZhJL$qE{)`r?tqq%<^aZ5pL7p)VO0w4>i;rKZa;p+J9 zDOrD%d9I)fBV#wtG&zW^v&ohd5k1}931=H`osi-$7{!S&lwCr7zX=JRBDVs`xb-`p&!}TOveS zm-uK=P~nfVU1n^Q6gy)!Co0aiS}6ceWCo;XcBC%=dO(#4|7pO=6MB5lg9$7*7<25TGGt?3OaLOhY%sVo`}tValz+v_LhZK@psmfvACD zA3`dFFyS%qqCF&{&h4TK42L_OUI#;WY2*-=xYgLuFdf#2-ZZX~`{uwJ;qe_|+uZP$ zFec*&N-8Tz61NCMS>YyBd?nqLk;K`c zG%>DSSZZ4-^qh#&tAyy5V{f9WzL8-(;(gf-%AZ-$?t5!@$QeFz-H4 zAAk40fw)9pHv8i-#jbiE2xkE>5Y-9jywK?i&_;69vO2p78F3x9m9`CjcR z29Nx4x(I@@Rw*1IZ}aFAsZsOP<26>skJA+Ez?s>nuQTAm>&z#nf0i#_q({rdSJ9=} z%CLBDFaXGW--esQBQ9m!=F0vTrlj5Z+#dz0@GKMkjE-KX;H}1mpJx%>q^Qx%RkiNm z4$od%w$35Tcx_w_@d9Akqa8hX(HKOtLzFCIiL*=6KDKbgul&QMF;ia|Xu2GU-?+|g ztsl$b?hd?gxVS;(F&4Dwr=>zs=T47puWI+w3bC*1^<7>J>Aq|zY;g(Y4oiefU8w2&SDopAY z@lWF}3{}Z@ z;IzI_>cPIYg*eecq2%T{dLnV9vfl3NEo69RM0x*_i)+-%HXp{z(MH7C%vq=9+ohh2 zM`>_$gGcEY8t}DcGS;`hV-ijD*5Nc;ZNb{EjQDX&1IO}-dHbsfT9PUNH+)y4alS`g z_ReyYrPrA+#i`ZhCt6q}P9V*N+@4F=&@ti!Xu20_wd_SNB3f>JU4C660}>Pdl7j!0 z;w_fv`@dGk=Q@Sr((>}p6fd`A=W#clgU0%uSXWv@ z>Lsdcr%BWROTh0a5>GhM&g3CS;DQtPf)kX(p*j;*twL5H{V)Z(LpSg*j1;PYWr=b3 z^OO5%uY6aQM^VTp7?vr7Biu0!;4Mw(f{uNS+RS}9>(If9p&97Q99MH>&`!EN^R0!s z?s9jSfC(cYNyIB({FMbkJSnn&fNJ`LHopg!@bHgMMs)bK-u3y(}i89hD*lV`mvJGpJ+qpB-%48>?ogmgqHRGm;e)nH9o>xe=5Z z+)=p?$Xfo|l-<802FRzd&302E7*kzt zXe`n+TYfz{Zy4YV%w4M}=-Rd+Fx;<>yZ8O6@DCl)=s_6ggMVhgIj@(F`Pb#X-aF9c zJF5GFRyp`9V?a?GPQX?C-!ud z&typx_pftG(K3TV=~|@z)&vI?9t#x=v=YOiG9hCAI|lYqz1rZwo_50?7#+)43KWRR zn9-A16rho78Qdj-@ytZ{P)aVjpRTHu=emy}jLTorh?2FGb92f2X<72;LWwKh9cQN+NJUZG`SMMA_9 z)tn)2UKI*uE}n$Dc4xo$TbJ?sa`Q}5kPgg{9z7%;rYHqcuq`ffuoWc6f)tK)p%H#; zARHT3$s89~m`r}^xRF50fJ(&=bP!**4EnBIChYMX#&SByk(&T%MHzEbVPQ`o6O7l2 zf={Y(7mWuxH_z0VsP$K&&N;>n>_)3q0yOWMSG5Yv&_=!b6Xefh&2Eq{kMeU0?EznEj6-z*`HkzIEP*s(gA4z#l2+bc(;O_ zw)FCNU9&S-d_+7olcGP8c|k7k-W@#+>cdU*BD{jNY@`4bg%BkSB6r#ty>$4{6L`|4 z@BPCcx-E#T7KAU$$0N?kAEbGz$teL4_nRpqZaw0Ur`akvGCjeX(&NUQ!Zw(`T^)t} z-P$q|_p&MTE+e)3j-?stY0@%1LsDavEHsB~L+Dp3w5wG6jvk?Z2^-xytha1hrd6w} zEzZ}u-g)ZZ1RAfQuUM;gwUU1Rol0EBFlk|Co=*wOyMyOuDMLtNDeM`5e8AIAwh)JM zSe@p&SVy`oVoL*?h-EMVeS+Ve0&pbK`mH(;<4Pv-<7$3TbO3x^F+)zRwG>x+UtQ_- zL{|EiT=_ReID5NYN&imRdnVckd7N0hgxL2Xb}V)9B>FHcAUV-nA3p0v8<)ZlyX%FY zt2da8AgvBPIkV{w0{Ivr^zLkE?)C8Zx$(QLVwh54j<3SDkjy7%bGi6>FWA%mpklNoAVZ;QGmbhPM|2jvhXBZqDcLscYx6plNmja|?)RnfI>mm$$j=-+!!ddqdBKAw2%by$15@)PSLjWGl> z0=*g-=@q3lRpV=RWL64X&!2~k1zRW3FH2+H#S1>(Jzhx>KT7MWM;)n z2E7j3hYRdidx5G|qaW|wVVfh=cC3d2ca+1evmYXurQ%*!*nbWxsGxpGz&`s~`Sk9+mi8nbS}ICT)^=G)yc*oD`E zU;rP`tRPCPIR=5XVJD8uVej?e=uBeLjEZ11yfII{@b`I%jp2f7}qnZ3#fz8+!5eV+$-f3e#A;|E-S+1dk?2WZMSho8az zifa#8_YcTO`K=(TZbj0QV6ohw8Daih`eW1SXo|b?Bi&ab9IohhxRndGbB9w5?RldtRq}N0X=&2<{O+9zI!3;7?-*R z=0H4`O0TftIk&$NTXGRO8U4j^K0zNX{_U80PmNeQ(<^J(i}MDcIiXD#GaN8`gFc#X zb>#Ddp}cQR`K%dajgJ(J3*M!1Q}4Ca@=6rkOK798k5H2jDR6T3NBqPO=u;>FFS%vD z^l`&#Pe!qpsIq27F>=24zLc0=wf)J8c@^YQJxGmw{n){u7Z4QezgzdnIKA>YW&9?o zAo`gFAPU!RLK>LhcEhmr3dJPqoP6QZ2AATDN#UECY=eKjzZw?XfBZ}plX(nGWPB%< z9+kTF$VA82p*YDzxND}vsW@fQnFwQ{C!zpBsG6Lb(WV-V9jgS#koIw1nF7jW2%3zk zv-5`FDkiWaA2bixDI#Q8KSojSyv@I_qfx)G(!H7u*&9Y$+b2* zPDndqJoo8OXUs~rs5-lFVs!E!XU_+ty6vyTg&|hMH#D8f&B~>I(kYn6hr;PJr!cbs zqRS#nZi*-l6D#1n0IUv!_DNkXo?@%iobyNZcgBT(UzppZrcr_?UVU4X^?6>W@?|r9 zs7p0Qc$mYfGZ6-wyqHufE&Z(O#8PI~Di7;Lgxkdpx$V^`LOjv8ZRed?qGhNE?aE5B z2XtG3<=sy3b>xa*W8IowIV~|DD~mC@a6UUI#1)N_lYT4Oq&6rAb|?PH%ELSX!?tyl zwd@z)e&pks&O9=4$o=G}frx#3oMvnW9RrPV+&k<8+scB8QhZ^S*DhfAOw7Q)wqJeS zA+j8Bdpq`|g?@{9c=Al55-U3i?zKm;ImhFlxpwHma`1rZysOAX_tYXR`nE#eZ@rr5xBDyffXGtr4u}n1vJ*K!gD8E6-mzFqD!Zit+om@VmN6uq}r!J@32gLSC z?T1zvdHWv$SEn5=Jw5SU_?F9&UXROBHsk&M%F6Y(mbx5a+zDKJOVoiJPh>$WXgE!JO)7bQ+9TqyaBzo zoxzL5wq=-gs3|mixHXb<`u*IG~D;yClkq!w=Id88?(z>fe<7VJVs=jCSYj9_I{SBB-4km(fSPr<_kX z4<+Vs9gwb87YtOZ?4o0%(m4`nUBV|h8ll)uL4sUZtWD7xxy@yzTvizPs{nt zT9nBJ4d8yL;a-Y`3Di)NEh3({2irsE$Z4+xe80^}hIIXT+UpsTMfRxtt;7kzy57o> z_=P(M?hoxR(pNjgcj9l1G2kL~^Y*3!qtb;aAOR9__wTwjwv(mPiMXY27)t7r!f5JP z9(5QmjbI>>+0^5u=)T`kFE-t_nf zdEftM?&`lC{F|}8nX?1PjM2r-(b2)#mC>Dz(b&#4_*g?X9IXE`srn;#wh*i(i&+f89vixS zEoe?9n3T9U10-yX#&RHFZiB!KL7Wf;hSoNoQps&c%!QCV=Ho_>B}x_D9t&#{O(f^v zqRd6?T(jPEQ^6s_ca1Re9!B^By|(cq+obK5$3>SxEstkHDHAtfO> zCXIDTWz>H76t4lh%elu)4^eYCU7{)E2acM!%{JH;j|ziwj*E4D%EHY-@^P4YmM33d zvs}10I4#i$I5KvuVFvZ&BGDWja(D`Orf=UX#Wax!#TgQt5yFvo-FkxDI)3f>lFfjX z{>9A70tl;$hfN%AjW(WcvG?k@6|nHI<#698J_cGJqh~Wx`Dvj}aQItG^UY)=S=mJ7 zti)4o__nWoz&+#BZV@>e0+(C<(0{0FQQGzDo?Q^UUe`ylPS`8+Q!dlg$8H~qI3!KW zzr_W!%eIGBwjfv>Hz8jCmo8h~$qu;r&!7ePf68Dv|7S$~UyOSHJplaoZmI3%iSY;c zHD#8>&q54?78oKL>DHJBmT!ayDMHnT14~SdQC6L_CCyUD+c-TPbSkX8v94jG*!(bS z5cMQRUNCQ>SSfWWty`Vfy|}$ZxE|p9*2B7^K(VH8)pEzzwZpvg>=Ur#q}_x&nPXtLUqvwxfLNlk3a6`*mBtk;- zThwTWh8L`8hsGD==<9|TLPq~|pPl1v(oG*Wk$oH#qJuprEWzEq13LfFeMvh1$$d&X z|M7iG;dj2E`&$HyPucAUF~}TGmLT*Ob@tr;vF{2{w@o2R9Sdx>mo&QlF$_ymIwiTb zvNy@bt&xhC0P9Wju&vS!YWe<$nw&HHX8K}WQM;Uhils{ZjD?sG30X{s@?aiv!5Cf@ zk)%?IDYJDBkc0|n*k*iFr$9GHn#>~wojmIuZ^eS2w@I4C3bzqhkg;|7Nf zXkq!qH1!+FDZ>)({JtynS7I0)J8KnXgI%Q?Z?(lc-@$MmHF5fOx-5!SDkL=narU;^ zX-V-0DZqL`w?XH)&K%c5r!fa}gIulH=Q1%FYmgN{lfxi9j3nB~qiW4jX--ae*JSCE z5d&JY>rCSc-?mzR%ga@=+hXIHa+PS-#Sd|Rl60`|ZO#_KpCp!@u;47yY){_I4*?kn z+LL9d>Ts&*9$XT@NffhNwlj>cc~?{qG%O}E@K0bNKc9&0yUo(xSbi$~Q9EC!E-GsGZ_c^bVDAmT*-_gO+GKz0B)KSca zi#4I)WhhIPXibBmLsF_jHF409FWzi3#EngpR`GaZj2@nVERzFuHe+x{!NxKI@d}Eq zB{DK?u|1*`lMX6>oHxK`k^Pc2#y!0697iSCQD}vRbS*6}d9By$Ot)1ov80*LZp)7e zS1*iLTp7iIfa9NAP;X(0ZOY=5ExRXLQg5a9&J@whZK2UOYJ6U?qUNzS*ig%)uDaka zJy0r{OELDd@~rZ1Jl;AFp0wj7;3RwadHZtK8Mv_EL2nn6+LbmwfZ|k@#Z5|We2LQ{ zyxFSd-JYN126m2cLsmtrree_@VP+?*y5L6&Oho>8`|;;+xZxy@h1M=1EZNM=%4@`% z6TE|p!Zva8PpZTnk^1@%knQ(885hTd4Jr54%_K?7&#mDEX=XXPN#EM(424+NBDQEA zI3B%NZeuxF9_N;|^7({uOR-0!iX2;9H5Y0PfQ+|(Ps(zMnu;>87t3yp#Hg6|XF#y|y3Iux<8fexHq^)%l! zgP9NUwPqdgcL|C1AzH~Ui|br)Cx$ju)@-2>F&5M<9@OulYYe?OPTCiK4JxfM6HFcq zvi4`X=;%7FJ^mJ8wi9 zhA$N30))>zv+x+#QSDV=j!uw$P>VD)skusW(iF@R@6YCDHp~gJ>4t1hMV*bjQk8f3 z;vuzA>m@xEP9MJ|hDnENhUa!Q`t7bOMSODZt1HB->6Jkv8CiE*gVyy+H#|IV>e@ER zp@@!@U^PT3)AKLi@5kku3UGM`no9p%A;3?Y#bzs?bN5y(ZwW)5jF6d9#`B1>NXYJN z9V`YtsdkMvuH5N_$7L}}Rl=x3rSY1#0A@1RG`HFL6xicghi8s&NDsf9@!#VCtDv-q zROdxdT4buq0*IP7$Gu%kGUKX=R$SJt4@BLW?Vh9MQT{@Red%2v2ak3_pvVv0A}ha1 z$d+}H(y!8cWraCbSYr3{inERu|bXQ3ch%7Qzl86MG8w7e+WL5{kRU zq*8nE?&?bAMx%~VqV_T`?sHk}OHcMmH|=9&?16aBSWikZ7xdg#qwM-&H%@s!X!?=6 zq!V=Hi)hN+T&Ik4VEFmbEWcceF1?5h1_z=Y+1+logJ>bQWpoBAgX&9^7cqWxhsbnY zKp=P<37474LgNYblO6|gAHq6}i}96%6H_Y%;itF-mcn&$&f^N$28T=9-BVfnwW)fB zE(*1&DpRuath#LJ6S@cY9&LYrG&@5vZtI0Soaz7{moH1sluZ{ZWilP-jSgPI{xL;b zmkKcIgw(3w(h>z*B?0d|K{Nu*a3ApTH-D?j=}k@h#u{Qdxj%`E(8~j7D-Tx}W8_Xw z2Uaqd`K|eJ@}dfd+f&DOnQHo}kK+csJlcr!JBgiG_2Omk$Yv~|FMmV-!ebqQq6?#B zqK0Fg1I1HDB&5XuOSB$v)O{$KVk>*@x7UF4w! z)^3IvgKCf-;Wfc3?M+KWrt-vLrpe>#iZ9L-)IZ5+Viz>~d~*+e#p4efD5mFa>8C^d z_2Z!dvGGQDDnrF&2P)xLYc#-L$5=^itmJ!71PSKOA9wPQ-mJXYU!@Gsjk%Wc&m6F*(?n0Gu5_`z)pzuBPr9(!x{iH&=p{((>{zj`qKON+@b4E6Lk zO1+QI-G%wW2llT)zkpf+e8=jh&+oFJm4h$UodN3e)W4)fa%)iSu~rV~33bAS5Jt{K#P@Q=mAt26u%CAOU)p|b z7$VlxP;DYWKAXU`DZ;iXdOr{R0k=q$aN7t_&}i;NaN-y@0M-+fGvJrDeJE*g-vnqzuE7J z1R9Bd>%TvJV@O~Q(;qTCoWQ3W(kHL$Iob7-u6ku@27C;5%VzIQrgw`onfop!8V=y~ zUY~yBaRRpiH_lePl(_i?rKpsTctCCarH=W=_+Qjkajt&={I_qf`2Ram@P9@{)BVpg zuE;-D>%XWi6?0PuXS4r48FBx|>9uscnK9NSX8?-`2@o+$pwEzl?L>tIi2RTOB!tvS z1rmFa6*h9Sf(7{?EO)FdLn%Qjt5zde1Ip+Ms`FQut92GNZ1j6u?3?X>N4y_*Js(Y( zu@K*Uz4o+kbXv9_=RO{V66FfOemf8oq>XC^+vkECaS`kbLwEX#M0wy;`OZM)*G99M%R4r|7b5REdKG{~Yn)eInMj?jr%V zNAY*a_ND;aCc(v?v;kl3A+1hd2(+K`5?mV0FPEE}#zVa1T@%po+vE520DE)r4YIDR z$Q{x>cev{m$8aQ%eZLs9w2)`nmmio!W#uUe5Z)Avthxm|f+6?W~;b=JBvjuF9O!?a*JGvxfS(5P$GR@o_ za@+gU?p?P9denou8fMVHea%jDv{bhj1>pbZ%7|vvzEkky2!Q=4MC!!cD=hnX3hAhc0#H+LrkM<5ZyoY=3JyvmSUJ+*7Km+_e>^=5D6VCC*O#W?X@9(zNpMt_y-z3x*P%uGx0L6H zA880fCW}rYl|9N5r?&;+h*kb9)Dy*9ad;ZOvyo|b#r zHKslKb&Om`P6|<-DPN4q<(z8yDKi>_)JQPNzNs4cLlGoej6FCzraeOPH+sO3L@?;2 z$$kk5r}8>tEI)>ujkP0HFlnui#7tB?+p z*t0Z*dSP~7@yiOZoI!j>WL2@M9V;*26Vz}+kbGSq=;DDFuM^0>3MN+WZZtp!75xdJ zD}wC4^6q#^PS{7ND(nl|uDzk-=HT>NP0ARM4}26W6DGa{6$J7YAiagBNNKxp0dAad z99c0ykE>l#QH^9~%I_70Otcs(sKe-Cjl;xHkFetXaMpd1`&dpmM43@{(^%E?02ur0 zAcc54m2{t_yuWSeB5RXm3KzDFeYMa7!nuwsT;*X3;x0lMvM?N;{a0plu5#PjfJ0ID zdzli{Uk(ZeiZ!RUD45E@r+JQwSGK*lQO3j66)BElNbN^_OYlsC{u9{7ziLZhLuByE zRPw7Kv6N{bjC(LHWueZ)b}r4yCf3Zex&tLt&iBT+9O68?#8Uz#NYx^Dy?YFX3B%Vh zte+~ed-olB?bV`!8SJmY&W2GM^&*0Mj z1|?$6k7WwElo{;(ko_rhb8h+)CPm192*dIY(Krf&t7OKSpE_aoj^1N6lxF4&G_2pR zWcdUdChc*rid%Xh9?#THIKs9p2opSXiiGV9paBg6Tg~1P2-TCMcx2($f<*U&y(oLb+t!X6b=(WMY9g7m^hcez!s7>dg20{qf%ImX0kI`0P>6wg!cDVvP>&0y zFo7mYQs+ zV0(!&{ri$YoDp{Z{?4sF@C%Gcg}PoURvBrih)2a$uGF#4qC5P0;svZ}>;|zM`r=29 z#=Fw6spn=C(b$XPdm7^9!#`%phevDPuy2LMACcGm9kNCDRuw2XFoPC0?Ap_Ru8zB9 zu(UqTxkxKKRp&gh`8kIs>4$!)jGt`81#Uwy*EHCt^GO6ys5kBAm8;Uh|LpaK+38mX z{@xXhKLd9-M2m}BgNyi_=)9ldLQmS;xv59o=}&__cIOobmDOk54ilJZVGij_x@Zw& zeT3qrDD@^LER8zCmp5dq%07mYMq<0qHVC3RwKa3?M?m7+V8B2z+2Mm!@NFW*CDVZf zqyu1F5lresSf^1#m*zS4#E#Ca{Kg5lvJwf230g_5+2Xm|dn;{k0$`ty@~) z?_meC_f+#WH$1qkRy53xM+1`hn08NOU<(#BqJ25Wz4J>l+woupch!oN&?mJtTtDue z-~}bY1?rfGe>kPtJE7uFczWw6)-z>&*5EGRoSuR1R8%gu?Yld3{19!H&t468nICkh zJLH-5Fd-(XjM8}_%}E9F(#fPLGxJKLTPmk;l4dWEf@z_s6x!+S^^QsXvFZsLMT}2| zA|00=3B2D?zLSwqsf5a7fkaAPl5qMw6+2EyqYP=Vq;Hm z|J6;BF|3+$h+*%p$XsHG6u(4P_ZMkv&p^5Dv?=}*jf$H``YoICbGYi>kz&zi9k?aaB=KucgPwW8z{k1cE=MUgE11}v;J1gHi?xLz zJ$9`h`gLe>LhshLBZ@}@pD=gfdFfmbTQHAi1Ir&BZ=Bt7bNAP(A(zO+leNOD7!|I4 zU)OjCI(^s3l+_h};Po%du8|WjmUFcLWU9wu`;VoX-58>_be)cUN@7mh;zymPiKt^% z>)G`I#fsWYdl^mTyI7YP&alMpl>wSC4F4=M`K!WHSHyv`ZDzHy$B4;LXGDdgAa0J! zLde4XW?7qI=0m^ zG{ru^=v1KB{A2fw|2qxBMF}z!Bemld)P#Z5UVS4{)ka=Gp#FT%Y!ifv*V^*f1Zd7Y zi>GeFdIjvXQ=R%faGg0p;&NlL2g3b@Hyh%*U+M*>ZI?eClBn191$BHEN3CB{3F0e6 zaQ-R~*WrfJGx3eBEGTW)d>@~CWlpgUFlm%;;EaWl$(uKW4lSMq{{g49r;52DX7?*D zRx&_?JxsE;@BGXj?h{5LSgds_Ez0lZnTj76kPa0LSEgirH48Y7+2dF+Oz&_1^DHF%D*u)!bBkNn)qc`gs3 z#L%-!NTX;FxFy#>Tqqt*Lq{B;0rot!93~wY-12K6Arx*gW6a5qxy3&q)K_NM(jH<) zc;!6CLmSi@1z*`69Vs>Kt*2fb9j1-wGGcXVj{6pqXppl^OEEgpSW8piYWPx?HRR=t z%x{u6`4U684~qo{fe)-X2jGXs#t5daZvMDHZYTE>+-8o$uhA`xzhqa#Ym_d>O}|FA z9RFfmg`HfimI7#L^ylp@#wr^1ChaVuyvr9nv+dMZ78aSo;o+b(`-Z8t}JcA z(vSoET@9tx_*e^RS(|Kjjmwd_XrZ;Rwlr{|vI+DvFd^u!L-N)=db2O{(kWy!R9yXu z=-kbdd|3++jtIVYUbujYF(u4pbcvVDe@R9(=`;9*dTUT$RUwWdV9yeBO0RmK`5R;! z+O8!BRSVK_&>`nIg2jG`YTQF127UeX3xGo}Gh+y=&ByNv3{|sO?)& zz%hX02$3Dci@N8Jal@6l3t}4}Zt5kPg?A``Br>A$4dZx$U)UupF~xoA3rr6jsAG&9 z_SXu@;L6aDDGw_zWHE-aIH19gLE?hEF2KDosOTpg%zvTcsf*2f+G~HoM;;;N0yi8^ zR6B_;>8DmKGU^!>D;*sMPmE_^Mnf2q!zVp5O4JHD7{tYA^yLz6+7)xcQ~+@9V$>6q zMvc^IHSMuE!Inmoa*1|D97nIzso@W3@0(`R_Y9O%^tMybPP4An^(V*OtH(Eis|+b< zK?RVb(C=-Xg#S*IY?uc=C6sO=TkwpbA2M$AiX3~zbR98B8GoTa8ney&;l!@Gz_~pz zh(nS{Z9npF$ubl(UhF_~Jqr~tY$B^G%pq%73iGOs@Er*~C1{C1Kf}MaujHXvO3mU<584SUraU*)DUI3rKk$h{O1}EZ*YmpoJ zEPz}*X9dbFH;zXTty!dO1#nhERu)KP+n)xDQy=F%k)}vtAcjw+#N1#`oFjSu& z7Ts3Jn>&N;N6dKCBntN|x^4{pEV_}O>?6rL>C9jgjC+6PUKUv%g4;4D%lB&Z4cZ76 z+8ELR{uL+82`8|86|uMtnZ}WSaW{-hy`0^%MqNFf@dO=y2=_U~6&>HgPC+$rqAOeh zEh!kc?Usclazfn~*{(EjW_Tv7LeKWlwxyEfGel2;xTgeW@=HCbl?n;z zK8@#yr{8v&`QMkW3?{=$6L)J~#bEAneo7<5#9%d0*{~!9G7OiyM(e2z}jEAQArojcs^GHocPcj;4Je zX!FnJ2Ifo!Bp)p`Y=x(DlU3Qi)1QQ&)wbbFe|zPXY@+DbQswR_O&jTJ+|#cnTU>?w zo;Lpwjqyqr<7t_6Du~6Wp9wRqCI{d??Cf9^74f|_uFrR5wxK{9r#t? zSX%Wn4SM#X9)O9)z_>Eso#4G$mmvE8IARAKw}zQa<}+Gbj6}_WA=OVTYz{&=(V+bz zm!Osjlkv4F3(?e!q#IwJe-3Pz>~Tk76BvLuIj#8az8#K|s2Gs`epYC<8$U!XlPb(O zk(Xwk%_J*Gta9H1dkH;BVv!7>Rd61R;-U!OpL+GFR_{-=qaI=yM7r z-sus9+@=MTNComdbA8ZrJ>8?vieiuA9qVaSW<7}7FV^@=ebE1wdZ+MX_=57Kcy9o4 zg=FLzp4g*&!P^RJiFcHnK{1c!b9(u7HZeuTM<#&&;Mz$_6{)B^xgM06DdV-lKu|6% zxh~>T(+bT^eR#-4y^ZK})H0w%>4PBI>f$RzJsoZ|V44s(LX0jLMY{$KB!l_4PRYE? zN)n|BwAJn<6B<;u$BIx@lSn77!Y%|uE~5WG z%HA=$vTofPtyGeVZQHhO+o;&KZQHhO+fKz?aVl2D$<2HA-shgP@7?d$zSY`lZLaxm z%`wLq{Tcn~z2nBMIT@LgpN(yLoMubK^hiG7N~NyxoEvfQb*2%uRA;93kSg!+^S#Bq zjY5p|U+s?_Vjeg!=uAV#-yTE}V<@T!h6v9|FcM4Fyq@+gRooGX3HPDd&bxODA1)2G z8wF${nbbi--6J7FBbVE^H9~K?2$kJAvDZYs zJD;xG^Rrcvj%da~Tlx-g`qi2I@nb>CQLBfQp0UKe%h-XjWYx!!R(JFOIO{p+-leTv zs)r(~g6ZS9XzKcZh8LP5PJ@gtJ7!&3QKjX&A$Do$6>XtKKl(sk$i_VSt4HlX3HU78 ztF&|KvmJh0W&*Pl!vQk~Zbm_m=iFT-CO4?-(dX%Y|WbXcb_Y zbtuo{28lOtY-y)*F;zR)PO)ffoYtYYWz4qVSrRQfQfto9M4sd@5%`H2LyUqAnlKhv zKLC*^3?z+0n??bdFB#=eHO#(BJu*l)1hPs%I#4@I>=t-*6;^I1EzOiQ3!4_OcECAp z2SqJ^#_Ym83e%4_+W*^GHh`=!2E{R|!l)|ey_9{tl9dc|D~f$koB`TU9MQ}X@kB!+ z&;N6$Ovtywloadvox-BwY}H7GKrS4@y}JgiL;bNo#MosA*Q|UU3@f$$PoMFU?CYVr zIK?8$dHN4C-oDENkmTK(BF={71j^=|0}{pJ$_`Y&{ct&W$1#GbU;zW%EpbrfNT@vN zsZdD;P_zgObxKtJ!Z!G>f*%oTVCNnsW;oCJ8ghG>Y75Y!EW#PQ$qYKf^Qv+pHQ5EGrF$H3Myl0L@}D zW+1%7gRMhy$vwW0sJ4}KMj7tdT7W*D?%LWEM?5lLw>AyX&m0sU_aw_|>2X6ixX3j= zCs&ijmao@rug@0l66bC(E0mlb-9)Atz95&(+fhKHOzJ1KfkO^MvddM4oEpF+MR<^- z!N4O}=8G^7uoOVlpy9SjXn${opxdPJx(>S@^g-~08!o<12JeSJ5REhw)uyI@o$D*?2&F#+4KYN zse0+YVgE#H1z_!^KDD&r@FBbIs_n_Xsao|X8dTPWSraO4(liXY#8X|O5DmjJNSq@p z4bdu)X%0)?)S02iMobPH8YHe(XV}3nkfWT35-lm3@L>-rRB&y2 zHqQeY-nTGtV&H^to`lJ0yMh!OxZEcLi5ccxg0se9iO+w)EiN6u-%@+!%w_clBO}=- zPTKvDLd+6id4JmBS(gDml=Va6z*cqK;+0Zs61!lHG=Ni=Z1urtY;W) z2*OLjD;7_I@gp7LhAXj8iL}weluaoo%{FM_MzpLeAOfTX1*uC8g>WMWG^P(^>CaTs zcGX;uBFvH;-k~UgT?s=4o9GJW)9TwjzO=h!4`$G0`EG29fb4#5)J<_HO@0frMq&ys zsKiefFj8WHlBS}*nxek7@IDL)f2in)Q*IpgY(LAEfTc}H6D7ig4}0+iXX5XpW!4Cr z)vCe)7TsL>SSoy4*We!nBoDqoe-SsklDi*2F}{6kWdEPU&A*#Q{!Prd>_6S3iT`!+ zS8Llp=$q{LY00nj_+UAUi(i_}AAp7ENYo+qlbSF11FSgQLc2L^j;&NGA5jhqv-L@jn*-OZ7`;&o# zMN*n#F(YO4eP-6B2$Jgk@&pNcl`NTbF}&w69x!#o&^QaSg;J!FH^U>K)F3^C%P?>F z05^ow4^V6($aD8pm{J=u>ob-RnFd99pO1(alkTMw-rQFc zOp?kH|DksMu}Z{FQ_i}ii6Pdg8(-j*lO)2v5+3_ui6J>YjjzA#AT_6{z5Aj+LiDLL z>U(YZO#t+{Oci2T{sFX~(<1ms8Cr*bh^um)#*|D`7pqt4Y*4o5JJes}pv3tgP5#v+ z#{JcL_@CX}|Hdov-&?`|$)IVNyJ0P%@X#fYXyj14AR-}!k`usdq!e25hiAi&%JS=d zIXc5MK|7eu7T64?d$}pbN8Pn?zsGIAHGcks!gmR^TM6Vv z6IQ#A<%11d0JM{2u#@n*^Jkyy*1cEzxyH-0FBS}#9dQVfo47aj#Xhm=vCb4o_RCNh zafl)67Aekbr0C@48*XwPUZnumNaYO=_vL6f{(GUN97w$YuiVQ`5uO|b^+qu&?0tsC zZC^{i6KOHVjTNtBdCGXy`O>c}Kg8KX=0c)ER7g$zjQ!LT4r}6a(?>|^@}^!H8Z#fS zpLz<#IzY2EeNV|G*$rmDgy-UE2eZRVE)sg9<06PHm5Q@zWeyjaHqXrfq! z=OQr25;mh5tLmwACNN>S)`WpbcC{8c58Xy39EL=-kPQwqDCUIhh8Fj^rPT4l5vu>l zbyI1^pSf399ueld&IJw{hNP`ZjLu)(7%~o}WJ^=HOX8EZp7WNlC8s|ZwGJcrgCyxC zgp_0^TxY(SpmM&CLqK-DLi13;pZ~fINhyj(2Cgbmgt$a4M>-*AvuNbR%IwdQI!ria zPPn32eqA`yi?z6(RurR@UP7NMGjInbZE!E~o{=uokQvF$C>d*!<0KSlA)CIpTgOgM z#=3)4g_RkD{H3-mQRF_^!mqWeBC5JJGqE>Nj!Faiz1f(PB#DB8Eg@IDQ=~X_gRlXg zmJ*nB#We6@LGt+|W}u2OTO3WQJjmv9F4Up?0xVH;Tl(zW9W7;T+|-ZqEc0;vVQ}Sl|!Hb)6a`%9c$`V&Mpz_ms2MS$Cq=?keecA}4q*ClW`RIHd zwjz`%gT<=#R0S|I6P`m#K#qdS9E6O(NQwE6GQw&8CK4tWv7O%&FWH`tmJ*Fi%?3BK z73uMxdN-tN@hMBqZOo}F;?|IRdY)cgE zB`f6wxLPD+d>{8wKx_T$T61TFk23IEb7F8g%o!OZrDCkxyN+a$8Z1R^xNvyROQ63& zacOT;WYieNl0D0cLREpM?m!hcj$tfDS$B;Y6PF^V_Hm#vr!3`l{eZ5{GY!#M6b}Zf z*S?+x(B_8p1aWp{R!8AHLPNDwEko=hwf3#EWj9P6OCM3xrGkL{RA=42>qaOzivt^X{R6lwuvra!Z?n zB#y!Au8-DYddK*d^}U9Ad;v}ETcL-lQaHYkemj|X{X6w$(^r)4n`{U~p6BHa z_qFDmAzC#HY3xzRCp%n_nNT!S11Q?PSJiKh^0T%rjy)^m3jSvs)ekstN5Ax{XXAl^ zTxs`LY}}q;sAHl8ghv=keW7yOcC$}f>9tSE zz2Iiup0s6*`!7!#({`knR0_*5f){YSe=NnHkRSaKY2%x8qe;3F;1gcz4&59?NZ_XJ?=?T{U0v9PDpAx{%OQ|L^_ta%TNeeh zuFNeGoe&|5ais9ey5$^abU=8LNu3f6YkYvPeZo}U2HR(UY4B~MzNY6gYF~YUEhgk6 zg(2%1gu)Z9p=8DFXovfOa~Y7^2LEaB@IHELOr%pw zVw`{s=W59jhg&yx=Ja+Z91 zj!|hhU4s*{l$4~Hn|9PIwlFVpm=L?jQ2DB8^>dC)Ep%%z+gUNs{lqVa#}n* zG7EEa`ol9YSw84Dd=)^nh1j38WZu(0QDo#Rlkj34cEX*yB9%2E$BbfWtEL9Y&gsXs z50%;N1+a_7?JSJevBHGv&6<*++N6_{^)0I#&A?Nd(K-3DxGZLu6qXjQ$W*9=)q`Sh zTga5Qlu1HZ7;;OPKxvcNM*sT0-bH==1lxFcXjQhQ{odh6^;2H-C;g3-FJ11?+LG5E zZA&E4G^%v_B?W1F;Bses{qvAFdu6-*o^YXK!D9-?-Zd5-OKOvc0)I5U0$B(G3elI5 z3&G5>tbL)-3+DDQUW33-n@;7yJc+pmCa=};TiG+{;uwRAfDF%iJ?t|#{aRmiOIWE7 zwrfKoKHLTe&)dD_a*|meKQ^kQ}lP!akI6LaNpS4?(Kd9vhoOqh3!qA1RLV00yZwa z`i0AkkQK{My(tIMUc0{xD2d}I<}UnxD5BFsPgn5@7-Lj}GL`Rv?0;Tj@W{Q__gWr> zX%G{>PY4C*vwdmVL##2P)72M8mqNfsuDapx9n~APJvoGUppJisTiSrv+!}H1J6{r) zUdEKThDMKuA`3WED4|?yAaBfCn?~ZM=~>pi$X)^h^sdENr4V0)w#Vm!hHoN3Z8P%R z`+gk>suP-MIznmnLLoTa3MWH=L)w+96OtDg-NcK4Cei${>l#IgtYlx?&rmU~<;3h< z8%obsY0IW*noPF+tC|oVuf${eswQUswwmDn&qJeRrtk32oNMC$as5|qC#dge{LlJM zMMnus1>Hxs;Tc~;6TFB#L_fg`5?WKUmPR`T|jQ(4Ya!m91%p-D4ll zZiI^tyF}M%geu+sX%55J&v(GLfY)>|6}WtF`0_R9k^Aa3=Pv8`{Nv-8t``X1A3=z& zW`sV>(!MKXg@}A84`6}4aw7`OgRV4)W$|Q!%(kS*9btfMD{|9A!Ehn4mQM65wPK9gIm7-k`%^;TU3AapNL?mm;l} zXKFHTXEa~K23@Oc`)dRyHPK_dp-8C;qlOBiLzT5kWRw-{&Zcp`4u`JSfy0&=^Vxe` zC={6z+)2&qEMCK!(?L;lI)UsAK^n>_g<4K?+ikImMp7&1{*3!GUFn$~0O!3lX2CWF;X~ zx;GM2j-lpK0O3zw{T-!?1h*oWM86*3anJYtSQ*@WmVNJ<7)RzU)b$#P@}e?C6kZWt z(%c08u?OhT>c9of15(rT5~X;glHc>qu`y5;Wid$X<@?@V@cp5jCiGG>8`MMr8=Ob< zwfo$(CvAb9oV)`(4)GQ4pg4H@J-3y(t*DY14?nE&on>Xb29oWOWi_B|219wnb_pKe zK9$F#&#Ub{^fgqIKw@+w)h_rC_7sALu+;5~0ONZJ)}0G$@kYL!jZ~7l1SnIjM`Oab z@)}T1Z3`O|^a(bpx#pf!ve-4qia!%om$YtsnSY7@YSc2Nn#<%>-UUG3**aiob|mF@ z3=sFD{dx}MW%-6tQ5dQ#;NIl|OuKC0@g4Hw@`qsJV7s0Tl)k@=@G9-gqD`S8?=@~g7fW|r zZ>`3TO(U;Sobf4nNBkf?li}}#mW*&N;n47PZ1kms_0v-INs?w7ClGo}$&ikk+5)D` zuxcXSPv{+b`XjJ=)m^F|iavRbD0S#hw_rnNKXMJoJG%pi7-Y$W&e(HK3Px#~cG-|^ zP>3XCJja$z9VTuvEA7-+=d100TJEj=^fl`Iu@bMRNL@)uq6s+VS=bQ?xB_*`8(>O3 z*h7%0ahR2A`<~dlV=TR^G*u8n`upiSYEN+V)m$H?_S@JA<{jJh(6N0~*Zr>N?*l>- z_@UXim7ljPO{aI@JC^p9U1}Uy*WHu%0r#~}mRQ5)>pr3$Z6iQAgZLLx+NKFEl-TcB ze=R&szQI0lUphBQ@W0y={w9>}Uy%=Ay}(Y!@_%g%0!I3FPR0)ZSaPb>A-s^6a6U*q zr%af>LlD;`@KaOJLQHSvuIYiX<4Sk{k04X zhYDY-8EtxI-5gpR+THZ%ZQlE6;@X&Lm9hHM_xU38@#uZ_%D0Qn{ZBU-9uU2p0KAyK zB}vQ>E6On#z#a`P4B%+cCJ&7k9z7cgFhEHKxdHWJ7+XoLXrm6J)TVX$iX}!dXj7!F zh1|2yMjC2vlb!oXXYvzq5XRuySirR~q85Y!MGN#@256HSl}mXOQJARZhh2l)Hf6}h zkX@(VCWToKWe69@%F59BnMxays|vtolPE-o@)E`X_7Z9EU4YwfD}V{BFX!8zAN6o> z6|1#-1fV%fk+Ev>i#{Pe0(&E&O_a8y=PO2vo-8*&2K^qT7QY{pa&(k!2Kll=J1b^aj~6mvbGOE5T8QBZZMPQahVA>#*gNT+<&#mqyeJ zAdwhNEk+AlQ(pj(*-30;ZR!TH0pjqgs~sF!jc?FpzNq>I4S9K)zj87 z@$zsnND^eW|+kEID+GQX*n)Nn^Z3+;p?{SHF7e577atY%7}C`4$B1wjL!1F9&7sO z=y_V$QLS=m%@@VBOi4~o9DPAqjPSUg3>%M3a$!V2)>rB;hF9>vj~ak(%-4xts;VcEp?X@wEDI z2rE{KG-c(Dp@jtsZRMY_%41zxYz2|JU#dA`aTUdYPA+$0USI8XLh%W#^1PZRb+*zw zP%PR)tNH5^IxTfmN}=jW>3%lrA;}z~G?u1)eHgq!gFW4nHFNcVV$76C0Em~i5EX9) z0D-##z~Cj+f3ILry=M=zGlYbxY8V}GR9_krLdK8>px~|sU~pFgI2gENZOflpLeQ?u zBG88aNMY)ZP+{s0TVm>>g?NM6nz+$Xd%^C5hO$&{1&5id{kU)iFhKMNy#E#2U*sM1~qu-LI& zFi0$`7OLpu(y8W|JSLk?tCd}V=79PTElaDx1TA~R zc8ZSPQB-goOxl&LNqtqd4=24^#A8dV`v?kw`almcu5dp58G`vgcUsoBT^G}jyDEhN zJRL0ygMGFb;lDyY6HgSyNFPfOAr>{TV@p{ZP>Vx4Rv1?*jNc!*&N zQvww)k0! zbrVT8f^g%R8p3uzJsqA_+UTtWJ%Jpdzq#DJlX2lmj&Vatl<~IE)4LBcpOFf7RN)PR z&m8S;#rIJAZum&ZGedczOB#on%owj*&B1rW!#B5&6twD%r+wqlJN%umNSM)NZR_0? z576A{Y0o@ns!oOZF1(z?KYg88J^kfBt;(lqIuY8`CbWj_F{?q0J?yb5%k2?aWJ^m( zCvrt#a5k$Qi}#V9ik^6ns}fbIbVamt4!}IoIviWD2}tg?@*w$I`4a>bBn6TJkn9n~ zKrQQMQ1Yirxp*(FZGFCdP*a}Sid3g9n<98Yt56XEUyHch$P6o?uS}WZL&>nq1O%!& zTsWqeM3hf5+xW8`;P4w0A50r~>0Z)YDvuioKF&PuM7uSVp$bL+LLE0SXq{U~7$&B* z=p^cd^C8B@NzZzN(Vqx{$A9P_4wgI5*z5o)9y)M!<0_n*WTm-1v_9$4|;6)gEsFI zjWM0BKnIP9hc^BL=TcMoy0~&zN^J&>Are6V?$BAhwrlf>%1s2gC`xsuGVWTc8|H4v z@Eg*w&=B2Y6#@Vk?{?w9f@7IERQ>z!yoYIOLU><3+EF(`%}^?JXtjmP%J~3GdbpK_ zuv*jjZTSNM%l^RS0I+IMI87*AY@O@8UU^JTa}brlZ;s!ThKM35wrqwcPJ$wKs}mt@ z4ZOFdfnDnuZ3TF2s3;3V0vKR|88v4Q9G9vIqn~^=AFRHo4ENKt3O!r~tvDXXO>_xG zSUH755mws&a8!?H0;qr<+nY3M6(%}xw1}9`8ZSntwc{zRng71C#T{uwG2rBi47p6n zF!z#u#8%3!?7?BT5myk?$`Mr29r0nlbr+uwZAcTyD52)1R^pgLylp@?wW*YM>B+Um zs2WoZ0NI>g;+d<9wA-2#b-^2G%f)EVv}T)JZV9!vrhDHK>-)2q8Cn;8q5!;+TBjPCqTM2oaJG_p1y-{U@md_?m!+6d=`EA?69a>3E z6ud7#KEqrisF-TVECp(WI=)&ahse9RC+;yG2RwW$u63C$w^~a1m=&+vJJW}a?mF1( zb#8!Y2=Df4&f`ix&12IrK>4(wABfQ(K4nb6CYK`t*bI zasVr8BhyXW3+>J_4X=w)(0s&*^-OuFPpk%MO-fG8uj_(QFgYnLPC-cn9<6TD#z>lq z!XAm}AfIQJz9ZAz5R7(s?I~$$4>-7ruTR`Z)8ri}Yp_jqmwSe#$Nsc6t|y>dR`|V9 zJ%uY`be$zrE`CkVkFKB-Uf+_xU_5DAC`2K-=lhq*flpZiXy{*@aPA$!; zii1)RIf#qq{QS%+^(a8U7mH~26~N+67s4Enk6YGrx_F!~OzXfp=`PlD*wb78K8N2_ z$g=r;^vl}jWD~&9#p>Dt=(*}%xo?(@&5QC@9;d(`@Y|H%m)O@VmlB)f!);s z?bz@6usO_;WhNoL+q6wh2ioBFoDB)tkfYn}dD^&XQlI@Zqhh=SMwKA))++44-@wVJp-i7=Q3IY0XqpqlC_(ICEP>n#j zXm`fOT)RFux6shs(_Y?8yZYrv!k>}w!wkBmDW=0oM6I%3URVmAl=YSp0WS3WjZq(G zwXx4U%zBLtO?hopt1B6(Rp@%*4?>G7qPl!8RHarC<{wlMtfRk)0DrQh0Yx>#O+iS$ zBw6#=P`@>uhCl@%M%-#*%f^dFkdI3-u3$qsnR(>V6g!=0>M5!&a?<_ztHZ4O;VDH8 zq0*cu<2V%7khs(Pf`A9x3Ss7HyVYE%9Wd)cAAz8Xh}Q>L;mX6~V4R?*RWBfUqU(4O zuEfp8iC?AE21E9OL+D$8Bfso7NjIpqcFIXLhc4?~rsL${wK(@X4Y5JBz}t^Q4fVY# z2sYSEk@^+z;OwcT&5Rmkw&txh3sl|)446kYmc~d~5K_9GPv*D=tsXVZZxXk3bZ&xh zPc)F_J3F8ktE9_t6lhAA97%91<;*H-(lvh`VVUQPHnVM4gBflRRit@UJ*$%JZRs@s zInmsvnOET=D=gR1k3`o0O~HY1yB;dT;m$o`6;!ld7#twF-eh?$uG9GHu8tp|M2@+Q z?owlqya@bogd)U&c+-|caKCD%FrAc;@6g#Yxm_d5`Ntq5LmarHqe_09-+??LrLw@z zW{5Do`0*MZkdKdxq$2|t4DRTKQI#?NgviPhB9=Y`DSIuv8F2=2lNQ9!c>@mRwO=Cl zm1V*rm__)uL$p4esLz9aJT?v4=+_j2L{NU(!c8JQIi^P*9h{|v6X5Jxk{^7LD*HTbu6>MbujT8W{F!E-HkQhSUgLX z#XQ2OjQu+s@R$5h*_nV6a+SSxa!@pX{6OKF#J(Syl5C1STF=xp3YY~1Py{LX@cF1~ z0QMqVxg_Ns|DrZJ+(cIOh*)7oVvHRg;@94z{4{crZW6!fMA4-9mWia_(_*0ogl7dw zHn=f>5LlV{SczCcG0?t`B=ghh3?QCoGp0t9p=;^nkNuP0tT`qQeN-YjXkF>gXuNGG z!kYC7eY}WPfAXRg?v1cx70dQ8j?(WxVUoL(eJ0o$NQj!u+l5P&@nfvb-eg3n&x||` zpsLb|v`;gz)0Bk8JyW*jdkmo_JFD0+!F!!r`&=xnpTt; zj_5t=o!7$fq2LRIODtAlW3EgQWX)|V0q$`&&2N(jiNqaDB!B@1xva<68HOB~H;;wU z=r9_?jnwF}#FDk&GZX`H#WT>sOwXN7pu4tr<7UI6mqwXxsi1UMY#V<>x_VbzYWc&t zq1|){ySLNYqlJ9h*f5w{84Qn>ji)xdqufKAcg&|ZC8E-~aAQTL0`Z8rNuf1ib%A(& z`NsJCs#<)E9{c+zvsig2F9H)+Xf=)>`n|{EXvg=753buHZh+JLK*>iDr$#JJ;>02Z zkhV?$>2+9YX>TVO2ZXt^+xMk$Kljo77LM%i3-d@#zXgvt2+GuuwHA>F8_3lV1tZGY z#8U+`xlzjM?|qZRh>#?GD6ASe9e-d4qi?T1F`6IuaZ^m&8^1Z2kWfvjr^7SZy={}E zR7~Uan_$)7jx}d-&*?(6g*5fJ4SI5lolImybPoaLY#h0;Po0tkP{(p{1+PJ$wg@q5 zt&DYBAKx8dOJ`mHlkeYrDJqP~O+r=cpiJt7j_bIN8--Hq7BN@jGuNzf&PzZ(|1>Dn z8XM})9=#D_-O*}?3$;PQ?FG7_dtQU^2JE-}AiIVbeA6ijr@5P~NM#sP*BNHl7_ork z4YEqvSMf@_!J(eE_d>=qY*pPg_rg}Y(*eHJ?^qcaS3K``_Bz|sNqY{8A7!K-Cetus zTRb95K~Y3wShC8wdslIMWe5cx<-=wP9$7k0yN{0g<1VCK3z37$hL@|qG_D>Vr_t5J zi&L*dowup-inmMe{cQ%h;_X*xyHCu9yH9U!%YA;vC$M)K9U7E+Kw~ILnUQgyZJXEm zzIGc%aT_SpGYK15s{yV}nhtLM12hEXzfC3AKLaN!B}q*KnM_%Z9I&Af)ecp{td@h&;x zX!;lwE1|nNq3f<}y~b62W`@&L zy*M#K9}cn)x7}t{tC5W$(iKh;TY>61f;?B1(eIFsy?Ddl69fY{)0Fr-;soy2-D;`p%o(wd1$t!!C|2|-XGBP5gkT&DTX7<(Fyk~cBgrsh zVU3Uey!SCv9^Uc0%Tr>hDS2)SN4;e`BHWZY-u*@+5HZtuXz9D2_MXCE{2)X1^Qym< z8V|IJeg?8MMur!uuo|#PxX;{I32CUJL(=W?(9tfP zBDJX3hdgh9j%?i&QP}Q_W9PEzDZh z2g7D$TrT3Vb%!*W; zA;E*9fkT70Z@r?wz2X&0wcU3BW(wUQ_w8Tac^ELCA6_tesX{ZQGKzYHDfiv>-4r{Y zulFa=E|AT`u3`1pp#z*9O`mhfB~f{i_tYFlj0?t_cxiyXJz=t&3YzCY*O4cOh$^Ya z#GQ^!5m&3gj!A=ox-6rOa8YE!MjQDZnjFSUz2bl{M=hm5TsDMS`8*>`We0V0J-~|U zz!+mjf$cL6gXvzF<*?YzCNc}KZFie8>z3x&j3*i-JJhLJR*oKfgc#1Ec!9Jsi@Cfm zK^!8Ge99@8TV$SOt^+4CLaP=@Aa-1i-CvMEWZMFX2J^@{-N%XG}aF>p?$3 z9toE%#H5T5D4JG!w(7{47jMapx$Gd}=t7%^voRcLQ79^?wmc zpzxV0ZC^~bG4S8LA9Vk@mi`x^^efS-1*C5_M?P`#}ikR68}3TCgRJWot~SL zbd!IP#5|bvPOGbB=RwEHruFQ7Z-6iXz@M*=Z-U*Enc)=5dv$Hi)}-gT{_gnd0>@9N zt2!@822ECWXzqrL6 z2R)^d$%}s=FJ<)<*+A#ZfI>8G{;wDz3Ac3>O`q(j7shAW7X+ea8|<($GDPDYraB`j zBEMbdrW6S-L~}|EbD9jNM;^4ZcX`fpis!q@CM3k=v+U1m6X@6F5g*WD)!*=&cWwzF zx5{gT%SRlKbi$-era>{B8FF?f-eqmGuq8Z5^G68UAsI5*;M~ zIY19D@@dwr3FQI+(hh55MDFrecOsy@|89rYev6ww&VJxYE9o${9IT}>A$GB24 zm2RFXYChQkvoAB~gB+RmP0%e)@x*#M8X*MUd#LKDL9et4F`b0^^G?Lk^bEk|-D-EB zzq>v-cetvv>vJMBe**K@lPFR&SgZN^pSNG%|F^{kKebx$>&Ab7q`$8I#*Eh1Mo`~D z*g@ab*g@IW)YQuOza7Gfm5iMvY>dne^_^@TBy3D<|M8rvRdj5zM38w5Yr9+45=Lw` z+dw7xzKzOscr^tNS)1<-MMq};$Ocvv?F0Ve?Y^e1~6ag4JdCYE;> z+!G_1Sr11dDG?6?^EA2ac0As6oSpi3UioV3a081)65p?guw=+mwbvPbg&=>zk71A= zjSDyY@vLVrG(24guFvSN^+fN#k*30s+6NBVzvHE+A+G>!a8*WL-bQ6tLGmu*DmBw` z$tD$JoEdWE@!fPHQ*?9=D@19Lr+q%Iq*kryr)zarU;8^xiEXFs7Z5#tx@$1@aAB$g zk7|NTs9tyA5;tQ{IbKicvDRWaJu9XuBn8Gp61828x!6G*GXm2WZ7c@^bF%U!skZL-!YQ~nD!iD6=-kP6r$~j z*<{$NevlGFx|>R?S4-vhaO)mYA?yEM?%yj^aqr!e5h6ALIuhG?BFeNz}@&wy(eO`Wc6#H#DYY8$_-M~1X5mB+ul+_1U32>iMii)F=L&V zEY(Wyy8MZ=sO&N2YJMxcMNqv%qU*>l1nWV(GLdPZo0wR?{jM|0cmsh>D)8HP(51>R zzC9b!zPPbCJl_DD#{@a7vF?y3I%gVoZN=5$5keFdmLhpbzB1hVj9LbP_B+VRhZ5g4 zXKp7m-U7XF9{r3ke$Don>Z7RquUZGM=txH8A+u-NMH%MceEWx66k$a3^ zIV{VqA3<(A8LQRWvKBg7Wzru&#;y&Kskw$m<`t2NE6EHbx4_X#09sK~LM2IhVWxQ6 z1c?g@gY=WwFe5@H3()77ykKy{f^lZFA>;Ia&Yv;z9MF7mxn|t-kaD|6D_r*A$Tika=W6 zpo8>xT!rH#)J2gMfE2>?2=(LT$>n~&0&&`=T2yebrzBi z!zCI)P?Q4Tu)(%0&U|jrl&2ZS&e@+C4^An=9&~D|qdM9;X`ftmhaxx>;UF%DCt(eV z$?TTbZ=0N)bIug|A@a1*P>mgn#VYiv(i%6qu5VH zJ+7__KV%6?WuP&P1xgTv(lv}Zc;XxVO=vNAXF8CGNEFnjw_b~xI;nqY72}7>CyvOa z64eU|@~x7-a2Ilt{s;!?(!?>KRvx92Fhgt}B+(<}s9UAm>V$IGN=J!d3}kIi=~oA9 zbAqNFr>ef(`xttRRweu_dx|%qrfy%$4l=p%g1lf*WZ=41`g3vXd{%kYQPs<=!HccC z7`h;lcjmVcT;{@HBdY8Q{6#ziLWxBIu4rN+4IFmR*WVdV3%{L{w@wOFDA4E1Lyc%W z=G8zx3*>ZI#xMFXD$rS1vzVWea%RmqLrrbpkQcJJ51fx`$T-FAPdO@tJxk`S>rF_{ZZAY~ZiC_42=h5&qrp z@NeeUzu@RU?BV}0w~~{zlot7sM?a;cgrwpox)l+Si;DQWcAH}$L75}yfuZ+}vB{d! z8Dukl87Up^Uk^diJ^4k!`F!I`+FxT9C9ej)n951q;_3Zdb9DK$a)rkSv?)vwOgxg% z7GX&dWk?u&mL^RQN&%o4n3PIOp&yKMGg>G0or0f~v1S;GlwH$1(PgkUT&lIgx-99j zo|m4DP+F*_* zelO8kq-m^jG_0PG8U3S+(J~u1E)uqHA6(uFjpOk&Oh4y^CX_nroH{Fpg{E~~u$Exx zICxZnn&x{KQ%d{fvc?EmfC<5*Zh~%sGKSCb5J-Q|nlC>?rl{qz={$HxV?dkDBvvhw zkX>`L#>TCCg}sQbh!t~{5@oD(U-oE(WWsmKq9Y2Kji`*#N>2!AiHb~1v=bBMyOeAr zJNL#I9E$(|4GyJaPQ_U^TwO6l4EP*AR3qXls>orFHBIbmNu6P>uT!e9+!{@{z_gm3 z=9tRI7e^1L;x#SFgsd?g-fz}NXD2AFeaw;+63XU4{4wwcXk01>4kTtjx;(H$G#>?&Vq9IxO#59mE(&X&B`6~qlMPwWgppy?Kf4tek+zMmvQHi8Og zLM4olJzc&=YTVQ`CT_KG@Srg?4il6E;^n}X;6xU`>=#hH9x39KJg6ACrkfzA=tr_2 zo8%Q!8BCP!vBoCl|M%8ky~h8IRR0M~ zmH(O`=sZ&S6eRe0-@ijrT0pIi4O5kgql~WtiJ|9gkxFSuvogpCd?wGZ7w!l0_2C^p zS!+QJGzGla&0PAdY&DMieBL}@`C+V@-|sq*h1iQMs>mQ^)R=eFoQ9M{l~k2T$S9dh z@0S2g_R#<{L63`+8@+`Q#E;uBG#vx0(PvSJlPpvEC!|11 zjyDdeZ^lpASOC;REAw6p;cobxRR56da{b;rrnfE`PJVUcpdmjH`CZKhS$u_3ZGb+^ zz|wYmPu~oOj`=2Z9SRy}IO1L#*b#c9AtxeCpT{u*_n|7-is;x3zggcYroESZB5oU; zGM-4aXxZx8&CDkC${wlvgoz<`gY$ZbI*qO#{Q@p@cfNGND;_6Ge8a?!NXA<3|REi7XAZ(8MelCF+%#B^oB$zFA^K zbw}jE)gL%CeRLb=$*txL%I&23o|^mtf7oXnTj}BnVoyL3l%gT$9QZ*Oq)(-o~s#vjQa3&_ul#PsQ>z%EcL9F?Vmt z5y#f-@$kRZMAzxA%ZRPS@Sgay6o&?JPLryQFpR?N*Gbm$X7rovFQj!jtl^pTH6e2U7t;Fo zn4JIHGVMRd@RtBVgbqqzB3$G=jZGc+ZA4|?KfKclfsLAKL9xaTgF^ej#JXGBxEX9$l0a5 zQT@2eRPgefDyIthBjTTw{ULB3g@xPIFjEHE@W)rv;V#;57%0cn#awVY_eYW*QM16 z!7F8BC_hX&iPmbo1}MstilU0CSK|VO))&S#Yw0REc)Z(|SQdFo#`F({5k6y4kGOni zg=KGNOz_Qa*Gd;#9Qw+{NY+)2bC%TO`0c$I9qth(rpJ=%L>eKp2A1AuKTG#-LLl=N zjhLzCKn1qlTE#KvjGGXq~@lNvWWG`t2Lu>;}NJ0S`StiL>MM72~Fm2BTc1- z8Tbc$ww_nQ>^aQ&FkKehE&ted)>*EV9oHfal_+(p@axYGu~zZNjW(GZpGy*r0dXYT zb>ORr0x*Ns=_M<2H}s4d57v>*7HRa;;{EL*|8Ye5){o{V`(3?7tndILxMk-FVS z36Z+}NAuFMH+QU&x}!%fk-C$6aMBw??d*)6%y~@=9@Ky)#>?}_jqW{EfE$ws2EdKk z1HrB(W!fvHJ!bedWvypVl?-3saV18FqxXmnEcn~PHVpuQsU>3=7kUD$I(GT{H6awPbyvpCM%>a7>o-p3t!)t~K zciou?geTM9vuxxz3U{`!UR;!UHZ}liJo91EMO4Vg3uNkS~3b z%=tAtaR{-9*_5`RcaEmrUUkk#M#@U(_pd`?rNg)AHQ3uqPZ1%P@-2B8lEZg6R55wGR%O~ zoe=!69lTvGHw9#kb7Hh~Qb8@EGO-+L=1s8K%0#W^84{Bg%(_^2#X8?K>hfe}hT6^F z=(-q0uEUdzv<^e1_L*9iR5)TUa>6*#oR=J%@9W+)1bauNLY)d<+dFqsj&X~U&6usO zIFAjX!3=glVn-$b!%(}5lo+xO?yRniY85a2#6T0QDXzCsaTzpioX)9SUR=2|KDPX& zEj{{R>3dF~@X;JwSS4FX^!y1W1LuRoVi%aj)LPkNWu@~wpgExl@PhaAT~l>ecH_^A z@>w?qs&{N7-xA7*R#*Pc=u<>Q)s7X_3`hCSsdQ(6UFj3LsIvF>O@(V69C-(X&Z3>y zr+^6jn?(HW_6Vev@W9?FET&<4g70zG`|5o z<+p_4&E&U?Vg4&Qw9lU82tVc*gpaZvzO^doDJVj5e{=mg3LdH##$rJXU8Mu&HbRKM`Ee338?FdMd)ds5C{=h*ngl3At2i ze$eDIb-HI16Nw*Q;qa*G&lYq|-)WBzttW95k{_ekz&ah%mYTAv8O<+h`yLOHJFk$2 zJl#)cC~#__;g#z4py8%vZ6+o26__2h=FMK0Ck{6+uAkVmXeLF@v|aMu1H~zNbAY-A zTk*cRNYFnZ^@}A0;m11#^r}<^eQFf3o9)ZALU4_w$sjuov3Wl4j~BsGUo5pI?w>|w z`bDRC=}Wm!gufUTOJhN4xnjbJg{~1q$8(hRik(Uo#!V~vKvbT%P4hX~rAHdE@J;;w ziNQRB;(b_^v$tTD;>MF#;8ZE`I#w_84wba1t`oYtpEKsHC)xx>GMt8Pc)yQp^&^k+ zOI#+2zj%YiR+^INnq*eibC0#erexnQYvMIOQY@u!75qcP<;=5vZc(MYHOkhDw3qfZ zV_Q9{u@dk5TzqEEK`lwOjA&t8oj-@yL49YNC1oYOi8qWg3$NOQczd-$>180HLvQ~@ zC*X?kg`Km^;~@W%{&Di6d@jT(VZrQv``KmbK1>(Q_e#ebq0a3cgKgaBma2c5)}f51 zE5g<5ktbMp$`^iuzQJklEIo#^E_DD5!(#r(lp&&nig$4Cw@!WNdHQIZ0tVSK4eMcX0}4wH}R!AG2- zA;hN>xeo7G?$B2=TX|WEKTzO4fPq<9LcPI?K{bySHGh1EI|p-~nv&=OyVFwt@jHa> z@}4}$UAB8x{f|)c^oDY`1_|dmS~{WwI!5(gEpTGUkbh{1_*Jjq1~49;C6zuFEj@iU z_ue4@w>f9$C_+BlKS6-WMdf#-CayKLzDzY|F}M~qv;YTKK3v;%uU{Z4FRF|S#* z>#!%Z&g4;K6_CX<{7kLV%ku68?JH%Q!*NjrRNOj2tUx0h@*`#?tz}E>!I{=0XE}FI z>V)BYD=^(Ijm^@5jwf=!?<8k2DrYxI9gw43M=fcvru1f^8EncDYaw=~d=2q<(yZ?! zOuuR_LP(9)MO!W1YTI$f;wk70T*;n2qF=Til7tHuMS)Rh073 zkeDiFi#j&5^iI_PvSNK8a%+fUOF-Pv0G@q+QdCs@KRyIE4l9SmaDN-h`Xy*>q&dCK#P1mZ4@@h6tlDK%-9C3_31FT5$g1!d_6mFzosnAKffs?SdJ zm*=}{%YM33*%GL6SEsCba<#m`YH;T^KS*nOCBoj;g^T&oMPRK86JJ^wn!zl2NO7X^ z4dW+0v^b_lG_q`Y#BGQ_IElDJZVD&t4{~8wXk(;jx?#^!ceU(=bkSQJCZ=s;R zedGMETvyirTyFiZAtQ-|t+R=(v!cmgvf#hhS{Z5{-l%H0pA*t?88j#aFi@NnH1Q$h z0*O-5$R)$I@iy%KB=Y7J9A~m|Ic?mdXEb8-c$O756=J+OUv3^!D#{eb0lBpI-)uS> zHZ(8Wnp8h;b}z@rWXam$=fW;9Fny}mbp$49&tcz7p7!Z+RJCF1KDh+*oB zdA@Ss=L?WyT7L)Fe|wC0LS5~g43%Rpe@$5uXuR>q&*~<`$Gh7ma z2CAyF21R(bdo|#D^e+=|fUh%dY&p~8n0vQ@gw&XO%Q)sl>ZK=sGY_D1Ca7`D6?&nB zv}&>tgTg$T_Zq1 zd6?T7Ne*8&c|oGhm}g?qqAx-VM4IhWiJj$yhg$%;2}y;1JZWvGuRKUDSOIe3ApY)= zVI9zYhNma6qRMd40da$+B~77NCMJ7-;EV!uv9 zhP|gPDHR!nxVExdXlQ_korxK9I!@R@QhS`@^!6Axf{)@-oRWq~Q&83>)+NDb^;hnh zdr6_#c=3QG{CL8WHKDVSFlo;(U5FYkRVQnwFeA_9vYe8*hz99NeLl@)y?i!VoeNHBS*JFb>#)ti{A;+s@Tuz#ij z+nEUm60cu&3A1J^ATtgz$jIw=qNlr*SKM0!qOBs2Z=fnmEUCP^FulIsmVn=0REI$Z zXBhJBq}rA_y5F`!?u@n*KN1oaL_Z`c@3w?$v)2_wweoo?46@tyG_=$@QI%=7Epu&! z$UR+rx{41fy0&o?H_17FPuu-j6Lno2)Wpz!fUHmos&j!CX-n$4+3m(Tc7v+UzJ$MN zE8&B%nRKOUT{K7U88ENpPCz{imvpxcf$STGFY(0ayVEO2`UcB?ICTQW&CpD_vP!>= z@kE;7CxIr>jC@L>9a@3x8?5(w^&M(*r^$J(hAX^=YV|ie8|;0J@^H(HwWtN_{r-Hs z2O7IZKc+GqX$DMOe5#>^mxp}M<&_r{m22%XesN%+DHeo_E9)LC>9Fxf*r^7^C&~7t z^cDS+l}B>Q6J(lBY`%61!k8qI_DHp2WI9Q=@&S@J zn9sy3s*hfSoKV|{d3{n7s==CU+iJVc7L>(Yk6l{_((>2XI=bf_l=&S8Uakr;v3{}D z-2+{|Z5X}lmwPgOq;r{gj~*t8Ds+>QbVE293f+?;m9zbfiAvr@DGZZi;cJA1+pa%G zmi%TUCZ|m@*_X}vzH7nVc*aCF<_mrM+K)avQF}=!P^3v|P4?S@tsL4p(FJuu4K&UQ zKFZ;E+jPF?n!=*Pq> zvNq)pBi)o%?nNFnO6Q1tqb2HI9;!9AbZII~67Vo|U-sZq$*5-05H#!Pa23gmaJoa~ z%;P2OwIQy;6U(9Z@%epO2l?e5bXuOBN%dwJs&=hQK1q(vW4nb{Cqf6(6v9~67!T@2 zXmB$2GTO$(Yz-79qO6s%++IA_>Z>D6jpaF-4&9L*1igywV~7pC)Vx=Q znICitIwoLk?PXdz7xD<_5sP^5ATpVGes5M&f$WB?J~{$=Jc%>-4bBJYt(;Ezx)V4h z0A{fhBXK^{iK-swxgE>$q6E15T2SC|{}tw~MwfI@zd6)Z^VD3p4}uM8r(xtCvQ^Z3 z0NWqgmmQ0AsS!c3LyA%^E|_9G5gD;V$|q66+8S5X42{-nqfz1o^WWY)~MquZK;BaU$fKStf6Z?q-8B)FBzNy3rSzQdN)#IJlU7LHr1=>d{9hD<%yb}qA+~Mce|m{) zW;+CjBU0#VrjJh$&nf)5`=}(JuEqznP2_H)V(*43Y`Va^6fxwTvZT8AaSxu2lZI?% z{mk;qH2eg{e#UTs`a~9d8$H_5>t^~;0Z9EmW1Xpr#5FBfT`GS&677jrL6$5@lkpt~ zt4|lP8YT?3lw&7nH2%pGK{Y#v7%;{YgXLT=^&9J zVDkVQxH_Rf(FjQX-dykR5#*!+WE1erLSE1aEJ!~65!7po?%hY{KitDo4-J=0&62BS z-eZ`9r3P718HDRNVhGub$(ZruOXc?FwtBzDO!z5bO_9AT?od|OZj7xUQ+|L_hFEh# zpqg=nh~DhIwEJ`gp3kFHQRWX;prC${VtEV=xsC_fkqMas4QYT7RK|hfB7qPsf5E{8_HU}YeFGB1@|5>N_^ z-p{=(3G^%G0U{B6W6A}3v~oK-PL((HSW|bWGdp-yo_a0Xa~r-M(oOO0vWI8ewunLN zm~+S|CIw)_7V62OPydiIXLn~zoLGYdqi$QP;b6e_h@AEsHvZmsKv3i1zl76j&SvLE z*RxvOgOxVn$aWAX|7Qf4j-9f?Q7JWenKV8csbE*w0<}(pnnGR#rU+M30HZ)QRPmQg z_#pRKb|=a^86Nd&8X|cHDP{pvWk1l1Z=vYl@7EI!4`_sc)p|GoQtSQuLixXl`~Tge z@ZZM!35qgut3MEZg!s~fKzq~(0|*?56;ztSv=9})mssW(g9S9(uPm)PcbEU{h~Coc zhU&}V&*q0_v?3-ccKj2XlEHqvamM$&x!bGvO|M!*0Iv+KJZC%mSU*F4O-VDwN6@y- zM{wv-P!IV4LUJ@~xL;m$&=8ZMmIIO(DLqVl`2}k%jh~9_3^wQ?PyX39J#x^%cx||n zdcf#Wz3)&=)ctT18SRPb1jflq{OE{%*Q65EvWY#LxNtK zvB~T<;rK!B)5@gWw(EVSW>in&MsRQx6*8)1Cumt*myC%m1!2xCQ_}1yBdVkfDtI#h z^ICeJLYhdmFEyR+Rw&mYAd zH#k~D*Pr@bSid`9#6qc)m>uYxFMc#xwDr{_2g<~As@4H1GmN&3xtynX|A|wrpVRnU zY8@OK|L#k@?^cU7X293+1ImRa|BJO!(+BINX-YGABw2dB4fR)TA1CoL6!|qu9r~A1 z>c1~J{|gW6UkrZ!+UNYesBh4Oa>tpE{W!gkEM&EXva;5QvsvEN!jnh@`d&?wwuIgY z)_G-v61^a;h0PP1+#4sZPJq+miXshP&52A9ZXg61N}J}+IYvfiFbuV941g087xc&Z zE-pBPTz{|oco!*3O#D{!!T0F(uG>-iQg))E67xRCz3GnnrzHNWw+F!Iy^0V(K8n=s zwzo_9{DkoAuF2PV+WYuMG59#R<@uJKZpI%!%71gai}mcTTKTSi^CTznh=T81y4&@J z8Ty5sEUA;vg=-l6%-cM8xf6HYX!@bSUtGSFgGp~sXuh;9@1ldFT)xyEokaLmBZF3P z*O$(3x`X(8ulW0~pHJ81?R0uwWxH^k9~y&t&TlG%XLO@IdVa9NYHhGtZCH0`_m_?{4#WB5L);i;0NC@u6 zr&5+M{DO42MxlrdpY_!oudI#CLbP02%up>(-q^@JOyPfr!=1Q`4Gt zAr-3b7t(;2A@i+12E9pu(Jn3&b9(qijdm38wavP9_{|ej3*Pu0%0YCWpUKEsgjTq8 zv~x{gC#6v#lWGv{_f2z?G4nt;(c+P=X3(NOwR{@pUa3ZBL5=T9#)-%iwwShe3RX2v z7pem_L|6vQnYCo8)e9!O8LF0b%UE^!+yDdS#(8Ox{kFQJVP`QcZ}YiC<6_M!mU!D% z*P8;TA*woFBxa+1nWZ@f%kzR8QFZJAhlm(W5_ncUg8{<~Q+M`LPZy!kQRWm|jZ7I~ z!-X(WY+!v;q`H1$&!-?HVMGORDO_uQ=J|fEDC!)fG>S7wqI3txmm2@#)@&F##p&8) z6a!{SMo4lLEZ2bEpkZ>@sMwE8?eugn#g`^D(A$>@sS111^{;!~I!Q>fz8CMeJ`zym z-w{yGnspMxoQKXZf9=z`iZ~y=Y7lRPqDcOB>!nu`j+VRmd_{(Zi2~H$9JuZ`%QZDL zB{Dp{9?6oLqslvCtK`!pG&-Ws=gEp}RY2Mm#J#uB$_a%!`=dwQIRqTlt})kn7%30j z4njwq*T!033it>?B zai_ykTB*fns4whF_tDAjH4sY}^yv1d%Ihc+nSCG&E{Cm~rt18*m-5!+jPS~r`wx+U{Fi~EngM9T+Ob+l}8$TZ|{!R+wKmw~xhEFLBm)~ur z(Fa+SCCp{`%(9uSbjkIE0SWy&# zpXf?y-Zb0PbJ+3yUf}@{*S}*Dv7Om`{``@7!t~Q*F|b^&#Fnt5{TqNO12OBJ=2bqlqd#&Io?>udKIPHeJv|pYZA41sA);ji zHzA>&*ibt%W&!3%f!0Qgscm)P>M}O$tel`-8nP$xJ&inhtzfKuAiJS{BK!V~b;X|> zmM7YXk83kKs(x534Q_=<0gI|Yobu$UFIEZj_M%ZSQ9#S$yFnrflPuoeR1LBK^MLHH zJBSQlFs3%NigcQk99uwbzU>Oc&>2X883{H zT@=;Qvk{1pD@J?#3$`O73AdX3GFRl%H9b>^pU7%T)tRrRHN?-zrhme>;Nfow7q^A@ znBY$Gt7C}37lUex7vL&4?AkOigW5t7nyr0Dujalf!xUB51gJJgg&lc}P5_adSv zoH>XtvOVo^(rLE;gh^Nc>`O8RaKc;R=UdyY&`r*hLYG+TH@n2P;W~w89V!lf;{-!Y zmBQs0c*YaVQaS{^Gjf_zsnG=N5s7<2I*HPJ3ZWkV#$N)fq>HIydsII+9WVyzJ7<)K z*8AZbRUs$->)>Kf{M|j4SW>HvX~VXk<3mZcFY)Bpo@cJb22B7xUgr8&()>{dG7MhB-!NDELY){Khng)FJpK6}ZTxfhg8 zUPNjfZ2mgW@zH+b$@tu_lc-TeS!y0OzH$^i0M*&gj_qWV+THfV5 zwiRi&RsLb+q*ij8#?oy59ZUreJ880(m6K7{h4}*DKsW}UeE911lQCDDZLBnwDN159 zCHBiQ{3o`wF$Y~J9Z^_Ltn*#T`YvmKyyt=Kq5;g+v9{F{y+i>-B=v7^#Ukvv1ll8Z zft$|DJ=fmlXA&N~B@13p@3pyZ7s`a6_I0HLJ*i?V1C-^?4MVNU3vk-k2Y%a<}<~p^TzJWla-G zhrFP96Hfdn7Lw9GN@c3D19e5n2;c2cmk1gvNW%RMK7nhywvg1A?ukSGCX40S+fj7#G z=NdbOa1(_v9g#wCf{>%O&z8*{F$wtXanx)NT?&+r2za6(7#khFsqid5b`Q?}*l1~- z-wYA>{KL_WC1VaITj}Cbs^aOW+v~e#s1-4BSQm*fnC#Tgr;O9zj2mzrs_>qS%5Cut z1y9VQ>`-9tthfBfxx$=-yBzG*z~0oi6A&f$nLYrJG;iQmBiAIryyl#DoU?(+&yov8 z3S+MrLBEoyWD+n&K~!?fg5NX7H7PK*63X@6*Pl2B1NJ$Y*Pru*6hEk_#(}V~hdi(t znVCUktVfa&;xN2riAL}U?du!_%Pt!u{$s?fy)un+#&C%JxXYN!HsfOOAP$CXw@&oz z?L@p+Q|m-~)S~TViblENhBp|+%f{FmLvBiplE0j%6M2Wr#_m(5Q6XBtXoi-xGChP( z@dUTOs7V_T3#DmX;mNn?q5gyS>7)gJXM_SwS6V0KdOxNGKLm5cAn#CB&7 z#i`xRa7>FS_3zISROZg_SgsK833B(}qoU)x+-|rcKLLkEj1f(1+h31C(PeUW_cN0> zKcTcyG|z2JZM_g(R5ODGryDw-R&P;77tK0d*ZY&>aKqqQaS6B�@v;$9bpl_%m}> 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