[
  {
    "path": ".gitignore",
    "content": ".gradle\n/local.properties\n/.idea/workspace.xml\n.DS_Store\n/build\n# built application files\n*.apk\n*.ap_\n\n# files for the dex VM\n*.dex\n\n# Java class files\n*.class\n.DS_Store\n\n# generated files\nbin/\ngen/\nWiki/\n\n# Local configuration file (sdk path, etc)\nlocal.properties\n\n# Eclipse project files\n.classpath\n.project\n.settings/\n\n# Proguard folder generated by Eclipse\nproguard/\n\n#Android Studio\nbuild/\n\n# Intellij project files\n*.iml\n*.ipr\n*.iws\n.idea/\n\n#gradle\n.gradle/"
  },
  {
    "path": ".travis.yml",
    "content": "language: android\nandroid:\n  components:\n  - tools\n  - platform-tools\n  - build-tools-25.0.2\n  - android-25\n  - extra-android-support\n  - extra\n  - extra-android-m2repository\nscript:\n  - ./gradlew assembleDebug"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2014 代码家\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Android Swipe Layout [![Build Status](https://travis-ci.org/daimajia/AndroidSwipeLayout.svg?branch=master)](https://travis-ci.org/daimajia/AndroidSwipeLayout)\n\n[![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/daimajia/AndroidSwipeLayout?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\n[![Insight.io](https://insight.io/repoBadge/github.com/daimajia/AndroidSwipeLayout)](https://insight.io/github.com/daimajia/AndroidSwipeLayout)\n\nThis is the brother of [AndroidViewHover](https://github.com/daimajia/AndroidViewHover).\n\nOne year ago, I started to make an app named [EverMemo](https://play.google.com/store/apps/details?id=com.zhan_dui.evermemo) with my good friends. The designer gave me a design picture, the design like this:\n\n![](http://ww1.sinaimg.cn/mw690/610dc034jw1ejoquidvvsg208i0630u4.gif)\n\nI found it was pretty hard to achieve this effect, cause you had to be very familiar with the Android Touch System. It was beyond my ability that moment, and I also noticed that there was no such a concept library...\n\nTime passed, finally...as you see right now.\n\n## Demo\n\n![](http://ww2.sinaimg.cn/mw690/610dc034jw1ejoplapwtqg208n0e74dx.gif)\n\n[Download Demo](https://github.com/daimajia/AndroidSwipeLayout/releases/download/v1.1.8/AndroidSwipeLayout-v1.1.8.apk)\n\nBefore I made this, I actually found some libraries (eg.[SwipeListView](https://github.com/47deg/android-swipelistview)) that helps developers to integrate swiping with your UI component. \n\nBut it only works in `ListView`, and it has too many issues that they never care. What a pity!\n\nWhen I start to make this library, I set some goals:\n\n- Can be easily integrated in anywhere, ListView, GridView, ViewGroup etc.\n- Can receive `onOpen`,`onClose`,`onUpdate` callbacks.\n- Can notifiy the hidden children how much they have shown.\n- Can be nested each other.\n- Can handle complicate situation, just like [this](https://camo.githubusercontent.com/d145d9a9508b3d204b70882c05bc3d9bd433883c/687474703a2f2f7777312e73696e61696d672e636e2f6c617267652f3631306463303334677731656b686f6a7379326172673230386530366e6774312e676966).\n\n\n## Usage\n\n### Step 1\n#### Gradle\n\n```groovy\ndependencies {\n    compile 'com.android.support:recyclerview-v7:21.0.0'\n    compile 'com.android.support:support-v4:20.+'\n    compile \"com.daimajia.swipelayout:library:1.2.0@aar\"\n}\n```\n\n#### Maven\n\n```xml\n<dependency>\n\t<groupId>com.google.android</groupId>\n\t<artifactId>support-v4</artifactId>\n\t<version>r6</version>\n</dependency>\n<dependency>\n\t<groupId>com.google.android</groupId>\n\t<artifactId>recyclerview-v7</artifactId>\n\t<version>21.0.0</version>\n</dependency>\n<dependency>\n    <groupId>com.daimajia.swipelayout</groupId>\n    <artifactId>library</artifactId>\n    <version>1.2.0</version>\n    <type>apklib</type>\n</dependency>\n```\n\n#### Eclipse\n\n[AndroidSwipeLayout-v1.1.8.jar](https://github.com/daimajia/AndroidSwipeLayout/releases/download/v1.1.8/AndroidSwipeLayout-v1.1.8.jar)\n\n### Step 2\n\n**Make sure to use the internal adapter instead of your own!**\n\n[Wiki Usage](https://github.com/daimajia/AndroidSwipeLayout/wiki/usage)\n\n## Wiki\n\n[Go to Wiki](https://github.com/daimajia/AndroidSwipeLayout/wiki)\n\n## About me\n\nA student in mainland China.\n\nWelcome to [offer me an internship](mailto:daimajia@gmail.com). If you have any new idea about this project, feel free to [contact me](mailto:daimajia@gmail.com). :smiley:\n\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    repositories {\n        jcenter()\n        maven {\n            url \"https://jitpack.io\"\n        }\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:2.3.0'\n        classpath 'com.github.dcendents:android-maven-plugin:1.2'\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        jcenter()\n        maven {\n            url \"https://jitpack.io\"\n        }\n    }\n}\n"
  },
  {
    "path": "demo/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "demo/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nrepositories {\n    jcenter()\n}\n\nandroid {\n    compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)\n    buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION\n    defaultConfig {\n        minSdkVersion Integer.parseInt(project.ANDROID_BUILD_MIN_SDK_VERSION)\n        targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)\n        versionName project.VERSION_NAME\n        versionCode Integer.parseInt(project.VERSION_CODE)\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n    lintOptions {\n        abortOnError false\n    }\n}\n\ndependencies {\n    compile project(\":library\")\n    compile 'com.android.support:recyclerview-v7:25.1.1'\n    compile 'com.daimajia.easing:library:1.0.0@aar'\n    compile 'com.daimajia.androidanimations:library:1.1.2@aar'\n    compile 'com.nineoldandroids:library:2.4.0'\n    // This dude gave a shoutout to you (daimajia) on his github page:\n    compile 'jp.wasabeef:recyclerview-animators:1.0.3@aar'\n}\n"
  },
  {
    "path": "demo/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Applications/Android Studio.app/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "demo/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"com.daimajia.swipedemo\">\n\n    <uses-sdk tools:overrideLibrary=\"org.lucasr.twowayview, org.lucasr.twowayview.widget, jp.wasabeef.recyclerview\" />\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@drawable/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:theme=\"@style/AppTheme\">\n        <activity\n            android:name=\"com.daimajia.swipedemo.MyActivity\"\n            android:label=\"@string/app_name\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n        <activity android:name=\"com.daimajia.swipedemo.ListViewExample\" />\n        <activity android:name=\"com.daimajia.swipedemo.GridViewExample\" />\n        <activity android:name=\"com.daimajia.swipedemo.RecyclerViewExample\" />\n        <activity android:name=\".NestedExample\" />\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "demo/src/main/java/com/daimajia/swipedemo/GridViewExample.java",
    "content": "package com.daimajia.swipedemo;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.View;\nimport android.widget.AdapterView;\nimport android.widget.GridView;\n\nimport com.daimajia.swipe.util.Attributes;\nimport com.daimajia.swipedemo.adapter.GridViewAdapter;\n\npublic class GridViewExample extends Activity{\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.gridview);\n        final GridView gridView = (GridView)findViewById(R.id.gridview);\n        final GridViewAdapter adapter = new GridViewAdapter(this);\n        adapter.setMode(Attributes.Mode.Multiple);\n        gridView.setAdapter(adapter);\n        gridView.setSelected(false);\n        gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {\n            @Override\n            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {\n                Log.e(\"onItemLongClick\",\"onItemLongClick:\" + position);\n                return false;\n            }\n        });\n        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {\n            @Override\n            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {\n                Log.e(\"onItemClick\",\"onItemClick:\" + position);\n            }\n        });\n\n\n        gridView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\n            @Override\n            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {\n                Log.e(\"onItemSelected\",\"onItemSelected:\" + position);\n            }\n\n            @Override\n            public void onNothingSelected(AdapterView<?> parent) {\n\n            }\n        });\n\n    }\n}\n"
  },
  {
    "path": "demo/src/main/java/com/daimajia/swipedemo/ListViewExample.java",
    "content": "package com.daimajia.swipedemo;\n\nimport android.app.ActionBar;\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.widget.AbsListView;\nimport android.widget.AdapterView;\nimport android.widget.ListView;\nimport android.widget.Toast;\n\nimport com.daimajia.swipe.SwipeLayout;\nimport com.daimajia.swipe.util.Attributes;\nimport com.daimajia.swipedemo.adapter.ListViewAdapter;\n\npublic class ListViewExample extends Activity {\n\n    private ListView mListView;\n    private ListViewAdapter mAdapter;\n    private Context mContext = this;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.listview);\n        mListView = (ListView) findViewById(R.id.listview);\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {\n            ActionBar actionBar = getActionBar();\n            if (actionBar != null) {\n                actionBar.setTitle(\"ListView\");\n            }\n        }\n\n        /**\n         * The following comment is the sample usage of ArraySwipeAdapter.\n         */\n//        String[] adapterData = new String[]{\"Activity\", \"Service\", \"Content Provider\", \"Intent\", \"BroadcastReceiver\", \"ADT\", \"Sqlite3\", \"HttpClient\",\n//                \"DDMS\", \"Android Studio\", \"Fragment\", \"Loader\", \"Activity\", \"Service\", \"Content Provider\", \"Intent\",\n//                \"BroadcastReceiver\", \"ADT\", \"Sqlite3\", \"HttpClient\", \"Activity\", \"Service\", \"Content Provider\", \"Intent\",\n//                \"BroadcastReceiver\", \"ADT\", \"Sqlite3\", \"HttpClient\"};\n//        mListView.setAdapter(new ArraySwipeAdapterSample<String>(this, R.layout.listview_item, R.id.position, adapterData));\n\n        mAdapter = new ListViewAdapter(this);\n        mListView.setAdapter(mAdapter);\n        mAdapter.setMode(Attributes.Mode.Single);\n        mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {\n            @Override\n            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {\n                ((SwipeLayout)(mListView.getChildAt(position - mListView.getFirstVisiblePosition()))).open(true);\n            }\n        });\n        mListView.setOnTouchListener(new View.OnTouchListener() {\n            @Override\n            public boolean onTouch(View v, MotionEvent event) {\n                Log.e(\"ListView\", \"OnTouch\");\n                return false;\n            }\n        });\n        mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {\n            @Override\n            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {\n                Toast.makeText(mContext, \"OnItemLongClickListener\", Toast.LENGTH_SHORT).show();\n                return true;\n            }\n        });\n        mListView.setOnScrollListener(new AbsListView.OnScrollListener() {\n            @Override\n            public void onScrollStateChanged(AbsListView view, int scrollState) {\n                Log.e(\"ListView\", \"onScrollStateChanged\");\n            }\n\n            @Override\n            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {\n\n            }\n        });\n\n        mListView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {\n            @Override\n            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {\n                Log.e(\"ListView\", \"onItemSelected:\" + position);\n            }\n\n            @Override\n            public void onNothingSelected(AdapterView<?> parent) {\n                Log.e(\"ListView\", \"onNothingSelected:\");\n            }\n        });\n\n    }\n\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        // Inflate the menu; this adds items to the action bar if it is present.\n        getMenuInflater().inflate(R.menu.my, menu);\n        return true;\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        // Handle action bar item clicks here. The action bar will\n        // automatically handle clicks on the Home/Up button, so long\n        // as you specify a parent activity in AndroidManifest.xml.\n        int id = item.getItemId();\n        if (id == R.id.action_listview) {\n            startActivity(new Intent(this, ListViewExample.class));\n            finish();\n            return true;\n        } else if (id == R.id.action_gridview) {\n            startActivity(new Intent(this, GridViewExample.class));\n            finish();\n            return true;\n        } else if (id == R.id.action_recycler) {\n            startActivity(new Intent(this, RecyclerViewExample.class));\n            finish();\n            return true;\n        }\n        return super.onOptionsItemSelected(item);\n    }\n}\n"
  },
  {
    "path": "demo/src/main/java/com/daimajia/swipedemo/MyActivity.java",
    "content": "package com.daimajia.swipedemo;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.graphics.Color;\nimport android.os.Bundle;\nimport android.util.Log;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.widget.Toast;\n\nimport com.daimajia.swipe.SwipeLayout;\nimport com.nineoldandroids.view.ViewHelper;\n\npublic class MyActivity extends Activity {\n\n    private SwipeLayout sample1, sample2, sample3;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.main);\n\n//        SwipeLayout swipeLayout = (SwipeLayout)findViewById(R.id.godfather);\n//        swipeLayout.setDragEdge(SwipeLayout.DragEdge.Bottom); // Set in XML\n\n        //sample1\n\n        sample1 = (SwipeLayout) findViewById(R.id.sample1);\n        sample1.setShowMode(SwipeLayout.ShowMode.PullOut);\n        View starBottView = sample1.findViewById(R.id.starbott);\n        sample1.addDrag(SwipeLayout.DragEdge.Left, sample1.findViewById(R.id.bottom_wrapper));\n        sample1.addDrag(SwipeLayout.DragEdge.Right, sample1.findViewById(R.id.bottom_wrapper_2));\n        sample1.addDrag(SwipeLayout.DragEdge.Top, starBottView);\n        sample1.addDrag(SwipeLayout.DragEdge.Bottom, starBottView);\n        sample1.addRevealListener(R.id.delete, new SwipeLayout.OnRevealListener() {\n            @Override\n            public void onReveal(View child, SwipeLayout.DragEdge edge, float fraction, int distance) {\n\n            }\n        });\n\n        sample1.getSurfaceView().setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Toast.makeText(MyActivity.this, \"Click on surface\", Toast.LENGTH_SHORT).show();\n                Log.d(MyActivity.class.getName(), \"click on surface\");\n            }\n        });\n        sample1.getSurfaceView().setOnLongClickListener(new View.OnLongClickListener() {\n            @Override\n            public boolean onLongClick(View v) {\n                Toast.makeText(MyActivity.this, \"longClick on surface\", Toast.LENGTH_SHORT).show();\n                Log.d(MyActivity.class.getName(), \"longClick on surface\");\n                return true;\n            }\n        });\n        sample1.findViewById(R.id.star2).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Toast.makeText(MyActivity.this, \"Star\", Toast.LENGTH_SHORT).show();\n            }\n        });\n\n        sample1.findViewById(R.id.trash2).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Toast.makeText(MyActivity.this, \"Trash Bin\", Toast.LENGTH_SHORT).show();\n            }\n        });\n\n        sample1.findViewById(R.id.magnifier2).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Toast.makeText(MyActivity.this, \"Magnifier\", Toast.LENGTH_SHORT).show();\n            }\n        });\n\n        sample1.addRevealListener(R.id.starbott, new SwipeLayout.OnRevealListener() {\n            @Override\n            public void onReveal(View child, SwipeLayout.DragEdge edge, float fraction, int distance) {\n                View star = child.findViewById(R.id.star);\n                float d = child.getHeight() / 2 - star.getHeight() / 2;\n                ViewHelper.setTranslationY(star, d * fraction);\n                ViewHelper.setScaleX(star, fraction + 0.6f);\n                ViewHelper.setScaleY(star, fraction + 0.6f);\n            }\n        });\n\n        //sample2\n\n        sample2 = (SwipeLayout) findViewById(R.id.sample2);\n        sample2.setShowMode(SwipeLayout.ShowMode.LayDown);\n        sample2.addDrag(SwipeLayout.DragEdge.Right, sample2.findViewWithTag(\"Bottom2\"));\n//        sample2.setShowMode(SwipeLayout.ShowMode.PullOut);\n        sample2.findViewById(R.id.star).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Toast.makeText(MyActivity.this, \"Star\", Toast.LENGTH_SHORT).show();\n            }\n        });\n\n        sample2.findViewById(R.id.trash).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Toast.makeText(MyActivity.this, \"Trash Bin\", Toast.LENGTH_SHORT).show();\n            }\n        });\n\n        sample2.findViewById(R.id.magnifier).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Toast.makeText(MyActivity.this, \"Magnifier\", Toast.LENGTH_SHORT).show();\n            }\n        });\n\n        sample2.findViewById(R.id.click).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Toast.makeText(MyActivity.this, \"Yo\", Toast.LENGTH_SHORT).show();\n            }\n        });\n        sample2.getSurfaceView().setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Toast.makeText(MyActivity.this, \"Click on surface\", Toast.LENGTH_SHORT).show();\n            }\n        });\n\n        //sample3\n\n        sample3 = (SwipeLayout) findViewById(R.id.sample3);\n        sample3.addDrag(SwipeLayout.DragEdge.Top, sample3.findViewWithTag(\"Bottom3\"));\n        sample3.addRevealListener(R.id.bottom_wrapper_child1, new SwipeLayout.OnRevealListener() {\n            @Override\n            public void onReveal(View child, SwipeLayout.DragEdge edge, float fraction, int distance) {\n                View star = child.findViewById(R.id.star);\n                float d = child.getHeight() / 2 - star.getHeight() / 2;\n                ViewHelper.setTranslationY(star, d * fraction);\n                ViewHelper.setScaleX(star, fraction + 0.6f);\n                ViewHelper.setScaleY(star, fraction + 0.6f);\n                int c = (Integer) evaluate(fraction, Color.parseColor(\"#dddddd\"), Color.parseColor(\"#4C535B\"));\n                child.setBackgroundColor(c);\n            }\n        });\n        sample3.findViewById(R.id.bottom_wrapper_child1).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Toast.makeText(MyActivity.this, \"Yo!\", Toast.LENGTH_SHORT).show();\n            }\n        });\n        sample3.getSurfaceView().setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Toast.makeText(MyActivity.this, \"Click on surface\", Toast.LENGTH_SHORT).show();\n            }\n        });\n\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        // Inflate the menu; this adds items to the action bar if it is present.\n        getMenuInflater().inflate(R.menu.my, menu);\n        return true;\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        // Handle action bar item clicks here. The action bar will\n        // automatically handle clicks on the Home/Up button, so long\n        // as you specify a parent activity in AndroidManifest.xml.\n        int id = item.getItemId();\n        if (id == R.id.action_listview) {\n            startActivity(new Intent(this, ListViewExample.class));\n            return true;\n        } else if (id == R.id.action_gridview) {\n            startActivity(new Intent(this, GridViewExample.class));\n            return true;\n        } else if (id == R.id.action_nested) {\n            startActivity(new Intent(this, NestedExample.class));\n            return true;\n        } else if (id == R.id.action_recycler) {\n            startActivity(new Intent(this, RecyclerViewExample.class));\n        }\n        return super.onOptionsItemSelected(item);\n    }\n\n    /*\n    Color transition method.\n     */\n    public Object evaluate(float fraction, Object startValue, Object endValue) {\n        int startInt = (Integer) startValue;\n        int startA = (startInt >> 24) & 0xff;\n        int startR = (startInt >> 16) & 0xff;\n        int startG = (startInt >> 8) & 0xff;\n        int startB = startInt & 0xff;\n\n        int endInt = (Integer) endValue;\n        int endA = (endInt >> 24) & 0xff;\n        int endR = (endInt >> 16) & 0xff;\n        int endG = (endInt >> 8) & 0xff;\n        int endB = endInt & 0xff;\n\n        return (int) ((startA + (int) (fraction * (endA - startA))) << 24) |\n                (int) ((startR + (int) (fraction * (endR - startR))) << 16) |\n                (int) ((startG + (int) (fraction * (endG - startG))) << 8) |\n                (int) ((startB + (int) (fraction * (endB - startB))));\n    }\n}\n"
  },
  {
    "path": "demo/src/main/java/com/daimajia/swipedemo/NestedExample.java",
    "content": "package com.daimajia.swipedemo;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.view.View;\nimport android.widget.Toast;\n\nimport com.daimajia.swipe.SwipeLayout;\n\npublic class NestedExample extends Activity{\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.complicate_layout);\n         SwipeLayout swipeLayout = (SwipeLayout)findViewById(R.id.test_swipe_swipe);\n        swipeLayout.setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() {\n            @Override\n            public void onDoubleClick(SwipeLayout layout, boolean surface) {\n                Toast.makeText(getApplicationContext(), \"DoubleClick\", Toast.LENGTH_SHORT).show();\n            }\n        });\n        swipeLayout.findViewById(R.id.trash).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                Toast.makeText(getApplicationContext(), \"Click\", Toast.LENGTH_SHORT).show();\n            }\n        });\n    }\n\n\n}\n"
  },
  {
    "path": "demo/src/main/java/com/daimajia/swipedemo/RecyclerViewExample.java",
    "content": "package com.daimajia.swipedemo;\n\nimport android.app.ActionBar;\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.util.Log;\nimport android.view.Menu;\nimport android.view.MenuItem;\n\nimport com.daimajia.swipe.util.Attributes;\nimport com.daimajia.swipedemo.adapter.RecyclerViewAdapter;\nimport com.daimajia.swipedemo.adapter.util.DividerItemDecoration;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\n\nimport jp.wasabeef.recyclerview.animators.FadeInLeftAnimator;\n\npublic class RecyclerViewExample extends Activity {\n\n    /**\n     * RecyclerView: The new recycler view replaces the list view. Its more modular and therefore we\n     * must implement some of the functionality ourselves and attach it to our recyclerview.\n     * <p/>\n     * 1) Position items on the screen: This is done with LayoutManagers\n     * 2) Animate & Decorate views: This is done with ItemAnimators & ItemDecorators\n     * 3) Handle any touch events apart from scrolling: This is now done in our adapter's ViewHolder\n     */\n\n    private RecyclerView recyclerView;\n    private RecyclerView.Adapter mAdapter;\n\n    private ArrayList<String> mDataSet;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.recyclerview);\n        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {\n            ActionBar actionBar = getActionBar();\n            if (actionBar != null) {\n                actionBar.setTitle(\"RecyclerView\");\n            }\n        }\n\n        // Layout Managers:\n        recyclerView.setLayoutManager(new LinearLayoutManager(this));\n\n        // Item Decorator:\n        recyclerView.addItemDecoration(new DividerItemDecoration(getResources().getDrawable(R.drawable.divider)));\n        recyclerView.setItemAnimator(new FadeInLeftAnimator());\n\n        // Adapter:\n        String[] adapterData = new String[]{\"Alabama\", \"Alaska\", \"Arizona\", \"Arkansas\", \"California\", \"Colorado\", \"Connecticut\", \"Delaware\", \"Florida\", \"Georgia\", \"Hawaii\", \"Idaho\", \"Illinois\", \"Indiana\", \"Iowa\", \"Kansas\", \"Kentucky\", \"Louisiana\", \"Maine\", \"Maryland\", \"Massachusetts\", \"Michigan\", \"Minnesota\", \"Mississippi\", \"Missouri\", \"Montana\", \"Nebraska\", \"Nevada\", \"New Hampshire\", \"New Jersey\", \"New Mexico\", \"New York\", \"North Carolina\", \"North Dakota\", \"Ohio\", \"Oklahoma\", \"Oregon\", \"Pennsylvania\", \"Rhode Island\", \"South Carolina\", \"South Dakota\", \"Tennessee\", \"Texas\", \"Utah\", \"Vermont\", \"Virginia\", \"Washington\", \"West Virginia\", \"Wisconsin\", \"Wyoming\"};\n        mDataSet = new ArrayList<String>(Arrays.asList(adapterData));\n        mAdapter = new RecyclerViewAdapter(this, mDataSet);\n        ((RecyclerViewAdapter) mAdapter).setMode(Attributes.Mode.Single);\n        recyclerView.setAdapter(mAdapter);\n\n        /* Listeners */\n        recyclerView.setOnScrollListener(onScrollListener);\n    }\n\n    /**\n     * Substitute for our onScrollListener for RecyclerView\n     */\n    RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {\n        @Override\n        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {\n            super.onScrollStateChanged(recyclerView, newState);\n            Log.e(\"ListView\", \"onScrollStateChanged\");\n        }\n\n        @Override\n        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n            super.onScrolled(recyclerView, dx, dy);\n            // Could hide open views here if you wanted. //\n        }\n    };\n\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        // Inflate the menu; this adds items to the action bar if it is present.\n        getMenuInflater().inflate(R.menu.my, menu);\n        return true;\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        // Handle action bar item clicks here. The action bar will\n        // automatically handle clicks on the Home/Up button, so long\n        // as you specify a parent activity in AndroidManifest.xml.\n        int id = item.getItemId();\n        if (id == R.id.action_listview) {\n            startActivity(new Intent(this, ListViewExample.class));\n            finish();\n            return true;\n        } else if (id == R.id.action_gridview) {\n            startActivity(new Intent(this, GridViewExample.class));\n            finish();\n            return true;\n        }\n        return super.onOptionsItemSelected(item);\n    }\n}\n"
  },
  {
    "path": "demo/src/main/java/com/daimajia/swipedemo/adapter/ArraySwipeAdapterSample.java",
    "content": "package com.daimajia.swipedemo.adapter;\n\nimport android.content.Context;\n\nimport com.daimajia.swipe.adapters.ArraySwipeAdapter;\nimport com.daimajia.swipedemo.R;\n\nimport java.util.List;\n\n/**\n * Sample usage of ArraySwipeAdapter.\n * @param <T>\n */\npublic class ArraySwipeAdapterSample<T> extends ArraySwipeAdapter {\n    public ArraySwipeAdapterSample(Context context, int resource) {\n        super(context, resource);\n    }\n\n    public ArraySwipeAdapterSample(Context context, int resource, int textViewResourceId) {\n        super(context, resource, textViewResourceId);\n    }\n\n    public ArraySwipeAdapterSample(Context context, int resource, Object[] objects) {\n        super(context, resource, objects);\n    }\n\n    public ArraySwipeAdapterSample(Context context, int resource, int textViewResourceId, Object[] objects) {\n        super(context, resource, textViewResourceId, objects);\n    }\n\n    public ArraySwipeAdapterSample(Context context, int resource, List objects) {\n        super(context, resource, objects);\n    }\n\n    public ArraySwipeAdapterSample(Context context, int resource, int textViewResourceId, List objects) {\n        super(context, resource, textViewResourceId, objects);\n    }\n\n    @Override\n    public int getSwipeLayoutResourceId(int position) {\n        return R.id.swipe;\n    }\n}\n"
  },
  {
    "path": "demo/src/main/java/com/daimajia/swipedemo/adapter/GridViewAdapter.java",
    "content": "package com.daimajia.swipedemo.adapter;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\n\nimport com.daimajia.swipe.adapters.BaseSwipeAdapter;\nimport com.daimajia.swipedemo.R;\n\npublic class GridViewAdapter extends BaseSwipeAdapter {\n\n    private Context mContext;\n\n    public GridViewAdapter(Context mContext) {\n        this.mContext = mContext;\n    }\n\n    @Override\n    public int getSwipeLayoutResourceId(int position) {\n        return R.id.swipe;\n    }\n\n    @Override\n    public View generateView(int position, ViewGroup parent) {\n        return LayoutInflater.from(mContext).inflate(R.layout.grid_item, null);\n    }\n\n    @Override\n    public void fillValues(int position, View convertView) {\n        TextView t = (TextView)convertView.findViewById(R.id.position);\n        t.setText((position + 1 )+\".\");\n    }\n\n    @Override\n    public int getCount() {\n        return 50;\n    }\n\n    @Override\n    public Object getItem(int position) {\n        return null;\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return position;\n    }\n}\n"
  },
  {
    "path": "demo/src/main/java/com/daimajia/swipedemo/adapter/ListViewAdapter.java",
    "content": "package com.daimajia.swipedemo.adapter;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.daimajia.androidanimations.library.Techniques;\nimport com.daimajia.androidanimations.library.YoYo;\nimport com.daimajia.swipe.SimpleSwipeListener;\nimport com.daimajia.swipe.SwipeLayout;\nimport com.daimajia.swipe.adapters.BaseSwipeAdapter;\nimport com.daimajia.swipedemo.R;\n\npublic class ListViewAdapter extends BaseSwipeAdapter {\n\n    private Context mContext;\n\n    public ListViewAdapter(Context mContext) {\n        this.mContext = mContext;\n    }\n\n    @Override\n    public int getSwipeLayoutResourceId(int position) {\n        return R.id.swipe;\n    }\n\n    @Override\n    public View generateView(int position, ViewGroup parent) {\n        View v = LayoutInflater.from(mContext).inflate(R.layout.listview_item, null);\n        SwipeLayout swipeLayout = (SwipeLayout)v.findViewById(getSwipeLayoutResourceId(position));\n        swipeLayout.addSwipeListener(new SimpleSwipeListener() {\n            @Override\n            public void onOpen(SwipeLayout layout) {\n                YoYo.with(Techniques.Tada).duration(500).delay(100).playOn(layout.findViewById(R.id.trash));\n            }\n        });\n        swipeLayout.setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() {\n            @Override\n            public void onDoubleClick(SwipeLayout layout, boolean surface) {\n                Toast.makeText(mContext, \"DoubleClick\", Toast.LENGTH_SHORT).show();\n            }\n        });\n        v.findViewById(R.id.delete).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                Toast.makeText(mContext, \"click delete\", Toast.LENGTH_SHORT).show();\n            }\n        });\n        return v;\n    }\n\n    @Override\n    public void fillValues(int position, View convertView) {\n        TextView t = (TextView)convertView.findViewById(R.id.position);\n        t.setText((position + 1) + \".\");\n    }\n\n    @Override\n    public int getCount() {\n        return 50;\n    }\n\n    @Override\n    public Object getItem(int position) {\n        return null;\n    }\n\n    @Override\n    public long getItemId(int position) {\n        return position;\n    }\n}\n"
  },
  {
    "path": "demo/src/main/java/com/daimajia/swipedemo/adapter/RecyclerViewAdapter.java",
    "content": "package com.daimajia.swipedemo.adapter;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\nimport android.util.Log;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Button;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.daimajia.androidanimations.library.Techniques;\nimport com.daimajia.androidanimations.library.YoYo;\nimport com.daimajia.swipe.SimpleSwipeListener;\nimport com.daimajia.swipe.SwipeLayout;\nimport com.daimajia.swipe.adapters.RecyclerSwipeAdapter;\nimport com.daimajia.swipedemo.R;\n\nimport java.util.ArrayList;\n\npublic class RecyclerViewAdapter extends RecyclerSwipeAdapter<RecyclerViewAdapter.SimpleViewHolder> {\n\n    public static class SimpleViewHolder extends RecyclerView.ViewHolder {\n        SwipeLayout swipeLayout;\n        TextView textViewPos;\n        TextView textViewData;\n        Button buttonDelete;\n\n        public SimpleViewHolder(View itemView) {\n            super(itemView);\n            swipeLayout = (SwipeLayout) itemView.findViewById(R.id.swipe);\n            textViewPos = (TextView) itemView.findViewById(R.id.position);\n            textViewData = (TextView) itemView.findViewById(R.id.text_data);\n            buttonDelete = (Button) itemView.findViewById(R.id.delete);\n\n            itemView.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View view) {\n                    Log.d(getClass().getSimpleName(), \"onItemSelected: \" + textViewData.getText().toString());\n                    Toast.makeText(view.getContext(), \"onItemSelected: \" + textViewData.getText().toString(), Toast.LENGTH_SHORT).show();\n                }\n            });\n        }\n    }\n\n    private Context mContext;\n    private ArrayList<String> mDataset;\n\n    //protected SwipeItemRecyclerMangerImpl mItemManger = new SwipeItemRecyclerMangerImpl(this);\n\n    public RecyclerViewAdapter(Context context, ArrayList<String> objects) {\n        this.mContext = context;\n        this.mDataset = objects;\n    }\n\n    @Override\n    public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item, parent, false);\n        return new SimpleViewHolder(view);\n    }\n\n    @Override\n    public void onBindViewHolder(final SimpleViewHolder viewHolder, final int position) {\n        String item = mDataset.get(position);\n        viewHolder.swipeLayout.setShowMode(SwipeLayout.ShowMode.LayDown);\n        viewHolder.swipeLayout.addSwipeListener(new SimpleSwipeListener() {\n            @Override\n            public void onOpen(SwipeLayout layout) {\n                YoYo.with(Techniques.Tada).duration(500).delay(100).playOn(layout.findViewById(R.id.trash));\n            }\n        });\n        viewHolder.swipeLayout.setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() {\n            @Override\n            public void onDoubleClick(SwipeLayout layout, boolean surface) {\n                Toast.makeText(mContext, \"DoubleClick\", Toast.LENGTH_SHORT).show();\n            }\n        });\n        viewHolder.buttonDelete.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                mItemManger.removeShownLayouts(viewHolder.swipeLayout);\n                mDataset.remove(position);\n                notifyItemRemoved(position);\n                notifyItemRangeChanged(position, mDataset.size());\n                mItemManger.closeAllItems();\n                Toast.makeText(view.getContext(), \"Deleted \" + viewHolder.textViewData.getText().toString() + \"!\", Toast.LENGTH_SHORT).show();\n            }\n        });\n        viewHolder.textViewPos.setText((position + 1) + \".\");\n        viewHolder.textViewData.setText(item);\n        mItemManger.bind(viewHolder.itemView, position);\n    }\n\n    @Override\n    public int getItemCount() {\n        return mDataset.size();\n    }\n\n    @Override\n    public int getSwipeLayoutResourceId(int position) {\n        return R.id.swipe;\n    }\n}\n"
  },
  {
    "path": "demo/src/main/java/com/daimajia/swipedemo/adapter/util/DividerItemDecoration.java",
    "content": "package com.daimajia.swipedemo.adapter.util;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Canvas;\nimport android.graphics.Rect;\nimport android.graphics.drawable.Drawable;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.util.AttributeSet;\nimport android.view.View;\n\npublic class DividerItemDecoration extends RecyclerView.ItemDecoration {\n\n    private Drawable mDivider;\n    private boolean mShowFirstDivider = false;\n    private boolean mShowLastDivider = false;\n\n\n    public DividerItemDecoration(Context context, AttributeSet attrs) {\n        final TypedArray a = context\n                .obtainStyledAttributes(attrs, new int[]{android.R.attr.listDivider});\n        mDivider = a.getDrawable(0);\n        a.recycle();\n    }\n\n    public DividerItemDecoration(Context context, AttributeSet attrs, boolean showFirstDivider,\n                                 boolean showLastDivider) {\n        this(context, attrs);\n        mShowFirstDivider = showFirstDivider;\n        mShowLastDivider = showLastDivider;\n    }\n\n    public DividerItemDecoration(Drawable divider) {\n        mDivider = divider;\n    }\n\n    public DividerItemDecoration(Drawable divider, boolean showFirstDivider,\n                                 boolean showLastDivider) {\n        this(divider);\n        mShowFirstDivider = showFirstDivider;\n        mShowLastDivider = showLastDivider;\n    }\n\n    @Override\n    public void getItemOffsets(Rect outRect, View view, RecyclerView parent,\n                               RecyclerView.State state) {\n        super.getItemOffsets(outRect, view, parent, state);\n        if (mDivider == null) {\n            return;\n        }\n        if (parent.getChildPosition(view) < 1) {\n            return;\n        }\n\n        if (getOrientation(parent) == LinearLayoutManager.VERTICAL) {\n            outRect.top = mDivider.getIntrinsicHeight();\n        } else {\n            outRect.left = mDivider.getIntrinsicWidth();\n        }\n    }\n\n    @Override\n    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {\n        if (mDivider == null) {\n            super.onDrawOver(c, parent, state);\n            return;\n        }\n\n        // Initialization needed to avoid compiler warning\n        int left = 0, right = 0, top = 0, bottom = 0, size;\n        int orientation = getOrientation(parent);\n        int childCount = parent.getChildCount();\n\n        if (orientation == LinearLayoutManager.VERTICAL) {\n            size = mDivider.getIntrinsicHeight();\n            left = parent.getPaddingLeft();\n            right = parent.getWidth() - parent.getPaddingRight();\n        } else { //horizontal\n            size = mDivider.getIntrinsicWidth();\n            top = parent.getPaddingTop();\n            bottom = parent.getHeight() - parent.getPaddingBottom();\n        }\n\n        for (int i = mShowFirstDivider ? 0 : 1; i < childCount; i++) {\n            View child = parent.getChildAt(i);\n            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();\n\n            if (orientation == LinearLayoutManager.VERTICAL) {\n                top = child.getTop() - params.topMargin;\n                bottom = top + size;\n            } else { //horizontal\n                left = child.getLeft() - params.leftMargin;\n                right = left + size;\n            }\n            mDivider.setBounds(left, top, right, bottom);\n            mDivider.draw(c);\n        }\n\n        // show last divider\n        if (mShowLastDivider && childCount > 0) {\n            View child = parent.getChildAt(childCount - 1);\n            RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();\n            if (orientation == LinearLayoutManager.VERTICAL) {\n                top = child.getBottom() + params.bottomMargin;\n                bottom = top + size;\n            } else { // horizontal\n                left = child.getRight() + params.rightMargin;\n                right = left + size;\n            }\n            mDivider.setBounds(left, top, right, bottom);\n            mDivider.draw(c);\n        }\n    }\n\n    private int getOrientation(RecyclerView parent) {\n        if (parent.getLayoutManager() instanceof LinearLayoutManager) {\n            LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager();\n            return layoutManager.getOrientation();\n        } else {\n            throw new IllegalStateException(\n                    \"DividerItemDecoration can only be used with a LinearLayoutManager.\");\n        }\n    }\n}"
  },
  {
    "path": "demo/src/main/java/com/daimajia/swipedemo/adapter/util/RecyclerItemClickListener.java",
    "content": "package com.daimajia.swipedemo.adapter.util;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.GestureDetector;\nimport android.view.MotionEvent;\nimport android.view.View;\n\npublic class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {\n    private OnItemClickListener mListener;\n\n    public interface OnItemClickListener {\n        public void onItemClick(View view, int position);\n    }\n\n    GestureDetector mGestureDetector;\n\n    public RecyclerItemClickListener(Context context, OnItemClickListener listener) {\n        mListener = listener;\n        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {\n            @Override\n            public boolean onSingleTapUp(MotionEvent e) {\n                return true;\n            }\n        });\n    }\n\n    @Override\n    public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {\n        View childView = view.findChildViewUnder(e.getX(), e.getY());\n        if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {\n            mListener.onItemClick(childView, view.getChildPosition(childView));\n        }\n        return false;\n    }\n\n    @Override\n    public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {\n    }\n\n    @Override\n    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {\n        \n    }\n}\n"
  },
  {
    "path": "demo/src/main/res/drawable/dark_gray.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"@color/dark_gray_press\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@color/dark_gray_press\" android:state_focused=\"true\"/>\n    <item android:drawable=\"@color/dark_gray\"/>\n\n</selector>"
  },
  {
    "path": "demo/src/main/res/drawable/divider.xml",
    "content": "<!--\n  ~ Copyright (C) 2014 Lucas Rocha\n  ~\n  ~ Licensed under the Apache License, Version 2.0 (the \"License\");\n  ~ you may not use this file except in compliance with the License.\n  ~ You may obtain a copy of the License at\n  ~\n  ~     http://www.apache.org/licenses/LICENSE-2.0\n  ~\n  ~ Unless required by applicable law or agreed to in writing, software\n  ~ distributed under the License is distributed on an \"AS IS\" BASIS,\n  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  ~ See the License for the specific language governing permissions and\n  ~ limitations under the License.\n  -->\n\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n\n    <solid android:color=\"#cccccc\"/>\n    <size android:width=\"1dp\"\n        android:height=\"1dp\" />\n\n</shape>"
  },
  {
    "path": "demo/src/main/res/drawable/item_selector.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"@color/backgroundColorPress\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@color/backgroundColorPress\" android:state_focused=\"true\"/>\n    <item android:drawable=\"@color/backgroundColor\"/>\n\n</selector>"
  },
  {
    "path": "demo/src/main/res/drawable/red.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"@color/red_press\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@color/red_press\" android:state_focused=\"true\"/>\n    <item android:drawable=\"@color/red\"/>\n\n</selector>"
  },
  {
    "path": "demo/src/main/res/drawable/white.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <item android:drawable=\"@android:color/darker_gray\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@android:color/darker_gray\" android:state_focused=\"true\"/>\n    <item android:drawable=\"@android:color/white\"/>\n\n</selector>"
  },
  {
    "path": "demo/src/main/res/layout/complicate_layout.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:orientation=\"vertical\"\n    android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n    <include layout=\"@layout/sampe_nested_scrollview\" android:layout_height=\"80dp\" android:layout_width=\"match_parent\"/>\n    <include layout=\"@layout/sampe_nested_seekbar\" android:layout_height=\"80dp\" android:layout_width=\"match_parent\" android:layout_marginTop=\"20dp\"/>\n    <include layout=\"@layout/sampe_nested_edittext\" android:layout_height=\"80dp\" android:layout_width=\"match_parent\" android:layout_marginTop=\"20dp\"/>\n    <include layout=\"@layout/sample_nested_parent\" android:layout_height=\"80dp\" android:layout_width=\"match_parent\" android:layout_marginTop=\"20dp\"/>\n\n</LinearLayout>"
  },
  {
    "path": "demo/src/main/res/layout/grid_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<com.daimajia.swipe.SwipeLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/swipe\"\n    android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n    <LinearLayout\n        android:tag=\"Bottom2\"\n        android:background=\"#333\"\n        android:layout_width=\"40dp\"\n        android:gravity=\"center\"\n        android:layout_height=\"120dp\">\n        <ImageView\n            android:id=\"@+id/trash\"\n            android:src=\"@drawable/trash\"\n            android:layout_width=\"22dp\"\n            android:layout_height=\"22dp\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:padding=\"10dp\"\n        android:background=\"#ffffff\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n        <TextView\n            android:id=\"@+id/position\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <TextView\n            android:tag=\"Hover\"\n            android:text=\"If winter comes , can spring be far behind ? \\n\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n    </LinearLayout>\n</com.daimajia.swipe.SwipeLayout>\n"
  },
  {
    "path": "demo/src/main/res/layout/gridview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<GridView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/gridview\"\n    android:padding=\"10dp\"\n    android:verticalSpacing=\"10dp\"\n    android:horizontalSpacing=\"10dp\"\n    android:numColumns=\"2\"\n    android:listSelector=\"@drawable/item_selector\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"/>\n\n"
  },
  {
    "path": "demo/src/main/res/layout/listview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n    <ListView\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:id=\"@+id/listview\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>"
  },
  {
    "path": "demo/src/main/res/layout/listview_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<com.daimajia.swipe.SwipeLayout\n    xmlns:swipe=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/swipe\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    swipe:leftEdgeSwipeOffset=\"0dp\"\n    swipe:rightEdgeSwipeOffset=\"0dp\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"80dp\"\n        android:background=\"#FF5534\"\n        android:gravity=\"center\"\n        android:tag=\"Bottom3\"\n        android:weightSum=\"10\">\n\n        <ImageView\n            android:id=\"@+id/trash\"\n            android:layout_width=\"27dp\"\n            android:layout_height=\"30dp\"\n            android:layout_weight=\"1\"\n            android:src=\"@drawable/trash\" />\n\n        <TextView\n            android:layout_width=\"0dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"5\"\n            android:text=\"Delete Item?\"\n            android:textColor=\"#fff\"\n            android:textSize=\"17sp\" />\n\n        <Button\n            android:id=\"@+id/delete\"\n            android:layout_width=\"0dp\"\n            android:layout_height=\"40dp\"\n            android:layout_weight=\"4\"\n            android:background=\"@drawable/white\"\n            android:text=\"Yes,Delete\"\n            android:textColor=\"#FF5534\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"@drawable/item_selector\"\n        android:padding=\"10dp\">\n\n        <TextView\n            android:id=\"@+id/position\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n\n        <TextView\n            android:id=\"@+id/text_data\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:tag=\"Hover\"\n            android:text=\"Do not, for one repulse, forgo the purpose that you resolved to effort. \" />\n    </LinearLayout>\n</com.daimajia.swipe.SwipeLayout>"
  },
  {
    "path": "demo/src/main/res/layout/main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.daimajia.swipe.SwipeLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/godfather\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n    <ImageView\n        android:layout_gravity=\"left|right|top\"\n        android:src=\"@drawable/bird\"\n        android:layout_width=\"100dp\"\n        android:layout_height=\"100dp\" />\n    <LinearLayout\n        android:id=\"@+id/bird_bottom\"\n        android:layout_gravity=\"bottom\"\n        android:gravity=\"center\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n        <ImageView\n            android:src=\"@drawable/bird\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n    </LinearLayout>\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n        <include layout=\"@layout/sample_together\" android:layout_width=\"match_parent\" android:layout_height=\"match_parent\"/>\n        <ImageView\n            android:src=\"@drawable/hand\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_centerHorizontal=\"true\"\n            android:layout_marginBottom=\"60dp\"\n            android:layout_width=\"65dp\"\n            android:layout_height=\"65dp\" />\n    </RelativeLayout>\n</com.daimajia.swipe.SwipeLayout>"
  },
  {
    "path": "demo/src/main/res/layout/recyclerview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- A RecyclerView with some commonly used attributes -->\n<android.support.v7.widget.RecyclerView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/recycler_view\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:scrollbars=\"vertical\" />"
  },
  {
    "path": "demo/src/main/res/layout/recyclerview_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <com.daimajia.swipe.SwipeLayout xmlns:swipe=\"http://schemas.android.com/apk/res-auto\"\n        android:id=\"@+id/swipe\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        swipe:leftEdgeSwipeOffset=\"0dp\"\n        swipe:rightEdgeSwipeOffset=\"0dp\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"80dp\"\n            android:background=\"#FF5534\"\n            android:gravity=\"center\"\n            android:tag=\"Bottom3\"\n            android:weightSum=\"10\">\n\n            <ImageView\n                android:id=\"@+id/trash\"\n                android:layout_width=\"27dp\"\n                android:layout_height=\"30dp\"\n                android:layout_weight=\"1\"\n                android:src=\"@drawable/trash\" />\n\n            <TextView\n                android:layout_width=\"0dp\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"5\"\n                android:text=\"Delete Item?\"\n                android:textColor=\"#fff\"\n                android:textSize=\"17sp\" />\n\n            <Button\n                android:id=\"@+id/delete\"\n                android:layout_width=\"0dp\"\n                android:layout_height=\"40dp\"\n                android:layout_weight=\"4\"\n                android:background=\"#ffffff\"\n                android:text=\"Yes,Delete\"\n                android:textColor=\"#FF5534\" />\n        </LinearLayout>\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:background=\"@drawable/item_selector\"\n            android:elevation=\"5dp\"\n            android:padding=\"10dp\">\n\n            <TextView\n                android:id=\"@+id/position\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\" />\n\n            <TextView\n                android:id=\"@+id/text_data\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:tag=\"Hover\"/>\n        </LinearLayout>\n    </com.daimajia.swipe.SwipeLayout>\n</LinearLayout>\n"
  },
  {
    "path": "demo/src/main/res/layout/sampe_nested_edittext.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<com.daimajia.swipe.SwipeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n    <LinearLayout\n        android:layout_width=\"80dp\"\n        android:layout_height=\"match_parent\">\n        <ImageView\n            android:id=\"@+id/trash\"\n            android:src=\"@drawable/trash\"\n            android:layout_width=\"match_parent\"\n            android:background=\"#FF3B30\"\n            android:paddingLeft=\"25dp\"\n            android:paddingRight=\"25dp\"\n            android:layout_height=\"match_parent\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:padding=\"10dp\"\n        android:background=\"#ffffff\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n        <TextView\n            android:text=\"EditText\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <EditText\n            android:layout_gravity=\"right\"\n            android:layout_width=\"200dp\"\n            android:layout_height=\"wrap_content\" />\n    </LinearLayout>\n</com.daimajia.swipe.SwipeLayout>"
  },
  {
    "path": "demo/src/main/res/layout/sampe_nested_scrollview.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<com.daimajia.swipe.SwipeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n    <LinearLayout\n        android:layout_width=\"80dp\"\n        android:layout_height=\"match_parent\">\n        <ScrollView\n            android:layout_width=\"match_parent\"\n            android:scrollbars=\"vertical\"\n            android:layout_height=\"wrap_content\">\n            <TextView\n                android:tag=\"Hover\"\n                android:text=\"None is of freedom or of life deserving unless he daily conquers it anew.None is of freedom or of life deserving unless he daily conquers it anew.None is of freedom or of life deserving unless he daily conquers it anew.None is of freedom or of life deserving unless he daily conquers it anew.None is of freedom or of life deserving unless he daily conquers it anew.None is of freedom or of life deserving unless he daily conquers it anew.None is of freedom or of life deserving unless he daily conquers it anew. \"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\" />\n        </ScrollView>\n    </LinearLayout>\n\n    <LinearLayout\n        android:padding=\"10dp\"\n        android:background=\"#ffffff\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n        <TextView\n            android:text=\"ScrollView\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <ScrollView\n            android:layout_marginLeft=\"80dp\"\n            android:layout_width=\"match_parent\"\n            android:scrollbars=\"horizontal\"\n            android:layout_height=\"match_parent\">\n            <LinearLayout\n                android:orientation=\"vertical\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\">\n                <TextView\n                    android:tag=\"Hover\"\n                    android:text=\"None is of freedom or of life deserving unless he daily conquers it anew.None is of freedom or of life deserving unless he daily conquers it anew.None is of freedom or of life deserving unless he daily conquers it anew.None is of freedom or of life deserving unless he daily conquers it anew.None is of freedom or of life deserving unless he daily conquers it anew.None is of freedom or of life deserving unless he daily conquers it anew.None is of freedom or of life deserving unless he daily conquers it anew. \"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\" />\n                <Button\n                    android:id=\"@+id/hhhhh\"\n                    android:text=\"HelloWorld\"\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\" />\n            </LinearLayout>\n\n        </ScrollView>\n    </LinearLayout>\n</com.daimajia.swipe.SwipeLayout>"
  },
  {
    "path": "demo/src/main/res/layout/sampe_nested_seekbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<com.daimajia.swipe.SwipeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n    <LinearLayout\n        android:layout_width=\"80dp\"\n        android:layout_height=\"match_parent\">\n        <ImageView\n            android:id=\"@+id/trash\"\n            android:src=\"@drawable/trash\"\n            android:layout_width=\"match_parent\"\n            android:background=\"#FF3B30\"\n            android:paddingLeft=\"25dp\"\n            android:paddingRight=\"25dp\"\n            android:layout_height=\"match_parent\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:padding=\"10dp\"\n        android:background=\"#ffffff\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n        <TextView\n            android:text=\"SeekBar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <SeekBar\n            android:layout_gravity=\"center\"\n            android:layout_width=\"200dp\"\n            android:layout_height=\"wrap_content\" />\n    </LinearLayout>\n</com.daimajia.swipe.SwipeLayout>"
  },
  {
    "path": "demo/src/main/res/layout/sample1.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<com.daimajia.swipe.SwipeLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"80dp\"\n    app:clickToClose=\"true\">\n\n    <LinearLayout\n        android:tag=\"Bottom1\"\n        android:background=\"#66ddff00\"\n        android:id=\"@+id/bottom_wrapper\"\n        android:layout_width=\"160dp\"\n        android:weightSum=\"1\"\n        android:layout_height=\"match_parent\">\n\n        <TextView\n            android:id=\"@+id/archive\"\n            android:textColor=\"#fff\"\n            android:text=\"Archive\"\n            android:layout_weight=\"0.5\"\n            android:gravity=\"center\"\n            android:clickable=\"true\"\n            android:background=\"@drawable/red\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\" />\n\n        <TextView\n            android:id=\"@+id/delete\"\n            android:text=\"Delete\"\n            android:background=\"#C7C7CC\"\n            android:gravity=\"center\"\n            android:layout_weight=\"0.5\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"match_parent\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:tag=\"Bottom4\"\n        android:id=\"@+id/bottom_wrapper_2\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\">\n\n        <ImageView\n            android:id=\"@+id/magnifier2\"\n            android:src=\"@drawable/magnifier\"\n            android:layout_width=\"70dp\"\n            android:background=\"#f7e79c\"\n            android:paddingLeft=\"25dp\"\n            android:paddingRight=\"25dp\"\n            android:layout_height=\"match_parent\" />\n\n        <ImageView\n            android:id=\"@+id/star2\"\n            android:src=\"@drawable/star\"\n            android:layout_width=\"70dp\"\n            android:background=\"#4cd964\"\n            android:paddingLeft=\"25dp\"\n            android:paddingRight=\"25dp\"\n            android:layout_height=\"match_parent\" />\n\n        <ImageView\n            android:id=\"@+id/trash2\"\n            android:src=\"@drawable/trash\"\n            android:layout_width=\"70dp\"\n            android:background=\"@drawable/red\"\n            android:paddingLeft=\"25dp\"\n            android:paddingRight=\"25dp\"\n            android:layout_height=\"match_parent\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:tag=\"Bottom3\"\n        android:id=\"@+id/starbott\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n        <RelativeLayout\n            android:id=\"@+id/bottom_wrapper_child1\"\n            android:background=\"@drawable/dark_gray\"\n            android:clickable=\"true\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n            <ImageView\n                android:id=\"@+id/star\"\n                android:layout_alignParentTop=\"true\"\n                android:layout_centerHorizontal=\"true\"\n                android:src=\"@drawable/star\"\n                android:layout_width=\"20dp\"\n                android:layout_height=\"20dp\" />\n        </RelativeLayout>\n    </LinearLayout>\n\n    <TextView\n        android:padding=\"10dp\"\n        android:background=\"@drawable/white\"\n        android:tag=\"Hover\"\n        android:text=\"要有最樸素的生活和最遙遠的夢想，即使明天天寒地凍，山高水遠，路遠馬亡。\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n\n</com.daimajia.swipe.SwipeLayout>\n"
  },
  {
    "path": "demo/src/main/res/layout/sample2.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<com.daimajia.swipe.SwipeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n    <LinearLayout\n        android:tag=\"Bottom2\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\">\n        <ImageView\n            android:id=\"@+id/magnifier\"\n            android:src=\"@drawable/magnifier\"\n            android:layout_width=\"70dp\"\n            android:background=\"#f7e79c\"\n            android:paddingLeft=\"25dp\"\n            android:paddingRight=\"25dp\"\n            android:layout_height=\"match_parent\" />\n        <ImageView\n            android:id=\"@+id/star\"\n            android:src=\"@drawable/star\"\n            android:layout_width=\"70dp\"\n            android:background=\"#4cd964\"\n            android:paddingLeft=\"25dp\"\n            android:paddingRight=\"25dp\"\n            android:layout_height=\"match_parent\" />\n        <ImageView\n            android:id=\"@+id/trash\"\n            android:src=\"@drawable/trash\"\n            android:layout_width=\"70dp\"\n            android:background=\"@drawable/red\"\n            android:paddingLeft=\"25dp\"\n            android:paddingRight=\"25dp\"\n            android:layout_height=\"match_parent\" />\n    </LinearLayout>\n\n    <LinearLayout\n        android:padding=\"10dp\"\n        android:orientation=\"vertical\"\n        android:background=\"@drawable/white\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n        <TextView\n            android:tag=\"Hover\"\n            android:text=\"理解（りかい）されるということは、一種（いっしゅ）の贅沢（ぜいたく）である。\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n        <Button\n            android:visibility=\"invisible\"\n            android:id=\"@+id/click\"\n            android:text=\"Click\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n    </LinearLayout>\n</com.daimajia.swipe.SwipeLayout>"
  },
  {
    "path": "demo/src/main/res/layout/sample3.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<com.daimajia.swipe.SwipeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n\n    <LinearLayout\n        android:tag=\"Bottom3\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n        <RelativeLayout\n            android:id=\"@+id/bottom_wrapper_child1\"\n            android:background=\"#BDBEC2\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n            <ImageView\n                android:id=\"@+id/star\"\n                android:layout_alignParentTop=\"true\"\n                android:layout_centerHorizontal=\"true\"\n                android:src=\"@drawable/star\"\n                android:layout_width=\"20dp\"\n                android:layout_height=\"20dp\" />\n        </RelativeLayout>\n    </LinearLayout>\n\n    <TextView\n        android:padding=\"10dp\"\n        android:background=\"#ffffff\"\n        android:tag=\"Hover\"\n        android:text=\"None is of freedom or of life deserving unless he daily conquers it anew. \"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n</com.daimajia.swipe.SwipeLayout>"
  },
  {
    "path": "demo/src/main/res/layout/sample_nested_parent.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout android:id=\"@+id/parent_framelayout\" xmlns:android=\"http://schemas.android.com/apk/res/android\" android:layout_width=\"match_parent\" android:layout_height=\"match_parent\">\n    <com.daimajia.swipe.SwipeLayout\n        android:id=\"@+id/test_swipe_swipe\"\n        android:layout_width=\"match_parent\" android:layout_height=\"80dp\">\n        <LinearLayout\n            android:layout_width=\"80dp\"\n            android:layout_height=\"match_parent\">\n            <ImageView\n                android:id=\"@+id/trash\"\n                android:src=\"@drawable/trash\"\n                android:layout_width=\"match_parent\"\n                android:background=\"#FF3B30\"\n                android:paddingLeft=\"25dp\"\n                android:paddingRight=\"25dp\"\n                android:layout_height=\"match_parent\" />\n        </LinearLayout>\n\n        <LinearLayout\n            android:padding=\"10dp\"\n            android:background=\"#ffffff\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n            <TextView\n                android:text=\"SeekBar\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\" />\n        </LinearLayout>\n    </com.daimajia.swipe.SwipeLayout>\n</FrameLayout>"
  },
  {
    "path": "demo/src/main/res/layout/sample_together.xml",
    "content": "<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:layout_height=\"match_parent\"\n    android:padding=\"10dp\">\n\n    <include android:id=\"@+id/sample1\" layout=\"@layout/sample1\"\n        android:layout_width=\"match_parent\" android:layout_height=\"80dp\"/>\n\n\n    <include android:id=\"@+id/sample2\" layout=\"@layout/sample2\"\n        android:layout_width=\"match_parent\" android:layout_height=\"80dp\"\n        android:layout_marginTop=\"20dp\"/>\n\n    <include android:id=\"@+id/sample3\" layout=\"@layout/sample3\"\n        android:layout_width=\"match_parent\" android:layout_height=\"80dp\"\n        android:layout_marginTop=\"20dp\"/>\n\n</LinearLayout>\n"
  },
  {
    "path": "demo/src/main/res/menu/my.xml",
    "content": "<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    tools:context=\".MyActivity\">\n    <item\n        android:id=\"@+id/action_listview\"\n        android:orderInCategory=\"100\"\n        android:title=\"ListView\" />\n    <item\n        android:id=\"@+id/action_gridview\"\n        android:orderInCategory=\"100\"\n        android:title=\"GridView\" />\n    <item\n        android:id=\"@+id/action_recycler\"\n        android:orderInCategory=\"100\"\n        android:title=\"RecyclerView\" />\n    <item\n        android:id=\"@+id/action_nested\"\n        android:title=\"Complicate\" />\n</menu>\n"
  },
  {
    "path": "demo/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"backgroundColor\">#E8E8E0</color>\n    <color name=\"backgroundColorPress\">#DBDBD3</color>\n    <color name=\"red\">#FF3B00</color>\n    <color name=\"red_press\">#990000</color>\n    <color name=\"dark_gray\">#4C535B</color>\n    <color name=\"dark_gray_press\">#ff7e8a97</color>\n</resources>"
  },
  {
    "path": "demo/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n</resources>\n"
  },
  {
    "path": "demo/src/main/res/values/strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <string name=\"app_name\">AndroidSwipeLayout</string>\n    <string name=\"hello_world\">Hello world!</string>\n    <string name=\"action_settings\">Settings</string>\n\n</resources>\n"
  },
  {
    "path": "demo/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"android:style/Theme.Holo.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n    </style>\n\n</resources>\n"
  },
  {
    "path": "demo/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Thu Mar 09 16:07:03 CST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-3.3-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Settings specified in this file will override any Gradle settings\n# configured through the IDE.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n\n\nVERSION_NAME=1.2.0\nVERSION_CODE=22\nGROUP=com.daimajia.swipelayout\n\nANDROID_BUILD_MIN_SDK_VERSION=9\nANDROID_BUILD_TARGET_SDK_VERSION=25\nANDROID_BUILD_SDK_VERSION=25\nANDROID_BUILD_TOOLS_VERSION=25.0.2\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# For Cygwin, ensure paths are in UNIX format before anything is touched.\nif $cygwin ; then\n    [ -n \"$JAVA_HOME\" ] && JAVA_HOME=`cygpath --unix \"$JAVA_HOME\"`\nfi\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >&-\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >&-\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif \"%ERRORLEVEL%\" == \"0\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto init\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:init\r\n@rem Get command-line arguments, handling Windowz variants\r\n\r\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\r\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\r\n\r\n:win9xME_args\r\n@rem Slurp the command line arguments.\r\nset CMD_LINE_ARGS=\r\nset _SKIP=2\r\n\r\n:win9xME_args_slurp\r\nif \"x%~1\" == \"x\" goto execute\r\n\r\nset CMD_LINE_ARGS=%*\r\ngoto execute\r\n\r\n:4NT_args\r\n@rem Get arguments from the 4NT Shell from JP Software\r\nset CMD_LINE_ARGS=%$\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\r\nexit /b 1\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "library/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "library/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)\n    buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION\n\n    defaultConfig {\n        minSdkVersion 9\n        targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)\n    }\n}\n\ndependencies {\n    compile 'com.android.support:recyclerview-v7:25.2.0'\n    compile 'com.android.support:support-v4:25.2.0'\n}\napply from: './gradle-mvn-push.gradle'\n\n// build a jar with source files\ntask sourcesJar(type: Jar) {\n    from android.sourceSets.main.java.srcDirs\n    classifier = 'sources'\n}\nartifacts {\n    archives sourcesJar\n}\n"
  },
  {
    "path": "library/gradle-mvn-push.gradle",
    "content": "/*\n * Copyright 2013 Chris Banes\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\napply plugin: 'maven'\napply plugin: 'signing'\n\ndef isReleaseBuild() {\n    return VERSION_NAME.contains(\"SNAPSHOT\") == false\n}\n\ndef getReleaseRepositoryUrl() {\n    return hasProperty('RELEASE_REPOSITORY_URL') ? RELEASE_REPOSITORY_URL\n            : \"https://oss.sonatype.org/service/local/staging/deploy/maven2/\"\n}\n\ndef getSnapshotRepositoryUrl() {\n    return hasProperty('SNAPSHOT_REPOSITORY_URL') ? SNAPSHOT_REPOSITORY_URL\n            : \"https://oss.sonatype.org/content/repositories/snapshots/\"\n}\n\ndef getRepositoryUsername() {\n    return hasProperty('NEXUS_USERNAME') ? NEXUS_USERNAME : \"\"\n}\n\ndef getRepositoryPassword() {\n    return hasProperty('NEXUS_PASSWORD') ? NEXUS_PASSWORD : \"\"\n}\n\nafterEvaluate { project ->\n    uploadArchives {\n        repositories {\n            mavenDeployer {\n                beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }\n\n                pom.groupId = GROUP\n                pom.artifactId = POM_ARTIFACT_ID\n                pom.version = VERSION_NAME\n\n                repository(url: getReleaseRepositoryUrl()) {\n                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())\n                }\n                snapshotRepository(url: getSnapshotRepositoryUrl()) {\n                    authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())\n                }\n\n                pom.project {\n                    name POM_NAME\n                    packaging POM_PACKAGING\n                    description POM_DESCRIPTION\n                    url POM_URL\n\n                    scm {\n                        url POM_SCM_URL\n                        connection POM_SCM_CONNECTION\n                        developerConnection POM_SCM_DEV_CONNECTION\n                    }\n\n                    licenses {\n                        license {\n                            name POM_LICENCE_NAME\n                            url POM_LICENCE_URL\n                            distribution POM_LICENCE_DIST\n                        }\n                    }\n\n                    developers {\n                        developer {\n                            id POM_DEVELOPER_ID\n                            name POM_DEVELOPER_NAME\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    signing {\n        required { isReleaseBuild() && gradle.taskGraph.hasTask(\"uploadArchives\") }\n        sign configurations.archives\n    }\n\n    task apklib(type: Zip){\n        appendix = extension = 'apklib'\n\n        from 'AndroidManifest.xml'\n        into('res') {\n            from 'res'\n        }\n        into('src') {\n            from 'src'\n        }\n    }\n\n    task androidJavadocs(type: Javadoc) {\n        source = android.sourceSets.main.java.srcDirs\n        classpath += project.files(android.getBootClasspath() .join(File.pathSeparator))\n    }\n\n    task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {\n        classifier = 'javadoc'\n        from androidJavadocs.destinationDir\n    }\n\n    task androidSourcesJar(type: Jar) {\n        classifier = 'sources'\n        from android.sourceSets.main.java.srcDirs\n    }\n\n    artifacts {\n        archives androidSourcesJar\n        archives androidJavadocsJar\n        archives apklib\n    }\n}\n"
  },
  {
    "path": "library/gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Settings specified in this file will override any Gradle settings\n# configured through the IDE.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n\nPOM_NAME=Android SwipeLayout Library\nPOM_ARTIFACT_ID=library\nPOM_PACKAGING=aar\n\nPOM_DESCRIPTION=Android Swipe Layout\nPOM_URL=https://github.com/daimajia/AndroidSwipeLayout\nPOM_SCM_URL=https://github.com/daimajia/AndroidSwipeLayout\nPOM_SCM_CONNECTION=scm:https://github.com/daimajia/AndroidSwipeLayout.git\nPOM_SCM_DEV_CONNECTION=scm:https://github.com/daimajia/AndroidSwipeLayout.git\nPOM_LICENCE_NAME=MIT\nPOM_LICENCE_URL=http://opensource.org/licenses/MIT\nPOM_LICENCE_DIST=repo\nPOM_DEVELOPER_ID=daimajia\nPOM_DEVELOPER_NAME=daimajia"
  },
  {
    "path": "library/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /Applications/Android Studio.app/sdk/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "library/src/main/AndroidManifest.xml",
    "content": "<manifest package=\"com.daimajia.swipe\">\n    <application />\n</manifest>\n"
  },
  {
    "path": "library/src/main/java/com/daimajia/swipe/SimpleSwipeListener.java",
    "content": "package com.daimajia.swipe;\n\npublic class SimpleSwipeListener implements SwipeLayout.SwipeListener {\n\n    @Override\n    public void onStartOpen(SwipeLayout layout) {\n    }\n\n    @Override\n    public void onOpen(SwipeLayout layout) {\n    }\n\n    @Override\n    public void onStartClose(SwipeLayout layout) {\n    }\n\n    @Override\n    public void onClose(SwipeLayout layout) {\n    }\n\n    @Override\n    public void onUpdate(SwipeLayout layout, int leftOffset, int topOffset) {\n    }\n\n    @Override\n    public void onHandRelease(SwipeLayout layout, float xvel, float yvel) {\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/daimajia/swipe/SwipeLayout.java",
    "content": "package com.daimajia.swipe;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.graphics.Rect;\nimport android.support.v4.view.GravityCompat;\nimport android.support.v4.view.ViewCompat;\nimport android.support.v4.widget.ViewDragHelper;\nimport android.util.AttributeSet;\nimport android.view.GestureDetector;\nimport android.view.Gravity;\nimport android.view.HapticFeedbackConstants;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewConfiguration;\nimport android.view.ViewGroup;\nimport android.view.ViewParent;\nimport android.widget.AbsListView;\nimport android.widget.AdapterView;\nimport android.widget.FrameLayout;\n\nimport java.lang.reflect.Method;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashMap;\nimport java.util.LinkedHashMap;\nimport java.util.List;\nimport java.util.Map;\n\npublic class SwipeLayout extends FrameLayout {\n    @Deprecated\n    public static final int EMPTY_LAYOUT = -1;\n    private static final int DRAG_LEFT = 1;\n    private static final int DRAG_RIGHT = 2;\n    private static final int DRAG_TOP = 4;\n    private static final int DRAG_BOTTOM = 8;\n    private static final DragEdge DefaultDragEdge = DragEdge.Right;\n\n    private int mTouchSlop;\n\n    private DragEdge mCurrentDragEdge = DefaultDragEdge;\n    private ViewDragHelper mDragHelper;\n\n    private int mDragDistance = 0;\n    private LinkedHashMap<DragEdge, View> mDragEdges = new LinkedHashMap<>();\n    private ShowMode mShowMode;\n\n    private float[] mEdgeSwipesOffset = new float[4];\n\n    private List<SwipeListener> mSwipeListeners = new ArrayList<>();\n    private List<SwipeDenier> mSwipeDeniers = new ArrayList<>();\n    private Map<View, ArrayList<OnRevealListener>> mRevealListeners = new HashMap<>();\n    private Map<View, Boolean> mShowEntirely = new HashMap<>();\n    private Map<View, Rect> mViewBoundCache = new HashMap<>();//save all children's bound, restore in onLayout\n\n    private DoubleClickListener mDoubleClickListener;\n\n    private boolean mSwipeEnabled = true;\n    private boolean[] mSwipesEnabled = new boolean[]{true, true, true, true};\n    private boolean mClickToClose = false;\n    private float mWillOpenPercentAfterOpen = 0.75f;\n    private float mWillOpenPercentAfterClose = 0.25f;\n\n    public enum DragEdge {\n        Left,\n        Top,\n        Right,\n        Bottom\n    }\n\n    public enum ShowMode {\n        LayDown,\n        PullOut\n    }\n\n    public SwipeLayout(Context context) {\n        this(context, null);\n    }\n\n    public SwipeLayout(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public SwipeLayout(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n        mDragHelper = ViewDragHelper.create(this, mDragHelperCallback);\n        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();\n\n        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SwipeLayout);\n        int dragEdgeChoices = a.getInt(R.styleable.SwipeLayout_drag_edge, DRAG_RIGHT);\n        mEdgeSwipesOffset[DragEdge.Left.ordinal()] = a.getDimension(R.styleable.SwipeLayout_leftEdgeSwipeOffset, 0);\n        mEdgeSwipesOffset[DragEdge.Right.ordinal()] = a.getDimension(R.styleable.SwipeLayout_rightEdgeSwipeOffset, 0);\n        mEdgeSwipesOffset[DragEdge.Top.ordinal()] = a.getDimension(R.styleable.SwipeLayout_topEdgeSwipeOffset, 0);\n        mEdgeSwipesOffset[DragEdge.Bottom.ordinal()] = a.getDimension(R.styleable.SwipeLayout_bottomEdgeSwipeOffset, 0);\n        setClickToClose(a.getBoolean(R.styleable.SwipeLayout_clickToClose, mClickToClose));\n\n        if ((dragEdgeChoices & DRAG_LEFT) == DRAG_LEFT) {\n            mDragEdges.put(DragEdge.Left, null);\n        }\n        if ((dragEdgeChoices & DRAG_TOP) == DRAG_TOP) {\n            mDragEdges.put(DragEdge.Top, null);\n        }\n        if ((dragEdgeChoices & DRAG_RIGHT) == DRAG_RIGHT) {\n            mDragEdges.put(DragEdge.Right, null);\n        }\n        if ((dragEdgeChoices & DRAG_BOTTOM) == DRAG_BOTTOM) {\n            mDragEdges.put(DragEdge.Bottom, null);\n        }\n        int ordinal = a.getInt(R.styleable.SwipeLayout_show_mode, ShowMode.PullOut.ordinal());\n        mShowMode = ShowMode.values()[ordinal];\n        a.recycle();\n\n    }\n\n    public interface SwipeListener {\n        void onStartOpen(SwipeLayout layout);\n\n        void onOpen(SwipeLayout layout);\n\n        void onStartClose(SwipeLayout layout);\n\n        void onClose(SwipeLayout layout);\n\n        void onUpdate(SwipeLayout layout, int leftOffset, int topOffset);\n\n        void onHandRelease(SwipeLayout layout, float xvel, float yvel);\n    }\n\n    public void addSwipeListener(SwipeListener l) {\n        mSwipeListeners.add(l);\n    }\n\n    public void removeSwipeListener(SwipeListener l) {\n        mSwipeListeners.remove(l);\n    }\n\n    public void removeAllSwipeListener() {\n        mSwipeListeners.clear();\n    }\n\n    public interface SwipeDenier {\n        /*\n         * Called in onInterceptTouchEvent Determines if this swipe event should\n         * be denied Implement this interface if you are using views with swipe\n         * gestures As a child of SwipeLayout\n         * \n         * @return true deny false allow\n         */\n        boolean shouldDenySwipe(MotionEvent ev);\n    }\n\n    public void addSwipeDenier(SwipeDenier denier) {\n        mSwipeDeniers.add(denier);\n    }\n\n    public void removeSwipeDenier(SwipeDenier denier) {\n        mSwipeDeniers.remove(denier);\n    }\n\n    public void removeAllSwipeDeniers() {\n        mSwipeDeniers.clear();\n    }\n\n    public interface OnRevealListener {\n        void onReveal(View child, DragEdge edge, float fraction, int distance);\n    }\n\n    /**\n     * bind a view with a specific\n     * {@link com.daimajia.swipe.SwipeLayout.OnRevealListener}\n     *\n     * @param childId the view id.\n     * @param l       the target\n     *                {@link com.daimajia.swipe.SwipeLayout.OnRevealListener}\n     */\n    public void addRevealListener(int childId, OnRevealListener l) {\n        View child = findViewById(childId);\n        if (child == null) {\n            throw new IllegalArgumentException(\"Child does not belong to SwipeListener.\");\n        }\n\n        if (!mShowEntirely.containsKey(child)) {\n            mShowEntirely.put(child, false);\n        }\n        if (mRevealListeners.get(child) == null)\n            mRevealListeners.put(child, new ArrayList<OnRevealListener>());\n\n        mRevealListeners.get(child).add(l);\n    }\n\n    /**\n     * bind multiple views with an\n     * {@link com.daimajia.swipe.SwipeLayout.OnRevealListener}.\n     *\n     * @param childIds the view id.\n     * @param l        the {@link com.daimajia.swipe.SwipeLayout.OnRevealListener}\n     */\n    public void addRevealListener(int[] childIds, OnRevealListener l) {\n        for (int i : childIds)\n            addRevealListener(i, l);\n    }\n\n    public void removeRevealListener(int childId, OnRevealListener l) {\n        View child = findViewById(childId);\n\n        if (child == null) return;\n\n        mShowEntirely.remove(child);\n        if (mRevealListeners.containsKey(child)) mRevealListeners.get(child).remove(l);\n    }\n\n    public void removeAllRevealListeners(int childId) {\n        View child = findViewById(childId);\n        if (child != null) {\n            mRevealListeners.remove(child);\n            mShowEntirely.remove(child);\n        }\n    }\n\n    private ViewDragHelper.Callback mDragHelperCallback = new ViewDragHelper.Callback() {\n\n        @Override\n        public int clampViewPositionHorizontal(View child, int left, int dx) {\n            if (child == getSurfaceView()) {\n                switch (mCurrentDragEdge) {\n                    case Top:\n                    case Bottom:\n                        return getPaddingLeft();\n                    case Left:\n                        if (left < getPaddingLeft()) return getPaddingLeft();\n                        if (left > getPaddingLeft() + mDragDistance)\n                            return getPaddingLeft() + mDragDistance;\n                        break;\n                    case Right:\n                        if (left > getPaddingLeft()) return getPaddingLeft();\n                        if (left < getPaddingLeft() - mDragDistance)\n                            return getPaddingLeft() - mDragDistance;\n                        break;\n                }\n            } else if (getCurrentBottomView() == child) {\n\n                switch (mCurrentDragEdge) {\n                    case Top:\n                    case Bottom:\n                        return getPaddingLeft();\n                    case Left:\n                        if (mShowMode == ShowMode.PullOut) {\n                            if (left > getPaddingLeft()) return getPaddingLeft();\n                        }\n                        break;\n                    case Right:\n                        if (mShowMode == ShowMode.PullOut) {\n                            if (left < getMeasuredWidth() - mDragDistance) {\n                                return getMeasuredWidth() - mDragDistance;\n                            }\n                        }\n                        break;\n                }\n            }\n            return left;\n        }\n\n        @Override\n        public int clampViewPositionVertical(View child, int top, int dy) {\n            if (child == getSurfaceView()) {\n                switch (mCurrentDragEdge) {\n                    case Left:\n                    case Right:\n                        return getPaddingTop();\n                    case Top:\n                        if (top < getPaddingTop()) return getPaddingTop();\n                        if (top > getPaddingTop() + mDragDistance)\n                            return getPaddingTop() + mDragDistance;\n                        break;\n                    case Bottom:\n                        if (top < getPaddingTop() - mDragDistance) {\n                            return getPaddingTop() - mDragDistance;\n                        }\n                        if (top > getPaddingTop()) {\n                            return getPaddingTop();\n                        }\n                }\n            } else {\n                View surfaceView = getSurfaceView();\n                int surfaceViewTop = surfaceView == null ? 0 : surfaceView.getTop();\n                switch (mCurrentDragEdge) {\n                    case Left:\n                    case Right:\n                        return getPaddingTop();\n                    case Top:\n                        if (mShowMode == ShowMode.PullOut) {\n                            if (top > getPaddingTop()) return getPaddingTop();\n                        } else {\n                            if (surfaceViewTop + dy < getPaddingTop())\n                                return getPaddingTop();\n                            if (surfaceViewTop + dy > getPaddingTop() + mDragDistance)\n                                return getPaddingTop() + mDragDistance;\n                        }\n                        break;\n                    case Bottom:\n                        if (mShowMode == ShowMode.PullOut) {\n                            if (top < getMeasuredHeight() - mDragDistance)\n                                return getMeasuredHeight() - mDragDistance;\n                        } else {\n                            if (surfaceViewTop + dy >= getPaddingTop())\n                                return getPaddingTop();\n                            if (surfaceViewTop + dy <= getPaddingTop() - mDragDistance)\n                                return getPaddingTop() - mDragDistance;\n                        }\n                }\n            }\n            return top;\n        }\n\n        @Override\n        public boolean tryCaptureView(View child, int pointerId) {\n            boolean result = child == getSurfaceView() || getBottomViews().contains(child);\n            if (result) {\n                isCloseBeforeDrag = getOpenStatus() == Status.Close;\n            }\n            return result;\n        }\n\n        @Override\n        public int getViewHorizontalDragRange(View child) {\n            return mDragDistance;\n        }\n\n        @Override\n        public int getViewVerticalDragRange(View child) {\n            return mDragDistance;\n        }\n\n        boolean isCloseBeforeDrag = true;\n\n        @Override\n        public void onViewReleased(View releasedChild, float xvel, float yvel) {\n            super.onViewReleased(releasedChild, xvel, yvel);\n            processHandRelease(xvel, yvel, isCloseBeforeDrag);\n            for (SwipeListener l : mSwipeListeners) {\n                l.onHandRelease(SwipeLayout.this, xvel, yvel);\n            }\n\n            invalidate();\n        }\n\n        @Override\n        public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {\n            View surfaceView = getSurfaceView();\n            if (surfaceView == null) return;\n            View currentBottomView = getCurrentBottomView();\n            int evLeft = surfaceView.getLeft(),\n                    evRight = surfaceView.getRight(),\n                    evTop = surfaceView.getTop(),\n                    evBottom = surfaceView.getBottom();\n            if (changedView == surfaceView) {\n\n                if (mShowMode == ShowMode.PullOut && currentBottomView != null) {\n                    if (mCurrentDragEdge == DragEdge.Left || mCurrentDragEdge == DragEdge.Right) {\n                        currentBottomView.offsetLeftAndRight(dx);\n                    } else {\n                        currentBottomView.offsetTopAndBottom(dy);\n                    }\n                }\n\n            } else if (getBottomViews().contains(changedView)) {\n\n                if (mShowMode == ShowMode.PullOut) {\n                    surfaceView.offsetLeftAndRight(dx);\n                    surfaceView.offsetTopAndBottom(dy);\n                } else {\n                    Rect rect = computeBottomLayDown(mCurrentDragEdge);\n                    if (currentBottomView != null) {\n                        currentBottomView.layout(rect.left, rect.top, rect.right, rect.bottom);\n                    }\n\n                    int newLeft = surfaceView.getLeft() + dx, newTop = surfaceView.getTop() + dy;\n\n                    if (mCurrentDragEdge == DragEdge.Left && newLeft < getPaddingLeft())\n                        newLeft = getPaddingLeft();\n                    else if (mCurrentDragEdge == DragEdge.Right && newLeft > getPaddingLeft())\n                        newLeft = getPaddingLeft();\n                    else if (mCurrentDragEdge == DragEdge.Top && newTop < getPaddingTop())\n                        newTop = getPaddingTop();\n                    else if (mCurrentDragEdge == DragEdge.Bottom && newTop > getPaddingTop())\n                        newTop = getPaddingTop();\n\n                    surfaceView.layout(newLeft, newTop, newLeft + getMeasuredWidth(), newTop + getMeasuredHeight());\n                }\n            }\n\n            dispatchRevealEvent(evLeft, evTop, evRight, evBottom);\n\n            dispatchSwipeEvent(evLeft, evTop, dx, dy);\n\n            invalidate();\n\n            captureChildrenBound();\n        }\n    };\n\n    /**\n     * save children's bounds, so they can restore the bound in {@link #onLayout(boolean, int, int, int, int)}\n     */\n    private void captureChildrenBound() {\n        View currentBottomView = getCurrentBottomView();\n        if (getOpenStatus() == Status.Close) {\n            mViewBoundCache.remove(currentBottomView);\n            return;\n        }\n\n        View[] views = new View[]{getSurfaceView(), currentBottomView};\n        for (View child : views) {\n            Rect rect = mViewBoundCache.get(child);\n            if (rect == null) {\n                rect = new Rect();\n                mViewBoundCache.put(child, rect);\n            }\n            rect.left = child.getLeft();\n            rect.top = child.getTop();\n            rect.right = child.getRight();\n            rect.bottom = child.getBottom();\n        }\n    }\n\n    /**\n     * the dispatchRevealEvent method may not always get accurate position, it\n     * makes the view may not always get the event when the view is totally\n     * show( fraction = 1), so , we need to calculate every time.\n     */\n    protected boolean isViewTotallyFirstShowed(View child, Rect relativePosition, DragEdge edge, int surfaceLeft,\n                                               int surfaceTop, int surfaceRight, int surfaceBottom) {\n        if (mShowEntirely.get(child)) return false;\n        int childLeft = relativePosition.left;\n        int childRight = relativePosition.right;\n        int childTop = relativePosition.top;\n        int childBottom = relativePosition.bottom;\n        boolean r = false;\n        if (getShowMode() == ShowMode.LayDown) {\n            if ((edge == DragEdge.Right && surfaceRight <= childLeft)\n                    || (edge == DragEdge.Left && surfaceLeft >= childRight)\n                    || (edge == DragEdge.Top && surfaceTop >= childBottom)\n                    || (edge == DragEdge.Bottom && surfaceBottom <= childTop)) r = true;\n        } else if (getShowMode() == ShowMode.PullOut) {\n            if ((edge == DragEdge.Right && childRight <= getWidth())\n                    || (edge == DragEdge.Left && childLeft >= getPaddingLeft())\n                    || (edge == DragEdge.Top && childTop >= getPaddingTop())\n                    || (edge == DragEdge.Bottom && childBottom <= getHeight())) r = true;\n        }\n        return r;\n    }\n\n    protected boolean isViewShowing(View child, Rect relativePosition, DragEdge availableEdge, int surfaceLeft,\n                                    int surfaceTop, int surfaceRight, int surfaceBottom) {\n        int childLeft = relativePosition.left;\n        int childRight = relativePosition.right;\n        int childTop = relativePosition.top;\n        int childBottom = relativePosition.bottom;\n        if (getShowMode() == ShowMode.LayDown) {\n            switch (availableEdge) {\n                case Right:\n                    if (surfaceRight > childLeft && surfaceRight <= childRight) {\n                        return true;\n                    }\n                    break;\n                case Left:\n                    if (surfaceLeft < childRight && surfaceLeft >= childLeft) {\n                        return true;\n                    }\n                    break;\n                case Top:\n                    if (surfaceTop >= childTop && surfaceTop < childBottom) {\n                        return true;\n                    }\n                    break;\n                case Bottom:\n                    if (surfaceBottom > childTop && surfaceBottom <= childBottom) {\n                        return true;\n                    }\n                    break;\n            }\n        } else if (getShowMode() == ShowMode.PullOut) {\n            switch (availableEdge) {\n                case Right:\n                    if (childLeft <= getWidth() && childRight > getWidth()) return true;\n                    break;\n                case Left:\n                    if (childRight >= getPaddingLeft() && childLeft < getPaddingLeft()) return true;\n                    break;\n                case Top:\n                    if (childTop < getPaddingTop() && childBottom >= getPaddingTop()) return true;\n                    break;\n                case Bottom:\n                    if (childTop < getHeight() && childTop >= getPaddingTop()) return true;\n                    break;\n            }\n        }\n        return false;\n    }\n\n    protected Rect getRelativePosition(View child) {\n        View t = child;\n        Rect r = new Rect(t.getLeft(), t.getTop(), 0, 0);\n        while (t.getParent() != null && t != getRootView()) {\n            t = (View) t.getParent();\n            if (t == this) break;\n            r.left += t.getLeft();\n            r.top += t.getTop();\n        }\n        r.right = r.left + child.getMeasuredWidth();\n        r.bottom = r.top + child.getMeasuredHeight();\n        return r;\n    }\n\n    private int mEventCounter = 0;\n\n    protected void dispatchSwipeEvent(int surfaceLeft, int surfaceTop, int dx, int dy) {\n        DragEdge edge = getDragEdge();\n        boolean open = true;\n        if (edge == DragEdge.Left) {\n            if (dx < 0) open = false;\n        } else if (edge == DragEdge.Right) {\n            if (dx > 0) open = false;\n        } else if (edge == DragEdge.Top) {\n            if (dy < 0) open = false;\n        } else if (edge == DragEdge.Bottom) {\n            if (dy > 0) open = false;\n        }\n\n        dispatchSwipeEvent(surfaceLeft, surfaceTop, open);\n    }\n\n    protected void dispatchSwipeEvent(int surfaceLeft, int surfaceTop, boolean open) {\n        safeBottomView();\n        Status status = getOpenStatus();\n\n        if (!mSwipeListeners.isEmpty()) {\n            mEventCounter++;\n            for (SwipeListener l : mSwipeListeners) {\n                if (mEventCounter == 1) {\n                    if (open) {\n                        l.onStartOpen(this);\n                    } else {\n                        l.onStartClose(this);\n                    }\n                }\n                l.onUpdate(SwipeLayout.this, surfaceLeft - getPaddingLeft(), surfaceTop - getPaddingTop());\n            }\n\n            if (status == Status.Close) {\n                for (SwipeListener l : mSwipeListeners) {\n                    l.onClose(SwipeLayout.this);\n                }\n                mEventCounter = 0;\n            }\n\n            if (status == Status.Open) {\n                View currentBottomView = getCurrentBottomView();\n                if (currentBottomView != null) {\n                    currentBottomView.setEnabled(true);\n                }\n                for (SwipeListener l : mSwipeListeners) {\n                    l.onOpen(SwipeLayout.this);\n                }\n                mEventCounter = 0;\n            }\n        }\n    }\n\n    /**\n     * prevent bottom view get any touch event. Especially in LayDown mode.\n     */\n    private void safeBottomView() {\n        Status status = getOpenStatus();\n        List<View> bottoms = getBottomViews();\n\n        if (status == Status.Close) {\n            for (View bottom : bottoms) {\n                if (bottom != null && bottom.getVisibility() != INVISIBLE) {\n                    bottom.setVisibility(INVISIBLE);\n                }\n            }\n        } else {\n            View currentBottomView = getCurrentBottomView();\n            if (currentBottomView != null && currentBottomView.getVisibility() != VISIBLE) {\n                currentBottomView.setVisibility(VISIBLE);\n            }\n        }\n    }\n\n    protected void dispatchRevealEvent(final int surfaceLeft, final int surfaceTop, final int surfaceRight,\n                                       final int surfaceBottom) {\n        if (mRevealListeners.isEmpty()) return;\n        for (Map.Entry<View, ArrayList<OnRevealListener>> entry : mRevealListeners.entrySet()) {\n            View child = entry.getKey();\n            Rect rect = getRelativePosition(child);\n            if (isViewShowing(child, rect, mCurrentDragEdge, surfaceLeft, surfaceTop,\n                    surfaceRight, surfaceBottom)) {\n                mShowEntirely.put(child, false);\n                int distance = 0;\n                float fraction = 0f;\n                if (getShowMode() == ShowMode.LayDown) {\n                    switch (mCurrentDragEdge) {\n                        case Left:\n                            distance = rect.left - surfaceLeft;\n                            fraction = distance / (float) child.getWidth();\n                            break;\n                        case Right:\n                            distance = rect.right - surfaceRight;\n                            fraction = distance / (float) child.getWidth();\n                            break;\n                        case Top:\n                            distance = rect.top - surfaceTop;\n                            fraction = distance / (float) child.getHeight();\n                            break;\n                        case Bottom:\n                            distance = rect.bottom - surfaceBottom;\n                            fraction = distance / (float) child.getHeight();\n                            break;\n                    }\n                } else if (getShowMode() == ShowMode.PullOut) {\n                    switch (mCurrentDragEdge) {\n                        case Left:\n                            distance = rect.right - getPaddingLeft();\n                            fraction = distance / (float) child.getWidth();\n                            break;\n                        case Right:\n                            distance = rect.left - getWidth();\n                            fraction = distance / (float) child.getWidth();\n                            break;\n                        case Top:\n                            distance = rect.bottom - getPaddingTop();\n                            fraction = distance / (float) child.getHeight();\n                            break;\n                        case Bottom:\n                            distance = rect.top - getHeight();\n                            fraction = distance / (float) child.getHeight();\n                            break;\n                    }\n                }\n\n                for (OnRevealListener l : entry.getValue()) {\n                    l.onReveal(child, mCurrentDragEdge, Math.abs(fraction), distance);\n                    if (Math.abs(fraction) == 1) {\n                        mShowEntirely.put(child, true);\n                    }\n                }\n            }\n\n            if (isViewTotallyFirstShowed(child, rect, mCurrentDragEdge, surfaceLeft, surfaceTop,\n                    surfaceRight, surfaceBottom)) {\n                mShowEntirely.put(child, true);\n                for (OnRevealListener l : entry.getValue()) {\n                    if (mCurrentDragEdge == DragEdge.Left\n                            || mCurrentDragEdge == DragEdge.Right)\n                        l.onReveal(child, mCurrentDragEdge, 1, child.getWidth());\n                    else\n                        l.onReveal(child, mCurrentDragEdge, 1, child.getHeight());\n                }\n            }\n\n        }\n    }\n\n    @Override\n    public void computeScroll() {\n        super.computeScroll();\n        if (mDragHelper.continueSettling(true)) {\n            ViewCompat.postInvalidateOnAnimation(this);\n        }\n    }\n\n    /**\n     * {@link android.view.View.OnLayoutChangeListener} added in API 11. I need\n     * to support it from API 8.\n     */\n    public interface OnLayout {\n        void onLayout(SwipeLayout v);\n    }\n\n    private List<OnLayout> mOnLayoutListeners;\n\n    public void addOnLayoutListener(OnLayout l) {\n        if (mOnLayoutListeners == null) mOnLayoutListeners = new ArrayList<OnLayout>();\n        mOnLayoutListeners.add(l);\n    }\n\n    public void removeOnLayoutListener(OnLayout l) {\n        if (mOnLayoutListeners != null) mOnLayoutListeners.remove(l);\n    }\n\n    public void clearDragEdge() {\n        mDragEdges.clear();\n    }\n\n    public void setDrag(DragEdge dragEdge, int childId) {\n        clearDragEdge();\n        addDrag(dragEdge, childId);\n    }\n\n    public void setDrag(DragEdge dragEdge, View child) {\n        clearDragEdge();\n        addDrag(dragEdge, child);\n    }\n\n    public void addDrag(DragEdge dragEdge, int childId) {\n        addDrag(dragEdge, findViewById(childId), null);\n    }\n\n    public void addDrag(DragEdge dragEdge, View child) {\n        addDrag(dragEdge, child, null);\n    }\n\n    public void addDrag(DragEdge dragEdge, View child, ViewGroup.LayoutParams params) {\n        if (child == null) return;\n\n        if (params == null) {\n            params = generateDefaultLayoutParams();\n        }\n        if (!checkLayoutParams(params)) {\n            params = generateLayoutParams(params);\n        }\n        int gravity = -1;\n        switch (dragEdge) {\n            case Left:\n                gravity = Gravity.LEFT;\n                break;\n            case Right:\n                gravity = Gravity.RIGHT;\n                break;\n            case Top:\n                gravity = Gravity.TOP;\n                break;\n            case Bottom:\n                gravity = Gravity.BOTTOM;\n                break;\n        }\n        if (params instanceof FrameLayout.LayoutParams) {\n            ((LayoutParams) params).gravity = gravity;\n        }\n        addView(child, 0, params);\n    }\n\n    @Override\n    public void addView(View child, int index, ViewGroup.LayoutParams params) {\n        if (child == null) return;\n        int gravity = Gravity.NO_GRAVITY;\n        try {\n            gravity = (Integer) params.getClass().getField(\"gravity\").get(params);\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n\n        if (gravity > 0) {\n            gravity = GravityCompat.getAbsoluteGravity(gravity, ViewCompat.getLayoutDirection(this));\n\n            if ((gravity & Gravity.LEFT) == Gravity.LEFT) {\n                mDragEdges.put(DragEdge.Left, child);\n            }\n            if ((gravity & Gravity.RIGHT) == Gravity.RIGHT) {\n                mDragEdges.put(DragEdge.Right, child);\n            }\n            if ((gravity & Gravity.TOP) == Gravity.TOP) {\n                mDragEdges.put(DragEdge.Top, child);\n            }\n            if ((gravity & Gravity.BOTTOM) == Gravity.BOTTOM) {\n                mDragEdges.put(DragEdge.Bottom, child);\n            }\n        } else {\n            for (Map.Entry<DragEdge, View> entry : mDragEdges.entrySet()) {\n                if (entry.getValue() == null) {\n                    //means used the drag_edge attr, the no gravity child should be use set\n                    mDragEdges.put(entry.getKey(), child);\n                    break;\n                }\n            }\n        }\n        if (child.getParent() == this) {\n            return;\n        }\n        super.addView(child, index, params);\n    }\n\n    @Override\n    protected void onLayout(boolean changed, int l, int t, int r, int b) {\n        updateBottomViews();\n\n        if (mOnLayoutListeners != null) for (int i = 0; i < mOnLayoutListeners.size(); i++) {\n            mOnLayoutListeners.get(i).onLayout(this);\n        }\n    }\n\n    void layoutPullOut() {\n        View surfaceView = getSurfaceView();\n        Rect surfaceRect = mViewBoundCache.get(surfaceView);\n        if (surfaceRect == null) surfaceRect = computeSurfaceLayoutArea(false);\n        if (surfaceView != null) {\n            surfaceView.layout(surfaceRect.left, surfaceRect.top, surfaceRect.right, surfaceRect.bottom);\n            bringChildToFront(surfaceView);\n        }\n        View currentBottomView = getCurrentBottomView();\n        Rect bottomViewRect = mViewBoundCache.get(currentBottomView);\n        if (bottomViewRect == null)\n            bottomViewRect = computeBottomLayoutAreaViaSurface(ShowMode.PullOut, surfaceRect);\n        if (currentBottomView != null) {\n            currentBottomView.layout(bottomViewRect.left, bottomViewRect.top, bottomViewRect.right, bottomViewRect.bottom);\n        }\n    }\n\n    void layoutLayDown() {\n        View surfaceView = getSurfaceView();\n        Rect surfaceRect = mViewBoundCache.get(surfaceView);\n        if (surfaceRect == null) surfaceRect = computeSurfaceLayoutArea(false);\n        if (surfaceView != null) {\n            surfaceView.layout(surfaceRect.left, surfaceRect.top, surfaceRect.right, surfaceRect.bottom);\n            bringChildToFront(surfaceView);\n        }\n        View currentBottomView = getCurrentBottomView();\n        Rect bottomViewRect = mViewBoundCache.get(currentBottomView);\n        if (bottomViewRect == null)\n            bottomViewRect = computeBottomLayoutAreaViaSurface(ShowMode.LayDown, surfaceRect);\n        if (currentBottomView != null) {\n            currentBottomView.layout(bottomViewRect.left, bottomViewRect.top, bottomViewRect.right, bottomViewRect.bottom);\n        }\n    }\n\n    private boolean mIsBeingDragged;\n\n    private void checkCanDrag(MotionEvent ev) {\n        if (mIsBeingDragged) return;\n        if (getOpenStatus() == Status.Middle) {\n            mIsBeingDragged = true;\n            return;\n        }\n        Status status = getOpenStatus();\n        float distanceX = ev.getRawX() - sX;\n        float distanceY = ev.getRawY() - sY;\n        float angle = Math.abs(distanceY / distanceX);\n        angle = (float) Math.toDegrees(Math.atan(angle));\n        if (getOpenStatus() == Status.Close) {\n            DragEdge dragEdge;\n            if (angle < 45) {\n                if (distanceX > 0 && isLeftSwipeEnabled()) {\n                    dragEdge = DragEdge.Left;\n                } else if (distanceX < 0 && isRightSwipeEnabled()) {\n                    dragEdge = DragEdge.Right;\n                } else return;\n\n            } else {\n                if (distanceY > 0 && isTopSwipeEnabled()) {\n                    dragEdge = DragEdge.Top;\n                } else if (distanceY < 0 && isBottomSwipeEnabled()) {\n                    dragEdge = DragEdge.Bottom;\n                } else return;\n            }\n            setCurrentDragEdge(dragEdge);\n        }\n\n        boolean doNothing = false;\n        if (mCurrentDragEdge == DragEdge.Right) {\n            boolean suitable = (status == Status.Open && distanceX > mTouchSlop)\n                    || (status == Status.Close && distanceX < -mTouchSlop);\n            suitable = suitable || (status == Status.Middle);\n\n            if (angle > 30 || !suitable) {\n                doNothing = true;\n            }\n        }\n\n        if (mCurrentDragEdge == DragEdge.Left) {\n            boolean suitable = (status == Status.Open && distanceX < -mTouchSlop)\n                    || (status == Status.Close && distanceX > mTouchSlop);\n            suitable = suitable || status == Status.Middle;\n\n            if (angle > 30 || !suitable) {\n                doNothing = true;\n            }\n        }\n\n        if (mCurrentDragEdge == DragEdge.Top) {\n            boolean suitable = (status == Status.Open && distanceY < -mTouchSlop)\n                    || (status == Status.Close && distanceY > mTouchSlop);\n            suitable = suitable || status == Status.Middle;\n\n            if (angle < 60 || !suitable) {\n                doNothing = true;\n            }\n        }\n\n        if (mCurrentDragEdge == DragEdge.Bottom) {\n            boolean suitable = (status == Status.Open && distanceY > mTouchSlop)\n                    || (status == Status.Close && distanceY < -mTouchSlop);\n            suitable = suitable || status == Status.Middle;\n\n            if (angle < 60 || !suitable) {\n                doNothing = true;\n            }\n        }\n        mIsBeingDragged = !doNothing;\n    }\n\n    @Override\n    public boolean onInterceptTouchEvent(MotionEvent ev) {\n        if (!isSwipeEnabled()) {\n            return false;\n        }\n        if (mClickToClose && getOpenStatus() == Status.Open && isTouchOnSurface(ev)) {\n            return true;\n        }\n        for (SwipeDenier denier : mSwipeDeniers) {\n            if (denier != null && denier.shouldDenySwipe(ev)) {\n                return false;\n            }\n        }\n\n        switch (ev.getAction()) {\n            case MotionEvent.ACTION_DOWN:\n                mDragHelper.processTouchEvent(ev);\n                mIsBeingDragged = false;\n                sX = ev.getRawX();\n                sY = ev.getRawY();\n                //if the swipe is in middle state(scrolling), should intercept the touch\n                if (getOpenStatus() == Status.Middle) {\n                    mIsBeingDragged = true;\n                }\n                break;\n            case MotionEvent.ACTION_MOVE:\n                boolean beforeCheck = mIsBeingDragged;\n                checkCanDrag(ev);\n                if (mIsBeingDragged) {\n                    ViewParent parent = getParent();\n                    if (parent != null) {\n                        parent.requestDisallowInterceptTouchEvent(true);\n                    }\n                }\n                if (!beforeCheck && mIsBeingDragged) {\n                    //let children has one chance to catch the touch, and request the swipe not intercept\n                    //useful when swipeLayout wrap a swipeLayout or other gestural layout\n                    return false;\n                }\n                break;\n\n            case MotionEvent.ACTION_CANCEL:\n            case MotionEvent.ACTION_UP:\n                mIsBeingDragged = false;\n                mDragHelper.processTouchEvent(ev);\n                break;\n            default://handle other action, such as ACTION_POINTER_DOWN/UP\n                mDragHelper.processTouchEvent(ev);\n        }\n        return mIsBeingDragged;\n    }\n\n    private float sX = -1, sY = -1;\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n        if (!isSwipeEnabled()) return super.onTouchEvent(event);\n\n        int action = event.getActionMasked();\n        gestureDetector.onTouchEvent(event);\n\n        switch (action) {\n            case MotionEvent.ACTION_DOWN:\n                mDragHelper.processTouchEvent(event);\n                sX = event.getRawX();\n                sY = event.getRawY();\n\n\n            case MotionEvent.ACTION_MOVE: {\n                //the drag state and the direction are already judged at onInterceptTouchEvent\n                checkCanDrag(event);\n                if (mIsBeingDragged) {\n                    getParent().requestDisallowInterceptTouchEvent(true);\n                    mDragHelper.processTouchEvent(event);\n                }\n                break;\n            }\n            case MotionEvent.ACTION_UP:\n            case MotionEvent.ACTION_CANCEL:\n                mIsBeingDragged = false;\n                mDragHelper.processTouchEvent(event);\n                break;\n\n            default://handle other action, such as ACTION_POINTER_DOWN/UP\n                mDragHelper.processTouchEvent(event);\n        }\n\n        return super.onTouchEvent(event) || mIsBeingDragged || action == MotionEvent.ACTION_DOWN;\n    }\n\n    public boolean isClickToClose() {\n        return mClickToClose;\n    }\n\n    public void setClickToClose(boolean mClickToClose) {\n        this.mClickToClose = mClickToClose;\n    }\n\n    public void setSwipeEnabled(boolean enabled) {\n        mSwipeEnabled = enabled;\n    }\n\n    public boolean isSwipeEnabled() {\n        return mSwipeEnabled;\n    }\n\n    public boolean isLeftSwipeEnabled() {\n        View bottomView = mDragEdges.get(DragEdge.Left);\n        return bottomView != null && bottomView.getParent() == this\n                && bottomView != getSurfaceView() && mSwipesEnabled[DragEdge.Left.ordinal()];\n    }\n\n    public void setLeftSwipeEnabled(boolean leftSwipeEnabled) {\n        this.mSwipesEnabled[DragEdge.Left.ordinal()] = leftSwipeEnabled;\n    }\n\n    public boolean isRightSwipeEnabled() {\n        View bottomView = mDragEdges.get(DragEdge.Right);\n        return bottomView != null && bottomView.getParent() == this\n                && bottomView != getSurfaceView() && mSwipesEnabled[DragEdge.Right.ordinal()];\n    }\n\n    public void setRightSwipeEnabled(boolean rightSwipeEnabled) {\n        this.mSwipesEnabled[DragEdge.Right.ordinal()] = rightSwipeEnabled;\n    }\n\n    public boolean isTopSwipeEnabled() {\n        View bottomView = mDragEdges.get(DragEdge.Top);\n        return bottomView != null && bottomView.getParent() == this\n                && bottomView != getSurfaceView() && mSwipesEnabled[DragEdge.Top.ordinal()];\n    }\n\n    public void setTopSwipeEnabled(boolean topSwipeEnabled) {\n        this.mSwipesEnabled[DragEdge.Top.ordinal()] = topSwipeEnabled;\n    }\n\n    public boolean isBottomSwipeEnabled() {\n        View bottomView = mDragEdges.get(DragEdge.Bottom);\n        return bottomView != null && bottomView.getParent() == this\n                && bottomView != getSurfaceView() && mSwipesEnabled[DragEdge.Bottom.ordinal()];\n    }\n\n    public void setBottomSwipeEnabled(boolean bottomSwipeEnabled) {\n        this.mSwipesEnabled[DragEdge.Bottom.ordinal()] = bottomSwipeEnabled;\n    }\n\n    /***\n     * Returns the percentage of revealing at which the view below should the view finish opening\n     * if it was already open before dragging\n     *\n     * @returns The percentage of view revealed to trigger, default value is 0.25\n     */\n    public float getWillOpenPercentAfterOpen() {\n        return mWillOpenPercentAfterOpen;\n    }\n\n    /***\n     * Allows to stablish at what percentage of revealing the view below should the view finish opening\n     * if it was already open before dragging\n     *\n     * @param willOpenPercentAfterOpen The percentage of view revealed to trigger, default value is 0.25\n     */\n    public void setWillOpenPercentAfterOpen(float willOpenPercentAfterOpen) {\n        this.mWillOpenPercentAfterOpen = willOpenPercentAfterOpen;\n    }\n\n    /***\n     * Returns the percentage of revealing at which the view below should the view finish opening\n     * if it was already closed before dragging\n     *\n     * @returns The percentage of view revealed to trigger, default value is 0.25\n     */\n    public float getWillOpenPercentAfterClose() {\n        return mWillOpenPercentAfterClose;\n    }\n\n    /***\n     * Allows to stablish at what percentage of revealing the view below should the view finish opening\n     * if it was already closed before dragging\n     *\n     * @param willOpenPercentAfterClose The percentage of view revealed to trigger, default value is 0.75\n     */\n    public void setWillOpenPercentAfterClose(float willOpenPercentAfterClose) {\n        this.mWillOpenPercentAfterClose = willOpenPercentAfterClose;\n    }\n\n    private boolean insideAdapterView() {\n        return getAdapterView() != null;\n    }\n\n    private AdapterView getAdapterView() {\n        ViewParent t = getParent();\n        if (t instanceof AdapterView) {\n            return (AdapterView) t;\n        }\n        return null;\n    }\n\n    private void performAdapterViewItemClick() {\n        if (getOpenStatus() != Status.Close) return;\n        ViewParent t = getParent();\n        if (t instanceof AdapterView) {\n            AdapterView view = (AdapterView) t;\n            int p = view.getPositionForView(SwipeLayout.this);\n            if (p != AdapterView.INVALID_POSITION) {\n                view.performItemClick(view.getChildAt(p - view.getFirstVisiblePosition()), p, view\n                        .getAdapter().getItemId(p));\n            }\n        }\n    }\n\n    private boolean performAdapterViewItemLongClick() {\n        if (getOpenStatus() != Status.Close) return false;\n        ViewParent t = getParent();\n        if (t instanceof AdapterView) {\n            AdapterView view = (AdapterView) t;\n            int p = view.getPositionForView(SwipeLayout.this);\n            if (p == AdapterView.INVALID_POSITION) return false;\n            long vId = view.getItemIdAtPosition(p);\n            boolean handled = false;\n            try {\n                Method m = AbsListView.class.getDeclaredMethod(\"performLongPress\", View.class, int.class, long.class);\n                m.setAccessible(true);\n                handled = (boolean) m.invoke(view, SwipeLayout.this, p, vId);\n\n            } catch (Exception e) {\n                e.printStackTrace();\n\n                if (view.getOnItemLongClickListener() != null) {\n                    handled = view.getOnItemLongClickListener().onItemLongClick(view, SwipeLayout.this, p, vId);\n                }\n                if (handled) {\n                    view.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);\n                }\n            }\n            return handled;\n        }\n        return false;\n    }\n\n    @Override\n    protected void onAttachedToWindow() {\n        super.onAttachedToWindow();\n        if (insideAdapterView()) {\n            if (clickListener == null) {\n                setOnClickListener(new OnClickListener() {\n                    @Override\n                    public void onClick(View v) {\n                        performAdapterViewItemClick();\n                    }\n                });\n            }\n            if (longClickListener == null) {\n                setOnLongClickListener(new OnLongClickListener() {\n                    @Override\n                    public boolean onLongClick(View v) {\n                        performAdapterViewItemLongClick();\n                        return true;\n                    }\n                });\n            }\n        }\n    }\n\n    OnClickListener clickListener;\n\n    @Override\n    public void setOnClickListener(OnClickListener l) {\n        super.setOnClickListener(l);\n        clickListener = l;\n    }\n\n    OnLongClickListener longClickListener;\n\n    @Override\n    public void setOnLongClickListener(OnLongClickListener l) {\n        super.setOnLongClickListener(l);\n        longClickListener = l;\n    }\n\n    private Rect hitSurfaceRect;\n\n    private boolean isTouchOnSurface(MotionEvent ev) {\n        View surfaceView = getSurfaceView();\n        if (surfaceView == null) {\n            return false;\n        }\n        if (hitSurfaceRect == null) {\n            hitSurfaceRect = new Rect();\n        }\n        surfaceView.getHitRect(hitSurfaceRect);\n        return hitSurfaceRect.contains((int) ev.getX(), (int) ev.getY());\n    }\n\n    private GestureDetector gestureDetector = new GestureDetector(getContext(), new SwipeDetector());\n\n    class SwipeDetector extends GestureDetector.SimpleOnGestureListener {\n        @Override\n        public boolean onSingleTapUp(MotionEvent e) {\n            if (mClickToClose && isTouchOnSurface(e)) {\n                close();\n            }\n            return super.onSingleTapUp(e);\n        }\n\n        @Override\n        public boolean onDoubleTap(MotionEvent e) {\n            if (mDoubleClickListener != null) {\n                View target;\n                View bottom = getCurrentBottomView();\n                View surface = getSurfaceView();\n                if (bottom != null && e.getX() > bottom.getLeft() && e.getX() < bottom.getRight()\n                        && e.getY() > bottom.getTop() && e.getY() < bottom.getBottom()) {\n                    target = bottom;\n                } else {\n                    target = surface;\n                }\n                mDoubleClickListener.onDoubleClick(SwipeLayout.this, target == surface);\n            }\n            return true;\n        }\n    }\n\n    /**\n     * set the drag distance, it will force set the bottom view's width or\n     * height via this value.\n     *\n     * @param max max distance in dp unit\n     */\n    public void setDragDistance(int max) {\n        if (max < 0) max = 0;\n        mDragDistance = dp2px(max);\n        requestLayout();\n    }\n\n    /**\n     * There are 2 diffirent show mode.\n     * {@link com.daimajia.swipe.SwipeLayout.ShowMode}.PullOut and\n     * {@link com.daimajia.swipe.SwipeLayout.ShowMode}.LayDown.\n     *\n     * @param mode\n     */\n    public void setShowMode(ShowMode mode) {\n        mShowMode = mode;\n        requestLayout();\n    }\n\n    public DragEdge getDragEdge() {\n        return mCurrentDragEdge;\n    }\n\n    public int getDragDistance() {\n        return mDragDistance;\n    }\n\n    public ShowMode getShowMode() {\n        return mShowMode;\n    }\n\n    /**\n     * return null if there is no surface view(no children)\n     */\n    public View getSurfaceView() {\n        if (getChildCount() == 0) return null;\n        return getChildAt(getChildCount() - 1);\n    }\n\n    /**\n     * return null if there is no bottom view\n     */\n    public View getCurrentBottomView() {\n        List<View> bottoms = getBottomViews();\n        if (mCurrentDragEdge.ordinal() < bottoms.size()) {\n            return bottoms.get(mCurrentDragEdge.ordinal());\n        }\n        return null;\n    }\n\n    /**\n     * @return all bottomViews: left, top, right, bottom (may null if the edge is not set)\n     */\n    public List<View> getBottomViews() {\n        ArrayList<View> bottoms = new ArrayList<View>();\n        for (DragEdge dragEdge : DragEdge.values()) {\n            bottoms.add(mDragEdges.get(dragEdge));\n        }\n        return bottoms;\n    }\n\n    public enum Status {\n        Middle,\n        Open,\n        Close\n    }\n\n    /**\n     * get the open status.\n     *\n     * @return {@link com.daimajia.swipe.SwipeLayout.Status} Open , Close or\n     * Middle.\n     */\n    public Status getOpenStatus() {\n        View surfaceView = getSurfaceView();\n        if (surfaceView == null) {\n            return Status.Close;\n        }\n        int surfaceLeft = surfaceView.getLeft();\n        int surfaceTop = surfaceView.getTop();\n        if (surfaceLeft == getPaddingLeft() && surfaceTop == getPaddingTop()) return Status.Close;\n\n        if (surfaceLeft == (getPaddingLeft() - mDragDistance) || surfaceLeft == (getPaddingLeft() + mDragDistance)\n                || surfaceTop == (getPaddingTop() - mDragDistance) || surfaceTop == (getPaddingTop() + mDragDistance))\n            return Status.Open;\n\n        return Status.Middle;\n    }\n\n\n    /**\n     * Process the surface release event.\n     *\n     * @param xvel                 xVelocity\n     * @param yvel                 yVelocity\n     * @param isCloseBeforeDragged the open state before drag\n     */\n    protected void processHandRelease(float xvel, float yvel, boolean isCloseBeforeDragged) {\n        float minVelocity = mDragHelper.getMinVelocity();\n        View surfaceView = getSurfaceView();\n        DragEdge currentDragEdge = mCurrentDragEdge;\n        if (currentDragEdge == null || surfaceView == null) {\n            return;\n        }\n        float willOpenPercent = (isCloseBeforeDragged ? mWillOpenPercentAfterClose : mWillOpenPercentAfterOpen);\n        if (currentDragEdge == DragEdge.Left) {\n            if (xvel > minVelocity) open();\n            else if (xvel < -minVelocity) close();\n            else {\n                float openPercent = 1f * getSurfaceView().getLeft() / mDragDistance;\n                if (openPercent > willOpenPercent) open();\n                else close();\n            }\n        } else if (currentDragEdge == DragEdge.Right) {\n            if (xvel > minVelocity) close();\n            else if (xvel < -minVelocity) open();\n            else {\n                float openPercent = 1f * (-getSurfaceView().getLeft()) / mDragDistance;\n                if (openPercent > willOpenPercent) open();\n                else close();\n            }\n        } else if (currentDragEdge == DragEdge.Top) {\n            if (yvel > minVelocity) open();\n            else if (yvel < -minVelocity) close();\n            else {\n                float openPercent = 1f * getSurfaceView().getTop() / mDragDistance;\n                if (openPercent > willOpenPercent) open();\n                else close();\n            }\n        } else if (currentDragEdge == DragEdge.Bottom) {\n            if (yvel > minVelocity) close();\n            else if (yvel < -minVelocity) open();\n            else {\n                float openPercent = 1f * (-getSurfaceView().getTop()) / mDragDistance;\n                if (openPercent > willOpenPercent) open();\n                else close();\n            }\n        }\n    }\n\n    /**\n     * smoothly open surface.\n     */\n    public void open() {\n        open(true, true);\n    }\n\n    public void open(boolean smooth) {\n        open(smooth, true);\n    }\n\n    public void open(boolean smooth, boolean notify) {\n        View surface = getSurfaceView(), bottom = getCurrentBottomView();\n        if (surface == null) {\n            return;\n        }\n        int dx, dy;\n        Rect rect = computeSurfaceLayoutArea(true);\n        if (smooth) {\n            mDragHelper.smoothSlideViewTo(surface, rect.left, rect.top);\n        } else {\n            dx = rect.left - surface.getLeft();\n            dy = rect.top - surface.getTop();\n            surface.layout(rect.left, rect.top, rect.right, rect.bottom);\n            if (getShowMode() == ShowMode.PullOut) {\n                Rect bRect = computeBottomLayoutAreaViaSurface(ShowMode.PullOut, rect);\n                if (bottom != null) {\n                    bottom.layout(bRect.left, bRect.top, bRect.right, bRect.bottom);\n                }\n            }\n            if (notify) {\n                dispatchRevealEvent(rect.left, rect.top, rect.right, rect.bottom);\n                dispatchSwipeEvent(rect.left, rect.top, dx, dy);\n            } else {\n                safeBottomView();\n            }\n        }\n        invalidate();\n    }\n\n    public void open(DragEdge edge) {\n        setCurrentDragEdge(edge);\n        open(true, true);\n    }\n\n    public void open(boolean smooth, DragEdge edge) {\n        setCurrentDragEdge(edge);\n        open(smooth, true);\n    }\n\n    public void open(boolean smooth, boolean notify, DragEdge edge) {\n        setCurrentDragEdge(edge);\n        open(smooth, notify);\n    }\n\n    /**\n     * smoothly close surface.\n     */\n    public void close() {\n        close(true, true);\n    }\n\n    public void close(boolean smooth) {\n        close(smooth, true);\n    }\n\n    /**\n     * close surface\n     *\n     * @param smooth smoothly or not.\n     * @param notify if notify all the listeners.\n     */\n    public void close(boolean smooth, boolean notify) {\n        View surface = getSurfaceView();\n        if (surface == null) {\n            return;\n        }\n        int dx, dy;\n        if (smooth)\n            mDragHelper.smoothSlideViewTo(getSurfaceView(), getPaddingLeft(), getPaddingTop());\n        else {\n            Rect rect = computeSurfaceLayoutArea(false);\n            dx = rect.left - surface.getLeft();\n            dy = rect.top - surface.getTop();\n            surface.layout(rect.left, rect.top, rect.right, rect.bottom);\n            if (notify) {\n                dispatchRevealEvent(rect.left, rect.top, rect.right, rect.bottom);\n                dispatchSwipeEvent(rect.left, rect.top, dx, dy);\n            } else {\n                safeBottomView();\n            }\n        }\n        invalidate();\n    }\n\n    public void toggle() {\n        toggle(true);\n    }\n\n    public void toggle(boolean smooth) {\n        if (getOpenStatus() == Status.Open)\n            close(smooth);\n        else if (getOpenStatus() == Status.Close) open(smooth);\n    }\n\n\n    /**\n     * a helper function to compute the Rect area that surface will hold in.\n     *\n     * @param open open status or close status.\n     */\n    private Rect computeSurfaceLayoutArea(boolean open) {\n        int l = getPaddingLeft(), t = getPaddingTop();\n        if (open) {\n            if (mCurrentDragEdge == DragEdge.Left)\n                l = getPaddingLeft() + mDragDistance;\n            else if (mCurrentDragEdge == DragEdge.Right)\n                l = getPaddingLeft() - mDragDistance;\n            else if (mCurrentDragEdge == DragEdge.Top)\n                t = getPaddingTop() + mDragDistance;\n            else t = getPaddingTop() - mDragDistance;\n        }\n        return new Rect(l, t, l + getMeasuredWidth(), t + getMeasuredHeight());\n    }\n\n    private Rect computeBottomLayoutAreaViaSurface(ShowMode mode, Rect surfaceArea) {\n        Rect rect = surfaceArea;\n        View bottomView = getCurrentBottomView();\n\n        int bl = rect.left, bt = rect.top, br = rect.right, bb = rect.bottom;\n        if (mode == ShowMode.PullOut) {\n            if (mCurrentDragEdge == DragEdge.Left)\n                bl = rect.left - mDragDistance;\n            else if (mCurrentDragEdge == DragEdge.Right)\n                bl = rect.right;\n            else if (mCurrentDragEdge == DragEdge.Top)\n                bt = rect.top - mDragDistance;\n            else bt = rect.bottom;\n\n            if (mCurrentDragEdge == DragEdge.Left || mCurrentDragEdge == DragEdge.Right) {\n                bb = rect.bottom;\n                br = bl + (bottomView == null ? 0 : bottomView.getMeasuredWidth());\n            } else {\n                bb = bt + (bottomView == null ? 0 : bottomView.getMeasuredHeight());\n                br = rect.right;\n            }\n        } else if (mode == ShowMode.LayDown) {\n            if (mCurrentDragEdge == DragEdge.Left)\n                br = bl + mDragDistance;\n            else if (mCurrentDragEdge == DragEdge.Right)\n                bl = br - mDragDistance;\n            else if (mCurrentDragEdge == DragEdge.Top)\n                bb = bt + mDragDistance;\n            else bt = bb - mDragDistance;\n\n        }\n        return new Rect(bl, bt, br, bb);\n\n    }\n\n    private Rect computeBottomLayDown(DragEdge dragEdge) {\n        int bl = getPaddingLeft(), bt = getPaddingTop();\n        int br, bb;\n        if (dragEdge == DragEdge.Right) {\n            bl = getMeasuredWidth() - mDragDistance;\n        } else if (dragEdge == DragEdge.Bottom) {\n            bt = getMeasuredHeight() - mDragDistance;\n        }\n        if (dragEdge == DragEdge.Left || dragEdge == DragEdge.Right) {\n            br = bl + mDragDistance;\n            bb = bt + getMeasuredHeight();\n        } else {\n            br = bl + getMeasuredWidth();\n            bb = bt + mDragDistance;\n        }\n        return new Rect(bl, bt, br, bb);\n    }\n\n    public void setOnDoubleClickListener(DoubleClickListener doubleClickListener) {\n        mDoubleClickListener = doubleClickListener;\n    }\n\n    public interface DoubleClickListener {\n        void onDoubleClick(SwipeLayout layout, boolean surface);\n    }\n\n    private int dp2px(float dp) {\n        return (int) (dp * getContext().getResources().getDisplayMetrics().density + 0.5f);\n    }\n\n\n    /**\n     * Deprecated, use {@link #setDrag(DragEdge, View)}\n     */\n    @Deprecated\n    public void setDragEdge(DragEdge dragEdge) {\n        clearDragEdge();\n        if (getChildCount() >= 2) {\n            mDragEdges.put(dragEdge, getChildAt(getChildCount() - 2));\n        }\n        setCurrentDragEdge(dragEdge);\n    }\n\n    public void onViewRemoved(View child) {\n        for (Map.Entry<DragEdge, View> entry : new HashMap<DragEdge, View>(mDragEdges).entrySet()) {\n            if (entry.getValue() == child) {\n                mDragEdges.remove(entry.getKey());\n            }\n        }\n    }\n\n    public Map<DragEdge, View> getDragEdgeMap() {\n        return mDragEdges;\n    }\n\n    /**\n     * Deprecated, use {@link #getDragEdgeMap()}\n     */\n    @Deprecated\n    public List<DragEdge> getDragEdges() {\n        return new ArrayList<DragEdge>(mDragEdges.keySet());\n    }\n\n    /**\n     * Deprecated, use {@link #setDrag(DragEdge, View)}\n     */\n    @Deprecated\n    public void setDragEdges(List<DragEdge> dragEdges) {\n        clearDragEdge();\n        for (int i = 0, size = Math.min(dragEdges.size(), getChildCount() - 1); i < size; i++) {\n            DragEdge dragEdge = dragEdges.get(i);\n            mDragEdges.put(dragEdge, getChildAt(i));\n        }\n        if (dragEdges.size() == 0 || dragEdges.contains(DefaultDragEdge)) {\n            setCurrentDragEdge(DefaultDragEdge);\n        } else {\n            setCurrentDragEdge(dragEdges.get(0));\n        }\n    }\n\n    /**\n     * Deprecated, use {@link #addDrag(DragEdge, View)}\n     */\n    @Deprecated\n    public void setDragEdges(DragEdge... mDragEdges) {\n        clearDragEdge();\n        setDragEdges(Arrays.asList(mDragEdges));\n    }\n\n    /**\n     * Deprecated, use {@link #addDrag(DragEdge, View)}\n     * When using multiple drag edges it's a good idea to pass the ids of the views that\n     * you're using for the left, right, top bottom views (-1 if you're not using a particular view)\n     */\n    @Deprecated\n    public void setBottomViewIds(int leftId, int rightId, int topId, int bottomId) {\n        addDrag(DragEdge.Left, findViewById(leftId));\n        addDrag(DragEdge.Right, findViewById(rightId));\n        addDrag(DragEdge.Top, findViewById(topId));\n        addDrag(DragEdge.Bottom, findViewById(bottomId));\n    }\n\n    private float getCurrentOffset() {\n        if (mCurrentDragEdge == null) return 0;\n        return mEdgeSwipesOffset[mCurrentDragEdge.ordinal()];\n    }\n\n    private void setCurrentDragEdge(DragEdge dragEdge) {\n        mCurrentDragEdge = dragEdge;\n        updateBottomViews();\n    }\n\n    private void updateBottomViews() {\n        View currentBottomView = getCurrentBottomView();\n        if (currentBottomView != null) {\n            if (mCurrentDragEdge == DragEdge.Left || mCurrentDragEdge == DragEdge.Right) {\n                mDragDistance = currentBottomView.getMeasuredWidth() - dp2px(getCurrentOffset());\n            } else {\n                mDragDistance = currentBottomView.getMeasuredHeight() - dp2px(getCurrentOffset());\n            }\n        }\n\n        if (mShowMode == ShowMode.PullOut) {\n            layoutPullOut();\n        } else if (mShowMode == ShowMode.LayDown) {\n            layoutLayDown();\n        }\n\n        safeBottomView();\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/daimajia/swipe/adapters/ArraySwipeAdapter.java",
    "content": "package com.daimajia.swipe.adapters;\n\nimport android.content.Context;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ArrayAdapter;\n\nimport com.daimajia.swipe.SwipeLayout;\nimport com.daimajia.swipe.implments.SwipeItemMangerImpl;\nimport com.daimajia.swipe.interfaces.SwipeAdapterInterface;\nimport com.daimajia.swipe.interfaces.SwipeItemMangerInterface;\nimport com.daimajia.swipe.util.Attributes;\n\nimport java.util.List;\n\npublic abstract class ArraySwipeAdapter<T> extends ArrayAdapter implements SwipeItemMangerInterface, SwipeAdapterInterface {\n\n    private SwipeItemMangerImpl mItemManger = new SwipeItemMangerImpl(this);\n    {}\n    public ArraySwipeAdapter(Context context, int resource) {\n        super(context, resource);\n    }\n\n    public ArraySwipeAdapter(Context context, int resource, int textViewResourceId) {\n        super(context, resource, textViewResourceId);\n    }\n\n    public ArraySwipeAdapter(Context context, int resource, T[] objects) {\n        super(context, resource, objects);\n    }\n\n    public ArraySwipeAdapter(Context context, int resource, int textViewResourceId, T[] objects) {\n        super(context, resource, textViewResourceId, objects);\n    }\n\n    public ArraySwipeAdapter(Context context, int resource, List<T> objects) {\n        super(context, resource, objects);\n    }\n\n    public ArraySwipeAdapter(Context context, int resource, int textViewResourceId, List<T> objects) {\n        super(context, resource, textViewResourceId, objects);\n    }\n\n    @Override\n    public void notifyDatasetChanged() {\n        super.notifyDataSetChanged();\n    }\n\n    @Override\n    public View getView(int position, View convertView, ViewGroup parent) {\n        View v = super.getView(position, convertView, parent);\n        mItemManger.bind(v, position);\n        return v;\n    }\n\n    @Override\n    public void openItem(int position) {\n        mItemManger.openItem(position);\n    }\n\n    @Override\n    public void closeItem(int position) {\n        mItemManger.closeItem(position);\n    }\n\n    @Override\n    public void closeAllExcept(SwipeLayout layout) {\n        mItemManger.closeAllExcept(layout);\n    }\n\n    @Override\n    public void closeAllItems() {\n        mItemManger.closeAllItems();\n    }\n\n    @Override\n    public List<Integer> getOpenItems() {\n        return mItemManger.getOpenItems();\n    }\n\n    @Override\n    public List<SwipeLayout> getOpenLayouts() {\n        return mItemManger.getOpenLayouts();\n    }\n\n    @Override\n    public void removeShownLayouts(SwipeLayout layout) {\n        mItemManger.removeShownLayouts(layout);\n    }\n\n    @Override\n    public boolean isOpen(int position) {\n        return mItemManger.isOpen(position);\n    }\n\n    @Override\n    public Attributes.Mode getMode() {\n        return mItemManger.getMode();\n    }\n\n    @Override\n    public void setMode(Attributes.Mode mode) {\n        mItemManger.setMode(mode);\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/daimajia/swipe/adapters/BaseSwipeAdapter.java",
    "content": "package com.daimajia.swipe.adapters;\n\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.BaseAdapter;\n\nimport com.daimajia.swipe.SwipeLayout;\nimport com.daimajia.swipe.implments.SwipeItemMangerImpl;\nimport com.daimajia.swipe.interfaces.SwipeAdapterInterface;\nimport com.daimajia.swipe.interfaces.SwipeItemMangerInterface;\nimport com.daimajia.swipe.util.Attributes;\n\nimport java.util.List;\n\npublic abstract class BaseSwipeAdapter extends BaseAdapter implements SwipeItemMangerInterface, SwipeAdapterInterface {\n\n    protected SwipeItemMangerImpl mItemManger = new SwipeItemMangerImpl(this);\n\n    /**\n     * return the {@link com.daimajia.swipe.SwipeLayout} resource id, int the view item.\n     * @param position\n     * @return\n     */\n    public abstract int getSwipeLayoutResourceId(int position);\n\n    /**\n     * generate a new view item.\n     * Never bind SwipeListener or fill values here, every item has a chance to fill value or bind\n     * listeners in fillValues.\n     * to fill it in {@code fillValues} method.\n     * @param position\n     * @param parent\n     * @return\n     */\n    public abstract View generateView(int position, ViewGroup parent);\n\n    /**\n     * fill values or bind listeners to the view.\n     * @param position\n     * @param convertView\n     */\n    public abstract void fillValues(int position, View convertView);\n\n    @Override\n    public void notifyDatasetChanged() {\n        super.notifyDataSetChanged();\n    }\n\n\n    @Override\n    public final View getView(int position, View convertView, ViewGroup parent) {\n        View v = convertView;\n        if(v == null){\n            v = generateView(position, parent);\n        }\n        mItemManger.bind(v, position);\n        fillValues(position, v);\n        return v;\n    }\n\n    @Override\n    public void openItem(int position) {\n        mItemManger.openItem(position);\n    }\n\n    @Override\n    public void closeItem(int position) {\n        mItemManger.closeItem(position);\n    }\n\n    @Override\n    public void closeAllExcept(SwipeLayout layout) {\n        mItemManger.closeAllExcept(layout);\n    }\n\n    @Override\n    public void closeAllItems() {\n        mItemManger.closeAllItems();\n    }\n\n    @Override\n    public List<Integer> getOpenItems() {\n        return mItemManger.getOpenItems();\n    }\n\n    @Override\n    public List<SwipeLayout> getOpenLayouts() {\n        return mItemManger.getOpenLayouts();\n    }\n\n    @Override\n    public void removeShownLayouts(SwipeLayout layout) {\n        mItemManger.removeShownLayouts(layout);\n    }\n\n    @Override\n    public boolean isOpen(int position) {\n        return mItemManger.isOpen(position);\n    }\n\n    @Override\n    public Attributes.Mode getMode() {\n        return mItemManger.getMode();\n    }\n\n    @Override\n    public void setMode(Attributes.Mode mode) {\n        mItemManger.setMode(mode);\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/daimajia/swipe/adapters/CursorSwipeAdapter.java",
    "content": "package com.daimajia.swipe.adapters;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.support.v4.widget.CursorAdapter;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.daimajia.swipe.SwipeLayout;\nimport com.daimajia.swipe.implments.SwipeItemMangerImpl;\nimport com.daimajia.swipe.interfaces.SwipeAdapterInterface;\nimport com.daimajia.swipe.interfaces.SwipeItemMangerInterface;\nimport com.daimajia.swipe.util.Attributes;\n\nimport java.util.List;\n\npublic abstract class CursorSwipeAdapter extends CursorAdapter implements SwipeItemMangerInterface, SwipeAdapterInterface {\n\n    private SwipeItemMangerImpl mItemManger = new SwipeItemMangerImpl(this);\n\n    protected CursorSwipeAdapter(Context context, Cursor c, boolean autoRequery) {\n        super(context, c, autoRequery);\n    }\n\n    protected CursorSwipeAdapter(Context context, Cursor c, int flags) {\n        super(context, c, flags);\n    }\n\n    @Override\n    public View getView(int position, View convertView, ViewGroup parent) {\n        View v = super.getView(position, convertView, parent);\n        mItemManger.bind(v, position);\n        return v;\n    }\n\n    @Override\n    public void openItem(int position) {\n        mItemManger.openItem(position);\n    }\n\n    @Override\n    public void closeItem(int position) {\n        mItemManger.closeItem(position);\n    }\n\n    @Override\n    public void closeAllExcept(SwipeLayout layout) {\n        mItemManger.closeAllExcept(layout);\n    }\n\n    @Override\n    public void closeAllItems() {\n        mItemManger.closeAllItems();\n    }\n\n    @Override\n    public List<Integer> getOpenItems() {\n        return mItemManger.getOpenItems();\n    }\n\n    @Override\n    public List<SwipeLayout> getOpenLayouts() {\n        return mItemManger.getOpenLayouts();\n    }\n\n    @Override\n    public void removeShownLayouts(SwipeLayout layout) {\n        mItemManger.removeShownLayouts(layout);\n    }\n\n    @Override\n    public boolean isOpen(int position) {\n        return mItemManger.isOpen(position);\n    }\n\n    @Override\n    public Attributes.Mode getMode() {\n        return mItemManger.getMode();\n    }\n\n    @Override\n    public void setMode(Attributes.Mode mode) {\n        mItemManger.setMode(mode);\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/daimajia/swipe/adapters/RecyclerSwipeAdapter.java",
    "content": "package com.daimajia.swipe.adapters;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.ViewGroup;\n\nimport com.daimajia.swipe.SwipeLayout;\nimport com.daimajia.swipe.implments.SwipeItemMangerImpl;\nimport com.daimajia.swipe.interfaces.SwipeAdapterInterface;\nimport com.daimajia.swipe.interfaces.SwipeItemMangerInterface;\nimport com.daimajia.swipe.util.Attributes;\n\nimport java.util.List;\n\npublic abstract class RecyclerSwipeAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> implements SwipeItemMangerInterface, SwipeAdapterInterface {\n\n    public SwipeItemMangerImpl mItemManger = new SwipeItemMangerImpl(this);\n\n    @Override\n    public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);\n\n    @Override\n    public abstract void onBindViewHolder(VH viewHolder, final int position);\n\n    @Override\n    public void notifyDatasetChanged() {\n        super.notifyDataSetChanged();\n    }\n\n    @Override\n    public void openItem(int position) {\n        mItemManger.openItem(position);\n    }\n\n    @Override\n    public void closeItem(int position) {\n        mItemManger.closeItem(position);\n    }\n\n    @Override\n    public void closeAllExcept(SwipeLayout layout) {\n        mItemManger.closeAllExcept(layout);\n    }\n\n    @Override\n    public void closeAllItems() {\n        mItemManger.closeAllItems();\n    }\n\n    @Override\n    public List<Integer> getOpenItems() {\n        return mItemManger.getOpenItems();\n    }\n\n    @Override\n    public List<SwipeLayout> getOpenLayouts() {\n        return mItemManger.getOpenLayouts();\n    }\n\n    @Override\n    public void removeShownLayouts(SwipeLayout layout) {\n        mItemManger.removeShownLayouts(layout);\n    }\n\n    @Override\n    public boolean isOpen(int position) {\n        return mItemManger.isOpen(position);\n    }\n\n    @Override\n    public Attributes.Mode getMode() {\n        return mItemManger.getMode();\n    }\n\n    @Override\n    public void setMode(Attributes.Mode mode) {\n        mItemManger.setMode(mode);\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/daimajia/swipe/adapters/SimpleCursorSwipeAdapter.java",
    "content": "package com.daimajia.swipe.adapters;\n\nimport android.content.Context;\nimport android.database.Cursor;\nimport android.support.v4.widget.SimpleCursorAdapter;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.daimajia.swipe.SwipeLayout;\nimport com.daimajia.swipe.implments.SwipeItemMangerImpl;\nimport com.daimajia.swipe.interfaces.SwipeAdapterInterface;\nimport com.daimajia.swipe.interfaces.SwipeItemMangerInterface;\nimport com.daimajia.swipe.util.Attributes;\n\nimport java.util.List;\n\npublic abstract class SimpleCursorSwipeAdapter extends SimpleCursorAdapter implements SwipeItemMangerInterface, SwipeAdapterInterface {\n\n    private SwipeItemMangerImpl mItemManger = new SwipeItemMangerImpl(this);\n\n    protected SimpleCursorSwipeAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {\n        super(context, layout, c, from, to, flags);\n    }\n\n    protected SimpleCursorSwipeAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {\n        super(context, layout, c, from, to);\n    }\n\n    @Override\n    public View getView(int position, View convertView, ViewGroup parent) {\n        View v = super.getView(position, convertView, parent);\n        mItemManger.bind(v, position);\n        return v;\n    }\n\n    @Override\n    public void openItem(int position) {\n        mItemManger.openItem(position);\n    }\n\n    @Override\n    public void closeItem(int position) {\n        mItemManger.closeItem(position);\n    }\n\n    @Override\n    public void closeAllExcept(SwipeLayout layout) {\n        mItemManger.closeAllExcept(layout);\n    }\n\n    @Override\n    public List<Integer> getOpenItems() {\n        return mItemManger.getOpenItems();\n    }\n\n    @Override\n    public List<SwipeLayout> getOpenLayouts() {\n        return mItemManger.getOpenLayouts();\n    }\n\n    @Override\n    public void removeShownLayouts(SwipeLayout layout) {\n        mItemManger.removeShownLayouts(layout);\n    }\n\n    @Override\n    public boolean isOpen(int position) {\n        return mItemManger.isOpen(position);\n    }\n\n    @Override\n    public Attributes.Mode getMode() {\n        return mItemManger.getMode();\n    }\n\n    @Override\n    public void setMode(Attributes.Mode mode) {\n        mItemManger.setMode(mode);\n    }\n}\n"
  },
  {
    "path": "library/src/main/java/com/daimajia/swipe/implments/SwipeItemMangerImpl.java",
    "content": "package com.daimajia.swipe.implments;\n\nimport android.view.View;\n\nimport com.daimajia.swipe.SimpleSwipeListener;\nimport com.daimajia.swipe.SwipeLayout;\nimport com.daimajia.swipe.interfaces.SwipeAdapterInterface;\nimport com.daimajia.swipe.interfaces.SwipeItemMangerInterface;\nimport com.daimajia.swipe.util.Attributes;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\n/**\n * SwipeItemMangerImpl is a helper class to help all the adapters to maintain open status.\n */\npublic class SwipeItemMangerImpl implements SwipeItemMangerInterface {\n\n    private Attributes.Mode mode = Attributes.Mode.Single;\n    public final int INVALID_POSITION = -1;\n\n    protected int mOpenPosition = INVALID_POSITION;\n\n    protected Set<Integer> mOpenPositions = new HashSet<Integer>();\n    protected Set<SwipeLayout> mShownLayouts = new HashSet<SwipeLayout>();\n\n    protected SwipeAdapterInterface swipeAdapterInterface;\n\n    public SwipeItemMangerImpl(SwipeAdapterInterface swipeAdapterInterface) {\n        if (swipeAdapterInterface == null)\n            throw new IllegalArgumentException(\"SwipeAdapterInterface can not be null\");\n\n        this.swipeAdapterInterface = swipeAdapterInterface;\n    }\n\n    public Attributes.Mode getMode() {\n        return mode;\n    }\n\n    public void setMode(Attributes.Mode mode) {\n        this.mode = mode;\n        mOpenPositions.clear();\n        mShownLayouts.clear();\n        mOpenPosition = INVALID_POSITION;\n    }\n\n    public void bind(View view, int position) {\n        int resId = swipeAdapterInterface.getSwipeLayoutResourceId(position);\n        SwipeLayout swipeLayout = (SwipeLayout) view.findViewById(resId);\n        if (swipeLayout == null)\n            throw new IllegalStateException(\"can not find SwipeLayout in target view\");\n\n        if (swipeLayout.getTag(resId) == null) {\n            OnLayoutListener onLayoutListener = new OnLayoutListener(position);\n            SwipeMemory swipeMemory = new SwipeMemory(position);\n            swipeLayout.addSwipeListener(swipeMemory);\n            swipeLayout.addOnLayoutListener(onLayoutListener);\n            swipeLayout.setTag(resId, new ValueBox(position, swipeMemory, onLayoutListener));\n            mShownLayouts.add(swipeLayout);\n        } else {\n            ValueBox valueBox = (ValueBox) swipeLayout.getTag(resId);\n            valueBox.swipeMemory.setPosition(position);\n            valueBox.onLayoutListener.setPosition(position);\n            valueBox.position = position;\n        }\n    }\n\n    @Override\n    public void openItem(int position) {\n        if (mode == Attributes.Mode.Multiple) {\n            if (!mOpenPositions.contains(position))\n                mOpenPositions.add(position);\n        } else {\n            mOpenPosition = position;\n        }\n        swipeAdapterInterface.notifyDatasetChanged();\n    }\n\n    @Override\n    public void closeItem(int position) {\n        if (mode == Attributes.Mode.Multiple) {\n            mOpenPositions.remove(position);\n        } else {\n            if (mOpenPosition == position)\n                mOpenPosition = INVALID_POSITION;\n        }\n        swipeAdapterInterface.notifyDatasetChanged();\n    }\n\n    @Override\n    public void closeAllExcept(SwipeLayout layout) {\n        for (SwipeLayout s : mShownLayouts) {\n            if (s != layout)\n                s.close();\n        }\n    }\n\n    @Override\n    public void closeAllItems() {\n        if (mode == Attributes.Mode.Multiple) {\n            mOpenPositions.clear();\n        } else {\n            mOpenPosition = INVALID_POSITION;\n        }\n        for (SwipeLayout s : mShownLayouts) {\n            s.close();\n        }\n    }\n\n    @Override\n    public void removeShownLayouts(SwipeLayout layout) {\n        mShownLayouts.remove(layout);\n    }\n\n    @Override\n    public List<Integer> getOpenItems() {\n        if (mode == Attributes.Mode.Multiple) {\n            return new ArrayList<Integer>(mOpenPositions);\n        } else {\n            return Collections.singletonList(mOpenPosition);\n        }\n    }\n\n    @Override\n    public List<SwipeLayout> getOpenLayouts() {\n        return new ArrayList<SwipeLayout>(mShownLayouts);\n    }\n\n    @Override\n    public boolean isOpen(int position) {\n        if (mode == Attributes.Mode.Multiple) {\n            return mOpenPositions.contains(position);\n        } else {\n            return mOpenPosition == position;\n        }\n    }\n\n    class ValueBox {\n        OnLayoutListener onLayoutListener;\n        SwipeMemory swipeMemory;\n        int position;\n\n        ValueBox(int position, SwipeMemory swipeMemory, OnLayoutListener onLayoutListener) {\n            this.swipeMemory = swipeMemory;\n            this.onLayoutListener = onLayoutListener;\n            this.position = position;\n        }\n    }\n\n    class OnLayoutListener implements SwipeLayout.OnLayout {\n\n        private int position;\n\n        OnLayoutListener(int position) {\n            this.position = position;\n        }\n\n        public void setPosition(int position) {\n            this.position = position;\n        }\n\n        @Override\n        public void onLayout(SwipeLayout v) {\n            if (isOpen(position)) {\n                v.open(false, false);\n            } else {\n                v.close(false, false);\n            }\n        }\n\n    }\n\n    class SwipeMemory extends SimpleSwipeListener {\n\n        private int position;\n\n        SwipeMemory(int position) {\n            this.position = position;\n        }\n\n        @Override\n        public void onClose(SwipeLayout layout) {\n            if (mode == Attributes.Mode.Multiple) {\n                mOpenPositions.remove(position);\n            } else {\n                mOpenPosition = INVALID_POSITION;\n            }\n        }\n\n        @Override\n        public void onStartOpen(SwipeLayout layout) {\n            if (mode == Attributes.Mode.Single) {\n                closeAllExcept(layout);\n            }\n        }\n\n        @Override\n        public void onOpen(SwipeLayout layout) {\n            if (mode == Attributes.Mode.Multiple)\n                mOpenPositions.add(position);\n            else {\n                closeAllExcept(layout);\n                mOpenPosition = position;\n            }\n        }\n\n        public void setPosition(int position) {\n            this.position = position;\n        }\n    }\n\n}\n"
  },
  {
    "path": "library/src/main/java/com/daimajia/swipe/interfaces/SwipeAdapterInterface.java",
    "content": "package com.daimajia.swipe.interfaces;\n\npublic interface SwipeAdapterInterface {\n\n    int getSwipeLayoutResourceId(int position);\n\n    void notifyDatasetChanged();\n\n}\n"
  },
  {
    "path": "library/src/main/java/com/daimajia/swipe/interfaces/SwipeItemMangerInterface.java",
    "content": "package com.daimajia.swipe.interfaces;\n\nimport com.daimajia.swipe.SwipeLayout;\nimport com.daimajia.swipe.util.Attributes;\n\nimport java.util.List;\n\npublic interface SwipeItemMangerInterface {\n\n    void openItem(int position);\n\n    void closeItem(int position);\n\n    void closeAllExcept(SwipeLayout layout);\n    \n    void closeAllItems();\n\n    List<Integer> getOpenItems();\n\n    List<SwipeLayout> getOpenLayouts();\n\n    void removeShownLayouts(SwipeLayout layout);\n\n    boolean isOpen(int position);\n\n    Attributes.Mode getMode();\n\n    void setMode(Attributes.Mode mode);\n}\n"
  },
  {
    "path": "library/src/main/java/com/daimajia/swipe/util/Attributes.java",
    "content": "package com.daimajia.swipe.util;\n\n\npublic class Attributes {\n\n    public enum Mode {\n        Single, Multiple\n    }\n}\n"
  },
  {
    "path": "library/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <declare-styleable name=\"SwipeLayout\">\n        <attr name=\"drag_edge\">\n            <flag name=\"left\" value=\"1\" />\n            <flag name=\"right\" value=\"2\" />\n            <flag name=\"top\" value=\"4\" />\n            <flag name=\"bottom\" value=\"8\" />\n        </attr>\n        <attr name=\"leftEdgeSwipeOffset\" format=\"dimension\" />\n        <attr name=\"rightEdgeSwipeOffset\" format=\"dimension\" />\n        <attr name=\"topEdgeSwipeOffset\" format=\"dimension\" />\n        <attr name=\"bottomEdgeSwipeOffset\" format=\"dimension\" />\n        <attr name=\"show_mode\" format=\"enum\">\n            <enum name=\"lay_down\" value=\"0\" />\n            <enum name=\"pull_out\" value=\"1\" />\n        </attr>\n        <attr name=\"clickToClose\" format=\"boolean\" />\n    </declare-styleable>\n</resources>"
  },
  {
    "path": "settings.gradle",
    "content": "include ':demo', ':library'\n"
  }
]