master bafeabc7d1fe cached
151 files
470.5 KB
118.1k tokens
798 symbols
1 requests
Download .txt
Showing preview only (518K chars total). Download the full file or copy to clipboard to get everything.
Repository: naver/android-pull-to-refresh
Branch: master
Commit: bafeabc7d1fe
Files: 151
Total size: 470.5 KB

Directory structure:
gitextract_lf3pz0t7/

├── .gitignore
├── LICENSE
├── README.md
├── build.gradle
├── downloads/
│   └── sample-3.0.0.apk
├── extras/
│   ├── PullToRefreshListFragment/
│   │   ├── AndroidManifest.xml
│   │   ├── LICENSE
│   │   ├── build.gradle
│   │   ├── libs/
│   │   │   └── android-support-v4.jar
│   │   ├── pom.xml
│   │   ├── project.properties
│   │   ├── res/
│   │   │   └── layout/
│   │   │       └── need_this_for_maven.xml
│   │   └── src/
│   │       └── com/
│   │           └── handmark/
│   │               └── pulltorefresh/
│   │                   └── extras/
│   │                       └── listfragment/
│   │                           ├── PullToRefreshBaseListFragment.java
│   │                           ├── PullToRefreshExpandableListFragment.java
│   │                           └── PullToRefreshListFragment.java
│   ├── PullToRefreshViewPager/
│   │   ├── AndroidManifest.xml
│   │   ├── ant.properties
│   │   ├── build.gradle
│   │   ├── libs/
│   │   │   └── android-support-v4.jar
│   │   ├── pom.xml
│   │   ├── proguard-project.txt
│   │   ├── project.properties
│   │   ├── res/
│   │   │   ├── layout/
│   │   │   │   └── need_this_for_maven.xml
│   │   │   └── values/
│   │   │       └── ids.xml
│   │   └── src/
│   │       └── com/
│   │           └── handmark/
│   │               └── pulltorefresh/
│   │                   └── extras/
│   │                       └── viewpager/
│   │                           └── PullToRefreshViewPager.java
│   └── pom.xml
├── gradle.properties
├── library/
│   ├── AndroidManifest.xml
│   ├── LICENSE
│   ├── build.gradle
│   ├── pom.xml
│   ├── project.properties
│   ├── res/
│   │   ├── anim/
│   │   │   ├── slide_in_from_bottom.xml
│   │   │   ├── slide_in_from_top.xml
│   │   │   ├── slide_out_to_bottom.xml
│   │   │   └── slide_out_to_top.xml
│   │   ├── drawable/
│   │   │   ├── indicator_bg_bottom.xml
│   │   │   ├── indicator_bg_top.xml
│   │   │   ├── progress_horizontal_holo_light.xml
│   │   │   ├── progress_horizontal_holo_light_right.xml
│   │   │   └── progress_indeterminate_horizontal_holo.xml
│   │   ├── layout/
│   │   │   ├── pull_to_refresh_header_google_style.xml
│   │   │   ├── pull_to_refresh_header_horizontal.xml
│   │   │   ├── pull_to_refresh_header_vertical.xml
│   │   │   ├── pull_to_refresh_progress_google_style.xml
│   │   │   └── pulling_progress_layout.xml
│   │   ├── values/
│   │   │   ├── attrs.xml
│   │   │   ├── dimens.xml
│   │   │   ├── ids.xml
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-ar/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-cs/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-de/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-es/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-fi/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-fr/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-he/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-it/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-iw/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-ja/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-ko/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-nl/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-pl/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-pt/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-pt-rBR/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-ro/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-ru/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-zh/
│   │   │   └── pull_refresh_strings.xml
│   │   └── xml/
│   │       └── pulltorefresh.xml
│   └── src/
│       └── main/
│           └── java/
│               └── com/
│                   └── handmark/
│                       └── pulltorefresh/
│                           ├── configuration/
│                           │   └── xml/
│                           │       ├── ExtendedXmlConfigParserFactory.java
│                           │       ├── PullToRefreshConfigXmlParser.java
│                           │       ├── PullToRefreshNode.java
│                           │       ├── PullToRefreshXmlConfiguration.java
│                           │       ├── XmlPullNode.java
│                           │       ├── XmlPullNodeParser.java
│                           │       └── XmlPullParserWrapper.java
│                           └── library/
│                               ├── AlphaAnimator.java
│                               ├── GoogleStyleProgressLayout.java
│                               ├── GoogleStyleProgressLayoutFactory.java
│                               ├── GoogleStyleViewLayout.java
│                               ├── GoogleStyleViewLayoutFactory.java
│                               ├── IGoogleStyleProgressLayout.java
│                               ├── IGoogleStyleViewLayout.java
│                               ├── IIndicatorLayout.java
│                               ├── ILoadingLayout.java
│                               ├── IPullToRefresh.java
│                               ├── IPullToRefreshConsumer.java
│                               ├── IndicatorLayoutFactory.java
│                               ├── LoadingLayoutFactory.java
│                               ├── LoadingLayoutProxy.java
│                               ├── OverscrollHelper.java
│                               ├── PullToRefreshAdapterViewBase.java
│                               ├── PullToRefreshBase.java
│                               ├── PullToRefreshExpandableListView.java
│                               ├── PullToRefreshGridView.java
│                               ├── PullToRefreshHorizontalScrollView.java
│                               ├── PullToRefreshListView.java
│                               ├── PullToRefreshScrollView.java
│                               ├── PullToRefreshWebView.java
│                               ├── extras/
│                               │   ├── PullToRefreshWebView2.java
│                               │   └── SoundPullEventListener.java
│                               └── internal/
│                                   ├── AbstractDefaultGoogleStyleViewLayout.java
│                                   ├── Assert.java
│                                   ├── DefaultGoogleStyleProgressLayout.java
│                                   ├── DefaultGoogleStyleViewLayout.java
│                                   ├── DefaultIndicatorLayout.java
│                                   ├── EmptyViewMethodAccessor.java
│                                   ├── FlipLoadingLayout.java
│                                   ├── FlippedProgressBar.java
│                                   ├── IndicatorLayout.java
│                                   ├── LoadingLayout.java
│                                   ├── PullingProgressLayout.java
│                                   ├── RotateLoadingLayout.java
│                                   ├── Utils.java
│                                   └── ViewCompat.java
├── pom.xml
├── sample/
│   ├── AndroidManifest.xml
│   ├── LICENSE
│   ├── assets/
│   │   ├── ptr_webview2_sample.html
│   │   └── pulltorefresh.xml
│   ├── libs/
│   │   └── android-support-v4.jar
│   ├── pom.xml
│   ├── project.properties
│   ├── res/
│   │   ├── layout/
│   │   │   ├── activity_ptr_custom_loadinglayout.xml
│   │   │   ├── activity_ptr_expandable_list.xml
│   │   │   ├── activity_ptr_grid.xml
│   │   │   ├── activity_ptr_horizontalscrollview.xml
│   │   │   ├── activity_ptr_list.xml
│   │   │   ├── activity_ptr_list_fragment.xml
│   │   │   ├── activity_ptr_list_in_vp.xml
│   │   │   ├── activity_ptr_scrollview.xml
│   │   │   ├── activity_ptr_viewpager.xml
│   │   │   ├── activity_ptr_webview.xml
│   │   │   ├── activity_ptr_webview2.xml
│   │   │   └── layout_listview_in_viewpager.xml
│   │   └── values/
│   │       ├── strings.xml
│   │       └── styles.xml
│   └── src/
│       └── com/
│           └── handmark/
│               └── pulltorefresh/
│                   └── samples/
│                       ├── LauncherActivity.java
│                       ├── PullToRefreshCustomLoadingLayoutActivity.java
│                       ├── PullToRefreshExpandableListActivity.java
│                       ├── PullToRefreshGridActivity.java
│                       ├── PullToRefreshHorizontalScrollViewActivity.java
│                       ├── PullToRefreshListActivity.java
│                       ├── PullToRefreshListFragmentActivity.java
│                       ├── PullToRefreshListInViewPagerActivity.java
│                       ├── PullToRefreshScrollViewActivity.java
│                       ├── PullToRefreshViewPagerActivity.java
│                       ├── PullToRefreshWebView2Activity.java
│                       ├── PullToRefreshWebViewActivity.java
│                       └── loadinglayout/
│                           └── CustomLoadingLayout.java
└── settings.gradle

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
#Android generated
bin
gen
library/build/

#Eclipse
.project
.classpath
.settings

#IntelliJ IDEA
.idea
*.iml
*.ipr
*.iws
out

#Maven
target
release.properties
pom.xml.*

#Ant
build.xml
local.properties
proguard.cfg

#OSX
.DS_Store


================================================
FILE: LICENSE
================================================

                                 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.


================================================
FILE: README.md
================================================
# Pull To Refresh Views for Android `Renewal`! v3.2
### This project is a fork of Chris Banes' Android-PullToRefresh project. The project provides flexibility in customization in addition to adding brand new features listed below.
- __New!__ AAR package support
- Google-like pull to refresh animation support (in Android 3.x or 4.x)

  *__NOTE__: This style is now supported in [Android Support Library](http://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html).
  I recommend you to use the support library instead of this library, unless you are already using and want to change the style from old style to it.*

- Easy layout customization - no need to include the library's source code directly into your project. 
- Easily Customizable loading layouts, labels, and icons. 
- Ability to customize and add multiple indicator layouts. 
- Configurable friction and smooth scroll duration. 
- This fork project is __not__ being deprecated. Please send issues or pull requests to me, and I will provide you with feedbacks.

- __Are you are using Pull To Refresh v2.1.x? You'd better [MIGRATE](https://github.com/nhnopensource/android-pull-to-refresh/wiki/Migration-from-v2.1.x-to-v3.0.0) to v3.2 now!__

### Introduction
* * *

![Screenshot](https://github.com/nhnopensource/android-pull-to-refresh/raw/master/header_graphic.png)

This project aims to provide a reusable Pull to Refresh widget for Android. It was originally based on Johan Nilsson's [library](https://github.com/johannilsson/android-pulltorefresh) (mainly for graphics, strings and animations), but these have been replaced since.

## Included Features

 * Supports both Pulling Down from the top, and Pulling Up from the bottom (or even both).
 * Animated Scrolling for all devices.
 * Over Scroll supports for devices on Android v2.3+.
 * Currently works with:
    * **ListView**
    * **ExpandableListView**
    * **GridView**
    * **WebView**
    * **ScrollView**
    * **HorizontalScrollView**
    * **ViewPager**
 * Integrated End of List Listener for use of detecting when the user has scrolled to the bottom.
 * Maven Central Support.
 * Indicators to show the user when a Pull-to-Refresh is available.
 * Support for **ListFragment**!
 * Lots of [Customization](https://github.com/nhnopensource/android-pull-to-refresh/wiki/Customization) options!

Repository at <https://github.com/nhnopensource/android-pull-to-refresh>.

## Sample Application
Sample application is being provided as APK file (the source is in the repository):

[Download Here!](http://search.maven.org/remotecontent?filepath=com/navercorp/pulltorefresh/sample/3.2.2/sample-3.2.2.apk)

## Usage
To begin using the library, please see the [Quick Start Guide](https://github.com/nhnopensource/android-pull-to-refresh/wiki/Quick-Start-Guide).

### Customization
Our [Customization](https://github.com/nhnopensource/android-pull-to-refresh/wiki/Customization) page contains detailed information on how to change the behaviour and look of the View.

### Pull Up to Refresh
By default this library is set to Pull Down to Refresh, but if you want to allow Pull Up to Refresh then you can do so. You can even set the View to enable both Pull Up and Pull Down using the 'both' setting. See the [Customization](https://github.com/nhnopensource/android-pull-to-refresh/wiki/Customization) page for more information on how to set this.

## Apps
Want to see which Apps are already using Android-PullToRefresh? Have a look [here](https://github.com/nhnopensource/android-pull-to-refresh/wiki/Apps). 

## Changelog
Please see the new [Changelog](https://github.com/nhnopensource/android-pull-to-refresh/wiki/Changelog) page to see what's recently changed.

## Pull Requests

I will gladly accept pull requests for fixes and feature enhancements but please do them in the dev branch. The master branch is for the latest stable code,  dev is where I try things out before releasing them as stable. Any pull requests that are against master from now on will be closed asking for you to do another pull against dev.

## Acknowledgments

* [Stefano Dacchille](https://github.com/stefanodacchille)
* [Steve Lhomme](https://github.com/robUx4)
* [Maxim Galkin](https://github.com/mgalkin)
* [Scorcher](https://github.com/Scorcher)

## License

    Copyright 2011, 2012 Chris Banes
    Copyright 2013 Naver Business Platform Corp.

    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.


================================================
FILE: build.gradle
================================================
buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.11.+'
    }
}

allprojects {
	version = PULLTOREFRESH_RELEASE_VERSION
	group = PULLTOREFRESH_RELEASE_GROUP

    repositories {
        mavenCentral()
    }
}


================================================
FILE: extras/PullToRefreshListFragment/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.handmark.pulltorefresh.extras.listfragment"
    android:versionCode="2110"
    android:versionName="2.1.1" >

    <uses-sdk android:minSdkVersion="4" />
    <application />

</manifest>


================================================
FILE: extras/PullToRefreshListFragment/LICENSE
================================================

                                 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.


================================================
FILE: extras/PullToRefreshListFragment/build.gradle
================================================
apply plugin: 'android-library'

dependencies {
	compile project(':library')
	compile 'com.android.support:support-v4:18.0.+'
}

archivesBaseName = 'extra-listfragment'

android {
    compileSdkVersion Integer.parseInt(ANDROID_COMPILE_SDK_VERSION)
    buildToolsVersion ANDROID_BUILD_TOOLS_VERSION
    
    sourceSets {
    	main {
    		manifest.srcFile 'AndroidManifest.xml'
    		java.srcDirs=['src']
    		res.srcDirs=['res']
    	}
    }
}



================================================
FILE: extras/PullToRefreshListFragment/pom.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	
	<groupId>com.navercorp.pulltorefresh</groupId>
	<artifactId>extra-listfragment</artifactId>
	<packaging>apklib</packaging>
	<name>Android-PullToRefresh Extras: ListFragment</name>
	
	<parent>
		<groupId>com.navercorp.pulltorefresh</groupId>
		<artifactId>extras</artifactId>
		<version>3.3.0-SNAPSHOT</version>
	</parent>
	
	<dependencies>
		<dependency>
			<groupId>com.google.android</groupId>
			<artifactId>android</artifactId>
		</dependency>
		<dependency>
			<groupId>com.google.android</groupId>
			<artifactId>support-v4</artifactId>
			<version>r7</version>
		</dependency>
		<dependency>
			<groupId>${project.groupId}</groupId>
			<artifactId>library</artifactId>
			<type>apklib</type>
			<version>${project.version}</version>
		</dependency>
	</dependencies>
	
	<build>
		<plugins>
			<plugin>
				<groupId>com.jayway.maven.plugins.android.generation2</groupId>
				<artifactId>android-maven-plugin</artifactId>
				<version>3.7.0</version>
			</plugin>
			<!-- extracted from actionbarsherlock's pom -->
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>build-helper-maven-plugin</artifactId>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>attach-artifact</goal>
						</goals>
						<configuration>
							<artifacts>
								<artifact>
									<type>aar</type>
									<file>${project.basedir}/build/libs/${project.artifactId}-${parent.version}.aar</file>
								</artifact>
							</artifacts>
						</configuration>
					</execution>
				</executions>
			</plugin>			
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-eclipse-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>


================================================
FILE: extras/PullToRefreshListFragment/project.properties
================================================
# 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

android.library=true
# Project target.
target=android-16
android.library.reference.1=../../library


================================================
FILE: extras/PullToRefreshListFragment/res/layout/need_this_for_maven.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <!-- Need this for Maven, otherwise it doesn't build. I hate Maven. -->

</LinearLayout>

================================================
FILE: extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshBaseListFragment.java
================================================
/*******************************************************************************
 * Copyright 2011, 2012 Chris Banes.
 *
 * 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.handmark.pulltorefresh.extras.listfragment;

import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ListView;

import com.handmark.pulltorefresh.library.PullToRefreshBase;

abstract class PullToRefreshBaseListFragment<T extends PullToRefreshBase<? extends AbsListView>> extends ListFragment {

	private T mPullToRefreshListView;

	@Override
	public final View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		View layout = super.onCreateView(inflater, container, savedInstanceState);

		ListView lv = (ListView) layout.findViewById(android.R.id.list);
		ViewGroup parent = (ViewGroup) lv.getParent();

		// Remove ListView and add PullToRefreshListView in its place
		int lvIndex = parent.indexOfChild(lv);
		parent.removeViewAt(lvIndex);
		mPullToRefreshListView = onCreatePullToRefreshListView(inflater, savedInstanceState);
		parent.addView(mPullToRefreshListView, lvIndex, lv.getLayoutParams());

		return layout;
	}

	/**
	 * @return The {@link PullToRefreshBase} attached to this ListFragment.
	 */
	public final T getPullToRefreshListView() {
		return mPullToRefreshListView;
	}

	/**
	 * Returns the {@link PullToRefreshBase} which will replace the ListView
	 * created from ListFragment. You should override this method if you wish to
	 * customise the {@link PullToRefreshBase} from the default.
	 * 
	 * @param inflater - LayoutInflater which can be used to inflate from XML.
	 * @param savedInstanceState - Bundle passed through from
	 *            {@link ListFragment#onCreateView(LayoutInflater, ViewGroup, Bundle)
	 *            onCreateView(...)}
	 * @return The {@link PullToRefreshBase} which will replace the ListView.
	 */
	protected abstract T onCreatePullToRefreshListView(LayoutInflater inflater, Bundle savedInstanceState);

}

================================================
FILE: extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshExpandableListFragment.java
================================================
/*******************************************************************************
 * Copyright 2011, 2012 Chris Banes.
 *
 * 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.handmark.pulltorefresh.extras.listfragment;

import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;

import com.handmark.pulltorefresh.library.PullToRefreshExpandableListView;

/**
 * A sample implementation of how to use {@link PullToRefreshExpandableListView}
 * with {@link ListFragment}. This implementation simply replaces the ListView
 * that {@code ListFragment} creates with a new
 * {@code PullToRefreshExpandableListView}. This means that ListFragment still
 * works 100% (e.g. <code>setListShown(...)</code> ).
 * <p/>
 * The new PullToRefreshListView is created in the method
 * {@link #onCreatePullToRefreshListView(LayoutInflater, Bundle)}. If you wish
 * to customise the {@code PullToRefreshExpandableListView} then override this
 * method and return your customised instance.
 * 
 * @author Chris Banes
 * 
 */
public class PullToRefreshExpandableListFragment extends PullToRefreshBaseListFragment<PullToRefreshExpandableListView> {

	protected PullToRefreshExpandableListView onCreatePullToRefreshListView(LayoutInflater inflater,
			Bundle savedInstanceState) {
		return new PullToRefreshExpandableListView(getActivity());
	}

}

================================================
FILE: extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshListFragment.java
================================================
/*******************************************************************************
 * Copyright 2011, 2012 Chris Banes.
 *
 * 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.handmark.pulltorefresh.extras.listfragment;

import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;

import com.handmark.pulltorefresh.library.PullToRefreshListView;

/**
 * A sample implementation of how to use {@link PullToRefreshListView} with
 * {@link ListFragment}. This implementation simply replaces the ListView that
 * {@code ListFragment} creates with a new PullToRefreshListView. This means
 * that ListFragment still works 100% (e.g. <code>setListShown(...)</code> ).
 * <p/>
 * The new PullToRefreshListView is created in the method
 * {@link #onCreatePullToRefreshListView(LayoutInflater, Bundle)}. If you wish
 * to customise the {@code PullToRefreshListView} then override this method and
 * return your customised instance.
 * 
 * @author Chris Banes
 * 
 */
public class PullToRefreshListFragment extends PullToRefreshBaseListFragment<PullToRefreshListView> {

	protected PullToRefreshListView onCreatePullToRefreshListView(LayoutInflater inflater, Bundle savedInstanceState) {
		return new PullToRefreshListView(getActivity());
	}

}

================================================
FILE: extras/PullToRefreshViewPager/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.handmark.pulltorefresh.extras.viewpager"
   android:versionCode="2110"
    android:versionName="2.1.1" >

    <uses-sdk android:minSdkVersion="4" />

    <application />

</manifest>

================================================
FILE: extras/PullToRefreshViewPager/ant.properties
================================================
# This file is used to override default values used by the Ant build system.
#
# This file must be checked into Version Control Systems, as it is
# integral to the build system of your project.

# This file is only used by the Ant script.

# You can use this to override default values such as
#  'source.dir' for the location of your java source folder and
#  'out.dir' for the location of your output folder.

# You can also use it define how the release builds are signed by declaring
# the following properties:
#  'key.store' for the location of your keystore and
#  'key.alias' for the name of the key to use.
# The password will be asked during the build when you use the 'release' target.



================================================
FILE: extras/PullToRefreshViewPager/build.gradle
================================================
apply plugin: 'android-library'

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.6.+'
    }
}

archivesBaseName = 'extra-viewpager'

dependencies {
	compile project(':library')
	compile 'com.android.support:support-v4:18.0.+'
}

android {
    compileSdkVersion Integer.parseInt(ANDROID_COMPILE_SDK_VERSION)
    buildToolsVersion ANDROID_BUILD_TOOLS_VERSION

    sourceSets {
    	main {
    		manifest.srcFile 'AndroidManifest.xml'
    		java.srcDirs=['src']
    		res.srcDirs=['res']
    	}
    }
}


================================================
FILE: extras/PullToRefreshViewPager/pom.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	
	<groupId>com.navercorp.pulltorefresh</groupId>
	<artifactId>extra-viewpager</artifactId>
	<packaging>apklib</packaging>
	<name>Android-PullToRefresh Extras: ViewPager</name>
	
	<parent>
		<groupId>com.navercorp.pulltorefresh</groupId>
		<artifactId>extras</artifactId>
		<version>3.3.0-SNAPSHOT</version>
	</parent>
	
	<dependencies>
		<dependency>
			<groupId>com.google.android</groupId>
			<artifactId>android</artifactId>
		</dependency>
		<dependency>
			<groupId>com.google.android</groupId>
			<artifactId>support-v4</artifactId>
			<version>r7</version>
		</dependency>
		<dependency>
			<groupId>${project.groupId}</groupId>
			<artifactId>library</artifactId>
			<type>apklib</type>
			<version>${project.version}</version>
		</dependency>
	</dependencies>
	
	<build>
		<plugins>
			<plugin>
				<groupId>com.jayway.maven.plugins.android.generation2</groupId>
				<artifactId>android-maven-plugin</artifactId>
				<version>3.7.0</version>
			</plugin>
			<!-- extracted from actionbarsherlock's pom -->
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>build-helper-maven-plugin</artifactId>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>attach-artifact</goal>
						</goals>
						<configuration>
							<artifacts>
								<artifact>
									<type>aar</type>
									<file>${project.basedir}/build/libs/${project.artifactId}-${parent.version}.aar</file>
								</artifact>
							</artifacts>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-eclipse-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
</project>


================================================
FILE: extras/PullToRefreshViewPager/proguard-project.txt
================================================
# 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 *;
#}


================================================
FILE: extras/PullToRefreshViewPager/project.properties
================================================
# 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

android.library=true
# Project target.
target=android-16
android.library.reference.1=../../library


================================================
FILE: extras/PullToRefreshViewPager/res/layout/need_this_for_maven.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <!-- Need this for Maven, otherwise it doesn't build. I hate Maven. -->

</LinearLayout>

================================================
FILE: extras/PullToRefreshViewPager/res/values/ids.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <item type="id" name="viewpager" />

</resources>

================================================
FILE: extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/extras/viewpager/PullToRefreshViewPager.java
================================================
/*******************************************************************************
 * Copyright 2011, 2012 Chris Banes.
 *
 * 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.handmark.pulltorefresh.extras.viewpager;

import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;

import com.handmark.pulltorefresh.library.PullToRefreshBase;

public class PullToRefreshViewPager extends PullToRefreshBase<ViewPager> {

	public PullToRefreshViewPager(Context context) {
		super(context);
	}

	public PullToRefreshViewPager(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	@Override
	public final Orientation getPullToRefreshScrollDirection() {
		return Orientation.HORIZONTAL;
	}

	@Override
	protected ViewPager createRefreshableView(Context context, AttributeSet attrs) {
		ViewPager viewPager = new ViewPager(context, attrs);
		viewPager.setId(R.id.viewpager);
		return viewPager;
	}

	@Override
	protected boolean isReadyForPullStart() {
		ViewPager refreshableView = getRefreshableView();

		PagerAdapter adapter = refreshableView.getAdapter();
		if (null != adapter) {
			return refreshableView.getCurrentItem() == 0;
		}

		return false;
	}

	@Override
	protected boolean isReadyForPullEnd() {
		ViewPager refreshableView = getRefreshableView();

		PagerAdapter adapter = refreshableView.getAdapter();
		if (null != adapter) {
			return refreshableView.getCurrentItem() == adapter.getCount() - 1;
		}

		return false;
	}
}


================================================
FILE: extras/pom.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	
	<groupId>com.navercorp.pulltorefresh</groupId>
	<artifactId>extras</artifactId>
	<packaging>pom</packaging>
	<name>Android-PullToRefresh Extras</name>
	
	<parent>
		<groupId>com.navercorp.pulltorefresh</groupId>
		<artifactId>parent</artifactId>
		<version>3.3.0-SNAPSHOT</version>
	</parent>
	
	<modules>
		<module>PullToRefreshListFragment</module>
		<module>PullToRefreshViewPager</module>
	</modules>
</project>


================================================
FILE: gradle.properties
================================================
PULLTOREFRESH_RELEASE_VERSION=3.2.3
PULLTOREFRESH_RELEASE_GROUP=com.navercorp.pulltorefresh

ANDROID_COMPILE_SDK_VERSION=19
ANDROID_BUILD_TOOLS_VERSION=19.1.0


================================================
FILE: library/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.handmark.pulltorefresh.library"
    android:versionCode="2110"
    android:versionName="2.1.1" >

    <uses-sdk android:minSdkVersion="4" />

    <application />

</manifest>

================================================
FILE: library/LICENSE
================================================

                                 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.


================================================
FILE: library/build.gradle
================================================
apply plugin: 'android-library'

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.11.+'
    }
}

apply plugin: 'maven'
apply plugin: 'signing'

android {
    compileSdkVersion Integer.parseInt(ANDROID_COMPILE_SDK_VERSION)
    buildToolsVersion ANDROID_BUILD_TOOLS_VERSION

    sourceSets {
    	main {
    		manifest.srcFile 'AndroidManifest.xml'
    		java.srcDirs=['src/main/java']
    		res.srcDirs=['res']
    	}
    }
}


================================================
FILE: library/pom.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<artifactId>library</artifactId>
	<packaging>apklib</packaging>
	<name>Android-PullToRefresh Library</name>
	<parent>
		<groupId>com.navercorp.pulltorefresh</groupId>
		<artifactId>parent</artifactId>
		<version>3.3.0-SNAPSHOT</version>
	</parent>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<android.version>4.1.1.4</android.version>
		<android.platform>16</android.platform>
		<android-support.version>r7</android-support.version>
		<java.version>1.6</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>com.google.android</groupId>
			<artifactId>android</artifactId>
			<version>${android.version}</version>
		</dependency>
	</dependencies>
	<build>
		<sourceDirectory>src/main/java</sourceDirectory>
		<testSourceDirectory>src/test/java</testSourceDirectory>
		<testOutputDirectory>target/test-classes</testOutputDirectory>
		<testResources>
			<testResource>
				<directory>src/test/resources</directory>
			</testResource>
		</testResources>
		<plugins>
			<plugin>
				<groupId>com.jayway.maven.plugins.android.generation2</groupId>
				<artifactId>android-maven-plugin</artifactId>
				<version>3.7.0</version>
			</plugin>
			<!-- extracted from actionbarsherlock's pom -->
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>build-helper-maven-plugin</artifactId>
				<executions>
					<execution>
						<phase>package</phase>
						<goals>
							<goal>attach-artifact</goal>
						</goals>
						<configuration>
							<artifacts>
								<artifact>
									<type>aar</type>
									<file>${project.basedir}/build/libs/${project.artifactId}-${parent.version}.aar</file>
								</artifact>
							</artifacts>
						</configuration>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>${java.version}</source>
					<target>${java.version}</target>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-source-plugin</artifactId>
				<version>2.2.1</version>
				<executions>
					<execution>
						<id>attach-sources</id>
						<goals>
							<goal>jar</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-javadoc-plugin</artifactId>
				<version>2.9</version>
				<configuration>
				     <!-- TODO: sourceFileExcludes doesn't work in 2.9 and 2.9.1 both. :(
				     			I hope that this feature works well. -->
				    <sourceFileExcludes>
				        <sourceFileExclude>**/R.java</sourceFileExclude>
				    </sourceFileExcludes>
				</configuration>
				
				<executions>
					<execution>
						<id>attach-javadocs</id>
						<goals>
							<goal>jar</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>


================================================
FILE: library/project.properties
================================================
# 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.

# Project target.
target=android-16
android.library=true


================================================
FILE: library/res/anim/slide_in_from_bottom.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     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.
-->

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="100%p"
    android:toYDelta="0" />


================================================
FILE: library/res/anim/slide_in_from_top.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     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.
-->

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="-100%p"
    android:toYDelta="0" />


================================================
FILE: library/res/anim/slide_out_to_bottom.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     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.
-->

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="0"
    android:toYDelta="100%p" />


================================================
FILE: library/res/anim/slide_out_to_top.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
     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.
-->

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="0"
    android:toYDelta="-100%p" />


================================================
FILE: library/res/drawable/indicator_bg_bottom.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <solid android:color="#40000000" />

    <!--
    I know the android:radius is useless here but it's needed to fix an old bug:
    http://code.google.com/p/android/issues/detail?id=939
    -->
    <corners
        android:bottomLeftRadius="0dp"
        android:bottomRightRadius="0dp"
        android:radius="1dp"
        android:topLeftRadius="@dimen/indicator_corner_radius"
        android:topRightRadius="@dimen/indicator_corner_radius" />

</shape>

================================================
FILE: library/res/drawable/indicator_bg_top.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <solid android:color="#40000000" />

    <!--
    I know the android:radius is useless here but it's needed to fix an old bug:
    http://code.google.com/p/android/issues/detail?id=939
    -->
    <corners
        android:bottomLeftRadius="@dimen/indicator_corner_radius"
        android:bottomRightRadius="@dimen/indicator_corner_radius"
        android:radius="1dp"
        android:topLeftRadius="0dp"
        android:topRightRadius="0dp" />

</shape>

================================================
FILE: library/res/drawable/progress_horizontal_holo_light.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- 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.
-->

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@android:id/background"
          android:drawable="@drawable/progress_bg_holo_light" />

    <item android:id="@android:id/secondaryProgress">
        <scale android:scaleWidth="100%"
               android:drawable="@drawable/progress_secondary_holo_light" />
    </item>

    <item android:id="@android:id/progress">
        <scale android:scaleWidth="100%"
               android:drawable="@drawable/progress_primary_holo_light" />
    </item>

</layer-list>

================================================
FILE: library/res/drawable/progress_horizontal_holo_light_right.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- 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.
-->

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@android:id/background"
          android:drawable="@drawable/progress_bg_holo_light" />

    <item android:id="@android:id/secondaryProgress">
        <scale android:scaleWidth="100%"
               android:drawable="@drawable/progress_secondary_holo_light" />
    </item>

    <item android:id="@android:id/progress">
        <scale android:scaleWidth="100%"
               android:drawable="@drawable/progress_primary_holo_light" />
    </item>

</layer-list>

================================================
FILE: library/res/drawable/progress_indeterminate_horizontal_holo.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
** Copyright 2011, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License"); 
** you may not use this file except in compliance with the License. 
** You may obtain a copy of the License at 
**
**     http://www.apache.org/licenses/LICENSE-2.0 
**
** Unless required by applicable law or agreed to in writing, software 
** distributed under the License is distributed on an "AS IS" BASIS, 
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
** See the License for the specific language governing permissions and 
** limitations under the License.
*/
-->
<animation-list
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:oneshot="false">
    <item android:drawable="@drawable/progressbar_indeterminate_holo1" android:duration="50" />
    <item android:drawable="@drawable/progressbar_indeterminate_holo2" android:duration="50" />
    <item android:drawable="@drawable/progressbar_indeterminate_holo3" android:duration="50" />
    <item android:drawable="@drawable/progressbar_indeterminate_holo4" android:duration="50" />
    <item android:drawable="@drawable/progressbar_indeterminate_holo5" android:duration="50" />
    <item android:drawable="@drawable/progressbar_indeterminate_holo6" android:duration="50" />
    <item android:drawable="@drawable/progressbar_indeterminate_holo7" android:duration="50" />
    <item android:drawable="@drawable/progressbar_indeterminate_holo8" android:duration="50" />
</animation-list>

================================================
FILE: library/res/layout/pull_to_refresh_header_google_style.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >

    <FrameLayout
        android:id="@+id/fl_inner_for_google_style"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" >

            <TextView
                android:id="@+id/pull_to_refresh_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:singleLine="true"
                android:textAppearance="?android:attr/textAppearance"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/pull_to_refresh_sub_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:singleLine="true"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:visibility="gone" />
        </RelativeLayout>
    </FrameLayout>

</merge>

================================================
FILE: library/res/layout/pull_to_refresh_header_horizontal.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >

    <FrameLayout
        android:id="@+id/fl_inner"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:paddingBottom="@dimen/header_footer_top_bottom_padding"
        android:paddingLeft="@dimen/header_footer_left_right_padding"
        android:paddingRight="@dimen/header_footer_left_right_padding"
        android:paddingTop="@dimen/header_footer_top_bottom_padding" >

        <ImageView
            android:id="@+id/pull_to_refresh_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="@dimen/header_pull_to_refresh_image_padding"
            android:layout_gravity="center" />

        <ProgressBar
            android:id="@+id/pull_to_refresh_progress"
            style="?android:attr/progressBarStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:indeterminate="true"
            android:visibility="gone" />
    </FrameLayout>

</merge>

================================================
FILE: library/res/layout/pull_to_refresh_header_vertical.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >

    <FrameLayout
        android:id="@+id/fl_inner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="@dimen/header_footer_top_bottom_padding"
        android:paddingLeft="@dimen/header_footer_left_right_padding"
        android:paddingRight="@dimen/header_footer_left_right_padding"
        android:paddingTop="@dimen/header_footer_top_bottom_padding" >

        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left|center_vertical" >

            <ImageView
                android:id="@+id/pull_to_refresh_image"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="@dimen/header_pull_to_refresh_image_padding"
                android:layout_gravity="center" />

            <ProgressBar
                android:id="@+id/pull_to_refresh_progress"
                style="?android:attr/progressBarStyleSmall"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:indeterminate="true"
                android:visibility="gone" />
        </FrameLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:gravity="center_horizontal"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/pull_to_refresh_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:singleLine="true"
                android:textAppearance="?android:attr/textAppearance"
                android:textStyle="bold" />

            <TextView
                android:id="@+id/pull_to_refresh_sub_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:singleLine="true"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:visibility="gone" />
        </LinearLayout>
    </FrameLayout>

</merge>

================================================
FILE: library/res/layout/pull_to_refresh_progress_google_style.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <com.handmark.pulltorefresh.library.internal.PullingProgressLayout 
        android:id="@+id/pulling_progress"
        android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:visibility="visible"
        >
    </com.handmark.pulltorefresh.library.internal.PullingProgressLayout>  
    <ProgressBar 
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
		style="?android:attr/progressBarStyleHorizontal"
        android:id="@+id/refreshing_progress"
        android:indeterminate="true"
        android:max="100"
        android:progress="0"
        android:indeterminateDrawable="@drawable/progress_indeterminate_horizontal_holo"
        android:visibility="gone" 
        />
</FrameLayout>


================================================
FILE: library/res/layout/pulling_progress_layout.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
    
	<com.handmark.pulltorefresh.library.internal.FlippedProgressBar
            android:id="@+id/pulling_left_progressbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="5"
            android:layout_gravity="left"
            style="?android:attr/progressBarStyleHorizontal"
            android:indeterminate="false">
	</com.handmark.pulltorefresh.library.internal.FlippedProgressBar>
	<ProgressBar
            android:id="@+id/pulling_right_progressbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="right"
            android:layout_weight="5"
            style="?android:attr/progressBarStyleHorizontal"
            android:indeterminate="false">
	</ProgressBar>
</LinearLayout>


================================================
FILE: library/res/values/attrs.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="PullToRefresh">

        <!-- A drawable to use as the background of the Refreshable View -->
        <attr name="ptrRefreshableViewBackground" format="reference|color" />

        <!-- A drawable to use as the background of the Header and Footer Loading Views -->
        <attr name="ptrHeaderBackground" format="reference|color" />

        <!-- Text Color of the Header and Footer Loading Views -->
        <attr name="ptrHeaderTextColor" format="reference|color" />

        <!-- Text Color of the Header and Footer Loading Views Sub Header -->
        <attr name="ptrHeaderSubTextColor" format="reference|color" />

        <!-- Mode of Pull-to-Refresh that should be used -->
        <attr name="ptrMode">
            <flag name="disabled" value="0x0" />
            <flag name="pullFromStart" value="0x1" />
            <flag name="pullFromEnd" value="0x2" />
            <flag name="both" value="0x3" />
            <flag name="manualOnly" value="0x4" />
            <flag name="google" value="0x5" />

            <!-- These last two are depreacted -->
            <flag name="pullDownFromTop" value="0x1" />
            <flag name="pullUpFromBottom" value="0x2" />
        </attr>

        <!-- Whether the Indicator overlay(s) should be used -->
        <attr name="ptrShowIndicator" format="reference|boolean" />

        <!-- Drawable to use as Loading Indicator. Changes both Header and Footer. -->
        <attr name="ptrDrawable" format="reference" />

        <!-- Drawable to use as Loading Indicator in the Header View. Overrides value set in ptrDrawable. -->
        <attr name="ptrDrawableStart" format="reference" />

        <!-- Drawable to use as Loading Indicator in the Footer View. Overrides value set in ptrDrawable. -->
        <attr name="ptrDrawableEnd" format="reference" />

        <!-- Whether Android's built-in Over Scroll should be utilised for Pull-to-Refresh. -->
        <attr name="ptrOverScroll" format="reference|boolean" />

        <!-- Base text color, typeface, size, and style for Header and Footer Loading Views -->
        <attr name="ptrHeaderTextAppearance" format="reference" />

        <!-- Base text color, typeface, size, and style for Header and Footer Loading Views Sub Header -->
        <attr name="ptrSubHeaderTextAppearance" format="reference" />

        <!-- Style of Animation should be used displayed when pulling. -->
        <attr name="ptrAnimationStyle" format="string">
        </attr>
        <!--  -->
        <attr name="ptrIndicatorStyle" format="string">
        </attr>
 
        <!-- Styles of Animation for google style pull to refresh -->
        <attr name="ptrGoogleViewStyle" format="string">
        </attr>
		<!-- Styles of Progress Bar Layout for google style pull to refresh -->
        <attr name="ptrGoogleProgressStyle" format="string">
        </attr>

        <!-- Label attributes of Loading layout -->
        <attr name="ptrPullLabel" format="string" />
        <attr name="ptrRefreshLabel" format="string" />
        <attr name="ptrReleaseLabel" format="string" />
        
        <attr name="ptrFriction" format="float" value="2.0" />
        <attr name="ptrSmoothScrollDuration" format="integer" value="200" />
        <attr name="ptrSmoothScrollLongDuration" format="integer" value="325" />
        
        <!-- Whether the user can scroll while the View is Refreshing -->
        <attr name="ptrScrollingWhileRefreshingEnabled" format="reference|boolean" />

        <!--
        	Whether PullToRefreshListView has it's extras enabled. This allows the user to be 
        	able to scroll while refreshing, and behaves better. It acheives this by adding
        	Header and/or Footer Views to the ListView.
        -->
        <attr name="ptrListViewExtrasEnabled" format="reference|boolean" />

        <!--
        	Whether the Drawable should be continually rotated as you pull. This only
        	takes effect when using the 'Rotate' Animation Style.
        -->
        <attr name="ptrRotateDrawableWhilePulling" format="reference|boolean" />

        <!-- Whether Google style view layout's size is set to ActionBar's size 
        	 (Don't set to false as possible, it's hard to control height if this flag is false) -->
        <attr name="ptrSetGoogleViewLayoutSizeToActionbarHeight" format="reference|boolean" />
        <!-- Animation Options only for google Style mode  -->
		<!--  Whether Google style view layout's fade-in animation is shown when pulling -->
        <attr name="ptrShowGoogleStyleViewAnimationEnabled" format="reference|boolean" />
       <!-- Whether Refreshable view is hidden when refreshing -->
        <attr name="ptrHideRefeshableViewWhileRefreshingEnabled" format="reference|boolean" />
        <!-- Whether Rotating progress bar is shown when refreshing -->
        <attr name="ptrViewRefeshableViewProgressBarOnCenterWhileRefreshingEnabled" format="reference|boolean" />
        <!-- Duration of Google style view layout's fade-in/out animation -->
        <attr name="ptrShowGoogleStyleViewAnimationDuration" format="integer" value="100" />
        <!-- Duration of  Refreshable view's fade-in/out animation -->
        <attr name="ptrHideRefeshableViewWhileRefreshingDuration" format="integer" value="500" />
        <!-- Duration of rotating progress bar's fade-in/out animation -->
        <attr name="ptrViewRefeshableViewProgressBarOnCenterWhileRefreshingDuration" format="integer" value="200" />
		
		<!-- These attrs are enabled to set width or height of Rotating progress bar on center -->
        <attr name="ptrRefeshableViewProgressBarOnCenterWidth" format="integer" value="200" />
        <attr name="ptrRefeshableViewProgressBarOnCenterHeight" format="integer" value="200" />

        <!-- BELOW HERE ARE DEPRECEATED. DO NOT USE. -->
        <attr name="ptrAdapterViewBackground" format="reference|color" />
        <attr name="ptrDrawableTop" format="reference" />
        <attr name="ptrDrawableBottom" format="reference" />
     
    </declare-styleable>
</resources>


================================================
FILE: library/res/values/dimens.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <dimen name="indicator_right_padding">10dp</dimen>
    <dimen name="indicator_corner_radius">12dp</dimen>
    <dimen name="indicator_internal_padding">4dp</dimen>
    <dimen name="header_footer_left_right_padding">24dp</dimen>
    <dimen name="header_footer_top_bottom_padding">12dp</dimen>
    <dimen name="header_pull_to_refresh_image_padding">10px</dimen>
</resources>

================================================
FILE: library/res/values/ids.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <item type="id" name="gridview" />
    <item type="id" name="webview" />
    <item type="id" name="scrollview" />

</resources>

================================================
FILE: library/res/values/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="pull_to_refresh_pull_label">Pull to refresh…</string>
    <string name="pull_to_refresh_release_label">Release to refresh…</string>
    <string name="pull_to_refresh_refreshing_label">Loading…</string>

    <!-- Just use standard Pull Down String when pulling up. These can be set for languages which require it -->
    <string name="pull_to_refresh_from_bottom_pull_label">@string/pull_to_refresh_pull_label</string>
    <string name="pull_to_refresh_from_bottom_release_label">@string/pull_to_refresh_release_label</string>
    <string name="pull_to_refresh_from_bottom_refreshing_label">@string/pull_to_refresh_refreshing_label</string>

</resources>

================================================
FILE: library/res/values-ar/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="pull_to_refresh_pull_label">اسحب للتحديث…</string>
  <string name="pull_to_refresh_release_label">اترك للتحديث…</string>
  <string name="pull_to_refresh_refreshing_label">تحميل…</string>
</resources>


================================================
FILE: library/res/values-cs/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="pull_to_refresh_pull_label">Tažením aktualizujete…</string>
  <string name="pull_to_refresh_release_label">Uvolněním aktualizujete…</string>
  <string name="pull_to_refresh_refreshing_label">Načítání…</string>
</resources>


================================================
FILE: library/res/values-de/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="pull_to_refresh_pull_label">Ziehen zum Aktualisieren…</string>
  <string name="pull_to_refresh_release_label">Loslassen zum Aktualisieren…</string>
  <string name="pull_to_refresh_refreshing_label">Laden…</string>
</resources>


================================================
FILE: library/res/values-es/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="pull_to_refresh_pull_label">Tirar para actualizar…</string>
  <string name="pull_to_refresh_release_label">Soltar para actualizar…</string>
  <string name="pull_to_refresh_refreshing_label">Cargando…</string>
</resources>


================================================
FILE: library/res/values-fi/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="pull_to_refresh_pull_label">Päivitä vetämällä alas…</string>
    <string name="pull_to_refresh_release_label">Päivitä vapauttamalla…</string>
    <string name="pull_to_refresh_refreshing_label">Päivitetään…</string>

    <!-- Just use standard Pull Down String when pulling up. These can be set for languages which require it -->
    <string name="pull_to_refresh_from_bottom_pull_label">Päivitä vetämällä ylös…</string>
    <string name="pull_to_refresh_from_bottom_release_label">@string/pull_to_refresh_release_label</string>
    <string name="pull_to_refresh_from_bottom_refreshing_label">@string/pull_to_refresh_refreshing_label</string>

</resources>

================================================
FILE: library/res/values-fr/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="pull_to_refresh_pull_label">Tirez pour rafraîchir…</string>
  <string name="pull_to_refresh_release_label">Relâcher pour rafraîchir…</string>
  <string name="pull_to_refresh_refreshing_label">Chargement…</string>
</resources>


================================================
FILE: library/res/values-he/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="pull_to_refresh_pull_label">משוך לרענון…</string>
  <string name="pull_to_refresh_release_label">שחרר לרענון…</string>
  <string name="pull_to_refresh_refreshing_label">טוען…</string>
</resources>


================================================
FILE: library/res/values-it/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="pull_to_refresh_pull_label">Tira per aggiornare…</string>
  <string name="pull_to_refresh_release_label">Rilascia per aggionare…</string>
  <string name="pull_to_refresh_refreshing_label">Caricamento…</string>
</resources>


================================================
FILE: library/res/values-iw/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="pull_to_refresh_pull_label">משוך לרענון…</string>
  <string name="pull_to_refresh_release_label">שחרר לרענון…</string>
  <string name="pull_to_refresh_refreshing_label">טוען…</string>
</resources>


================================================
FILE: library/res/values-ja/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="pull_to_refresh_pull_label">画面を引っ張って…</string>
  <string name="pull_to_refresh_release_label">指を離して更新…</string>
  <string name="pull_to_refresh_refreshing_label">読み込み中…</string>
</resources>


================================================
FILE: library/res/values-ko/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="pull_to_refresh_pull_label">당겨서 새로 고침…</string>
  <string name="pull_to_refresh_release_label">놓아서 새로 고침…</string>
  <string name="pull_to_refresh_refreshing_label">로드 중…</string>
</resources>


================================================
FILE: library/res/values-nl/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="pull_to_refresh_pull_label">Sleep om te vernieuwen…</string>
  <string name="pull_to_refresh_release_label">Loslaten om te vernieuwen…</string>
  <string name="pull_to_refresh_refreshing_label">Laden…</string>
</resources>


================================================
FILE: library/res/values-pl/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="pull_to_refresh_pull_label">Pociągnij, aby odświeżyć…</string>
  <string name="pull_to_refresh_release_label">Puść, aby odświeżyć…</string>
  <string name="pull_to_refresh_refreshing_label">Wczytywanie…</string>
</resources>


================================================
FILE: library/res/values-pt/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="pull_to_refresh_pull_label">Puxe para atualizar…</string>
  <string name="pull_to_refresh_release_label">Liberação para atualizar…</string>
  <string name="pull_to_refresh_refreshing_label">A carregar…</string>
</resources>


================================================
FILE: library/res/values-pt-rBR/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="pull_to_refresh_pull_label">Puxe para atualizar…</string>
  <string name="pull_to_refresh_release_label">Libere para atualizar…</string>
  <string name="pull_to_refresh_refreshing_label">Carregando…</string>
</resources>


================================================
FILE: library/res/values-ro/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="pull_to_refresh_pull_label">Trage pentru a reîmprospăta…</string>
  <string name="pull_to_refresh_release_label">Eliberează pentru a reîmprospăta…</string>
  <string name="pull_to_refresh_refreshing_label">Încărcare…</string>
</resources>


================================================
FILE: library/res/values-ru/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="pull_to_refresh_pull_label">Потяните для обновления…</string>
  <string name="pull_to_refresh_release_label">Отпустите для обновления…</string>
  <string name="pull_to_refresh_refreshing_label">Загрузка…</string>
</resources>


================================================
FILE: library/res/values-zh/pull_refresh_strings.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
  <string name="pull_to_refresh_pull_label">下拉刷新…</string>
  <string name="pull_to_refresh_release_label">放开以刷新…</string>
  <string name="pull_to_refresh_refreshing_label">正在载入…</string>
</resources>


================================================
FILE: library/res/xml/pulltorefresh.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<PullToRefresh>
    <LoadingLayouts>
       <layout name="rotate">com.handmark.pulltorefresh.library.internal.RotateLoadingLayout</layout>
       <layout name="flip">com.handmark.pulltorefresh.library.internal.FlipLoadingLayout</layout>
    </LoadingLayouts>
    <IndicatorLayouts>
       <layout name="default">com.handmark.pulltorefresh.library.internal.DefaultIndicatorLayout</layout>
    </IndicatorLayouts>
    <GoogleStyleViewLayouts>
       <layout name="default">com.handmark.pulltorefresh.library.internal.DefaultGoogleStyleViewLayout</layout> 
    </GoogleStyleViewLayouts>
    <GoogleStyleProgressLayouts>
       <layout name="default">com.handmark.pulltorefresh.library.internal.DefaultGoogleStyleProgressLayout</layout> 
    </GoogleStyleProgressLayouts>    
</PullToRefresh>

================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/configuration/xml/ExtendedXmlConfigParserFactory.java
================================================
/*******************************************************************************
 * Copyright 2013 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.configuration.xml;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import android.content.Context;
import android.content.res.AssetManager;
import android.util.Log;
/**
 * Parser of assets/pulltorefresh.xml creation factory 
 * @author Wonjun Kim
 */
class ExtendedConfigXmlParserFactory {
	
	private static final String LOG_TAG = ExtendedConfigXmlParserFactory.class.getName();
	/**
	 * pulltorefresh.xml path in assets folder
	 */
	private static final String XML_PATH_IN_ASSETS = "pulltorefresh.xml";
	/**
	 * pulltorefresh.xml encoding type
	 */
	private static final String DEFAULT_ENCODING_TYPE = "utf-8";
	/**
	 * Create a parser of assets/pulltorefresh.xml 
	 * @param context
	 * @return {@code parser} if creating parser has done, or {@code null} if an error occured during creation
	 */
	public static XmlPullParser createParser(Context context) {
		AssetManager am = context.getAssets();
		XmlPullParser parser = null;
		try {
			InputStream is = am.open(XML_PATH_IN_ASSETS);
			parser = XmlPullParserFactory.newInstance().newPullParser();
			parser.setInput(is, DEFAULT_ENCODING_TYPE);
			
		} catch (FileNotFoundException e) {
			Log.d(LOG_TAG, "The configuration file 'assets/" + XML_PATH_IN_ASSETS + "' is missing. But the file is just an option. It is necessary only if you want to customize something in Pull To Refresh.");
			// explicitly assign null
			parser = null;
		} catch (XmlPullParserException e) {
			Log.w(LOG_TAG, "The error occurs below when generating parser.", e);
			// explicitly assign null
			parser = null;
		} catch (IOException e) {
			Log.w(LOG_TAG, "Loading "+XML_PATH_IN_ASSETS+" file has failed.", e);
			// explicitly assign null
			parser = null;
		}
		
		// NOTE: this code makes a fatal error. so omit the code.
		// am.close();
		
		return parser;
	}
}


================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/configuration/xml/PullToRefreshConfigXmlParser.java
================================================
/*******************************************************************************
 * Copyright 2013 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.configuration.xml;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import com.handmark.pulltorefresh.library.internal.Assert;
/**
 * {@code PullToRefreshConfigXmlParser} does parsing pulltorefresh.xml as {@code XmlPullNode}s
 * @author Wonjun Kim
 */
final class PullToRefreshConfigXmlParser extends XmlPullNodeParser<PullToRefreshNode> {
	/**
	 * Repetition limit is only one
	 */ 
	private static final int ONLY_ONE_REPEAT = 1;
	/**
	 * Parsed data
	 */
	private PullToRefreshResult result;
	/**
	 * @param parser Must be not null 
	 */
	public PullToRefreshConfigXmlParser(XmlPullParserWrapper parser) {
		super(parser);
	}
	/**
	 * Generate a node tree matched by pulltorefresh.xml
	 * @return root node of a tree
	 */
	private XmlPullNode init() {
		// prepare a result instance
		result = new PullToRefreshResult();
		// make nodes 
		XmlPullNode root = new XmlPullNode("PullToRefresh");
		XmlPullNode loadingLayouts = new XmlPullNode("LoadingLayouts");
		XmlPullNode indicatorLayouts = new XmlPullNode("IndicatorLayouts");
		XmlPullNode googleStyleViewLayouts = new XmlPullNode("GoogleStyleViewLayouts");
		XmlPullNode googleStyleProgressLayouts = new XmlPullNode("GoogleStyleProgressLayouts");
		XmlPullNode loadingLayout = new XmlPullNode("layout",new LayoutNodeCallback(result.loadingLayoutClazzNameMap));
		XmlPullNode indicatorLayout = new XmlPullNode("layout",new LayoutNodeCallback(result.indicatorLayoutClazzNameMap));
		XmlPullNode googleStyleViewLayout = new XmlPullNode("layout",new LayoutNodeCallback(result.googleStyleViewLayoutClazzNameMap));
		XmlPullNode googleStyleProgressLayout = new XmlPullNode("layout",new LayoutNodeCallback(result.googleStyleProgressLayoutClazzNameMap));
		// make a tree structure
		root.addChildNode(loadingLayouts, ONLY_ONE_REPEAT);
		root.addChildNode(indicatorLayouts, ONLY_ONE_REPEAT);
		root.addChildNode(googleStyleViewLayouts, ONLY_ONE_REPEAT);
		root.addChildNode(googleStyleProgressLayouts, ONLY_ONE_REPEAT);
		loadingLayouts.addChildNode(loadingLayout);
		indicatorLayouts.addChildNode(indicatorLayout);
		googleStyleViewLayouts.addChildNode(googleStyleViewLayout);
		googleStyleProgressLayouts.addChildNode(googleStyleProgressLayout);
		// return root node
		return root;
	}
	/**
	 * @return root node of a tree
	 */
	@Override
	protected XmlPullNode generateRootNode() {
		return init();
	}
	/**
	 *  @return Parsed result data as {@code PullToRefreshNode} instance  
	 */
	@Override
	protected PullToRefreshNode getResult() {
		return new PullToRefreshNode(result.loadingLayoutClazzNameMap, result.indicatorLayoutClazzNameMap, result.googleStyleViewLayoutClazzNameMap, result.googleStyleProgressLayoutClazzNameMap);
	}
	/**
	 * Parsed Result to be sent to {@code PullToRefreshNode}
	 * @author Wonjun Kim
	 *
	 */
	private static class PullToRefreshResult {
		public final Map<String, String> loadingLayoutClazzNameMap = new HashMap<String, String>();
		public final Map<String, String> indicatorLayoutClazzNameMap = new HashMap<String, String>();
		public final Map<String, String> googleStyleViewLayoutClazzNameMap = new HashMap<String, String>();
		public final Map<String, String> googleStyleProgressLayoutClazzNameMap = new HashMap<String, String>();
	}
		
	/**
	 * Callback of the node 'PullToRefresh/IndicatorLayouts/layout' and 'PullToRefresh/LoadingLayouts/layout' 
	 * @author Wonjun Kim
	 *
	 */
	private static class LayoutNodeCallback implements XmlPullNode.XmlPullNodeCallback {
		/**
		 * {@code Map} storing Layouts' information 
		 */
		private Map<String, String> layoutClazzNameMap;
		/**
		 * @param layoutClazzNameMap Must not be null and be clean for which put new values
		 */
		public LayoutNodeCallback(Map<String, String> layoutClazzNameMap) {
			Assert.notNull(layoutClazzNameMap, "Class Map");
			this.layoutClazzNameMap = layoutClazzNameMap;
		}
		/**
		 * Be called when parser has found 'layout' node at a time
		 */
		@Override
		public void process(XmlPullParser parser) throws XmlPullParserException, IOException {

			int attributesCount = parser.getAttributeCount();
			String attributeName, attributeValue;
			// Iterate attributes!			
			for (int i = 0; i < attributesCount; ++i) {
				attributeName = parser.getAttributeName(i);
				attributeValue = parser.getAttributeValue(i);
				// The 'name' attribute is as a layout code of each layout's class  
				if ( "name".equals(attributeName)) {
					// Skip if attribute value is null or empty 
					if ( attributeValue == null || attributeValue.length() == 0 ) {
						continue;
					}
					
					// Get layout's class name
					String clazzName = parser.nextText();
					
					// Insert new class name 
					layoutClazzNameMap.put(attributeValue, clazzName);

					// Do 'break' because nextText() method has been called
					break;
				}
			}
		}
	}
}


================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/configuration/xml/PullToRefreshNode.java
================================================
/*******************************************************************************
 * Copyright 2013 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.configuration.xml;

import java.util.Map;

import com.handmark.pulltorefresh.library.internal.Assert;
/**
 * {@code PullToRefreshNode} has an information in contents of pulltorefresh.xml, <br /> such as loading layout and indicator layout class name
 * @author Wonjun Kim
 *
 */
class PullToRefreshNode {
	/**
	 * Map Storing LoadingLayout class names<br />
	 * Key : layout code (String) <br />
	 * Value : class name (String)
	 */
	private final Map<String, String> loadingLayoutClazzNameMap;
	/**
	 * Map Storing IndicatorLayout class names<br />
	 * Key : layout code (String) <br />
	 * Value : Class name (String)
	 */
	private final Map<String, String> indicatorLayoutClazzNameMap;
	/**
	 * Map Storing GoogleStyleViewLayout class names<br />
	 * Key : layout code (String) <br />
	 * Value : Class name (String)
	 */	
	private Map<String, String> googleStyleViewLayoutClazzNameMap;
	/**
	 * Map Storing GoogleStyleProgressLayout class names<br />
	 * Key : layout code (String) <br />
	 * Value : Class name (String)
	 */	
	private Map<String, String> googleStyleProgressLayoutClazzNameMap;	
	/**
	 * Constructor needs two class name {@code Map}s, which are LoadingLayout class name map and Indicator class name {@code map}.<br />
	 * NOTE: Parameters must go in order. First Parameter : loading layout / Second Parameter : indicator layout  
	 * @param loadingLayoutClazzNameMap LoadingLayout class names
	 * @param indicatorLayoutClazzNameMap
	 */
	public PullToRefreshNode(Map<String, String> loadingLayoutClazzNameMap,
			Map<String, String> indicatorLayoutClazzNameMap, Map<String, String> googleStyleViewLayoutClazzNameMap, Map<String, String> googleStyleProgressLayoutClazzNameMap) {
		Assert.notNull(loadingLayoutClazzNameMap, "LoadingLayout Class Name Map");
		Assert.notNull(indicatorLayoutClazzNameMap, "Loading Layout Class Name Map");
		this.loadingLayoutClazzNameMap = loadingLayoutClazzNameMap;
		this.indicatorLayoutClazzNameMap = indicatorLayoutClazzNameMap;
		this.googleStyleViewLayoutClazzNameMap = googleStyleViewLayoutClazzNameMap;
		this.googleStyleProgressLayoutClazzNameMap = googleStyleProgressLayoutClazzNameMap;
	}
	/**
	 * @param layoutCode LoadingLayout layout code
	 * @return LoadingLayout class name
	 */
	public String getIndicatorLayoutClazzName(String layoutCode) {
		return indicatorLayoutClazzNameMap.get(layoutCode);
	}
	/**
	 * @param layoutCode LoadingLayout layout code
	 * @return LoadingLayout class name
	 */
	public String getLoadingLayoutClazzName(String layoutCode) {
		return loadingLayoutClazzNameMap.get(layoutCode);
	}
	/**
	 * @param layoutCode GoogleStyleViewLayout layout code
	 * @return GoogleStyleViewLayout class name
	 */	
	public String getGoogleStyleViewLayoutClazzName(String layoutCode) {
		return googleStyleViewLayoutClazzNameMap.get(layoutCode);
	}
	/**
	 * @param layoutCode GoogleStyleProgressLayout layout code
	 * @return GoogleStyleProgressLayout class name
	 */	
	public String getGoogleStyleProgressLayoutClazzName(String layoutCode) {
		return googleStyleProgressLayoutClazzNameMap.get(layoutCode);
	}		
	/**
	 * Add an information from other {@code PullToRefreshNode} instance
	 * @param extendedNode Other {@code PullToRefresNode} to be combined
	 */
	public void extendProperties(PullToRefreshNode extendedNode) {
		Assert.notNull(extendedNode, "Extended Node");
		Map<String, String> indicatorMap = extendedNode.indicatorLayoutClazzNameMap;
		Map<String, String> loadingMap = extendedNode.loadingLayoutClazzNameMap;
		Map<String, String> googleStyleViewMap = extendedNode.googleStyleViewLayoutClazzNameMap;
		Map<String, String> googleStyleProgressMap = extendedNode.googleStyleProgressLayoutClazzNameMap;
		
		indicatorLayoutClazzNameMap.putAll(indicatorMap);
		loadingLayoutClazzNameMap.putAll(loadingMap);
		googleStyleViewLayoutClazzNameMap.putAll(googleStyleViewMap);
		googleStyleProgressLayoutClazzNameMap.putAll(googleStyleProgressMap);
	}

}


================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/configuration/xml/PullToRefreshXmlConfiguration.java
================================================
/*******************************************************************************
 * Copyright 2013 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.configuration.xml;

import java.io.IOException;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import com.handmark.pulltorefresh.library.R;
import com.handmark.pulltorefresh.library.internal.Assert;
import com.handmark.pulltorefresh.library.internal.Utils;

import android.content.Context;
import android.content.res.Resources;
import android.util.Log;

/**
 * {@code PullToRefreshXmlConfiguration} is an information set of PullToRefresh. It contains a list of indicator layouts and of loading layouts. An information set of PullToRefresh is converted from pulltorefresh.xml.<br />
 * This Class is Singleton, and you <b>MUST</b> call {@link #init(Context)} before using this class.  
 * @author Wonjun Kim
 */
public class PullToRefreshXmlConfiguration {
	
	private static final String LOG_TAG = PullToRefreshXmlConfiguration.class.getName();
	
	/**
	 * Singleton instance
	 * @author Wonjun Kim
	 */
	private static class InstanceHolder {
		private final static PullToRefreshXmlConfiguration instance = new PullToRefreshXmlConfiguration();
		
		private static PullToRefreshXmlConfiguration getInstance() {
			return instance;
		}
	} 
	/**
	 * Parsed information from pulltorefresh.xml 
	 */
	private PullToRefreshNode node = null; 
	/**
	 * Default pulltorefresh path id is got from R class.
	 */
	private static final int XML_PATH_ID = R.xml.pulltorefresh;
	/**
	 * flag whether it has called {@link #init(Context)} 
	 */
	private boolean initialized = false;
	/**
	 * Constructor <br />
	 * nothing to do
	 */
	private PullToRefreshXmlConfiguration() {}
	/**
	 * Get singleton instance
	 * @return {@code PullToRefreshXmlConfiguration} instance
	 */
	public static PullToRefreshXmlConfiguration getInstance() {
		return InstanceHolder.getInstance();
	}
	/**
	 * Initialize the instance before using. <br />
	 * Load 'res/xml/pulltorefresh.xml' in PullToRefresh library package and 'assets/pulltofresh.xml' in Android Project if it exists. <br />
	 * Combine information of 'res/xml/pulltorefresh.xml' and 'assets/pulltofresh.xml', and then save the information into the instance's fields.<br />
	 * <br />
	 * NOTE: This method <b>MUST</b> be called before using! 
	 * @param context Context instance and not null
	 */
	public void init(Context context) {
		// If an initialization was happened already, skip.
		if ( initialized == true ) {
			return;
		}
		Assert.notNull(context, "Context");
		// get resources
		Resources resources = context.getResources();
		// read the file
		XmlPullParser parser = resources.getXml(XML_PATH_ID);
		// parser the xml
		XmlPullParserWrapper wrapper = new XmlPullParserWrapper(parser);
		
		try {
			node = new PullToRefreshConfigXmlParser(wrapper).parse();

			// load extended xml 
			XmlPullParser extendedXmlParser = ExtendedConfigXmlParserFactory.createParser(context);
			if ( extendedXmlParser != null) {
				XmlPullParserWrapper extendedXmlWrapper = new XmlPullParserWrapper(extendedXmlParser);
				// NOTE : if some exception is thrown from PullToRefreshConfigXmlParser, Loading extended xml will be skipped.
				PullToRefreshNode extendedNode = new PullToRefreshConfigXmlParser(extendedXmlWrapper).parse();
				node.extendProperties(extendedNode);
			}
		} catch (XmlPullParserException e) {
			Log.d(LOG_TAG, "It has failed to parse the xmlpullparser xml.", e);
		} catch (IOException e) {
			Log.d(LOG_TAG, "It has failed to parse the xmlpullparser xml.\n ", e);
		}
		
		// Intialization can be done whether reading XML has failed or not! 
		initialized = true;
	}
	/**
	 * @param layoutCode Layout name
	 * @return Layout Class name ( ex: com.handmark.pulltorefresh.library.internal.FlipLoadingLayout )
	 */
	public String getLoadingLayoutClazzName(String layoutCode) {
		assertInitialized();
		if ( isNodeNull() ) {
			return null;
		}
		return node.getLoadingLayoutClazzName(layoutCode);
	}
	/**
	 * @param layoutCode Layout name
	 * @return Layout Class name ( ex: com.handmark.pulltorefresh.library.internal.DefaultLoadingLayout )
	 */
	public String getIndicatorLayoutClazzName(String layoutCode) {
		assertInitialized();
		if ( isNodeNull() ) {
			return null;
		}
		return node.getIndicatorLayoutClazzName(layoutCode);
	}
	/**
	 * @param layoutCode Layout name
	 * @return Layout Class name ( ex: com.handmark.pulltorefresh.library.internal.DefaultGoogleStyleViewLayout )
	 */
	public String getGoogleStyleViewLayoutClazzName(String layoutCode) {
		assertInitialized();
		if ( isNodeNull() ) {
			return null;
		}
		return node.getGoogleStyleViewLayoutClazzName(layoutCode);
	}
	/**
	 * @param layoutCode Layout name
	 * @return Layout Class name ( ex: com.handmark.pulltorefresh.library.internal.DefaultGoogleStyleProgressLayout )
	 */
	public String getGoogleStyleProgressLayoutClazzName(String layoutCode) {
		assertInitialized();
		if ( isNodeNull() ) {
			return null;
		}
		return node.getGoogleStyleProgressLayoutClazzName(layoutCode);
	}	
	/**
	 * @return true if {@code node} is null
	 */
	private boolean isNodeNull() {
		return node == null;
	}
	/**
	 * @return true if {@link #init(Context)} method has not been called  
	 */
	private boolean notInitialized() {
		return !initialized;
	}
	/**
	 * @return throw an exception if {@link #init(Context)} method has not been called  
	 */
	private void assertInitialized() {
		if ( notInitialized() ) {
			throw new IllegalStateException(PullToRefreshXmlConfiguration.class.getName()+" has not initialized. Call init() method first.");
		}
	}
}


================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/configuration/xml/XmlPullNode.java
================================================
/*******************************************************************************
 * Copyright 2013 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.configuration.xml;


import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import com.handmark.pulltorefresh.library.internal.Assert;
/**
 * {@code XmlPullNode} is used for parsing xml as a node tree.<br />
 * If you implement {@link XmlPullNode#XmlPullNodeCallback} and pass that on to this class,<br /> {@link XmlPullNodeParser} calls {@link XmlPullNode#XmlPullNodeCallback#process(XmlPullParser)} when it has found this current node during parse.<br />
 * When it has found a child node of current node' children, and if the child node has been added in current node as child XmlPullNode, {@link XmlPullNodeParser} continues parsing at the child.  
 * @author Wonjun Kim
 *
 */
class XmlPullNode {
	/**
	 * Unlimited repeat value <br />
	 * If you add a child (by calling {@link #addChildNode(XmlPullNode, int)} with setting repeat limit and the limit is {@code INFINITE}, the limit becomes meaningless.<br /> 
	 */
	public static final int INFINITE = -1;
	/**
	 * Map which store children<br /> 
	 * child's node name can have upper case or lower. all is the same whether that is upper or lower. 
	 */
	private final Map<String, XmlPullNodeContainer> children = new TreeMap<String, XmlPullNodeContainer>(
			String.CASE_INSENSITIVE_ORDER);
	/**
	 * Current node's name
	 */
	private final String tagName;
	/**
	 * Callback <br /> {@code XmlPullNodeCallback.process(XmlPullParser)} method is called when this node has found in xml.
	 */
	private final XmlPullNodeCallback callback;
	/**
	 * Default callback. This doesn't any kind of action.
	 */
	private static final XmlPullNodeCallback nullCallback = new XmlPullNodeCallback() {
		@Override
		public void process(XmlPullParser parser) {
			// do nothing
		}
	};
	/**
	 * Default Constructor (only set a node name)
	 * @param tagName Node name. this must not be null
	 */
	public XmlPullNode(String tagName) {
		this(tagName, null);
	}
	/**
	 * Constructor with {@code tagName} and {@code callback}
	 * @param tagName Node name. this must not be null
	 * @param callback  
	 */
	public XmlPullNode(String tagName, XmlPullNodeCallback callback) {
		Assert.notNull(tagName, "Tag Name");
		this.tagName = tagName;
		this.callback = (callback == null) ? nullCallback : callback;
	}
	/**
	 * @return Current node name
	 */
	public String getName() {
		return tagName;
	}
	/**
	 * Add a child node into this node without repeat limit<br />
	 * NOTE: When it has found a child node of current node' children, and if the child node has been added in current node as child XmlPullNode, {@link XmlPullNodeParser} continues parsing at the child.  
	 * @param node Child node to add
	 * @return true if it is successful to add
	 */
	public boolean addChildNode(XmlPullNode node) {
		return addChildNode(node, INFINITE);
	}
	/**
	 * Add a child node into this node with repeat limit<br />
	 * NOTE: When it has found a child node of current node' children, and if the child node has been added in current node as child XmlPullNode, {@link XmlPullNodeParser} continues parsing at the child.  
	 * @param node Child node to add
	 * @param repeatLimit Repeat limit. if a child repeats over the limit, an error occurs during parse. 
	 * @return true if it is successful to add
	 */
	public boolean addChildNode(XmlPullNode node, int repeatLimit) {
		XmlPullNodeContainer pullNodeContainer = children.get(node.getName());
		if (pullNodeContainer != null) {
			return false;
		}

		children.put(node.getName(),
				new XmlPullNodeContainer(node, repeatLimit));
		return true;
	}	
	/**
	 * Get a child of this node's chidren
	 * @param tagName Child node name to find
	 * @return Child node if the child has been found or null
	 * @throws XmlPullParserException
	 */
	public XmlPullNode getChild(String tagName) throws XmlPullParserException {
		XmlPullNodeContainer pullNodeContainer = children.get(tagName);
		if (pullNodeContainer == null) {
			return null;
		}
		return pullNodeContainer.takeXmlPullNode();

	}
	/**
	 * @return Callback instance
	 */
	public XmlPullNodeCallback getCallback() {
		return callback;
	}
	/**
	 * Callback to process some action for {@code XmlPullNode}. <br />
	 * 
	 * NOTE: If you implement {@link XmlPullNode#XmlPullNodeCallback} and pass that on to {@code XmlPullNode} class,<br /> {@link XmlPullNodeParser} calls {@link XmlPullNode#XmlPullNodeCallback#process(XmlPullParser)} when it has found this the node during parse.
	 * @author Wonjun Kim
	 *
	 */
	public static interface XmlPullNodeCallback {
		/**
		 * @param parser {@code XmlPullParser} instance which are parsing xml. WARNING: Must carefully use {@code parser}. using {@code parser} can affect to cause an parsing error. Because {@code parser} can easily go to some wrong position during usage.   
		 * @throws XmlPullParserException
		 * @throws IOException
		 */
		void process(XmlPullParser parser) throws XmlPullParserException, IOException;
	}
	
	/**
	 * {@XmlPullNodeContainer} is a container for saving {@code repeatLimit}. And check the limit to occur an error. <br />
	 * NOTE : Justly, this Class is not thread-safe. :)
	 * @author Wonjun Kim
	 *
	 */
	private static class XmlPullNodeContainer {
		/**
		 * Real {@code XmlPullnode} instance
		 */
		private XmlPullNode node;
		/**
		 * Repetition limit value decreasing one by which a node occurs at a time
		 */
		private int repeatLimit; 
		/**
		 * Default Constructor 
		 * @param node Infinite repeat {@code XmlPullNode} instance
		 */
		public XmlPullNodeContainer(XmlPullNode node) {
			this(node, INFINITE);
		}
		/**
		 * Constructor with {@code node} and {@code repeatLimit}
		 * @param node Finite repeat (only if you set positive {@code repeatLimit}) {@code XmlPullNode} instance
		 * @param repeatLimit Repeat limit value. This must be positive.
		 */
		public XmlPullNodeContainer(XmlPullNode node, int repeatLimit) {
			Assert.notNull(node, "XmlPullNode");
			this.node = node;
			this.repeatLimit = repeatLimit;
		}
		/**
		 * Return {@code XmlPullNode} instance or throw a limit error
		 * @return {@code XmlPullNode} instance if the node repeats under the limit 
		 * @throws XmlPullParserException if a number of repetitions reaches the limit 
		 */
		public XmlPullNode takeXmlPullNode() throws XmlPullParserException {
			if (repeatLimit > 0) {
				decreaseRepeatLimit();
				return node;
			}
			
			// throw an error
			if (repeatLimit == 0) {
				String tagName = node.getName();
				throw new XmlPullParserException("Tag '" + tagName
						+ "' should not have more " + repeatLimit + " nodes.");
			}

			// if infinite repeats,
			return node;

		}
		/**
		 * one step forward to the limit error!
		 */
		private void decreaseRepeatLimit() {
			--repeatLimit;
		}
	}
}


================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/configuration/xml/XmlPullNodeParser.java
================================================
/*******************************************************************************
 * Copyright 2013 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.configuration.xml;


import java.io.IOException;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import android.util.Log;

import com.handmark.pulltorefresh.configuration.xml.XmlPullParserWrapper.DocumentState;
import com.handmark.pulltorefresh.library.internal.Assert;
/**
 * 
 * {@code XmlPullNode}-based Parser using XmlPullParser <br />
 * When you override this class, you must define parse strategies, and return the root node (in {@link #generateRootNode()} of {@code XmlPullNode}s containing each parse strategy, 
 * and return the result (in {@link #getResult()} for which provide that to client after parse.  
 * @author Wonjun Kim
 * @param <R> Result type 
 */
abstract class XmlPullNodeParser<R> {
	private final XmlPullParserWrapper parser;
	private final XmlPullNode rootNode;
	/**
	 * this flag prevents duplicate parse.
	 */
	private boolean isParsed = false;
	/**
	 * @param parser which has not been read yet. <br /> throw {@code NullPointerException} if {@code parser} is null
	 */
	public XmlPullNodeParser(XmlPullParserWrapper parser) {
		Assert.notNull(parser, "XmlPullParser");
		this.parser = parser;
		this.rootNode = generateRootNode();
	}
	/**
	 * @return entry point for {@code XmlPullNode}-based parse
	 */
	protected abstract XmlPullNode generateRootNode();
	/**
	 * Parse the data and return {@code <R>} type result <br />
	 * even if you call this methods several times, parsing happens once and no more duplicate parse
	 * @return parsed data
	 * @throws XmlPullParserException
	 * @throws IOException
	 */
	public final R parse() throws XmlPullParserException, IOException {

		// avoid duplicate parse 
		if ( isParsed == true ) {
			return getResult();
		}
		
		// First, Find the root node.
		DocumentState documentState;
		
		String rootName = rootNode.getName();
		documentState = parser.nextStartTagByName(rootName);
		
		if ( documentState.END.equals(documentState)) {
			throw new XmlPullParserException(rootName + " tag has not found.");
		}
		// deeply parsing
		parseInternal(rootNode);
		isParsed = true;
		return getResult();
	}
	/**
	 * Return a result after parse <br />Be called from {@link #parse()} method 
	 * @return result value to return after parsing is done
	 */
	protected abstract R getResult();
	/**
	 * Call {@link XmlPullNode.XmlPullNodeCallback#process(XmlPullParser)} and parse child nodes of current node
	 * 
	 * @param currentNode target of which call a callback and parse children
	 * @throws XmlPullParserException
	 * @throws IOException
	 */
	private void parseInternal(XmlPullNode currentNode) throws XmlPullParserException, IOException {
		// NOTE : too many permissions to node
		currentNode.getCallback().process(parser);
		
		while ( true ) {
	
			// if document is end during finding the end tag of this current node, it throws the exception below. 
			if ( parser.isEndDocument() ) {
				throw new XmlPullParserException("XML document is invalid.");
			}			
			
			// if the end tag is found, parsing this scope is being ended.
			if ( parser.isEndTag() && parser.matchCurrentTagName(currentNode.getName())) {
				break;
			}
			
			// get next tag
			parser.next();
			
			// when a child node is found, deeply parsing
			if ( parser.isStartTag() ) {
				
				String currentTagName = parser.getName();
				XmlPullNode childNode = currentNode.getChild(currentTagName);
				if ( childNode != null ) {
					// recursively!
					parseInternal(childNode);
				}
			}
		}
	} 
}


================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/configuration/xml/XmlPullParserWrapper.java
================================================
/*******************************************************************************
 * Copyright 2013 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.configuration.xml;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;

import com.handmark.pulltorefresh.library.internal.Assert;
/**
 * <p>
 * {@code XmlPullParser} Wrapper <br />
 * This class provide util methods such as {@link #nextStartTag()}, {@link #isStartTag()} , and so on  
 * </p>
 * @author Wonjun Kim
 *
 */
class XmlPullParserWrapper implements XmlPullParser {
	/**	
	 * {@code XmlPullParserWrapper} call this {@code parser} as delegatee
	 */
	private final XmlPullParser parser;
	/**
	 * <p>
	 * Need {@code XmlPullParser} <br /> 
	 * If {@code parser} is null, It throws {@code NullPointerException}
	 * </p> 
	 * @param parser delegated {@link XmlPullParser}
	 */
	public XmlPullParserWrapper(XmlPullParser parser) {
		Assert.notNull(parser, "XmlPullParser");
		this.parser = parser;
	}
	/**
	 * <p>
	 * {@code DocumentState} represents current state (instead of event type) of a document which the parser reads.<br /> 
	 * </p>
	 * @author Wonjun Kim
	 *
	 */
	public static enum DocumentState {
		/**
		 * READ : Document is readable yet
		 */
		READ, 
		/**
		 * FOUNDTAG : Document is readable yet and current event is a tag type
		 */
		FOUNDTAG, 
		/**
		 * END : Document is completely read. There is no more token
		 */
		END;
	}
	/**
	 * @return true if current type is {@code START_TAG}
	 * @throws XmlPullParserException
	 */
	public boolean isStartTag() throws XmlPullParserException {
		return getEventType() == START_TAG;
	}
	/**
	 * @return true if current type is {@code END_TAG}
	 * @throws XmlPullParserException
	 */
	public boolean isEndTag() throws XmlPullParserException {
		return getEventType() == END_TAG;
	}
	/**
	 * @return true if current type is {@code TEXT}
	 * @throws XmlPullParserException
	 */
	public boolean isText() throws XmlPullParserException {
		return getEventType() == TEXT;
	}
	/**
	 * @return true if current type is {@code START_DOCUMENT}
	 * @throws XmlPullParserException
	 */
	public boolean isStartDocument() throws XmlPullParserException {
		return getEventType() == START_DOCUMENT;
	}
	/**
	 * @return true if current type is {@code END_DOCUMENT}
	 * @throws XmlPullParserException
	 */
	public boolean isEndDocument() throws XmlPullParserException {
		return getEventType() == END_DOCUMENT;
	}
	/**
	 * @return true if current type is {@code COMMENT}
	 * @throws XmlPullParserException
	 */
	public boolean isComment() throws XmlPullParserException {
		return getEventType() == COMMENT;
	}
	/**
	 * <p>
	 * Find next start tag by calling {@link XmlPullParser#next()} again and again 
	 * If the parser reaches the end of a document, this method will returns {@code DocumentState.END}
	 * </p>
	 * @return {@link DocumentState.FOUNDTAG} if start tag has been found 
	 * 		   {@link DocumentState.END} if the parser reaches the end of a document
	 * @throws XmlPullParserException
	 * @throws IOException
	 */
	public DocumentState nextStartTag() throws XmlPullParserException,
			IOException {
		while (true) {

			int evt = next();

			if (evt == XmlPullParser.START_TAG) {
				return DocumentState.FOUNDTAG;
			}

			if (evt == XmlPullParser.END_DOCUMENT) {
				return DocumentState.END;
			}
		}
	}
	/**
	 * <p>
	 * Find next start tag whose name is same as {@code tagName} by calling {@link XmlPullParser#next()} again and again 
	 * If the parser reaches the end of a document, this method will returns {@code DocumentState.END}
	 * </p>
	 * @param tagName Tag name you want to find
	 * @return {@link DocumentState.FOUNDTAG} if start tag has been found 
	 * 		   {@link DocumentState.END} if the parser reaches the end of a document
	 * @throws XmlPullParserException
	 * @throws IOException
	 */
	public DocumentState nextStartTagByName(String tagName)
			throws XmlPullParserException, IOException {
		while (true) {
			DocumentState documentState = nextStartTag();

			if (documentState.equals(DocumentState.END)) {
				return documentState;
			}
			
			if (matchCurrentTagName(tagName)) {
				break;
			}
		}

		return DocumentState.FOUNDTAG;
	}
	/**
	 * <p>
	 * Find next end tag by calling {@link XmlPullParser#next()} again and again 
	 * If the parser reaches the end of a document, this method will returns {@code DocumentState.END}
	 * </p>
	 * @return {@link DocumentState.FOUNDTAG} if end tag has been found 
	 * 		   {@link DocumentState.END} if the parser reaches the end of a document
	 * @throws XmlPullParserException
	 * @throws IOException
	 */
	public DocumentState nextEndTag() throws XmlPullParserException,
			IOException {
		while (true) {

			int evt = next();

			if (evt == XmlPullParser.END_TAG) {
				return DocumentState.FOUNDTAG;
			}

			if (evt == XmlPullParser.END_DOCUMENT) {
				return DocumentState.END;
			}
		}
	}
	/**
	 * <p>
	 * Find next end tag whose name is same as {@code tagName} by calling {@link XmlPullParser#next()} again and again 
	 * If the parser reaches the end of a document, this method will returns {@code DocumentState.END}
	 * </p>
	 * @param tagName Tag name you want to find
	 * @return {@link DocumentState.FOUNDTAG} if start tag has been found 
	 * 		   {@link DocumentState.END} if the parser reaches the end of a document
	 * @throws XmlPullParserException
	 * @throws IOException
	 */
	public DocumentState nextEndTagByName(String tagName)
			throws XmlPullParserException, IOException {
		while (true) {
			DocumentState documentState = nextEndTag();

			if (documentState.equals(DocumentState.END)) {
				return documentState;
			}
			
			if (matchCurrentTagName(tagName)) {
				break;
			}
		}

		return DocumentState.FOUNDTAG;
	}
	/**
	 * Check that current tag name is same as {@code tagName} 
	 * 
	 * @param tagName Tag name you want to check whether current tag is same as 
	 * @return true if current tag name is same 
	 * @throws XmlPullParserException
	 * @throws IOException
	 */
	public boolean matchCurrentTagName(String tagName) {
		Assert.notNull(tagName, "Tag Name");
		return getName().equals(tagName);
	}
	/** Wrapper method for {@link XmlPullParser#setFeature(String, boolean)} */
	@Override
	public void setFeature(String name, boolean state)
			throws XmlPullParserException {
		parser.setFeature(name, state);
	}
	/** Wrapper method for {@link XmlPullParser#getFeature(String)} */
	@Override
	public boolean getFeature(String name) {
		return parser.getFeature(name);
	}
	/** Wrapper method for {@link XmlPullParser#setProperty(String, Object)} */
	@Override
	public void setProperty(String name, Object value)
			throws XmlPullParserException {
		parser.setProperty(name, value);
	}
	/** Wrapper method for {@link XmlPullParser#getProperty(String)} */
	@Override
	public Object getProperty(String name) {
		return parser.getProperty(name);
	}
	/** Wrapper method for {@link XmlPullParser#setInput(Reader)} */
	@Override
	public void setInput(Reader in) throws XmlPullParserException {
		parser.setInput(in);
	}
	/** Wrapper method for {@link XmlPullParser#setInput(InputStream, String)} */
	@Override
	public void setInput(InputStream inputStream, String inputEncoding)
			throws XmlPullParserException {
		parser.setInput(inputStream, inputEncoding);
	}
	/** Wrapper method for {@link XmlPullParser#getInputEncoding()} */
	@Override
	public String getInputEncoding() {
		return parser.getInputEncoding();
	}
	/** Wrapper method for {@link XmlPullParser#defineEntityReplacementText(String, String)} */
	@Override
	public void defineEntityReplacementText(String entityName,
			String replacementText) throws XmlPullParserException {
		parser.defineEntityReplacementText(entityName, replacementText);
	}
	/** Wrapper method for {@link XmlPullParser#getNamespaceCount(int)} */
	@Override
	public int getNamespaceCount(int depth) throws XmlPullParserException {
		// TODO Auto-generated method stub
		return parser.getNamespaceCount(depth);
	}
	/** Wrapper method for {@link XmlPullParser#getNamespacePrefix(int)} */
	@Override
	public String getNamespacePrefix(int pos) throws XmlPullParserException {
		return parser.getNamespacePrefix(pos);
	}
	/** Wrapper method for {@link XmlPullParser#getNamespaceUri(int)} */
	@Override
	public String getNamespaceUri(int pos) throws XmlPullParserException {
		return parser.getNamespaceUri(pos);
	}
	/** Wrapper method for {@link XmlPullParser#getNamespace(String)} */
	@Override
	public String getNamespace(String prefix) {
		return parser.getNamespace(prefix);
	}
	/** Wrapper method for {@link XmlPullParser#getDepth()} */
	@Override
	public int getDepth() {
		return parser.getDepth();
	}
	/** Wrapper method for {@link XmlPullParser#getPositionDescription()} */
	@Override
	public String getPositionDescription() {
		return parser.getPositionDescription();
	}
	/** Wrapper method for {@link XmlPullParser#getLineNumber()} */
	@Override
	public int getLineNumber() {
		return parser.getLineNumber();
	}
	/** Wrapper method for {@link XmlPullParser#getColumnNumber()} */
	@Override
	public int getColumnNumber() {
		return parser.getColumnNumber();
	}
	/** Wrapper method for {@link XmlPullParser#isWhiteSpace()} */
	@Override
	public boolean isWhitespace() throws XmlPullParserException {
		return parser.isWhitespace();
	}
	/** Wrapper method for {@link XmlPullParser#getText()} */
	@Override
	public String getText() {
		return parser.getText();
	}
	/** Wrapper method for {@link XmlPullParser#getTextCharacters(int[])} */
	@Override
	public char[] getTextCharacters(int[] holderForStartAndLength) {
		return parser.getTextCharacters(holderForStartAndLength);
	}
	/** Wrapper method for {@link XmlPullParser#getNamespace()} */
	@Override
	public String getNamespace() {
		return parser.getNamespace();
	}
	/** Wrapper method for {@link XmlPullParser#getName()} */
	@Override
	public String getName() {
		return parser.getName();
	}
	/** Wrapper method for {@link XmlPullParser#getPrefix()} */
	@Override
	public String getPrefix() {
		return parser.getPrefix();
	}
	/** Wrapper method for {@link XmlPullParser#isEmptyElementTag()} */
	@Override
	public boolean isEmptyElementTag() throws XmlPullParserException {
		return parser.isEmptyElementTag();
	}
	/** Wrapper method for {@link XmlPullParser#getAttributeCount()} */
	@Override
	public int getAttributeCount() {
		return parser.getAttributeCount();
	}
	/** Wrapper method for {@link XmlPullParser#getAttributeNamespace(int)} */
	@Override
	public String getAttributeNamespace(int index) {
		return parser.getAttributeNamespace(index);
	}
	/** Wrapper method for {@link XmlPullParser#getAttributeName(int)} */
	@Override
	public String getAttributeName(int index) {
		return parser.getAttributeName(index);
	}
	/** Wrapper method for {@link XmlPullParser#getAttributePrefix(int)} */
	@Override
	public String getAttributePrefix(int index) {
		return parser.getAttributePrefix(index);
	}
	/** Wrapper method for {@link XmlPullParser#getAttributeType(int)} */
	@Override
	public String getAttributeType(int index) {
		return parser.getAttributeType(index);
	}
	/** Wrapper method for {@link XmlPullParser#isAttributeDefault(int)} */
	@Override
	public boolean isAttributeDefault(int index) {
		return parser.isAttributeDefault(index);
	}
	/** Wrapper method for {@link XmlPullParser#getAttributeValue(int)} */
	@Override
	public String getAttributeValue(int index) {
		return parser.getAttributeValue(index);
	}
	/** Wrapper method for {@link XmlPullParser#getAttributeValue(String, String)} */
	@Override
	public String getAttributeValue(String namespace, String name) {
		return parser.getAttributeValue(namespace, name);
	}
	/** Wrapper method for {@link XmlPullParser#getEventType()} */
	@Override
	public int getEventType() throws XmlPullParserException {
		return parser.getEventType();
	}
	/** Wrapper method for {@link XmlPullParser#next()} */
	@Override
	public int next() throws XmlPullParserException, IOException {
		return parser.next();
	}
	/** Wrapper method for {@link XmlPullParser#nextToken()} */
	@Override
	public int nextToken() throws XmlPullParserException, IOException {
		return parser.nextToken();
	}
	/** Wrapper method for {@link XmlPullParser#require(int, String, String)} */
	@Override
	public void require(int type, String namespace, String name)
			throws XmlPullParserException, IOException {
		parser.require(type, namespace, name);
	}
	/** Wrapper method for {@link XmlPullParser#nextTag()} */
	@Override
	public String nextText() throws XmlPullParserException, IOException {
		return parser.nextText();
	}
	/** Wrapper method for {@link XmlPullParser#nextTag()} */
	@Override
	public int nextTag() throws XmlPullParserException, IOException {
		return parser.nextTag();
	}
}


================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/library/AlphaAnimator.java
================================================
/*******************************************************************************
 * Copyright 2014 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.library;

import android.view.View;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation.AnimationListener;
/**
 * AlphaAnimation Helper
 * Just supports fade-in and fade-out
 * @author Wonjun Kim
 *
 */
class AlphaAnimator {
	
	public static void fadein(View view, int duration) {
		fadein(view, duration, null);
	}
	public static void fadein(View view, int duration, AnimationListener listener) {
		animate(view, duration, listener, 0.0f, 1.0f);
	}
	
	public static void fadeout(View view, int duration) {
		fadeout(view, duration, null);
	}
	
	public static void fadeout(View view, int duration, AnimationListener listener) {
		animate(view, duration, listener, 1.0f, 0.0f);
	}
	
	private static void animate(View view, int duration, AnimationListener listener, float fromAlpha, float targetAlpha) {
		// Create new animation
		AlphaAnimation newAnimation = new AlphaAnimation(fromAlpha, targetAlpha);
		
		newAnimation.setDuration(duration);
		// Force fillAfter flag to be true
		newAnimation.setFillAfter(true);
		newAnimation.setAnimationListener(listener);
		// Start fading
		view.startAnimation(newAnimation);
		
	}
}


================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/library/GoogleStyleProgressLayout.java
================================================
/*******************************************************************************
 * Copyright 2014 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.library;

import android.content.Context;
import android.content.res.TypedArray;
import android.view.ViewGroup;
import android.widget.FrameLayout;
/**
 * Abstract class of Google style progress layout
 * You can override this class and implement specific layout, for example, {@see DefaultGoogleStyleProgressLayout}.
 * 
 * @author Wonjun Kim
 *
 */
public abstract class GoogleStyleProgressLayout extends FrameLayout implements IGoogleStyleProgressLayout {
	public GoogleStyleProgressLayout(Context context, TypedArray attrs){
		super(context);
		
	}
	/**
	 * Set Y position of this layout by using margin property.<br /> 
	 * If you don't want to set default y position given by {@code PullToRefreshBase}, you have to this method and customize it.     
	 */
	public void setTopMargin(int height) {
		ViewGroup.LayoutParams params = getLayoutParams();
		if ( params instanceof FrameLayout.LayoutParams ) {
			((FrameLayout.LayoutParams) params).topMargin = height;
		}
	}
	/**
	 * Create a specific {@code LayoutParams}.<br /> 
	 * Pull To Refresh will add this layout with applying this {@code LayoutParams} to the layout     
	 * @return {@code LayoutParams} you implemented
	 */	
	public FrameLayout.LayoutParams createLayoutParams() {
		return GoogleStyleProgressLayout.createDefaultLayoutParams(getContext());
	}
	/**
	 * Create a default specific {@code LayoutParams}.<br /> 
	 * @param Context     
	 * @return Default {@code LayoutParams}  
	 */
	public static FrameLayout.LayoutParams createDefaultLayoutParams(Context context) {
		@SuppressWarnings("deprecation")
		FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
		return params;
	}
}


================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/library/GoogleStyleProgressLayoutFactory.java
================================================
/*******************************************************************************
 * Copyright 2013 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.library;

import java.lang.reflect.Constructor;

import java.lang.reflect.InvocationTargetException;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.Log;
import android.view.View;

import com.handmark.pulltorefresh.configuration.xml.PullToRefreshXmlConfiguration;
import com.handmark.pulltorefresh.library.internal.DefaultGoogleStyleProgressLayout;
import com.handmark.pulltorefresh.library.GoogleStyleProgressLayout;
/**
 * Factory which creates google style progress layouts 
 * <br />Google style progress layouts must be listed in pulltorefresh.xml as "PullToRefresh/GoogleStyleProgressLayouts/layout" nodes
 * @author Wonjun Kim
 */
class GoogleStyleProgressLayoutFactory {

	private static final String LOG_TAG = GoogleStyleProgressLayoutFactory.class
			.getSimpleName();
	/**
	 * Create the class token matched by <b>{@code layoutCode}</b>
	 * @param layoutCode Google style progress layout code, which must be defined in pulltorefresh.xml 
	 * @return Class token which is matched by {@code layoutCode}, or the class token of {@code RotateGoogleStyleProgressLayout} instance if not
	 */
	public static Class<? extends GoogleStyleProgressLayout> createGoogleStyleProgressLayoutClazzByLayoutCode(String layoutCode) {
		String clazzName = PullToRefreshXmlConfiguration.getInstance().getGoogleStyleProgressLayoutClazzName(layoutCode);
		return createGoogleStyleProgressLayoutClazz(clazzName);
	}
	/**
	 * Create a {@code GoogleStyleProgressLayout} instance matched by <b>{@code clazz} token</b> 
	 * @param layoutCode Google style progress layout code, which must be defined in pulltorefresh.xml
	 * @param context 
	 * @return {@code GoogleStyleProgressLayout} instance if the class matched by {@code layoutCode} exists, or {@code RotateGoogleStyleProgressLayout} instance if not  
	 */
	@SuppressWarnings("unchecked")
	public static Class<? extends GoogleStyleProgressLayout> createGoogleStyleProgressLayoutClazz(
			String clazzName) {
		Class<? extends GoogleStyleProgressLayout> googleStyleProgressLayoutClazz = null;
		if ( clazzName == null ) {
			googleStyleProgressLayoutClazz = DefaultGoogleStyleProgressLayoutFactory.createGoogleStyleProgressLayoutClazz(clazzName);
			return googleStyleProgressLayoutClazz;
		}
		
		try {
			googleStyleProgressLayoutClazz = (Class<GoogleStyleProgressLayout>) Class.forName(clazzName);

		} catch (ClassNotFoundException e) {
			Log.e(LOG_TAG,"The google style progress layout you have chosen class has not been found.", e);
			googleStyleProgressLayoutClazz = DefaultGoogleStyleProgressLayoutFactory.createGoogleStyleProgressLayoutClazz(clazzName);
		} 

		return googleStyleProgressLayoutClazz;
	}
	/**
	 * Create a {@code GoogleStyleProgressLayout} instance matched by <b>{@code layoutCode}</b> 
	 * @param layoutCode Google style progress layout code, which must be defined in pulltorefresh.xml
	 * @param context 
	 * @return {@code GoogleStyleProgressLayout} instance if the class matched by {@code layoutCode} exists, or {@code DefaultGoogleStyleProgressLayout} instance if not  
	 */
	public static GoogleStyleProgressLayout createGoogleStyleProgressLayout(String layoutCode, Context context, TypedArray attrs) {
		Class<? extends GoogleStyleProgressLayout> clazz = createGoogleStyleProgressLayoutClazz(layoutCode);
		return createGoogleStyleProgressLayout(clazz, context, attrs);
	}
	/**
	 * Create a {@code GoogleStyleProgressLayout} instance matched by <b>{@code clazz} token</b> 
	 * @param layoutCode Google style progress layout code, which must be defined in pulltorefresh.xml
	 * @param context 
	 * @return {@code GoogleStyleProgressLayout} instance if the class matched by {@code layoutCode} exists, or {@code DefaultGoogleStyleProgressLayout} instance if not  
	 */
	public static GoogleStyleProgressLayout createGoogleStyleProgressLayout(
			Class<? extends GoogleStyleProgressLayout> clazz, Context context, TypedArray attrs) {
		GoogleStyleProgressLayout layout = null;
		// Prevent NullPointerException
		if ( clazz == null ) {
			Log.i(LOG_TAG, "The Class token of the GoogleStyleProgressLayout is missing. Default google style progress layout will be used.");
			clazz = DefaultGoogleStyleProgressLayoutFactory.createGoogleStyleProgressLayoutClazz("");
		}
		
		layout = tryNewInstance(clazz, context, attrs);

		// If trying to create new instance has failed,
		if (layout == null) {
			layout = DefaultGoogleStyleProgressLayoutFactory.createGoogleStyleProgressLayout(clazz, context, attrs);
		}

		layout.setVisibility(View.INVISIBLE);
		return layout;
	}
	private static GoogleStyleProgressLayout tryNewInstance(
			Class<? extends GoogleStyleProgressLayout> clazz, Context context, TypedArray attrs) {
		GoogleStyleProgressLayout layout = null;
		try {
			Constructor<? extends GoogleStyleProgressLayout> constructor = clazz
					.getConstructor(Context.class, TypedArray.class);
			layout = (GoogleStyleProgressLayout) constructor.newInstance(context, attrs);

		} catch (IllegalArgumentException e) {
			Log.e(LOG_TAG, "The google style progress layout has failed to be created. ", e);
		} catch (InvocationTargetException e) {
			Log.e(LOG_TAG, "The google style progress layout has failed to be created. ", e);
		} catch (SecurityException e) {
			Log.e(LOG_TAG, "The google style progress layout has failed to be created. ", e);
		} catch (NoSuchMethodException e) {
			Log.e(LOG_TAG, "The google style progress layout has failed to be created. ", e);
		} catch (InstantiationException e) {
			Log.e(LOG_TAG, "The google style progress layout has failed to be created. ", e);
		} catch (IllegalAccessException e) {
			Log.e(LOG_TAG, "The google style progress layout has failed to be created. ", e);
		} catch (NullPointerException e) {
			Log.e(LOG_TAG, "The google style progress layout has failed to be created. ", e);
		}
		return layout;
	}
	/**
	 * Factory which creates a default google style progress layout instance. This is used when {@code GoogleStyleProgressLayoutFactory} fails to create a instance
	 * @author Wonjun Kim
	 *
	 */
	private static class DefaultGoogleStyleProgressLayoutFactory {
		/**
		 * @param clazzName This class name is being ignored
		 * @return Class token of {@code DefaultGoogleStyleProgressLayout}
		 */
		public static Class<? extends GoogleStyleProgressLayout> createGoogleStyleProgressLayoutClazz(
				String clazzName) {
			return DefaultGoogleStyleProgressLayout.class;
		}
		/**
		 * @param clazz Class token is being ignored.
		 * @param context
		 * @return {@code DefaultGoogleStyleProgressLayout} instance
		 */
		public static GoogleStyleProgressLayout createGoogleStyleProgressLayout(
				Class<? extends GoogleStyleProgressLayout> clazz, Context context, TypedArray attrs) {

			return new DefaultGoogleStyleProgressLayout(context, attrs);
		}

	}

}

================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/library/GoogleStyleViewLayout.java
================================================
/*******************************************************************************
 * Copyright 2014 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.library;

import android.content.Context;
import android.content.res.TypedArray;
import android.view.ViewGroup;
import android.widget.FrameLayout;
/**
 * Abstract class of Google style view layout
 * You can override this class and implement specific layout like {@link LoadingLayout} style.
 * @author Wonjun Kim
 *
 */
public abstract class GoogleStyleViewLayout extends FrameLayout implements IGoogleStyleViewLayout {

	public GoogleStyleViewLayout(Context context, TypedArray attrs) {
		super(context);
	}
	
	public void setHeight(int height) {
		ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) getLayoutParams();
		lp.height = height;
		requestLayout();
	}

	public void setWidth(int width) {
		ViewGroup.LayoutParams lp = (ViewGroup.LayoutParams) getLayoutParams();
		lp.width = width;
		requestLayout();
	}

	public int getContentSize() {
		return getHeight();
	}
}


================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/library/GoogleStyleViewLayoutFactory.java
================================================
/*******************************************************************************
 * Copyright 2013 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.library;

import java.lang.reflect.Constructor;

import java.lang.reflect.InvocationTargetException;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.Log;
import android.view.View;

import com.handmark.pulltorefresh.configuration.xml.PullToRefreshXmlConfiguration;
import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
import com.handmark.pulltorefresh.library.PullToRefreshBase.Orientation;
import com.handmark.pulltorefresh.library.internal.DefaultGoogleStyleViewLayout;
import com.handmark.pulltorefresh.library.GoogleStyleViewLayout;
/**
 * Factory which creates google style view layouts 
 * <br />Google style view layouts must be listed in pulltorefresh.xml as "PullToRefresh/GoogleStyleViewLayouts/layout" nodes
 * @author Wonjun Kim
 */
class GoogleStyleViewLayoutFactory {

	private static final String LOG_TAG = GoogleStyleViewLayoutFactory.class
			.getSimpleName();
	/**
	 * Create the class token matched by <b>{@code layoutCode}</b>
	 * @param layoutCode Google style view layout code, which must be defined in pulltorefresh.xml 
	 * @return Class token which is matched by {@code layoutCode}, or the class token of {@code RotateGoogleStyleViewLayout} instance if not
	 */
	public static Class<? extends GoogleStyleViewLayout> createGoogleStyleViewLayoutClazzByLayoutCode(String layoutCode) {
		String clazzName = PullToRefreshXmlConfiguration.getInstance().getGoogleStyleViewLayoutClazzName(layoutCode);
		return createGoogleStyleViewLayoutClazz(clazzName);
	}
	/**
	 * Create a {@code GoogleStyleViewLayout} instance matched by <b>{@code clazz} token</b> 
	 * @param layoutCode Google style view layout code, which must be defined in pulltorefresh.xml
	 * @param context 
	 * @return {@code GoogleStyleViewLayout} instance if the class matched by {@code layoutCode} exists, or {@code RotateGoogleStyleViewLayout} instance if not  
	 */
	@SuppressWarnings("unchecked")
	public static Class<? extends GoogleStyleViewLayout> createGoogleStyleViewLayoutClazz(
			String clazzName) {
		Class<? extends GoogleStyleViewLayout> googleStyleViewLayoutClazz = null;
		if ( clazzName == null ) {
			googleStyleViewLayoutClazz = DefaultGoogleStyleViewLayoutFactory.createGoogleStyleViewLayoutClazz(clazzName);
			return googleStyleViewLayoutClazz;
		}
		
		try {
			googleStyleViewLayoutClazz = (Class<GoogleStyleViewLayout>) Class.forName(clazzName);

		} catch (ClassNotFoundException e) {
			Log.e(LOG_TAG,"The google style view layout you have chosen class has not been found.", e);
			googleStyleViewLayoutClazz = DefaultGoogleStyleViewLayoutFactory.createGoogleStyleViewLayoutClazz(clazzName);
		} 

		return googleStyleViewLayoutClazz;
	}
	/**
	 * Create a {@code GoogleStyleViewLayout} instance matched by <b>{@code layoutCode}</b> 
	 * @param layoutCode Google style view layout code, which must be defined in pulltorefresh.xml
	 * @param context 
	 * @return {@code GoogleStyleViewLayout} instance if the class matched by {@code layoutCode} exists, or {@code DefaultGoogleStyleViewLayout} instance if not  
	 */
	public static GoogleStyleViewLayout createGoogleStyleViewLayout(String layoutCode, Context context, TypedArray attrs) {
		Class<? extends GoogleStyleViewLayout> clazz = createGoogleStyleViewLayoutClazz(layoutCode);
		return createGoogleStyleViewLayout(clazz, context, attrs);
	}
	/**
	 * Create a {@code GoogleStyleViewLayout} instance matched by <b>{@code clazz} token</b> 
	 * @param layoutCode Google style view layout code, which must be defined in pulltorefresh.xml
	 * @param context 
	 * @return {@code GoogleStyleViewLayout} instance if the class matched by {@code layoutCode} exists, or {@code DefaultGoogleStyleViewLayout} instance if not  
	 */
	public static GoogleStyleViewLayout createGoogleStyleViewLayout(
			Class<? extends GoogleStyleViewLayout> clazz, Context context, TypedArray attrs) {
		GoogleStyleViewLayout layout = null;
		// Prevent NullPointerException
		if ( clazz == null ) {
			Log.i(LOG_TAG, "The Class token of the GoogleStyleViewLayout is missing. Default google style view layout will be used.");
			clazz = DefaultGoogleStyleViewLayoutFactory.createGoogleStyleViewLayoutClazz("");
		}
		
		layout = tryNewInstance(clazz, context, attrs);

		// If trying to create new instance has failed,
		if (layout == null) {
			layout = DefaultGoogleStyleViewLayoutFactory.createGoogleStyleViewLayout(clazz, context, attrs);
		}

		layout.setVisibility(View.INVISIBLE);
		return layout;
	}
	private static GoogleStyleViewLayout tryNewInstance(
			Class<? extends GoogleStyleViewLayout> clazz, Context context, TypedArray attrs) {
		GoogleStyleViewLayout layout = null;
		try {
			Constructor<? extends GoogleStyleViewLayout> constructor = clazz
					.getConstructor(Context.class, TypedArray.class);
			layout = (GoogleStyleViewLayout) constructor.newInstance(context, attrs);

		} catch (IllegalArgumentException e) {
			Log.e(LOG_TAG, "The google style view layout has failed to be created. ", e);
		} catch (InvocationTargetException e) {
			Log.e(LOG_TAG, "The google style view layout has failed to be created. ", e);
		} catch (SecurityException e) {
			Log.e(LOG_TAG, "The google style view layout has failed to be created. ", e);
		} catch (NoSuchMethodException e) {
			Log.e(LOG_TAG, "The google style view layout has failed to be created. ", e);
		} catch (InstantiationException e) {
			Log.e(LOG_TAG, "The google style view layout has failed to be created. ", e);
		} catch (IllegalAccessException e) {
			Log.e(LOG_TAG, "The google style view layout has failed to be created. ", e);
		} catch (NullPointerException e) {
			Log.e(LOG_TAG, "The google style view layout has failed to be created. ", e);
		}
		return layout;
	}
	/**
	 * Factory which creates a default google style view layout instance. This is used when {@code GoogleStyleViewLayoutFactory} fails to create a instance
	 * @author Wonjun Kim
	 *
	 */
	private static class DefaultGoogleStyleViewLayoutFactory {
		/**
		 * @param clazzName This class name is being ignored
		 * @return Class token of {@code DefaultGoogleStyleViewLayout}
		 */
		public static Class<? extends GoogleStyleViewLayout> createGoogleStyleViewLayoutClazz(
				String clazzName) {
			return DefaultGoogleStyleViewLayout.class;
		}
		/**
		 * @param clazz Class token is being ignored.
		 * @param context
		 * @return {@code DefaultGoogleStyleViewLayout} instance
		 */
		public static GoogleStyleViewLayout createGoogleStyleViewLayout(
				Class<? extends GoogleStyleViewLayout> clazz, Context context, TypedArray attrs) {

			return new DefaultGoogleStyleViewLayout(context, attrs);
		}

	}

}


================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/library/IGoogleStyleProgressLayout.java
================================================
/*******************************************************************************
 * Copyright 2014 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.library;
/**
 * Marker interface for Google style progress layout
 * @author Wonjun Kim
 *
 */
public interface IGoogleStyleProgressLayout extends IPullToRefreshConsumer {

}


================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/library/IGoogleStyleViewLayout.java
================================================
/*******************************************************************************
 * Copyright 2014 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.library;
/**
 * Marker interface for Google style progress layout
 * @author Wonjun Kim
 *
 */
public interface IGoogleStyleViewLayout extends IPullToRefreshConsumer {

}


================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/library/IIndicatorLayout.java
================================================
/*******************************************************************************
 * Copyright 2013 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.library;

import com.handmark.pulltorefresh.library.internal.IndicatorLayout;

/**
 * Indicator layout which react pulling or releasing of Pull To Refresh
 * <br />
 * NOTE : To make new Indicator layout, You have to override {@link IndicatorLayout} instead of IIndicatorLayout. 
 * <br /> Because {@link PullToRefreshAdapterViewBase} uses indicator layouts as a kind of View component. {@link IndicatorLayout} is a descendant class of {@code View}.
 * 
 * @author Wonjun Kim
 */
public interface IIndicatorLayout {
	/**
	 * Show the Indicator Layout 
	 */
	public void show();
	/**
	 * Hide the Indicator Layout 
	 */
	public void hide();
	/**
	 * Check whether this indicator layout is being shown or not
	 * @return true if the indicator layout is visible now 
	 */
	public boolean isVisible();
	/**
	 * Make a Action when "PullToRefresh" event has been fired
	 */
	public void pullToRefresh();
	/**
	 * Make a Action when "ReleaseToRefresh" event has been fired
	 */
	public void releaseToRefresh();
}


================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/library/ILoadingLayout.java
================================================
/*******************************************************************************
 * Copyright 2011, 2012 Chris Banes.
 * Copyright 2013 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.library;

import android.graphics.Typeface;
import android.graphics.drawable.Drawable;

public interface ILoadingLayout {

	/**
	 * Set the Last Updated Text. This displayed under the main label when
	 * Pulling
	 * 
	 * @param label - Label to set
	 */
	public void setLastUpdatedLabel(CharSequence label);

	/**
	 * Set the drawable used in the loading layout. This is the same as calling
	 * <code>setLoadingDrawable(drawable, Mode.BOTH)</code>
	 * 
	 * @param drawable - Drawable to display
	 */
	public void setLoadingDrawable(Drawable drawable);

	/**
	 * Set Text to show when the Widget is being Pulled
	 * <code>setPullLabel(releaseLabel, Mode.BOTH)</code>
	 * 
	 * @param pullLabel - CharSequence to display
	 */
	public void setPullLabel(CharSequence pullLabel);

	/**
	 * Set Text to show when the Widget is refreshing
	 * <code>setRefreshingLabel(releaseLabel, Mode.BOTH)</code>
	 * 
	 * @param refreshingLabel - CharSequence to display
	 */
	public void setRefreshingLabel(CharSequence refreshingLabel);

	/**
	 * Set Text to show when the Widget is being pulled, and will refresh when
	 * released. This is the same as calling
	 * <code>setReleaseLabel(releaseLabel, Mode.BOTH)</code>
	 * 
	 * @param releaseLabel - CharSequence to display
	 */
	public void setReleaseLabel(CharSequence releaseLabel);

	/**
	 * Set's the Sets the typeface and style in which the text should be
	 * displayed. Please see
	 * {@link android.widget.TextView#setTypeface(Typeface)
	 * TextView#setTypeface(Typeface)}.
	 */
	public void setTextTypeface(Typeface tf);

}


================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/library/IPullToRefresh.java
================================================
/*******************************************************************************
 * Copyright 2011, 2012 Chris Banes.
 * Copyright 2013 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.library;

import android.view.View;
import android.view.animation.Interpolator;

import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnPullEventListener;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;
import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener2;
import com.handmark.pulltorefresh.library.PullToRefreshBase.State;

public interface IPullToRefresh<T extends View> {

	/**
	 * Demos the Pull-to-Refresh functionality to the user so that they are
	 * aware it is there. This could be useful when the user first opens your
	 * app, etc. The animation will only happen if the Refresh View (ListView,
	 * ScrollView, etc) is in a state where a Pull-to-Refresh could occur by a
	 * user's touch gesture (i.e. scrolled to the top/bottom).
	 * 
	 * @return true - if the Demo has been started, false if not.
	 */
	@Deprecated
	public boolean demo();

	/**
	 * Get the mode that this view is currently in. This is only really useful
	 * when using <code>Mode.BOTH</code>.
	 * 
	 * @return Mode that the view is currently in
	 */
	public Mode getCurrentMode();

	/**
	 * Returns whether the Touch Events are filtered or not. If true is
	 * returned, then the View will only use touch events where the difference
	 * in the Y-axis is greater than the difference in the X-axis. This means
	 * that the View will not interfere when it is used in a horizontal
	 * scrolling View (such as a ViewPager).
	 * 
	 * @return boolean - true if the View is filtering Touch Events
	 */
	public boolean getFilterTouchEvents();

	/**
	 * Returns a proxy object which allows you to call methods on all of the
	 * LoadingLayouts (the Views which show when Pulling/Refreshing).
	 * <p />
	 * You should not keep the result of this method any longer than you need
	 * it.
	 * 
	 * @return Object which will proxy any calls you make on it, to all of the
	 *         LoadingLayouts.
	 */
	public ILoadingLayout getLoadingLayoutProxy();

	/**
	 * Returns a proxy object which allows you to call methods on the
	 * LoadingLayouts (the Views which show when Pulling/Refreshing). The actual
	 * LoadingLayout(s) which will be affected, are chosen by the parameters you
	 * give.
	 * <p />
	 * You should not keep the result of this method any longer than you need
	 * it.
	 * 
	 * @param includeStart - Whether to include the Start/Header Views
	 * @param includeEnd - Whether to include the End/Footer Views
	 * @return Object which will proxy any calls you make on it, to the
	 *         LoadingLayouts included.
	 */
	public ILoadingLayout getLoadingLayoutProxy(boolean includeStart, boolean includeEnd);

	/**
	 * Get the mode that this view has been set to. If this returns
	 * <code>Mode.BOTH</code>, you can use <code>getCurrentMode()</code> to
	 * check which mode the view is currently in
	 * 
	 * @return Mode that the view has been set to
	 */
	public Mode getMode();

	/**
	 * Get the Wrapped Refreshable View. Anything returned here has already been
	 * added to the content view.
	 * 
	 * @return The View which is currently wrapped
	 */
	public T getRefreshableView();

	/**
	 * Get whether the 'Refreshing' View should be automatically shown when
	 * refreshing. Returns true by default.
	 * 
	 * @return - true if the Refreshing View will be show
	 */
	public boolean getShowViewWhileRefreshing();

	/**
	 * @return - The state that the View is currently in.
	 */
	public State getState();

	/**
	 * Whether Pull-to-Refresh is enabled
	 * 
	 * @return enabled
	 */
	public boolean isPullToRefreshEnabled();

	/**
	 * Gets whether Overscroll support is enabled. This is different to
	 * Android's standard Overscroll support (the edge-glow) which is available
	 * from GINGERBREAD onwards
	 * 
	 * @return true - if both PullToRefresh-OverScroll and Android's inbuilt
	 *         OverScroll are enabled
	 */
	public boolean isPullToRefreshOverScrollEnabled();

	/**
	 * Returns whether the Widget is currently in the Refreshing mState
	 * 
	 * @return true if the Widget is currently refreshing
	 */
	public boolean isRefreshing();

    /**
     * Stops the current refreshing view when the user needs to stop.
     * This method is only an alias to onRefreshComplete.
     *
     * */
    public void stopRefreshing();

	/**
	 * Returns whether the widget has enabled scrolling on the Refreshable View
	 * while refreshing.
	 * 
	 * @return true if the widget has enabled scrolling while refreshing
	 */
	public boolean isScrollingWhileRefreshingEnabled();

	/**
	 * Mark the current Refresh as complete. Will Reset the UI and hide the
	 * Refreshing View
	 */
	public void onRefreshComplete();

	/**
	 * Set the Touch Events to be filtered or not. If set to true, then the View
	 * will only use touch events where the difference in the Y-axis is greater
	 * than the difference in the X-axis. This means that the View will not
	 * interfere when it is used in a horizontal scrolling View (such as a
	 * ViewPager), but will restrict which types of finger scrolls will trigger
	 * the View.
	 * 
	 * @param filterEvents - true if you want to filter Touch Events. Default is
	 *            true.
	 */
	public void setFilterTouchEvents(boolean filterEvents);

	/**
	 * Set the mode of Pull-to-Refresh that this view will use.
	 * 
	 * @param mode - Mode to set the View to
	 */
	public void setMode(Mode mode);

	/**
	 * Set OnPullEventListener for the Widget
	 * 
	 * @param listener - Listener to be used when the Widget has a pull event to
	 *            propogate.
	 */
	public void setOnPullEventListener(OnPullEventListener<T> listener);

	/**
	 * Set OnRefreshListener for the Widget
	 * 
	 * @param listener - Listener to be used when the Widget is set to Refresh
	 */
	public void setOnRefreshListener(OnRefreshListener<T> listener);

	/**
	 * Set OnRefreshListener for the Widget
	 * 
	 * @param listener - Listener to be used when the Widget is set to Refresh
	 */
	public void setOnRefreshListener(OnRefreshListener2<T> listener);

	/**
	 * Sets whether Overscroll support is enabled. This is different to
	 * Android's standard Overscroll support (the edge-glow). This setting only
	 * takes effect when running on device with Android v2.3 or greater.
	 * 
	 * @param enabled - true if you want Overscroll enabled
	 */
	public void setPullToRefreshOverScrollEnabled(boolean enabled);

	/**
	 * Sets the Widget to be in the refresh state. The UI will be updated to
	 * show the 'Refreshing' view, and be scrolled to show such.
	 */
	public void setRefreshing();

	/**
	 * Sets the Widget to be in the refresh state. The UI will be updated to
	 * show the 'Refreshing' view.
	 * 
	 * @param doScroll - true if you want to force a scroll to the Refreshing
	 *            view.
	 */
	public void setRefreshing(boolean doScroll);

	/**
	 * Sets the Animation Interpolator that is used for animated scrolling.
	 * Defaults to a DecelerateInterpolator
	 * 
	 * @param interpolator - Interpolator to use
	 */
	public void setScrollAnimationInterpolator(Interpolator interpolator);

	/**
	 * By default the Widget disables scrolling on the Refreshable View while
	 * refreshing. This method can change this behaviour.
	 * 
	 * @param scrollingWhileRefreshingEnabled - true if you want to enable
	 *            scrolling while refreshing
	 */
	public void setScrollingWhileRefreshingEnabled(boolean scrollingWhileRefreshingEnabled);

	/**
	 * A mutator to enable/disable whether the 'Refreshing' View should be
	 * automatically shown when refreshing.
	 * 
	 * @param showView
	 */
	public void setShowViewWhileRefreshing(boolean showView);

}

================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/library/IPullToRefreshConsumer.java
================================================
/*******************************************************************************
 * Copyright 2014 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.library;
/**
 * Interface for communations with {@code PullToRefreshBase} 
 * @author Wonjun Kim
 *
 */
public interface IPullToRefreshConsumer {
	void reset();
	void refreshing();
	void releaseToRefresh();
	void pullToRefresh();
	void onPull(float scale);
}


================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/library/IndicatorLayoutFactory.java
================================================
/*******************************************************************************
 * Copyright 2013 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.library;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

import android.content.Context;
import android.util.Log;
import android.view.View;

import com.handmark.pulltorefresh.configuration.xml.PullToRefreshXmlConfiguration;
import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
import com.handmark.pulltorefresh.library.internal.IndicatorLayout;
import com.handmark.pulltorefresh.library.internal.DefaultIndicatorLayout;
import com.handmark.pulltorefresh.library.internal.Utils;
/**
 * Factory which creates indicator layouts 
 * <br />Indicator layouts must be listed in pulltorefresh.xml as "PullToRefresh/IndicatorLayouts/layout" nodes
 * @author Wonjun Kim
 */
public class IndicatorLayoutFactory {

	private static final String LOG_TAG = IndicatorLayoutFactory.class.getName();
	/**
	 * Create the class token matched by <b>{@code layoutCode}</b>
	 * @param layoutCode Indicator layout code, which must be defined in pulltorefresh.xml 
	 * @return Class token which is matched by {@code layoutCode}, or the class token of {@code DefaultIndicatorLayout} instance if not
	 */
	public static Class<? extends IndicatorLayout> createIndicatorLayoutClazzByLayoutCode(String layoutCode) {
		String clazzName = PullToRefreshXmlConfiguration.getInstance().getIndicatorLayoutClazzName(layoutCode);
		return createIndicatorLayoutClazz(clazzName);
	}
	/**
	 * Create the class token matched by <b>class name</b>
	 * @param clazzName Class name such as "com.handmark.pulltorefresh.library.internal.DefaultIndicatorLayout"
	 * @return Class token if the class matched by class name exists, or the class token of {@code DefaultIndicatorLayout} instance if not  
	 */
	@SuppressWarnings("unchecked")
	public static Class<? extends IndicatorLayout> createIndicatorLayoutClazz(String clazzName) {
		Class<? extends IndicatorLayout> clazz = null;
		if (clazzName == null) {
			clazz = DefaultIndicatorLayoutFactory.createIndicatorLayoutClazz(clazzName);
			return clazz;
		}
		
 		try {
			clazz = (Class<? extends IndicatorLayout> )Class.forName(clazzName);
			
		} catch (ClassNotFoundException e) {
			Log.e(LOG_TAG, "The indicator layout you have chosen class has not been found.", e);
			clazz = DefaultIndicatorLayoutFactory.createIndicatorLayoutClazz(clazzName);
			
		}
		
		return clazz;
	}
	/**
	 * Create a {@code IndicatorLayout} instance matched by <b>{@code layoutCode}</b> 
	 * @param layoutCode Indicator layout code, which must be defined in pulltorefresh.xml
	 * @param context 
	 * @param mode 
	 * @return {@code IndicatorLayout} instance if the class matched by {@code layoutCode} exists, or {@code DefaultIndicatorLayout} instance if not  
	 */
	public static IndicatorLayout createIndicatorLayout(String layoutCode, Context context, PullToRefreshBase.Mode mode) {
		Class<? extends IndicatorLayout> clazz = createIndicatorLayoutClazz(layoutCode);
		return createIndicatorLayout(clazz, context, mode);
	}
	/**
	 * Create a {@code IndicatorLayout} instance matched by <b>{@code clazz} token</b> 
	 * @param clazz Indicator layout class token, which must be defined in pulltorefresh.xml
	 * @param context 
	 * @param mode 
	 * @return {@code IndicatorLayout} instance if the class matched by {@code layoutCode} exists, or {@code DefaultIndicatorLayout} instance if not  
	 */
	public static IndicatorLayout createIndicatorLayout(
			Class<? extends IndicatorLayout> clazz, Context context, Mode mode) {
		IndicatorLayout layout = null;
		// Prevent NullPointerException 
		if ( clazz == null ) {
			Log.i(LOG_TAG, "The Class token of the Indicator Layout is missing. Default Indicator Layout will be used.");
			clazz = DefaultIndicatorLayoutFactory.createIndicatorLayoutClazz("");
		}
		
		layout = tryNewInstance(clazz, context, mode);
		
		// If trying to create new instance has failed,
		if (layout == null) {
			layout = DefaultIndicatorLayoutFactory.createIndicatorLayout(clazz, context, mode);
		}

		layout.setVisibility(View.INVISIBLE);
		return layout;
	}
	
	private static IndicatorLayout tryNewInstance(
			Class<? extends IndicatorLayout> clazz, Context context, Mode mode) {
		IndicatorLayout layout = null;
		try {
			Constructor<? extends IndicatorLayout> constructor = clazz
					.getConstructor(Context.class, Mode.class);
			layout = (IndicatorLayout) constructor.newInstance(context, mode);

		} catch (IllegalArgumentException e) {
			Log.e(LOG_TAG, "The indicator layout has failed to be created. ", e);
		} catch (InvocationTargetException e) {
			Log.e(LOG_TAG, "The indicator layout has failed to be created. ", e);
		} catch (SecurityException e) {
			Log.e(LOG_TAG, "The indicator layout has failed to be created. ", e);
		} catch (NoSuchMethodException e) {
			Log.e(LOG_TAG, "The indicator layout has failed to be created. ", e);
		} catch (InstantiationException e) {
			Log.e(LOG_TAG, "The indicator layout has failed to be created. ", e);
		} catch (IllegalAccessException e) {
			Log.e(LOG_TAG, "The indicator layout has failed to be created. ", e);
		} catch (NullPointerException e) {
			Log.e(LOG_TAG, "The indicator layout has failed to be created. ", e);
		}
		
		return layout;
	}	
	/**
	 * Factory which creates a default indicator layout instance. This is used when {@code IndicatorLayoutFactory} fails to create a instance
	 * @author Wonjun Kim
	 *
	 */
	private static class DefaultIndicatorLayoutFactory {
		/**
		 * @param clazzName This class name is being ignored
		 * @return Class token of {@code DefaultIndicatorLayout}
		 */
		public static Class<? extends IndicatorLayout> createIndicatorLayoutClazz(String clazzName) {
			return DefaultIndicatorLayout.class;
		}
		/**
		 * @param clazz Class token is being ignored.
		 * @param context
		 * @param mode
		 * @return {@code DefaultIndicatorLayout} instance
		 */
		public static IndicatorLayout createIndicatorLayout(Class<? extends IndicatorLayout> clazz, Context context, PullToRefreshBase.Mode mode) {
			return new DefaultIndicatorLayout(context, mode);
		}
	}
}


================================================
FILE: library/src/main/java/com/handmark/pulltorefresh/library/LoadingLayoutFactory.java
================================================
/*******************************************************************************
 * Copyright 2013 Naver Business Platform Corp.
 * 
 * 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.handmark.pulltorefresh.library;

import java.lang.reflect.Constructor;

import java.lang.reflect.InvocationTargetException;

import android.content.Context;
import android.content.res.TypedArray;
import android.util.Log;
import android.view.View;

import com.handmark.pulltorefresh.configuration.xml.PullToRefreshXmlConfiguration;
import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
import com.handmark.pulltorefresh.library.PullToRefreshBase.Orientation;
import com.handmark.pulltorefresh.library.internal.RotateLoadingLayout;
import com.handmark.pulltorefresh.library.internal.LoadingLayout;
/**
 * Factory which creates loading layouts 
 * <br />Loading layouts must be listed in pulltorefresh.xml as "PullToRefresh/LoadingLayouts/layout" nodes
 * @author Wonjun Kim
 */
class LoadingLayoutFactory {

	private static final String LOG_TAG = LoadingLayoutFactory.class
			.getSimpleName();
	/**
	 * Create the class token matched by <b>{@code layoutCode}</b>
	 * @param layoutCode Loading layout code, which must be defined in pulltorefresh.xml 
	 * @return Class token which is matched by {@code layoutCode}, or the class token of {@code RotateLoadingLayout} instance if not
	 */
	public static Class<? extends LoadingLayout> createLoadingLayoutClazzByLayoutCode(String layoutCode) {
		String clazzName = PullToRefreshXmlConfiguration.getInstance().getLoadingLayoutClazzName(layoutCode);
		return createLoadingLayoutClazz(clazzName);
	}
	/**
	 * Create a {@code LoadingLayout} instance matched by <b>{@code clazz} token</b> 
	 * @param layoutCode Loading layout code, which must be defined in pulltorefresh.xml
	 * @param context 
	 * @param mode 
	 * @return {@code LoadingLayout} instance if the class matched by {@code layoutCode} exists, or {@code RotateLoadingLayout} instance if not  
	 */
	@SuppressWarnings("unchecked")
	public static Class<? extends LoadingLayout> createLoadingLayoutClazz(
			String clazzName) {
		Class<? extends LoadingLayout> loadingLayoutClazz = null;
		if ( clazzName == null ) {
			loadingLayoutClazz = DefaultLoadingLayoutFactory.createLoadingLayoutClazz(clazzName);
			return loadingLayoutClazz;
		}
		
		try {
			loadingLayoutClazz = (Class<LoadingLayout>) Class.forName(clazzName);

		} catch (ClassNotFoundException e) {
			Log.e(LOG_TAG,"The loading layout you have chosen class has not been found.", e);
			loadingLayoutClazz = DefaultLoadingLayoutFactory.createLoadingLayoutClazz(clazzName);
		} 

		return loadingLayoutClazz;
	}
	/**
	 * Create a {@code LoadingLayout} instance matched by <b>{@code layoutCode}</b> 
	 * @param layoutCode Loading layout code, which must be defined in pulltorefresh.xml
	 * @param context 
	 * @param mode 
	 * @return {@code LoadingLayout} instance if the class matched by {@code layoutCode} exists, or {@code RotateLoadingLayout} instance if not  
	 */
	public static LoadingLayout createLoadingLayout(String layoutCode, Context context, Mode mode,
			Orientation orientation, TypedArray attrs) {
		Class<? extends LoadingLayout> clazz = createLoadingLayoutClazz(layoutCode);
		return createLoadingLayout(clazz, context, mode, orientation, attrs);
	}
	/**
	 * Create a {@code LoadingLayout} instance matched by <b>{@code clazz} token</b> 
	 * @param layoutCode Loading layout code, which must be defined in pulltorefresh.xml
	 * @param context 
	 * @param mode 
	 * @return {@code LoadingLayout} instance if the class matched by {@code layoutCode} exists, or {@code RotateLoadingLayout} instance if not  
	 */
	public static LoadingLayout createLoadingLayout(
			Class<? extends LoadingLayout> clazz, Context context, Mode mode,
			Orientation orientation, TypedArray attrs) {
		LoadingLayout layout = null;
		// Prevent NullPointerException
		if ( clazz == null ) {
			Log.i(LOG_TAG, "The Class token of the Loading Layout is missing. Default Loading Layout will be used.");
			clazz = DefaultLoadingLayoutFactory.createLoadingLayoutClazz("");
		}
		
		layout = tryNewInstance(clazz, context, mode, orientation, attrs);

		// If trying to create new instance has failed,
		if (layout == null) {
			layout = DefaultLoadingLayoutFactory.createLoadingLayout(clazz, context, mode, orientation, attrs);
		}

		layout.setVisibility(View.INVISIBLE);
		return layout;
	}
	private static LoadingLayout tryNewInstance(
			Class<? extends LoadingLayout> clazz, Context context, Mode mode,
			Orientation orient
Download .txt
gitextract_lf3pz0t7/

├── .gitignore
├── LICENSE
├── README.md
├── build.gradle
├── downloads/
│   └── sample-3.0.0.apk
├── extras/
│   ├── PullToRefreshListFragment/
│   │   ├── AndroidManifest.xml
│   │   ├── LICENSE
│   │   ├── build.gradle
│   │   ├── libs/
│   │   │   └── android-support-v4.jar
│   │   ├── pom.xml
│   │   ├── project.properties
│   │   ├── res/
│   │   │   └── layout/
│   │   │       └── need_this_for_maven.xml
│   │   └── src/
│   │       └── com/
│   │           └── handmark/
│   │               └── pulltorefresh/
│   │                   └── extras/
│   │                       └── listfragment/
│   │                           ├── PullToRefreshBaseListFragment.java
│   │                           ├── PullToRefreshExpandableListFragment.java
│   │                           └── PullToRefreshListFragment.java
│   ├── PullToRefreshViewPager/
│   │   ├── AndroidManifest.xml
│   │   ├── ant.properties
│   │   ├── build.gradle
│   │   ├── libs/
│   │   │   └── android-support-v4.jar
│   │   ├── pom.xml
│   │   ├── proguard-project.txt
│   │   ├── project.properties
│   │   ├── res/
│   │   │   ├── layout/
│   │   │   │   └── need_this_for_maven.xml
│   │   │   └── values/
│   │   │       └── ids.xml
│   │   └── src/
│   │       └── com/
│   │           └── handmark/
│   │               └── pulltorefresh/
│   │                   └── extras/
│   │                       └── viewpager/
│   │                           └── PullToRefreshViewPager.java
│   └── pom.xml
├── gradle.properties
├── library/
│   ├── AndroidManifest.xml
│   ├── LICENSE
│   ├── build.gradle
│   ├── pom.xml
│   ├── project.properties
│   ├── res/
│   │   ├── anim/
│   │   │   ├── slide_in_from_bottom.xml
│   │   │   ├── slide_in_from_top.xml
│   │   │   ├── slide_out_to_bottom.xml
│   │   │   └── slide_out_to_top.xml
│   │   ├── drawable/
│   │   │   ├── indicator_bg_bottom.xml
│   │   │   ├── indicator_bg_top.xml
│   │   │   ├── progress_horizontal_holo_light.xml
│   │   │   ├── progress_horizontal_holo_light_right.xml
│   │   │   └── progress_indeterminate_horizontal_holo.xml
│   │   ├── layout/
│   │   │   ├── pull_to_refresh_header_google_style.xml
│   │   │   ├── pull_to_refresh_header_horizontal.xml
│   │   │   ├── pull_to_refresh_header_vertical.xml
│   │   │   ├── pull_to_refresh_progress_google_style.xml
│   │   │   └── pulling_progress_layout.xml
│   │   ├── values/
│   │   │   ├── attrs.xml
│   │   │   ├── dimens.xml
│   │   │   ├── ids.xml
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-ar/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-cs/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-de/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-es/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-fi/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-fr/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-he/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-it/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-iw/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-ja/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-ko/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-nl/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-pl/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-pt/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-pt-rBR/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-ro/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-ru/
│   │   │   └── pull_refresh_strings.xml
│   │   ├── values-zh/
│   │   │   └── pull_refresh_strings.xml
│   │   └── xml/
│   │       └── pulltorefresh.xml
│   └── src/
│       └── main/
│           └── java/
│               └── com/
│                   └── handmark/
│                       └── pulltorefresh/
│                           ├── configuration/
│                           │   └── xml/
│                           │       ├── ExtendedXmlConfigParserFactory.java
│                           │       ├── PullToRefreshConfigXmlParser.java
│                           │       ├── PullToRefreshNode.java
│                           │       ├── PullToRefreshXmlConfiguration.java
│                           │       ├── XmlPullNode.java
│                           │       ├── XmlPullNodeParser.java
│                           │       └── XmlPullParserWrapper.java
│                           └── library/
│                               ├── AlphaAnimator.java
│                               ├── GoogleStyleProgressLayout.java
│                               ├── GoogleStyleProgressLayoutFactory.java
│                               ├── GoogleStyleViewLayout.java
│                               ├── GoogleStyleViewLayoutFactory.java
│                               ├── IGoogleStyleProgressLayout.java
│                               ├── IGoogleStyleViewLayout.java
│                               ├── IIndicatorLayout.java
│                               ├── ILoadingLayout.java
│                               ├── IPullToRefresh.java
│                               ├── IPullToRefreshConsumer.java
│                               ├── IndicatorLayoutFactory.java
│                               ├── LoadingLayoutFactory.java
│                               ├── LoadingLayoutProxy.java
│                               ├── OverscrollHelper.java
│                               ├── PullToRefreshAdapterViewBase.java
│                               ├── PullToRefreshBase.java
│                               ├── PullToRefreshExpandableListView.java
│                               ├── PullToRefreshGridView.java
│                               ├── PullToRefreshHorizontalScrollView.java
│                               ├── PullToRefreshListView.java
│                               ├── PullToRefreshScrollView.java
│                               ├── PullToRefreshWebView.java
│                               ├── extras/
│                               │   ├── PullToRefreshWebView2.java
│                               │   └── SoundPullEventListener.java
│                               └── internal/
│                                   ├── AbstractDefaultGoogleStyleViewLayout.java
│                                   ├── Assert.java
│                                   ├── DefaultGoogleStyleProgressLayout.java
│                                   ├── DefaultGoogleStyleViewLayout.java
│                                   ├── DefaultIndicatorLayout.java
│                                   ├── EmptyViewMethodAccessor.java
│                                   ├── FlipLoadingLayout.java
│                                   ├── FlippedProgressBar.java
│                                   ├── IndicatorLayout.java
│                                   ├── LoadingLayout.java
│                                   ├── PullingProgressLayout.java
│                                   ├── RotateLoadingLayout.java
│                                   ├── Utils.java
│                                   └── ViewCompat.java
├── pom.xml
├── sample/
│   ├── AndroidManifest.xml
│   ├── LICENSE
│   ├── assets/
│   │   ├── ptr_webview2_sample.html
│   │   └── pulltorefresh.xml
│   ├── libs/
│   │   └── android-support-v4.jar
│   ├── pom.xml
│   ├── project.properties
│   ├── res/
│   │   ├── layout/
│   │   │   ├── activity_ptr_custom_loadinglayout.xml
│   │   │   ├── activity_ptr_expandable_list.xml
│   │   │   ├── activity_ptr_grid.xml
│   │   │   ├── activity_ptr_horizontalscrollview.xml
│   │   │   ├── activity_ptr_list.xml
│   │   │   ├── activity_ptr_list_fragment.xml
│   │   │   ├── activity_ptr_list_in_vp.xml
│   │   │   ├── activity_ptr_scrollview.xml
│   │   │   ├── activity_ptr_viewpager.xml
│   │   │   ├── activity_ptr_webview.xml
│   │   │   ├── activity_ptr_webview2.xml
│   │   │   └── layout_listview_in_viewpager.xml
│   │   └── values/
│   │       ├── strings.xml
│   │       └── styles.xml
│   └── src/
│       └── com/
│           └── handmark/
│               └── pulltorefresh/
│                   └── samples/
│                       ├── LauncherActivity.java
│                       ├── PullToRefreshCustomLoadingLayoutActivity.java
│                       ├── PullToRefreshExpandableListActivity.java
│                       ├── PullToRefreshGridActivity.java
│                       ├── PullToRefreshHorizontalScrollViewActivity.java
│                       ├── PullToRefreshListActivity.java
│                       ├── PullToRefreshListFragmentActivity.java
│                       ├── PullToRefreshListInViewPagerActivity.java
│                       ├── PullToRefreshScrollViewActivity.java
│                       ├── PullToRefreshViewPagerActivity.java
│                       ├── PullToRefreshWebView2Activity.java
│                       ├── PullToRefreshWebViewActivity.java
│                       └── loadinglayout/
│                           └── CustomLoadingLayout.java
└── settings.gradle
Download .txt
SYMBOL INDEX (798 symbols across 63 files)

FILE: extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshBaseListFragment.java
  class PullToRefreshBaseListFragment (line 28) | abstract class PullToRefreshBaseListFragment<T extends PullToRefreshBase...
    method onCreateView (line 32) | @Override
    method getPullToRefreshListView (line 51) | public final T getPullToRefreshListView() {
    method onCreatePullToRefreshListView (line 66) | protected abstract T onCreatePullToRefreshListView(LayoutInflater infl...

FILE: extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshExpandableListFragment.java
  class PullToRefreshExpandableListFragment (line 39) | public class PullToRefreshExpandableListFragment extends PullToRefreshBa...
    method onCreatePullToRefreshListView (line 41) | protected PullToRefreshExpandableListView onCreatePullToRefreshListVie...

FILE: extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshListFragment.java
  class PullToRefreshListFragment (line 38) | public class PullToRefreshListFragment extends PullToRefreshBaseListFrag...
    method onCreatePullToRefreshListView (line 40) | protected PullToRefreshListView onCreatePullToRefreshListView(LayoutIn...

FILE: extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/extras/viewpager/PullToRefreshViewPager.java
  class PullToRefreshViewPager (line 25) | public class PullToRefreshViewPager extends PullToRefreshBase<ViewPager> {
    method PullToRefreshViewPager (line 27) | public PullToRefreshViewPager(Context context) {
    method PullToRefreshViewPager (line 31) | public PullToRefreshViewPager(Context context, AttributeSet attrs) {
    method getPullToRefreshScrollDirection (line 35) | @Override
    method createRefreshableView (line 40) | @Override
    method isReadyForPullStart (line 47) | @Override
    method isReadyForPullEnd (line 59) | @Override

FILE: library/src/main/java/com/handmark/pulltorefresh/configuration/xml/ExtendedXmlConfigParserFactory.java
  class ExtendedConfigXmlParserFactory (line 33) | class ExtendedConfigXmlParserFactory {
    method createParser (line 49) | public static XmlPullParser createParser(Context context) {

FILE: library/src/main/java/com/handmark/pulltorefresh/configuration/xml/PullToRefreshConfigXmlParser.java
  class PullToRefreshConfigXmlParser (line 30) | final class PullToRefreshConfigXmlParser extends XmlPullNodeParser<PullT...
    method PullToRefreshConfigXmlParser (line 42) | public PullToRefreshConfigXmlParser(XmlPullParserWrapper parser) {
    method init (line 49) | private XmlPullNode init() {
    method generateRootNode (line 77) | @Override
    method getResult (line 84) | @Override
    class PullToRefreshResult (line 93) | private static class PullToRefreshResult {
    class LayoutNodeCallback (line 105) | private static class LayoutNodeCallback implements XmlPullNode.XmlPull...
      method LayoutNodeCallback (line 113) | public LayoutNodeCallback(Map<String, String> layoutClazzNameMap) {
      method process (line 120) | @Override

FILE: library/src/main/java/com/handmark/pulltorefresh/configuration/xml/PullToRefreshNode.java
  class PullToRefreshNode (line 26) | class PullToRefreshNode {
    method PullToRefreshNode (line 57) | public PullToRefreshNode(Map<String, String> loadingLayoutClazzNameMap,
    method getIndicatorLayoutClazzName (line 70) | public String getIndicatorLayoutClazzName(String layoutCode) {
    method getLoadingLayoutClazzName (line 77) | public String getLoadingLayoutClazzName(String layoutCode) {
    method getGoogleStyleViewLayoutClazzName (line 84) | public String getGoogleStyleViewLayoutClazzName(String layoutCode) {
    method getGoogleStyleProgressLayoutClazzName (line 91) | public String getGoogleStyleProgressLayoutClazzName(String layoutCode) {
    method extendProperties (line 98) | public void extendProperties(PullToRefreshNode extendedNode) {

FILE: library/src/main/java/com/handmark/pulltorefresh/configuration/xml/PullToRefreshXmlConfiguration.java
  class PullToRefreshXmlConfiguration (line 36) | public class PullToRefreshXmlConfiguration {
    class InstanceHolder (line 44) | private static class InstanceHolder {
      method getInstance (line 47) | private static PullToRefreshXmlConfiguration getInstance() {
    method PullToRefreshXmlConfiguration (line 67) | private PullToRefreshXmlConfiguration() {}
    method getInstance (line 72) | public static PullToRefreshXmlConfiguration getInstance() {
    method init (line 83) | public void init(Context context) {
    method getLoadingLayoutClazzName (line 120) | public String getLoadingLayoutClazzName(String layoutCode) {
    method getIndicatorLayoutClazzName (line 131) | public String getIndicatorLayoutClazzName(String layoutCode) {
    method getGoogleStyleViewLayoutClazzName (line 142) | public String getGoogleStyleViewLayoutClazzName(String layoutCode) {
    method getGoogleStyleProgressLayoutClazzName (line 153) | public String getGoogleStyleProgressLayoutClazzName(String layoutCode) {
    method isNodeNull (line 163) | private boolean isNodeNull() {
    method notInitialized (line 169) | private boolean notInitialized() {
    method assertInitialized (line 175) | private void assertInitialized() {

FILE: library/src/main/java/com/handmark/pulltorefresh/configuration/xml/XmlPullNode.java
  class XmlPullNode (line 35) | class XmlPullNode {
    method process (line 59) | @Override
    method XmlPullNode (line 68) | public XmlPullNode(String tagName) {
    method XmlPullNode (line 76) | public XmlPullNode(String tagName, XmlPullNodeCallback callback) {
    method getName (line 84) | public String getName() {
    method addChildNode (line 93) | public boolean addChildNode(XmlPullNode node) {
    method addChildNode (line 103) | public boolean addChildNode(XmlPullNode node, int repeatLimit) {
    method getChild (line 119) | public XmlPullNode getChild(String tagName) throws XmlPullParserExcept...
    method getCallback (line 130) | public XmlPullNodeCallback getCallback() {
    type XmlPullNodeCallback (line 140) | public static interface XmlPullNodeCallback {
      method process (line 146) | void process(XmlPullParser parser) throws XmlPullParserException, IO...
    class XmlPullNodeContainer (line 155) | private static class XmlPullNodeContainer {
      method XmlPullNodeContainer (line 168) | public XmlPullNodeContainer(XmlPullNode node) {
      method XmlPullNodeContainer (line 176) | public XmlPullNodeContainer(XmlPullNode node, int repeatLimit) {
      method takeXmlPullNode (line 186) | public XmlPullNode takeXmlPullNode() throws XmlPullParserException {
      method decreaseRepeatLimit (line 206) | private void decreaseRepeatLimit() {

FILE: library/src/main/java/com/handmark/pulltorefresh/configuration/xml/XmlPullNodeParser.java
  class XmlPullNodeParser (line 36) | abstract class XmlPullNodeParser<R> {
    method XmlPullNodeParser (line 46) | public XmlPullNodeParser(XmlPullParserWrapper parser) {
    method generateRootNode (line 54) | protected abstract XmlPullNode generateRootNode();
    method parse (line 62) | public final R parse() throws XmlPullParserException, IOException {
    method getResult (line 87) | protected abstract R getResult();
    method parseInternal (line 95) | private void parseInternal(XmlPullNode currentNode) throws XmlPullPars...

FILE: library/src/main/java/com/handmark/pulltorefresh/configuration/xml/XmlPullParserWrapper.java
  class XmlPullParserWrapper (line 34) | class XmlPullParserWrapper implements XmlPullParser {
    method XmlPullParserWrapper (line 46) | public XmlPullParserWrapper(XmlPullParser parser) {
    type DocumentState (line 57) | public static enum DocumentState {
    method isStartTag (line 75) | public boolean isStartTag() throws XmlPullParserException {
    method isEndTag (line 82) | public boolean isEndTag() throws XmlPullParserException {
    method isText (line 89) | public boolean isText() throws XmlPullParserException {
    method isStartDocument (line 96) | public boolean isStartDocument() throws XmlPullParserException {
    method isEndDocument (line 103) | public boolean isEndDocument() throws XmlPullParserException {
    method isComment (line 110) | public boolean isComment() throws XmlPullParserException {
    method nextStartTag (line 123) | public DocumentState nextStartTag() throws XmlPullParserException,
    method nextStartTagByName (line 149) | public DocumentState nextStartTagByName(String tagName)
    method nextEndTag (line 175) | public DocumentState nextEndTag() throws XmlPullParserException,
    method nextEndTagByName (line 201) | public DocumentState nextEndTagByName(String tagName)
    method matchCurrentTagName (line 225) | public boolean matchCurrentTagName(String tagName) {
    method setFeature (line 230) | @Override
    method getFeature (line 236) | @Override
    method setProperty (line 241) | @Override
    method getProperty (line 247) | @Override
    method setInput (line 252) | @Override
    method setInput (line 257) | @Override
    method getInputEncoding (line 263) | @Override
    method defineEntityReplacementText (line 268) | @Override
    method getNamespaceCount (line 274) | @Override
    method getNamespacePrefix (line 280) | @Override
    method getNamespaceUri (line 285) | @Override
    method getNamespace (line 290) | @Override
    method getDepth (line 295) | @Override
    method getPositionDescription (line 300) | @Override
    method getLineNumber (line 305) | @Override
    method getColumnNumber (line 310) | @Override
    method isWhitespace (line 315) | @Override
    method getText (line 320) | @Override
    method getTextCharacters (line 325) | @Override
    method getNamespace (line 330) | @Override
    method getName (line 335) | @Override
    method getPrefix (line 340) | @Override
    method isEmptyElementTag (line 345) | @Override
    method getAttributeCount (line 350) | @Override
    method getAttributeNamespace (line 355) | @Override
    method getAttributeName (line 360) | @Override
    method getAttributePrefix (line 365) | @Override
    method getAttributeType (line 370) | @Override
    method isAttributeDefault (line 375) | @Override
    method getAttributeValue (line 380) | @Override
    method getAttributeValue (line 385) | @Override
    method getEventType (line 390) | @Override
    method next (line 395) | @Override
    method nextToken (line 400) | @Override
    method require (line 405) | @Override
    method nextText (line 411) | @Override
    method nextTag (line 416) | @Override

FILE: library/src/main/java/com/handmark/pulltorefresh/library/AlphaAnimator.java
  class AlphaAnimator (line 27) | class AlphaAnimator {
    method fadein (line 29) | public static void fadein(View view, int duration) {
    method fadein (line 32) | public static void fadein(View view, int duration, AnimationListener l...
    method fadeout (line 36) | public static void fadeout(View view, int duration) {
    method fadeout (line 40) | public static void fadeout(View view, int duration, AnimationListener ...
    method animate (line 44) | private static void animate(View view, int duration, AnimationListener...

FILE: library/src/main/java/com/handmark/pulltorefresh/library/GoogleStyleProgressLayout.java
  class GoogleStyleProgressLayout (line 29) | public abstract class GoogleStyleProgressLayout extends FrameLayout impl...
    method GoogleStyleProgressLayout (line 30) | public GoogleStyleProgressLayout(Context context, TypedArray attrs){
    method setTopMargin (line 38) | public void setTopMargin(int height) {
    method createLayoutParams (line 49) | public FrameLayout.LayoutParams createLayoutParams() {
    method createDefaultLayoutParams (line 57) | public static FrameLayout.LayoutParams createDefaultLayoutParams(Conte...

FILE: library/src/main/java/com/handmark/pulltorefresh/library/GoogleStyleProgressLayoutFactory.java
  class GoogleStyleProgressLayoutFactory (line 35) | class GoogleStyleProgressLayoutFactory {
    method createGoogleStyleProgressLayoutClazzByLayoutCode (line 44) | public static Class<? extends GoogleStyleProgressLayout> createGoogleS...
    method createGoogleStyleProgressLayoutClazz (line 54) | @SuppressWarnings("unchecked")
    method createGoogleStyleProgressLayout (line 79) | public static GoogleStyleProgressLayout createGoogleStyleProgressLayou...
    method createGoogleStyleProgressLayout (line 89) | public static GoogleStyleProgressLayout createGoogleStyleProgressLayout(
    method tryNewInstance (line 108) | private static GoogleStyleProgressLayout tryNewInstance(
    class DefaultGoogleStyleProgressLayoutFactory (line 138) | private static class DefaultGoogleStyleProgressLayoutFactory {
      method createGoogleStyleProgressLayoutClazz (line 143) | public static Class<? extends GoogleStyleProgressLayout> createGoogl...
      method createGoogleStyleProgressLayout (line 152) | public static GoogleStyleProgressLayout createGoogleStyleProgressLay...

FILE: library/src/main/java/com/handmark/pulltorefresh/library/GoogleStyleViewLayout.java
  class GoogleStyleViewLayout (line 28) | public abstract class GoogleStyleViewLayout extends FrameLayout implemen...
    method GoogleStyleViewLayout (line 30) | public GoogleStyleViewLayout(Context context, TypedArray attrs) {
    method setHeight (line 34) | public void setHeight(int height) {
    method setWidth (line 40) | public void setWidth(int width) {
    method getContentSize (line 46) | public int getContentSize() {

FILE: library/src/main/java/com/handmark/pulltorefresh/library/GoogleStyleViewLayoutFactory.java
  class GoogleStyleViewLayoutFactory (line 37) | class GoogleStyleViewLayoutFactory {
    method createGoogleStyleViewLayoutClazzByLayoutCode (line 46) | public static Class<? extends GoogleStyleViewLayout> createGoogleStyle...
    method createGoogleStyleViewLayoutClazz (line 56) | @SuppressWarnings("unchecked")
    method createGoogleStyleViewLayout (line 81) | public static GoogleStyleViewLayout createGoogleStyleViewLayout(String...
    method createGoogleStyleViewLayout (line 91) | public static GoogleStyleViewLayout createGoogleStyleViewLayout(
    method tryNewInstance (line 110) | private static GoogleStyleViewLayout tryNewInstance(
    class DefaultGoogleStyleViewLayoutFactory (line 140) | private static class DefaultGoogleStyleViewLayoutFactory {
      method createGoogleStyleViewLayoutClazz (line 145) | public static Class<? extends GoogleStyleViewLayout> createGoogleSty...
      method createGoogleStyleViewLayout (line 154) | public static GoogleStyleViewLayout createGoogleStyleViewLayout(

FILE: library/src/main/java/com/handmark/pulltorefresh/library/IGoogleStyleProgressLayout.java
  type IGoogleStyleProgressLayout (line 22) | public interface IGoogleStyleProgressLayout extends IPullToRefreshConsum...

FILE: library/src/main/java/com/handmark/pulltorefresh/library/IGoogleStyleViewLayout.java
  type IGoogleStyleViewLayout (line 22) | public interface IGoogleStyleViewLayout extends IPullToRefreshConsumer {

FILE: library/src/main/java/com/handmark/pulltorefresh/library/IIndicatorLayout.java
  type IIndicatorLayout (line 28) | public interface IIndicatorLayout {
    method show (line 32) | public void show();
    method hide (line 36) | public void hide();
    method isVisible (line 41) | public boolean isVisible();
    method pullToRefresh (line 45) | public void pullToRefresh();
    method releaseToRefresh (line 49) | public void releaseToRefresh();

FILE: library/src/main/java/com/handmark/pulltorefresh/library/ILoadingLayout.java
  type ILoadingLayout (line 22) | public interface ILoadingLayout {
    method setLastUpdatedLabel (line 30) | public void setLastUpdatedLabel(CharSequence label);
    method setLoadingDrawable (line 38) | public void setLoadingDrawable(Drawable drawable);
    method setPullLabel (line 46) | public void setPullLabel(CharSequence pullLabel);
    method setRefreshingLabel (line 54) | public void setRefreshingLabel(CharSequence refreshingLabel);
    method setReleaseLabel (line 63) | public void setReleaseLabel(CharSequence releaseLabel);
    method setTextTypeface (line 71) | public void setTextTypeface(Typeface tf);

FILE: library/src/main/java/com/handmark/pulltorefresh/library/IPullToRefresh.java
  type IPullToRefresh (line 28) | public interface IPullToRefresh<T extends View> {
    method demo (line 39) | @Deprecated
    method getCurrentMode (line 48) | public Mode getCurrentMode();
    method getFilterTouchEvents (line 59) | public boolean getFilterTouchEvents();
    method getLoadingLayoutProxy (line 71) | public ILoadingLayout getLoadingLayoutProxy();
    method getLoadingLayoutProxy (line 87) | public ILoadingLayout getLoadingLayoutProxy(boolean includeStart, bool...
    method getMode (line 96) | public Mode getMode();
    method getRefreshableView (line 104) | public T getRefreshableView();
    method getShowViewWhileRefreshing (line 112) | public boolean getShowViewWhileRefreshing();
    method getState (line 117) | public State getState();
    method isPullToRefreshEnabled (line 124) | public boolean isPullToRefreshEnabled();
    method isPullToRefreshOverScrollEnabled (line 134) | public boolean isPullToRefreshOverScrollEnabled();
    method isRefreshing (line 141) | public boolean isRefreshing();
    method stopRefreshing (line 148) | public void stopRefreshing();
    method isScrollingWhileRefreshingEnabled (line 156) | public boolean isScrollingWhileRefreshingEnabled();
    method onRefreshComplete (line 162) | public void onRefreshComplete();
    method setFilterTouchEvents (line 175) | public void setFilterTouchEvents(boolean filterEvents);
    method setMode (line 182) | public void setMode(Mode mode);
    method setOnPullEventListener (line 190) | public void setOnPullEventListener(OnPullEventListener<T> listener);
    method setOnRefreshListener (line 197) | public void setOnRefreshListener(OnRefreshListener<T> listener);
    method setOnRefreshListener (line 204) | public void setOnRefreshListener(OnRefreshListener2<T> listener);
    method setPullToRefreshOverScrollEnabled (line 213) | public void setPullToRefreshOverScrollEnabled(boolean enabled);
    method setRefreshing (line 219) | public void setRefreshing();
    method setRefreshing (line 228) | public void setRefreshing(boolean doScroll);
    method setScrollAnimationInterpolator (line 236) | public void setScrollAnimationInterpolator(Interpolator interpolator);
    method setScrollingWhileRefreshingEnabled (line 245) | public void setScrollingWhileRefreshingEnabled(boolean scrollingWhileR...
    method setShowViewWhileRefreshing (line 253) | public void setShowViewWhileRefreshing(boolean showView);

FILE: library/src/main/java/com/handmark/pulltorefresh/library/IPullToRefreshConsumer.java
  type IPullToRefreshConsumer (line 22) | public interface IPullToRefreshConsumer {
    method reset (line 23) | void reset();
    method refreshing (line 24) | void refreshing();
    method releaseToRefresh (line 25) | void releaseToRefresh();
    method pullToRefresh (line 26) | void pullToRefresh();
    method onPull (line 27) | void onPull(float scale);

FILE: library/src/main/java/com/handmark/pulltorefresh/library/IndicatorLayoutFactory.java
  class IndicatorLayoutFactory (line 35) | public class IndicatorLayoutFactory {
    method createIndicatorLayoutClazzByLayoutCode (line 43) | public static Class<? extends IndicatorLayout> createIndicatorLayoutCl...
    method createIndicatorLayoutClazz (line 52) | @SuppressWarnings("unchecked")
    method createIndicatorLayout (line 78) | public static IndicatorLayout createIndicatorLayout(String layoutCode,...
    method createIndicatorLayout (line 89) | public static IndicatorLayout createIndicatorLayout(
    method tryNewInstance (line 109) | private static IndicatorLayout tryNewInstance(
    class DefaultIndicatorLayoutFactory (line 140) | private static class DefaultIndicatorLayoutFactory {
      method createIndicatorLayoutClazz (line 145) | public static Class<? extends IndicatorLayout> createIndicatorLayout...
      method createIndicatorLayout (line 154) | public static IndicatorLayout createIndicatorLayout(Class<? extends ...

FILE: library/src/main/java/com/handmark/pulltorefresh/library/LoadingLayoutFactory.java
  class LoadingLayoutFactory (line 37) | class LoadingLayoutFactory {
    method createLoadingLayoutClazzByLayoutCode (line 46) | public static Class<? extends LoadingLayout> createLoadingLayoutClazzB...
    method createLoadingLayoutClazz (line 57) | @SuppressWarnings("unchecked")
    method createLoadingLayout (line 83) | public static LoadingLayout createLoadingLayout(String layoutCode, Con...
    method createLoadingLayout (line 95) | public static LoadingLayout createLoadingLayout(
    method tryNewInstance (line 115) | private static LoadingLayout tryNewInstance(
    class DefaultLoadingLayoutFactory (line 148) | private static class DefaultLoadingLayoutFactory {
      method createLoadingLayoutClazz (line 153) | public static Class<? extends LoadingLayout> createLoadingLayoutClazz(
      method createLoadingLayout (line 163) | public static LoadingLayout createLoadingLayout(

FILE: library/src/main/java/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java
  class LoadingLayoutProxy (line 26) | public class LoadingLayoutProxy implements ILoadingLayout {
    method LoadingLayoutProxy (line 30) | LoadingLayoutProxy() {
    method addLayout (line 43) | public void addLayout(LoadingLayout layout) {
    method setLastUpdatedLabel (line 49) | @Override
    method setLoadingDrawable (line 56) | @Override
    method setRefreshingLabel (line 63) | @Override
    method setPullLabel (line 70) | @Override
    method setReleaseLabel (line 77) | @Override
    method setTextTypeface (line 84) | public void setTextTypeface(Typeface tf) {

FILE: library/src/main/java/com/handmark/pulltorefresh/library/OverscrollHelper.java
  class OverscrollHelper (line 26) | @TargetApi(9)
    method overScrollBy (line 52) | public static void overScrollBy(final PullToRefreshBase<?> view, final...
    method overScrollBy (line 76) | public static void overScrollBy(final PullToRefreshBase<?> view, final...
    method overScrollBy (line 103) | public static void overScrollBy(final PullToRefreshBase<?> view, final...
    method isAndroidOverScrollEnabled (line 176) | static boolean isAndroidOverScrollEnabled(View view) {

FILE: library/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java
  class PullToRefreshAdapterViewBase (line 44) | public abstract class PullToRefreshAdapterViewBase<T extends AbsListView...
    method convertEmptyViewLayoutParams (line 47) | private static FrameLayout.LayoutParams convertEmptyViewLayoutParams(V...
    method PullToRefreshAdapterViewBase (line 82) | public PullToRefreshAdapterViewBase(Context context) {
    method PullToRefreshAdapterViewBase (line 87) | public PullToRefreshAdapterViewBase(Context context, AttributeSet attr...
    method PullToRefreshAdapterViewBase (line 92) | public PullToRefreshAdapterViewBase(Context context, Mode mode) {
    method PullToRefreshAdapterViewBase (line 97) | public PullToRefreshAdapterViewBase(Context context, Mode mode, Class<...
    method getShowIndicator (line 112) | public boolean getShowIndicator() {
    method onScroll (line 116) | public final void onScroll(final AbsListView view, final int firstVisi...
    method onScrollStateChanged (line 143) | public final void onScrollStateChanged(final AbsListView view, final i...
    method setAdapter (line 165) | public void setAdapter(ListAdapter adapter) {
    method setEmptyView (line 182) | public final void setEmptyView(View newEmptyView) {
    method setOnItemClickListener (line 221) | public void setOnItemClickListener(OnItemClickListener listener) {
    method setOnLastItemVisibleListener (line 225) | public final void setOnLastItemVisibleListener(OnLastItemVisibleListen...
    method setOnItemLongClickListener (line 229) | public final void setOnItemLongClickListener(AdapterView.OnItemLongCli...
    method setOnScrollListener (line 233) | public final void setOnScrollListener(OnScrollListener listener) {
    method setScrollEmptyView (line 237) | public final void setScrollEmptyView(boolean doScroll) {
    method setShowIndicator (line 249) | public void setShowIndicator(boolean showIndicator) {
    method onPullToRefresh (line 263) | @Override
    method onRefreshing (line 282) | protected void onRefreshing(boolean doScroll) {
    method onReleaseToRefresh (line 290) | @Override
    method onReset (line 309) | @Override
    method handleStyledAttributes (line 318) | @Override
    method isReadyForPullStart (line 335) | protected boolean isReadyForPullStart() {
    method isReadyForPullEnd (line 339) | protected boolean isReadyForPullEnd() {
    method onScrollChanged (line 343) | @Override
    method onFinishInflate (line 351) | @Override
    method createSampleList (line 365) | private void createSampleList() {
    method updateUIForMode (line 371) | @Override
    method addIndicatorViews (line 383) | private void addIndicatorViews() {
    method getShowIndicatorInternal (line 412) | private boolean getShowIndicatorInternal() {
    method isFirstItemVisible (line 416) | private boolean isFirstItemVisible() {
    method isLastItemVisible (line 445) | private boolean isLastItemVisible() {
    method removeIndicatorViews (line 481) | private void removeIndicatorViews() {
    method updateIndicatorViewsVisibility (line 493) | private void updateIndicatorViewsVisibility() {

FILE: library/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshBase.java
  class PullToRefreshBase (line 49) | public abstract class PullToRefreshBase<T extends View> extends LinearLa...
    method PullToRefreshBase (line 194) | public PullToRefreshBase(Context context) {
    method PullToRefreshBase (line 199) | public PullToRefreshBase(Context context, AttributeSet attrs) {
    method PullToRefreshBase (line 204) | public PullToRefreshBase(Context context, Mode mode) {
    method PullToRefreshBase (line 210) | public PullToRefreshBase(Context context, Mode mode, Class<? extends L...
    method addView (line 217) | @Override
    method demo (line 232) | @Deprecated
    method getCurrentMode (line 246) | @Override
    method getFilterTouchEvents (line 251) | @Override
    method getLoadingLayoutProxy (line 256) | @Override
    method getLoadingLayoutProxy (line 261) | @Override
    method getMode (line 266) | @Override
    method getRefreshableView (line 271) | @Override
    method getShowViewWhileRefreshing (line 276) | @Override
    method getState (line 281) | @Override
    method isDisableScrollingWhileRefreshing (line 289) | public final boolean isDisableScrollingWhileRefreshing() {
    method isPullToRefreshEnabled (line 293) | @Override
    method isPullToRefreshOverScrollEnabled (line 298) | @Override
    method isRefreshing (line 304) | @Override
    method stopRefreshing (line 309) | @Override
    method isScrollingWhileRefreshingEnabled (line 314) | @Override
    method onInterceptTouchEvent (line 319) | @Override
    method onRefreshComplete (line 396) | @Override
    method onTouchEvent (line 403) | @Override
    method setFriction (line 472) | public final void setFriction(float friction) {
    method setSmoothScrollDuration (line 479) | public final void setSmoothScrollDuration(int smoothScrollDurationMs) {
    method setSmoothScrollLongDuration (line 486) | public final void setSmoothScrollLongDuration(int smoothScrollLongDura...
    method setScrollingWhileRefreshingEnabled (line 492) | public final void setScrollingWhileRefreshingEnabled(boolean allowScro...
    method setDisableScrollingWhileRefreshing (line 498) | public void setDisableScrollingWhileRefreshing(boolean disableScrollin...
    method setFilterTouchEvents (line 502) | @Override
    method setLastUpdatedLabel (line 511) | public void setLastUpdatedLabel(CharSequence label) {
    method setLoadingDrawable (line 519) | public void setLoadingDrawable(Drawable drawable) {
    method setLoadingDrawable (line 527) | public void setLoadingDrawable(Drawable drawable, Mode mode) {
    method setLongClickable (line 532) | @Override
    method setMode (line 537) | @Override
    method setOnPullEventListener (line 549) | public void setOnPullEventListener(OnPullEventListener<T> listener) {
    method setOnRefreshListener (line 553) | @Override
    method setOnRefreshListener (line 559) | @Override
    method setPullLabel (line 569) | public void setPullLabel(CharSequence pullLabel) {
    method setPullLabel (line 577) | public void setPullLabel(CharSequence pullLabel, Mode mode) {
    method setPullToRefreshEnabled (line 586) | public final void setPullToRefreshEnabled(boolean enable) {
    method setPullToRefreshOverScrollEnabled (line 590) | @Override
    method setRefreshing (line 595) | @Override
    method setRefreshing (line 600) | @Override
    method setRefreshingLabel (line 611) | public void setRefreshingLabel(CharSequence refreshingLabel) {
    method setRefreshingLabel (line 619) | public void setRefreshingLabel(CharSequence refreshingLabel, Mode mode) {
    method setReleaseLabel (line 628) | public void setReleaseLabel(CharSequence releaseLabel) {
    method setReleaseLabel (line 636) | public void setReleaseLabel(CharSequence releaseLabel, Mode mode) {
    method setScrollAnimationInterpolator (line 641) | public void setScrollAnimationInterpolator(Interpolator interpolator) {
    method setShowViewWhileRefreshing (line 645) | @Override
    method getPullToRefreshScrollDirection (line 654) | public abstract Orientation getPullToRefreshScrollDirection();
    method getFilteredPullToRefreshScrollDirection (line 662) | public final Orientation getFilteredPullToRefreshScrollDirection() {
    method setState (line 670) | final void setState(State state, final boolean... params) {
    method addViewInternal (line 705) | protected final void addViewInternal(View child, int index, ViewGroup....
    method addViewInternal (line 713) | protected final void addViewInternal(View child, ViewGroup.LayoutParam...
    method createLoadingLayout (line 724) | protected LoadingLayout createLoadingLayout(Context context, Mode mode...
    method createGoogleStyleViewLayout (line 735) | private GoogleStyleViewLayout createGoogleStyleViewLayout(
    method createGoogleStyleProgressLayout (line 748) | private GoogleStyleProgressLayout createGoogleStyleProgressLayout(
    method createLoadingLayoutProxy (line 757) | protected LoadingLayoutProxy createLoadingLayoutProxy(final boolean in...
    method createRefreshableView (line 784) | protected abstract T createRefreshableView(Context context, AttributeS...
    method disableLoadingLayoutVisibilityChanges (line 786) | protected final void disableLoadingLayoutVisibilityChanges() {
    method getFooterLayout (line 790) | protected final LoadingLayout getFooterLayout() {
    method getFooterSize (line 794) | protected final int getFooterSize() {
    method getHeaderLayout (line 798) | protected final LoadingLayout getHeaderLayout() {
    method getHeaderSize (line 802) | protected final int getHeaderSize() {
    method getGoogleStyleViewSize (line 806) | protected final int getGoogleStyleViewSize() {
    method getPullToRefreshScrollDuration (line 810) | protected int getPullToRefreshScrollDuration() {
    method getPullToRefreshScrollDurationLonger (line 814) | protected int getPullToRefreshScrollDurationLonger() {
    method getRefreshableViewWrapper (line 818) | protected FrameLayout getRefreshableViewWrapper() {
    method handleStyledAttributes (line 828) | protected void handleStyledAttributes(TypedArray a) {
    method isReadyForPullEnd (line 838) | protected abstract boolean isReadyForPullEnd();
    method isReadyForPullStart (line 847) | protected abstract boolean isReadyForPullStart();
    method onPtrRestoreInstanceState (line 855) | protected void onPtrRestoreInstanceState(Bundle savedInstanceState) {
    method onPtrSaveInstanceState (line 864) | protected void onPtrSaveInstanceState(Bundle saveState) {
    method onPullToRefresh (line 871) | protected void onPullToRefresh() {
    method onRefreshing (line 896) | protected void onRefreshing(final boolean doScroll) {
    method onReleaseToRefresh (line 955) | protected void onReleaseToRefresh() {
    method onReset (line 977) | protected void onReset() {
    method onRestoreInstanceState (line 1018) | @Override
    method onSaveInstanceState (line 1045) | @Override
    method onSizeChanged (line 1063) | @Override
    method refreshLoadingViewsSize (line 1097) | protected final void refreshLoadingViewsSize() {
    method refreshRefreshableViewSize (line 1155) | protected final void refreshRefreshableViewSize(int width, int height) {
    method setHeaderScroll (line 1182) | protected final void setHeaderScroll(int value) {
    method smoothScrollTo (line 1241) | protected final void smoothScrollTo(int scrollValue) {
    method smoothScrollTo (line 1252) | protected final void smoothScrollTo(int scrollValue, OnSmoothScrollFin...
    method smoothScrollToLonger (line 1262) | protected final void smoothScrollToLonger(int scrollValue) {
    method updateUIForMode (line 1270) | protected void updateUIForMode() {
    method updateUIForGoogleStyleMode (line 1301) | protected void updateUIForGoogleStyleMode() {
    method addRefreshableView (line 1347) | private void addRefreshableView(Context context, T refreshableView) {
    method callRefreshListener (line 1356) | private void callRefreshListener() {
    method init (line 1368) | @SuppressWarnings("deprecation")
    method filterModeForSDKVersion (line 1525) | private void filterModeForSDKVersion() {
    method determineYPositionOfGoogleStyleViewLayout (line 1533) | private void determineYPositionOfGoogleStyleViewLayout() {
    method determineYPositionOfGoogleStyleProgressLayout (line 1543) | private void determineYPositionOfGoogleStyleProgressLayout() {
    method showViewTopLayout (line 1553) | private void showViewTopLayout() {
    method hideViewTopLayout (line 1596) | private void hideViewTopLayout() {
    method onAttachedToWindow (line 1636) | @Override
    method initTopViewGroup (line 1649) | private void initTopViewGroup() {
    method initActionBarSize (line 1714) | private void initActionBarSize(Context context) {
    method initStatusBarSize (line 1721) | private void initStatusBarSize(Context context) {
    method generateCircleProgressBar (line 1729) | private ProgressBar generateCircleProgressBar(Context context) {
    method isReadyForPull (line 1737) | private boolean isReadyForPull() {
    method pullEvent (line 1757) | private void pullEvent() {
    method getLoadingLayoutLayoutParams (line 1816) | @SuppressWarnings("deprecation")
    method getMaximumPullScroll (line 1829) | private int getMaximumPullScroll() {
    method smoothScrollTo (line 1845) | private final void smoothScrollTo(int scrollValue, long duration) {
    method smoothScrollTo (line 1849) | private final void smoothScrollTo(int newScrollValue, long duration, l...
    method smoothScrollToAndBack (line 1885) | private final void smoothScrollToAndBack(int y) {
    type Mode (line 1895) | public static enum Mode {
      method mapIntToValue (line 1952) | static Mode mapIntToValue(final int modeInt) {
      method getDefault (line 1963) | static Mode getDefault() {
      method Mode (line 1970) | Mode(int modeInt) {
      method permitsPullToRefresh (line 1977) | boolean permitsPullToRefresh() {
      method showHeaderLoadingLayout (line 1984) | public boolean showHeaderLoadingLayout() {
      method showFooterLoadingLayout (line 1991) | public boolean showFooterLoadingLayout() {
      method showGoogleStyle (line 1998) | public boolean showGoogleStyle() {
      method getIntValue (line 2002) | int getIntValue() {
    type OnLastItemVisibleListener (line 2019) | public static interface OnLastItemVisibleListener {
      method onLastItemVisible (line 2024) | public void onLastItemVisible();
    type OnPullEventListener (line 2036) | public static interface OnPullEventListener<V extends View> {
      method onPullEvent (line 2050) | public void onPullEvent(final PullToRefreshBase<V> refreshView, Stat...
    type OnRefreshListener (line 2059) | public static interface OnRefreshListener<V extends View> {
      method onRefresh (line 2065) | public void onRefresh(final PullToRefreshBase<V> refreshView);
    type OnRefreshListener2 (line 2076) | public static interface OnRefreshListener2<V extends View> {
      method onPullDownToRefresh (line 2083) | public void onPullDownToRefresh(final PullToRefreshBase<V> refreshVi...
      method onPullUpToRefresh (line 2089) | public void onPullUpToRefresh(final PullToRefreshBase<V> refreshView);
    type Orientation (line 2093) | public static enum Orientation {
    type State (line 2097) | public static enum State {
      method mapIntToValue (line 2140) | static State mapIntToValue(final int stateInt) {
      method State (line 2153) | State(int intValue) {
      method getIntValue (line 2157) | int getIntValue() {
    class SmoothScrollRunnable (line 2162) | final class SmoothScrollRunnable implements Runnable {
      method SmoothScrollRunnable (line 2173) | public SmoothScrollRunnable(int fromY, int toY, long duration, OnSmo...
      method run (line 2181) | @Override
      method stop (line 2216) | public void stop() {
    type OnSmoothScrollFinishedListener (line 2222) | static interface OnSmoothScrollFinishedListener {
      method onSmoothScrollFinished (line 2223) | void onSmoothScrollFinished();

FILE: library/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java
  class PullToRefreshExpandableListView (line 30) | public class PullToRefreshExpandableListView extends PullToRefreshAdapte...
    method PullToRefreshExpandableListView (line 32) | public PullToRefreshExpandableListView(Context context) {
    method PullToRefreshExpandableListView (line 36) | public PullToRefreshExpandableListView(Context context, AttributeSet a...
    method PullToRefreshExpandableListView (line 40) | public PullToRefreshExpandableListView(Context context, Mode mode) {
    method PullToRefreshExpandableListView (line 44) | public PullToRefreshExpandableListView(Context context, Mode mode, Cla...
    method getPullToRefreshScrollDirection (line 48) | @Override
    method createRefreshableView (line 53) | @Override
    class InternalExpandableListView (line 67) | class InternalExpandableListView extends ExpandableListView implements...
      method InternalExpandableListView (line 69) | public InternalExpandableListView(Context context, AttributeSet attr...
      method setEmptyView (line 73) | @Override
      method setEmptyViewInternal (line 78) | @Override
    class InternalExpandableListViewSDK9 (line 84) | @TargetApi(9)
      method InternalExpandableListViewSDK9 (line 87) | public InternalExpandableListViewSDK9(Context context, AttributeSet ...
      method overScrollBy (line 91) | @Override

FILE: library/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshGridView.java
  class PullToRefreshGridView (line 30) | public class PullToRefreshGridView extends PullToRefreshAdapterViewBase<...
    method PullToRefreshGridView (line 32) | public PullToRefreshGridView(Context context) {
    method PullToRefreshGridView (line 36) | public PullToRefreshGridView(Context context, AttributeSet attrs) {
    method PullToRefreshGridView (line 40) | public PullToRefreshGridView(Context context, Mode mode) {
    method PullToRefreshGridView (line 44) | public PullToRefreshGridView(Context context, Mode mode, Class<? exten...
    method getPullToRefreshScrollDirection (line 48) | @Override
    method createRefreshableView (line 53) | @Override
    class InternalGridView (line 67) | class InternalGridView extends GridView implements EmptyViewMethodAcce...
      method InternalGridView (line 69) | public InternalGridView(Context context, AttributeSet attrs) {
      method setEmptyView (line 73) | @Override
      method setEmptyViewInternal (line 78) | @Override
    class InternalGridViewSDK9 (line 84) | @TargetApi(9)
      method InternalGridViewSDK9 (line 87) | public InternalGridViewSDK9(Context context, AttributeSet attrs) {
      method overScrollBy (line 91) | @Override

FILE: library/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java
  class PullToRefreshHorizontalScrollView (line 29) | public class PullToRefreshHorizontalScrollView extends PullToRefreshBase...
    method PullToRefreshHorizontalScrollView (line 31) | public PullToRefreshHorizontalScrollView(Context context) {
    method PullToRefreshHorizontalScrollView (line 35) | public PullToRefreshHorizontalScrollView(Context context, AttributeSet...
    method PullToRefreshHorizontalScrollView (line 39) | public PullToRefreshHorizontalScrollView(Context context, Mode mode) {
    method PullToRefreshHorizontalScrollView (line 43) | public PullToRefreshHorizontalScrollView(Context context, Mode mode, C...
    method getPullToRefreshScrollDirection (line 47) | @Override
    method createRefreshableView (line 52) | @Override
    method isReadyForPullStart (line 66) | @Override
    method isReadyForPullEnd (line 71) | @Override
    class InternalHorizontalScrollViewSDK9 (line 80) | @TargetApi(9)
      method InternalHorizontalScrollViewSDK9 (line 83) | public InternalHorizontalScrollViewSDK9(Context context, AttributeSe...
      method overScrollBy (line 87) | @Override
      method getScrollRange (line 104) | private int getScrollRange() {

FILE: library/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshListView.java
  class PullToRefreshListView (line 37) | public class PullToRefreshListView extends PullToRefreshAdapterViewBase<...
    method PullToRefreshListView (line 46) | public PullToRefreshListView(Context context) {
    method PullToRefreshListView (line 50) | public PullToRefreshListView(Context context, AttributeSet attrs) {
    method PullToRefreshListView (line 54) | public PullToRefreshListView(Context context, Mode mode) {
    method PullToRefreshListView (line 58) | public PullToRefreshListView(Context context, Mode mode, Class<? exten...
    method getPullToRefreshScrollDirection (line 62) | @Override
    method onRefreshing (line 67) | @Override
    method onReset (line 138) | @Override
    method createLoadingLayoutProxy (line 196) | @Override
    method createListView (line 214) | protected ListView createListView(Context context, AttributeSet attrs) {
    method createRefreshableView (line 224) | @Override
    method handleStyledAttributes (line 233) | @Override
    class InternalListViewSDK9 (line 268) | @TargetApi(9)
      method InternalListViewSDK9 (line 271) | public InternalListViewSDK9(Context context, AttributeSet attrs) {
      method overScrollBy (line 275) | @Override
    class InternalListView (line 289) | protected class InternalListView extends ListView implements EmptyView...
      method InternalListView (line 293) | public InternalListView(Context context, AttributeSet attrs) {
      method dispatchDraw (line 297) | @Override
      method dispatchTouchEvent (line 311) | @Override
      method setAdapter (line 326) | @Override
      method setEmptyView (line 337) | @Override
      method setEmptyViewInternal (line 342) | @Override

FILE: library/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java
  class PullToRefreshScrollView (line 29) | public class PullToRefreshScrollView extends PullToRefreshBase<ScrollVie...
    method PullToRefreshScrollView (line 31) | public PullToRefreshScrollView(Context context) {
    method PullToRefreshScrollView (line 35) | public PullToRefreshScrollView(Context context, AttributeSet attrs) {
    method PullToRefreshScrollView (line 39) | public PullToRefreshScrollView(Context context, Mode mode) {
    method PullToRefreshScrollView (line 43) | public PullToRefreshScrollView(Context context, Mode mode, Class<? ext...
    method getPullToRefreshScrollDirection (line 47) | @Override
    method createRefreshableView (line 52) | @Override
    method isReadyForPullStart (line 65) | @Override
    method isReadyForPullEnd (line 70) | @Override
    class InternalScrollViewSDK9 (line 79) | @TargetApi(9)
      method InternalScrollViewSDK9 (line 82) | public InternalScrollViewSDK9(Context context, AttributeSet attrs) {
      method overScrollBy (line 86) | @Override
      method getScrollRange (line 103) | private int getScrollRange() {

FILE: library/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshWebView.java
  class PullToRefreshWebView (line 31) | public class PullToRefreshWebView extends PullToRefreshBase<WebView> {
    method onRefresh (line 35) | @Override
    method onProgressChanged (line 44) | @Override
    method PullToRefreshWebView (line 53) | public PullToRefreshWebView(Context context) {
    method PullToRefreshWebView (line 63) | public PullToRefreshWebView(Context context, AttributeSet attrs) {
    method PullToRefreshWebView (line 73) | public PullToRefreshWebView(Context context, Mode mode) {
    method PullToRefreshWebView (line 83) | public PullToRefreshWebView(Context context, Mode mode, Class<? extend...
    method getPullToRefreshScrollDirection (line 93) | @Override
    method createRefreshableView (line 98) | @Override
    method isReadyForPullStart (line 111) | @Override
    method isReadyForPullEnd (line 116) | @Override
    method onPtrRestoreInstanceState (line 122) | @Override
    method onPtrSaveInstanceState (line 128) | @Override
    class InternalWebViewSDK9 (line 134) | @TargetApi(9)
      method InternalWebViewSDK9 (line 145) | public InternalWebViewSDK9(Context context, AttributeSet attrs) {
      method overScrollBy (line 149) | @Override
      method getScrollRange (line 163) | private int getScrollRange() {

FILE: library/src/main/java/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java
  class PullToRefreshWebView2 (line 63) | public class PullToRefreshWebView2 extends PullToRefreshWebView {
    method PullToRefreshWebView2 (line 69) | public PullToRefreshWebView2(Context context) {
    method PullToRefreshWebView2 (line 73) | public PullToRefreshWebView2(Context context, AttributeSet attrs) {
    method PullToRefreshWebView2 (line 77) | public PullToRefreshWebView2(Context context, Mode mode) {
    method createRefreshableView (line 85) | @Override
    method isReadyForPullStart (line 96) | @Override
    method isReadyForPullEnd (line 107) | @Override
    class JsValueCallback (line 123) | final class JsValueCallback {
      method isReadyForPullUpResponse (line 125) | public void isReadyForPullUpResponse(boolean response) {
      method isReadyForPullDownResponse (line 129) | public void isReadyForPullDownResponse(boolean response) {

FILE: library/src/main/java/com/handmark/pulltorefresh/library/extras/SoundPullEventListener.java
  class SoundPullEventListener (line 29) | public class SoundPullEventListener<V extends View> implements PullToRef...
    method SoundPullEventListener (line 41) | public SoundPullEventListener(Context context) {
    method onPullEvent (line 46) | @Override
    method addSoundEvent (line 66) | public void addSoundEvent(State event, int resId) {
    method clearSounds (line 73) | public void clearSounds() {
    method getCurrentMediaPlayer (line 80) | public MediaPlayer getCurrentMediaPlayer() {
    method playSound (line 84) | private void playSound(int resId) {

FILE: library/src/main/java/com/handmark/pulltorefresh/library/internal/AbstractDefaultGoogleStyleViewLayout.java
  class AbstractDefaultGoogleStyleViewLayout (line 39) | public abstract class AbstractDefaultGoogleStyleViewLayout extends Googl...
    method AbstractDefaultGoogleStyleViewLayout (line 49) | public AbstractDefaultGoogleStyleViewLayout(Context context, TypedArra...
    method initImpl (line 58) | protected abstract void initImpl(Context context, TypedArray attrs);
    method initComponents (line 64) | private void initComponents(Context context, TypedArray attrs) {
    method geSubHeaderTextLayout (line 75) | protected abstract TextView geSubHeaderTextLayout(Context context, Typ...
    method getHeaderText (line 82) | protected abstract TextView getHeaderText(Context context, TypedArray ...
    method getInnerLayout (line 89) | protected abstract FrameLayout getInnerLayout(Context context, TypedAr...
    method setHeight (line 91) | @Override
    method initProperties (line 110) | protected void initProperties(Context context, TypedArray attrs) {
    method initPropertiesImpl (line 159) | protected abstract void initPropertiesImpl(Context context, TypedArray...
    method getDefaultBackgroundColor (line 167) | protected int getDefaultBackgroundColor(Context context, TypedArray at...
    method getDefaultTextColor (line 177) | protected int getDefaultTextColor(Context context, TypedArray attrs) {
    method getDefaultSubTextColor (line 187) | protected int getDefaultSubTextColor(Context context, TypedArray attrs) {
    method loadLoadingLayoutLabels (line 199) | private void loadLoadingLayoutLabels(Context context, TypedArray attrs) {
    method loadPullLabel (line 215) | protected String loadPullLabel(Context context, TypedArray attrs) {
    method loadRefreshingLabel (line 234) | protected String loadRefreshingLabel(Context context, TypedArray attrs) {
    method loadReleaseLabel (line 253) | protected String loadReleaseLabel(Context context, TypedArray attrs) {
    method setWidth (line 264) | @Override
    method getContentSize (line 271) | @Override
    method hideAllViews (line 276) | public final void hideAllViews() {
    method hideHeaderText (line 281) | private void hideHeaderText() {
    method hideSubHeaderText (line 287) | private void hideSubHeaderText() {
    method pullToRefreshImpl (line 293) | protected abstract void pullToRefreshImpl();
    method releaseToRefreshImpl (line 294) | protected abstract void releaseToRefreshImpl();
    method refreshingImpl (line 295) | protected abstract void refreshingImpl();
    method resetImpl (line 296) | protected abstract void resetImpl();
    method onPullImpl (line 297) | protected abstract void onPullImpl(float scale);
    method pullToRefresh (line 299) | @Override
    method refreshing (line 307) | @Override
    method releaseToRefresh (line 320) | @Override
    method reset (line 329) | @Override
    method setLastUpdatedLabel (line 345) | public void setLastUpdatedLabel(CharSequence label) {
    method setPullLabel (line 349) | public void setPullLabel(CharSequence pullLabel) {
    method setRefreshingLabel (line 353) | public void setRefreshingLabel(CharSequence refreshingLabel) {
    method setReleaseLabel (line 357) | public void setReleaseLabel(CharSequence releaseLabel) {
    method setTextTypeface (line 361) | public void setTextTypeface(Typeface tf) {
    method showInvisibleViews (line 367) | public final void showInvisibleViews() {
    method showSubHeaderText (line 372) | private void showSubHeaderText() {
    method showHeaderText (line 378) | private void showHeaderText() {
    method setSubHeaderText (line 384) | private void setSubHeaderText(CharSequence label) {
    method setSubTextAppearance (line 400) | private void setSubTextAppearance(int value) {
    method setSubTextColor (line 406) | private void setSubTextColor(ColorStateList color) {
    method setSubTextColor (line 412) | private void setSubTextColor(int color) {
    method setTextAppearance (line 418) | private void setTextAppearance(int value) {
    method setTextColor (line 427) | private void setTextColor(ColorStateList color) {
    method setTextColor (line 436) | private void setTextColor(int color) {
    method onPull (line 445) | @Override

FILE: library/src/main/java/com/handmark/pulltorefresh/library/internal/Assert.java
  class Assert (line 18) | public class Assert {
    method notNull (line 21) | public static void notNull(Object object, String argName) {

FILE: library/src/main/java/com/handmark/pulltorefresh/library/internal/DefaultGoogleStyleProgressLayout.java
  class DefaultGoogleStyleProgressLayout (line 32) | public class DefaultGoogleStyleProgressLayout extends GoogleStyleProgres...
    method DefaultGoogleStyleProgressLayout (line 37) | public DefaultGoogleStyleProgressLayout(Context context, TypedArray at...
    method initInflate (line 48) | private void initInflate(Context context, int inflateId) {
    method initProperties (line 54) | private void initProperties() {
    method reset (line 61) | @Override
    method refreshing (line 70) | @Override
    method releaseToRefresh (line 76) | @Override
    method pullToRefresh (line 80) | @Override
    method onPull (line 86) | @Override

FILE: library/src/main/java/com/handmark/pulltorefresh/library/internal/DefaultGoogleStyleViewLayout.java
  class DefaultGoogleStyleViewLayout (line 29) | public class DefaultGoogleStyleViewLayout extends AbstractDefaultGoogleS...
    method DefaultGoogleStyleViewLayout (line 31) | public DefaultGoogleStyleViewLayout(Context context, TypedArray attrs) {
    method initInflate (line 39) | private void initInflate(Context context, int inflateId) {
    method initImpl (line 45) | @Override
    method getLayoutInflateId (line 54) | protected int getLayoutInflateId() {
    method geSubHeaderTextLayout (line 60) | @Override
    method getHeaderText (line 67) | @Override
    method getInnerLayout (line 74) | @Override
    method initPropertiesImpl (line 79) | @Override
    method pullToRefreshImpl (line 84) | @Override
    method releaseToRefreshImpl (line 89) | @Override
    method refreshingImpl (line 94) | @Override
    method resetImpl (line 99) | @Override
    method onPullImpl (line 104) | @Override

FILE: library/src/main/java/com/handmark/pulltorefresh/library/internal/DefaultIndicatorLayout.java
  class DefaultIndicatorLayout (line 40) | @SuppressLint("ViewConstructor")
    method DefaultIndicatorLayout (line 50) | public DefaultIndicatorLayout(Context context, PullToRefreshBase.Mode ...
    method getIconDrawable (line 108) | protected Drawable getIconDrawable(Context context, PullToRefreshBase....
    method isVisible (line 114) | public final boolean isVisible() {
    method hide (line 125) | public void hide() {
    method show (line 131) | public void show() {
    method onAnimationEnd (line 136) | @Override
    method onAnimationRepeat (line 148) | @Override
    method onAnimationStart (line 153) | @Override
    method releaseToRefresh (line 160) | @Override
    method pullToRefresh (line 167) | @Override
    method createApplicableHeaderLayoutParams (line 175) | public LayoutParams createApplicableHeaderLayoutParams() {
    method createApplicableFooterLayoutParams (line 185) | public LayoutParams createApplicableFooterLayoutParams() {

FILE: library/src/main/java/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java
  type EmptyViewMethodAccessor (line 27) | public interface EmptyViewMethodAccessor {
    method setEmptyViewInternal (line 34) | public void setEmptyViewInternal(View emptyView);
    method setEmptyView (line 42) | public void setEmptyView(View emptyView);

FILE: library/src/main/java/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java
  class FlipLoadingLayout (line 34) | @SuppressLint("ViewConstructor")
    method FlipLoadingLayout (line 41) | public FlipLoadingLayout(Context context, final Mode mode, final Orien...
    method onLoadingDrawableSet (line 59) | @Override
    method onPullImpl (line 86) | @Override
    method pullToRefreshImpl (line 91) | @Override
    method refreshingImpl (line 99) | @Override
    method releaseToRefreshImpl (line 106) | @Override
    method resetImpl (line 111) | @Override
    method getDefaultDrawableResId (line 118) | @Override
    method getDrawableRotationAngle (line 123) | private float getDrawableRotationAngle() {

FILE: library/src/main/java/com/handmark/pulltorefresh/library/internal/FlippedProgressBar.java
  class FlippedProgressBar (line 27) | public class FlippedProgressBar extends ProgressBar {
    method FlippedProgressBar (line 28) | public FlippedProgressBar(Context context) {
    method FlippedProgressBar (line 32) | public FlippedProgressBar(Context context, AttributeSet attrs) {
    method FlippedProgressBar (line 36) | public FlippedProgressBar(Context context, AttributeSet attrs, int def...
    method onDraw (line 40) | @Override

FILE: library/src/main/java/com/handmark/pulltorefresh/library/internal/IndicatorLayout.java
  class IndicatorLayout (line 28) | public abstract class IndicatorLayout extends FrameLayout implements IIn...
    method IndicatorLayout (line 30) | public IndicatorLayout(Context context) {
    method IndicatorLayout (line 34) | public IndicatorLayout(Context context, AttributeSet attrs) {
    method IndicatorLayout (line 38) | public IndicatorLayout(Context context, AttributeSet attrs, int defSty...
    method createApplicableHeaderLayoutParams (line 46) | public abstract LayoutParams createApplicableHeaderLayoutParams();
    method createApplicableFooterLayoutParams (line 52) | public abstract LayoutParams createApplicableFooterLayoutParams();

FILE: library/src/main/java/com/handmark/pulltorefresh/library/internal/LoadingLayout.java
  class LoadingLayout (line 44) | @SuppressLint("ViewConstructor")
    method LoadingLayout (line 76) | protected LoadingLayout(Context context, final Mode mode, final Orient...
    method LoadingLayout (line 94) | public LoadingLayout(Context context, final Mode mode, final Orientati...
    method initComponents (line 140) | protected void initComponents() {
    method initInflate (line 148) | private void initInflate(Context context, int inflateId) {
    method initProperties (line 152) | protected void initProperties(Context context, final Mode mode,
    method loadLoadingLayoutLabels (line 228) | private void loadLoadingLayoutLabels(Context context, TypedArray attrs...
    method loadPullLabel (line 244) | protected String loadPullLabel(Context context, TypedArray attrs, Mode...
    method loadRefreshingLabel (line 264) | protected String loadRefreshingLabel(Context context, TypedArray attrs,
    method loadReleaseLabel (line 285) | protected String loadReleaseLabel(Context context, TypedArray attrs, M...
    method setHeight (line 296) | public void setHeight(int height) {
    method setWidth (line 302) | public final void setWidth(int width) {
    method getContentSize (line 308) | public final int getContentSize() {
    method hideAllViews (line 318) | public final void hideAllViews() {
    method hideHeaderText (line 325) | private void hideHeaderText() {
    method hideHeaderProgress (line 331) | private void hideHeaderProgress() {
    method hideSubHeaderText (line 337) | private void hideSubHeaderText() {
    method onPull (line 343) | public final void onPull(float scaleOfLayout) {
    method pullToRefresh (line 349) | public final void pullToRefresh() {
    method refreshing (line 358) | public final void refreshing() {
    method releaseToRefresh (line 375) | public final void releaseToRefresh() {
    method reset (line 384) | public final void reset() {
    method showHeaderImage (line 407) | private void showHeaderImage() {
    method hideHeaderImage (line 413) | private void hideHeaderImage() {
    method setLastUpdatedLabel (line 419) | @Override
    method setLoadingDrawable (line 424) | public final void setLoadingDrawable(Drawable imageDrawable) {
    method setPullLabel (line 435) | public void setPullLabel(CharSequence pullLabel) {
    method setRefreshingLabel (line 439) | public void setRefreshingLabel(CharSequence refreshingLabel) {
    method setReleaseLabel (line 443) | public void setReleaseLabel(CharSequence releaseLabel) {
    method setTextTypeface (line 447) | @Override
    method showInvisibleViews (line 454) | public final void showInvisibleViews() {
    method showSubHeaderText (line 461) | private void showSubHeaderText() {
    method showHeaderProgress (line 467) | private void showHeaderProgress() {
    method showHeaderText (line 473) | private void showHeaderText() {
    method getDefaultDrawableResId (line 483) | protected abstract int getDefaultDrawableResId();
    method onLoadingDrawableSet (line 485) | protected abstract void onLoadingDrawableSet(Drawable imageDrawable);
    method onPullImpl (line 487) | protected abstract void onPullImpl(float scaleOfLayout);
    method pullToRefreshImpl (line 489) | protected abstract void pullToRefreshImpl();
    method refreshingImpl (line 491) | protected abstract void refreshingImpl();
    method releaseToRefreshImpl (line 493) | protected abstract void releaseToRefreshImpl();
    method resetImpl (line 495) | protected abstract void resetImpl();
    method setSubHeaderText (line 497) | private void setSubHeaderText(CharSequence label) {
    method setSubTextAppearance (line 513) | private void setSubTextAppearance(int value) {
    method setSubTextColor (line 519) | private void setSubTextColor(ColorStateList color) {
    method setTextAppearance (line 525) | private void setTextAppearance(int value) {
    method setTextColor (line 534) | private void setTextColor(ColorStateList color) {

FILE: library/src/main/java/com/handmark/pulltorefresh/library/internal/PullingProgressLayout.java
  class PullingProgressLayout (line 34) | public class PullingProgressLayout extends LinearLayout {
    method PullingProgressLayout (line 39) | public PullingProgressLayout(Context context) {
    method PullingProgressLayout (line 45) | public PullingProgressLayout(Context context, AttributeSet attrs) {
    method initializeLayout (line 50) | private void initializeLayout(Context context) {
    method setPercent (line 71) | public void setPercent(int percent) {

FILE: library/src/main/java/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java
  class RotateLoadingLayout (line 31) | public class RotateLoadingLayout extends LoadingLayout {
    method RotateLoadingLayout (line 42) | public RotateLoadingLayout(Context context, Mode mode, Orientation scr...
    method onLoadingDrawableSet (line 59) | public void onLoadingDrawableSet(Drawable imageDrawable) {
    method onPullImpl (line 66) | protected void onPullImpl(float scaleOfLayout) {
    method refreshingImpl (line 78) | @Override
    method resetImpl (line 83) | @Override
    method resetImageRotation (line 89) | private void resetImageRotation() {
    method pullToRefreshImpl (line 96) | @Override
    method releaseToRefreshImpl (line 101) | @Override
    method getDefaultDrawableResId (line 106) | @Override

FILE: library/src/main/java/com/handmark/pulltorefresh/library/internal/Utils.java
  class Utils (line 28) | public class Utils {
    method warnDeprecation (line 44) | public static void warnDeprecation(String depreacted, String replaceme...
    method closeSilently (line 51) | public static void closeSilently(InputStream is) {
    method closeSilently (line 73) | public static void closeSilently(Reader br) {
    method existAttributeIntValue (line 95) | @Deprecated
    method existAttributeIntValue (line 106) | @Deprecated
    method existAttributeIntValue (line 118) | @Deprecated
    method existAttributeValue (line 140) | public static boolean existAttributeValue(AttributeSet attrs, String a...
    method existAttributeValue (line 150) | public static boolean existAttributeValue(AttributeSet attrs, String n...
    method getActionBarSize (line 172) | public static int getActionBarSize(Context context) {
    method getStatusBarSize (line 186) | public static int getStatusBarSize(Context context) {

FILE: library/src/main/java/com/handmark/pulltorefresh/library/internal/ViewCompat.java
  class ViewCompat (line 31) | @SuppressWarnings("deprecation")
    class Methods (line 36) | private static class Methods {
      method initializeMethods (line 47) | @SuppressWarnings("unchecked")
      method setLayerType (line 86) | private static void setLayerType(View view, int layerType) {
      method postOnAnimation (line 103) | private static void postOnAnimation(View view, Runnable runnable) {
      method setBackground (line 120) | private static void setBackground(View view, Drawable background) {
    class VERSION_CODES (line 140) | public static class VERSION_CODES {
    method postOnAnimation (line 163) | public static void postOnAnimation(View view, Runnable runnable) {
    method setBackground (line 171) | public static void setBackground(View view, Drawable background) {
    method setLayerType (line 179) | public static void setLayerType(View view, int layerType) {
    class SDK11 (line 185) | @TargetApi(11)
      method setLayerType (line 188) | public static void setLayerType(View view, int layerType) {
    class SDK16 (line 193) | @TargetApi(16)
      method postOnAnimation (line 196) | public static void postOnAnimation(View view, Runnable runnable) {
      method setBackground (line 200) | public static void setBackground(View view, Drawable background) {

FILE: sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java
  class LauncherActivity (line 25) | public class LauncherActivity extends ListActivity {
    method onCreate (line 30) | @Override
    method onListItemClick (line 36) | @Override

FILE: sample/src/com/handmark/pulltorefresh/samples/PullToRefreshCustomLoadingLayoutActivity.java
  class PullToRefreshCustomLoadingLayoutActivity (line 33) | public class PullToRefreshCustomLoadingLayoutActivity extends Activity {
    method onCreate (line 44) | @Override
    method initPullToRefresh (line 51) | private void initPullToRefresh() {
    class GetDataTask (line 75) | private class GetDataTask extends AsyncTask<Void, Void, String[]> {
      method doInBackground (line 77) | @Override
      method onPostExecute (line 88) | @Override

FILE: sample/src/com/handmark/pulltorefresh/samples/PullToRefreshExpandableListActivity.java
  class PullToRefreshExpandableListActivity (line 33) | public final class PullToRefreshExpandableListActivity extends Expandabl...
    method onCreate (line 43) | @Override
    class GetDataTask (line 79) | private class GetDataTask extends AsyncTask<Void, Void, String[]> {
      method doInBackground (line 81) | @Override
      method onPostExecute (line 91) | @Override

FILE: sample/src/com/handmark/pulltorefresh/samples/PullToRefreshGridActivity.java
  class PullToRefreshGridActivity (line 37) | public final class PullToRefreshGridActivity extends Activity {
    method onCreate (line 47) | @Override
    class GetDataTask (line 83) | private class GetDataTask extends AsyncTask<Void, Void, String[]> {
      method doInBackground (line 85) | @Override
      method onPostExecute (line 95) | @Override
    method onCreateOptionsMenu (line 108) | @Override
    method onPrepareOptionsMenu (line 116) | @Override
    method onOptionsItemSelected (line 125) | @Override

FILE: sample/src/com/handmark/pulltorefresh/samples/PullToRefreshHorizontalScrollViewActivity.java
  class PullToRefreshHorizontalScrollViewActivity (line 27) | public final class PullToRefreshHorizontalScrollViewActivity extends Act...
    method onCreate (line 33) | @Override
    class GetDataTask (line 50) | private class GetDataTask extends AsyncTask<Void, Void, String[]> {
      method doInBackground (line 52) | @Override
      method onPostExecute (line 62) | @Override

FILE: sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java
  class PullToRefreshListActivity (line 43) | public final class PullToRefreshListActivity extends ListActivity {
    method onCreate (line 55) | @Override
    class GetDataTask (line 110) | private class GetDataTask extends AsyncTask<Void, Void, String[]> {
      method doInBackground (line 112) | @Override
      method onPostExecute (line 122) | @Override
    method onCreateOptionsMenu (line 134) | @Override
    method onCreateContextMenu (line 146) | @Override
    method onPrepareOptionsMenu (line 159) | @Override
    method onOptionsItemSelected (line 173) | @Override

FILE: sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListFragmentActivity.java
  class PullToRefreshListFragmentActivity (line 32) | public final class PullToRefreshListFragmentActivity extends FragmentAct...
    method onCreate (line 41) | @Override
    method onRefresh (line 69) | @Override
    class GetDataTask (line 75) | private class GetDataTask extends AsyncTask<Void, Void, String[]> {
      method doInBackground (line 77) | @Override
      method onPostExecute (line 87) | @Override

FILE: sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListInViewPagerActivity.java
  class PullToRefreshListInViewPagerActivity (line 23) | public class PullToRefreshListInViewPagerActivity extends Activity imple...
    method onCreate (line 33) | @Override
    class ListViewPagerAdapter (line 42) | private class ListViewPagerAdapter extends PagerAdapter {
      method instantiateItem (line 44) | @Override
      method destroyItem (line 63) | @Override
      method isViewFromObject (line 68) | @Override
      method getCount (line 73) | @Override
    method onRefresh (line 80) | @Override
    class GetDataTask (line 85) | private static class GetDataTask extends AsyncTask<Void, Void, Void> {
      method GetDataTask (line 89) | public GetDataTask(PullToRefreshBase<?> refreshedView) {
      method doInBackground (line 93) | @Override
      method onPostExecute (line 103) | @Override

FILE: sample/src/com/handmark/pulltorefresh/samples/PullToRefreshScrollViewActivity.java
  class PullToRefreshScrollViewActivity (line 27) | public final class PullToRefreshScrollViewActivity extends Activity {
    method onCreate (line 33) | @Override
    class GetDataTask (line 50) | private class GetDataTask extends AsyncTask<Void, Void, String[]> {
      method doInBackground (line 52) | @Override
      method onPostExecute (line 62) | @Override

FILE: sample/src/com/handmark/pulltorefresh/samples/PullToRefreshViewPagerActivity.java
  class PullToRefreshViewPagerActivity (line 32) | public class PullToRefreshViewPagerActivity extends Activity implements ...
    method onCreate (line 36) | @Override
    method onRefresh (line 48) | @Override
    class SamplePagerAdapter (line 53) | static class SamplePagerAdapter extends PagerAdapter {
      method getCount (line 58) | @Override
      method instantiateItem (line 63) | @Override
      method destroyItem (line 74) | @Override
      method isViewFromObject (line 79) | @Override
    class GetDataTask (line 85) | private class GetDataTask extends AsyncTask<Void, Void, Void> {
      method doInBackground (line 87) | @Override
      method onPostExecute (line 97) | @Override

FILE: sample/src/com/handmark/pulltorefresh/samples/PullToRefreshWebView2Activity.java
  class PullToRefreshWebView2Activity (line 27) | public final class PullToRefreshWebView2Activity extends Activity implem...
    method onCreate (line 30) | @Override
    class SampleWebViewClient (line 47) | private static class SampleWebViewClient extends WebViewClient {
      method shouldOverrideUrlLoading (line 48) | @Override
    method onRefresh (line 55) | @Override

FILE: sample/src/com/handmark/pulltorefresh/samples/PullToRefreshWebViewActivity.java
  class PullToRefreshWebViewActivity (line 25) | public final class PullToRefreshWebViewActivity extends Activity {
    method onCreate (line 31) | @Override
    class SampleWebViewClient (line 45) | private static class SampleWebViewClient extends WebViewClient {
      method shouldOverrideUrlLoading (line 46) | @Override

FILE: sample/src/com/handmark/pulltorefresh/samples/loadinglayout/CustomLoadingLayout.java
  class CustomLoadingLayout (line 26) | public class CustomLoadingLayout extends FlipLoadingLayout {
    method CustomLoadingLayout (line 30) | public CustomLoadingLayout(Context context, Mode mode, Orientation scr...
    method getDefaultDrawableResId (line 34) | @Override
    method onPullImpl (line 40) | @Override
    method getHeaderTextColorBy (line 47) | private int getHeaderTextColorBy(float scaleOfLayout) {
    method loadPullLabel (line 58) | @Override
    method loadRefreshingLabel (line 63) | @Override
    method loadReleaseLabel (line 68) | @Override
Condensed preview — 151 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (528K chars).
[
  {
    "path": ".gitignore",
    "chars": 232,
    "preview": "#Android generated\nbin\ngen\nlibrary/build/\n\n#Eclipse\n.project\n.classpath\n.settings\n\n#IntelliJ IDEA\n.idea\n*.iml\n*.ipr\n*.iw"
  },
  {
    "path": "LICENSE",
    "chars": 11358,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "README.md",
    "chars": 4945,
    "preview": "# Pull To Refresh Views for Android `Renewal`! v3.2\n### This project is a fork of Chris Banes' Android-PullToRefresh pro"
  },
  {
    "path": "build.gradle",
    "chars": 292,
    "preview": "buildscript {\n    repositories {\n        mavenCentral()\n    }\n\n    dependencies {\n        classpath 'com.android.tools.b"
  },
  {
    "path": "extras/PullToRefreshListFragment/AndroidManifest.xml",
    "chars": 311,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "extras/PullToRefreshListFragment/LICENSE",
    "chars": 11358,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "extras/PullToRefreshListFragment/build.gradle",
    "chars": 446,
    "preview": "apply plugin: 'android-library'\n\ndependencies {\n\tcompile project(':library')\n\tcompile 'com.android.support:support-v4:18"
  },
  {
    "path": "extras/PullToRefreshListFragment/pom.xml",
    "chars": 1992,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "extras/PullToRefreshListFragment/project.properties",
    "chars": 626,
    "preview": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# T"
  },
  {
    "path": "extras/PullToRefreshListFragment/res/layout/need_this_for_maven.xml",
    "chars": 327,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshBaseListFragment.java",
    "chars": 2722,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshExpandableListFragment.java",
    "chars": 1964,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "extras/PullToRefreshListFragment/src/com/handmark/pulltorefresh/extras/listfragment/PullToRefreshListFragment.java",
    "chars": 1870,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "extras/PullToRefreshViewPager/AndroidManifest.xml",
    "chars": 307,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "extras/PullToRefreshViewPager/ant.properties",
    "chars": 698,
    "preview": "# This file is used to override default values used by the Ant build system.\n#\n# This file must be checked into Version "
  },
  {
    "path": "extras/PullToRefreshViewPager/build.gradle",
    "chars": 586,
    "preview": "apply plugin: 'android-library'\n\nbuildscript {\n    repositories {\n        mavenCentral()\n    }\n\n    dependencies {\n     "
  },
  {
    "path": "extras/PullToRefreshViewPager/pom.xml",
    "chars": 1983,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "extras/PullToRefreshViewPager/proguard-project.txt",
    "chars": 781,
    "preview": "# To enable ProGuard in your project, edit project.properties\n# to define the proguard.config property as described in t"
  },
  {
    "path": "extras/PullToRefreshViewPager/project.properties",
    "chars": 626,
    "preview": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# T"
  },
  {
    "path": "extras/PullToRefreshViewPager/res/layout/need_this_for_maven.xml",
    "chars": 327,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "extras/PullToRefreshViewPager/res/values/ids.xml",
    "chars": 105,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <item type=\"id\" name=\"viewpager\" />\n\n</resources>"
  },
  {
    "path": "extras/PullToRefreshViewPager/src/com/handmark/pulltorefresh/extras/viewpager/PullToRefreshViewPager.java",
    "chars": 2130,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "extras/pom.xml",
    "chars": 699,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "gradle.properties",
    "chars": 159,
    "preview": "PULLTOREFRESH_RELEASE_VERSION=3.2.3\nPULLTOREFRESH_RELEASE_GROUP=com.navercorp.pulltorefresh\n\nANDROID_COMPILE_SDK_VERSION"
  },
  {
    "path": "library/AndroidManifest.xml",
    "chars": 299,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "library/LICENSE",
    "chars": 11358,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "library/build.gradle",
    "chars": 510,
    "preview": "apply plugin: 'android-library'\n\nbuildscript {\n    repositories {\n        mavenCentral()\n    }\n\n    dependencies {\n     "
  },
  {
    "path": "library/pom.xml",
    "chars": 3263,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "library/project.properties",
    "chars": 382,
    "preview": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# T"
  },
  {
    "path": "library/res/anim/slide_in_from_bottom.xml",
    "chars": 865,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright (C) 2009 The Android Open Source Project\n\n     Licensed under"
  },
  {
    "path": "library/res/anim/slide_in_from_top.xml",
    "chars": 866,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright (C) 2009 The Android Open Source Project\n\n     Licensed under"
  },
  {
    "path": "library/res/anim/slide_out_to_bottom.xml",
    "chars": 865,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright (C) 2009 The Android Open Source Project\n\n     Licensed under"
  },
  {
    "path": "library/res/anim/slide_out_to_top.xml",
    "chars": 866,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n     Copyright (C) 2009 The Android Open Source Project\n\n     Licensed under"
  },
  {
    "path": "library/res/drawable/indicator_bg_bottom.xml",
    "chars": 595,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:sha"
  },
  {
    "path": "library/res/drawable/indicator_bg_top.xml",
    "chars": 595,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:sha"
  },
  {
    "path": "library/res/drawable/progress_horizontal_holo_light.xml",
    "chars": 1228,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright (C) 2010 The Android Open Source Project\n\n     Licensed under the "
  },
  {
    "path": "library/res/drawable/progress_horizontal_holo_light_right.xml",
    "chars": 1228,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright (C) 2010 The Android Open Source Project\n\n     Licensed under the "
  },
  {
    "path": "library/res/drawable/progress_indeterminate_horizontal_holo.xml",
    "chars": 1572,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n/*\n** Copyright 2011, The Android Open Source Project\n**\n** Licensed under t"
  },
  {
    "path": "library/res/layout/pull_to_refresh_header_google_style.xml",
    "chars": 1237,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <FrameLa"
  },
  {
    "path": "library/res/layout/pull_to_refresh_header_horizontal.xml",
    "chars": 1206,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <FrameLa"
  },
  {
    "path": "library/res/layout/pull_to_refresh_header_vertical.xml",
    "chars": 2433,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\n    <FrameLa"
  },
  {
    "path": "library/res/layout/pull_to_refresh_progress_google_style.xml",
    "chars": 950,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andro"
  },
  {
    "path": "library/res/layout/pulling_progress_layout.xml",
    "chars": 1089,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "library/res/values/attrs.xml",
    "chars": 6110,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <declare-styleable name=\"PullToRefresh\">\n\n        <!-- A drawabl"
  },
  {
    "path": "library/res/values/dimens.xml",
    "chars": 427,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <dimen name=\"indicator_right_padding\">10dp</dimen>\n    <dimen na"
  },
  {
    "path": "library/res/values/ids.xml",
    "chars": 183,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <item type=\"id\" name=\"gridview\" />\n    <item type=\"id\" name=\"web"
  },
  {
    "path": "library/res/values/pull_refresh_strings.xml",
    "chars": 723,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"pull_to_refresh_pull_label\">Pull to refresh…</stri"
  },
  {
    "path": "library/res/values-ar/pull_refresh_strings.xml",
    "chars": 273,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n  <string name=\"pull_to_refresh_pull_label\">اسحب للتحديث…</string>\r"
  },
  {
    "path": "library/res/values-cs/pull_refresh_strings.xml",
    "chars": 296,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n  <string name=\"pull_to_refresh_pull_label\">Tažením aktualizujete…<"
  },
  {
    "path": "library/res/values-de/pull_refresh_strings.xml",
    "chars": 300,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n  <string name=\"pull_to_refresh_pull_label\">Ziehen zum Aktualisiere"
  },
  {
    "path": "library/res/values-es/pull_refresh_strings.xml",
    "chars": 295,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n  <string name=\"pull_to_refresh_pull_label\">Tirar para actualizar…<"
  },
  {
    "path": "library/res/values-fi/pull_refresh_strings.xml",
    "chars": 726,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"pull_to_refresh_pull_label\">Päivitä vetämällä alas"
  },
  {
    "path": "library/res/values-fr/pull_refresh_strings.xml",
    "chars": 299,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n  <string name=\"pull_to_refresh_pull_label\">Tirez pour rafraîchir…<"
  },
  {
    "path": "library/res/values-he/pull_refresh_strings.xml",
    "chars": 270,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n  <string name=\"pull_to_refresh_pull_label\">משוך לרענון…</string>\r\n"
  },
  {
    "path": "library/res/values-it/pull_refresh_strings.xml",
    "chars": 296,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n  <string name=\"pull_to_refresh_pull_label\">Tira per aggiornare…</s"
  },
  {
    "path": "library/res/values-iw/pull_refresh_strings.xml",
    "chars": 270,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n  <string name=\"pull_to_refresh_pull_label\">משוך לרענון…</string>\r\n"
  },
  {
    "path": "library/res/values-ja/pull_refresh_strings.xml",
    "chars": 264,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n  <string name=\"pull_to_refresh_pull_label\">画面を引っ張って…</string>\r\n  <"
  },
  {
    "path": "library/res/values-ko/pull_refresh_strings.xml",
    "chars": 266,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n  <string name=\"pull_to_refresh_pull_label\">당겨서 새로 고침…</string>\r\n  "
  },
  {
    "path": "library/res/values-nl/pull_refresh_strings.xml",
    "chars": 296,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n  <string name=\"pull_to_refresh_pull_label\">Sleep om te vernieuwen…"
  },
  {
    "path": "library/res/values-pl/pull_refresh_strings.xml",
    "chars": 298,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n  <string name=\"pull_to_refresh_pull_label\">Pociągnij, aby odświeży"
  },
  {
    "path": "library/res/values-pt/pull_refresh_strings.xml",
    "chars": 297,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n  <string name=\"pull_to_refresh_pull_label\">Puxe para atualizar…</s"
  },
  {
    "path": "library/res/values-pt-rBR/pull_refresh_strings.xml",
    "chars": 294,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n  <string name=\"pull_to_refresh_pull_label\">Puxe para atualizar…</s"
  },
  {
    "path": "library/res/values-ro/pull_refresh_strings.xml",
    "chars": 312,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n  <string name=\"pull_to_refresh_pull_label\">Trage pentru a reîmpros"
  },
  {
    "path": "library/res/values-ru/pull_refresh_strings.xml",
    "chars": 299,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n  <string name=\"pull_to_refresh_pull_label\">Потяните для обновления"
  },
  {
    "path": "library/res/values-zh/pull_refresh_strings.xml",
    "chars": 257,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<resources>\r\n  <string name=\"pull_to_refresh_pull_label\">下拉刷新…</string>\r\n  <stri"
  },
  {
    "path": "library/res/xml/pulltorefresh.xml",
    "chars": 827,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<PullToRefresh>\n    <LoadingLayouts>\n       <layout name=\"rotate\">com.handmark.pu"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/configuration/xml/ExtendedXmlConfigParserFactory.java",
    "chars": 2781,
    "preview": "/*******************************************************************************\n * Copyright 2013 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/configuration/xml/PullToRefreshConfigXmlParser.java",
    "chars": 5719,
    "preview": "/*******************************************************************************\n * Copyright 2013 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/configuration/xml/PullToRefreshNode.java",
    "chars": 4739,
    "preview": "/*******************************************************************************\n * Copyright 2013 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/configuration/xml/PullToRefreshXmlConfiguration.java",
    "chars": 6303,
    "preview": "/*******************************************************************************\n * Copyright 2013 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/configuration/xml/XmlPullNode.java",
    "chars": 7625,
    "preview": "/*******************************************************************************\n * Copyright 2013 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/configuration/xml/XmlPullNodeParser.java",
    "chars": 4291,
    "preview": "/*******************************************************************************\n * Copyright 2013 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/configuration/xml/XmlPullParserWrapper.java",
    "chars": 13488,
    "preview": "/*******************************************************************************\n * Copyright 2013 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/AlphaAnimator.java",
    "chars": 1962,
    "preview": "/*******************************************************************************\n * Copyright 2014 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/GoogleStyleProgressLayout.java",
    "chars": 2537,
    "preview": "/*******************************************************************************\n * Copyright 2014 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/GoogleStyleProgressLayoutFactory.java",
    "chars": 7632,
    "preview": "/*******************************************************************************\n * Copyright 2013 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/GoogleStyleViewLayout.java",
    "chars": 1679,
    "preview": "/*******************************************************************************\n * Copyright 2014 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/GoogleStyleViewLayoutFactory.java",
    "chars": 7456,
    "preview": "/*******************************************************************************\n * Copyright 2013 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/IGoogleStyleProgressLayout.java",
    "chars": 976,
    "preview": "/*******************************************************************************\n * Copyright 2014 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/IGoogleStyleViewLayout.java",
    "chars": 972,
    "preview": "/*******************************************************************************\n * Copyright 2014 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/IIndicatorLayout.java",
    "chars": 1807,
    "preview": "/*******************************************************************************\n * Copyright 2013 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/ILoadingLayout.java",
    "chars": 2402,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/IPullToRefresh.java",
    "chars": 8504,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/IPullToRefreshConsumer.java",
    "chars": 1060,
    "preview": "/*******************************************************************************\n * Copyright 2014 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/IndicatorLayoutFactory.java",
    "chars": 6836,
    "preview": "/*******************************************************************************\n * Copyright 2013 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/LoadingLayoutFactory.java",
    "chars": 7158,
    "preview": "/*******************************************************************************\n * Copyright 2013 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/LoadingLayoutProxy.java",
    "chars": 2614,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/OverscrollHelper.java",
    "chars": 7952,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshAdapterViewBase.java",
    "chars": 16444,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshBase.java",
    "chars": 70020,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshExpandableListView.java",
    "chars": 3542,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshGridView.java",
    "chars": 3330,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshHorizontalScrollView.java",
    "chars": 3681,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshListView.java",
    "chars": 10903,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshScrollView.java",
    "chars": 3532,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/PullToRefreshWebView.java",
    "chars": 5384,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/extras/PullToRefreshWebView2.java",
    "chars": 4343,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/extras/SoundPullEventListener.java",
    "chars": 3004,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/internal/AbstractDefaultGoogleStyleViewLayout.java",
    "chars": 14041,
    "preview": "/*******************************************************************************\n * Copyright 2014 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/internal/Assert.java",
    "chars": 1482,
    "preview": "/*******************************************************************************\n * Copyright 2013 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/internal/DefaultGoogleStyleProgressLayout.java",
    "chars": 3074,
    "preview": "/*******************************************************************************\n * Copyright 2014 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/internal/DefaultGoogleStyleViewLayout.java",
    "chars": 3104,
    "preview": "/*******************************************************************************\n * Copyright 2014 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/internal/DefaultIndicatorLayout.java",
    "chars": 6196,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/internal/EmptyViewMethodAccessor.java",
    "chars": 1432,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/internal/FlipLoadingLayout.java",
    "chars": 4681,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/internal/FlippedProgressBar.java",
    "chars": 1633,
    "preview": "/*******************************************************************************\n * Copyright 2014 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/internal/IndicatorLayout.java",
    "chars": 2110,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/internal/LoadingLayout.java",
    "chars": 16884,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/internal/PullingProgressLayout.java",
    "chars": 2662,
    "preview": "/*******************************************************************************\n * Copyright 2014 Naver Business Platfo"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/internal/RotateLoadingLayout.java",
    "chars": 3571,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/internal/Utils.java",
    "chars": 6939,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "library/src/main/java/com/handmark/pulltorefresh/library/internal/ViewCompat.java",
    "chars": 7220,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "pom.xml",
    "chars": 5756,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "sample/AndroidManifest.xml",
    "chars": 2595,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package="
  },
  {
    "path": "sample/LICENSE",
    "chars": 11358,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "sample/assets/ptr_webview2_sample.html",
    "chars": 3344,
    "preview": "<html>\n<head>\n<title>PullToRefreshWebView2 Sample</title>\n\n<script language=\"javascript\" type=\"text/javascript\">\n functi"
  },
  {
    "path": "sample/assets/pulltorefresh.xml",
    "chars": 222,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<PullToRefresh>\n    <LoadingLayouts>\n     <layout name=\"my_custom\">com.handmark.p"
  },
  {
    "path": "sample/pom.xml",
    "chars": 1839,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "sample/project.properties",
    "chars": 525,
    "preview": "# This file is automatically generated by Android Tools.\n# Do not modify this file -- YOUR CHANGES WILL BE ERASED!\n#\n# T"
  },
  {
    "path": "sample/res/layout/activity_ptr_custom_loadinglayout.xml",
    "chars": 660,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "sample/res/layout/activity_ptr_expandable_list.xml",
    "chars": 773,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "sample/res/layout/activity_ptr_grid.xml",
    "chars": 869,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "sample/res/layout/activity_ptr_horizontalscrollview.xml",
    "chars": 2557,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "sample/res/layout/activity_ptr_list.xml",
    "chars": 840,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "sample/res/layout/activity_ptr_list_fragment.xml",
    "chars": 452,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andro"
  },
  {
    "path": "sample/res/layout/activity_ptr_list_in_vp.xml",
    "chars": 485,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "sample/res/layout/activity_ptr_scrollview.xml",
    "chars": 966,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "sample/res/layout/activity_ptr_viewpager.xml",
    "chars": 698,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andro"
  },
  {
    "path": "sample/res/layout/activity_ptr_webview.xml",
    "chars": 605,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "sample/res/layout/activity_ptr_webview2.xml",
    "chars": 614,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "sample/res/layout/layout_listview_in_viewpager.xml",
    "chars": 351,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.handmark.pulltorefresh.library.PullToRefreshListView xmlns:android=\"http://s"
  },
  {
    "path": "sample/res/values/strings.xml",
    "chars": 3086,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"hello\">Hello World, PullToRefreshActivity!</string"
  },
  {
    "path": "sample/res/values/styles.xml",
    "chars": 473,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <styl"
  },
  {
    "path": "sample/src/com/handmark/pulltorefresh/samples/LauncherActivity.java",
    "chars": 2693,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "sample/src/com/handmark/pulltorefresh/samples/PullToRefreshCustomLoadingLayoutActivity.java",
    "chars": 3797,
    "preview": "/*\n * Copyright (C) 2014 Naver Business Platform Corp.\n * \n * Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "sample/src/com/handmark/pulltorefresh/samples/PullToRefreshExpandableListActivity.java",
    "chars": 4301,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "sample/src/com/handmark/pulltorefresh/samples/PullToRefreshGridActivity.java",
    "chars": 4697,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "sample/src/com/handmark/pulltorefresh/samples/PullToRefreshHorizontalScrollViewActivity.java",
    "chars": 2459,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListActivity.java",
    "chars": 7371,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListFragmentActivity.java",
    "chars": 3894,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "sample/src/com/handmark/pulltorefresh/samples/PullToRefreshListInViewPagerActivity.java",
    "chars": 3286,
    "preview": "package com.handmark.pulltorefresh.samples;\n\nimport java.util.Arrays;\n\nimport android.app.Activity;\nimport android.conte"
  },
  {
    "path": "sample/src/com/handmark/pulltorefresh/samples/PullToRefreshScrollViewActivity.java",
    "chars": 2359,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "sample/src/com/handmark/pulltorefresh/samples/PullToRefreshViewPagerActivity.java",
    "chars": 3332,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "sample/src/com/handmark/pulltorefresh/samples/PullToRefreshWebView2Activity.java",
    "chars": 2494,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "sample/src/com/handmark/pulltorefresh/samples/PullToRefreshWebViewActivity.java",
    "chars": 1819,
    "preview": "/*******************************************************************************\n * Copyright 2011, 2012 Chris Banes.\n *"
  },
  {
    "path": "sample/src/com/handmark/pulltorefresh/samples/loadinglayout/CustomLoadingLayout.java",
    "chars": 2309,
    "preview": "/*\n * Copyright (C) 2014 Naver Business Platform Corp.\n * \n * Licensed under the Apache License, Version 2.0 (the \"Licen"
  },
  {
    "path": "settings.gradle",
    "chars": 101,
    "preview": "include 'library'\ninclude 'extras/PullToRefreshListFragment'\ninclude 'extras/PullToRefreshViewPager'\n"
  }
]

// ... and 4 more files (download for full content)

About this extraction

This page contains the full source code of the naver/android-pull-to-refresh GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 151 files (470.5 KB), approximately 118.1k tokens, and a symbol index with 798 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!