[
  {
    "path": ".gitignore",
    "content": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.idea/misc.xml\n.idea/encodings.xml\n.idea/modules.xml\n.idea/compiler.xml\n.idea/vcs.xml\n.idea/markdown-navigator\n.idea/markdown-navigator.xml\n.DS_Store\n/build\n/captures\n.externalNativeBuild\napp/libs/\nflexbox/libs/\nflexbox/src/main/res/drawable/\n"
  },
  {
    "path": ".idea/copyright/profiles_settings.xml",
    "content": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "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$/flexbox\" />\n          </set>\n        </option>\n        <option name=\"resolveModulePerSourceSet\" value=\"false\" />\n      </GradleProjectSettings>\n    </option>\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": "README.md",
    "content": "# FlexboxUtils\nGoogle在之前发布了一个叫做FlexboxLayout的控件，完全能够适配平时我们业务中自定义的布局流控件，而且有过之而无不及。因此在这个基础上我又针对这个控件进行了进一步的封装，基本能够满足平时大部分的业务需求，先上图\n![preview](https://github.com/Kaka252/FlexboxUtils/blob/master/screenshot/device-2017-03-28-181547.png?raw=true)\n\n# 继承BaseTagView\n定义一个TagView，继承BaseTagView，由于每一个tag的数据类型不确定，因此需要传入一个固定的数据类型满足实际需求\n```\npublic class StringTagView extends BaseTagView<String> {\n\n    public StringTagView(Context context) {\n        this(context, null);\n    }\n\n    public StringTagView(Context context, @Nullable AttributeSet attrs) {\n        super(context, attrs, 0);\n    }\n\n    public StringTagView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n    }\n\n    @Override\n    public void setItem(String item) {\n        super.setItem(item);\n        textView.setText(item);\n    }\n}\n```\n\n# 继承TagAdapter\n定义一个Adapter，继承TagAdapter，并实现相应的方法\n```\npublic class StringTagAdapter extends TagAdapter<StringTagView, String> {\n\n    StringTagAdapter(Context context, List<String> data) {\n        this(context, data, null);\n    }\n\n    StringTagAdapter(Context context, List<String> data, List<String> selectItems) {\n        super(context, data, selectItems);\n    }\n\n    /**\n     * 检查item和所选item是否一样\n     *\n     * @param view\n     * @param item\n     * @return\n     */\n    @Override\n    protected boolean checkIsItemSame(StringTagView view, String item) {\n        return TextUtils.equals(view.getItem(), item);\n    }\n\n    /**\n     * 检查item是否是空指针\n     *\n     * @return\n     */\n    @Override\n    protected boolean checkIsItemNull(String item) {\n        return TextUtils.isEmpty(item);\n    }\n\n    /**\n     * 添加标签\n     *\n     * @param item\n     * @return\n     */\n    @Override\n    protected StringTagView addTag(String item) {\n        StringTagView tagView = new StringTagView(getContext());\n        tagView.setPadding(20, 20, 20, 20);\n\n        TextView textView = tagView.getTextView();\n        textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);\n        textView.setGravity(Gravity.CENTER);\n\n        tagView.setItemDefaultDrawable(itemDefaultDrawable);\n        tagView.setItemSelectDrawable(itemSelectDrawable);\n        tagView.setItemDefaultTextColor(itemDefaultTextColor);\n        tagView.setItemSelectTextColor(itemSelectTextColor);\n        tagView.setItem(item);\n        return tagView;\n    }\n}\n```\n# 使用\n在xml中，你可以使用如下配置:\n```\n<resources>\n    <declare-styleable name=\"TagFlowLayout\">\n        <attr name=\"showHighlight\" format=\"boolean\" /> // 是否选中高亮\n        <attr name=\"defaultDrawable\" format=\"reference\" /> // 默认标签背景\n        <attr name=\"selectDrawable\" format=\"reference\" /> // 选中标签背景\n        <attr name=\"defaultTextColor\" format=\"color|reference\"/> // 默认标签文字颜色\n        <attr name=\"selectTextColor\" format=\"color|reference\" /> // 选中标签文字颜色\n        <attr name=\"mode\"> // 单选或者多选\n            <enum name=\"MULTI\" value=\"0\" /> // 默认多选\n            <enum name=\"SINGLE\" value=\"1\"/> // 单选\n        </attr>\n    </declare-styleable>\n</resources>\n```\n```\n    <zhouyou.flexbox.widget.TagFlowLayout\n        android:id=\"@+id/flow_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:alignContent=\"flex_start\"\n        app:alignItems=\"center\"\n        app:dividerDrawable=\"@drawable/bg_flow_divider\"\n        app:flexDirection=\"row\"\n        app:flexWrap=\"wrap\"\n        app:justifyContent=\"flex_start\"\n        app:showDivider=\"beginning|middle|end\"\n        app:selectDrawable=\"@drawable/bg_flow_selected\"\n        app:defaultDrawable=\"@drawable/bg_flow_unselect\"\n        app:selectTextColor=\"@android:color/white\"\n        app:defaultTextColor=\"@color/app_green\"\n        app:mode=\"SINGLE\"/>\n```\n也可以使用Java代码进行属性配置\n```\n    TagFlowLayout flowLayout = (TagFlowLayout) findViewById(R.id.flow_layout);\n    flowLayout.setShowHighlight(false);\n    flowLayout.setItemDefaultDrawable(R.drawable.bg_flow_unselect);\n    flowLayout.setItemSelectDrawable(R.drawable.bg_flow_selected);\n    flowLayout.setItemDefaultTextColor(ContextCompat.getColor(this, R.color.app_green));\n    flowLayout.setItemSelectTextColor(Color.WHITE);\n    flowLayout.setMode(TagFlowLayout.MODE_SINGLE_SELECT);\n```\n# 回调\n可以使用如下回调来获取最终所选择的项目列表\n```\n    ...\n    adapter.setOnSubscribeListener(new OnFlexboxSubscribeListener<String>() {\n        @Override\n        public void onSubscribe(List<String> selectedItem) {\n        }\n    });\n```\n# 操作模式\n可以通过设置模式来控制标签的单选与多选操作\n```\n    ...\n    flowLayout.setMode(TagFlowLayout.MODE_SINGLE_SELECT);\n```\n# 选中高亮效果\n可以设置是否选中高亮，默认为选中高亮\n```\n    ...\n    flowLayout.setShowHighlight(false);\n```\n\n# 绑定数据到控件\n通过声明TagFlowLayout，并且调用setAdapter()方法来接收之前定义好的adapter即可\n```\n    ...\n    flowLayout.setAdapter(adapter);\n```\n# 切换、刷新数据\n在声明的adapter基础上，重新设置数据源和已选项，notifyDataSetChanged()方法即可完成数据刷新操作\n```\n    ...\n    adapter.setSource(data);\n    adapter.setSelectItems(selectItems);\n    adapter.notifyDataSetChanged();\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.zhouyou.flexbox\"\n        minSdkVersion 14\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.3.1'\n    compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha8'\n    testCompile 'junit:junit:4.12'\n    compile project(path: ':flexbox')\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 C:\\Users\\DESKTOP\\AppData\\Local\\Android\\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\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "app/src/androidTest/java/com/zhouyou/flexbox/ExampleInstrumentedTest.java",
    "content": "package com.zhouyou.flexbox;\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.zhouyou.flexbox\", 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.zhouyou.flexbox\" >\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\" >\n        <activity android:name=\".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/zhouyou/flexbox/MainActivity.java",
    "content": "package com.zhouyou.flexbox;\n\nimport android.os.Bundle;\nimport android.support.v7.app.AppCompatActivity;\nimport android.view.View;\nimport android.widget.Button;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport zhouyou.flexbox.interfaces.OnFlexboxSubscribeListener;\nimport zhouyou.flexbox.widget.TagFlowLayout;\n\npublic class MainActivity extends AppCompatActivity implements View.OnClickListener {\n\n    private Button btnCount;\n    private StringTagAdapter adapter;\n\n    private List<String> sourceData;\n    private List<String> selectItems;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n        initData();\n        initViews();\n    }\n\n    private void initData() {\n        sourceData = new ArrayList<>();\n        sourceData.add(\"程序员\");\n        sourceData.add(\"设计师\");\n        sourceData.add(\"产品经理\");\n        sourceData.add(\"运营\");\n        sourceData.add(\"商务\");\n        sourceData.add(\"人事经理\");\n        sourceData.add(\"项目经理\");\n        sourceData.add(\"客户代表\");\n        sourceData.add(\"技术主管\");\n        sourceData.add(\"测试工程师\");\n        sourceData.add(\"前端工程师\");\n        sourceData.add(\"Java工程师\");\n        sourceData.add(\"Android工程师\");\n        sourceData.add(\"iOS工程师\");\n\n        selectItems = new ArrayList<>();\n        selectItems.add(\"客户代表\");\n        selectItems.add(\"Java工程师\");\n    }\n\n    private void initViews() {\n        TagFlowLayout flowLayout = (TagFlowLayout) findViewById(R.id.flow_layout);\n        btnCount = (Button) findViewById(R.id.btn_get_count);\n        adapter = new StringTagAdapter(this, sourceData, selectItems);\n        adapter.setOnSubscribeListener(new OnFlexboxSubscribeListener<String>() {\n            @Override\n            public void onSubscribe(List<String> selectedItem) {\n                btnCount.setText(\"已选择\" + selectedItem.size() + \"个\");\n            }\n        });\n        flowLayout.setAdapter(adapter);\n        btnCount.setText(\"已选择\" + adapter.getSelectedList().size() + \"个\");\n        findViewById(R.id.btn_switch_data).setOnClickListener(this);\n    }\n\n    @Override\n    public void onClick(View v) {\n        switch (v.getId()) {\n            case R.id.btn_switch_data:\n                List<String> data = new ArrayList<>();\n                data.add(\"客户代表\");\n                data.add(\"Java工程师\");\n\n                List<String> selectList = new ArrayList<>();\n                selectList.add(\"客户代表\");\n                adapter.setSource(data);\n                adapter.setSelectItems(selectList);\n                adapter.notifyDataSetChanged();\n                break;\n            default:\n                break;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/zhouyou/flexbox/StringTagAdapter.java",
    "content": "package com.zhouyou.flexbox;\n\nimport android.content.Context;\nimport android.text.TextUtils;\nimport android.util.TypedValue;\nimport android.view.Gravity;\nimport android.widget.TextView;\n\nimport java.util.List;\n\nimport zhouyou.flexbox.adapter.TagAdapter;\n\n/**\n * 作者：ZhouYou\n * 日期：2017/3/27\n */\npublic class StringTagAdapter extends TagAdapter<StringTagView, String> {\n\n    StringTagAdapter(Context context, List<String> data) {\n        this(context, data, null);\n    }\n\n    StringTagAdapter(Context context, List<String> data, List<String> selectItems) {\n        super(context, data, selectItems);\n    }\n\n    /**\n     * 检查item和所选item是否一样\n     *\n     * @param view\n     * @param item\n     * @return\n     */\n    @Override\n    protected boolean checkIsItemSame(StringTagView view, String item) {\n        return TextUtils.equals(view.getItem(), item);\n    }\n\n    /**\n     * 检查item是否是空指针\n     *\n     * @return\n     */\n    @Override\n    protected boolean checkIsItemNull(String item) {\n        return TextUtils.isEmpty(item);\n    }\n\n    /**\n     * 添加标签\n     *\n     * @param item\n     * @return\n     */\n    @Override\n    protected StringTagView addTag(String item) {\n        StringTagView tagView = new StringTagView(getContext());\n        tagView.setPadding(20, 20, 20, 20);\n\n        TextView textView = tagView.getTextView();\n        textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);\n        textView.setGravity(Gravity.CENTER);\n\n        tagView.setItemDefaultDrawable(itemDefaultDrawable);\n        tagView.setItemSelectDrawable(itemSelectDrawable);\n        tagView.setItemDefaultTextColor(itemDefaultTextColor);\n        tagView.setItemSelectTextColor(itemSelectTextColor);\n        tagView.setItem(item);\n        return tagView;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/zhouyou/flexbox/StringTagView.java",
    "content": "package com.zhouyou.flexbox;\n\nimport android.content.Context;\nimport android.support.annotation.Nullable;\nimport android.util.AttributeSet;\n\nimport zhouyou.flexbox.widget.BaseTagView;\n\n/**\n * 作者：ZhouYou\n * 日期：2017/3/25.\n */\npublic class StringTagView extends BaseTagView<String> {\n\n    public StringTagView(Context context) {\n        this(context, null);\n    }\n\n    public StringTagView(Context context, @Nullable AttributeSet attrs) {\n        super(context, attrs, 0);\n    }\n\n    public StringTagView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n    }\n\n    @Override\n    public void setItem(String item) {\n        super.setItem(item);\n        textView.setText(item);\n    }\n}\n"
  },
  {
    "path": "app/src/main/res/drawable/bg_flow_divider.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <solid android:color=\"@android:color/transparent\" />\n\n    <size\n        android:width=\"10dip\"\n        android:height=\"10dip\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/bg_flow_selected.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"@color/app_green\" />\n\n    <corners android:radius=\"4dip\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/bg_flow_unselect.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <stroke\n        android:width=\"0.5dip\"\n        android:color=\"@color/app_green\" />\n\n    <solid android:color=\"@android:color/transparent\" />\n\n    <corners android:radius=\"4dip\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    tools:context=\"com.zhouyou.flexbox.MainActivity\">\n\n    <zhouyou.flexbox.widget.TagFlowLayout\n        android:id=\"@+id/flow_layout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        app:alignContent=\"flex_start\"\n        app:alignItems=\"center\"\n        app:dividerDrawable=\"@drawable/bg_flow_divider\"\n        app:flexDirection=\"row\"\n        app:flexWrap=\"wrap\"\n        app:justifyContent=\"flex_start\"\n        app:showDivider=\"beginning|middle|end\"\n        app:selectDrawable=\"@drawable/bg_flow_selected\"\n        app:defaultDrawable=\"@drawable/bg_flow_unselect\"\n        app:selectTextColor=\"@android:color/white\"\n        app:defaultTextColor=\"@color/app_green\"\n        app:mode=\"MULTI\"/>\n\n    <Button\n        android:id=\"@+id/btn_get_count\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"请选择\" />\n\n    <Button\n        android:id=\"@+id/btn_switch_data\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"切换数据\" />\n\n</LinearLayout>\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\n    <color name=\"app_green\">#53CAC3</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">FlexboxDemo</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/test/java/com/zhouyou/flexbox/ExampleUnitTest.java",
    "content": "package com.zhouyou.flexbox;\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\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        jcenter()\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "flexbox/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "flexbox/build.gradle",
    "content": "apply plugin: 'com.android.library'\n\nandroid {\n    compileSdkVersion 25\n    buildToolsVersion \"25.0.2\"\n\n    defaultConfig {\n        minSdkVersion 14\n        targetSdkVersion 25\n        versionCode 1\n        versionName \"1.0\"\n\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n\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.3.1'\n    testCompile 'junit:junit:4.12'\n    compile 'com.google.android:flexbox:0.2.6'\n}\n"
  },
  {
    "path": "flexbox/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 C:\\Users\\DESKTOP\\AppData\\Local\\Android\\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\n# Uncomment this to preserve the line number information for\n# debugging stack traces.\n#-keepattributes SourceFile,LineNumberTable\n\n# If you keep the line number information, uncomment this to\n# hide the original source file name.\n#-renamesourcefileattribute SourceFile\n"
  },
  {
    "path": "flexbox/src/androidTest/java/zhouyou/flexbox/ExampleInstrumentedTest.java",
    "content": "package zhouyou.flexbox;\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(\"zhouyou.flexbox.test\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "flexbox/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\n    package=\"zhouyou.flexbox\">\n\n    <application android:allowBackup=\"true\" android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\">\n\n    </application>\n\n</manifest>\n"
  },
  {
    "path": "flexbox/src/main/java/zhouyou/flexbox/adapter/TagAdapter.java",
    "content": "package zhouyou.flexbox.adapter;\n\nimport android.content.Context;\nimport android.support.v4.util.ArrayMap;\nimport android.widget.Toast;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Map;\n\nimport zhouyou.flexbox.widget.BaseTagView;\nimport zhouyou.flexbox.interfaces.OnFlexboxSubscribeListener;\nimport zhouyou.flexbox.widget.TagFlowLayout;\nimport zhouyou.flexbox.interfaces.TagWithListener;\n\n/**\n * 作者：ZhouYou\n * 日期：2017/3/27.\n */\npublic abstract class TagAdapter<V extends BaseTagView<T>, T> {\n\n    private Context context;\n    /**\n     * 根布局\n     */\n    private TagFlowLayout rootView;\n\n    /**\n     * 数据源\n     */\n    private List<T> source;\n\n    /**\n     * 已选项目\n     */\n    private List<T> selectItems;\n    /*view和tag的对应关系*/\n    private Map<V, T> viewMap;\n    /*标签选择操作的订阅接口*/\n    private OnFlexboxSubscribeListener<T> onSubscribeListener;\n    /*是否展示选中效果*/\n    private boolean isShowHighlight = true;\n    /*可选标签的最大数量*/\n    private int maxSelection;\n    /*默认和已选的背景*/\n    protected int itemDefaultDrawable;\n    protected int itemSelectDrawable;\n    /*默认和已选的文字颜色*/\n    protected int itemDefaultTextColor;\n    protected int itemSelectTextColor;\n    /*操作模式 0 - 多选 | 1 - 单选*/\n    private int mode;\n\n    public void setOnSubscribeListener(OnFlexboxSubscribeListener<T> onSubscribeListener) {\n        this.onSubscribeListener = onSubscribeListener;\n    }\n\n    public void setSource(List<T> source) {\n        this.source = source;\n    }\n\n    public void setSelectItems(List<T> selectItems) {\n        this.selectItems = selectItems;\n    }\n\n    public List<T> getSelectItems() {\n        return selectItems;\n    }\n\n    public TagAdapter(Context context, List<T> source) {\n        this.context = context;\n        this.source = source;\n        viewMap = new ArrayMap<>();\n    }\n\n    public TagAdapter(Context context, List<T> source, List<T> selectItems) {\n        this.context = context;\n        this.source = source;\n        this.selectItems = selectItems;\n        viewMap = new ArrayMap<>();\n    }\n\n    public Context getContext() {\n        return context;\n    }\n\n    public List<T> getData() {\n        return source;\n    }\n\n    /**\n     * 绑定控件\n     *\n     * @param rootView\n     */\n    public void bindView(TagFlowLayout rootView) {\n        if (rootView == null) {\n            throw new NullPointerException(\"未初始化TagFlowLayout\");\n        }\n        this.rootView = rootView;\n        isShowHighlight = rootView.isShowHighlight();\n        itemDefaultDrawable = rootView.getItemDefaultDrawable();\n        itemSelectDrawable = rootView.getItemSelectDrawable();\n        itemDefaultTextColor = rootView.getItemDefaultTextColor();\n        itemSelectTextColor = rootView.getItemSelectTextColor();\n        maxSelection = rootView.getMaxSelection();\n        mode = rootView.getMode();\n    }\n\n    /**\n     * 设置标签组\n     */\n    public void addTags() {\n        if (source == null || source.size() <= 0) return;\n        rootView.removeAllViews();\n        for (T item : source) {\n            if (item == null) continue;\n            final BaseTagView<T> view = addTag(item);\n            initSelectedViews((V) view);\n            // 单个item的点击监控\n            view.setListener(new TagWithListener<T>() {\n                @Override\n                public void onItemSelect(T item) {\n                    if (mode == TagFlowLayout.MODE_SINGLE_SELECT) {\n                        if (isShowHighlight) view.selectItemChangeColorState();\n                        singleSelectMode(item);\n                    } else {\n                        List<T> selectList = getSelectedList();\n                        if ((maxSelection <= selectList.size() && maxSelection > 0) && !view.isItemSelected()) {\n                            Toast.makeText(getContext(), \"最多选择\" + maxSelection + \"个标签\", Toast.LENGTH_SHORT).show();\n                            return;\n                        }\n                        if (isShowHighlight) view.selectItemChangeColorState();\n                    }\n                    if (onSubscribeListener != null) {\n                        onSubscribeListener.onSubscribe(getSelectedList());\n                    }\n                }\n            });\n            viewMap.put((V) view, item);\n            rootView.addView(view);\n        }\n    }\n\n    /**\n     * 设置在初始化时所选中的View\n     *\n     * @param view\n     */\n    private void initSelectedViews(V view) {\n        if (!isShowHighlight) return;\n        if (selectItems == null || selectItems.size() <= 0) return;\n        for (T select : selectItems) {\n            if (checkIsItemNull(select)) continue;\n            if (checkIsItemSame(view, select)) {\n                view.setItemSelected(true);\n                break;\n            }\n        }\n    }\n\n    /**\n     * 单选操作模式\n     */\n    private void singleSelectMode(T item) {\n        if (!isShowHighlight) return;\n        for (BaseTagView<T> view : viewMap.keySet()) {\n            if (checkIsItemSame((V) view, item)) {\n                view.setItemSelected(true);\n            } else {\n                view.setItemSelected(false);\n            }\n        }\n    }\n\n\n    /**\n     * 刷新数据\n     */\n    public void notifyDataSetChanged() {\n        addTags();\n    }\n\n    /**\n     * 对于相同item的判断条件\n     *\n     * @param view\n     * @param item\n     * @return\n     */\n    protected abstract boolean checkIsItemSame(V view, T item);\n\n    /**\n     * 检查item是否是空指针\n     *\n     * @param item\n     * @return\n     */\n    protected abstract boolean checkIsItemNull(T item);\n\n    /**\n     * 添加单个标签\n     *\n     * @param item\n     * @return\n     */\n    protected abstract BaseTagView<T> addTag(T item);\n\n    /**\n     * 获取所有item的数量\n     */\n    protected int getCount() {\n        if (source == null) return 0;\n        return source.size();\n    }\n\n    /**\n     * 得到已选项目的列表\n     *\n     * @return\n     */\n    @SuppressWarnings(\"SuspiciousMethodCalls\")\n    public List<T> getSelectedList() {\n        List<T> selectedList = new ArrayList<>();\n        for (BaseTagView<T> view : viewMap.keySet()) {\n            if (view.isItemSelected()) {\n                T item = viewMap.get(view);\n                selectedList.add(item);\n            }\n        }\n        return selectedList;\n    }\n}\n"
  },
  {
    "path": "flexbox/src/main/java/zhouyou/flexbox/interfaces/OnFlexboxSubscribeListener.java",
    "content": "package zhouyou.flexbox.interfaces;\n\nimport java.util.List;\n\n/**\n * 作者：ZhouYou\n * 日期：2017/3/27.\n */\npublic interface OnFlexboxSubscribeListener<T> {\n\n    /**\n     * @param selectedItem 已选中的标签\n     */\n    void onSubscribe(List<T> selectedItem);\n}\n"
  },
  {
    "path": "flexbox/src/main/java/zhouyou/flexbox/interfaces/TagWithListener.java",
    "content": "package zhouyou.flexbox.interfaces;\n\n/**\n * 作者：ZhouYou\n * 日期：2017/3/25.\n */\npublic interface TagWithListener<T> {\n\n    void onItemSelect(T item);\n}\n"
  },
  {
    "path": "flexbox/src/main/java/zhouyou/flexbox/widget/BaseTagView.java",
    "content": "package zhouyou.flexbox.widget;\n\nimport android.content.Context;\nimport android.support.annotation.Nullable;\nimport android.util.AttributeSet;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.widget.FrameLayout;\nimport android.widget.TextView;\n\nimport zhouyou.flexbox.interfaces.TagWithListener;\n\n/**\n * 作者：ZhouYou\n * 日期：2017/3/25.\n */\npublic class BaseTagView<T> extends FrameLayout implements View.OnClickListener {\n\n    private int itemDefaultDrawable;\n    private int itemSelectDrawable;\n\n    private int itemDefaultTextColor;\n    private int itemSelectTextColor;\n\n    private T item;\n\n    public TextView textView;\n\n    private TagWithListener<T> listener;\n\n    private boolean isItemSelected;\n\n    public void setListener(TagWithListener<T> listener) {\n        this.listener = listener;\n    }\n\n    public BaseTagView(Context context) {\n        this(context, null);\n    }\n\n    public BaseTagView(Context context, @Nullable AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public BaseTagView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        init();\n    }\n\n    private void init() {\n        textView = new TextView(getContext());\n        textView.setGravity(Gravity.CENTER);\n        addView(textView);\n        setOnClickListener(this);\n    }\n\n    /**\n     * 设置标签\n     *\n     * @param item\n     */\n    public void setItem(T item) {\n        this.item = item;\n    }\n\n    public T getItem() {\n        return item;\n    }\n\n    @Override\n    public void onClick(View v) {\n        if (listener == null) return;\n        listener.onItemSelect(item);\n    }\n\n    public void selectItemChangeColorState() {\n        if (isItemSelected) {\n            setBackgroundResource(itemDefaultDrawable);\n            textView.setTextColor(itemDefaultTextColor);\n            isItemSelected = false;\n        } else {\n            setBackgroundResource(itemSelectDrawable);\n            textView.setTextColor(itemSelectTextColor);\n            isItemSelected = true;\n        }\n    }\n\n    public boolean isItemSelected() {\n        return isItemSelected;\n    }\n\n    public void setItemSelected(boolean itemSelected) {\n        isItemSelected = itemSelected;\n        if (itemSelected) {\n            setBackgroundResource(itemSelectDrawable);\n            textView.setTextColor(itemSelectTextColor);\n        } else {\n            setBackgroundResource(itemDefaultDrawable);\n            textView.setTextColor(itemDefaultTextColor);\n        }\n    }\n\n    public void setItemDefaultDrawable(int itemDefaultDrawable) {\n        this.itemDefaultDrawable = itemDefaultDrawable;\n        setBackgroundResource(itemDefaultDrawable);\n    }\n\n    public void setItemSelectDrawable(int itemSelectDrawable) {\n        this.itemSelectDrawable = itemSelectDrawable;\n    }\n\n    public void setItemDefaultTextColor(int itemDefaultTextColor) {\n        this.itemDefaultTextColor = itemDefaultTextColor;\n        textView.setTextColor(itemDefaultTextColor);\n    }\n\n    public void setItemSelectTextColor(int itemSelectTextColor) {\n        this.itemSelectTextColor = itemSelectTextColor;\n    }\n\n    public TextView getTextView() {\n        return textView;\n    }\n}\n"
  },
  {
    "path": "flexbox/src/main/java/zhouyou/flexbox/widget/TagFlowLayout.java",
    "content": "package zhouyou.flexbox.widget;\n\nimport android.content.Context;\nimport android.content.res.TypedArray;\nimport android.util.AttributeSet;\n\nimport com.google.android.flexbox.FlexboxLayout;\n\nimport zhouyou.flexbox.R;\nimport zhouyou.flexbox.adapter.TagAdapter;\n\n/**\n * 作者：ZhouYou\n * 日期：2017/3/28.\n */\npublic class TagFlowLayout extends FlexboxLayout {\n\n    /*是否展示选中效果*/\n    private boolean isShowHighlight = true;\n    /*默认和已选的背景*/\n    private int itemDefaultDrawable;\n    private int itemSelectDrawable;\n    /*默认和已选的文字颜色*/\n    private int itemDefaultTextColor;\n    private int itemSelectTextColor;\n    /*操作模式 0 - 多选 | 1 - 单选*/\n    private int mode = MODE_MULTI_SELECT;\n    /*可选标签的最大数量*/\n    private int maxSelection;\n    public static final int MODE_MULTI_SELECT = 0;\n    public static final int MODE_SINGLE_SELECT = 1;\n\n    public TagFlowLayout(Context context) {\n        this(context, null);\n    }\n\n    public TagFlowLayout(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public TagFlowLayout(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TagFlowLayout);\n        isShowHighlight = ta.getBoolean(R.styleable.TagFlowLayout_showHighlight, true);\n        itemDefaultDrawable = ta.getResourceId(R.styleable.TagFlowLayout_defaultDrawable, 0);\n        itemSelectDrawable = ta.getResourceId(R.styleable.TagFlowLayout_selectDrawable, 0);\n        itemDefaultTextColor = ta.getColor(R.styleable.TagFlowLayout_defaultTextColor, 0);\n        itemSelectTextColor = ta.getColor(R.styleable.TagFlowLayout_selectTextColor, 0);\n        mode = ta.getInt(R.styleable.TagFlowLayout_mode, MODE_MULTI_SELECT);\n        maxSelection = ta.getInt(R.styleable.TagFlowLayout_maxSelectionCount, 0);\n        ta.recycle();\n    }\n\n    public void setAdapter(TagAdapter adapter) {\n        if (adapter == null) {\n            removeAllViews();\n            return;\n        }\n        adapter.bindView(this);\n        adapter.addTags();\n    }\n\n    public boolean isShowHighlight() {\n        return isShowHighlight;\n    }\n\n    public void setShowHighlight(boolean showHighlight) {\n        isShowHighlight = showHighlight;\n    }\n\n    public int getItemDefaultDrawable() {\n        return itemDefaultDrawable;\n    }\n\n    public void setItemDefaultDrawable(int itemDefaultDrawable) {\n        this.itemDefaultDrawable = itemDefaultDrawable;\n    }\n\n    public int getItemSelectDrawable() {\n        return itemSelectDrawable;\n    }\n\n    public void setItemSelectDrawable(int itemSelectDrawable) {\n        this.itemSelectDrawable = itemSelectDrawable;\n    }\n\n    public int getItemDefaultTextColor() {\n        return itemDefaultTextColor;\n    }\n\n    public void setItemDefaultTextColor(int itemDefaultTextColor) {\n        this.itemDefaultTextColor = itemDefaultTextColor;\n    }\n\n    public int getItemSelectTextColor() {\n        return itemSelectTextColor;\n    }\n\n    public void setItemSelectTextColor(int itemSelectTextColor) {\n        this.itemSelectTextColor = itemSelectTextColor;\n    }\n\n    public int getMode() {\n        return mode;\n    }\n\n    public void setMode(int mode) {\n        this.mode = mode;\n    }\n\n    public int getMaxSelection() {\n        return maxSelection;\n    }\n\n    public void setMaxSelection(int maxSelection) {\n        this.maxSelection = maxSelection;\n    }\n}\n"
  },
  {
    "path": "flexbox/src/main/res/values/attrs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <declare-styleable name=\"TagFlowLayout\">\n        <attr name=\"showHighlight\" format=\"boolean\" />\n        <attr name=\"defaultDrawable\" format=\"reference\" />\n        <attr name=\"selectDrawable\" format=\"reference\" />\n        <attr name=\"defaultTextColor\" format=\"color|reference\"/>\n        <attr name=\"selectTextColor\" format=\"color|reference\" />\n        <attr name=\"mode\">\n            <enum name=\"MULTI\" value=\"0\" />\n            <enum name=\"SINGLE\" value=\"1\"/>\n        </attr>\n        <attr name=\"maxSelectionCount\" format=\"integer\"/>\n    </declare-styleable>\n</resources>"
  },
  {
    "path": "flexbox/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">FlexboxUtils</string>\n</resources>\n"
  },
  {
    "path": "flexbox/src/test/java/zhouyou/flexbox/ExampleUnitTest.java",
    "content": "package zhouyou.flexbox;\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": "#Sat Mar 25 17:41:19 CST 2017\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', ':flexbox'\n"
  }
]