[
  {
    "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/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          </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=\"JDK\" 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</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$/SleepHelper.iml\" filepath=\"$PROJECT_DIR$/SleepHelper.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/app/app.iml\" filepath=\"$PROJECT_DIR$/app/app.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": "### 前言\n> 从零开始，手把手带你实现一个「专注睡前的 APP」。睡觉之前如果能有一个 APP，能让我们写一写这一天的见闻或者心得，同时又能看一会段子、瞄一会好看的妹子，放松一下疲惫的身心那该多好，这也是我完成这个 APP 的原因。APP 的全部代码我已经分享到 Github 上了，需要的直接 [点击这里](https://github.com/developerHaoz/SleepHelper)，如果喜欢的话，麻烦给个 star，谢谢啦。\n\n在开始写正文之前，先来一波效果的展示，看看五天过后我们能实现怎样的效果\n\n![SleepHelper](http://upload-images.jianshu.io/upload_images/4334738-acaaea47739bc4b0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n本次的教程分为 5 天，内容分别为：\n- Day one，准备\n  - 功能需求\n  - 可行性分析\n\n- Day two，UI 及公共类的封装\n  - 界面的设计及实现\n  - 公共类的实现\n\n- Day three，日记模块\n  - 日记的展示\n  - 悬浮菜单的实现\n  - 日记增删改的实现\n\n- Day four，妹子模块\n  - 图片的获取\n  - 图片的展示\n  - 详情页面的展示\n\n- Day five，段子模块\n  - 段子数据的获取\n  - 段子的显示\n\n## Day one\n-----\n俗话说，万事开头难，在开始敲代码之前，先让我们来做一些必要的准备，这样才能事半功倍嘛！\n#### 一、功能需求 \n既然要做一个 APP，那我们首先还是得把 APP 的功能都列出来，有了方向才能更好的努力，因为我想做的是一个专门给睡觉前用的 APP，所以我觉得应该有以下的这些功能\n- 1、日记的增删改\n- 2、显示一些有趣好玩的段子\n- 3、瀑布流展示漂亮的妹子\n- 4、保存日记的内容以及缓存妹子图片\n\n虽然说需求不多，但是却要运用到网络、数据存储、图片缓存、UI 设计等内容，相信整个 APP 完成下来，必定能巩固我们的 Android 基础。\n#### 二、可行性分析\n我们这个 APP 主要有三个模块，日记模块主要是运用到了数据库的知识，难度不大。但是，段子模块和妹子模块的数据要从哪来，这便是要好好考虑的了。幸好现在是个开源的时代，很多的数据，网上已经开源出来了。\n\n我们先来看一下数据的内容\n```\ngroup: {\n        text: \"教授在河边，常常看到两只龟，缩着一动不动。有天忍不住好奇，问一农      \n        民：这两只乌龟在干吗？农民说：他们在pk。教授不解地问：动都没动过p什么    \n        k。老农说:他们在比谁寿命长。教授说：可是壳上有甲骨文的那只，早就死了埃\n        这时，另一只猛然探出头来骂到：md，死了也不吭一声！有甲骨文的那只也伸\n        出头来：“专家说啥你信啥１\",\n\n        user: {\n              user_id: 4669064575,\n\n              name: \"馒头啊\",\n\n              avatar_url: \"http://p3.pstatp.com/medium/6237/7969345239\",\n},\n\n          content: \"教授在河边，常常看到两只龟，缩着一动不动。有天忍不住好奇，问        \n           一农民：这两只乌龟在干吗？农民说：他们在pk。教授不解地问：动都没动过\n           p什么k。老农说:他们在比谁寿命长。教授说：可是壳上有甲骨文的那只，早\n           就死了埃这时，另一只猛然探出头来骂到：md，死了也不吭一声！有甲骨文\n           的那只也伸出头来：“专家说啥你信啥１\",\n...  \n}\n```\n```\n{\n          id: \"56cc6d1d421aa95caa7076df\",\n\n          type: \"福利\",\n\n          url: \"http://ww1.sinaimg.cn/large/7a8aed7bgw1esxxi1vbq0j20qo0hstcu.jpg\",\n\n          used: true,\n\n          who: \"张涵宇\"\n\n}\n```\n上面那两段代码分别是段子和妹子模块的 json 类型的数据，我已经将一些没用的字段去掉了。剩下的都是我们想要的数据。可以看到段子数据中，有着段子的内容，以及发布者的头像和名字。而妹子数据中有着图片的 url、id、以及图片的类型。相信有了这么丰富的数据，我们想要完成这个 APP 也是有底气了。\n\n\n## Day two\n-----\n#### 一、界面的设计及实现\n既然我们想要完成一个好看的 APP，那么好看的界面便是必不可少的，这里我强烈推荐 APP 界面的设计必须尽量遵从 Google 提出的 [Material Design](http://wiki.jikexueyuan.com/project/material-design/material-design-intro/introduction.html)，在这个推荐一个能够让我们实现 Material Design 变得更加简单的网站  [material design palette](https://www.materialpalette.com/light-blue/light-blue)，我这个 APP 的配色就是用这个网站完成的，贴几张图片，让你感受一下它的强大\n\n![material design palette](http://upload-images.jianshu.io/upload_images/4334738-d4a209808204270e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n![Material Design 风格的图标](http://upload-images.jianshu.io/upload_images/4334738-f1a1e9f2847deb06.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n借助这个网站便能让我们完成 APP 的配色以及图标的收集，为下一步功能的实现，先打好了基础，至于界面的设计就仁者见仁智者见智了，篇幅有限，我就不多讲了。\n\nAPP 的最终设计效果如下：\n![SleepHelper](http://upload-images.jianshu.io/upload_images/4334738-acaaea47739bc4b0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)\n\n\n#### 二、公共类的实现\n因为这个项目有三个模块，有一些东西其实是可以通用的，如果我们先把这些能够通用的东西，封装起来，供给所有的模块调用的话，相信会大大提高我们的开发效率。\n##### 1、网络工具类的封装\n这个 APP 中，很多地方都要用到网络请求，因此也就很有必要将网络请求封装起来，因为这个 APP 的规模比较小，因此我选择了 Volley 这个网络框架作为我们网络请求库，把网络请求封装起来，哪个地方需要，调用一下就行了。对于网络请求，我觉得每个程序员都该懂点 HTTP，这里附上一篇有关 HTTP 的文章 [程序员都该懂点 HTTP](http://www.jianshu.com/p/d86b66672ef4)。\n\n先让我们来写个将网络请求进行回调的接口\n```\npublic interface VolleyResponseCallback {\n    void onSuccess(String response);\n    void onError(VolleyError error);\n}\n```\n\n然后将网络请求封装起来\n```\npublic class VolleyHelper {\n\n    /**\n     * 用于发送 Get 请求的封装方法\n     *\n     * @param context Activity 的实例\n     * @param url 请求的地址\n     * @param callback 用于网络回调的接口\n     */\n    public static void sendHttpGet(Context context, String url, final VolleyResponseCallback callback){\n        RequestQueue requestQueue = Volley.newRequestQueue(context);\n        StringRequest stringRequest = new StringRequest(url\n                , new Response.Listener<String>() {\n            @Override\n            public void onResponse(String s) {\n                callback.onSuccess(s);\n            }\n        }, new Response.ErrorListener() {\n            @Override\n            public void onErrorResponse(VolleyError error) {\n                callback.onError(error);\n            }\n        });\n        requestQueue.add(stringRequest);\n    }\n\n\n}\n```\n##### 2、Json 解析的帮助类\n因为我们这个 APP 中，获取到的数据都是 Json 格式的，因此也就有必要将有关的 Json 解析封装成一个工具类，传入一个 String 类型的数据，直接得到数据实体类的 List。\n```\npublic class CommonParser {\n\n    /**\n     * 用来解析列表性的JSON数据\n     * 如:\n     * {\"success\":true,\"fileList\":[{\"filename\":\"文件名1\",\"fileSize\":\"文件大小1\"},\n     * {\"filename\":\"文件名2\",\"fileSize\":\"文件大小2\"}]}\n     *\n     * @param result     网络返回来的JSON数据   比如:上面的整串数据\n     * @param successKey 判断网络是否成功的字段  比如:上面的success字段\n     * @param arrKey     列表的字段            比如:上面的fileList字段\n     * @param clazz      需要解析成的Bean类型\n     * @param <T>        需要解析成的Bean类型\n     * @return\n     */\n    public static <T> List<T> parseForList(String result, String successKey, String arrKey, Class<T> clazz) {\n        List<T> list = new ArrayList<>();\n        JSONObject rootJsonObject = null;\n        try {\n            rootJsonObject = new JSONObject(result);\n            if (rootJsonObject.getBoolean(successKey)) {\n                JSONArray rootJsonArray = rootJsonObject.getJSONArray(arrKey);\n                Gson g = new Gson();\n                for (int i = 0; i < rootJsonArray.length(); i++) {\n                    T t = g.fromJson(rootJsonArray.getJSONObject(i).toString(), clazz);\n                    list.add(t);\n                }\n            }\n        } catch (JSONException e) {\n            e.printStackTrace();\n        }\n        return list;\n    }\n}\n```\n##### 3、HomeActivity（主页面）的封装\n主页面我用的是 TabLayout + ViewPager + Fragment，也是现在主流 APP 主页面的显示方式。主界面底部是我们三个模块的图标和名称，通过左右滑动能实现界面的跳转。\n###### 底部图标的实体类 CommonTabBean \n```\npublic class CommonTabBean implements CustomTabEntity{\n\n    private int selectedIcon;\n    private int unselectedIcon;\n    private String title;\n\n    public CommonTabBean(String title){\n        this.title = title;\n    }\n\n    public CommonTabBean(String title, int selectedIcon, int unselectedIcon) {\n        this.title = title;\n        this.selectedIcon = selectedIcon;\n        this.unselectedIcon = unselectedIcon;\n    }\n\n    @Override\n    public String getTabTitle() {\n        return title;\n    }\n\n    @Override\n    public int getTabSelectedIcon() {\n        return selectedIcon;\n    }\n\n    @Override\n    public int getTabUnselectedIcon() {\n        return unselectedIcon;\n    }\n}\n```\n\n###### ViewPager + Fragment 通用的 Adapter\n```\npublic class CommonPagerAdapter extends FragmentPagerAdapter {\n\n    private List<Fragment> mFragments;\n\n    public CommonPagerAdapter(FragmentManager fragmentManager, List<Fragment> mFragments){\n        super(fragmentManager);\n        this.mFragments = mFragments;\n    }\n\n    @Override\n    public Fragment getItem(int position) {\n        return mFragments.get(position);\n    }\n\n    @Override\n    public int getCount() {\n        return mFragments.size();\n    }\n}\n```\n\n## Day three\n-----\n关于日记模块的实现，其实我是复用了以前写过的一个[日记 APP](https://github.com/developerHaoz/WatermelonDiaryNew)，具体的思路和做法，可以参考我的这篇文章 [Android 一款十分简洁、优雅的日记 APP](http://www.jianshu.com/p/b4fde6b835a3)\n\n## Day four\n-----\n#### 一、图片的获取\n##### 1、根据返回的数据来编写图片的实体类\n```\npublic class MeiziBean {\n\n    @SerializedName(\"_id\")\n    private String id;\n    @SerializedName(\"url\")\n    private String imageUrl;\n    @SerializedName(\"who\")\n    private String who;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getImageUrl() {\n        return imageUrl;\n    }\n\n    public MeiziBean(String imageUrl){\n        this.imageUrl = imageUrl;\n    }\n}\n```\n##### 2、图片的展示\n可以看到我是用瀑布流的方式来实现图片的展示，效果还不错，但其实实现起来也是很简单的\n\n先写个图片的布局作为 RecyclerView 的 Item\n```\n<android.support.v7.widget.CardView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n                <ImageView\n                    android:id=\"@+id/item_iv_meizi\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_centerHorizontal=\"true\"\n                    android:layout_centerVertical=\"true\"\n                    />\n</android.support.v7.widget.CardView>\n```\n可以看到我在 ImageView 的外面加了一个 CardView，这个一种卡片式布局，能让图片看起来就像一张卡片一样，相当的优雅、美观。\n\n接着编写 Adapter，将数据和界面进行绑定\n```\npublic class MeiziAdapter extends RecyclerView.Adapter<MeiziAdapter.MeiziViewHolder> {\n\n    private List<MeiziBean> mMeiziBeanList;\n    private Fragment mFragment;\n\n    public MeiziAdapter(List<MeiziBean> mMeiziBeanList, Fragment mFragment){\n        this.mMeiziBeanList = mMeiziBeanList;\n        this.mFragment = mFragment;\n    }\n\n    @Override\n    public MeiziViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_meizi, null);\n        return new MeiziViewHolder(view);\n    }\n\n    @Override\n    public void onBindViewHolder(MeiziViewHolder holder, final int position) {\n\n        Glide.with(mFragment)\n                .load(mMeiziBeanList.get(position).getImageUrl())\n                .fitCenter()\n                .dontAnimate()\n                .diskCacheStrategy(DiskCacheStrategy.ALL)\n                .into(holder.mIvMeizi);\n\n        holder.mIvMeizi.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                ArrayList<String> resultList = new ArrayList<String>();\n                for (MeiziBean meiziBean : mMeiziBeanList) {\n                    resultList.add(meiziBean.getImageUrl());\n                }\n                DetailActivity.startActivity(mFragment.getActivity(), resultList, position);\n\n            }\n        });\n\n    }\n\n    @Override\n    public int getItemCount() {\n        if(mMeiziBeanList.size() > 0){\n            return mMeiziBeanList.size();\n        }\n        return 0;\n    }\n\n    public static class MeiziViewHolder extends RecyclerView.ViewHolder{\n\n        ImageView mIvMeizi;\n\n        public MeiziViewHolder(View itemView) {\n            super(itemView);\n            mIvMeizi = (ImageView) itemView.findViewById(R.id.item_iv_meizi);\n        }\n    }\n}\n```\n最后在 Fragment 进行数据的获取，以及布局的初始化就行了\n```\npublic class MeiziFragment extends Fragment {\n\n    ......\n\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n        View view = inflater.inflate(R.layout.fragment_meizi, container, false);\n        ButterKnife.bind(this, view);\n        initView();\n        refreshMeizi();\n        return view;\n    }\n\n    /**\n     * 刷新当前界面\n     */\n    private void refreshMeizi() {\n        mRefresh.setColorSchemeResources(R.color.colorPrimary);\n        mRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                initView();\n                mRefresh.setRefreshing(false);\n            }\n        });\n    }\n\n    private void initView() {\n        VolleyHelper.sendHttpGet(getActivity(), MeiziApi.getMeiziApi(), new VolleyResponseCallback() {\n            @Override\n            public void onSuccess(String s) {\n                response = s;\n                meiziBeanList = GsonHelper.getMeiziBean(response);\n                mRvShowMeizi.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));\n                Collections.shuffle(meiziBeanList);\n                mRvShowMeizi.setAdapter(new MeiziAdapter(meiziBeanList, MeiziFragment.this));\n            }\n\n            @Override\n            public void onError(VolleyError error) {\n                Logger.d(error);\n            }\n        });\n    }\n\n```\n\n##### 3、详情页面的展示\n干巴巴的，整个模块只能显示妹子的图片怎么行呢！！！怎么着也得能查看大图，根据手势放大缩小，以及浏览下一张图片才行嘛，说干就干。\n\n因为图片需要有根据手势来放大缩小的功能，因此我便想到了 [PhotoView](https://github.com/chrisbanes/PhotoView)，这是网上一个大神写的，继承自 ImageView 的一个自定义控件。图片加载我用的是\n Glide，如果没了解过这个库的，强烈推荐，一行代码就能搞定图片加载，你确定不研究一下。这里附上一篇有关 Glide 的文章 [Glide 一个强大的图片加载框架](http://www.jianshu.com/p/fae51d781987)\n\n```\npublic class DetailFragment extends Fragment {\n\n    public static DetailFragment newInstance(String imageUrl) {\n        DetailFragment fragment = new DetailFragment();\n        Bundle bundle = new Bundle();\n        bundle.putString(IMAGE_URL, imageUrl);\n        fragment.setArguments(bundle);\n        return fragment;\n    }\n\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n        View view = inflater.inflate(R.layout.fragment_detail, container, false);\n        ButterKnife.bind(this, view);\n        Bundle bundle = getArguments();\n        String imageUrl = bundle.getString(IMAGE_URL);\n        Glide.with(this).load(imageUrl).into(mPvShowPhoto);\n        mPvShowPhoto.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() {\n            @Override\n            public void onPhotoTap(View view, float v, float v1) {\n                getActivity().finish();\n            }\n\n            @Override\n            public void onOutsidePhotoTap() {\n\n            }\n        });\n        return view;\n    }\n}\n```\n\n## Day five\n-----\n#### 一、段子数据的获取\n段子数据的获取其实跟妹子模块的方法基本一样\n\n先编写实体类\n```\npublic class DuanziBean {\n\n    @SerializedName(\"group\")\n    private GroupBean groupBean;\n    private String type;\n\n    public GroupBean getGroupBean() {\n        return groupBean;\n    }\n\n    public void setGroupBean(GroupBean groupBean) {\n        this.groupBean = groupBean;\n    }\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n    \n}\n```\n```\npublic class GroupBean {\n\n    private String text;\n    private long id;\n    private UserBean user;\n\n    public String getText() {\n        return text;\n    }\n\n    public long getId() {\n        return id;\n    }\n\n    public UserBean getUser() {\n        return user;\n    }\n\n    public static class UserBean {\n\n        private long user_id;\n        private String name;\n        private String avatar_url;\n\n        public String getName() {\n            return name;\n        }\n\n        public String getAvatar_url() {\n            return avatar_url;\n        }\n\n    }\n}\n```\n写好实体类之后，使用我们之前已经封装好的网络请求工具以及解析工具，便能将返回的数据，解析成一个包含段子实体类的 List。\n#### 二、段子的显示\n老规矩，先写个 RecyclerView 的 Item\n```\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:orientation=\"vertical\"\n    >\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"40dp\"\n        android:paddingLeft=\"8dp\"\n        >\n\n        <de.hdodenhof.circleimageview.CircleImageView\n            android:id=\"@+id/duanzi_civ_avatar\"\n            android:layout_width=\"24dp\"\n            android:layout_height=\"24dp\"\n            android:src=\"@drawable/avatar\"\n            android:layout_gravity=\"center\"\n            />\n\n        <TextView\n            android:id=\"@+id/duanzi_tv_author\"\n            android:paddingLeft=\"8dp\"\n            android:paddingStart=\"8dp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"16dp\"\n            android:text=\"DeveloperHaoz\"\n            android:layout_gravity=\"center_vertical\"\n            />\n\n    </LinearLayout>\n\n    <TextView\n        android:id=\"@+id/duanzi_tv_content\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingBottom=\"10dp\"\n        android:paddingLeft=\"40dp\"\n        android:paddingRight=\"10dp\"\n        android:text=\"\"\n        />\n    <include layout=\"@layout/layout_app_divide\"/>\n\n</LinearLayout>\n```\n然后编写将数据和界面进行绑定的 Adapter\n```\npublic class DuanziAdapter extends RecyclerView.Adapter<DuanziAdapter.DuanziViewHolder>{\n\n    private Fragment mFragment;\n    private List<DuanziBean> mDuanziBeanList;\n\n    public DuanziAdapter(Fragment fragment, List<DuanziBean> duanziBeanList){\n        this.mFragment = fragment;\n        this.mDuanziBeanList = duanziBeanList;\n    }\n\n    @Override\n    public DuanziViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_duanzi, null);\n        return new DuanziViewHolder(view);\n    }\n\n    @Override\n    public void onBindViewHolder(DuanziViewHolder holder, int position) {\n        try {\n            DuanziBean duanziBean = mDuanziBeanList.get(position);\n            Glide.with(mFragment).load(duanziBean.getGroupBean().getUser().getAvatar_url()).into(holder.mCivAvatar);\n            holder.mTvContent.setText(duanziBean.getGroupBean().getText());\n            holder.mTvAuthor.setText(duanziBean.getGroupBean().getUser().getName());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    @Override\n    public int getItemCount() {\n        return mDuanziBeanList.size();\n    }\n\n    public static class DuanziViewHolder extends RecyclerView.ViewHolder{\n\n        private CircleImageView mCivAvatar;\n        private TextView mTvAuthor;\n        private TextView mTvContent;\n\n        public DuanziViewHolder(View itemView) {\n            super(itemView);\n            mCivAvatar = (CircleImageView) itemView.findViewById(R.id.duanzi_civ_avatar);\n            mTvAuthor = (TextView) itemView.findViewById(R.id.duanzi_tv_author);\n            mTvContent = (TextView) itemView.findViewById(R.id.duanzi_tv_content);\n        }\n    }\n\n\n}\n```\n最后段子页面中进行数据和获取以及界面的初始化\n```\npublic class DuanziFragment extends Fragment {\n\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n        View view = inflater.inflate(R.layout.fragment_duanzi, container, false);\n        ButterKnife.bind(this, view);\n        initView();\n        initRefresh();\n        return view;\n    }\n\n    private void initRefresh() {\n        mRefresh.setColorSchemeResources(R.color.colorPrimary);\n        mRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                initView();\n                mRefresh.setRefreshing(false);\n            }\n        });\n    }\n\n    private void initView() {\n        VolleyHelper.sendHttpGet(getActivity(), DuanziApi.GET_DUANZI, new VolleyResponseCallback() {\n            @Override\n            public void onSuccess(String response) {\n                List<DuanziBean> mDuanziBeanList = GsonHelper.getDuanziBeanList(response);\n                mDuanziBeanList.remove(3);\n                mRvShowDuanzi.setLayoutManager(new LinearLayoutManager(getActivity()));\n                mRvShowDuanzi.setAdapter(new DuanziAdapter(DuanziFragment.this, mDuanziBeanList));\n            }\n\n            @Override\n            public void onError(VolleyError error) {\n                Logger.d(error);\n            }\n        });\n    }\n\n}\n```\n\n以上便是本文的全部内容，这个 APP 的全部代码我已经分享到  [Github](https://github.com/developerHaoz/SleepHelper) 上了，如果觉得对你有帮助的话，就赏个 star 吧。\n\n-----\n### 猜你喜欢\n- [Android 一款十分简洁、优雅的日记 APP](http://www.jianshu.com/p/b4fde6b835a3)\n- [Android 能让你少走弯路的干货整理](http://www.jianshu.com/p/514656c383a2)\n- [Android 撸起袖子，自己封装 DialogFragment](http://www.jianshu.com/p/c9f20ec7277a)\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.3\"\n    defaultConfig {\n        applicationId \"com.example.developerhaoz.sleephelper\"\n        minSdkVersion 18\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(include: ['*.jar'], dir: 'libs')\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.2'\n    testCompile 'junit:junit:4.12'\n    compile files('libs/volley.jar')\n\n\n    compile 'com.google.code.gson:gson:2.4'\n    compile 'com.flyco.tablayout:FlycoTabLayout_Lib:2.0.8@aar'\n    compile 'org.greenrobot:eventbus:3.0.0'\n    compile 'com.jakewharton:butterknife:7.0.1'\n    compile 'de.hdodenhof:circleimageview:2.1.0'\n    compile 'com.orhanobut:logger:1.15'\n    compile 'com.android.support:design:25.3.1'\n    compile 'com.getbase:floatingactionbutton:1.5.1'\n    compile 'com.github.clans:fab:1.6.4'\n    compile 'com.oguzdev:CircularFloatingActionMenu:1.0.2'\n    compile 'io.github.yavski:fab-speed-dial:1.0.1'\n    compile 'cc.trity.floatingactionbutton:library:1.0.0'\n    compile 'com.parse.bolts:bolts-tasks:1.4.0'\n    compile 'com.github.bumptech.glide:glide:3.7.0'\n    compile 'com.github.chrisbanes:PhotoView:1.2.6'\n    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1'\n    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'\n    testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'\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\\Administrator\\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/example/developerhaoz/sleephelper/ExampleInstrumentedTest.java",
    "content": "package com.example.developerhaoz.sleephelper;\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.example.developerhaoz.sleephelper\", 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.example.developerhaoz.sleephelper\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>\n\n    <application\n        android:name=\".common.SleepApplication\"\n        android:allowBackup=\"true\"\n        android:icon=\"@drawable/app_icon\"\n        android:label=\"@string/app_name\"\n        android:roundIcon=\"@mipmap/ic_launcher_round\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n\n        <!--添加日记-->\n        <activity android:name=\".diary.ui.AddDiaryActivity\"\n                  android:windowSoftInputMode=\"adjustPan\"\n        >\n\n        </activity>\n\n        <!--测试用的 Activity-->\n        <activity android:name=\".common.TestActivity\">\n        </activity>\n\n        <!--修改日记-->\n        <activity android:name=\".diary.ui.UpdateDiaryActivity\"\n                  android:windowSoftInputMode=\"adjustPan\"\n            />\n\n        <!--主界面的 Activity-->\n        <activity android:name=\".common.HomeActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\"/>\n                <category android:name=\"android.intent.category.LAUNCHER\"/>\n            </intent-filter>\n        </activity>\n\n        <!--查看图片的播放页面-->\n        <activity android:name=\".meizi.ui.DetailActivity\"/>\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/common/HomeActivity.java",
    "content": "package com.example.developerhaoz.sleephelper.common;\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Build;\nimport android.os.Bundle;\nimport android.support.design.widget.NavigationView;\nimport android.support.v4.app.Fragment;\nimport android.support.v4.view.ViewPager;\nimport android.support.v4.widget.DrawerLayout;\nimport android.support.v7.app.AppCompatActivity;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\n\nimport com.example.developerhaoz.sleephelper.R;\nimport com.example.developerhaoz.sleephelper.common.view.CommonPagerAdapter;\nimport com.example.developerhaoz.sleephelper.common.view.CommonTabBean;\nimport com.example.developerhaoz.sleephelper.diary.bean.DiaryBean;\nimport com.example.developerhaoz.sleephelper.diary.event.StartUpdateDiaryEvent;\nimport com.example.developerhaoz.sleephelper.diary.ui.DiaryFragment;\nimport com.example.developerhaoz.sleephelper.diary.ui.UpdateDiaryActivity;\nimport com.example.developerhaoz.sleephelper.duanzi.ui.DuanziFragment;\nimport com.example.developerhaoz.sleephelper.meizi.ui.MeiziFragment;\nimport com.flyco.tablayout.CommonTabLayout;\nimport com.flyco.tablayout.listener.CustomTabEntity;\nimport com.flyco.tablayout.listener.OnTabSelectListener;\n\nimport org.greenrobot.eventbus.EventBus;\nimport org.greenrobot.eventbus.Subscribe;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport butterknife.Bind;\nimport butterknife.ButterKnife;\n\n\n/**\n * 主页面的 Activity\n * <p>\n * Created by developerHaoz\n */\npublic class HomeActivity extends AppCompatActivity {\n\n    @Bind(R.id.home_view_pager)\n    ViewPager mHomeVp;\n    @Bind(R.id.home_tab_layout)\n    CommonTabLayout mHomeTabLayout;\n    @Bind(R.id.home_dl)\n    DrawerLayout mDrawerLayout;\n    @Bind(R.id.home_navigation_view)\n    NavigationView mNavigationView;\n    @Bind(R.id.home_iv_draw)\n    ImageView mIvDraw;\n    @Bind(R.id.home_tv_title_normal)\n    TextView mTvNormal;\n    @Bind(R.id.home_tv_title_center)\n    TextView mTvCenter;\n    @Bind(R.id.home_iv_menu)\n    ImageView mIvMenu;\n    @Bind(R.id.contacts_tab_rl)\n    LinearLayout mContactsTabRl;\n\n    private static final int[] SELECTED_ICONS = new int[]{R.drawable.diary_selected, R.drawable.duanzi_selected, R.drawable.meizi_selected};\n    private static final int[] UN_SELECTED_ICONS = new int[]{R.drawable.diary_unselected, R.drawable.duanzi_unselected, R.drawable.meizi_unselected};\n    private static final String[] TITLES = new String[]{\"日记\", \"段子\", \"风景\"};\n\n    private List<Fragment> mFragments;\n\n    public static void startActivity(Context context) {\n        Intent intent = new Intent(context, HomeActivity.class);\n        context.startActivity(intent);\n    }\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_home);\n        ButterKnife.bind(this);\n        EventBus.getDefault().register(this);\n        initTabLayout();\n        initVierPager();\n        initToolbar();\n    }\n\n    private void initToolbar() {\n        mIvDraw.setVisibility(View.GONE);\n        mIvMenu.setVisibility(View.GONE);\n        mTvCenter.setVisibility(View.VISIBLE);\n        mTvNormal.setVisibility(View.GONE);\n    }\n\n    private void initVierPager() {\n        mFragments = new ArrayList<>();\n        mFragments.add(DiaryFragment.newInstance());\n        mFragments.add(DuanziFragment.newInstance());\n        mFragments.add(MeiziFragment.newInstance());\n        CommonPagerAdapter adapter = new CommonPagerAdapter(getSupportFragmentManager(), mFragments);\n        mHomeVp.setAdapter(adapter);\n    }\n\n    private void initTabLayout() {\n        ArrayList<CustomTabEntity> tabEntityList = new ArrayList<>();\n        for (int i = 0; i < TITLES.length; i++) {\n            tabEntityList.add(new CommonTabBean(TITLES[i]\n                    , SELECTED_ICONS[i]\n                    , UN_SELECTED_ICONS[i]));\n        }\n\n        mHomeTabLayout.setTabData(tabEntityList);\n        mHomeTabLayout.setOnTabSelectListener(new OnTabSelectListener() {\n            @Override\n            public void onTabSelect(int position) {\n                mHomeVp.setCurrentItem(position);\n            }\n\n            @Override\n            public void onTabReselect(int position) {\n\n            }\n        });\n\n        mHomeVp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {\n            @Override\n            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {\n\n            }\n\n            @Override\n            public void onPageSelected(int position) {\n                mHomeTabLayout.setCurrentTab(position);\n            }\n\n            @Override\n            public void onPageScrollStateChanged(int state) {\n\n            }\n        });\n        mHomeVp.setOffscreenPageLimit(4);\n        mHomeVp.setCurrentItem(1);\n    }\n\n    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)\n    @Subscribe\n    public void startUpdateDiaryActivity(StartUpdateDiaryEvent event) {\n        DiaryBean diaryBean = event.getDiaryBean();\n        String title = diaryBean.getTitle();\n        String content = diaryBean.getContent();\n        String tag = diaryBean.getTag();\n        UpdateDiaryActivity.startActivity(this, title, content, tag);\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        EventBus.getDefault().unregister(this);\n    }\n\n    @Override\n    public void onBackPressed() {\n        super.onBackPressed();\n        // TODO: 在主页面按返回键时弹出对话框，提示用户是否退出程序\n    }\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/common/SingleInstanceTestClass.java",
    "content": "package com.example.developerhaoz.sleephelper.common;\n\n/**\n * Created by developerHaoz on 2017/7/19.\n */\n\npublic class SingleInstanceTestClass {\n\n    private static SingleInstanceTestClass sInstance; // 懒汉式\n    private SingleInstanceTestClass(){\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/common/SleepApplication.java",
    "content": "package com.example.developerhaoz.sleephelper.common;\n\nimport android.app.Application;\nimport android.content.Context;\n\nimport com.android.volley.RequestQueue;\nimport com.android.volley.toolbox.Volley;\n\n/**\n * 自定义的 Application\n *\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class SleepApplication extends Application {\n\n    private static SleepApplication mContext;\n    private static RequestQueue requestQueue;\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        mContext = this;\n        requestQueue = Volley.newRequestQueue(mContext);\n    }\n\n    public static Context getContext(){\n        return mContext;\n    }\n\n    public  RequestQueue getRequestQueue(){\n        if (requestQueue == null){\n            requestQueue = Volley.newRequestQueue(getApplicationContext());\n        }\n        return requestQueue;\n    }\n}"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/common/TestActivity.java",
    "content": "package com.example.developerhaoz.sleephelper.common;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v7.app.AppCompatActivity;\nimport android.widget.ImageView;\n\nimport com.bumptech.glide.Glide;\nimport com.example.developerhaoz.sleephelper.R;\n\nimport butterknife.ButterKnife;\n\n/**\n * 用于测试的 Activity\n * <p>\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class TestActivity extends AppCompatActivity {\n\n    private static final String IMAGE_URL = \"imageUrl\";\n\n    public static void startActivity(Context context, String imageUrl, int position) {\n        Intent intent = new Intent(context, TestActivity.class);\n        intent.putExtra(IMAGE_URL, imageUrl);\n        context.startActivity(intent);\n    }\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_test);\n        ButterKnife.bind(this);\n        ImageView mIvVideo = (ImageView) findViewById(R.id.test_iv_video);\n        Glide.with(this).load(\"http://p3.pstatp.com/large/1fd90000bdf1766aaa29\")\n                .into(mIvVideo);\n\n    }\n\n\n\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/common/net/VolleyHelper.java",
    "content": "package com.example.developerhaoz.sleephelper.common.net;\n\nimport android.content.Context;\n\nimport com.android.volley.RequestQueue;\nimport com.android.volley.Response;\nimport com.android.volley.VolleyError;\nimport com.android.volley.toolbox.StringRequest;\nimport com.android.volley.toolbox.Volley;\n\n/**\n * 利用 Volley 进行网络请求的封装类\n *\n * Created by developerHaoz on 2017/5/5.\n */\n\npublic class VolleyHelper {\n\n    private static String response;\n\n    /**\n     * 用于发送 Get 请求的封装方法\n     *\n     * @param context Activity 的实例\n     * @param url 请求的地址\n     * @param callback 用于网络回调的接口\n     */\n    public static void sendHttpGet(Context context, String url, final VolleyResponseCallback callback){\n        RequestQueue requestQueue = Volley.newRequestQueue(context);\n        StringRequest stringRequest = new StringRequest(url\n                , new Response.Listener<String>() {\n            @Override\n            public void onResponse(String s) {\n                callback.onSuccess(s);\n            }\n        }, new Response.ErrorListener() {\n            @Override\n            public void onErrorResponse(VolleyError error) {\n                callback.onError(error);\n            }\n        });\n        requestQueue.add(stringRequest);\n    }\n\n    public static String sendHttpGet(Context context, String url){\n        RequestQueue requestQueue = Volley.newRequestQueue(context);\n        StringRequest stringRequest = new StringRequest(url\n                , new Response.Listener<String>() {\n            @Override\n            public void onResponse(String s) {\n                response = s;\n            }\n        }, new Response.ErrorListener() {\n            @Override\n            public void onErrorResponse(VolleyError error) {\n\n            }\n        });\n        requestQueue.add(stringRequest);\n        return response;\n    }\n\n\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/common/net/VolleyResponseCallback.java",
    "content": "package com.example.developerhaoz.sleephelper.common.net;\n\nimport com.android.volley.VolleyError;\n\n/**\n * 用于网络请求的回调\n *\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic interface VolleyResponseCallback {\n    void onSuccess(String response);\n    void onError(VolleyError error);\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/common/utils/AppManager.java",
    "content": "package com.example.developerhaoz.sleephelper.common.utils;\n\nimport android.app.ActivityManager;\nimport android.content.Context;\nimport android.support.v7.app.AppCompatActivity;\n\nimport java.util.Stack;\n\n/**\n * Created by developerHaoz on 2017/5/9.\n */\n\npublic class AppManager {\n\n    private static Stack<AppCompatActivity> activityStack;\n    private static AppManager instance;\n\n    private AppManager(){}\n\n    public static AppManager getAppManager(){\n        if(instance == null){\n            synchronized (AppManager.class){\n                if(instance == null){\n                    instance = new AppManager();\n                }\n            }\n        }\n        return instance;\n    }\n\n    public void addActivity(AppCompatActivity activity){\n        if(activityStack == null){\n            activityStack = new Stack<>();\n        }\n        activityStack.add(activity);\n    }\n\n    /**\n     * 获得当前Activity(栈顶Activity)\n     *\n     * @return\n     */\n    public AppCompatActivity currentActivity(){\n\n        if(activityStack == null || activityStack.isEmpty()){\n            return null;\n        }\n        AppCompatActivity acitivity = activityStack.lastElement();\n        return acitivity;\n    }\n\n    public AppCompatActivity findActivity(Class<?> cls){\n        AppCompatActivity activity = null;\n        for (AppCompatActivity appCompatActivity : activityStack) {\n            if(appCompatActivity.getClass().equals(cls)){\n                activity = appCompatActivity;\n                break;\n            }\n        }\n        return activity;\n    }\n\n    public void finishActivity(){\n        AppCompatActivity activity = activityStack.lastElement();\n        finishActivity(activity);\n    }\n\n    public void finishActivity(AppCompatActivity activity){\n        if(activity != null){\n            activityStack.remove(activity);\n            activity.finish();\n            activity = null;\n        }\n    }\n\n    public void finishActivity(Class<?> cls){\n        for (AppCompatActivity activity : activityStack) {\n            if(activity.getClass().equals(cls)){\n                finishActivity(activity);\n            }\n        }\n    }\n\n    public void finishAllActivity(){\n        for (int i = 0, size = activityStack.size(); i < size; i++) {\n            if (null != activityStack.get(i)) {\n                activityStack.get(i).finish();\n            }\n        }\n        activityStack.clear();\n    }\n\n    public void AppExit(Context context){\n        try{\n            finishAllActivity();\n            ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);\n            activityManager.killBackgroundProcesses(context.getPackageName());\n            System.exit(0);\n        }catch (Exception e){\n            e.printStackTrace();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/common/utils/Check.java",
    "content": "package com.example.developerhaoz.sleephelper.common.utils;\n\nimport java.util.Collection;\nimport java.util.Map;\n\n/**\n * 辅助检查对象是否为空\n *\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class Check {\n\n    public static boolean isNull(Object o){\n        return o == null;\n    }\n\n    public static boolean isEmpty(CharSequence str){\n        return isNull(str) || str.length() ==0;\n    }\n\n    public static boolean isEmpty(Object[] objects){\n        return isNull(objects) || objects.length == 0;\n    }\n\n    public static boolean isEmpty(Collection<?> collection){\n        return isNull(collection) || collection.isEmpty();\n    }\n\n    public static boolean isEmpty(Map<?, ?> map){\n        return isNull(map) || map.isEmpty();\n    }\n\n\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/common/utils/GetRandom.java",
    "content": "package com.example.developerhaoz.sleephelper.common.utils;\n\n/**\n * 获取随机数的工具类\n *\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class GetRandom {\n\n    /**\n     * 获取一个 0 到 48 之间的随机整数\n     *\n     * @return 一个 随机整数\n     */\n    public static int getRandom(){\n        double random = Math.random();\n        int result = (int)(random * 50 - 20);\n        return Math.abs(result);\n    }\n\n\n//\n//    /**\n//     * 获取一个 10 到 20 之间的随机整数\n//     *\n//     * @return\n//     */\n//    public static int getRandom20(){\n//        double random = Math.random();\n//        int result = (int)(random * 10 + 10);\n//        return result;\n//    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/common/utils/StatusBarCompat.java",
    "content": "package com.example.developerhaoz.sleephelper.common.utils;\n\nimport android.annotation.TargetApi;\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphics.Color;\nimport android.os.Build;\nimport android.view.View;\nimport android.view.ViewGroup;\n\n/**\n * 修改状态栏的工具类\n *\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class StatusBarCompat\n{\n    private static final int INVALID_VAL = -1;\n    private static final int COLOR_DEFAULT = Color.parseColor(\"#20000000\");\n\n    @TargetApi(Build.VERSION_CODES.LOLLIPOP)\n    public static void compat(Activity activity, int statusColor)\n    {\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)\n        {\n            if (statusColor != INVALID_VAL)\n            {\n                activity.getWindow().setStatusBarColor(statusColor);\n            }\n            return;\n        }\n\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)\n        {\n            int color = COLOR_DEFAULT;\n            ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);\n            if (statusColor != INVALID_VAL)\n            {\n                color = statusColor;\n            }\n            View statusBarView = contentView.getChildAt(0);\n            //改变颜色时避免重复添加statusBarView\n            if (statusBarView != null && statusBarView.getMeasuredHeight() == getStatusBarHeight(activity))\n            {\n                statusBarView.setBackgroundColor(color);\n                return;\n            }\n            statusBarView = new View(activity);\n            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,\n                    getStatusBarHeight(activity));\n            statusBarView.setBackgroundColor(color);\n            contentView.addView(statusBarView, lp);\n        }\n\n    }\n\n    public static void compat(Activity activity)\n    {\n        compat(activity, INVALID_VAL);\n    }\n\n\n    private static int getStatusBarHeight(Context context)\n    {\n        int result = 0;\n        int resourceId = context.getResources().getIdentifier(\"status_bar_height\", \"dimen\", \"android\");\n        if (resourceId > 0)\n        {\n            result = context.getResources().getDimensionPixelSize(resourceId);\n        }\n        return result;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/common/view/CommonPagerAdapter.java",
    "content": "package com.example.developerhaoz.sleephelper.common.view;\n\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\nimport android.support.v4.app.FragmentPagerAdapter;\n\nimport java.util.List;\n\n/**\n * ViewPager + Fragment 通用的 Adapter\n *\n * Created by developerHaoz on 2017/5/2.\n */\n\npublic class CommonPagerAdapter extends FragmentPagerAdapter {\n\n    private List<Fragment> mFragments;\n\n    public CommonPagerAdapter(FragmentManager fragmentManager, List<Fragment> mFragments){\n        super(fragmentManager);\n        this.mFragments = mFragments;\n    }\n\n    @Override\n    public Fragment getItem(int position) {\n        return mFragments.get(position);\n    }\n\n    @Override\n    public int getCount() {\n        return mFragments.size();\n    }\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/common/view/CommonTabBean.java",
    "content": "package com.example.developerhaoz.sleephelper.common.view;\n\nimport com.flyco.tablayout.listener.CustomTabEntity;\n\n/**\n *\n *\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class CommonTabBean implements CustomTabEntity{\n\n    private int selectedIcon;\n    private int unselectedIcon;\n    private String title;\n\n    public CommonTabBean(String title){\n        this.title = title;\n    }\n\n    public CommonTabBean(String title, int selectedIcon, int unselectedIcon) {\n        this.title = title;\n        this.selectedIcon = selectedIcon;\n        this.unselectedIcon = unselectedIcon;\n    }\n\n    @Override\n    public String getTabTitle() {\n        return title;\n    }\n\n    @Override\n    public int getTabSelectedIcon() {\n        return selectedIcon;\n    }\n\n    @Override\n    public int getTabUnselectedIcon() {\n        return unselectedIcon;\n    }\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/common/view/GlideHelper.java",
    "content": "package com.example.developerhaoz.sleephelper.common.view;\n\nimport android.content.Context;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.request.FutureTarget;\nimport com.bumptech.glide.request.target.Target;\n\nimport java.io.File;\nimport java.util.concurrent.ExecutionException;\n\n/**\n * Glide 相关的帮助类\n *\n * Created by developerHaoz on 2017/5/6.\n */\n\npublic class GlideHelper {\n\n    /**\n     * 根据图片的网络地址，拿到使用 Glide 进行缓存后的图片缓存地址\n     * 注意！！！ 该方法要在子线程中调用，否则会出错\n     *\n     * @param imageUrl 图片的网络地址\n     * @return 图片的缓存地址\n     */\n    public static String getImagePathFromCache(String imageUrl, Context context) {\n\n        FutureTarget<File> futureTarget = Glide.with(context)\n                .load(imageUrl)\n                .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);\n        File cacheFile;\n        try {\n            cacheFile = futureTarget.get();\n            return cacheFile.getAbsolutePath();\n        } catch (InterruptedException e) {\n            e.printStackTrace();\n        } catch (ExecutionException e) {\n            e.printStackTrace();\n        }\n        return null;\n    }\n\n\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/diary/bean/DiaryBean.java",
    "content": "package com.example.developerhaoz.sleephelper.diary.bean;\n\n/**\n * 日记的实体类\n *\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class DiaryBean {\n\n    private String date;\n    private String title;\n    private String content;\n    private String tag;\n\n    public DiaryBean(String date, String title, String content, String tag) {\n        this.date = date;\n        this.title = title;\n        this.content = content;\n        this.tag = tag;\n    }\n    public String getTag() {\n        return tag;\n    }\n\n    public String getDate() {\n        return date;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    public String getContent() {\n        return content;\n    }\n\n    public void setContent(String content) {\n        this.content = content;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/diary/db/DiaryDatabaseHelper.java",
    "content": "package com.example.developerhaoz.sleephelper.diary.db;\n\nimport android.content.Context;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.database.sqlite.SQLiteOpenHelper;\n\n/**\n * 数据库的帮助类\n *\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class DiaryDatabaseHelper extends SQLiteOpenHelper{\n\n    private Context mContext;\n\n    private static final String CREATE_DIARY = \"create table Diary(\"\n            + \"id integer primary key autoincrement, \"\n            + \"date text, \"\n            + \"title text, \"\n            + \"tag text, \"\n            + \"content text)\";\n\n    public DiaryDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){\n        super(context, name, factory, version);\n        this.mContext = context;\n    }\n    @Override\n    public void onCreate(SQLiteDatabase db) {\n        db.execSQL(CREATE_DIARY);\n    }\n\n    @Override\n    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\n        db.execSQL(\"drop table if exists Diary\");\n        onCreate(db);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/diary/event/RefreshViewEvent.java",
    "content": "package com.example.developerhaoz.sleephelper.diary.event;\n\n/**\n * 刷新日记界面的事件\n *\n * Created by developerHaoz on 2017/5/5.\n */\n\npublic class RefreshViewEvent {\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/diary/event/StartUpdateDiaryEvent.java",
    "content": "package com.example.developerhaoz.sleephelper.diary.event;\n\nimport com.example.developerhaoz.sleephelper.diary.bean.DiaryBean;\n\n/**\n * 打开「修改日记」的界面\n *\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class StartUpdateDiaryEvent {\n\n    private DiaryBean mDiaryBean;\n\n    public StartUpdateDiaryEvent(DiaryBean diaryBean) {\n        mDiaryBean = diaryBean;\n    }\n\n    public DiaryBean getDiaryBean() {\n        return mDiaryBean;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/diary/ui/AddDiaryActivity.java",
    "content": "package com.example.developerhaoz.sleephelper.diary.ui;\n\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v7.app.AlertDialog;\nimport android.support.v7.app.AppCompatActivity;\nimport android.view.View;\nimport android.widget.EditText;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\n\nimport com.example.developerhaoz.sleephelper.R;\nimport com.example.developerhaoz.sleephelper.diary.db.DiaryDatabaseHelper;\nimport com.example.developerhaoz.sleephelper.diary.utils.GetDate;\nimport com.example.developerhaoz.sleephelper.diary.widget.LinedEditText;\n\nimport butterknife.Bind;\nimport butterknife.ButterKnife;\nimport butterknife.OnClick;\nimport cc.trity.floatingactionbutton.FloatingActionButton;\nimport cc.trity.floatingactionbutton.FloatingActionsMenu;\n\n/**\n * 添加日记的 Activity\n * <p>\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class AddDiaryActivity extends AppCompatActivity {\n\n    @Bind(R.id.add_diary_et_title)\n    EditText mAddDiaryEtTitle;\n    @Bind(R.id.add_diary_et_content)\n    LinedEditText mAddDiaryEtContent;\n    @Bind(R.id.add_diary_fab_back)\n    FloatingActionButton mAddDiaryFabBack;\n    @Bind(R.id.add_diary_fab_add)\n    FloatingActionButton mAddDiaryFabAdd;\n    @Bind(R.id.right_labels)\n    FloatingActionsMenu mRightLabels;\n    @Bind(R.id.home_iv_draw)\n    ImageView mIvDraw;\n    @Bind(R.id.home_tv_title_normal)\n    TextView mTvTitle;\n    @Bind(R.id.home_iv_menu)\n    ImageView mIvMenu;\n    @Bind(R.id.contacts_tab_rl)\n    LinearLayout mContactsTabRl;\n\n    private DiaryDatabaseHelper mHelper;\n\n    public static void startActivity(Context context) {\n        Intent intent = new Intent(context, AddDiaryActivity.class);\n        context.startActivity(intent);\n    }\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_add_diary);\n        ButterKnife.bind(this);\n        Intent intent = getIntent();\n        initToolbar();\n        initView(intent);\n        mHelper = new DiaryDatabaseHelper(this, \"Diary.db\", null, 1);\n    }\n\n    private void initToolbar() {\n        mIvDraw.setImageResource(R.drawable.app_back);\n        mTvTitle.setText(\"添加日记\");\n        mIvMenu.setVisibility(View.GONE);\n    }\n\n    private void initView(Intent intent) {\n        mAddDiaryEtTitle.setText(intent.getStringExtra(\"title\"));\n        mAddDiaryEtContent.setText(intent.getStringExtra(\"content\"));\n    }\n\n\n    @OnClick({R.id.home_iv_draw, R.id.add_diary_et_title, R.id.add_diary_et_content, R.id.add_diary_fab_back, R.id.add_diary_fab_add})\n    public void onClick(View view) {\n        switch (view.getId()) {\n            case R.id.home_iv_draw:\n                backToDiaryFragment();\n            case R.id.add_diary_et_title:\n                break;\n            case R.id.add_diary_et_content:\n                break;\n            case R.id.add_diary_fab_back:\n                String date = GetDate.getDate().toString();\n                String tag = String.valueOf(System.currentTimeMillis());\n                String title = mAddDiaryEtTitle.getText().toString() + \"\";\n                String content = mAddDiaryEtContent.getText().toString() + \"\";\n                if (!title.equals(\"\") || !content.equals(\"\")) {\n                    SQLiteDatabase db = mHelper.getWritableDatabase();\n                    ContentValues values = new ContentValues();\n                    values.put(\"date\", date);\n                    values.put(\"title\", title);\n                    values.put(\"content\", content);\n                    values.put(\"tag\", tag);\n                    db.insert(\"Diary\", null, values);\n                    values.clear();\n                }\n                finish();\n                break;\n            case R.id.add_diary_fab_add:\n                backToDiaryFragment();\n                break;\n        }\n    }\n\n    private void backToDiaryFragment() {\n        final String dateBack = GetDate.getDate().toString();\n        final String titleBack = mAddDiaryEtTitle.getText().toString();\n        final String contentBack = mAddDiaryEtContent.getText().toString();\n        if (!titleBack.isEmpty() || !contentBack.isEmpty()) {\n            AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);\n            alertDialogBuilder.setMessage(\"是否保存日记内容？\").setPositiveButton(\"确定\", new DialogInterface.OnClickListener() {\n                public void onClick(DialogInterface dialog, int which) {\n                    SQLiteDatabase db = mHelper.getWritableDatabase();\n                    ContentValues values = new ContentValues();\n                    values.put(\"date\", dateBack);\n                    values.put(\"title\", titleBack);\n                    values.put(\"content\", contentBack);\n                    db.insert(\"Diary\", null, values);\n                    values.clear();\n                    finish();\n                }\n            }).setNegativeButton(\"取消\", new DialogInterface.OnClickListener() {\n                public void onClick(DialogInterface dialog, int which) {\n                    finish();\n                }\n            }).show();\n        } else {\n            finish();\n        }\n    }\n\n    @Override\n    public void onBackPressed() {\n        super.onBackPressed();\n        finish();\n    }\n\n    @OnClick(R.id.home_iv_draw)\n    public void onViewClicked() {\n        finish();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/diary/ui/DiaryAdapter.java",
    "content": "package com.example.developerhaoz.sleephelper.diary.ui;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\nimport com.example.developerhaoz.sleephelper.R;\nimport com.example.developerhaoz.sleephelper.diary.bean.DiaryBean;\nimport com.example.developerhaoz.sleephelper.diary.event.StartUpdateDiaryEvent;\nimport com.example.developerhaoz.sleephelper.diary.utils.GetDate;\nimport org.greenrobot.eventbus.EventBus;\nimport java.util.List;\n\n/**\n * 日记界面的 Adapter\n *\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class DiaryAdapter extends RecyclerView.Adapter<DiaryAdapter.DiaryViewHolder> {\n\n    private Context mContext;\n    private LayoutInflater mLayoutInflater;\n    private List<DiaryBean> mDiaryBeanList;\n    private int mEditPosition = -1;\n\n    public DiaryAdapter(Context context, List<DiaryBean> mDiaryBeanList){\n        mContext = context;\n        this.mLayoutInflater = LayoutInflater.from(context);\n        this.mDiaryBeanList = mDiaryBeanList;\n    }\n    @Override\n    public DiaryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        return new DiaryViewHolder(mLayoutInflater.inflate(R.layout.item_rv_diary, parent, false));\n    }\n\n    @Override\n    public void onBindViewHolder(final DiaryViewHolder holder, final int position) {\n\n        String dateSystem = GetDate.getDate().toString();\n        if(mDiaryBeanList.get(position).getDate().equals(dateSystem)){\n            holder.mIvCircle.setImageResource(R.drawable.circle_orange);\n        }\n        holder.mTvDate.setText(mDiaryBeanList.get(position).getDate());\n        holder.mTvTitle.setText(mDiaryBeanList.get(position).getTitle());\n        holder.mTvContent.setText(\"       \" + mDiaryBeanList.get(position).getContent());\n        holder.mIvEdit.setVisibility(View.INVISIBLE);\n        if(mEditPosition == position){\n            holder.mIvEdit.setVisibility(View.VISIBLE);\n        }else {\n            holder.mIvEdit.setVisibility(View.GONE);\n        }\n        holder.mLl.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                if(holder.mIvEdit.getVisibility() == View.VISIBLE){\n                    holder.mIvEdit.setVisibility(View.GONE);\n                }else {\n                    holder.mIvEdit.setVisibility(View.VISIBLE);\n                }\n                if(mEditPosition != position){\n                    notifyItemChanged(mEditPosition);\n                }\n                mEditPosition = position;\n            }\n        });\n\n        holder.mIvEdit.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                EventBus.getDefault().post(new StartUpdateDiaryEvent(mDiaryBeanList.get(position)));\n            }\n        });\n    }\n\n    @Override\n    public int getItemCount() {\n        return mDiaryBeanList.size();\n    }\n\n    public static class DiaryViewHolder extends RecyclerView.ViewHolder{\n        TextView mTvDate;\n        TextView mTvTitle;\n        TextView mTvContent;\n        ImageView mIvEdit;\n        LinearLayout mLlTitle;\n        LinearLayout mLl;\n        ImageView mIvCircle;\n        LinearLayout mLlControl;\n        RelativeLayout mRlEdit;\n\n        DiaryViewHolder(View view){\n            super(view);\n            mIvCircle = (ImageView) view.findViewById(R.id.main_iv_circle);\n            mTvDate = (TextView) view.findViewById(R.id.main_tv_date);\n            mTvTitle = (TextView) view.findViewById(R.id.main_tv_title);\n            mTvContent = (TextView) view.findViewById(R.id.main_tv_content);\n            mIvEdit = (ImageView) view.findViewById(R.id.main_iv_edit);\n            mLlTitle = (LinearLayout) view.findViewById(R.id.main_ll_title);\n            mLl = (LinearLayout) view.findViewById(R.id.item_ll);\n            mLlControl = (LinearLayout) view.findViewById(R.id.item_ll_control);\n            mRlEdit = (RelativeLayout) view.findViewById(R.id.item_rl_edit);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/diary/ui/DiaryFragment.java",
    "content": "package com.example.developerhaoz.sleephelper.diary.ui;\n\nimport android.database.Cursor;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.design.widget.FloatingActionButton;\nimport android.support.v4.app.Fragment;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.example.developerhaoz.sleephelper.R;\nimport com.example.developerhaoz.sleephelper.diary.bean.DiaryBean;\nimport com.example.developerhaoz.sleephelper.diary.db.DiaryDatabaseHelper;\nimport com.example.developerhaoz.sleephelper.diary.utils.GetDate;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport butterknife.Bind;\nimport butterknife.ButterKnife;\nimport butterknife.OnClick;\n\n/**\n * 有关日记的 Fragment\n *\n * Created by developerHaoz on 2017/5/2.\n */\n\npublic class DiaryFragment extends Fragment {\n\n    @Bind(R.id.main_iv_circle)\n    ImageView mIvCircle;\n    @Bind(R.id.main_tv_date)\n    TextView mTvDate;\n    @Bind(R.id.main_tv_content)\n    TextView mTvContent;\n    @Bind(R.id.item_ll_control)\n    LinearLayout mLlControl;\n    @Bind(R.id.item_first)\n    LinearLayout mItemFirst;\n    @Bind(R.id.main_rv_show_diary)\n    RecyclerView mRvShowDiary;\n    @Bind(R.id.main_ll_main)\n    LinearLayout mLlMain;\n    @Bind(R.id.main_fab_enter_edit)\n    FloatingActionButton mFabEnterEdit;\n    @Bind(R.id.main_rl_main)\n    RelativeLayout mRlMain;\n    @Bind(R.id.main_ll_date)\n    LinearLayout mLlDate;\n    @Bind(R.id.main_ll_content)\n    LinearLayout mLlContent;\n\n    private List<DiaryBean> mDiaryBeanList;\n    private DiaryDatabaseHelper mDatabaseHelper;\n\n    private static final String DB_DIARY_NAME = \"Diary.db\";\n\n    public static DiaryFragment newInstance() {\n        return new DiaryFragment();\n    }\n\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n        View view = inflater.inflate(R.layout.fragment_diary, container, false);\n        ButterKnife.bind(this, view);\n        mDatabaseHelper = new DiaryDatabaseHelper(getActivity(), DB_DIARY_NAME, null, 1);\n        getDiaryBeanList();\n        initView();\n        return view;\n    }\n\n    private void initView() {\n        mTvDate.setText(GetDate.getDate());\n        mRvShowDiary.setLayoutManager(new LinearLayoutManager(getActivity()));\n        mRvShowDiary.setAdapter(new DiaryAdapter(getActivity(), mDiaryBeanList));\n    }\n\n    private void getDiaryBeanList() {\n        mDiaryBeanList = new ArrayList<>();\n        List<DiaryBean> diaryList = new ArrayList<>();\n        SQLiteDatabase sqliteDatabase = mDatabaseHelper.getWritableDatabase();\n        Cursor cursor = sqliteDatabase.query(\"Diary\", null, null, null, null, null, null);\n\n        if (cursor.moveToFirst()) {\n            do {\n                String date = cursor.getString(cursor.getColumnIndex(\"date\"));\n                String dateSystem = GetDate.getDate().toString();\n                if (date.equals(dateSystem)) {\n                    mLlMain.removeView(mItemFirst);\n                    break;\n                }\n\n            } while (cursor.moveToNext());\n        }\n\n        if (cursor.moveToFirst()) {\n            do {\n                String date = cursor.getString(cursor.getColumnIndex(\"date\"));\n                String title = cursor.getString(cursor.getColumnIndex(\"title\"));\n                String content = cursor.getString(cursor.getColumnIndex(\"content\"));\n                String tag = cursor.getString(cursor.getColumnIndex(\"tag\"));\n                mDiaryBeanList.add(new DiaryBean(date, title, content, tag));\n\n            } while (cursor.moveToNext());\n        }\n        cursor.close();\n\n        for (int i = mDiaryBeanList.size() - 1; i >= 0; i--) {\n            diaryList.add(mDiaryBeanList.get(i));\n        }\n        mDiaryBeanList = diaryList;\n    }\n\n    @Override\n    public void onResume() {\n        super.onResume();\n        getDiaryBeanList();\n        initView();\n\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        ButterKnife.unbind(this);\n    }\n\n    @OnClick(R.id.main_fab_enter_edit)\n    public void onViewClicked() {\n        AddDiaryActivity.startActivity(getActivity());\n    }\n\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/diary/ui/UpdateDiaryActivity.java",
    "content": "package com.example.developerhaoz.sleephelper.diary.ui;\n\nimport android.content.ContentValues;\nimport android.content.Context;\nimport android.content.DialogInterface;\nimport android.content.Intent;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v7.app.AlertDialog;\nimport android.support.v7.app.AppCompatActivity;\nimport android.view.View;\nimport android.widget.EditText;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\n\nimport com.example.developerhaoz.sleephelper.R;\nimport com.example.developerhaoz.sleephelper.common.HomeActivity;\nimport com.example.developerhaoz.sleephelper.diary.db.DiaryDatabaseHelper;\nimport com.example.developerhaoz.sleephelper.diary.event.RefreshViewEvent;\nimport com.example.developerhaoz.sleephelper.diary.utils.GetDate;\nimport com.example.developerhaoz.sleephelper.diary.widget.LinedEditText;\nimport com.orhanobut.logger.Logger;\n\nimport org.greenrobot.eventbus.EventBus;\n\nimport butterknife.Bind;\nimport butterknife.ButterKnife;\nimport butterknife.OnClick;\nimport cc.trity.floatingactionbutton.FloatingActionButton;\nimport cc.trity.floatingactionbutton.FloatingActionsMenu;\n\n/**\n * 修改日记的 Activity\n * <p>\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class UpdateDiaryActivity extends AppCompatActivity {\n\n    @Bind(R.id.update_diary_tv_date)\n    TextView mUpdateDiaryTvDate;\n    @Bind(R.id.update_diary_et_title)\n    EditText mUpdateDiaryEtTitle;\n    @Bind(R.id.update_diary_et_content)\n    LinedEditText mUpdateDiaryEtContent;\n    @Bind(R.id.update_diary_fab_back)\n    FloatingActionButton mUpdateDiaryFabBack;\n    @Bind(R.id.update_diary_fab_add)\n    FloatingActionButton mUpdateDiaryFabAdd;\n    @Bind(R.id.update_diary_fab_delete)\n    FloatingActionButton mUpdateDiaryFabDelete;\n    @Bind(R.id.right_labels)\n    FloatingActionsMenu mRightLabels;\n    @Bind(R.id.update_diary_tv_tag)\n    TextView mTvTag;\n    @Bind(R.id.home_iv_draw)\n    ImageView mIvDraw;\n    @Bind(R.id.home_tv_title_normal)\n    TextView mTvTitle;\n    @Bind(R.id.home_tv_title_center)\n    TextView mTvCenter;\n    @Bind(R.id.home_iv_menu)\n    ImageView mIvMenu;\n    @Bind(R.id.contacts_tab_rl)\n    LinearLayout mContactsTabRl;\n\n    private DiaryDatabaseHelper mHelper;\n\n    public static void startActivity(Context context, String title, String content, String tag) {\n        Intent intent = new Intent(context, UpdateDiaryActivity.class);\n        intent.putExtra(\"title\", title);\n        intent.putExtra(\"content\", content);\n        intent.putExtra(\"tag\", tag);\n        context.startActivity(intent);\n    }\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_update_diary);\n        ButterKnife.bind(this);\n        mHelper = new DiaryDatabaseHelper(this, \"Diary.db\", null, 1);\n        Intent intent = getIntent();\n        initToolbar();\n        initView(intent);\n        String url = \"http://ww3.sinaimg.cn/large/7a8aed7bgw1eswencfur6j20hq0qodhs.jpg\";\n        Logger.d(mIvDraw.getContext() + \" Activity\");\n\n    }\n\n    private void initToolbar() {\n        mIvDraw.setImageResource(R.drawable.app_back);\n        mIvDraw.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                finish();\n            }\n        });\n        mTvTitle.setText(\"修改日记\");\n        mIvMenu.setVisibility(View.GONE);\n    }\n\n    private void initView(Intent intent) {\n        mUpdateDiaryTvDate.setText(\"今天，\" + GetDate.getDate());\n        mUpdateDiaryEtTitle.setText(intent.getStringExtra(\"title\"));\n        mUpdateDiaryEtContent.setText(intent.getStringExtra(\"content\"));\n        mTvTag.setText(intent.getStringExtra(\"tag\"));\n    }\n\n    @OnClick({R.id.home_iv_draw, R.id.update_diary_fab_back, R.id.update_diary_fab_add, R.id.update_diary_fab_delete})\n    public void onClick(View view) {\n        switch (view.getId()) {\n            case R.id.home_iv_draw:\n                finish();\n            case R.id.update_diary_fab_back:\n                showTips();\n                break;\n            case R.id.update_diary_fab_add:\n                SQLiteDatabase dbUpdate = mHelper.getWritableDatabase();\n                ContentValues valuesUpdate = new ContentValues();\n                String title = mUpdateDiaryEtTitle.getText().toString();\n                String content = mUpdateDiaryEtContent.getText().toString();\n                valuesUpdate.put(\"title\", title);\n                valuesUpdate.put(\"content\", content);\n                dbUpdate.update(\"Diary\", valuesUpdate, \"title = ?\", new String[]{title});\n                dbUpdate.update(\"Diary\", valuesUpdate, \"content = ?\", new String[]{content});\n                finish();\n                break;\n            case R.id.update_diary_fab_delete:\n                finish();\n                break;\n        }\n    }\n\n    private void showTips() {\n        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);\n        alertDialogBuilder.setMessage(\"确定要删除该日记吗？\").setPositiveButton(\"确定\", new DialogInterface.OnClickListener() {\n            public void onClick(DialogInterface dialog, int which) {\n                String tag = mTvTag.getText().toString();\n                SQLiteDatabase dbDelete = mHelper.getWritableDatabase();\n                dbDelete.delete(\"Diary\", \"tag = ?\", new String[]{tag});\n                finish();\n                HomeActivity.startActivity(UpdateDiaryActivity.this);\n\n            }\n        }).setNegativeButton(\"取消\", new DialogInterface.OnClickListener() {\n            public void onClick(DialogInterface dialog, int which) {\n            }\n        }).show();\n        EventBus.getDefault().post(new RefreshViewEvent());\n    }\n\n    @Override\n    public void onBackPressed() {\n        super.onBackPressed();\n        finish();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/diary/utils/GetDate.java",
    "content": "package com.example.developerhaoz.sleephelper.diary.utils;\n\nimport java.util.Calendar;\n\n/**\n * 获取当前的日期，格式为：2017 年 5 月 4 日\n *\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class GetDate {\n    public static StringBuilder getDate(){\n\n        StringBuilder stringBuilder = new StringBuilder();\n        Calendar now = Calendar.getInstance();\n        stringBuilder.append(now.get(Calendar.YEAR) + \" 年 \");\n        stringBuilder.append((int)(now.get(Calendar.MONTH) + 1)  + \" 月 \");\n        stringBuilder.append(now.get(Calendar.DAY_OF_MONTH) + \" 日\");\n        return stringBuilder;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/diary/utils/SpHelper.java",
    "content": "package com.example.developerhaoz.sleephelper.diary.utils;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\n\n/**\n * SharedPreferences 的辅助类\n *\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class SpHelper {\n    private static final String SP_NAME = \"sp_name\";\n    private static SpHelper mSpHelper;\n    private Context mAppContext;\n    private SharedPreferences mSharedPreferences;\n    private String info;\n\n    private SpHelper(Context context){\n        mAppContext = context.getApplicationContext();\n    }\n\n    //获取SpHelper的实例\n    public static SpHelper getInstance(Context context){\n        if(mSpHelper == null){\n            synchronized (SpHelper.class){\n                if(mSpHelper == null){\n                    mSpHelper = new SpHelper(context);\n                }\n            }\n        }\n        return mSpHelper;\n    }\n\n    private SharedPreferences getSharePreferences(){\n        if(mSharedPreferences == null){\n            mSharedPreferences = mAppContext.getSharedPreferences(SP_NAME, Context.MODE_APPEND);\n        }\n        return mSharedPreferences;\n    }\n\n    public void setInfo(String info){\n        this.info = info;\n        getSharePreferences().edit().putString(\"info\", info).apply();\n    }\n\n    public String getInfo(){\n        if(info.equals(\"\") || info.length() == 0){\n            info = getSharePreferences().getString(\"info\", \"\");\n        }\n        return info;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/diary/widget/LinedEditText.java",
    "content": "package com.example.developerhaoz.sleephelper.diary.widget;\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Color;\nimport android.graphics.DashPathEffect;\nimport android.graphics.Paint;\nimport android.graphics.PathEffect;\nimport android.os.Build;\nimport android.util.AttributeSet;\n\n/**\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class LinedEditText extends android.support.v7.widget.AppCompatEditText{\n    public LinedEditText(Context context) {\n        super(context);\n        initPaint();\n    }\n\n    public LinedEditText(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        initPaint();\n    }\n\n    public LinedEditText(Context context, AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n        initPaint();\n    }\n\n    private void initPaint() {\n\n    }\n\n    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)\n    @Override\n    protected void onDraw(Canvas canvas) {\n\n        Paint mPaint = new Paint();\n\n        mPaint.setStyle(Paint.Style.STROKE);\n\n        mPaint.setColor(Color.LTGRAY);\n\n        PathEffect effects = new DashPathEffect(new float[]{5, 5, 5, 5}, 5);\n\n        mPaint.setPathEffect(effects);\n\n        int left = getLeft();\n\n        int right = getRight();\n\n        int paddingTop = getPaddingTop();\n\n        int paddingBottom = getPaddingBottom();\n\n        int paddingLeft = getPaddingLeft();\n\n        int paddingRight = getPaddingRight();\n\n        int height = getHeight();\n\n        int lineHeight = getLineHeight();\n\n        int spcingHeight = (int) getLineSpacingExtra();\n\n        int count = (height - paddingTop - paddingBottom) / lineHeight;\n\n        for (int i = 0; i < count; i++) {\n\n            int baseline = lineHeight * (i + 1) + paddingTop - spcingHeight / 2;\n\n            canvas.drawLine(paddingLeft, (int) (baseline * 1.0), right - paddingRight * (int) 1.8, (int) (baseline * 1.0), mPaint);\n\n        }\n        super.onDraw(canvas);\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/duanzi/api/DuanziApi.java",
    "content": "package com.example.developerhaoz.sleephelper.duanzi.api;\n\n/**\n * 有关段子的 Api\n *\n * Created by developerHaoz on 2017/5/7.\n */\n\npublic class DuanziApi {\n\n    public static final String GET_DUANZI = \"http://is.snssdk.com/neihan/stream/mix/v1/?mpic=1&webp=1&essence=1&content_type=-102&message_cursor=-1&am_longitude=110&am_latitude=120&am_city=%E5%8C%97%E4%BA%AC%E5%B8%82&am_loc_time=1489226058493&count=30&min_time=1489205901&screen_width=1450&do00le_col_mode=0&iid=3216590132&device_id=32613520945&ac=wifi&channel=360&aid=7&app_name=joke_essay&version_code=612&version_name=6.1.2&device_platform=android&ssmix=a&device_type=sansung&device_brand=xiaomi&os_api=28&os_version=6.10.1&uuid=326135942187625&openudid=3dg6s95rhg2a3dg5&manifest_version_code=612&resolution=1450*2800&dpi=620&update_version_code=6120\";\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/duanzi/bean/DuanziBean.java",
    "content": "package com.example.developerhaoz.sleephelper.duanzi.bean;\n\nimport com.google.gson.annotations.SerializedName;\n\n/**\n * 段子的实体类\n *\n * Created by developerHaoz on 2017/5/7.\n */\n\npublic class DuanziBean {\n\n    @SerializedName(\"group\")\n    private GroupBean groupBean;\n    private String type;\n\n    public GroupBean getGroupBean() {\n        return groupBean;\n    }\n\n    public void setGroupBean(GroupBean groupBean) {\n        this.groupBean = groupBean;\n    }\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/duanzi/bean/GroupBean.java",
    "content": "package com.example.developerhaoz.sleephelper.duanzi.bean;\n\n/**\n * 段子中实体类\n *\n * Created by developerHaoz on 2017/5/7.\n */\n\npublic class GroupBean {\n\n    private String text;\n    private long id;\n    private UserBean user;\n\n    public String getText() {\n        return text;\n    }\n\n    public long getId() {\n        return id;\n    }\n\n    public UserBean getUser() {\n        return user;\n    }\n\n    public static class UserBean {\n\n        private long user_id;\n        private String name;\n        private String avatar_url;\n\n        public String getName() {\n            return name;\n        }\n\n        public String getAvatar_url() {\n            return avatar_url;\n        }\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/duanzi/ui/DuanziAdapter.java",
    "content": "package com.example.developerhaoz.sleephelper.duanzi.ui;\n\nimport android.support.v4.app.Fragment;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.TextView;\n\nimport com.bumptech.glide.Glide;\nimport com.example.developerhaoz.sleephelper.R;\nimport com.example.developerhaoz.sleephelper.common.utils.Check;\nimport com.example.developerhaoz.sleephelper.duanzi.bean.DuanziBean;\n\nimport java.util.List;\n\nimport de.hdodenhof.circleimageview.CircleImageView;\n\n/**\n * 段子界面的 Adapter\n *\n * Created by developerHaoz on 2017/5/7.\n */\n\npublic class DuanziAdapter extends RecyclerView.Adapter<DuanziAdapter.DuanziViewHolder>{\n\n    private  OnItemClickCallback mCallback;\n\n    public interface OnItemClickCallback{\n        void onItemClick(int position);\n    }\n\n    private Fragment mFragment;\n    private List<DuanziBean> mDuanziBeanList;\n\n    public DuanziAdapter(Fragment fragment, List<DuanziBean> duanziBeanList, OnItemClickCallback callback){\n        this.mFragment = fragment;\n        this.mDuanziBeanList = duanziBeanList;\n        this.mCallback = callback;\n    }\n\n    @Override\n    public DuanziViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_duanzi, null);\n        return new DuanziViewHolder(view);\n    }\n\n    @Override\n    public void onBindViewHolder(DuanziViewHolder holder, int position) {\n        RecyclerView rvTest = (RecyclerView) holder.itemView.getParent();\n        try {\n            DuanziBean duanziBean = mDuanziBeanList.get(position);\n            if (!Check.isEmpty(duanziBean.getGroupBean().getUser().getAvatar_url())) {\n                Glide.with(mFragment).load(duanziBean.getGroupBean().getUser().getAvatar_url()).into(holder.mCivAvatar);\n            }\n            holder.mTvContent.setText(duanziBean.getGroupBean().getText());\n            holder.mTvAuthor.setText(duanziBean.getGroupBean().getUser().getName());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    @Override\n    public int getItemCount() {\n        return mDuanziBeanList.size();\n    }\n\n      class DuanziViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{\n\n        private CircleImageView mCivAvatar;\n        private TextView mTvAuthor;\n        private TextView mTvContent;\n\n        public DuanziViewHolder(View itemView) {\n            super(itemView);\n            mCivAvatar = (CircleImageView) itemView.findViewById(R.id.duanzi_civ_avatar);\n            mTvAuthor = (TextView) itemView.findViewById(R.id.duanzi_tv_author);\n            mTvContent = (TextView) itemView.findViewById(R.id.duanzi_tv_content);\n        }\n\n        @Override\n        public void onClick(View v) {\n            mCallback.onItemClick(getAdapterPosition());\n        }\n    }\n\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/duanzi/ui/DuanziFragment.java",
    "content": "package com.example.developerhaoz.sleephelper.duanzi.ui;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v4.app.Fragment;\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.Toast;\n\nimport com.android.volley.VolleyError;\nimport com.example.developerhaoz.sleephelper.R;\nimport com.example.developerhaoz.sleephelper.common.net.VolleyHelper;\nimport com.example.developerhaoz.sleephelper.common.net.VolleyResponseCallback;\nimport com.example.developerhaoz.sleephelper.duanzi.api.DuanziApi;\nimport com.example.developerhaoz.sleephelper.duanzi.bean.DuanziBean;\nimport com.example.developerhaoz.sleephelper.duanzi.utils.GsonHelper;\nimport com.orhanobut.logger.Logger;\n\nimport java.util.List;\n\nimport butterknife.Bind;\nimport butterknife.ButterKnife;\n\n/**\n * 有关段子的 Fragment\n *\n * Created by developerHaoz on 2017/5/2.\n */\n\npublic class DuanziFragment extends Fragment implements DuanziAdapter.OnItemClickCallback{\n\n    @Bind(R.id.duanzi_rv_show_duanzi)\n    RecyclerView mRvShowDuanzi;\n    @Bind(R.id.duanzi_refresh)\n    SwipeRefreshLayout mRefresh;\n\n    public static DuanziFragment newInstance() {\n        return new DuanziFragment();\n    }\n\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n        View view = inflater.inflate(R.layout.fragment_duanzi, container, false);\n        ButterKnife.bind(this, view);\n        initView();\n        initRefresh();\n        return view;\n    }\n\n    private void initRefresh() {\n        mRefresh.setColorSchemeResources(R.color.colorPrimary);\n        mRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                initView();\n                mRefresh.setRefreshing(false);\n            }\n        });\n    }\n\n    private void initView() {\n        VolleyHelper.sendHttpGet(getActivity(), DuanziApi.GET_DUANZI, new VolleyResponseCallback() {\n            @Override\n            public void onSuccess(String response) {\n                List<DuanziBean> mDuanziBeanList = GsonHelper.getDuanziBeanList(response);\n                if(mDuanziBeanList.size() > 4){\n                    mDuanziBeanList.remove(3);\n                }\n                mRvShowDuanzi.setLayoutManager(new LinearLayoutManager(getActivity()));\n                mRvShowDuanzi.setAdapter(new DuanziAdapter(DuanziFragment.this, mDuanziBeanList, DuanziFragment.this));\n            }\n\n            @Override\n            public void onError(VolleyError error) {\n                Logger.d(error);\n            }\n        });\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        ButterKnife.unbind(this);\n    }\n\n    @Override\n    public void onItemClick(int position) {\n        Toast.makeText(getActivity(), position, Toast.LENGTH_SHORT).show();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/duanzi/utils/GsonHelper.java",
    "content": "package com.example.developerhaoz.sleephelper.duanzi.utils;\n\nimport com.example.developerhaoz.sleephelper.duanzi.bean.DuanziBean;\nimport com.google.gson.Gson;\nimport com.google.gson.reflect.TypeToken;\n\nimport org.json.JSONException;\nimport org.json.JSONObject;\n\nimport java.lang.reflect.Type;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * 用于 Json 解析的帮助类\n *\n * Created by developerHaoz on 2017/5/7.\n */\n\npublic class GsonHelper {\n\n    public static List<DuanziBean> getDuanziBeanList(String response){\n\n        List<DuanziBean> mDuanziBeanList = new ArrayList<>();\n        try {\n            JSONObject jsonObject = new JSONObject(response);\n            String dataArrayStr = jsonObject.getJSONObject(\"data\").getString(\"data\");\n            Type type = new TypeToken<List<DuanziBean>>(){}.getType();\n            Gson gson = new Gson();\n            mDuanziBeanList = gson.fromJson(dataArrayStr, type);\n            return mDuanziBeanList;\n        } catch (JSONException e) {\n            e.printStackTrace();\n        }\n        return mDuanziBeanList;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/meizi/api/MeiziApi.java",
    "content": "package com.example.developerhaoz.sleephelper.meizi.api;\n\nimport android.content.Context;\n\nimport com.android.volley.RequestQueue;\nimport com.android.volley.Response;\nimport com.android.volley.VolleyError;\nimport com.android.volley.toolbox.StringRequest;\nimport com.android.volley.toolbox.Volley;\nimport com.example.developerhaoz.sleephelper.common.SleepApplication;\nimport com.example.developerhaoz.sleephelper.common.utils.GetRandom;\nimport com.example.developerhaoz.sleephelper.meizi.bean.MeiziBean;\nimport com.orhanobut.logger.Logger;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.Random;\n\n/**\n * 获取妹子图的 Api\n *\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class MeiziApi {\n\n    private static String meiziData = \"\";\n    private static final int IMAGE_AMOUNT= 20;\n\n\n    public final static String[] imageUrls = new String[] {\n            \"http://img.my.csdn.net/uploads/201309/01/1378037235_3453.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037235_7476.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037235_9280.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037234_3539.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037234_6318.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037194_2965.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037193_1687.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037193_1286.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037192_8379.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037178_9374.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037177_1254.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037177_6203.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037152_6352.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037151_9565.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037151_7904.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037148_7104.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037129_8825.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037128_5291.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037128_3531.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037127_1085.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037095_7515.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037094_8001.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037093_7168.jpg\",\n            \"http://img.my.csdn.net/uploads/201309/01/1378037091_4950.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949643_6410.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949642_6939.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949630_4505.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949630_4593.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949629_7309.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949629_8247.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949615_1986.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949614_8482.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949614_3743.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949614_4199.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949599_3416.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949599_5269.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949598_7858.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949598_9982.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949578_2770.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949578_8744.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949577_5210.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949577_1998.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949482_8813.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949481_6577.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949480_4490.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949455_6792.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949455_6345.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949442_4553.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949441_8987.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949441_5454.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949454_6367.jpg\",\n            \"http://img.my.csdn.net/uploads/201308/31/1377949442_4562.jpg\" };\n\n\n    /**\n     * 返回一个随机生成的妹子 Api\n     *\n     * @return meizi Api\n     */\n    public static String getMeiziApi(){\n        StringBuilder meiziApi = new StringBuilder();\n        meiziApi.append(\"http://gank.io/api/data/%E7%A6%8F%E5%88%A9/\").append(\"15\").append(\"/\" + GetRandom.getRandom());\n        return String.valueOf(meiziApi);\n    }\n\n    public static List<MeiziBean> getMeiziBeanList(){\n        List<MeiziBean> meiziBeanList = new ArrayList<>();\n        List<Integer> randomIntList = new ArrayList<>();\n        for (int i = 0; i < IMAGE_AMOUNT; i++) {\n            randomIntList.add(getRandom(IMAGE_AMOUNT));\n            meiziBeanList.add(new MeiziBean(imageUrls[getRandom(IMAGE_AMOUNT)]));\n        }\n\n        return meiziBeanList;\n    }\n\n    /**\n     * 获取一个小于 IMAGE_AMOUNT\n     *\n     * @return\n     */\n    private static int getRandom(int size){\n        Random random = new Random();\n        float randomInt = random.nextFloat();\n        return Integer.valueOf((int) (randomInt * size));\n    }\n\n    public static String getMeiziData(Context context){\n        String url = getMeiziApi();\n        RequestQueue requestQueue = Volley.newRequestQueue(context);\n        StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {\n            @Override\n            public void onResponse(String s) {\n                meiziData = s;\n            }\n        }, new Response.ErrorListener() {\n            @Override\n            public void onErrorResponse(VolleyError error) {\n                Logger.d(error);\n            }\n        });\n        SleepApplication sleepApplication = new SleepApplication();\n        requestQueue.add(stringRequest);\n        return meiziData;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/meizi/bean/MeiziBean.java",
    "content": "package com.example.developerhaoz.sleephelper.meizi.bean;\n\nimport com.google.gson.annotations.SerializedName;\n\n/**\n * 妹子的实体类\n *\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class MeiziBean {\n\n    @SerializedName(\"_id\")\n    private String id;\n    @SerializedName(\"url\")\n    private String imageUrl;\n    @SerializedName(\"who\")\n    private String who;\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getImageUrl() {\n        return imageUrl;\n    }\n\n    public void setImageUrl(String imageUrl){\n        this.imageUrl = imageUrl;\n    }\n\n    public MeiziBean(String imageUrl){\n        this.imageUrl = imageUrl;\n    }\n\n    public MeiziBean(){\n\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/meizi/event/MeiziBeanListEvent.java",
    "content": "package com.example.developerhaoz.sleephelper.meizi.event;\n\nimport com.example.developerhaoz.sleephelper.meizi.bean.MeiziBean;\n\nimport java.util.List;\n\n/**\n * 包含妹子信息的 Event\n *\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class MeiziBeanListEvent {\n\n    private List<MeiziBean> mMeiziBeanList;\n\n    public MeiziBeanListEvent(List<MeiziBean> meiziBeanList) {\n        mMeiziBeanList = meiziBeanList;\n    }\n    public List<MeiziBean> getMeiziBeanList() {\n        return mMeiziBeanList;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/meizi/ui/DetailActivity.java",
    "content": "package com.example.developerhaoz.sleephelper.meizi.ui;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v4.app.Fragment;\nimport android.support.v4.view.ViewPager;\nimport android.support.v7.app.AppCompatActivity;\n\nimport com.example.developerhaoz.sleephelper.R;\nimport com.example.developerhaoz.sleephelper.common.utils.Check;\nimport com.example.developerhaoz.sleephelper.common.view.CommonPagerAdapter;\nimport com.example.developerhaoz.sleephelper.common.view.GlideHelper;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport java.util.concurrent.Callable;\n\nimport bolts.Continuation;\nimport bolts.Task;\nimport butterknife.Bind;\nimport butterknife.ButterKnife;\n\n/**\n * 查看大图的 Activity\n *\n * Created by developerHaoz on 2017/5/5.\n */\n\npublic class DetailActivity extends AppCompatActivity {\n\n    /**\n     * 保存图片网络地址的 List\n     */\n    private List<String> mImageUrlList;\n\n    /**\n     * ViewPager 中所有的 Fragment\n     */\n    private List<Fragment> mFragments;\n\n    /**\n     * 保存图片缓存地址的 List\n     */\n    private List<String> mCachePathList;\n\n    private static final String IMAGE_URL_LIST = \"imageUrlList\";\n    private static final String POSITION = \"position\";\n\n    @Bind(R.id.detail_vp_show_photo)\n    ViewPager mVpShowPhoto;\n\n    public static void startActivity(Context context, ArrayList<String> imageUrlList, int position) {\n        Intent intent = new Intent(context, DetailActivity.class);\n        Bundle bundle = new Bundle();\n        bundle.putStringArrayList(IMAGE_URL_LIST, imageUrlList);\n        bundle.putInt(POSITION, position);\n        intent.putExtras(bundle);\n        context.startActivity(intent);\n    }\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_detail);\n        ButterKnife.bind(this);\n        Bundle bundle = getIntent().getExtras();\n        mImageUrlList = new ArrayList<>();\n        mFragments = new ArrayList<>();\n        mCachePathList = new ArrayList<>();\n        int position = getIntent().getIntExtra(POSITION, -1);\n        mImageUrlList = getIntent().getStringArrayListExtra(IMAGE_URL_LIST);\n        initViewWithCache(position);\n    }\n\n    /**\n     * 通过图片的缓存地址来初始化界面\n     */\n    private void initViewWithCache(final int position) {\n        Task.call(new Callable<List<String>>() {\n            @Override\n            public List<String> call() throws Exception {\n                for (String imageUrl : mImageUrlList) {\n                    mCachePathList.add(GlideHelper.getImagePathFromCache(imageUrl, DetailActivity.this));\n                }\n                return mCachePathList;\n            }\n        }, Task.BACKGROUND_EXECUTOR).continueWith(new Continuation<List<String>, Object>() {\n            @Override\n            public Object then(Task<List<String>> task) throws Exception {\n                List<String> mCachePathList = task.getResult();\n                if(!Check.isEmpty(mCachePathList)){\n                    for (String cachePath : mCachePathList) {\n                        DetailFragment fragment = DetailFragment.newInstance(cachePath);\n                        mFragments.add(fragment);\n                    }\n                    CommonPagerAdapter adapter = new CommonPagerAdapter(getSupportFragmentManager(), mFragments);\n                    mVpShowPhoto.setAdapter(adapter);\n                    mVpShowPhoto.setCurrentItem(position);\n                }\n                return null;\n            }\n        }, Task.UI_THREAD_EXECUTOR);\n    }\n\n    @Override\n    public void onBackPressed() {\n        super.onBackPressed();\n        finish();\n    }\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/meizi/ui/DetailFragment.java",
    "content": "package com.example.developerhaoz.sleephelper.meizi.ui;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v4.app.Fragment;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.bumptech.glide.Glide;\nimport com.example.developerhaoz.sleephelper.R;\n\nimport butterknife.Bind;\nimport butterknife.ButterKnife;\nimport uk.co.senab.photoview.PhotoView;\nimport uk.co.senab.photoview.PhotoViewAttacher;\n\n/**\n * 显示大图的 Fragment\n *\n * Created by developerHaoz on 2017/5/5.\n */\n\npublic class DetailFragment extends Fragment {\n\n    private static final String IMAGE_URL = \"imageUrl\";\n    @Bind(R.id.detail_pv_show_photo)\n    PhotoView mPvShowPhoto;\n\n    public static DetailFragment newInstance(String imageUrl) {\n        DetailFragment fragment = new DetailFragment();\n        Bundle bundle = new Bundle();\n        bundle.putString(IMAGE_URL, imageUrl);\n        fragment.setArguments(bundle);\n        return fragment;\n    }\n\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n        View view = inflater.inflate(R.layout.fragment_detail, container, false);\n        ButterKnife.bind(this, view);\n        Bundle bundle = getArguments();\n        String imageUrl = bundle.getString(IMAGE_URL);\n        Glide.with(this).load(imageUrl).into(mPvShowPhoto);\n        mPvShowPhoto.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() {\n            @Override\n            public void onPhotoTap(View view, float v, float v1) {\n                getActivity().finish();\n            }\n\n            @Override\n            public void onOutsidePhotoTap() {\n\n            }\n        });\n        return view;\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        ButterKnife.unbind(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/meizi/ui/MeiziAdapter.java",
    "content": "package com.example.developerhaoz.sleephelper.meizi.ui;\n\nimport android.support.v4.app.Fragment;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.load.engine.DiskCacheStrategy;\nimport com.example.developerhaoz.sleephelper.R;\nimport com.example.developerhaoz.sleephelper.meizi.bean.MeiziBean;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * MeiziFragment 的 Adapter\n *\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class MeiziAdapter extends RecyclerView.Adapter<MeiziAdapter.MeiziViewHolder> {\n\n    private List<MeiziBean> mMeiziBeanList;\n    private Fragment mFragment;\n\n    public MeiziAdapter(List<MeiziBean> mMeiziBeanList, Fragment mFragment){\n        this.mMeiziBeanList = mMeiziBeanList;\n        this.mFragment = mFragment;\n    }\n\n    @Override\n    public MeiziViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_meizi, null);\n        return new MeiziViewHolder(view);\n    }\n\n    @Override\n    public void onBindViewHolder(MeiziViewHolder holder, final int position) {\n\n        Glide.with(mFragment)\n                .load(mMeiziBeanList.get(position).getImageUrl())\n                .fitCenter()\n                .dontAnimate()\n                .diskCacheStrategy(DiskCacheStrategy.ALL)\n                .into(holder.mIvMeizi);\n\n        holder.mIvMeizi.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                ArrayList<String> resultList = new ArrayList<String>();\n                for (MeiziBean meiziBean : mMeiziBeanList) {\n                    resultList.add(meiziBean.getImageUrl());\n                }\n                DetailActivity.startActivity(mFragment.getActivity(), resultList, position);\n\n            }\n        });\n\n    }\n\n    @Override\n    public int getItemCount() {\n        if(mMeiziBeanList.size() > 0){\n            return mMeiziBeanList.size();\n        }\n        return 0;\n    }\n\n    public static class MeiziViewHolder extends RecyclerView.ViewHolder{\n\n        ImageView mIvMeizi;\n\n        public MeiziViewHolder(View itemView) {\n            super(itemView);\n            mIvMeizi = (ImageView) itemView.findViewById(R.id.item_iv_meizi);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/meizi/ui/MeiziFragment.java",
    "content": "package com.example.developerhaoz.sleephelper.meizi.ui;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v4.app.Fragment;\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.support.v7.widget.RecyclerView;\nimport android.support.v7.widget.StaggeredGridLayoutManager;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.example.developerhaoz.sleephelper.R;\nimport com.example.developerhaoz.sleephelper.meizi.api.MeiziApi;\nimport com.example.developerhaoz.sleephelper.meizi.bean.MeiziBean;\n\nimport java.util.ArrayList;\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\nimport butterknife.Bind;\nimport butterknife.ButterKnife;\n\n/**\n * 有关妹子的 Fragment\n * <p>\n * Created by developerHaoz on 2017/5/2.\n */\n\npublic class MeiziFragment extends Fragment {\n\n    @Bind(R.id.meizi_rv_show_meizi)\n    RecyclerView mRvShowMeizi;\n    @Bind(R.id.meizi_refresh)\n    SwipeRefreshLayout mRefresh;\n\n    List<MeiziBean> meiziBeanList = new ArrayList<>();\n    private static String response = \"\";\n\n    public static MeiziFragment newInstance() {\n        return new MeiziFragment();\n    }\n\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n        View view = inflater.inflate(R.layout.fragment_meizi, container, false);\n        ButterKnife.bind(this, view);\n        initView();\n        refreshMeizi();\n        return view;\n    }\n\n    /**\n     * 刷新当前界面\n     */\n    private void refreshMeizi() {\n        mRefresh.setColorSchemeResources(R.color.colorPrimary);\n        mRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                initView();\n                mRefresh.setRefreshing(false);\n            }\n        });\n    }\n\n    private void initView() {\n\n        Set<MeiziBean> meiziSet = new HashSet<>();\n        meiziSet.addAll(MeiziApi.getMeiziBeanList());\n        meiziBeanList.clear();\n        meiziBeanList.addAll(meiziSet);\n        Collections.shuffle(meiziBeanList);\n        mRvShowMeizi.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));\n        mRvShowMeizi.setAdapter(new MeiziAdapter(meiziBeanList, MeiziFragment.this));\n\n//        VolleyHelper.sendHttpGet(getActivity(), MeiziApi.getMeiziApi(), new VolleyResponseCallback() {\n//            @Override\n//            public void onSuccess(String s) {\n//                response = s;\n//                meiziBeanList = GsonHelper.getMeiziBean(response);\n//                mRvShowMeizi.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));\n//                Collections.shuffle(meiziBeanList);\n//                mRvShowMeizi.setAdapter(new MeiziAdapter(meiziBeanList, MeiziFragment.this));\n//            }\n//\n//            @Override\n//            public void onError(VolleyError error) {\n//                Logger.d(error);\n//            }\n//        });\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        ButterKnife.unbind(this);\n    }\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "app/src/main/java/com/example/developerhaoz/sleephelper/meizi/utils/GsonHelper.java",
    "content": "package com.example.developerhaoz.sleephelper.meizi.utils;\n\nimport com.example.developerhaoz.sleephelper.meizi.bean.MeiziBean;\nimport com.google.gson.Gson;\nimport com.google.gson.reflect.TypeToken;\n\nimport org.json.JSONException;\nimport org.json.JSONObject;\n\nimport java.lang.reflect.Type;\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Gson 的处理类\n *\n * Created by developerHaoz on 2017/5/3.\n */\n\npublic class GsonHelper {\n\n    /**\n     * 将一个 String 类型的数据解析成一个 List<MeiziBean>\n     *\n     * @param response 包含妹子信息的 String\n     * @return List<MeiziBean>\n     */\n    public static List<MeiziBean> getMeiziBean(String response){\n        List<MeiziBean> meiziBeanList = new ArrayList<>();\n        try {\n            JSONObject jsonObject = new JSONObject(response);\n                String meiziArrayStr = jsonObject.getString(\"results\");\n                Type meiziListType = new TypeToken<List<MeiziBean>>(){}.getType();\n                Gson gson = new Gson();\n                meiziBeanList = gson.fromJson(meiziArrayStr, meiziListType);\n\n        } catch (JSONException e) {\n            e.printStackTrace();\n        }\n        return meiziBeanList;\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/res/drawable/linear_style.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <!-- 边框颜色值 --><item>\n    <shape>\n        <solid android:color=\"#a3a8a4\" />\n    </shape>\n</item>\n    <!-- 主体背景颜色值 -->\n    <item android:right=\"1dp\">\n        <shape>\n            <solid android:color=\"#ffffff\" />\n            <padding android:bottom=\"10dp\"\n                     android:left=\"10dp\"\n                     android:right=\"10dp\"\n                     android:top=\"10dp\" />\n        </shape>\n    </item>\n</layer-list>"
  },
  {
    "path": "app/src/main/res/drawable/shape_add_diary_title.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=\"#FFFFFF\"/>\n\n    <stroke\n        android:width=\"0.5dp\"\n        android:color=\"#dddddd\"/>\n\n    <padding\n        android:bottom=\"10dp\"\n        android:left=\"10dp\"\n        android:right=\"10dp\"\n        android:top=\"10dp\"/>\n\n    <corners android:radius=\"10dp\"/>\n\n</shape>"
  },
  {
    "path": "app/src/main/res/layout/activity_add_diary.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              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:orientation=\"vertical\"\n    >\n\n    <include layout=\"@layout/layout_app_toolbar\"/>\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingTop=\"20dp\"\n        android:paddingBottom=\"20dp\"\n        android:paddingLeft=\"20dp\"\n\n        >\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\"\n            android:paddingRight=\"20dp\"\n            >\n\n            <EditText\n                android:id=\"@+id/add_diary_et_title\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"40dp\"\n                android:background=\"@drawable/shape_add_diary_title\"\n                android:enabled=\"true\"\n                android:gravity=\"top\"\n                android:maxLines=\"10\"\n                android:minLines=\"8\"\n                android:paddingLeft=\"20dp\"\n                android:paddingRight=\"20dp\"\n                android:scrollbars=\"vertical\"\n                />\n\n            <TextView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"20dp\"/>\n\n            <com.example.developerhaoz.sleephelper.diary.widget.LinedEditText\n                android:id=\"@+id/add_diary_et_content\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"0dp\"\n                android:layout_weight=\"1\"\n                android:background=\"@drawable/shape_add_diary_title\"\n                android:enabled=\"true\"\n                android:gravity=\"top\"\n                android:lineSpacingExtra=\"5dp\"\n                android:maxLines=\"10\"\n                android:minLines=\"8\"\n                android:paddingLeft=\"20dp\"\n                android:paddingRight=\"20dp\"\n                android:paddingTop=\"10dp\"\n                android:scrollbars=\"vertical\"\n                android:textSize=\"17sp\"\n                />\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"95dp\">\n\n\n            </LinearLayout>\n\n        </LinearLayout>\n\n\n        <cc.trity.floatingactionbutton.FloatingActionsMenu\n            android:id=\"@+id/right_labels\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_alignParentStart=\"true\"\n            app:fab_expandDirection=\"right\"\n            app:fab_colorNormal=\"#f0f01a\"\n            app:fab_icon = \"@drawable/menu\"\n            app:fab_addButtonSize=\"mini\"\n            >\n\n            <cc.trity.floatingactionbutton.FloatingActionButton\n                android:id=\"@+id/add_diary_fab_back\"\n                android:layout_width=\"50dp\"\n                android:layout_height=\"50dp\"\n                app:fab_colorNormal=\"#24d63c\"\n                app:fab_size=\"normal\"\n                app:fab_icon = \"@drawable/save_new\"\n                />\n\n            <cc.trity.floatingactionbutton.FloatingActionButton\n                android:id=\"@+id/add_diary_fab_add\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"40dp\"\n                android:background=\"@drawable/save\"\n                app:fab_size=\"normal\"\n                app:fab_title=\"FAB 2\"\n                app:fab_colorNormal=\"#e41c1c\"\n                app:fab_icon = \"@drawable/back_new\"\n                />\n\n            />\n\n\n        </cc.trity.floatingactionbutton.FloatingActionsMenu>\n\n    </RelativeLayout>\n</LinearLayout>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "app/src/main/res/layout/activity_detail.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:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:background=\"@color/black\"\n\n    >\n\n    <android.support.v4.view.ViewPager\n        android:id=\"@+id/detail_vp_show_photo\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n    </android.support.v4.view.ViewPager>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_home.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v4.widget.DrawerLayout\n    android:id=\"@+id/home_dl\"\n    android:layout_height=\"match_parent\"\n    android:layout_width=\"match_parent\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        >\n        \n        <include layout=\"@layout/layout_app_toolbar\"/>\n        \n        <android.support.v4.view.ViewPager\n            android:id=\"@+id/home_view_pager\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"0dp\"\n            android:layout_weight=\"1\"\n            ></android.support.v4.view.ViewPager>\n        \n        <com.flyco.tablayout.CommonTabLayout\n            android:id=\"@+id/home_tab_layout\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"55dp\"\n            android:background=\"#f6f6f1\"\n            app:tl_iconGravity=\"TOP\"\n            app:tl_iconHeight=\"25dp\"\n            app:tl_iconWidth=\"30dp\"\n            app:tl_indicator_color=\"@color/white\"\n            app:tl_textSelectColor=\"@color/colorPrimary\"\n            app:tl_textUnselectColor=\"@color/gray_black\"\n            app:tl_textsize=\"13sp\"\n            />\n\n    </LinearLayout>\n\n    <android.support.design.widget.NavigationView\n        android:id=\"@+id/home_navigation_view\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"start\"\n        android:fitsSystemWindows=\"true\"\n        app:headerLayout=\"@layout/layout_home_header\"\n        app:menu=\"@menu/menu_me\"\n        >\n    </android.support.design.widget.NavigationView>\n\n</android.support.v4.widget.DrawerLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_test.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:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\">\n\n\n    <ImageView\n        android:id=\"@+id/test_iv_video\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"/>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_update_diary.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              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:orientation=\"vertical\"\n    >\n\n    <include layout=\"@layout/layout_app_toolbar\"/>\n\n    <TextView\n        android:id=\"@+id/update_diary_tv_tag\"\n        android:layout_width=\"0.001dp\"\n        android:layout_height=\"0.001dp\"\n        android:text=\"sdafaf\"\n        />\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\"\n        android:paddingTop=\"20dp\"\n        android:paddingBottom=\"20dp\"\n        android:paddingLeft=\"20dp\"\n        >\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:orientation=\"vertical\"\n            android:paddingRight=\"20dp\"\n            >\n\n            <TextView\n                android:id=\"@+id/update_diary_tv_date\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"30dp\"\n                android:gravity=\"center_vertical\"\n                android:paddingRight=\"5dp\"\n                android:text=\"今天，2017年01月19日\"\n                android:textSize=\"15sp\"\n                />\n\n\n\n            <EditText\n                android:id=\"@+id/update_diary_et_title\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"50dp\"\n                android:background=\"@drawable/shape_add_diary_title\"\n                android:enabled=\"true\"\n                android:gravity=\"top\"\n                android:maxLines=\"10\"\n                android:minLines=\"8\"\n                android:paddingLeft=\"20dp\"\n                android:paddingRight=\"20dp\"\n                android:scrollbars=\"vertical\"\n                />\n\n            <TextView\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"20dp\"/>\n\n            <com.example.developerhaoz.sleephelper.diary.widget.LinedEditText\n                android:id=\"@+id/update_diary_et_content\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"0dp\"\n                android:layout_weight=\"1\"\n                android:background=\"@drawable/shape_add_diary_title\"\n                android:enabled=\"true\"\n                android:gravity=\"top\"\n                android:lineSpacingExtra=\"5dp\"\n                android:maxLines=\"10\"\n                android:minLines=\"8\"\n                android:paddingLeft=\"20dp\"\n                android:paddingRight=\"20dp\"\n                android:paddingTop=\"10dp\"\n                android:scrollbars=\"vertical\"\n                android:textSize=\"17sp\"\n                />\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"95dp\">\n\n\n            </LinearLayout>\n\n        </LinearLayout>\n\n\n        <cc.trity.floatingactionbutton.FloatingActionsMenu\n            android:id=\"@+id/right_labels\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_alignParentStart=\"true\"\n            app:fab_expandDirection=\"right\"\n            app:fab_addButtonSize=\"mini\"\n            >\n\n            <cc.trity.floatingactionbutton.FloatingActionButton\n                android:id=\"@+id/update_diary_fab_back\"\n                android:layout_width=\"40dp\"\n                android:layout_height=\"40dp\"\n                app:fab_size=\"normal\"\n                app:fab_icon = \"@drawable/delete_new\"\n                app:fab_colorNormal=\"#ee0d18\"\n                />\n\n            <cc.trity.floatingactionbutton.FloatingActionButton\n                android:id=\"@+id/update_diary_fab_add\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@drawable/save\"\n                app:fab_size=\"normal\"\n                app:fab_title=\"FAB 2\"\n                app:fab_icon = \"@drawable/save_new\"\n                app:fab_colorNormal=\"#40a30a\"\n\n                />\n\n            <cc.trity.floatingactionbutton.FloatingActionButton\n                android:id=\"@+id/update_diary_fab_delete\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:background=\"@drawable/delete\"\n                app:fab_colorNormal=\"#e33e46\"\n                app:fab_icon = \"@drawable/back_new\"\n                app:fab_size=\"normal\"\n                app:fab_title=\"FAB 2\"\n\n                />\n\n        </cc.trity.floatingactionbutton.FloatingActionsMenu>\n    </RelativeLayout>\n\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:paddingLeft=\"5dp\"\n              android:paddingRight=\"5dp\"\n              android:background=\"@color/black\"\n              android:orientation=\"vertical\"\n    >\n\n    <ImageView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"0.2\"\n        />\n\n    <uk.co.senab.photoview.PhotoView\n        android:id=\"@+id/detail_pv_show_photo\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\"\n        android:layout_gravity=\"center\"\n        />\n\n    <ImageView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"0.2\"\n        />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_diary.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/main_rl_main\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/white\"\n    android:orientation=\"vertical\">\n\n\n    <LinearLayout\n        android:id=\"@+id/main_ll_main\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\"\n        >\n\n        <TextView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"20dp\"/>\n\n        <LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n                      android:id=\"@+id/item_first\"\n                      android:layout_width=\"match_parent\"\n                      android:layout_height=\"wrap_content\"\n                      android:background=\"#ffffff\"\n                      android:orientation=\"vertical\"\n                      android:paddingRight=\"10dp\"\n            >\n\n\n            <LinearLayout\n                android:id=\"@+id/main_ll_date\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"25dp\"\n                android:background=\"#ffffff\"\n                android:orientation=\"horizontal\"\n                android:paddingLeft=\"10.8dp\"\n                >\n\n                <ImageView\n                    android:id=\"@+id/main_iv_circle\"\n                    android:layout_width=\"22dp\"\n                    android:layout_height=\"22dp\"\n                    android:layout_gravity=\"center_vertical\"\n                    android:paddingTop=\"2dp\"\n                    android:src=\"@drawable/circle_orange\"\n                    />\n\n                <TextView\n                    android:id=\"@+id/main_tv_date\"\n                    android:layout_width=\"0dp\"\n                    android:layout_height=\"25dp\"\n                    android:layout_weight=\"1\"\n                    android:gravity=\"center_vertical\"\n                    android:paddingLeft=\"4dp\"\n                    android:paddingTop=\"5dp\"\n                    android:text=\"2017年01月18日\"\n                    android:textSize=\"14sp\"\n                    />\n\n            </LinearLayout>\n\n\n            <LinearLayout\n                android:id=\"@+id/main_ll_content\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:orientation=\"horizontal\"\n                >\n\n                <LinearLayout\n                    android:layout_width=\"23dp\"\n                    android:layout_height=\"match_parent\"\n                    android:background=\"@drawable/linear_style\"\n                    >\n                </LinearLayout>\n\n                <LinearLayout\n                    android:id=\"@+id/item_ll_control\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:orientation=\"vertical\"\n                    >\n\n                    <TextView\n                        android:id=\"@+id/main_tv_content\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"50dp\"\n                        android:background=\"#ffffff\"\n                        android:lineSpacingExtra=\"4dp\"\n                        android:paddingLeft=\"33dp\"\n                        android:paddingRight=\"15dp\"\n                        android:paddingTop=\"5dp\"\n                        android:text=\"今天，你什么都没写下...\"\n                        android:textColor=\"@color/gray\"\n                        android:textSize=\"16sp\"\n                        />\n\n                </LinearLayout>\n\n\n            </LinearLayout>\n\n        </LinearLayout>\n\n        <android.support.v7.widget.RecyclerView\n            android:id=\"@+id/main_rv_show_diary\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            >\n\n        </android.support.v7.widget.RecyclerView>\n    </LinearLayout>\n\n    <android.support.design.widget.FloatingActionButton\n        android:id=\"@+id/main_fab_enter_edit\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_alignParentStart=\"true\"\n        android:layout_marginBottom=\"36dp\"\n        android:layout_marginLeft=\"30dp\"\n        android:layout_marginStart=\"30dp\"\n        android:src=\"@drawable/add\"\n        app:backgroundTint=\"#0288D1\"\n        app:borderWidth=\"0dp\"\n        app:elevation=\"6dp\"\n        app:fabSize=\"normal\"\n        app:layout_anchorGravity=\"bottom|right\"\n        app:pressedTranslationZ=\"12dp\"\n        app:rippleColor=\"#a6a6a6\"/>\n\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_duanzi.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\">\n\n    <android.support.v4.widget.SwipeRefreshLayout\n        android:id=\"@+id/duanzi_refresh\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <android.support.v7.widget.RecyclerView\n            android:id=\"@+id/duanzi_rv_show_duanzi\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n        </android.support.v7.widget.RecyclerView>\n\n    </android.support.v4.widget.SwipeRefreshLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_meizi.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\">\n\n\n<android.support.v4.widget.SwipeRefreshLayout\n    android:id=\"@+id/meizi_refresh\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <android.support.v7.widget.RecyclerView\n        android:id=\"@+id/meizi_rv_show_meizi\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n    </android.support.v7.widget.RecyclerView>\n\n</android.support.v4.widget.SwipeRefreshLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_duanzi.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:orientation=\"vertical\"\n    >\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"40dp\"\n        android:paddingLeft=\"8dp\"\n        >\n\n        <de.hdodenhof.circleimageview.CircleImageView\n            android:id=\"@+id/duanzi_civ_avatar\"\n            android:layout_width=\"24dp\"\n            android:layout_height=\"24dp\"\n            android:src=\"@drawable/avatar\"\n            android:layout_gravity=\"center\"\n            />\n\n        <TextView\n            android:id=\"@+id/duanzi_tv_author\"\n            android:paddingLeft=\"8dp\"\n            android:paddingStart=\"8dp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"16dp\"\n            android:text=\"DeveloperHaoz\"\n            android:layout_gravity=\"center_vertical\"\n            />\n\n    </LinearLayout>\n\n    <TextView\n        android:id=\"@+id/duanzi_tv_content\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:paddingBottom=\"10dp\"\n        android:paddingLeft=\"40dp\"\n        android:paddingRight=\"10dp\"\n        android:text=\"老公姓李，老婆姓周。老婆生了个双胞胎，老丈人向女婿提要求了：1，给孩子取名字一个姓周，一个姓李[害羞][害羞]；2，取名字要有纪念意义；3，两个名字要同一个意思[冷汗][冷汗]！今天女婿告诉老丈人，名字取好了……一个叫周末；一个叫李拜天。老丈人无话可说，开了瓶茅台酒………语重心长的说：祝周末李拜天愉快！[偷笑]哈哈，祝周末愉快[呲牙]\"\n        />\n\n    <include layout=\"@layout/layout_app_divide\"/>\n\n\n\n</LinearLayout>\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "app/src/main/res/layout/item_first.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:id=\"@+id/item_first\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"wrap_content\"\n              android:orientation=\"vertical\"\n              android:paddingRight=\"10dp\"\n              android:background=\"@color/white\"\n    >\n\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"25dp\"\n        android:orientation=\"horizontal\"\n        android:paddingLeft=\"10.8dp\"\n        android:background=\"#ffffff\"\n        >\n\n        <ImageView\n            android:id=\"@+id/main_iv_circle\"\n            android:paddingTop=\"2dp\"\n            android:layout_width=\"22dp\"\n            android:layout_height=\"22dp\"\n            android:src=\"@drawable/circle_orange\"\n            android:layout_gravity=\"center_vertical\"\n            />\n\n        <TextView\n            android:id=\"@+id/main_tv_date\"\n            android:layout_width=\"0dp\"\n            android:layout_weight=\"1\"\n            android:layout_height=\"25dp\"\n            android:gravity=\"center_vertical\"\n            android:paddingLeft=\"4dp\"\n            android:paddingTop=\"1dp\"\n            android:text=\"2017年01月18日\"\n            android:textSize=\"14sp\"\n            />\n\n    </LinearLayout>\n\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\"\n        >\n\n        <LinearLayout\n            android:layout_width=\"23dp\"\n            android:layout_height=\"match_parent\"\n            android:background=\"@drawable/linear_style\"\n            >\n        </LinearLayout>\n\n        <LinearLayout\n            android:id=\"@+id/item_ll_control\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            >\n            <TextView\n                android:paddingTop=\"5dp\"\n                android:background=\"#ffffff\"\n                android:id=\"@+id/main_tv_content\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"50dp\"\n                android:lineSpacingExtra=\"4dp\"\n                android:paddingLeft=\"33dp\"\n                android:paddingRight=\"15dp\"\n                android:text=\"今天，你什么都没写下...\"\n                android:textColor=\"@color/gray\"\n                android:textSize=\"16sp\"\n                />\n\n        </LinearLayout>\n\n\n    </LinearLayout>\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/item_meizi.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.CardView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\">\n\n        <RelativeLayout\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\">\n\n                <ImageView\n                    android:id=\"@+id/item_iv_meizi\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_centerHorizontal=\"true\"\n                    android:layout_centerVertical=\"true\"\n                    />\n        </RelativeLayout>\n</android.support.v7.widget.CardView>\n"
  },
  {
    "path": "app/src/main/res/layout/item_rv_diary.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:id=\"@+id/item_ll\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"wrap_content\"\n              android:orientation=\"vertical\"\n              android:paddingRight=\"10dp\"\n              android:background=\"@color/white\"\n    >\n\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"25dp\"\n        android:orientation=\"horizontal\"\n        android:paddingLeft=\"10.8dp\"\n        android:background=\"#ffffff\"\n        >\n\n        <ImageView\n            android:id=\"@+id/main_iv_circle\"\n            android:paddingTop=\"2dp\"\n            android:layout_width=\"22dp\"\n            android:layout_height=\"22dp\"\n            android:src=\"@drawable/circle\"\n            android:layout_gravity=\"center_vertical\"\n            />\n\n        <TextView\n            android:id=\"@+id/main_tv_date\"\n            android:layout_width=\"0dp\"\n            android:layout_weight=\"1\"\n            android:layout_height=\"25dp\"\n            android:gravity=\"center_vertical\"\n            android:paddingLeft=\"4dp\"\n            android:paddingTop=\"1dp\"\n            android:text=\"2017年01月18日\"\n            android:textSize=\"14sp\"\n            />\n\n    </LinearLayout>\n\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"horizontal\"\n        >\n\n        <LinearLayout\n            android:layout_width=\"23dp\"\n            android:layout_height=\"match_parent\"\n            android:background=\"@drawable/linear_style\"\n            >\n        </LinearLayout>\n\n\n        <LinearLayout\n            android:id=\"@+id/item_ll_control\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:orientation=\"vertical\"\n            >\n\n            <LinearLayout\n                android:id=\"@+id/main_ll_title\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"35dp\"\n                android:orientation=\"horizontal\"\n                android:background=\"#ffffff\"\n                >\n\n\n                <TextView\n                    android:paddingTop=\"3dp\"\n                    android:background=\"#ffffff\"\n                    android:id=\"@+id/main_tv_title\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"32dp\"\n                    android:gravity=\"center_vertical\"\n                    android:paddingLeft=\"16dp\"\n                    android:text=\"哈哈哈今天傻逼了\"\n                    android:textColor=\"@color/black\"\n                    android:textSize=\"19sp\"\n                    />\n            </LinearLayout>\n\n\n            <TextView\n                android:paddingTop=\"2dp\"\n                android:background=\"#ffffff\"\n                android:id=\"@+id/main_tv_content\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:lineSpacingExtra=\"4dp\"\n                android:paddingLeft=\"33dp\"\n                android:paddingRight=\"15dp\"\n                android:text=\"         在这里写些什么在这里写些什么在这里写些什么在这里写些什么在这里写些什么在这里写些什么在这里写些什么在这里写些什么在这里写些什么在这里 写些什么在这里写些什么在这里写些什么在这里写些什么在这里写些什么在这里写些什么在这里写些什么\"\n                android:textColor=\"#1d1c1c\"\n                android:textSize=\"16sp\"\n\n                />\n\n            <RelativeLayout\n                android:id=\"@+id/item_rl_edit\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"40dp\"\n                android:paddingRight=\"5dp\"\n                android:background=\"#ffffff\"\n                >\n\n                <ImageView\n                    android:id=\"@+id/main_iv_edit\"\n                    android:layout_width=\"30dp\"\n                    android:layout_height=\"30dp\"\n                    android:layout_alignParentRight=\"true\"\n                    android:layout_centerInParent=\"true\"\n                    android:src=\"@drawable/edit\"\n                    />\n\n\n            </RelativeLayout>\n\n            <LinearLayout\n                android:background=\"#ffffff\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"20dp\">\n\n            </LinearLayout>\n\n\n        </LinearLayout>\n\n\n    </LinearLayout>\n\n</LinearLayout>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
  },
  {
    "path": "app/src/main/res/layout/layout_app_divide.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ImageView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n           android:layout_width=\"match_parent\"\n           android:layout_height=\"5dp\"\n           android:background=\"#ebebeb\"\n    >\n</ImageView>\n"
  },
  {
    "path": "app/src/main/res/layout/layout_app_toolbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:id=\"@+id/contacts_tab_rl\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"48dp\"\n              android:background=\"?attr/colorPrimary\"\n              android:orientation=\"horizontal\"\n    >\n\n    <ImageView\n        android:id=\"@+id/home_iv_draw\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:layout_gravity=\"center\"\n        android:layout_margin=\"14dp\"\n        android:src=\"@drawable/app_draw\"\n        />\n\n    <TextView\n        android:id=\"@+id/home_tv_title_center\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:layout_weight=\"10\"\n        android:ellipsize=\"marquee\"\n        android:focusable=\"true\"\n        android:focusableInTouchMode=\"true\"\n        android:gravity=\"center\"\n        android:paddingBottom=\"2dp\"\n        android:scrollHorizontally=\"true\"\n        android:text=\"SleepHelper\"\n        android:textColor=\"@android:color/white\"\n        android:textSize=\"20sp\"\n        android:textStyle=\"bold\"\n        android:visibility=\"gone\"\n        />\n\n    <TextView\n        android:id=\"@+id/home_tv_title_normal\"\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:layout_weight=\"10\"\n        android:ellipsize=\"marquee\"\n        android:focusable=\"true\"\n        android:focusableInTouchMode=\"true\"\n        android:gravity=\"start\"\n        android:paddingBottom=\"2dp\"\n        android:paddingLeft=\"20dp\"\n        android:scrollHorizontally=\"true\"\n        android:text=\"SleepHelper\"\n        android:textColor=\"@android:color/white\"\n        android:textSize=\"20sp\"\n        android:textStyle=\"bold\"\n        />\n\n    <ImageView\n        android:id=\"@+id/home_iv_menu\"\n        android:layout_width=\"24dp\"\n        android:layout_height=\"24dp\"\n        android:layout_gravity=\"center\"\n        android:layout_margin=\"6dp\"\n        android:src=\"@drawable/menu\"\n        />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/layout_home_header.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:background=\"@color/colorPrimary\"\n              android:orientation=\"vertical\">\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        >\n\n        <de.hdodenhof.circleimageview.CircleImageView\n            android:layout_width=\"64dp\"\n            android:layout_height=\"64dp\"\n            android:layout_marginBottom=\"8dp\"\n            android:layout_marginEnd=\"16dp\"\n            android:layout_marginStart=\"16dp\"\n            android:layout_marginTop=\"24dp\"\n            android:src=\"@drawable/avatar\"\n            android:tint=\"@color/colorPrimaryDark\"\n            android:id=\"@+id/home_iv_avatar\" />\n    </RelativeLayout>\n\n    <TextView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"16dp\"\n        android:layout_marginEnd=\"16dp\"\n        android:layout_marginStart=\"16dp\"\n        android:layout_marginTop=\"8dp\"\n        android:ellipsize=\"end\"\n        android:hint=\"用户名\"\n        android:maxLines=\"1\"\n        android:text=\"DeveloperHaoz\"\n        android:textColor=\"@color/white\"\n        android:textSize=\"16sp\"\n        android:id=\"@+id/home_tv_name\" />\n\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/menu/menu_me.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <group android:id=\"@+id/group_one\">\n        <item\n            android:id=\"@+id/menu_me_item_club_info\"\n            android:icon=\"@mipmap/ic_launcher\"\n            android:title=\"@string/item1\" />\n        <item\n            android:id=\"@+id/menu_me_item_switch\"\n            android:icon=\"@mipmap/ic_launcher\"\n            android:title=\"@string/item2\" />\n\n        <item\n            android:id=\"@+id/menu_me_item_join\"\n            android:icon=\"@mipmap/ic_launcher\"\n            android:title=\"@string/item3\" />\n\n        <item\n            android:id=\"@+id/menu_me_item_build\"\n            android:icon=\"@mipmap/ic_launcher\"\n            android:title=\"@string/item4\" />\n\n    </group>\n\n</menu>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#2196F3</color>\n    <color name=\"colorPrimaryDark\">#1976D2</color>\n    <color name=\"primary_light\">#BBDEFB</color>\n    <color name=\"colorAccent\">#FF4081</color>\n    <color name=\"accent\">#448AFF</color>\n    <color name=\"primary_text\">#212121</color>\n    <color name=\"secondary_text\">#757575</color>\n    <color name=\"icons\">#FFFFFF</color>\n    <color name=\"divider\">#BDBDBD</color>\n\n    <color name=\"gray\">#bbafb4</color>\n    <color name=\"white\">#ffffff</color>\n    <color name=\"black\">#000000</color>\n    <color name=\"gray_light\">#f4f4f4</color>\n    <color name=\"gray_black\">#cdcdcd</color>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">SleepHelper</string>\n    <string name=\"drawer_open\">drawer_open</string>\n    <string name=\"drawer_close\">drawer_close</string>\n    <string name=\"item1\">看爸爸的帅照</string>\n    <string name=\"item2\">切换夜间模式</string>\n    <string name=\"item3\">关于我们</string>\n    <string name=\"item4\">反馈</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        <item name=\"windowNoTitle\">true</item>\n\n    </style>\n\n\n    <style name=\"AppToolbarStyle\" parent=\"AppTheme\">\n        <item name=\"android:textSize\">10sp</item>\n    </style>\n\n\n</resources>\n"
  },
  {
    "path": "app/src/test/java/com/example/developerhaoz/sleephelper/ExampleUnitTest.java",
    "content": "package com.example.developerhaoz.sleephelper;\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": "app/src/test/java/com/example/developerhaoz/sleephelper/common/HomeActivityTest.java",
    "content": "package com.example.developerhaoz.sleephelper.common;\n\nimport org.junit.Test;\n\n/**\n * Created by developerHaoz on 2017/10/18.\n */\npublic class HomeActivityTest {\n    @Test\n    public void startActivity() throws Exception {\n\n    }\n\n    @Test\n    public void onCreate() throws Exception {\n\n    }\n\n    @Test\n    public void startUpdateDiaryActivity() throws Exception {\n\n    }\n\n    @Test\n    public void onDestroy() throws Exception {\n\n    }\n\n    @Test\n    public void onBackPressed() throws Exception {\n\n    }\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.3.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        maven { url \"https://jitpack.io\" }\n\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Tue May 02 11:05:07 CST 2017\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-3.3-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# 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'\n"
  }
]