[
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
  },
  {
    "path": ".idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExtensions />\n    <wildcardResourcePatterns>\n      <entry name=\"!?*.java\" />\n      <entry name=\"!?*.form\" />\n      <entry name=\"!?*.class\" />\n      <entry name=\"!?*.groovy\" />\n      <entry name=\"!?*.scala\" />\n      <entry name=\"!?*.flex\" />\n      <entry name=\"!?*.kt\" />\n      <entry name=\"!?*.clj\" />\n      <entry name=\"!?*.aj\" />\n    </wildcardResourcePatterns>\n    <annotationProcessing>\n      <profile default=\"true\" name=\"Default\" enabled=\"false\">\n        <processorPath useClasspath=\"true\" />\n      </profile>\n    </annotationProcessing>\n  </component>\n</project>"
  },
  {
    "path": ".idea/copyright/profiles_settings.xml",
    "content": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": ".idea/encodings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"PROJECT\" charset=\"UTF-8\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"distributionType\" value=\"DEFAULT_WRAPPED\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n            <option value=\"$PROJECT_DIR$/easysidebar\" />\n          </set>\n        </option>\n        <option name=\"resolveModulePerSourceSet\" value=\"false\" />\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points version=\"2.0\" />\n  </component>\n  <component name=\"NullableNotNullManager\">\n    <option name=\"myDefaultNullable\" value=\"android.support.annotation.Nullable\" />\n    <option name=\"myDefaultNotNull\" value=\"android.support.annotation.NonNull\" />\n    <option name=\"myNullables\">\n      <value>\n        <list size=\"4\">\n          <item index=\"0\" class=\"java.lang.String\" itemvalue=\"org.jetbrains.annotations.Nullable\" />\n          <item index=\"1\" class=\"java.lang.String\" itemvalue=\"javax.annotation.Nullable\" />\n          <item index=\"2\" class=\"java.lang.String\" itemvalue=\"edu.umd.cs.findbugs.annotations.Nullable\" />\n          <item index=\"3\" class=\"java.lang.String\" itemvalue=\"android.support.annotation.Nullable\" />\n        </list>\n      </value>\n    </option>\n    <option name=\"myNotNulls\">\n      <value>\n        <list size=\"4\">\n          <item index=\"0\" class=\"java.lang.String\" itemvalue=\"org.jetbrains.annotations.NotNull\" />\n          <item index=\"1\" class=\"java.lang.String\" itemvalue=\"javax.annotation.Nonnull\" />\n          <item index=\"2\" class=\"java.lang.String\" itemvalue=\"edu.umd.cs.findbugs.annotations.NonNull\" />\n          <item index=\"3\" class=\"java.lang.String\" itemvalue=\"android.support.annotation.NonNull\" />\n        </list>\n      </value>\n    </option>\n  </component>\n  <component name=\"ProjectLevelVcsManager\" settingsEditedManually=\"false\">\n    <OptionsSetting value=\"true\" id=\"Add\" />\n    <OptionsSetting value=\"true\" id=\"Remove\" />\n    <OptionsSetting value=\"true\" id=\"Checkout\" />\n    <OptionsSetting value=\"true\" id=\"Update\" />\n    <OptionsSetting value=\"true\" id=\"Status\" />\n    <OptionsSetting value=\"true\" id=\"Edit\" />\n    <ConfirmationsSetting value=\"0\" id=\"Add\" />\n    <ConfirmationsSetting value=\"0\" id=\"Remove\" />\n  </component>\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_1_7\" default=\"true\" assert-keyword=\"true\" jdk-15=\"true\" project-jdk-name=\"1.8\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"ProjectType\">\n    <option name=\"id\" value=\"Android\" />\n  </component>\n  <component name=\"masterDetails\">\n    <states>\n      <state key=\"ProjectJDKs.UI\">\n        <settings>\n          <last-edited>1.8</last-edited>\n          <splitter-proportions>\n            <option name=\"proportions\">\n              <list>\n                <option value=\"0.2\" />\n              </list>\n            </option>\n          </splitter-proportions>\n        </settings>\n      </state>\n    </states>\n  </component>\n</project>"
  },
  {
    "path": ".idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/EasySideBar.iml\" filepath=\"$PROJECT_DIR$/EasySideBar.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/app/app.iml\" filepath=\"$PROJECT_DIR$/app/app.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/easysidebar/easysidebar.iml\" filepath=\"$PROJECT_DIR$/easysidebar/easysidebar.iml\" />\n    </modules>\n  </component>\n</project>"
  },
  {
    "path": ".idea/runConfigurations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <option name=\"ignoredProducers\">\n      <set>\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer\" />\n      </set>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": ".idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"$PROJECT_DIR$\" vcs=\"Git\" />\n  </component>\n</project>"
  },
  {
    "path": "README.md",
    "content": "# EasySideBar\n一款按字母排序的库，已封装好城市数据，可定制化强，也可以下载源代码用Module的形式引入自己改一改来使用，也可稍做改造定制成通讯录。欢迎Star、提建议、提Issue。\n\n![EasySideBar.gif](https://github.com/Bigkoo/EasySideBar/blob/master/preview/GIF.gif)\n\n## **使用步骤：**\n\n### 1.添加Jcenter仓库 Gradle依赖：\n\n```java\ncompile 'com.contrarywind:EasySideBar:1.1.0'\n```\n\n## 2.在Activity中添加如下代码：\n\n```java\n\n//热门城市数据 ，不添加数据的时候会隐藏该布局\nArrayList<String> hotCityList = new ArrayList<>();\n                hotCityList.add(\"北京\");\n                hotCityList.add(\"上海\");\n                hotCityList.add(\"广州\");\n                hotCityList.add(\"深圳\");\n                hotCityList.add(\"杭州\");\n                hotCityList.add(\"成都\");\n                hotCityList.add(\"厦门\");\n                hotCityList.add(\"天津\");\n                hotCityList.add(\"武汉\");\n                hotCityList.add(\"长沙\");\n                \n//初始化以及配置\nnew EasySideBarBuilder(MainActivity.this)\n                        .setTitle(\"城市选择\")\n                        /*.setIndexColor(Color.BLUE)*/\n                        .setIndexColor(0xFF0095EE)\n                        /*.isLazyRespond(true) //懒加载模式*/\n                        .setHotCityList(hotCityList)//热门城市列表\n                        .setIndexItems(mIndexItems)//索引字母\n                        .setLocationCity(\"广州\")//定位城市\n                        .setMaxOffset(60)//索引的最大偏移量\n                        .start();\n\n```\n## 3.在Activity中重写onActivityResult方法，接收回调数据：\n\n```java\n\n    //resultCode 是使用封装好的EasySideBarBuilder.CODE_SIDEREQUEST\n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n        switch (requestCode) {\n            case EasySideBarBuilder.CODE_SIDEREQUEST:\n             if (data!=null){\n                 String city = data.getStringExtra(\"selected\");\n                 Toast.makeText(this,\"选择的城市：\"+city,Toast.LENGTH_SHORT).show();\n             }\n                break;\n\n            default:\n                break;\n        }\n\n        }\n\n```\n\n\n## Thanks\n\n- [WaveSideBar](https://github.com/gjiazhe/WaveSideBar)\n\n\n# License\n\n```\nCopyright 2014 Bigkoo\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 25\n    buildToolsVersion \"25.0.2\"\n    defaultConfig {\n        applicationId \"com.easysidebar\"\n        minSdkVersion 15\n        targetSdkVersion 25\n        versionCode 1\n        versionName \"1.0\"\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    compile fileTree(dir: 'libs', include: ['*.jar'])\n    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {\n        exclude group: 'com.android.support', module: 'support-annotations'\n    })\n    compile 'com.android.support:appcompat-v7:25.1.1'\n    testCompile 'junit:junit:4.12'\n\n    compile project(path: ':easysidebar')\n}\n"
  },
  {
    "path": "app/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 F:\\Android-studio\\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": "app/src/androidTest/java/com/demo/ExampleInstrumentedTest.java",
    "content": "package com.demo;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimport android.support.test.runner.AndroidJUnit4;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\n\nimport static org.junit.Assert.*;\n\n/**\n * Instrumentation test, which will execute on an Android device.\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\n@RunWith(AndroidJUnit4.class)\npublic class ExampleInstrumentedTest {\n    @Test\n    public void useAppContext() throws Exception {\n        // Context of the app under test.\n        Context appContext = InstrumentationRegistry.getTargetContext();\n\n        assertEquals(\"com.easysidebar\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.demo\">\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n        <activity android:name=\"com.demo.MainActivity\">\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    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/java/com/demo/MainActivity.java",
    "content": "package com.demo;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.support.v7.app.AppCompatActivity;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.Toast;\n\nimport com.esaysidebar.EasySideBarBuilder;\n\nimport java.util.ArrayList;\n\npublic class MainActivity extends AppCompatActivity {\n\n    private final String[] mIndexItems = {\"定位\",\"热门\"};//头部额外的索引\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        initView();\n\n    }\n\n    private void initView() {\n        Button btn_sure = (Button)findViewById(R.id.btn_sure);\n        btn_sure.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n\n                ArrayList<String> hotCityList = new ArrayList<>();\n                hotCityList.add(\"北京\");\n                hotCityList.add(\"上海\");\n                hotCityList.add(\"广州\");\n                hotCityList.add(\"深圳\");\n                hotCityList.add(\"杭州\");\n                hotCityList.add(\"成都\");\n                hotCityList.add(\"厦门\");\n                hotCityList.add(\"天津\");\n                hotCityList.add(\"武汉\");\n                hotCityList.add(\"长沙\");\n\n                new EasySideBarBuilder(MainActivity.this)\n                        .setTitle(\"城市选择\")\n                        /*.setIndexColor(Color.BLUE)*/\n                        .setIndexColor(0xFF0095EE)\n                       /* .isLazyRespond(true) //懒加载模式*/\n                        .setHotCityList(hotCityList)//热门城市列表\n                        .setIndexItems(mIndexItems)//索引字母\n                        .setLocationCity(\"广州\")//定位城市\n                        .setMaxOffset(60)//索引的最大偏移量\n                        .start();\n\n            }\n        });\n    }\n\n    //数据回调\n    @Override\n    protected void onActivityResult(int requestCode, int resultCode, Intent data) {\n        switch (requestCode) {\n            case EasySideBarBuilder.CODE_SIDEREQUEST:\n             if (data!=null){\n                 String city = data.getStringExtra(\"selected\");\n                 Toast.makeText(this,\"选择的城市：\"+city,Toast.LENGTH_SHORT).show();\n             }\n                break;\n\n            default:\n                break;\n        }\n\n        }\n\n}"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/activity_main\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\">\n\n\n\n    <Button\n        android:id=\"@+id/btn_sure\"\n        android:text=\"打开选择页面\"\n        android:padding=\"10dp\"\n        android:layout_centerInParent=\"true\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\" />\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#3F51B5</color>\n    <color name=\"colorPrimaryDark\">#303F9F</color>\n    <color name=\"colorAccent\">#FF4081</color>\n</resources>\n"
  },
  {
    "path": "app/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": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">EasySideBar</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/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": "app/src/test/java/com/demo/ExampleUnitTest.java",
    "content": "package com.demo;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\npublic class ExampleUnitTest {\n    @Test\n    public void addition_isCorrect() throws Exception {\n        assertEquals(4, 2 + 2);\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    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:2.2.3'\n        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:2.2.3'\n        classpath 'com.novoda:bintray-release:0.4.0'\n    }\n}\n\nallprojects {\n    repositories {\n        jcenter()\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "easysidebar/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "easysidebar/build.gradle",
    "content": "apply plugin: 'com.android.library'\napply plugin: 'com.github.dcendents.android-maven'\napply plugin: 'com.novoda.bintray-release'//添加插件\n\n\n\nandroid {\n    compileSdkVersion 25\n    buildToolsVersion \"25.0.2\"\n\n    defaultConfig {\n        minSdkVersion 9\n        targetSdkVersion 25\n        versionCode 1\n        versionName \"1.0.1\"\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\nallprojects {\n    tasks.withType(Javadoc) {//兼容中文字符\n        options{\n            encoding \"UTF-8\"\n            charSet 'UTF-8'\n            links \"http://docs.oracle.com/javase/7/docs/api\"\n        }\n    }\n}\npublish {\n    userOrg = 'contrarywind'//bintray.com 用户名/组织名 user/org name\n    groupId = 'com.contrarywind'//JCenter上显示的路径 path\n    artifactId = 'EasySideBar'//项目名称 project name\n    publishVersion = '1.0.1'//版本号 version code\n    desc = 'this is a sidebar for android'//项目描述 description\n    website = 'https://github.com/Bigkoo/EasySideBar' //项目网址链接 link\n}\n\ndependencies {\n    compile fileTree(include: ['*.jar'], dir: 'libs')\n    testCompile 'junit:junit:4.12'\n}"
  },
  {
    "path": "easysidebar/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 F:\\Android-studio\\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": "easysidebar/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" package=\"com.esaysidebar\">\n\n    <application android:allowBackup=\"true\" android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\">\n\n        <activity android:name=\"com.esaysidebar.activity.SortCityActivity\"\n            android:windowSoftInputMode = \"adjustPan\"/>\n\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "easysidebar/src/main/java/com/esaysidebar/EasySideBarBuilder.java",
    "content": "package com.esaysidebar;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\n\nimport com.esaysidebar.activity.SortCityActivity;\n\nimport java.util.ArrayList;\n\n/**\n * TODO<建造器>\n *\n * @author: 小嵩\n * @date: 2017/3/9 12:24\n */\n\npublic class EasySideBarBuilder {\n\n    private Context mContext;\n    public static final int CODE_SIDEREQUEST = 0x00000011; // ActivityForResult回调值\n    private String mtitleText;\n    private boolean isLazyRespond;\n    private  String[] indexItems;\n    private String LocationCity;\n    private int indexColor= 0xFF666666;//默认索引文字颜色\n    private int maxOffset = 80;\n\n    private ArrayList<String> HotCityList;//热门城市列表\n\n    public EasySideBarBuilder(Context context) {\n        this.mContext = context;\n    }\n\n    public EasySideBarBuilder setTitle(String titleText){\n        this.mtitleText = titleText;\n        return this;\n    }\n    public EasySideBarBuilder isLazyRespond(boolean isLazyRespond){\n        this.isLazyRespond = isLazyRespond;\n        return this;\n    }\n    public EasySideBarBuilder setIndexItems(String[] indexItems){\n        this.indexItems = indexItems;\n        return this;\n    }\n    public EasySideBarBuilder setLocationCity(String LocationCity){\n        this.LocationCity = LocationCity;\n        return this;\n    }\n    public EasySideBarBuilder setIndexColor(int indexColor){\n        this.indexColor = indexColor;\n        return this;\n    }\n    public EasySideBarBuilder setMaxOffset(int maxOffset){\n        this.maxOffset = maxOffset;\n        return this;\n    }\n    public EasySideBarBuilder setHotCityList(ArrayList<String> HotCityList){\n        this.HotCityList = HotCityList;\n        return this;\n    }\n\n    public void start(){\n        Activity activity = (Activity) mContext;\n        Intent intent = new Intent(mContext, SortCityActivity.class);\n        intent.putExtra(\"titleText\",mtitleText);\n        intent.putExtra(\"isLazyRespond\",isLazyRespond);\n        intent.putExtra(\"indexItems\",indexItems);\n        intent.putExtra(\"LocationCity\",LocationCity);\n        intent.putExtra(\"indexColor\",indexColor);\n        intent.putExtra(\"maxOffset\",maxOffset);\n        intent.putStringArrayListExtra(\"HotCityList\",HotCityList);\n\n        activity.startActivityForResult(intent,CODE_SIDEREQUEST);\n    }\n}\n"
  },
  {
    "path": "easysidebar/src/main/java/com/esaysidebar/activity/GridCityAdapter.java",
    "content": "package com.esaysidebar.activity;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ArrayAdapter;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\n\nimport com.esaysidebar.R;\n\nimport java.util.List;\n\n\n/**\n * @TODO<按字母排序的选择页面- 热门城市列表适配器>\n * @author 小嵩\n * @date 2016-8-12 11:24:12\n */\npublic class GridCityAdapter extends ArrayAdapter<String> {\n    /**\n     * 需要渲染的item布局文件\n     */\n    private int resource;\n\n    public GridCityAdapter(Context context, int textViewResourceId, List<String> objects) {\n        super(context, textViewResourceId, objects);\n        resource = textViewResourceId;\n    }\n\n    @Override\n    public View getView(int position, View convertView, ViewGroup parent) {\n        LinearLayout layout = null;\n        if (convertView == null) {\n            layout = (LinearLayout) LayoutInflater.from(getContext()).inflate(resource, null);\n        } else {\n            layout = (LinearLayout) convertView;\n        }\n        TextView name = (TextView) layout.findViewById(R.id.tv_city);\n        name.setText(getItem(position));\n        return layout;\n    }\n}\n"
  },
  {
    "path": "easysidebar/src/main/java/com/esaysidebar/activity/MyGridView.java",
    "content": "package com.esaysidebar.activity;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.widget.GridView;\n\n/**\n * 自定义GridView，解决ScrollView嵌套Grideview只显示一行半\n */\npublic class MyGridView extends GridView {\n\n\tpublic MyGridView(Context context, AttributeSet attrs, int defStyle) {\n\t\tsuper(context, attrs, defStyle);\n\t}\n\n\tpublic MyGridView(Context context, AttributeSet attrs) {\n\t\tsuper(context, attrs);\n\t}\n\n\tpublic MyGridView(Context context) {\n\t\tsuper(context);\n\t}\n\n\t/**\n\t * 其中onMeasure函数决定了组件显示的高度与宽度；\n\t * makeMeasureSpec函数中第一个函数决定布局空间的大小，第二个参数是布局模式\n\t * MeasureSpec.AT_MOST的意思就是子控件需要多大的控件就扩展到多大的空间\n\t */\n\t@Override\n\tprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n\n\t\tint expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,\n\t\t\t\tMeasureSpec.AT_MOST);\n\t\tsuper.onMeasure(widthMeasureSpec, expandSpec);\n\t}\n\n}\n"
  },
  {
    "path": "easysidebar/src/main/java/com/esaysidebar/activity/SortAdapter.java",
    "content": "package com.esaysidebar.activity;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.BaseAdapter;\nimport android.widget.TextView;\n\nimport com.esaysidebar.R;\nimport com.esaysidebar.bean.CitySortModel;\n\nimport java.util.List;\n\n\npublic class SortAdapter extends BaseAdapter  {\n    private List<CitySortModel> list = null;\n    private Context mContext;\n\n    public SortAdapter(Context mContext, List<CitySortModel> list) {\n        this.mContext = mContext;\n        this.list = list;\n    }\n\n    /**\n     * 当ListView数据发生变化时,调用此方法来更新ListView\n     *\n     * @param list\n     */\n    public void updateListView(List<CitySortModel> list) {\n        this.list = list;\n        notifyDataSetChanged();\n    }\n\n    public int getCount() {\n        return this.list.size();\n    }\n\n    public Object getItem(int position) {\n        return list.get(position);\n    }\n\n    public long getItemId(int position) {\n        return position;\n    }\n\n    public View getView(final int position, View view, ViewGroup arg2) {\n        ViewHolder viewHolder = null;\n        final CitySortModel mContent = list.get(position);\n        if (view == null) {\n            viewHolder = new ViewHolder();\n            view = LayoutInflater.from(mContext).inflate(R.layout.item_select_city, null);\n            viewHolder.tvTitle = (TextView) view.findViewById(R.id.tv_city_name);\n            view.setTag(viewHolder);\n            viewHolder.tvLetter = (TextView) view.findViewById(R.id.tv_catagory);\n        } else {\n            viewHolder = (ViewHolder) view.getTag();\n        }\n\n        int section = getSectionForPosition(position);\n\n        if (position == getPositionForSection(section)) {\n            viewHolder.tvLetter.setVisibility(View.VISIBLE);\n            viewHolder.tvLetter.setText(mContent.getSortLetters());\n        } else {\n            viewHolder.tvLetter.setVisibility(View.GONE);\n        }\n\n        viewHolder.tvTitle.setText(this.list.get(position).getName());\n\n        return view;\n\n    }\n\n\n    final static class ViewHolder {\n        TextView tvLetter;\n        TextView tvTitle;\n    }\n\n    public int getSectionForPosition(int position) {\n        return list.get(position).getSortLetters().charAt(0);\n    }\n\n    public int getPositionForSection(int section) {\n        for (int i = 0; i < getCount(); i++) {\n            String sortStr = list.get(i).getSortLetters();\n            char firstChar = sortStr.toUpperCase().charAt(0);\n            if (firstChar == section) {\n                return i;\n            }\n        }\n        return -1;\n    }\n\n\n}"
  },
  {
    "path": "easysidebar/src/main/java/com/esaysidebar/activity/SortCityActivity.java",
    "content": "package com.esaysidebar.activity;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.text.Editable;\nimport android.text.TextUtils;\nimport android.text.TextWatcher;\nimport android.view.View;\nimport android.widget.AdapterView;\nimport android.widget.EditText;\nimport android.widget.GridView;\nimport android.widget.ImageView;\nimport android.widget.ListView;\nimport android.widget.TextView;\n\nimport com.esaysidebar.EasySideBarBuilder;\nimport com.esaysidebar.R;\nimport com.esaysidebar.bean.CitySortModel;\nimport com.esaysidebar.lib.EasySideBar;\nimport com.esaysidebar.utils.PinyinComparator;\nimport com.esaysidebar.utils.PinyinUtils;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.List;\n\npublic class SortCityActivity extends Activity {\n    private ListView sortListView;\n    private EasySideBar sideBar;\n    private TextView mTvTitle;\n    private TextView mTvLoaction,tv_label_location,tv_label_hot;\n    private ImageView iv_back;\n    private SortAdapter adapter;\n    private GridCityAdapter cityAdapter;//热门城市的适配器\n    private EditText mEtCityName;\n    private List<CitySortModel> SourceDateList;//内容数据源\n\n    private List<String> HotCityList;//热门城市列表\n    private String titleText;//标题\n    private boolean isLazyRespond;//是否为懒加载\n    private String[] indexItems;//头部的索引值\n    private String LocationCity;//定位城市\n    private int indexColor;//索引文字颜色\n    private int maxOffset;//滑动特效 最大偏移量\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_sort_city);\n\n        titleText = getIntent().getExtras().getString(\"titleText\");\n        isLazyRespond = getIntent().getExtras().getBoolean(\"isLazyRespond\");\n        indexItems =  getIntent().getExtras().getStringArray(\"indexItems\");\n        LocationCity = getIntent().getExtras().getString(\"LocationCity\");\n        HotCityList = getIntent().getStringArrayListExtra(\"HotCityList\");\n        if (HotCityList==null){\n             HotCityList = new ArrayList<>();\n        }\n        indexColor = getIntent().getIntExtra(\"indexColor\",0xFF666666);//索引颜色\n        maxOffset = getIntent().getIntExtra(\"maxOffset\",80);\n\n        initViews();\n    }\n\n    private void initViews() {\n        mEtCityName = (EditText) findViewById(R.id.et_search);\n        sideBar = (EasySideBar) findViewById(R.id.sidebar);\n        mTvTitle = (TextView) findViewById(R.id.tv_title);\n        sortListView = (ListView) findViewById(R.id.country_lvcountry);\n        iv_back = (ImageView) findViewById(R.id.iv_back);\n\n        sortListView.addHeaderView(initLocationHeadView());\n        sortListView.addHeaderView(initHotHeadView());\n        initSideBar();\n        initEvents();\n        setAdapter();\n    }\n\n\n\n    private void setAdapter() {\n\n        SourceDateList = filledData(getResources().getStringArray(R.array.provinces));\n        Collections.sort(SourceDateList, new PinyinComparator());\n        adapter = new SortAdapter(this, SourceDateList);\n        sortListView.setAdapter(adapter);\n    }\n\n    private void initEvents() {\n\n        //设置右侧触摸监听, （此处还需要优化）\n        sideBar.setOnSelectIndexItemListener(new EasySideBar.OnSelectIndexItemListener() {\n            @Override\n            public void onSelectIndexItem(int index, String value) {\n                //该字母首次出现的位置\n                int position = adapter.getPositionForSection(value.charAt(0));\n\n                if (position != -1) {\n                    sortListView.setSelection(position + sortListView.getHeaderViewsCount());\n                }else {//未匹配到索引内容\n\n                    for (int i= 0; i<indexItems.length;i++){//匹配头部索引\n                        if (value.equals(indexItems[i])){\n                            sortListView.setSelection(i);\n                        }\n                    }\n\n                }\n            }\n        });\n\n        //ListView的点击事件\n        sortListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {\n\n            @Override\n            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {\n\n                String city = ((CitySortModel) adapter.getItem(position - 1)).getName();\n                SentDataForResult(city);\n            }\n        });\n\n        //根据输入框输入值的改变来过滤搜索\n        mEtCityName.addTextChangedListener(new TextWatcher() {\n            @Override\n            public void beforeTextChanged(CharSequence s, int start, int count, int after) {\n\n            }\n\n            @Override\n            public void onTextChanged(CharSequence s, int start, int before, int count) {\n                //当输入框里面的值为空，更新为原来的列表，否则为过滤数据列表\n                filterData(s.toString());\n            }\n\n            @Override\n            public void afterTextChanged(Editable s) {\n\n            }\n        });\n\n        iv_back.setOnClickListener(new View.OnClickListener() {//点击 finish 掉页面\n            @Override\n            public void onClick(View v) {\n                SortCityActivity.this.finish();\n            }\n        });\n    }\n\n    private void initSideBar() {//初始化sidebar\n\n        //标题栏初始化\n        if (!TextUtils.isEmpty(titleText)){\n            mTvTitle.setVisibility(View.VISIBLE);\n            mTvTitle.setText(titleText);\n        }else {\n            mTvTitle.setVisibility(View.GONE);\n        }\n\n        sideBar.setLazyRespond(isLazyRespond);\n        sideBar.setTextColor(indexColor);\n        sideBar.setMaxOffset(maxOffset);\n    }\n\n    private View initHotHeadView() {\n\n        View headView = getLayoutInflater().inflate(R.layout.headview_hotcity, null);\n        GridView mGvCity = (GridView) headView.findViewById(R.id.gv_hot_city);\n       /* mTvLoaction =(TextView) headView.findViewById(R.id.tv_location_city);\n        tv_label_location =(TextView) headView.findViewById(R.id.tv_label_location);*/\n        tv_label_hot =(TextView) headView.findViewById(R.id.tv_label_hot);\n\n        if (HotCityList.size()<=0){//热门城市\n            tv_label_hot.setVisibility(View.GONE);\n        }else {\n            tv_label_hot.setVisibility(View.VISIBLE);\n        }\n\n       /* if (TextUtils.isEmpty(LocationCity)){//定位城市\n            mTvLoaction.setVisibility(View.GONE);\n            tv_label_location.setVisibility(View.GONE);\n        } else {\n            tv_label_location.setVisibility(View.VISIBLE);\n            mTvLoaction.setVisibility(View.VISIBLE);\n            mTvLoaction.setText(LocationCity);//设置定位城市\n\n            mTvLoaction.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n\n                    SentDataForResult(LocationCity);\n                }\n            });\n        }*/\n\n\n        cityAdapter = new GridCityAdapter(this, R.layout.gridview_item, HotCityList);\n        mGvCity.setAdapter(cityAdapter);\n        mGvCity.setOnItemClickListener(new AdapterView.OnItemClickListener() {\n            @Override\n            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {\n              //选中的 Gird city\n                SentDataForResult(HotCityList.get(i));\n\n            }\n        });\n\n        return headView;\n    }\n\n    private View initLocationHeadView() {\n        View headView = getLayoutInflater().inflate(R.layout.headview_loaction, null);\n\n        mTvLoaction =(TextView) headView.findViewById(R.id.tv_location_city);\n        tv_label_location =(TextView) headView.findViewById(R.id.tv_label_location);\n\n        if (TextUtils.isEmpty(LocationCity)){//定位城市\n            mTvLoaction.setVisibility(View.GONE);\n            tv_label_location.setVisibility(View.GONE);\n        } else {\n            tv_label_location.setVisibility(View.VISIBLE);\n            mTvLoaction.setVisibility(View.VISIBLE);\n            mTvLoaction.setText(LocationCity);//设置定位城市\n\n            mTvLoaction.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View v) {\n                    SentDataForResult(LocationCity);\n                }\n            });\n        }\n        return headView;\n    }\n\n    private void SentDataForResult(String city) {\n        Intent mIntent = new Intent();\n        mIntent.putExtra(\"selected\", city);\n        SortCityActivity.this.setResult(EasySideBarBuilder.CODE_SIDEREQUEST, mIntent);\n        SortCityActivity.this.finish();\n    }\n\n\n    /**\n     * 根据输入框中的值来过滤数据并更新ListView\n     *\n     * @param filterStr\n     */\n    private void filterData(String filterStr) {\n        List<CitySortModel> mSortList = new ArrayList<>();\n        if (TextUtils.isEmpty(filterStr)) {\n            mSortList = SourceDateList;\n        } else {\n            mSortList.clear();\n            for (CitySortModel sortModel : SourceDateList) {\n                String name = sortModel.getName();\n               /* name.toUpperCase().indexOf(filterStr.toString().toUpperCase()) != -1*/\n                if (name.toUpperCase().contains(filterStr.toString().toUpperCase()) || PinyinUtils.getPingYin(name).toUpperCase().startsWith(filterStr.toString().toUpperCase())) {\n                    mSortList.add(sortModel);\n                }\n            }\n        }\n        // 根据a-z进行排序\n        Collections.sort(mSortList, new PinyinComparator());\n        adapter.updateListView(mSortList);\n    }\n\n    private List<CitySortModel> filledData(String[] date) {//获取数据，并根据拼音分类,添加index\n        List<CitySortModel> mSortList = new ArrayList<>();\n        ArrayList<String> indexString = new ArrayList<>();//索引字母数组\n        boolean isGarbled = false;\n\n        for (int i = 0; i < date.length; i++) {\n            CitySortModel sortModel = new CitySortModel();\n            sortModel.setName(date[i]);\n            String pinyin = PinyinUtils.getPingYin(date[i]);\n            String sortString = pinyin.substring(0, 1).toUpperCase();\n            if (sortString.matches(\"[A-Z]\")) {\n                sortModel.setSortLetters(sortString.toUpperCase());\n                if (!indexString.contains(sortString)) {\n                    indexString.add(sortString);\n                }\n            }else{\n                sortModel.setSortLetters(\"#\");\n                isGarbled = true;\n            }\n            mSortList.add(sortModel);\n        }\n        Collections.sort(indexString);\n        if (isGarbled){//出现乱码，将其添加到索引\n            indexString.add(\"#\");\n        }\n\n        String[] IndexList = Concat(indexItems,indexString.toArray(new String[indexString.size()]));\n        sideBar.setIndexItems(IndexList); //只显示有内容部分的字母index\n\n        return mSortList;\n    }\n\n    private String[] Concat(String[] a,String[] b) {//合并两个数组\n\n        String[] mIndexItems = new String[a.length + b.length];\n\n        System.arraycopy(a, 0, mIndexItems, 0, a.length);\n        System.arraycopy(b, 0, mIndexItems, a.length, b.length);\n\n        return mIndexItems;\n    }\n\n\n}\n"
  },
  {
    "path": "easysidebar/src/main/java/com/esaysidebar/bean/CitySortModel.java",
    "content": "package com.esaysidebar.bean;\n\npublic class CitySortModel {\n\n    private String name;//显示的数据\n    private String sortLetters;//显示数据拼音的首字母\n\n    public String getName() {\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n\n    public String getSortLetters() {\n        return sortLetters;\n    }\n\n    public void setSortLetters(String sortLetters) {\n        this.sortLetters = sortLetters;\n    }\n}\n"
  },
  {
    "path": "easysidebar/src/main/java/com/esaysidebar/lib/EasySideBar.java",
    "content": "package com.esaysidebar.lib;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.Paint;\nimport android.graphics.RectF;\nimport android.util.AttributeSet;\nimport android.util.DisplayMetrics;\nimport android.util.TypedValue;\nimport android.view.MotionEvent;\nimport android.view.View;\n\nimport static android.R.attr.width;\n\n/**\n * @TODO<WaveSideBar>\n * @author 小嵩\n * @date 2017-3-9 10:37:24\n */\npublic class EasySideBar extends View {\n    private final static int DEFAULT_TEXT_SIZE = 14; // sp\n    private final static int DEFAULT_MAX_OFFSET = 80; //dp\n\n    private final static String[] DEFAULT_INDEX_ITEMS = {\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\",\n            \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\", \"#\"};\n\n    private String[] mIndexItems;\n\n    /**\n     * the index in {@link #mIndexItems} of the current selected index item,\n     * it's reset to -1 when the finger up\n     */\n    private int mCurrentIndex = -1;\n\n    /**\n     * Y coordinate of the point where finger is touching,\n     * the baseline is top of {@link #mStartTouchingArea}\n     * it's reset to -1 when the finger up\n     */\n    private float mCurrentY = -1;\n\n    private Paint mPaint;\n    private int mTextColor;\n    private float mTextSize;\n    private int MaxHeight;\n    private int MaxWidth;\n    /**\n     * the Height of each index item\n     */\n    private float mIndexItemHeight;\n\n    /**\n     * offset of the current selected index item\n     */\n    private float mMaxOffset;\n\n    /**\n     * {@link #mStartTouching} will be set to true when {@link MotionEvent#ACTION_DOWN}\n     * happens in this area, and the side bar should start working.\n     */\n    private RectF mStartTouchingArea = new RectF();\n\n    /**\n     * Height and width of {@link #mStartTouchingArea}\n     */\n    private float mBarHeight;\n    private float mBarWidth;\n\n    /**\n     * Flag that the finger is starting touching.\n     * If true, it means the {@link MotionEvent#ACTION_DOWN} happened but\n     * {@link MotionEvent#ACTION_UP} not yet.\n     */\n    private boolean mStartTouching = false;\n\n    /**\n     * if true, the {@link OnSelectIndexItemListener#onSelectIndexItem(int,String)}\n     * will not be called until the finger up.\n     * if false, it will be called when the finger down, up and move.\n     */\n    private boolean mLazyRespond = false;\n\n    /**\n     * the position of the side bar, default is {@link #POSITION_RIGHT}.\n     * You can set it to {@link #POSITION_LEFT} for people who use phone with left hand.\n     */\n    private int mSideBarPosition;\n    public static final int POSITION_RIGHT = 0;\n    public static final int POSITION_LEFT = 1;\n\n    /**\n     * the alignment of items, default is {@link #TEXT_ALIGN_CENTER}.\n     */\n    private int mTextAlignment;\n    public static final int TEXT_ALIGN_CENTER = 0;\n    public static final int TEXT_ALIGN_LEFT = 1;\n    public static final int TEXT_ALIGN_RIGHT = 2;\n\n\n    /**\n     * observe the current selected index item\n     */\n    private OnSelectIndexItemListener onSelectIndexItemListener;\n\n    /**\n     * the baseline of the first index item text to draw\n     */\n    private float mFirstItemBaseLineY;\n\n    /**\n     * for {@link #dp2px(int)} and {@link #sp2px(int)}\n     */\n    private DisplayMetrics mDisplayMetrics;\n\n\n    public EasySideBar(Context context) {\n        this(context, null);\n    }\n\n    public EasySideBar(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public EasySideBar(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        mDisplayMetrics = context.getResources().getDisplayMetrics();\n\n        mTextColor = Color.GRAY;\n        mMaxOffset = dp2px(DEFAULT_MAX_OFFSET);\n        mSideBarPosition = POSITION_RIGHT;\n        mTextAlignment = TEXT_ALIGN_CENTER;\n\n        /*TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.WaveSideBar);\n        mLazyRespond = typedArray.getBoolean(R.styleable.WaveSideBar_sidebar_lazy_respond, false);\n        mTextColor = typedArray.getColor(R.styleable.WaveSideBar_sidebar_text_color, Color.GRAY);\n        mMaxOffset = typedArray.getDimension(R.styleable.WaveSideBar_sidebar_max_offset, dp2px(DEFAULT_MAX_OFFSET));\n        mSideBarPosition = typedArray.getInt(R.styleable.WaveSideBar_sidebar_position, POSITION_RIGHT);\n        mTextAlignment = typedArray.getInt(R.styleable.WaveSideBar_sidebar_text_alignment, TEXT_ALIGN_CENTER);\n        typedArray.recycle();*/\n\n        mTextSize = sp2px(DEFAULT_TEXT_SIZE);\n\n        mIndexItems = DEFAULT_INDEX_ITEMS;\n\n        initPaint();\n    }\n\n    private void initPaint() {\n        mPaint = new Paint();\n        mPaint.setAntiAlias(true);\n        mPaint.setColor(mTextColor);\n        mPaint.setTextSize(mTextSize);\n        switch (mTextAlignment) {\n            case TEXT_ALIGN_CENTER: mPaint.setTextAlign(Paint.Align.CENTER); break;\n            case TEXT_ALIGN_LEFT:   mPaint.setTextAlign(Paint.Align.LEFT); break;\n            case TEXT_ALIGN_RIGHT:  mPaint.setTextAlign(Paint.Align.RIGHT); break;\n        }\n    }\n\n    @Override\n    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {\n        super.onMeasure(widthMeasureSpec, heightMeasureSpec);\n\n         MaxHeight = MeasureSpec.getSize(heightMeasureSpec);\n         MaxWidth = MeasureSpec.getSize(widthMeasureSpec);\n\n\n        Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();\n        mIndexItemHeight = fontMetrics.bottom - fontMetrics.top;\n        mBarHeight = mIndexItems.length * mIndexItemHeight;\n\n        while (mBarHeight >= MaxHeight){\n            mTextSize--;\n            mPaint.setTextSize(mTextSize);\n\n            fontMetrics = mPaint.getFontMetrics();\n            mIndexItemHeight = fontMetrics.bottom - fontMetrics.top;\n            mBarHeight = mIndexItems.length * mIndexItemHeight;\n        }\n\n\n        // calculate the width of the longest text as the width of side bar\n        for (String indexItem : mIndexItems) {\n            mBarWidth = Math.max(mBarWidth, mPaint.measureText(indexItem));\n        }\n\n        float areaLeft = (mSideBarPosition == POSITION_LEFT) ? 0 : (MaxWidth - mBarWidth - getPaddingRight());\n        float areaRight = (mSideBarPosition == POSITION_LEFT) ? (getPaddingLeft() + areaLeft + mBarWidth) : width;\n        float areaTop = MaxHeight /2 - mBarHeight/2;\n        float areaBottom = areaTop + mBarHeight;\n        mStartTouchingArea.set(\n                areaLeft,\n                areaTop,\n                areaRight,\n                areaBottom);\n\n        // the baseline Y of the first item' text to draw\n        mFirstItemBaseLineY = (MaxHeight /2 - mIndexItems.length*mIndexItemHeight/2)\n                + (mIndexItemHeight/2 - (fontMetrics.descent-fontMetrics.ascent)/2)\n                - fontMetrics.ascent;\n    }\n\n\n\n    @Override\n    protected void onDraw(Canvas canvas) {\n        super.onDraw(canvas);\n        // draw each item\n        for (int i = 0; i < mIndexItems.length; i++) {\n            float baseLineY = mFirstItemBaseLineY + mIndexItemHeight*i;\n\n            // calculate the scale factor of the item to draw\n            float scale = getItemScale(i);\n\n            int alphaScale = (i == mCurrentIndex) ? (255) : (int) (255 * (1-scale));\n            mPaint.setAlpha(alphaScale);\n\n            mPaint.setTextSize(mTextSize + mTextSize*scale);\n\n            float baseLineX = 0f;\n            if (mSideBarPosition == POSITION_LEFT) {\n                switch (mTextAlignment) {\n                    case TEXT_ALIGN_CENTER:\n                        baseLineX = getPaddingLeft() + mBarWidth/2 + mMaxOffset*scale;\n                        break;\n                    case TEXT_ALIGN_LEFT:\n                        baseLineX = getPaddingLeft() + mMaxOffset*scale;\n                        break;\n                    case TEXT_ALIGN_RIGHT:\n                        baseLineX = getPaddingLeft() + mBarWidth + mMaxOffset*scale;\n                        break;\n                }\n            } else {\n                switch (mTextAlignment) {\n                    case TEXT_ALIGN_CENTER:\n                        baseLineX = getWidth() - getPaddingRight() - mBarWidth/2 - mMaxOffset*scale;\n                        break;\n                    case TEXT_ALIGN_RIGHT:\n                        baseLineX = getWidth() - getPaddingRight() - mMaxOffset*scale;\n                        break;\n                    case TEXT_ALIGN_LEFT:\n                        baseLineX = getWidth() - getPaddingRight() - mBarWidth - mMaxOffset*scale;\n                        break;\n                }\n            }\n\n            // draw\n            canvas.drawText(\n                    mIndexItems[i], //item text to draw\n                    baseLineX, //baseLine X\n                    baseLineY, // baseLine Y\n                    mPaint);\n        }\n\n        // reset paint\n        mPaint.setAlpha(255);\n        mPaint.setTextSize(mTextSize);\n    }\n\n    /**\n     * calculate the scale factor of the item to draw\n     *\n     * @param index the index of the item in array {@link #mIndexItems}\n     * @return the scale factor of the item to draw\n     */\n    private float getItemScale(int index) {\n        float scale = 0;\n        if (mCurrentIndex != -1) {\n            float distance = Math.abs(mCurrentY - (mIndexItemHeight*index+mIndexItemHeight/2)) / mIndexItemHeight;\n            scale = 1 - distance*distance/16;\n            scale = Math.max(scale, 0);\n        }\n        return scale;\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n        if (mIndexItems.length == 0) {\n            return super.onTouchEvent(event);\n        }\n\n        float eventY = event.getY();\n        float eventX = event.getX();\n        mCurrentIndex = getSelectedIndex(eventY);\n\n        switch (event.getAction()) {\n            case MotionEvent.ACTION_DOWN:\n                if (mStartTouchingArea.contains(eventX, eventY)) {\n                    mStartTouching = true;\n                    if (!mLazyRespond && onSelectIndexItemListener != null) {\n                        onSelectIndexItemListener.onSelectIndexItem(mCurrentIndex,mIndexItems[mCurrentIndex]);\n                    }\n                    invalidate();\n                    return true;\n                } else {\n                    mCurrentIndex = -1;\n                    return false;\n                }\n\n            case MotionEvent.ACTION_MOVE:\n                if (mStartTouching && !mLazyRespond && onSelectIndexItemListener != null) {\n                    onSelectIndexItemListener.onSelectIndexItem(mCurrentIndex,mIndexItems[mCurrentIndex]);\n                }\n                invalidate();\n                return true;\n\n            case MotionEvent.ACTION_UP:\n            case MotionEvent.ACTION_CANCEL:\n                if (mLazyRespond && onSelectIndexItemListener != null) {\n                    onSelectIndexItemListener.onSelectIndexItem(mCurrentIndex,mIndexItems[mCurrentIndex]);\n                }\n                mCurrentIndex = -1;\n                mStartTouching = false;\n                invalidate();\n                return true;\n        }\n\n        return super.onTouchEvent(event);\n    }\n\n    private int getSelectedIndex(float eventY) {\n        mCurrentY = eventY - (getHeight()/2 - mBarHeight /2);\n        if (mCurrentY <= 0) {\n            return 0;\n        }\n\n        int index = (int) (mCurrentY / this.mIndexItemHeight);\n        if (index >= this.mIndexItems.length) {\n            index = this.mIndexItems.length - 1;\n        }\n        return index;\n    }\n\n    private float dp2px(int dp) {\n        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, this.mDisplayMetrics);\n    }\n\n    private float sp2px(int sp) {\n        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, this.mDisplayMetrics);\n    }\n\n\n\n\n\n    //Customize\n    public void setIndexItems(String[] indexItems) {\n        this.mIndexItems = indexItems;\n        requestLayout();\n    }\n\n    public void setTextColor(int color) {\n        this.mTextColor = color;\n        mPaint.setColor(color);\n            invalidate();\n    }\n\n    public void setPosition(int position) {\n        if (position != POSITION_RIGHT && position != POSITION_LEFT) {\n            throw new IllegalArgumentException(\"the position must be POSITION_RIGHT or POSITION_LEFT\");\n        }\n\n        mSideBarPosition = position;\n        requestLayout();\n    }\n\n    public void setMaxOffset(int offset) {\n        mMaxOffset = dp2px(offset);\n        invalidate();\n    }\n\n    public void setLazyRespond(boolean lazyRespond) {\n        mLazyRespond = lazyRespond;\n    }\n\n    public void setTextAlign(int align) {\n        if (mTextAlignment == align) {\n            return;\n        }\n        switch (align) {\n            case TEXT_ALIGN_CENTER: mPaint.setTextAlign(Paint.Align.CENTER); break;\n            case TEXT_ALIGN_LEFT:   mPaint.setTextAlign(Paint.Align.LEFT); break;\n            case TEXT_ALIGN_RIGHT:  mPaint.setTextAlign(Paint.Align.RIGHT); break;\n            default:\n                throw new IllegalArgumentException(\n                        \"the alignment must be TEXT_ALIGN_CENTER, TEXT_ALIGN_LEFT or TEXT_ALIGN_RIGHT\");\n        }\n        mTextAlignment = align;\n        invalidate();\n    }\n\n    public void setOnSelectIndexItemListener(OnSelectIndexItemListener onSelectIndexItemListener) {\n        this.onSelectIndexItemListener = onSelectIndexItemListener;\n    }\n\n    public interface OnSelectIndexItemListener {\n        void onSelectIndexItem(int index, String indexValue);\n    }\n}"
  },
  {
    "path": "easysidebar/src/main/java/com/esaysidebar/lib/EditTextWithDel.java",
    "content": "package com.esaysidebar.lib;\n\nimport android.content.Context;\nimport android.graphics.Rect;\nimport android.graphics.drawable.Drawable;\nimport android.text.Editable;\nimport android.text.TextWatcher;\nimport android.util.AttributeSet;\nimport android.util.Log;\nimport android.view.MotionEvent;\nimport android.widget.EditText;\n\nimport com.esaysidebar.R;\n\n\n/**\n * @author: xiaolijuan\n * @projectName: SelectCityDome\n * @date: 2016-03-01\n * @time: 15:59\n */\npublic class EditTextWithDel extends EditText {\n    private final static String TAG = \"EditTextWithDel\";\n    private Drawable imgInable;\n    private Drawable imgAble;\n    private Context mContext;\n\n    public EditTextWithDel(Context context) {\n        super(context);\n        mContext = context;\n        init();\n    }\n\n    public EditTextWithDel(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n        mContext = context;\n        init();\n    }\n\n    public EditTextWithDel(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        mContext = context;\n        init();\n    }\n\n    private void init() {\n        imgAble = mContext.getResources().getDrawable(\n                R.mipmap.icon_delete_gray);\n        addTextChangedListener(new TextWatcher() {\n            @Override\n            public void onTextChanged(CharSequence s, int start, int before, int count) {\n            }\n\n            @Override\n            public void beforeTextChanged(CharSequence s, int start, int count, int after) {\n            }\n\n            @Override\n            public void afterTextChanged(Editable s) {\n                setDrawable();\n            }\n        });\n        setDrawable();\n    }\n\n\n    private void setDrawable() {\n        if (length() < 1) {\n            setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);\n        } else {\n            setCompoundDrawablesWithIntrinsicBounds(null, null, imgAble, null);\n        }\n    }\n\n\n    @Override\n    public boolean onTouchEvent(MotionEvent event) {\n        if (imgAble != null && event.getAction() == MotionEvent.ACTION_UP) {\n            int eventX = (int) event.getRawX();\n            int eventY = (int) event.getRawY();\n            Log.e(TAG, \"eventX = \" + eventX + \"; eventY = \" + eventY);\n            Rect rect = new Rect();\n            getGlobalVisibleRect(rect);\n            rect.left = rect.right - 50;\n            if (rect.contains(eventX, eventY))\n                setText(\"\");\n        }\n        return super.onTouchEvent(event);\n    }\n\n    @Override\n    protected void finalize() throws Throwable {\n        super.finalize();\n    }\n}\n"
  },
  {
    "path": "easysidebar/src/main/java/com/esaysidebar/utils/PinyinComparator.java",
    "content": "package com.esaysidebar.utils;\n\nimport com.esaysidebar.bean.CitySortModel;\n\nimport java.util.Comparator;\n\n/**\n * 用来对ListView中的数据根据A-Z进行排序，前面两个if判断主要是将不是以汉字开头的数据放在后面\n */\npublic class PinyinComparator implements Comparator<CitySortModel> {\n\n    public int compare(CitySortModel o1, CitySortModel o2) {\n        //这里主要是用来对ListView里面的数据根据ABCDEFG...来排序\n        if (o1.getSortLetters().equals(\"@\") || o2.getSortLetters().equals(\"#\")) {\n            return -1;\n        } else if (o1.getSortLetters().equals(\"#\") || o2.getSortLetters().equals(\"@\")) {\n            return 1;\n        } else {\n            return o1.getSortLetters().compareTo(o2.getSortLetters());\n        }\n    }\n}\n"
  },
  {
    "path": "easysidebar/src/main/java/com/esaysidebar/utils/PinyinUtils.java",
    "content": "package com.esaysidebar.utils;\n\n\nimport net.sourceforge.pinyin4j.PinyinHelper;\nimport net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;\nimport net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;\nimport net.sourceforge.pinyin4j.format.HanyuPinyinToneType;\nimport net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;\nimport net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;\n\n/**\n * @author:\n * @description:\n * @projectName: SelectCityDome\n * @date: 2016-03-01\n * @time: 15:45\n */\npublic class PinyinUtils {\n    /**\n     *\n     * @param chines\n     * @return\n     */\n    public static String getAlpha(String chines) {\n        String pinyinName = \"\";\n        char[] nameChar = chines.toCharArray();\n        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();\n        defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);\n        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);\n        for (int i = 0; i < nameChar.length; i++) {\n            if (nameChar[i] > 128) {\n                try {\n                    pinyinName += PinyinHelper.toHanyuPinyinStringArray(\n                            nameChar[i], defaultFormat)[0].charAt(0);\n                } catch (BadHanyuPinyinOutputFormatCombination e) {\n                    e.printStackTrace();\n                }\n            } else {\n                pinyinName += nameChar[i];\n            }\n        }\n        return pinyinName;\n    }\n\n    /**\n     *\n     * string's chinese to pinying ,english string no change\n     *\n     * @param inputString\n     * @return\n     */\n    public static String getPingYin(String inputString) {\n        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();\n        format.setCaseType(HanyuPinyinCaseType.LOWERCASE);\n        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);\n        format.setVCharType(HanyuPinyinVCharType.WITH_V);\n        String output = \"\";\n        if (inputString != null && inputString.length() > 0\n                && !\"null\".equals(inputString)) {\n            char[] input = inputString.trim().toCharArray();\n            try {\n                for (int i = 0; i < input.length; i++) {\n                    if (Character.toString(input[i]).matches(\n                            \"[\\\\u4E00-\\\\u9FA5]+\")) {\n                        String[] temp = PinyinHelper.toHanyuPinyinStringArray(\n                                input[i], format);\n                        output += temp[0];\n                    } else\n                        output += Character.toString(input[i]);\n                }\n            } catch (BadHanyuPinyinOutputFormatCombination e) {\n                e.printStackTrace();\n            }\n        } else {\n            return \"*\";\n        }\n        return output;\n    }\n\n    /**\n     *c\n     *\n     * @param chines\n     * @return\n     */\n    public static String converterToFirstSpell(String chines) {\n        String pinyinName = \"\";\n        char[] nameChar = chines.toCharArray();\n        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();\n        defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);\n        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);\n        for (int i = 0; i < nameChar.length; i++) {\n            if (nameChar[i] > 128) {\n                try {\n                    pinyinName += PinyinHelper.toHanyuPinyinStringArray(\n                            nameChar[i], defaultFormat)[0].charAt(0);\n                } catch (BadHanyuPinyinOutputFormatCombination e) {\n                    e.printStackTrace();\n                }\n            } else {\n                pinyinName += nameChar[i];\n            }\n        }\n        return pinyinName;\n    }\n}\n"
  },
  {
    "path": "easysidebar/src/main/res/drawable/edit_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n\n    <solid android:color=\"#F0F0F0\" />\n\n    <stroke\n        android:width=\"1dp\"\n        android:color=\"#DEDEDE\" />\n</shape>"
  },
  {
    "path": "easysidebar/src/main/res/drawable/select_btn_white_gray.xml",
    "content": "<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <!--白色-蓝色 点击状态选择器-->\n    <item android:state_pressed=\"false\">\n        <shape>\n            <solid android:color=\"@color/color_background\" />\n            <corners android:radius=\"4dp\" />\n        </shape>\n    </item>\n\n    <item android:state_pressed=\"true\">\n        <shape>\n            <solid android:color=\"@color/color_background_gray\" />\n            <corners android:radius=\"4dp\" />\n            <stroke\n                android:width=\"0.8dp\"\n                android:color=\"@color/color_gray_transparent\" />\n        </shape>\n    </item>\n</selector>"
  },
  {
    "path": "easysidebar/src/main/res/drawable/selector_btn_press.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/common_gray_transparent\" android:state_pressed=\"true\"/>\n    <item android:drawable=\"@drawable/common_white\"/>\n\n</selector>"
  },
  {
    "path": "easysidebar/src/main/res/layout/activity_sort_city.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/color_background\"\n    android:orientation=\"vertical\">\n\n\n   <RelativeLayout\n       android:layout_width=\"match_parent\"\n       android:layout_height=\"46dp\"\n       android:background=\"#0088CC\">\n\n       <ImageView\n           android:id=\"@+id/iv_back\"\n           android:layout_width=\"wrap_content\"\n           android:layout_height=\"match_parent\"\n           android:src=\"@mipmap/ic_back\"\n           android:padding=\"12dp\"/>\n\n\n      <TextView\n        android:id=\"@+id/tv_title\"\n        android:text=\"标题\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:padding=\"10dp\"\n        android:textColor=\"#EEEEEE\"/>\n\n    </RelativeLayout>\n\n\n    <com.esaysidebar.lib.EditTextWithDel\n        android:id=\"@+id/et_search\"\n        android:hint=\"请输入城市名或拼音查询\"\n        android:maxLines=\"1\"\n        android:paddingLeft=\"10dp\"\n        android:textSize=\"15dp\"\n        android:textColorHint=\"@android:color/darker_gray\"\n        android:layout_marginRight=\"16dp\"\n        android:layout_marginLeft=\"16dp\"\n        android:layout_marginBottom=\"5dp\"\n        android:layout_marginTop=\"10dp\"\n        android:background=\"@drawable/edit_background\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"40dp\" />\n\n    <FrameLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <ListView\n            android:id=\"@+id/country_lvcountry\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_gravity=\"center\"\n            android:divider=\"@null\"\n            android:scrollbars=\"none\" />\n\n\n        <com.esaysidebar.lib.EasySideBar\n            android:id=\"@+id/sidebar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n    </FrameLayout>\n\n</LinearLayout>"
  },
  {
    "path": "easysidebar/src/main/res/layout/gridview_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:orientation=\"vertical\"\n    android:gravity=\"center\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n    <TextView\n        android:id=\"@+id/tv_city\"\n        android:gravity=\"center\"\n        android:background=\"@drawable/select_btn_white_gray\"\n        android:layout_width=\"match_parent\"\n        android:paddingLeft=\"4dp\"\n        android:layout_margin=\"5dp\"\n        android:paddingRight=\"4dp\"\n        android:textColor=\"#979797\"\n        android:layout_height=\"38dp\" />\n\n</LinearLayout>"
  },
  {
    "path": "easysidebar/src/main/res/layout/headview_hotcity.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=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:background=\"@color/color_background_gray\"\n    xmlns:tools=\"http://schemas.android.com/tools\">\n\n <!--   <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@+id/tv_label_location\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:gravity=\"center_vertical\"\n            android:layout_margin=\"10dp\"\n            android:text=\"当前定位城市\"\n            android:textColor=\"@android:color/darker_gray\"\n            android:textSize=\"14sp\" />\n\n        <TextView\n            android:id=\"@+id/tv_location_city\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"广州\"\n            android:textSize=\"14dp\"\n            android:layout_marginLeft=\"10dp\"\n            android:gravity=\"center\"\n            android:drawableLeft=\"@mipmap/ic_location\"\n            android:drawablePadding=\"4dp\"\n            android:layout_marginBottom=\"10dp\"\n            android:padding=\"10dp\"\n            android:background=\"@drawable/selector_btn_press\"/>\n\n    </LinearLayout>-->\n\n\n    <TextView\n        android:id=\"@+id/tv_label_hot\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"35dp\"\n        android:gravity=\"center_vertical\"\n        android:layout_marginLeft=\"16dp\"\n        android:text=\"热门城市\"\n        android:textColor=\"@android:color/darker_gray\"\n        android:textSize=\"14sp\" />\n\n    <com.esaysidebar.activity.MyGridView\n        android:id=\"@+id/gv_hot_city\"\n        android:layout_width=\"match_parent\"\n        android:layout_marginRight=\"20dp\"\n        android:layout_marginLeft=\"10dp\"\n        android:numColumns=\"3\"\n        android:horizontalSpacing=\"10dp\"\n        android:verticalSpacing=\"5dp\"\n        android:listSelector=\"@android:color/transparent\"\n        tools:listitem=\"@layout/gridview_item\"\n        android:layout_height=\"match_parent\" />\n\n    <View\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"1dp\"\n        android:layout_marginTop=\"10dp\"\n        android:layout_marginBottom=\"10dp\"\n        android:background=\"#E0E0E0\" />\n\n    <!--<TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"35dp\"\n        android:gravity=\"center_vertical\"\n        android:layout_marginLeft=\"16dp\"\n        android:text=\"主要城市\"\n        android:textColor=\"@android:color/black\"\n        android:textSize=\"14sp\" />-->\n</LinearLayout>"
  },
  {
    "path": "easysidebar/src/main/res/layout/headview_loaction.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:orientation=\"vertical\" android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/color_background_gray\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n\n        <TextView\n            android:id=\"@+id/tv_label_location\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:gravity=\"center_vertical\"\n            android:layout_margin=\"10dp\"\n            android:text=\"当前定位城市\"\n            android:textColor=\"@android:color/darker_gray\"\n            android:textSize=\"14sp\" />\n\n        <TextView\n            android:id=\"@+id/tv_location_city\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"广州\"\n            android:textSize=\"14dp\"\n            android:layout_marginLeft=\"10dp\"\n            android:gravity=\"center\"\n            android:drawableLeft=\"@mipmap/ic_location\"\n            android:drawablePadding=\"4dp\"\n            android:layout_marginBottom=\"10dp\"\n            android:padding=\"10dp\"\n            android:background=\"@drawable/selector_btn_press\"/>\n\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "easysidebar/src/main/res/layout/item_select_city.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=\"wrap_content\"\n    android:orientation=\"vertical\"\n    android:background=\"@color/color_background\">\n\n    <TextView\n        android:id=\"@+id/tv_catagory\"\n        android:layout_width=\"38dp\"\n        android:layout_height=\"38dp\"\n        android:layout_marginLeft=\"12dp\"\n        android:layout_marginTop=\"10dp\"\n        android:background=\"@drawable/edit_background\"\n        android:gravity=\"center\"\n        android:text=\"A\"\n        android:textColor=\"#7E7B80\"\n        android:textSize=\"18sp\" />\n\n    <TextView\n        android:id=\"@+id/tv_city_name\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"43dp\"\n        android:gravity=\"center_vertical\"\n        android:paddingLeft=\"16dp\"\n        android:text=\"CityName\"\n        android:textColor=\"#7E7B80\"\n        android:textSize=\"16sp\"\n        android:background=\"@drawable/selector_btn_press\"/>\n\n    <View\n        android:layout_marginRight=\"30dp\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"1px\"\n        android:layout_marginLeft=\"12dp\"\n        android:background=\"#7E7B80\" />\n</LinearLayout>"
  },
  {
    "path": "easysidebar/src/main/res/values/arrays.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<resources>\n\n\n    <string-array name=\"provinces\">\n        <item>%#S乱码</item>\n        <item>北京市</item>\n        <item>天津市</item>\n        <item>上海市</item>\n        <item>重庆市</item>\n        <item>石家庄</item>\n        <item>唐山市</item>\n        <item>秦皇岛</item>\n        <item>邯郸市</item>\n        <item>邢台市</item>\n        <item>保定市</item>\n        <item>张家口</item>\n        <item>承德市</item>\n        <item>沧州市</item>\n        <item>廊坊市</item>\n        <item>衡水市</item>\n        <item>太原市</item>\n        <item>大同市</item>\n        <item>阳泉市</item>\n        <item>长治市</item>\n        <item>晋城市</item>\n        <item>朔州市</item>\n        <item>晋中市</item>\n        <item>运城市</item>\n        <item>忻州市</item>\n        <item>临汾市</item>\n        <item>吕梁市</item>\n        <item>南京市</item>\n        <item>无锡市</item>\n        <item>徐州市</item>\n        <item>常州市</item>\n        <item>苏州市</item>\n        <item>南通市</item>\n        <item>连云港</item>\n        <item>淮安市</item>\n        <item>盐城市</item>\n        <item>扬州市</item>\n        <item>镇江市</item>\n        <item>泰州市</item>\n        <item>宿迁市</item>\n        <item>杭州市</item>\n        <item>宁波市</item>\n        <item>温州市</item>\n        <item>嘉兴市</item>\n        <item>湖州市</item>\n        <item>绍兴市</item>\n        <item>金华市</item>\n        <item>衢州市</item>\n        <item>舟山市</item>\n        <item>台州市</item>\n        <item>丽水市</item>\n        <item>合肥市</item>\n        <item>芜湖市</item>\n        <item>蚌埠市</item>\n        <item>淮南市</item>\n        <item>马鞍山</item>\n        <item>淮北市</item>\n        <item>铜陵市</item>\n        <item>安庆市</item>\n        <item>黄山市</item>\n        <item>滁州市</item>\n        <item>阜阳市</item>\n        <item>宿州市</item>\n        <item>巢湖市</item>\n        <item>六安市</item>\n        <item>毫州市</item>\n        <item>池州市</item>\n        <item>宣城市</item>\n        <item>福州市</item>\n        <item>厦门市</item>\n        <item>莆田市</item>\n        <item>三明市</item>\n        <item>泉州市</item>\n        <item>漳州市</item>\n        <item>南平市</item>\n        <item>龙岩市</item>\n        <item>宁德市</item>\n        <item>南昌市</item>\n        <item>景德镇</item>\n        <item>萍乡市</item>\n        <item>九江市</item>\n        <item>新余市</item>\n        <item>鹰潭市</item>\n        <item>赣州市</item>\n        <item>吉安市</item>\n        <item>宜春市</item>\n        <item>抚州市</item>\n        <item>上饶市</item>\n        <item>济南市</item>\n        <item>青岛市</item>\n        <item>淄博市</item>\n        <item>枣庄市</item>\n        <item>东营市</item>\n        <item>烟台市</item>\n        <item>潍坊市</item>\n        <item>济宁市</item>\n        <item>泰安市</item>\n        <item>威海市</item>\n        <item>日照市</item>\n        <item>莱芜市</item>\n        <item>临沂市</item>\n        <item>德州市</item>\n        <item>聊城市</item>\n        <item>滨州市</item>\n        <item>菏泽市</item>\n        <item>郑州市</item>\n        <item>开封市</item>\n        <item>洛阳市</item>\n        <item>平顶山</item>\n        <item>安阳市</item>\n        <item>鹤壁市</item>\n        <item>新乡市</item>\n        <item>焦作市</item>\n        <item>濮阳市</item>\n        <item>许昌市</item>\n        <item>漯河市</item>\n        <item>三门峡</item>\n        <item>南阳市</item>\n        <item>商丘市</item>\n        <item>信阳市</item>\n        <item>周口市</item>\n        <item>驻马店</item>\n        <item>武汉市</item>\n        <item>黄石市</item>\n        <item>十堰市</item>\n        <item>宜昌市</item>\n        <item>襄樊市</item>\n        <item>鄂州市</item>\n        <item>荆门市</item>\n        <item>孝感市</item>\n        <item>荆州市</item>\n        <item>黄冈市</item>\n        <item>咸宁市</item>\n        <item>随州市</item>\n        <item>神农架</item>\n        <item>恩施土家族苗族自治州</item>\n        <item>长沙市</item>\n        <item>株洲市</item>\n        <item>湘潭市</item>\n        <item>衡阳市</item>\n        <item>邵阳市</item>\n        <item>岳阳市</item>\n        <item>常德市</item>\n        <item>张家界</item>\n        <item>益阳市</item>\n        <item>永州市</item>\n        <item>怀化市</item>\n        <item>娄底市</item>\n        <item>郴州市</item>\n        <item>湘西土家族苗族自治州</item>\n        <item>广州市</item>\n        <item>韶关市</item>\n        <item>深圳市</item>\n        <item>珠海市</item>\n        <item>汕头市</item>\n        <item>佛山市</item>\n        <item>江门市</item>\n        <item>湛江市</item>\n        <item>茂名市</item>\n        <item>肇庆市</item>\n        <item>惠州市</item>\n        <item>梅州市</item>\n        <item>汕尾市</item>\n        <item>河源市</item>\n        <item>阳江市</item>\n        <item>清远市</item>\n        <item>东莞市</item>\n        <item>中山市</item>\n        <item>潮州市</item>\n        <item>揭阳市</item>\n        <item>云浮市</item>\n        <item>沈阳市</item>\n        <item>大连市</item>\n        <item>鞍山市</item>\n        <item>抚顺市</item>\n        <item>本溪市</item>\n        <item>丹东市</item>\n        <item>锦州市</item>\n        <item>营口市</item>\n        <item>阜新市</item>\n        <item>辽阳市</item>\n        <item>盘锦市</item>\n        <item>铁岭市</item>\n        <item>朝阳市</item>\n        <item>葫芦岛</item>\n        <item>长春市</item>\n        <item>吉林市</item>\n        <item>四平市</item>\n        <item>辽源市</item>\n        <item>通化市</item>\n        <item>白山市</item>\n        <item>松原市</item>\n        <item>白城市</item>\n        <item>延边朝鲜族自治区市</item>\n        <item>哈尔滨</item>\n        <item>齐齐哈尔市</item>\n        <item>鸡西市</item>\n        <item>鹤岗市</item>\n        <item>双鸭山</item>\n        <item>大庆市</item>\n        <item>伊春市</item>\n        <item>佳木斯</item>\n        <item>七台河</item>\n        <item>牡丹江</item>\n        <item>黑河市</item>\n        <item>绥化市</item>\n        <item>大兴安岭地区</item>\n        <item>南宁市</item>\n        <item>柳州市</item>\n        <item>桂林市</item>\n        <item>梧州市</item>\n        <item>北海市</item>\n        <item>防城港</item>\n        <item>钦州市</item>\n        <item>贵港市</item>\n        <item>玉林市</item>\n        <item>百色市</item>\n        <item>贺州市</item>\n        <item>河池市</item>\n        <item>来宾市</item>\n        <item>崇左市</item>\n        <item>海口市</item>\n        <item>三亚市</item>\n        <item>台北市</item>\n        <item>台南市</item>\n        <item>高雄市</item>\n        <item>成都市</item>\n        <item>自贡市</item>\n        <item>攀枝花</item>\n        <item>泸州市</item>\n        <item>德阳市</item>\n        <item>绵阳市</item>\n        <item>广元市</item>\n        <item>遂宁市</item>\n        <item>内江市</item>\n        <item>乐山市</item>\n        <item>南充市</item>\n        <item>眉山市</item>\n        <item>宜宾市</item>\n        <item>广安市</item>\n        <item>达州市</item>\n        <item>雅安市</item>\n        <item>巴中市</item>\n        <item>资阳市</item>\n        <item>阿坝藏族羌族自治州</item>\n        <item>甘孜藏族自治州</item>\n        <item>凉山彝族自治州</item>\n        <item>贵阳市</item>\n        <item>六盘水</item>\n        <item>遵义市</item>\n        <item>安顺市</item>\n        <item>铜仁地</item>\n        <item>黔西南布依族苗族自治州</item>\n        <item>毕节地</item>\n        <item>黔东南苗族侗族自治州</item>\n        <item>黔南布依族苗族自治州</item>\n        <item>昆明市</item>\n        <item>曲靖市</item>\n        <item>玉溪市</item>\n        <item>宝山市</item>\n        <item>邵通市</item>\n        <item>丽江市</item>\n        <item>思茅市</item>\n        <item>临沧市</item>\n        <item>楚雄彝族自治州</item>\n        <item>红河哈尼族彝族自治州</item>\n        <item>文山壮族苗族自治州</item>\n        <item>西双版纳傣族自治州</item>\n        <item>大理白族自治州</item>\n        <item>德宏傣族景颇族自治州</item>\n        <item>怒江傈僳族自治州</item>\n        <item>迪庆藏族自治州</item>\n        <item>拉萨市</item>\n        <item>西安市</item>\n        <item>铜川市</item>\n        <item>宝鸡市</item>\n        <item>咸阳市</item>\n        <item>渭南市</item>\n        <item>延安市</item>\n        <item>汉中市</item>\n        <item>榆林市</item>\n        <item>安康市</item>\n        <item>商洛市</item>\n        <item>兰州市</item>\n        <item>嘉峪关</item>\n        <item>金昌市</item>\n        <item>白银市</item>\n        <item>天水市</item>\n        <item>武威市</item>\n        <item>张掖市</item>\n        <item>平凉市</item>\n        <item>酒泉市</item>\n        <item>庆阳市</item>\n        <item>定西市</item>\n        <item>西宁市</item>\n        <item>海东地区</item>\n        <item>海北藏族自治州</item>\n        <item>黄南藏族自治州市</item>\n        <item>海南藏族自治州</item>\n        <item>果洛藏族自治州</item>\n        <item>玉树藏族自治州</item>\n        <item>海西蒙古族藏族自治州</item>\n        <item>银川市</item>\n        <item>石嘴山</item>\n        <item>吴忠市</item>\n        <item>固原市</item>\n        <item>中卫市</item>\n        <item>呼和浩特市</item>\n        <item>包头市</item>\n        <item>乌海市</item>\n        <item>赤峰市</item>\n        <item>通辽市</item>\n        <item>鄂尔多斯市</item>\n        <item>呼伦贝尔市</item>\n        <item>巴彦卓尔市</item>\n        <item>乌兰察布市</item>\n        <item>兴安盟</item>\n        <item>乌鲁木齐市</item>\n        <item>克拉玛依市</item>\n        <item>吐鲁番地区</item>\n        <item>哈密地区</item>\n        <item>昌吉回族自治州</item>\n        <item>博尔塔拉蒙古自治州</item>\n        <item>巴音郭楞蒙古自治州</item>\n        <item>阿克苏地区</item>\n        <item>克孜勒苏柯尔克孜自治州</item>\n        <item>喀什地区</item>\n        <item>和田地区</item>\n        <item>伊犁哈萨克自治州</item>\n        <item>塔城地区</item>\n        <item>阿勒泰地区</item>\n        <item>石河子市</item>\n        <item>阿拉尔市</item>\n        <item>香港特别行政区</item>\n        <item>澳门特别行政区</item>\n\n\n\n    </string-array>\n\n</resources>"
  },
  {
    "path": "easysidebar/src/main/res/values/color.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <!-- 公用的背景颜色 -->\n    <color name=\"color_background\">#F9F9F9</color>\n\n    <color name=\"color_background_gray\">#F0F0F0</color>\n\n    <color name=\"color_gray_transparent\">#88AAAAAA</color>\n\n    <color name=\"color_transparent\">#00000000</color>\n\n</resources>"
  },
  {
    "path": "easysidebar/src/main/res/values/drawables.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n\n    <item name=\"common_white\" type=\"drawable\">@color/color_background</item>\n    <item name=\"common_transparent\" type=\"drawable\">@color/color_transparent</item>\n    <item name=\"common_gray_transparent\" type=\"drawable\">@color/color_gray_transparent</item>\n</resources>\n"
  },
  {
    "path": "easysidebar/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">EasySideBarLibrary</string>\n</resources>\n"
  },
  {
    "path": "easysidebar/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": "easysidebar/src/test/java/com/demo/ExampleUnitTest.java",
    "content": "package com.demo;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\npublic class ExampleUnitTest {\n    @Test\n    public void addition_isCorrect() throws Exception {\n        assertEquals(4, 2 + 2);\n    }\n}"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Mon Dec 28 10:00:20 PST 2015\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-2.14.1-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\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.\norg.gradle.jvmargs=-Xmx1536m\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"
  },
  {
    "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# 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\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\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    JAVACMD=`cygpath --unix \"$JAVACMD\"`\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\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windowz variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\ngoto execute\n\n:4NT_args\n@rem Get arguments from the 4NT Shell from JP Software\nset CMD_LINE_ARGS=%$\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\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%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app', ':easysidebar'\n"
  }
]