[
  {
    "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": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 ittianyu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "## 外包集中营 ##\n\n整合多个软件外包平台项目信息，替你筛选优质项目\n\n![MIT License](https://img.shields.io/github/license/mashape/apistatus.svg) ![api 15+](https://img.shields.io/badge/API-14%2B-green.svg)\n\n## 关于我们 ##\n[![天宇工作室](https://github.com/ittianyu/MobileGuard/blob/master/read_me_images/logo-transparent.png?raw=true)](http://www.ittianyu.com)\n\n## 功能 ##\n- ### 首页 ###\n展示你关注的外包信息，比如： 移动app、网站开发、微信/小程序。\n\n- ### 发现 ###\n展示所有的外包信息。\n\n- ### 搜索 ###\n展示标题或描述中含有指定关键词的外包信息。\n\n\n## 截图 ##\n\n![欢迎界面](/screenshots/splash.jpg) ![主界面](/screenshots/home.jpg)\n\n![主界面滑动](/screenshots/home_scroll.jpg) ![发现界面](/screenshots/find.jpg)\n\n![搜索界面](/screenshots/search.jpg) ![我的界面](/screenshots/mime.jpg)\n\n![没有数据界面](/screenshots/empty.jpg) ![错误界面](/screenshots/error.jpg)\n\n\n## 下载 ##\n\n已在 [百度手机助手](http://shouji.baidu.com/software/10867391.html)、[91市场](http://apk.91.com/Soft/Android/com.ittianyu.pocenter-1.html)、[安卓市场](http://apk.hiapk.com/appinfo/com.ittianyu.pocenter/1) 上线。\n\n贴出二维码方便下载\n\n![](http://d.hiphotos.bdimg.com/wisegame/pic/item/72dfa9ec8a136327b9c91278988fa0ec08fac752.jpg)\n\n## 技术点 ##\n\n- 框架：MVP\n- 网络访问：Retrofit2 + OkHttp3\n- 网络缓存：RxCache\n- 数据及解析：Gson 解析 json\n- 异步框架：RxJava2\n- 设计规范：Material Design\n- 界面布局：BottomNavigationView + ViewPager + Fragment\n- 第三方接入：ShareSdk、友盟 app 统计、TinkerPatch 热更新\n\n## 亮点 ##\n\n- ViewPager 懒加载：在 Activity 生命周期内仅加载一次，且第一次可见时加载。\n- LCEE 界面逻辑：也就是加载、内容、错误、空视图。\n\n## 项目包结构 ##\n\n- com.ittianyu.pocenter\n\t- common &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;公用代码\n\t\t- api &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;网络访问代码\n\t\t- base &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp; 基类\n\t\t- bean &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp; 实体类\n\t\t- utils&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;工具类\n\t- features&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;功能\n\t\t- detail&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;详情\n\t\t- find &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp; 发现\n\t\t- home&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;主页\n\t\t- mime&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;我的\n\t\t- search &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp; 搜索\n\t\t- type &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;标签管理\n\t\t- version&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp; 版本更新\n\t- MainActivity&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp; 主界面\n\t- SplashActivity&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;欢迎界面\n\n\n## 踩坑经历 ##\n\n- 混淆：如果项目中有用到 Gson 解析数据，不要混淆实体类。最好养成用一个库，就加上一个库的混淆代码的习惯。\n\n\n## 致谢 ##\n\n感谢工作室的 UI大大 给与了关于配色方面的建议。\n\n\n## 授权 ##\n\n\tMIT License\n\t\n\tCopyright (c) 2017 ittianyu\n\t\n\tPermission is hereby granted, free of charge, to any person obtaining a copy\n\tof this software and associated documentation files (the \"Software\"), to deal\n\tin the Software without restriction, including without limitation the rights\n\tto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\tcopies of the Software, and to permit persons to whom the Software is\n\tfurnished to do so, subject to the following conditions:\n\t\n\tThe above copyright notice and this permission notice shall be included in all\n\tcopies or substantial portions of the Software.\n\t\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\tIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\tFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\tAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\tLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\tOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\tSOFTWARE.\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "apply plugin: 'com.android.application'\n\nandroid {\n//    signingConfigs {\n//        release {\n//            keyAlias 'pocenter'\n//            keyPassword 'xxx'\n//            storeFile file('keystore.jks')\n//            storePassword 'xxx'\n//        }\n//    }\n    compileSdkVersion 25\n    buildToolsVersion \"25.0.0\"\n    defaultConfig {\n        applicationId \"com.ittianyu.pocenter\"\n        minSdkVersion 14\n        targetSdkVersion 25\n        versionCode 1\n        versionName \"1.0.0\"\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n        multiDexEnabled true\n    }\n    buildTypes {\n        release {\n            minifyEnabled true\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n//            signingConfig signingConfigs.release// 使用签名\n        }\n    }\n    dataBinding {\n        enabled true\n    }\n    android.defaultConfig.vectorDrawables.useSupportLibrary = true\n    // 多渠道打包\n//    productFlavors {\n//        tianyu {}\n//        productFlavors.all { flavor ->\n//            flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]\n//        }\n//    }\n}\n\n// TinkerPatch 相关的配置\napply from: 'tinkerpatch.gradle'\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.1.0'\n    testCompile 'junit:junit:4.12'\n    // leakcanary\n    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'\n    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'\n    testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'\n    // log\n    compile 'com.orhanobut:logger:1.15'\n    // http\n    compile 'com.squareup.okhttp3:okhttp:3.4.1'\n    compile 'com.squareup.okio:okio:1.10.0'\n    // retrofit\n    compile 'com.squareup.retrofit2:retrofit:2.1.0'\n    compile 'com.squareup.retrofit2:converter-gson:2.1.0'\n    // json\n    compile 'com.google.code.gson:gson:2.7'\n    // RxJava2\n    compile 'io.reactivex.rxjava2:rxjava:2.0.0'\n    compile 'io.reactivex.rxjava2:rxandroid:2.0.0'\n    compile 'org.reactivestreams:reactive-streams:1.0.0'\n    // retrofit-adapter\n    compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'\n    // RxCache\n    compile 'com.github.VictorAlbertos.RxCache:runtime:1.6.9-2.x'\n    // To use Gson\n    compile 'com.github.VictorAlbertos.Jolyglot:gson:0.0.3'\n    // other\n    compile 'com.github.ittianyu:BottomNavigationViewEx:1.1.2'\n    // bottom navigation\n    compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.6.1'\n    // recycler adapter\n    compile 'com.github.ittianyu:mvp:0.0.1'\n    // mvp\n    compile 'com.github.githubwing:ByeBurger:1.2.3'\n    // hide actionbar and bottom navigation\n    compile 'com.zhy:flowlayout-lib:1.0.3'\n    // flow tag\n    compile 'com.victor:lib:1.0.4'\n    // loading animation\n    compile 'com.github.arimorty:floatingsearchview:2.0.3'\n    // search view\n    compile 'com.allenliu:checkversionlib:1.0.4'\n    // check version\n    // share sdk\n    compile files('libs/MobCommons-2016.1222.1756.jar')\n    compile files('libs/MobTools-2016.1222.1756.jar')\n    compile files('libs/ShareSDK-Core-2.8.0.jar')\n    compile files('libs/ShareSDK-Email-2.8.0.jar')\n    compile files('libs/ShareSDK-QQ-2.8.0.jar')\n    compile files('libs/ShareSDK-Wechat-2.8.0.jar')\n    compile files('libs/ShareSDK-Wechat-Core-2.8.0.jar')\n    compile files('libs/ShareSDK-Wechat-Favorite-2.8.0.jar')\n    compile files('libs/ShareSDK-Wechat-Moments-2.8.0.jar')\n    // share sdk end\n    // 友盟统计\n    compile 'com.umeng.analytics:analytics:latest.integration'\n    // TinkerPatch SDK\n    compile 'com.tinkerpatch.sdk:tinkerpatch-android-sdk:1.1.0'\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 E:\\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#http\n-dontwarn okhttp3.**\n-dontwarn okio.**\n-dontwarn retrofit2.Platform$Java8\n\n#databinding\n-dontwarn android.databinding.**\n-keep class android.databinding.** { *; }\n-keep class android.databinding.annotationprocessor.** { *; }\n\n##---------------Begin: proguard configuration for Gson  ----------\n# Gson uses generic type information stored in a class file when working with fields. Proguard\n# removes such information by default, so configure it to keep all of it.\n-keepattributes Signature\n\n# For using GSON @Expose annotation\n-keepattributes *Annotation*\n\n# Gson specific classes\n-keep class sun.misc.Unsafe { *; }\n#-keep class com.google.gson.stream.** { *; }\n\n# Application classes that will be serialized/deserialized over Gson\n-keep class com.google.gson.examples.android.model.** { *; }\n\n# Prevent proguard from stripping interface information from TypeAdapterFactory,\n# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)\n-keep class * implements com.google.gson.TypeAdapterFactory\n-keep class * implements com.google.gson.JsonSerializer\n-keep class * implements com.google.gson.JsonDeserializer\n##---------------End: proguard configuration for Gson  ----------\n\n#友盟\n-keepclassmembers class * {\n   public <init> (org.json.JSONObject);\n}\n-keepclassmembers enum * {\n    public static **[] values();\n    public static ** valueOf(java.lang.String);\n}\n\n#fastjson\n-dontwarn com.alibaba.fastjson.**\n-keep class com.alibaba.fastjson.** { *; }\n\n#rx cache\n-dontwarn io.rx_cache.internal.**\n-keepclassmembers enum io.rx_cache.Source { *; }\n-keep class io.rx_cache2.** { *; }\n\n# bottom navigation\n-keep public class android.support.design.widget.BottomNavigationView { *; }\n-keep public class android.support.design.internal.BottomNavigationMenuView { *; }\n-keep public class android.support.design.internal.BottomNavigationPresenter { *; }\n-keep public class android.support.design.internal.BottomNavigationItemView { *; }\n\n#beans\n-keep public class **.*Bean {*;}\n\n#指定压缩级别\n-optimizationpasses 5\n\n#不跳过非公共的库的类成员\n-dontskipnonpubliclibraryclassmembers\n\n#混淆时采用的算法\n-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*\n\n#把混淆类中的方法名也混淆了\n-useuniqueclassmembernames\n\n#优化时允许访问并修改有修饰符的类和类的成员\n-allowaccessmodification\n\n#将文件来源重命名为“SourceFile”字符串\n-renamesourcefileattribute SourceFile\n#保留行号\n-keepattributes SourceFile,LineNumberTable\n\n#保持所有实现 Serializable 接口的类成员\n-keepclassmembers class * implements java.io.Serializable {\n    static final long serialVersionUID;\n    private static final java.io.ObjectStreamField[] serialPersistentFields;\n    private void writeObject(java.io.ObjectOutputStream);\n    private void readObject(java.io.ObjectInputStream);\n    java.lang.Object writeReplace();\n    java.lang.Object readResolve();\n}\n\n#Fragment不需要在AndroidManifest.xml中注册，需要额外保护下\n-keep public class * extends android.support.v4.app.Fragment\n-keep public class * extends android.app.Fragment\n\n# 保持测试相关的代码\n-dontnote junit.framework.**\n-dontnote junit.runner.**\n-dontwarn android.test.**\n-dontwarn android.support.test.**\n-dontwarn org.junit.**"
  },
  {
    "path": "app/src/androidTest/java/com/ittianyu/pocenter/ExampleInstrumentedTest.java",
    "content": "package com.ittianyu.pocenter;\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.ittianyu.pocenter\", 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    xmlns:tools=\"http://schemas.android.com/tools\"\n    package=\"com.ittianyu.pocenter\">\n\n    <uses-sdk tools:overrideLibrary=\"com.wingsofts.byeburgernavigationview\" />\n\n    <!-- share sdk -->\n    <uses-permission android:name=\"android.permission.GET_TASKS\" />\n    <uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" />\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n    <uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\" />\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />\n    <uses-permission android:name=\"android.permission.READ_PHONE_STATE\" />\n    <uses-permission android:name=\"android.permission.MANAGE_ACCOUNTS\" />\n    <uses-permission android:name=\"android.permission.GET_ACCOUNTS\" />\n    <!-- share sdk end -->\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n\n    <application\n        android:name=\".common.base.BaseApplication\"\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n\n        <!--友盟统计-->\n        <meta-data\n            android:name=\"UMENG_APPKEY\"\n            android:value=\"5880acc1a40fa35dca000afe\" />\n        <meta-data\n            android:name=\"UMENG_CHANNEL\"\n            android:value=\"baidu\" />\n        <!--友盟统计 结束-->\n\n        <!-- share sdk -->\n        <activity\n            android:name=\"com.mob.tools.MobUIShell\"\n            android:configChanges=\"keyboardHidden|orientation|screenSize\"\n            android:screenOrientation=\"portrait\"\n            android:theme=\"@android:style/Theme.Translucent.NoTitleBar\"\n            android:windowSoftInputMode=\"stateHidden|adjustResize\">\n\n            <!-- QQ和QQ空间分享 QQ登录的回调必须要配置的 -->\n            <intent-filter>\n                <data android:scheme=\"tencent100371282\" />\n\n                <action android:name=\"android.intent.action.VIEW\" />\n\n                <category android:name=\"android.intent.category.BROWSABLE\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n            </intent-filter>\n        </activity>\n        <!-- 微信分享回调 -->\n        <activity\n            android:name=\".features.wxapi.WXEntryActivity\"\n            android:configChanges=\"keyboardHidden|orientation|screenSize\"\n            android:exported=\"true\"\n            android:screenOrientation=\"portrait\"\n            android:theme=\"@android:style/Theme.Translucent.NoTitleBar\" />\n        <!-- share sdk end -->\n\n        <activity android:name=\".features.SplashActivity\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n        <activity android:name=\".features.MainActivity\" />\n        <activity android:name=\".features.type.TypeActivity\" />\n        <activity android:name=\".features.search.SearchActivity\" />\n        <activity android:name=\".features.detail.DetailActivity\" />\n        <service\n            android:name=\".features.version.CheckVersionService\"\n            android:enabled=\"true\"\n            android:exported=\"true\"></service>\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/assets/ShareSDK.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<DevInfor>\n    <!--\n    \t说明：\n    \t\n    \t1、表格中的第一项\n    \t\t<ShareSDK \n        \t\tAppKey=\"api20\" />\n    \t是必须的，其中的AppKey是您在ShareSDK上注册的开发者帐号的AppKey\n    \t\n    \t2、所有集成到您项目的平台都应该为其在表格中填写相对应的开发者信息，以新浪微博为例：\n    \t    <SinaWeibo\n                Id=\"1\"\n                SortId=\"1\"\n                AppKey=\"568898243\"\n                AppSecret=\"38a4f8204cc784f81f9f0daaf31e02e3\"\n                RedirectUrl=\"http://www.mob.com\"\n                Enable=\"true\" />\n    \t其中的SortId是此平台在分享列表中的位置，由开发者自行定义，可以是任何整型数字，数值越大\n    \t越靠后AppKey、AppSecret和RedirectUrl是您在新浪微博上注册开发者信息和应用后得到的信息\n    \tId是一个保留的识别符，整型，ShareSDK不使用此字段，供您在自己的项目中当作平台的识别符。\n    \tEnable字段表示此平台是否有效，布尔值，默认为true，如果Enable为false，即便平台的jar包\n    \t已经添加到应用中，平台实例依然不可获取。\n    \t\n    \t各个平台注册应用信息的地址如下：\n\t\t\t新浪微博        http://open.weibo.com\n\t\t\t微信好友        http://open.weixin.qq.com\n\t\t\tFacebook       https://developers.facebook.com\n\t\t\tTwitter        https://dev.twitter.com\n\t\t\t人人网          http://dev.renren.com\n\t\t\t开心网          http://open.kaixin001.com\n\t\t\t搜狐微博        http://open.t.sohu.com\n\t\t\t网易微博        http://open.t.163.com\n\t\t\t豆瓣           http://developers.douban.com\n\t\t\t\n\t\t\t有道云笔记      http://note.youdao.com/open/developguide.html#app\n\t\t\t印象笔记        https://dev.evernote.com/\n\t\t\tLinkedin       https://developer.linkedin.com\n\t\t\tFourSquare     https://developer.foursquare.com/\n\t\t\t搜狐随身看      https://open.sohu.com/\n\t\t\tFlickr         http://www.flickr.com/services/\n\t\t\tPinterest      http://developers.pinterest.com/\n\t\t\tTumblr         http://www.tumblr.com/developers\n\t\t\tDropbox        https://www.dropbox.com/developers\n\t\t\tInstagram      http://instagram.com/developer#\n\t\t\tVKontakte      http://vk.com/dev\n\t\t\t易信好友        http://open.yixin.im/\n\t\t\t明道\t           http://open.mingdao.com/\n\t\t\tLine           http://media.line.me/zh-hant/  https://developers.line.me\n\t\t\tPocket         http://getpocket.com/developer/apps/new\n\t\t\tKakaoTalk      https://developers.kakao.com/\n\t\t\tKakaoStory     https://developers.kakao.com/\n\t\t\tPlurk          http://www.plurk.com/API\n    -->\n    \n    <ShareSDK \n        AppKey = \"1aeacd4785e72\"/> <!-- 修改成你在sharesdk后台注册的应用的appkey\"-->\n    \n    <!-- ShareByAppClient标识是否使用微博客户端分享，默认是false -->\n    <SinaWeibo\n        Id=\"1\"\n        SortId=\"1\"\n        AppKey=\"568898243\"\n        AppSecret=\"38a4f8204cc784f81f9f0daaf31e02e3\"\n        RedirectUrl=\"http://www.sharesdk.cn\"\n        ShareByAppClient=\"true\"\n        Enable=\"true\" />\n\n    <TencentWeibo\n        Id=\"2\" \n        SortId=\"2\"\n        AppKey=\"801307650\"\n        AppSecret=\"ae36f4ee3946e1cbb98d6965b0b2ff5c\"\n        RedirectUri=\"http://sharesdk.cn\"\n        Enable=\"true\" />\n    \n    <QZone\n        Id=\"3\"\n        SortId=\"3\"\n        AppId=\"100371282\"\n        AppKey=\"aed9b0303e3ed1e27bae87c33761161d\"\n        Enable=\"true\" />\n    \n    <!-- \n    \tWechat微信和WechatMoments微信朋友圈的appid是一样的；\n    \n                       注意：开发者不能用我们这两个平台的appid,否则分享不了\n    \n       \t  微信测试的时候，微信测试需要先签名打包出apk,\n\t\tsample测试微信，要先签名打包，keystore在sample项目中，密码123456\n\t\t\n\t\tBypassApproval是绕过审核的标记，设置为true后AppId将被忽略，故不经过\n\t\t审核的应用也可以执行分享，但是仅限于分享文字和图片，不能分享其他类型，\n\t\t默认值为false。此外，微信收藏不支持此字段。\n\t-->\n    <Wechat\n        Id=\"4\"\n        SortId=\"4\"\n        AppId=\"wx4868b35061f87885\"\n        AppSecret=\"64020361b8ec4c99936c0e3999a9f249\"\n        BypassApproval=\"false\"\n        Enable=\"true\" />\n    \n    <WechatMoments\n        Id=\"5\"\n        SortId=\"5\"\n        AppId=\"wx4868b35061f87885\"\n        AppSecret=\"64020361b8ec4c99936c0e3999a9f249\"\n        BypassApproval=\"false\"\n        Enable=\"true\" />\n        \n\t<WechatFavorite\n        Id=\"6\"\n        SortId=\"6\"\n        AppId=\"wx4868b35061f87885\"\n        AppSecret=\"64020361b8ec4c99936c0e3999a9f249\"\n        Enable=\"true\" />\n    \n\t<!-- ShareByAppClient标识是否使用微博客户端分享，默认是false -->\n\t<QQ\n        Id=\"7\"\n        SortId=\"7\"\n        AppId=\"100371282\"\n        AppKey=\"aed9b0303e3ed1e27bae87c33761161d\"\n        ShareByAppClient=\"true\"\n        Enable=\"true\" />\n    \n    <Facebook\n        Id=\"8\"\n        SortId=\"8\"\n        ConsumerKey=\"107704292745179\"\n        ConsumerSecret=\"38053202e1a5fe26c80c753071f0b573\"\n        RedirectUrl=\"http://mob.com\"\n        Enable=\"true\" />\n\n    <Twitter\n        Id=\"9\"\n        SortId=\"9\"\n        ConsumerKey=\"LRBM0H75rWrU9gNHvlEAA2aOy\"\n        ConsumerSecret=\"gbeWsZvA9ELJSdoBzJ5oLKX0TU09UOwrzdGfo9Tg7DjyGuMe8G\"\n        CallbackUrl=\"http://mob.com\"\n        Enable=\"true\" />\n    \n    <Renren\n        Id=\"10\"\n        SortId=\"10\"\n        AppId=\"226427\"\n        ApiKey=\"fc5b8aed373c4c27a05b712acba0f8c3\"\n        SecretKey=\"f29df781abdd4f49beca5a2194676ca4\"\n        Enable=\"true\" />\n    \n    <KaiXin\n        Id=\"11\"\n        SortId=\"11\"\n        AppKey=\"358443394194887cee81ff5890870c7c\"\n        AppSecret=\"da32179d859c016169f66d90b6db2a23\"\n        RedirectUri=\"http://www.sharesdk.cn\"\n        Enable=\"true\" />\n    \n    <Email\n        Id=\"12\" \n        SortId=\"12\"\n        Enable=\"true\" />\n    \n    <ShortMessage\n        Id=\"13\" \n        SortId=\"13\"\n        Enable=\"true\" />\n    \n    <Douban\n        Id=\"16\"\n        SortId=\"16\"\n        ApiKey=\"031a96a3aa8b28af094fc3eaffa17a0d\"\n        Secret=\"2e675e730571b75d\"\n        RedirectUri=\"http://mob.com\"\n        Enable=\"true\" />\n    \n    <YouDao\n        Id=\"17\"\n        SortId=\"17\"\n        HostType=\"product\"\n        ConsumerKey=\"dcde25dca105bcc36884ed4534dab940\"\n        ConsumerSecret=\"d98217b4020e7f1874263795f44838fe\"\n        RedirectUri=\"http://www.sharesdk.cn/\"\n        Enable=\"true\" />\n        \n    <!-- \n    \t在中国大陆，印象笔记有两个服务器，一个是沙箱（sandbox），一个是生产服务器（china）。\n    \t一般你注册应用，它会先让你使用sandbox，当你完成测试以后，可以到\n    \thttp://dev.yinxiang.com/support/上激活你的ConsumerKey，激活成功后，修改HostType\n    \t为china就好了。至于如果您申请的是国际版的印象笔记（Evernote），则其生产服务器类型为\n    \t“product”。\n    \t\n    \t如果目标设备上已经安装了印象笔记客户端，ShareSDK允许应用调用本地API来完成分享，但\n    \t是需要将应用信息中的“ShareByAppClient”设置为true，此字段默认值为false。\n    -->\n    <Evernote\n        Id=\"19\"\n        SortId=\"19\"\n        HostType=\"sandbox\"\n    \tConsumerKey=\"sharesdk-7807\"\n\t\tConsumerSecret=\"d05bf86993836004\"\n\t\tShareByAppClient=\"true\"\n\t\tEnable=\"true\" />\n    \n    <LinkedIn\n    \tId=\"20\"\n        SortId=\"20\"\n        ApiKey=\"ejo5ibkye3vo\"\n        SecretKey=\"cC7B2jpxITqPLZ5M\" \n        RedirectUrl=\"http://sharesdk.cn\"\n        Enable=\"true\" />\n    \n     <GooglePlus\n    \tId=\"21\"\n        SortId=\"21\"\n        ClientID=\"682795613743-cfo3a8r4va0ujja7qofr54hobt2kv3cq.apps.googleusercontent.com\"\n        RedirectUrl=\"http://localhost\"\n        ShareByAppClient = \"false\"\n        Enable=\"true\" />\n     \n     <FourSquare\n    \tId=\"22\"\n        SortId=\"22\"\n        ClientID=\"G0ZI20FM30SJAJTX2RIBGD05QV1NE2KVIM2SPXML2XUJNXEU\"\n        ClientSecret=\"3XHQNSMMHIFBYOLWEPONNV4DOTCDBQH0AEMVGCBG0MZ32XNU\"\n        RedirectUrl=\"http://www.sharesdk.cn\"\n        Enable=\"true\" />\n        \n\t<Pinterest\n    \tId=\"23\"\n        SortId=\"23\"\n        ClientId=\"1432928\"\n        Enable=\"true\" />\n     \n     <Flickr\n     \tId=\"24\"\n        SortId=\"24\"\n        ApiKey=\"33d833ee6b6fca49943363282dd313dd\"\n        ApiSecret=\"3a2c5b42a8fbb8bb\"\n        RedirectUri=\"http://www.sharesdk.cn\"\n        Enable=\"true\" />\n        \n    <Tumblr\n        Id=\"25\"\n        SortId=\"25\"\n        OAuthConsumerKey=\"2QUXqO9fcgGdtGG1FcvML6ZunIQzAEL8xY6hIaxdJnDti2DYwM\"\n\t\tSecretKey=\"3Rt0sPFj7u2g39mEVB3IBpOzKnM3JnTtxX2bao2JKk4VV1gtNo\"\n\t\tCallbackUrl=\"http://sharesdk.cn\"\n        Enable=\"true\" />\n \n\t<Dropbox\n        Id=\"26\"\n        SortId=\"26\"\n        AppKey=\"i5vw2mex1zcgjcj\" \n\t\tAppSecret=\"3i9xifsgb4omr0s\"\n\t\tRedirectUri=\"https://www.sharesdk.cn\"\n        Enable=\"true\" />\n        \n    <VKontakte \n    \tId=\"27\"\n        SortId=\"27\"\n        ApplicationId=\"3921561\"\n        Enable=\"true\" />\n        \n    <Instagram \n    \tId=\"28\"\n        SortId=\"28\"\n        ClientId=\"ff68e3216b4f4f989121aa1c2962d058\"\n\t\tClientSecret=\"1b2e82f110264869b3505c3fe34e31a1\"\n\t\tRedirectUri=\"http://sharesdk.cn\"\n        Enable=\"true\" />\n    \n    <!-- \n    \tYixin易信和YixinMoments易信朋友圈的appid是一样的；\n    \n                       注意：开发者不能用我们这两个平台的appid,否则分享不了\n    \n       \t 易信测试的时候需要先签名打包出apk,\n\t\tsample测试易信，要先签名打包，keystore在sample项目中，密码123456\n\t\t\n\t\tBypassApproval是绕过审核的标记，设置为true后AppId将被忽略，故不经过\n\t\t审核的应用也可以执行分享，但是仅限于分享文字或图片，不能分享其他类型，\n\t\t默认值为false。\n\t-->\n\t<Yixin \n    \tId=\"29\"\n        SortId=\"29\"\n        AppId=\"yx0d9a9f9088ea44d78680f3274da1765f\"\n        BypassApproval=\"true\"\n        Enable=\"true\" />\n\t\n\t<YixinMoments\n    \tId=\"30\"\n        SortId=\"30\"\n        AppId=\"yx0d9a9f9088ea44d78680f3274da1765f\"\n        BypassApproval=\"true\"\n        Enable=\"true\" />\n\n\t<Mingdao\n    \tId=\"31\"\n        SortId=\"31\"\n        AppKey=\"EEEE9578D1D431D3215D8C21BF5357E3\"\n        AppSecret=\"5EDE59F37B3EFA8F65EEFB9976A4E933\"\n        RedirectUri=\"http://sharesdk.cn\"\n        Enable=\"true\" />\n\t\n\t<Line\n\t    Id=\"32\"\n        SortId=\"32\"\n        ChannelID = \"1477692153\"\n        ChannelSecret =\"f30c036370f2e04ade71c52eef73a9af\"\n        Enable=\"true\" />\n\t\n\t<KakaoTalk\n\t    Id=\"33\"\n        SortId=\"33\"\n        AppKey=\"48d3f524e4a636b08d81b3ceb50f1003\"\n        Enable=\"true\" />\n\t\n\t<KakaoStory\n\t    Id=\"34\"\n        SortId=\"34\"\n        AppKey=\"48d3f524e4a636b08d81b3ceb50f1003\"\n        Enable=\"true\" />\n\n    <WhatsApp\n        Id=\"35\"\n        SortId=\"35\"\n        Enable=\"true\" />\n    \n    <Bluetooth\n        Id=\"36\"\n        SortId=\"36\"\n        Enable=\"true\" />\n\n    <Pocket\n        Id=\"37\"\n        SortId=\"37\"\n        ConsumerKey=\"32741-389c565043c49947ba7edf05\"\n        Enable=\"true\" />\n    \n    <Instapaper\n        Id=\"38\"\n        SortId=\"38\"\n        ConsumerKey=\"4rDJORmcOcSAZL1YpqGHRI605xUvrLbOhkJ07yO0wWrYrc61FA\"\n        ConsumerSecret=\"GNr1GespOQbrm8nvd7rlUsyRQsIo3boIbMguAl9gfpdL0aKZWe\"\n        Enable=\"true\" />\n    \n    <FacebookMessenger\n        Id=\"39\"\n        SortId=\"39\"\n        AppId=\"107704292745179\"\n        Enable=\"true\" />\n    \n     <Alipay\n        Id=\"50\"\n        SortId=\"50\"  \n        AppId=\"2015072400185895\"\n        Enable=\"true\"/>\n     \n     <AlipayMoments\n        Id=\"51\"\n        SortId=\"51\"  \n        AppId=\"2015072400185895\"\n        Enable=\"true\"/>\n\n</DevInfor>"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/CustomerLogo.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare;\n\nimport android.graphics.Bitmap;\nimport android.view.View.OnClickListener;\n\n/** 九宫格自定义的图标对象 */\npublic class CustomerLogo {\n\tpublic String label;\n\tpublic Bitmap logo;\n\tpublic OnClickListener listener;\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/OnekeyShare.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare;\n\nimport static com.mob.tools.utils.BitmapHelper.captureView;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.text.TextUtils;\nimport android.view.View;\nimport android.view.View.OnClickListener;\nimport cn.sharesdk.framework.Platform;\nimport cn.sharesdk.framework.PlatformActionListener;\nimport cn.sharesdk.framework.ShareSDK;\n\nimport com.mob.tools.utils.ResHelper;\n\n/**\n* 快捷分享的入口\n* <p>\n* 通过不同的setter设置参数，然后调用{@link #show(Context)}方法启动快捷分享\n*/\npublic class OnekeyShare {\n\tprivate HashMap<String, Object> params;\n\n\tpublic OnekeyShare() {\n\t\tparams = new HashMap<String, Object>();\n\t\tparams.put(\"customers\", new ArrayList<CustomerLogo>());\n\t\tparams.put(\"hiddenPlatforms\", new HashMap<String, String>());\n\t}\n\n\t/** address是接收人地址，仅在信息和邮件使用，否则可以不提供 */\n\tpublic void setAddress(String address) {\n\t\tparams.put(\"address\", address);\n\t}\n\n\t/**\n\t * title标题，在印象笔记、邮箱、信息、微信（包括好友、朋友圈和收藏）、\n\t * 易信（包括好友、朋友圈）、人人网和QQ空间使用，否则可以不提供\n\t */\n\tpublic void setTitle(String title) {\n\t\tparams.put(\"title\", title);\n\t}\n\n\t/** titleUrl是标题的网络链接，仅在人人网和QQ空间使用，否则可以不提供 */\n\tpublic void setTitleUrl(String titleUrl) {\n\t\tparams.put(\"titleUrl\", titleUrl);\n\t}\n\n\t/** text是分享文本，所有平台都需要这个字段 */\n\tpublic void setText(String text) {\n\t\tparams.put(\"text\", text);\n\t}\n\n\t/** 获取text字段的值 */\n\tpublic String getText() {\n\t\treturn params.containsKey(\"text\") ? String.valueOf(params.get(\"text\")) : null;\n\t}\n\n\t/** imagePath是本地的图片路径，除Linked-In外的所有平台都支持这个字段 */\n\tpublic void setImagePath(String imagePath) {\n\t\tif(!TextUtils.isEmpty(imagePath))\n\t\t\tparams.put(\"imagePath\", imagePath);\n\t}\n\n\t/** imageUrl是图片的网络路径，新浪微博、人人网、QQ空间和Linked-In支持此字段 */\n\tpublic void setImageUrl(String imageUrl) {\n\t\tif (!TextUtils.isEmpty(imageUrl))\n\t\t\tparams.put(\"imageUrl\", imageUrl);\n\t}\n\n\t/** url在微信（包括好友、朋友圈收藏）和易信（包括好友和朋友圈）中使用，否则可以不提供 */\n\tpublic void setUrl(String url) {\n\t\tparams.put(\"url\", url);\n\t}\n\n\t/** filePath是待分享应用程序的本地路劲，仅在微信（易信）好友和Dropbox中使用，否则可以不提供 */\n\tpublic void setFilePath(String filePath) {\n\t\tparams.put(\"filePath\", filePath);\n\t}\n\n\t/** comment是我对这条分享的评论，仅在人人网和QQ空间使用，否则可以不提供 */\n\tpublic void setComment(String comment) {\n\t\tparams.put(\"comment\", comment);\n\t}\n\n\t/** site是分享此内容的网站名称，仅在QQ空间使用，否则可以不提供 */\n\tpublic void setSite(String site) {\n\t\tparams.put(\"site\", site);\n\t}\n\n\t/** siteUrl是分享此内容的网站地址，仅在QQ空间使用，否则可以不提供 */\n\tpublic void setSiteUrl(String siteUrl) {\n\t\tparams.put(\"siteUrl\", siteUrl);\n\t}\n\n\t/** foursquare分享时的地方名 */\n\tpublic void setVenueName(String venueName) {\n\t\tparams.put(\"venueName\", venueName);\n\t}\n\n\t/** foursquare分享时的地方描述 */\n\tpublic void setVenueDescription(String venueDescription) {\n\t\tparams.put(\"venueDescription\", venueDescription);\n\t}\n\n\t/** 分享地纬度，新浪微博、腾讯微博和foursquare支持此字段 */\n\tpublic void setLatitude(float latitude) {\n\t\tparams.put(\"latitude\", latitude);\n\t}\n\n\t/** 分享地经度，新浪微博、腾讯微博和foursquare支持此字段 */\n\tpublic void setLongitude(float longitude) {\n\t\tparams.put(\"longitude\", longitude);\n\t}\n\n\t/** 是否直接分享 */\n\tpublic void setSilent(boolean silent) {\n\t\tparams.put(\"silent\", silent);\n\t}\n\n\t/** 设置编辑页的初始化选中平台 */\n\tpublic void setPlatform(String platform) {\n\t\tparams.put(\"platform\", platform);\n\t}\n\n\t/** 设置KakaoTalk的应用下载地址 */\n\tpublic void setInstallUrl(String installurl) {\n\t\tparams.put(\"installurl\", installurl);\n\t}\n\n\t/** 设置KakaoTalk的应用打开地址 */\n\tpublic void setExecuteUrl(String executeurl) {\n\t\tparams.put(\"executeurl\", executeurl);\n\t}\n\n\t/** 设置微信分享的音乐的地址 */\n\tpublic void setMusicUrl(String musicUrl) {\n\t\tparams.put(\"musicUrl\", musicUrl);\n\t}\n\n\t/** 设置自定义的外部回调 */\n\tpublic void setCallback(PlatformActionListener callback) {\n\t\tparams.put(\"callback\", callback);\n\t}\n\n\t/** 返回操作回调 */\n\tpublic PlatformActionListener getCallback() {\n\t\treturn ResHelper.forceCast(params.get(\"callback\"));\n\t}\n\n\t/** 设置用于分享过程中，根据不同平台自定义分享内容的回调 */\n\tpublic void setShareContentCustomizeCallback(ShareContentCustomizeCallback callback) {\n\t\tparams.put(\"customizeCallback\", callback);\n\t}\n\n\t/** 自定义不同平台分享不同内容的回调 */\n\tpublic ShareContentCustomizeCallback getShareContentCustomizeCallback() {\n\t\treturn ResHelper.forceCast(params.get(\"customizeCallback\"));\n\t}\n\n\t/** 设置自己图标和点击事件，可以重复调用添加多次 */\n\tpublic void setCustomerLogo(Bitmap logo, String label, OnClickListener ocl) {\n\t\tCustomerLogo cl = new CustomerLogo();\n\t\tcl.logo = logo;\n\t\tcl.label = label;\n\t\tcl.listener = ocl;\n\t\tArrayList<CustomerLogo> customers = ResHelper.forceCast(params.get(\"customers\"));\n\t\tcustomers.add(cl);\n\t}\n\n\t/** 设置一个总开关，用于在分享前若需要授权，则禁用sso功能 */\n\tpublic void disableSSOWhenAuthorize() {\n\t\tparams.put(\"disableSSO\", true);\n\t}\n\n\t/** 设置视频网络地址 */\n\tpublic void setVideoUrl(String url) {\n\t\tparams.put(\"url\", url);\n\t\tparams.put(\"shareType\", Platform.SHARE_VIDEO);\n\t}\n\n\t/** 设置编辑页面的显示模式为Dialog模式 */\n\t@Deprecated\n\tpublic void setDialogMode() {\n\t\tparams.put(\"dialogMode\", true);\n\t}\n\n\t/** 添加一个隐藏的platform */\n\tpublic void addHiddenPlatform(String platform) {\n\t\tHashMap<String, String> hiddenPlatforms = ResHelper.forceCast(params.get(\"hiddenPlatforms\"));\n\t\thiddenPlatforms.put(platform, platform);\n\t}\n\n\t/** 设置一个将被截图分享的View , surfaceView是截不了图片的*/\n\tpublic void setViewToShare(View viewToShare) {\n\t\ttry {\n\t\t\tBitmap bm = captureView(viewToShare, viewToShare.getWidth(), viewToShare.getHeight());\n\t\t\tparams.put(\"viewToShare\", bm);\n\t\t} catch (Throwable e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t}\n\n\t/** 腾讯微博分享多张图片 */\n\tpublic void setImageArray(String[] imageArray) {\n\t\tparams.put(\"imageArray\", imageArray);\n\t}\n\n\t/** 设置在执行分享到QQ或QZone的同时，分享相同的内容腾讯微博 */\n\tpublic void setShareToTencentWeiboWhenPerformingQQOrQZoneSharing() {\n\t\tparams.put(\"isShareTencentWeibo\", true);\n\t}\n\n\t/** 设置分享界面的样式，目前只有一种，不需要设置 */\n\tpublic void setTheme(OnekeyShareTheme theme) {\n\t\tparams.put(\"theme\", theme.getValue());\n\t}\n\n\t@SuppressWarnings(\"unchecked\")\n\tpublic void show(Context context) {\n\t\tHashMap<String, Object> shareParamsMap = new HashMap<String, Object>();\n\t\tshareParamsMap.putAll(params);\n\n\t\tShareSDK.initSDK(context.getApplicationContext());\n\n\t\t// 打开分享菜单的统计\n\t\tShareSDK.logDemoEvent(1, null);\n\n\t\tint iTheme = 0;\n\t\ttry {\n\t\t\tiTheme = ResHelper.parseInt(String.valueOf(shareParamsMap.remove(\"theme\")));\n\t\t} catch (Throwable t) {}\n\t\tOnekeyShareTheme theme = OnekeyShareTheme.fromValue(iTheme);\n\t\tOnekeyShareThemeImpl themeImpl = theme.getImpl();\n\n\t\tthemeImpl.setShareParamsMap(shareParamsMap);\n\t\tthemeImpl.setDialogMode(shareParamsMap.containsKey(\"dialogMode\") ? ((Boolean) shareParamsMap.remove(\"dialogMode\")) : false);\n\t\tthemeImpl.setSilent(shareParamsMap.containsKey(\"silent\") ? ((Boolean) shareParamsMap.remove(\"silent\")) : false);\n\t\tthemeImpl.setCustomerLogos((ArrayList<CustomerLogo>) shareParamsMap.remove(\"customers\"));\n\t\tthemeImpl.setHiddenPlatforms((HashMap<String, String>) shareParamsMap.remove(\"hiddenPlatforms\"));\n\t\tthemeImpl.setPlatformActionListener((PlatformActionListener) shareParamsMap.remove(\"callback\"));\n\t\tthemeImpl.setShareContentCustomizeCallback((ShareContentCustomizeCallback) shareParamsMap.remove(\"customizeCallback\"));\n\t\tif (shareParamsMap.containsKey(\"disableSSO\") ? ((Boolean) shareParamsMap.remove(\"disableSSO\")) : false) {\n\t\t\tthemeImpl.disableSSO();\n\t\t}\n\n\t\tthemeImpl.show(context.getApplicationContext());\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/OnekeySharePage.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\nimport cn.sharesdk.framework.Platform;\nimport cn.sharesdk.framework.Platform.ShareParams;\nimport cn.sharesdk.framework.PlatformActionListener;\n\nimport com.mob.tools.FakeActivity;\n\n/** 快捷分享的基类 */\npublic class OnekeySharePage extends FakeActivity {\n\tprivate OnekeyShareThemeImpl impl;\n\n\tpublic OnekeySharePage(OnekeyShareThemeImpl impl) {\n\t\tthis.impl = impl;\n\t}\n\n\t/** 分享界面是否弹窗模式 */\n\tprotected final boolean isDialogMode() {\n\t\treturn impl.dialogMode;\n\t}\n\n\tprotected final HashMap<String, Object> getShareParamsMap() {\n\t\treturn impl.shareParamsMap;\n\t}\n\n\t/** 静默分享开关（没有界面，直接分享 ）*/\n\tprotected final boolean isSilent() {\n\t\treturn impl.silent;\n\t}\n\n\tprotected final ArrayList<CustomerLogo> getCustomerLogos() {\n\t\treturn impl.customerLogos;\n\t}\n\n\tprotected final HashMap<String, String> getHiddenPlatforms() {\n\t\treturn impl.hiddenPlatforms;\n\t}\n\n\tprotected final PlatformActionListener getCallback() {\n\t\treturn impl.callback;\n\t}\n\n\tprotected final ShareContentCustomizeCallback getCustomizeCallback() {\n\t\treturn impl.customizeCallback;\n\t}\n\n\tprotected final boolean isDisableSSO() {\n\t\treturn impl.disableSSO;\n\t}\n\n\tprotected final void shareSilently(Platform platform) {\n\t\timpl.shareSilently(platform);\n\t}\n\n\tprotected final ShareParams formateShareData(Platform platform) {\n\t\tif (impl.formateShareData(platform)) {\n\t\t\treturn impl.shareDataToShareParams(platform);\n\t\t}\n\t\treturn null;\n\t}\n\n\tprotected final boolean isUseClientToShare(Platform platform) {\n\t\treturn impl.isUseClientToShare(platform);\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/OnekeyShareTheme.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare;\n\nimport cn.sharesdk.onekeyshare.themes.classic.ClassicTheme;\n\n/** 快捷分享的主题样式  */\npublic enum OnekeyShareTheme {\n\t/** 九格宫的主题样式 ,对应的实现类ClassicTheme */\n\tCLASSIC(0, new ClassicTheme());\n\n\tprivate final int value;\n\tprivate final OnekeyShareThemeImpl impl;\n\n\tprivate OnekeyShareTheme(int value, OnekeyShareThemeImpl impl) {\n\t\tthis.value = value;\n\t\tthis.impl = impl;\n\t}\n\n\tpublic int getValue() {\n\t\treturn value;\n\t}\n\n\tpublic OnekeyShareThemeImpl getImpl() {\n\t\treturn impl;\n\t}\n\n\tpublic static OnekeyShareTheme fromValue(int value) {\n\t\tfor (OnekeyShareTheme theme : OnekeyShareTheme.values()) {\n\t\t\tif (theme.value == value) {\n\t\t\t\treturn theme;\n\t\t\t}\n\t\t}\n\t\treturn CLASSIC;\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/OnekeyShareThemeImpl.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.ResolveInfo;\nimport android.graphics.Bitmap;\nimport android.graphics.Bitmap.CompressFormat;\nimport android.os.Handler.Callback;\nimport android.os.Message;\nimport android.text.TextUtils;\nimport android.widget.Toast;\nimport cn.sharesdk.framework.CustomPlatform;\nimport cn.sharesdk.framework.Platform;\nimport cn.sharesdk.framework.Platform.ShareParams;\nimport cn.sharesdk.framework.PlatformActionListener;\nimport cn.sharesdk.framework.ShareSDK;\n\nimport com.mob.tools.utils.ResHelper;\nimport com.mob.tools.utils.UIHandler;\n\n/** 快捷分享的主题样式的实现父类 */\npublic abstract class OnekeyShareThemeImpl implements PlatformActionListener, Callback {\n\tprotected boolean dialogMode;\n\tprotected HashMap<String, Object> shareParamsMap;\n\tprotected boolean silent;\n\tprotected ArrayList<CustomerLogo> customerLogos;\n\tprotected HashMap<String, String> hiddenPlatforms;\n\tprotected PlatformActionListener callback;\n\tprotected ShareContentCustomizeCallback customizeCallback;\n\tprotected boolean disableSSO;\n\tprotected Context context;\n\n\tpublic OnekeyShareThemeImpl() {\n\t\tcallback = this;\n\t}\n\n\tpublic final void setDialogMode(boolean dialogMode) {\n\t\tthis.dialogMode = dialogMode;\n\t}\n\n\tpublic final void setShareParamsMap(HashMap<String, Object> shareParamsMap) {\n\t\tthis.shareParamsMap = shareParamsMap;\n\t}\n\n\tpublic final void setSilent(boolean silent) {\n\t\tthis.silent = silent;\n\t}\n\n\tpublic final void setCustomerLogos(ArrayList<CustomerLogo> customerLogos) {\n\t\tthis.customerLogos = customerLogos;\n\t}\n\n\tpublic final void setHiddenPlatforms(HashMap<String, String> hiddenPlatforms) {\n\t\tthis.hiddenPlatforms = hiddenPlatforms;\n\t}\n\n\tpublic final void setPlatformActionListener(PlatformActionListener callback) {\n\t\tthis.callback = callback == null ? this : callback;\n\t}\n\n\tpublic final void setShareContentCustomizeCallback(ShareContentCustomizeCallback customizeCallback) {\n\t\tthis.customizeCallback = customizeCallback;\n\t}\n\n\tpublic final void disableSSO() {\n\t\tdisableSSO = true;\n\t}\n\n\tpublic final void show(Context context) {\n\t\tthis.context = context;\n\n\t\t// 显示方式是由platform和silent两个字段控制的\n\t\t// 如果platform设置了，则无须显示九宫格，否则都会显示；\n\t\t// 如果silent为true，表示不进入编辑页面，否则会进入。\n\t\tif (shareParamsMap.containsKey(\"platform\")) {\n\t\t\tString name = String.valueOf(shareParamsMap.get(\"platform\"));\n\t\t\tPlatform platform = ShareSDK.getPlatform(name);\n\t\t\tboolean isCustomPlatform = platform instanceof CustomPlatform;\n\t\t\tboolean isUseClientToShare = isUseClientToShare(platform);\n\t\t\tif (silent || isCustomPlatform || isUseClientToShare) {\n\t\t\t\tshareSilently(platform);\n\t\t\t} else {\n\t\t\t\tprepareForEditPage(platform);\n\t\t\t}\n\t\t} else {\n\t\t\tshowPlatformPage(context);\n\t\t}\n\t}\n\n\t/** 判断指定平台是否只能使用客户端分享 */\n\tfinal boolean isUseClientToShare(Platform platform) {\n\t\tString name = platform.getName();\n\t\tif (\"Wechat\".equals(name) || \"WechatMoments\".equals(name)\n\t\t\t\t|| \"WechatFavorite\".equals(name) || \"ShortMessage\".equals(name)\n\t\t\t\t|| \"Email\".equals(name) || \"Qzone\".equals(name)\n\t\t\t\t|| \"QQ\".equals(name) || \"Pinterest\".equals(name)\n\t\t\t\t|| \"Instagram\".equals(name) || \"Yixin\".equals(name)\n\t\t\t\t|| \"YixinMoments\".equals(name) || \"QZone\".equals(name)\n\t\t\t\t|| \"Mingdao\".equals(name) || \"Line\".equals(name)\n\t\t\t\t|| \"KakaoStory\".equals(name) || \"KakaoTalk\".equals(name)\n\t\t\t\t|| \"Bluetooth\".equals(name) || \"WhatsApp\".equals(name)\n\t\t\t\t|| \"BaiduTieba\".equals(name) || \"Laiwang\".equals(name)\n\t\t\t\t|| \"LaiwangMoments\".equals(name) || \"Alipay\".equals(name)\n\t\t\t\t|| \"AlipayMoments\".equals(name)|| \"FacebookMessenger\".equals(name)\n\t\t\t\t|| \"GooglePlus\".equals(name)\n\t\t\t\t) {\n\t\t\treturn true;\n\t\t} else if (\"Evernote\".equals(name)) {\n\t\t\tif (\"true\".equals(platform.getDevinfo(\"ShareByAppClient\"))) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else if (\"SinaWeibo\".equals(name)) {\n\t\t\tif (\"true\".equals(platform.getDevinfo(\"ShareByAppClient\"))) {\n\n\t\t\t\tIntent test = new Intent(Intent.ACTION_SEND);\n\t\t\t\ttest.setPackage(\"com.sina.weibo\");\n\t\t\t\ttest.setType(\"image/*\");\n\t\t\t\tResolveInfo ri = platform.getContext().getPackageManager().resolveActivity(test, 0);\n\t\t\t\tif(ri == null) {\n\t\t\t\t\ttest = new Intent(Intent.ACTION_SEND);\n\t\t\t\t\ttest.setPackage(\"com.sina.weibog3\");\n\t\t\t\t\ttest.setType(\"image/*\");\n\t\t\t\t\tri = platform.getContext().getPackageManager().resolveActivity(test, 0);\n\t\t\t\t}\n\t\t\t\treturn (ri != null);\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tfinal void shareSilently(Platform platform) {\n\t\tif (formateShareData(platform)) {\n\t\t\tShareParams sp = shareDataToShareParams(platform);\n\t\t\tif (sp != null) {\n\t\t\t\ttoast(\"ssdk_oks_sharing\");\n\t\t\t\tif (customizeCallback != null) {\n\t\t\t\t\tcustomizeCallback.onShare(platform, sp);\n\t\t\t\t}\n\t\t\t\tif (disableSSO) {\n\t\t\t\t\tplatform.SSOSetting(disableSSO);\n\t\t\t\t}\n\t\t\t\tplatform.setPlatformActionListener(callback);\n\t\t\t\tplatform.share(sp);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate void prepareForEditPage(Platform platform) {\n\t\tif (formateShareData(platform)) {\n\t\t\tShareParams sp = shareDataToShareParams(platform);\n\t\t\tif (sp != null) {\n\t\t\t\t// 编辑分享内容的统计\n\t\t\t\tShareSDK.logDemoEvent(3, null);\n\t\t\t\tif (customizeCallback != null) {\n\t\t\t\t\tcustomizeCallback.onShare(platform, sp);\n\t\t\t\t}\n\t\t\t\tshowEditPage(context, platform, sp);\n\t\t\t}\n\t\t}\n\t}\n\n\tfinal boolean formateShareData(Platform plat) {\n\t\tString name = plat.getName();\n\n\t\tboolean isAlipay = \"Alipay\".equals(name) || \"AlipayMoments\".equals(name);\n\t\tif (isAlipay && !plat.isClientValid()) {\n\t\t\ttoast(\"ssdk_alipay_client_inavailable\");\n\t\t\treturn false;\n\t\t}\n\n\t\tboolean isKakaoTalk = \"KakaoTalk\".equals(name);\n\t\tif (isKakaoTalk && !plat.isClientValid()) {\n\t\t\ttoast(\"ssdk_kakaotalk_client_inavailable\");\n\t\t\treturn false;\n\t\t}\n\n\t\tboolean isKakaoStory = \"KakaoStory\".equals(name);\n\t\tif (isKakaoStory && !plat.isClientValid()) {\n\t\t\ttoast(\"ssdk_kakaostory_client_inavailable\");\n\t\t\treturn false;\n\t\t}\n\n\t\tboolean isLine = \"Line\".equals(name);\n\t\tif (isLine && !plat.isClientValid()) {\n\t\t\ttoast(\"ssdk_line_client_inavailable\");\n\t\t\treturn false;\n\t\t}\n\n\t\tboolean isWhatsApp = \"WhatsApp\".equals(name);\n\t\tif (isWhatsApp && !plat.isClientValid()) {\n\t\t\ttoast(\"ssdk_whatsapp_client_inavailable\");\n\t\t\treturn false;\n\t\t}\n\n\t\tboolean isPinterest = \"Pinterest\".equals(name);\n\t\tif (isPinterest && !plat.isClientValid()) {\n\t\t\ttoast(\"ssdk_pinterest_client_inavailable\");\n\t\t\treturn false;\n\t\t}\n\n\t\tif (\"Instagram\".equals(name) && !plat.isClientValid()) {\n\t\t\ttoast(\"ssdk_instagram_client_inavailable\");\n\t\t\treturn false;\n\t\t}\n\n\t\tif (\"QZone\".equals(name) && !plat.isClientValid()) {\n\t\t\ttoast(\"ssdk_qq_client_inavailable\");\n\t\t\treturn false;\n\t\t}\n\n\t\tboolean isLaiwang = \"Laiwang\".equals(name);\n\t\tboolean isLaiwangMoments = \"LaiwangMoments\".equals(name);\n\t\tif(isLaiwang || isLaiwangMoments){\n\t\t\tif (!plat.isClientValid()) {\n\t\t\t\ttoast(\"ssdk_laiwang_client_inavailable\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tboolean isYixin = \"YixinMoments\".equals(name) || \"Yixin\".equals(name);\n\t\tif (isYixin && !plat.isClientValid()) {\n\t\t\ttoast(\"ssdk_yixin_client_inavailable\");\n\t\t\treturn false;\n\t\t}\n\n\t\tboolean isWechat = \"WechatFavorite\".equals(name) || \"Wechat\".equals(name) || \"WechatMoments\".equals(name);\n\t\tif (isWechat && !plat.isClientValid()) {\n\t\t\ttoast(\"ssdk_wechat_client_inavailable\");\n\t\t\treturn false;\n\t\t}\n\n\t\tif (\"FacebookMessenger\".equals(name) && !plat.isClientValid()) {\n\t\t\ttoast(\"ssdk_facebookmessenger_client_inavailable\");\n\t\t\treturn false;\n\t\t}\n\n\t\tif (!shareParamsMap.containsKey(\"shareType\")) {\n\t\t\tint shareType = Platform.SHARE_TEXT;\n\t\t\tString imagePath = String.valueOf(shareParamsMap.get(\"imagePath\"));\n\t\t\tif (imagePath != null && (new File(imagePath)).exists()) {\n\t\t\t\tshareType = Platform.SHARE_IMAGE;\n\t\t\t\tif (imagePath.endsWith(\".gif\") && isWechat) {\n\t\t\t\t\tshareType = Platform.SHARE_EMOJI;\n\t\t\t\t} else if (shareParamsMap.containsKey(\"url\") && !TextUtils.isEmpty(shareParamsMap.get(\"url\").toString())) {\n\t\t\t\t\tshareType = Platform.SHARE_WEBPAGE;\n\t\t\t\t\tif (shareParamsMap.containsKey(\"musicUrl\") && !TextUtils.isEmpty(shareParamsMap.get(\"musicUrl\").toString()) && isWechat) {\n\t\t\t\t\t\tshareType = Platform.SHARE_MUSIC;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tBitmap viewToShare = ResHelper.forceCast(shareParamsMap.get(\"viewToShare\"));\n\t\t\t\tif (viewToShare != null && !viewToShare.isRecycled()) {\n\t\t\t\t\tshareType = Platform.SHARE_IMAGE;\n\t\t\t\t\tif (shareParamsMap.containsKey(\"url\") && !TextUtils.isEmpty(shareParamsMap.get(\"url\").toString())) {\n\t\t\t\t\t\tshareType = Platform.SHARE_WEBPAGE;\n\t\t\t\t\t\tif (shareParamsMap.containsKey(\"musicUrl\") && !TextUtils.isEmpty(shareParamsMap.get(\"musicUrl\").toString()) && isWechat) {\n\t\t\t\t\t\t\tshareType = Platform.SHARE_MUSIC;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tObject imageUrl = shareParamsMap.get(\"imageUrl\");\n\t\t\t\t\tif (imageUrl != null && !TextUtils.isEmpty(String.valueOf(imageUrl))) {\n\t\t\t\t\t\tshareType = Platform.SHARE_IMAGE;\n\t\t\t\t\t\tif (String.valueOf(imageUrl).endsWith(\".gif\") && isWechat) {\n\t\t\t\t\t\t\tshareType = Platform.SHARE_EMOJI;\n\t\t\t\t\t\t} else if (shareParamsMap.containsKey(\"url\") && !TextUtils.isEmpty(shareParamsMap.get(\"url\").toString())) {\n\t\t\t\t\t\t\tshareType = Platform.SHARE_WEBPAGE;\n\t\t\t\t\t\t\tif (shareParamsMap.containsKey(\"musicUrl\") && !TextUtils.isEmpty(shareParamsMap.get(\"musicUrl\").toString()) && isWechat) {\n\t\t\t\t\t\t\t\tshareType = Platform.SHARE_MUSIC;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tshareParamsMap.put(\"shareType\", shareType);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tfinal ShareParams shareDataToShareParams(Platform plat) {\n\t\tif (plat == null || shareParamsMap == null) {\n\t\t\ttoast(\"ssdk_oks_share_failed\");\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\tString imagePath = ResHelper.forceCast(shareParamsMap.get(\"imagePath\"));\n\t\t\tBitmap viewToShare = ResHelper.forceCast(shareParamsMap.get(\"viewToShare\"));\n\t\t\tif (TextUtils.isEmpty(imagePath) && viewToShare != null && !viewToShare.isRecycled()) {\n\t\t\t\tString path = ResHelper.getCachePath(plat.getContext(), \"screenshot\");\n\t\t\t\tFile ss = new File(path, String.valueOf(System.currentTimeMillis()) + \".jpg\");\n\t\t\t\tFileOutputStream fos = new FileOutputStream(ss);\n\t\t\t\tviewToShare.compress(CompressFormat.JPEG, 100, fos);\n\t\t\t\tfos.flush();\n\t\t\t\tfos.close();\n\t\t\t\tshareParamsMap.put(\"imagePath\", ss.getAbsolutePath());\n\t\t\t}\n\t\t} catch (Throwable t) {\n\t\t\tt.printStackTrace();\n\t\t\ttoast(\"ssdk_oks_share_failed\");\n\t\t\treturn null;\n\t\t}\n\n\t\treturn new ShareParams(shareParamsMap);\n\t}\n\n\tprivate void toast(final String resOrName) {\n\t\tUIHandler.sendEmptyMessage(0, new Callback() {\n\t\t\tpublic boolean handleMessage(Message msg) {\n\t\t\t\tint resId = ResHelper.getStringRes(context, resOrName);\n\t\t\t\tif (resId > 0) {\n\t\t\t\t\tToast.makeText(context, resId, Toast.LENGTH_SHORT).show();\n\t\t\t\t} else {\n\t\t\t\t\tToast.makeText(context, resOrName, Toast.LENGTH_SHORT).show();\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\tprotected abstract void showPlatformPage(Context context);\n\n\tprotected abstract void showEditPage(Context context, Platform platform, ShareParams sp);\n\n\tpublic final void onComplete(Platform platform, int action,\n\t\t\tHashMap<String, Object> res) {\n\t\tMessage msg = new Message();\n\t\tmsg.arg1 = 1;\n\t\tmsg.arg2 = action;\n\t\tmsg.obj = platform;\n\t\tUIHandler.sendMessage(msg, this);\n\t}\n\n\tpublic final void onError(Platform platform, int action, Throwable t) {\n\t\tt.printStackTrace();\n\n\t\tMessage msg = new Message();\n\t\tmsg.arg1 = 2;\n\t\tmsg.arg2 = action;\n\t\tmsg.obj = t;\n\t\tUIHandler.sendMessage(msg, this);\n\n\t\t// 分享失败的统计\n\t\tShareSDK.logDemoEvent(4, platform);\n\t}\n\n\tpublic final void onCancel(Platform platform, int action) {\n\t\tMessage msg = new Message();\n\t\tmsg.arg1 = 3;\n\t\tmsg.arg2 = action;\n\t\tmsg.obj = platform;\n\t\tUIHandler.sendMessage(msg, this);\n\n\t\t// 分享失败的统计\n\t\tShareSDK.logDemoEvent(5, platform);\n\t}\n\n\tpublic final boolean handleMessage(Message msg) {\n\t\tswitch (msg.arg1) {\n\t\t\tcase 1: {\n\t\t\t\t// 成功\n\t\t\t\tint resId = ResHelper.getStringRes(context, \"ssdk_oks_share_completed\");\n\t\t\t\tif (resId > 0) {\n\t\t\t\t\ttoast(context.getString(resId));\n\t\t\t\t}\n\t\t\t} break;\n\t\t\tcase 2: {\n\t\t\t\t// 失败\n\t\t\t\tString expName = msg.obj.getClass().getSimpleName();\n\t\t\t\tif (\"WechatClientNotExistException\".equals(expName)\n\t\t\t\t\t\t|| \"WechatTimelineNotSupportedException\".equals(expName)\n\t\t\t\t\t\t|| \"WechatFavoriteNotSupportedException\".equals(expName)) {\n\t\t\t\t\ttoast(\"ssdk_wechat_client_inavailable\");\n\t\t\t\t} else if (\"GooglePlusClientNotExistException\".equals(expName)) {\n\t\t\t\t\ttoast(\"ssdk_google_plus_client_inavailable\");\n\t\t\t\t} else if (\"QQClientNotExistException\".equals(expName)) {\n\t\t\t\t\ttoast(\"ssdk_qq_client_inavailable\");\n\t\t\t\t} else if (\"YixinClientNotExistException\".equals(expName)\n\t\t\t\t\t\t|| \"YixinTimelineNotSupportedException\".equals(expName)) {\n\t\t\t\t\ttoast(\"ssdk_yixin_client_inavailable\");\n\t\t\t\t} else if (\"KakaoTalkClientNotExistException\".equals(expName)) {\n\t\t\t\t\ttoast(\"ssdk_kakaotalk_client_inavailable\");\n\t\t\t\t} else if (\"KakaoStoryClientNotExistException\".equals(expName)) {\n\t\t\t\t\ttoast(\"ssdk_kakaostory_client_inavailable\");\n\t\t\t\t} else if(\"WhatsAppClientNotExistException\".equals(expName)){\n\t\t\t\t\ttoast(\"ssdk_whatsapp_client_inavailable\");\n\t\t\t\t} else if(\"FacebookMessengerClientNotExistException\".equals(expName)){\n\t\t\t\t\ttoast(\"ssdk_facebookmessenger_client_inavailable\");\n\t\t\t\t} else {\n\t\t\t\t\ttoast(\"ssdk_oks_share_failed\");\n\t\t\t\t}\n\t\t\t} break;\n\t\t\tcase 3: {\n\t\t\t\t// 取消\n\t\t\t\ttoast(\"ssdk_oks_share_canceled\");\n\t\t\t} break;\n\t\t}\n\t\treturn false;\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/ShareContentCustomizeCallback.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare;\n\nimport cn.sharesdk.framework.Platform;\nimport cn.sharesdk.framework.Platform.ShareParams;\n\n/** 自定义不同平台分享不同内容的接口 */\npublic interface ShareContentCustomizeCallback {\n\n\tpublic void onShare(Platform platform, ShareParams paramsToShare);\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/ClassicTheme.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic;\n\nimport android.content.Context;\nimport android.content.res.Configuration;\nimport cn.sharesdk.framework.Platform;\nimport cn.sharesdk.framework.Platform.ShareParams;\nimport cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;\nimport cn.sharesdk.onekeyshare.themes.classic.land.EditPageLand;\nimport cn.sharesdk.onekeyshare.themes.classic.land.PlatformPageLand;\nimport cn.sharesdk.onekeyshare.themes.classic.port.EditPagePort;\nimport cn.sharesdk.onekeyshare.themes.classic.port.PlatformPagePort;\n\n/** 九宫格经典主题样式的实现类*/\npublic class ClassicTheme extends OnekeyShareThemeImpl {\n\n\t/** 展示平台列表*/\n\tprotected void showPlatformPage(Context context) {\n\t\tPlatformPage page;\n\t\tint orientation = context.getResources().getConfiguration().orientation;\n\t\tif (orientation == Configuration.ORIENTATION_PORTRAIT) {\n\t\t\tpage = new PlatformPagePort(this);\n\t\t} else {\n\t\t\tpage = new PlatformPageLand(this);\n\t\t}\n\t\tpage.show(context, null);\n\t}\n\n\t/** 展示编辑界面*/\n\tprotected void showEditPage(Context context, Platform platform, ShareParams sp) {\n\t\tEditPage page;\n\t\tint orientation = context.getResources().getConfiguration().orientation;\n\t\tif (orientation == Configuration.ORIENTATION_PORTRAIT) {\n\t\t\tpage = new EditPagePort(this);\n\t\t} else {\n\t\t\tpage = new EditPageLand(this);\n\t\t}\n\t\tpage.setPlatform(platform);\n\t\tpage.setShareParams(sp);\n\t\tpage.show(context, null);\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/EditPage.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\nimport android.app.Activity;\nimport android.content.res.Configuration;\nimport android.graphics.Bitmap;\nimport android.graphics.drawable.ColorDrawable;\nimport android.text.Editable;\nimport android.text.TextUtils;\nimport android.text.TextWatcher;\nimport android.view.View;\nimport android.view.View.OnClickListener;\nimport android.view.ViewGroup.LayoutParams;\nimport android.view.WindowManager;\nimport android.widget.EditText;\nimport android.widget.LinearLayout;\nimport android.widget.RelativeLayout;\nimport android.widget.ScrollView;\nimport android.widget.TextView;\nimport android.widget.Toast;\nimport cn.sharesdk.framework.Platform;\nimport cn.sharesdk.framework.Platform.ShareParams;\nimport cn.sharesdk.framework.ShareSDK;\nimport cn.sharesdk.onekeyshare.OnekeySharePage;\nimport cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;\nimport cn.sharesdk.onekeyshare.themes.classic.land.FriendListPageLand;\nimport cn.sharesdk.onekeyshare.themes.classic.port.FriendListPagePort;\n\nimport com.mob.tools.gui.AsyncImageView;\nimport com.mob.tools.utils.DeviceHelper;\nimport com.mob.tools.utils.ResHelper;\n\npublic class EditPage extends OnekeySharePage implements OnClickListener, TextWatcher, Runnable {\n\tprivate OnekeyShareThemeImpl impl;\n\tprotected Platform platform;\n\tprotected ShareParams sp;\n\n\tprotected LinearLayout llPage;\n\tprotected RelativeLayout rlTitle;\n\tprotected ScrollView svContent;\n\tprotected EditText etContent;\n\tprotected TextView tvCancel;\n\tprotected TextView tvShare;\n\tprotected RelativeLayout rlThumb;\n\t/** 异步加载图片的控件 */\n\tprotected AsyncImageView aivThumb;\n\tprotected XView xvRemove;\n\tprotected LinearLayout llBottom;\n\tprotected TextView tvAt;\n\tprotected TextView tvTextCouter;\n\n\tprotected Bitmap thumb;\n\tprotected int maxBodyHeight;\n\n\tpublic EditPage(OnekeyShareThemeImpl impl) {\n\t\tsuper(impl);\n\t\tthis.impl = impl;\n\t}\n\n\tpublic void setPlatform(Platform platform) {\n\t\tthis.platform = platform;\n\t}\n\n\tpublic void setShareParams(ShareParams sp) {\n\t\tthis.sp = sp;\n\t}\n\n\tpublic void setActivity(Activity activity) {\n\t\tsuper.setActivity(activity);\n\t\tif (isDialogMode()) {\n\t\t\tSystem.err.println(\"Theme classic does not support dialog mode!\");\n//\t\t\tactivity.setTheme(android.R.style.Theme_Dialog);\n//\t\t\tactivity.requestWindowFeature(Window.FEATURE_NO_TITLE);\n//\t\t\tif (Build.VERSION.SDK_INT >= 11) {\n//\t\t\t\ttry {\n//\t\t\t\t\tReflectHelper.invokeInstanceMethod(activity, \"setFinishOnTouchOutside\", false);\n//\t\t\t\t} catch (Throwable e) {}\n//\t\t\t}\n\t\t}\n\n\t\tactivity.getWindow().setSoftInputMode(\n\t\t\t\tWindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE |\n\t\t\t\tWindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);\n\t}\n\n\tpublic void onCreate() {\n\t\tactivity.getWindow().setBackgroundDrawable(new ColorDrawable(0xfff3f3f3));\n\t}\n\n\t/** 取消分享时，执行的方法 */\n\tprivate void cancelAndFinish() {\n\t\t// 分享失败的统计\n\t\tShareSDK.logDemoEvent(5, platform);\n\t\tfinish();\n\t}\n\n\t/** 执行分享时的方法 */\n\tprivate void shareAndFinish() {\n\t\tint resId = ResHelper.getStringRes(activity, \"ssdk_oks_sharing\");\n\t\tif (resId > 0) {\n\t\t\tToast.makeText(activity, resId, Toast.LENGTH_SHORT).show();\n\t\t}\n\n\t\tif (isDisableSSO()) {\n\t\t\tplatform.SSOSetting(true);\n\t\t}\n\t\tplatform.setPlatformActionListener(getCallback());\n\t\tplatform.share(sp);\n\n\t\tfinish();\n\t}\n\n\t/** 编辑界面，显示的图片 */\n\tprivate void showThumb(Bitmap pic) {\n\t\tPicViewerPage page = new PicViewerPage(impl);\n\t\tpage.setImageBitmap(pic);\n\t\tpage.show(activity, null);\n\t}\n\n\tprivate void removeThumb() {\n\t\tsp.setImageArray(null);\n\t\tsp.setImageData(null);\n\t\tsp.setImagePath(null);\n\t\tsp.setImageUrl(null);\n\t}\n\n\t/** @ 好友时，展示的好友列表 */\n\tprivate void showFriendList() {\n\t\tFriendListPage page;\n\t\tint orientation = activity.getResources().getConfiguration().orientation;\n\t\tif (orientation == Configuration.ORIENTATION_PORTRAIT) {\n\t\t\tpage = new FriendListPagePort(impl);\n\t\t} else {\n\t\t\tpage = new FriendListPageLand(impl);\n\t\t}\n\t\tpage.setPlatform(platform);\n\t\tpage.showForResult(platform.getContext(), null, this);\n\t}\n\n\tpublic void onResult(HashMap<String, Object> data) {\n\t\tString atText = getJoinSelectedUser(data);\n\t\tif(!TextUtils.isEmpty(atText)) {\n\t\t\tetContent.append(atText);\n\t\t}\n\t}\n\n\tprivate String getJoinSelectedUser(HashMap<String, Object> data) {\n\t\tif (data != null && data.containsKey(\"selected\")) {\n\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\tArrayList<String> selected = (ArrayList<String>) data.get(\"selected\");\n\t\t\tString platform = ((Platform)data.get(\"platform\")).getName();\n\t\t\tif(\"FacebookMessenger\".equals(platform)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tStringBuilder sb = new StringBuilder();\n\t\t\tfor (String sel : selected) {\n\t\t\t\tsb.append('@').append(sel).append(' ');\n\t\t\t}\n\t\t\treturn sb.toString();\n\t\t}\n\t\treturn null;\n\t}\n\n\tprotected boolean isShowAtUserLayout(String platformName) {\n\t\treturn \"SinaWeibo\".equals(platformName)\n\t\t\t\t|| \"TencentWeibo\".equals(platformName)\n\t\t\t\t|| \"Facebook\".equals(platformName)\n\t\t\t\t|| \"Twitter\".equals(platformName);\n\t}\n\n\tpublic void onClick(View v) {\n\t\tif (v.equals(tvCancel)) {\n\t\t\tcancelAndFinish();\n\t\t} else if (v.equals(tvShare)) {\n\t\t\tsp.setText(etContent.getText().toString().trim());\n\t\t\tshareAndFinish();\n\t\t} else if (v.equals(aivThumb)) {\n\t\t\tshowThumb(thumb);\n\t\t} else if (v.equals(xvRemove)) {\n\t\t\tmaxBodyHeight = 0;\n\t\t\trlThumb.setVisibility(View.GONE);\n\t\t\tllPage.measure(0, 0);\n\t\t\tonTextChanged(etContent.getText(), 0, 0, 0);\n\t\t\tremoveThumb();\n\t\t} else if (v.equals(tvAt)) {\n\t\t\tshowFriendList();\n\t\t}\n\t}\n\n\tpublic void onTextChanged(CharSequence s, int start, int before, int count) {\n\t\ttvTextCouter.setText(String.valueOf(s.length()));\n\n\t\tif (maxBodyHeight == 0) {\n\t\t\tmaxBodyHeight = llPage.getHeight() - rlTitle.getHeight() - llBottom.getHeight();\n\t\t}\n\n\t\tif (maxBodyHeight > 0) {\n\t\t\tsvContent.post(this);\n\t\t}\n\t}\n\n\t/** 动态适配编辑界面的高度 */\n\tpublic void run() {\n\t\tint height = svContent.getChildAt(0).getHeight();\n\t\tRelativeLayout.LayoutParams lp = ResHelper.forceCast(svContent.getLayoutParams());\n\t\tif (height > maxBodyHeight && lp.height != maxBodyHeight) {\n\t\t\tlp.height = maxBodyHeight;\n\t\t\tsvContent.setLayoutParams(lp);\n\t\t} else if (height < maxBodyHeight && lp.height == maxBodyHeight) {\n\t\t\tlp.height = LayoutParams.WRAP_CONTENT;\n\t\t\tsvContent.setLayoutParams(lp);\n\t\t}\n\t}\n\n\tpublic void afterTextChanged(Editable s) {\n\n\t}\n\n\tpublic void beforeTextChanged(CharSequence s, int start, int count, int after) {\n\n\t}\n\n\tpublic void onPause() {\n\t\tDeviceHelper.getInstance(activity).hideSoftInput(getContentView());\n\t\tsuper.onPause();\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/FriendAdapter.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\nimport android.graphics.drawable.ColorDrawable;\nimport android.os.Handler.Callback;\nimport android.os.Message;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.AdapterView.OnItemClickListener;\nimport android.widget.LinearLayout;\nimport cn.sharesdk.framework.Platform;\nimport cn.sharesdk.framework.PlatformActionListener;\n\nimport com.mob.tools.gui.PullToRequestListAdapter;\nimport com.mob.tools.gui.PullToRequestView;\nimport com.mob.tools.utils.UIHandler;\n\n/** 好友列表的适配器 */\npublic class FriendAdapter extends PullToRequestListAdapter implements PlatformActionListener {\n\tprivate FriendListPage activity;\n\tprivate boolean hasNext;\n\tprivate Platform platform;\n\t/** 请求好友列表时，每页15个 */\n\tprivate final int pageCount = 15;\n\t/** 当前的好友列表是第几页 */\n\tprivate int curPage;\n\t/** 好友列表数据 */\n\tprivate ArrayList<Following> follows;\n\t/** 判断当前的好友列表数据与请求的新数据是否有重复 */\n\tprivate HashMap<String, Boolean> map;\n\t/** 好友列表的头部View */\n\tprivate PRTHeader llHeader;\n\t/** 根据设计，按照比例来布局，以此来适配所有手机 */\n\tprivate float ratio;\n\n\tpublic FriendAdapter(FriendListPage activity, PullToRequestView view) {\n\t\tsuper(view);\n\t\tthis.activity = activity;\n\n\t\tcurPage = -1;\n\t\thasNext = true;\n\t\tmap = new HashMap<String, Boolean>();\n\t\tfollows = new ArrayList<Following>();\n\n\t\tgetListView().setDivider(new ColorDrawable(0xffeaeaea));\n\t}\n\n\tpublic void setRatio(float ratio) {\n\t\tthis.ratio = ratio;\n\t\tgetListView().setDividerHeight((int) (ratio < 1 ? 1 : ratio));\n\t}\n\n\tpublic void setOnItemClickListener(OnItemClickListener listener) {\n\t\tgetListView().setOnItemClickListener(listener);\n\t}\n\n\tpublic void setPlatform(Platform platform) {\n\t\tthis.platform = platform;\n\t\tplatform.setPlatformActionListener(this);\n\t}\n\n\tprivate void next() {\n\t\tif (hasNext) {\n\t\t\tplatform.listFriend(pageCount, curPage + 1, null);\n\t\t}\n\t}\n\n\tpublic void onComplete(Platform plat, int action, HashMap<String, Object> res) {\n\t\tfinal FollowersResult followersResult = parseFollowers(platform.getName(), res, map);\n\t\tif (followersResult == null) {\n\t\t\tUIHandler.sendEmptyMessage(0, new Callback() {\n\t\t\t\tpublic boolean handleMessage(Message msg) {\n\t\t\t\t\tnotifyDataSetChanged();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\thasNext = followersResult.hasNextPage;\n\t\tif (followersResult.list != null && followersResult.list.size() > 0) {\n\t\t\tcurPage++;\n\t\t\tMessage msg = new Message();\n\t\t\tmsg.what = 1;\n\t\t\tmsg.obj = followersResult.list;\n\t\t\tUIHandler.sendMessage(msg, new Callback() {\n\t\t\t\tpublic boolean handleMessage(Message msg) {\n\t\t\t\t\tif (curPage <= 0) {\n\t\t\t\t\t\tfollows.clear();\n\t\t\t\t\t}\n\t\t\t\t\tfollows.addAll(followersResult.list);\n\t\t\t\t\tnotifyDataSetChanged();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate FollowersResult parseFollowers(String platform, HashMap<String, Object> res, HashMap<String, Boolean> uidMap) {\n\t\tif (res == null || res.size() <= 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\tboolean hasNext = false;\n\t\tArrayList<Following> data = new ArrayList<Following>();\n\t\tif (\"SinaWeibo\".equals(platform)) {\n\t\t\t// users[id, name, description]\n\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\tArrayList<HashMap<String, Object>> users = (ArrayList<HashMap<String,Object>>) res.get(\"users\");\n\t\t\tfor (HashMap<String, Object> user : users) {\n\t\t\t\tString uid = String.valueOf(user.get(\"id\"));\n\t\t\t\tif (!uidMap.containsKey(uid)) {\n\t\t\t\t\tFollowing following = new Following();\n\t\t\t\t\tfollowing.uid = uid;\n\t\t\t\t\tfollowing.screenName = String.valueOf(user.get(\"name\"));\n\t\t\t\t\tfollowing.description = String.valueOf(user.get(\"description\"));\n\t\t\t\t\tfollowing.icon = String.valueOf(user.get(\"profile_image_url\"));\n\t\t\t\t\tfollowing.atName = following.screenName;\n\t\t\t\t\tuidMap.put(following.uid, true);\n\t\t\t\t\tdata.add(following);\n\t\t\t\t}\n\t\t\t}\n\t\t\thasNext = (Integer) res.get(\"total_number\") > uidMap.size();\n\t\t} else if (\"TencentWeibo\".equals(platform)) {\n\t\t\thasNext = ((Integer)res.get(\"hasnext\") == 0);\n\t\t\t// info[nick, name, tweet[text]]\n\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\tArrayList<HashMap<String, Object>> infos = (ArrayList<HashMap<String,Object>>) res.get(\"info\");\n\t\t\tfor (HashMap<String, Object> info : infos) {\n\t\t\t\tString uid = String.valueOf(info.get(\"name\"));\n\t\t\t\tif (!uidMap.containsKey(uid)) {\n\t\t\t\t\tFollowing following = new Following();\n\t\t\t\t\tfollowing.screenName = String.valueOf(info.get(\"nick\"));\n\t\t\t\t\tfollowing.uid = uid;\n\t\t\t\t\tfollowing.atName = uid;\n\t\t\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\t\t\tArrayList<HashMap<String, Object>> tweets = (ArrayList<HashMap<String,Object>>) info.get(\"tweet\");\n\t\t\t\t\tfor (HashMap<String, Object> tweet : tweets) {\n\t\t\t\t\t\tfollowing.description = String.valueOf(tweet.get(\"text\"));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tfollowing.icon = String.valueOf(info.get(\"head\")) + \"/100\";\n\t\t\t\t\tuidMap.put(following.uid, true);\n\t\t\t\t\tdata.add(following);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (\"Facebook\".equals(platform)) {\n\t\t\t// data[id, name]\n\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\tArrayList<HashMap<String, Object>> datas = (ArrayList<HashMap<String,Object>>) res.get(\"data\");\n\t\t\tfor (HashMap<String, Object> d : datas) {\n\t\t\t\tString uid = String.valueOf(d.get(\"id\"));\n\t\t\t\tif (!uidMap.containsKey(uid)) {\n\t\t\t\t\tFollowing following = new Following();\n\t\t\t\t\tfollowing.uid = uid;\n\t\t\t\t\tfollowing.atName = \"[\"+uid+\"]\";\n\t\t\t\t\tfollowing.screenName = String.valueOf(d.get(\"name\"));\n\t\t\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\t\t\tHashMap<String, Object> picture = (HashMap<String, Object>) d.get(\"picture\");\n\t\t\t\t\tif (picture != null) {\n\t\t\t\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\t\t\t\tHashMap<String, Object> pData = (HashMap<String, Object>) picture.get(\"data\");\n\t\t\t\t\t\tfollowing.icon = String.valueOf(pData.get(\"url\"));\n\t\t\t\t\t}\n\t\t\t\t\tuidMap.put(following.uid, true);\n\t\t\t\t\tdata.add(following);\n\t\t\t\t}\n\t\t\t}\n\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\tHashMap<String, Object> paging = (HashMap<String, Object>) res.get(\"paging\");\n\t\t\thasNext = paging.containsKey(\"next\");\n\t\t} else if (\"Twitter\".equals(platform)) {\n\t\t\t// users[screen_name, name, description]\n\t\t\t@SuppressWarnings(\"unchecked\")\n\t\t\tArrayList<HashMap<String, Object>> users = (ArrayList<HashMap<String,Object>>) res.get(\"users\");\n\t\t\tfor (HashMap<String, Object> user : users) {\n\t\t\t\tString uid = String.valueOf(user.get(\"screen_name\"));\n\t\t\t\tif (!uidMap.containsKey(uid)) {\n\t\t\t\t\tFollowing following = new Following();\n\t\t\t\t\tfollowing.uid = uid;\n\t\t\t\t\tfollowing.atName = uid;\n\t\t\t\t\tfollowing.screenName = String.valueOf(user.get(\"name\"));\n\t\t\t\t\tfollowing.description = String.valueOf(user.get(\"description\"));\n\t\t\t\t\tfollowing.icon = String.valueOf(user.get(\"profile_image_url\"));\n\t\t\t\t\tuidMap.put(following.uid, true);\n\t\t\t\t\tdata.add(following);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tFollowersResult ret = new FollowersResult();\n\t\tret.list = data;\n\t\tret.hasNextPage = hasNext;\n\t\treturn ret;\n\t}\n\n\tpublic void onError(Platform plat, int action, Throwable t) {\n\t\tt.printStackTrace();\n\t}\n\n\tpublic void onCancel(Platform plat, int action) {\n\t\tUIHandler.sendEmptyMessage(0, new Callback() {\n\t\t\tpublic boolean handleMessage(Message msg) {\n\t\t\t\tactivity.finish();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic Following getItem(int position) {\n\t\treturn follows.get(position);\n\t}\n\n\tpublic long getItemId(int position) {\n\t\treturn position;\n\t}\n\n\tpublic int getCount() {\n\t\treturn follows == null ? 0 : follows.size();\n\t}\n\n\tpublic View getHeaderView() {\n\t\tif (llHeader == null) {\n\t\t\tllHeader = new PRTHeader(getContext());\n\t\t}\n\t\treturn llHeader;\n\t}\n\n\tpublic void onPullDown(int percent) {\n\t\tllHeader.onPullDown(percent);\n\t}\n\n\tpublic void onRefresh() {\n\t\tllHeader.onRequest();\n\t\tcurPage = -1;\n\t\thasNext = true;\n\t\tmap.clear();\n\t\tnext();\n\t}\n\n\tpublic void onReversed() {\n\t\tllHeader.reverse();\n\t}\n\n\tpublic View getView(int position, View convertView, ViewGroup parent) {\n\t\tif (convertView == null) {\n\t\t\tFriendListItem llItem = new FriendListItem(parent.getContext(), ratio);\n\t\t\tconvertView = llItem;\n\t\t}\n\t\tFriendListItem llItem = (FriendListItem) convertView;\n\t\tllItem.update(getItem(position), isFling());\n\n\t\tif (position == getCount() - 1) {\n\t\t\tnext();\n\t\t}\n\t\treturn convertView;\n\t}\n\n\tpublic static class Following {\n\t\tpublic boolean checked;\n\t\tpublic String screenName;\n\t\tpublic String description;\n\t\tpublic String uid;\n\t\tpublic String icon;\n\t\t//@Name 用于微博等提示或关联某个人\n\t\tpublic String atName;\n\t}\n\n\tprivate static class FollowersResult {\n\t\tpublic ArrayList<Following> list;\n\t\tpublic boolean hasNextPage = false;\n\t}\n\n\tpublic View getFooterView() {\n\t\tLinearLayout footerView = new LinearLayout(getContext());\n\t\tfooterView.setMinimumHeight(10);\n\t\treturn footerView;\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/FriendListItem.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.util.TypedValue;\nimport android.view.Gravity;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\nimport cn.sharesdk.onekeyshare.themes.classic.FriendAdapter.Following;\n\nimport com.mob.tools.gui.AsyncImageView;\nimport com.mob.tools.gui.BitmapProcessor;\nimport com.mob.tools.utils.ResHelper;\n\n/** 好友列表的item */\npublic class FriendListItem extends LinearLayout {\n\tprivate static final int DESIGN_AVATAR_WIDTH = 64;\n\tprivate static final int DESIGN_AVATAR_PADDING = 24;\n\tprivate static final int DESIGN_ITEM_HEIGHT = 96;\n\tprivate static final int DESIGN_ITEM_PADDING = 20;\n\n\tprivate ImageView ivCheck;\n\tprivate AsyncImageView aivIcon;\n\tprivate TextView tvName;\n\t/** 好友列表中，被选中的checkbox图标 */\n\tprivate Bitmap bmChd;\n\t/** 好友列表中，没选中的checkbox图标 */\n\tprivate Bitmap bmUnch;\n\n\tpublic FriendListItem(Context context, float ratio) {\n\t\tsuper(context);\n\t\tint itemPadding = (int) (ratio * DESIGN_ITEM_PADDING);\n\t\tsetPadding(itemPadding, 0, itemPadding, 0);\n\t\tsetMinimumHeight((int) (ratio * DESIGN_ITEM_HEIGHT));\n\t\tsetBackgroundColor(0xffffffff);\n\n\t\tivCheck = new ImageView(context);\n\t\tLayoutParams lp = new LayoutParams(\n\t\t\t\tLayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);\n\t\tlp.gravity = Gravity.CENTER_VERTICAL;\n\t\taddView(ivCheck, lp);\n\n\t\taivIcon = new AsyncImageView(context);\n\t\tint avatarWidth = (int) (ratio * DESIGN_AVATAR_WIDTH);\n\t\tlp = new LayoutParams(avatarWidth, avatarWidth);\n\t\tlp.gravity = Gravity.CENTER_VERTICAL;\n\t\tint avatarMargin = (int) (ratio * DESIGN_AVATAR_PADDING);\n\t\tlp.setMargins(avatarMargin, 0, avatarMargin, 0);\n\t\taddView(aivIcon, lp);\n\n\t\ttvName = new TextView(context);\n\t\ttvName.setTextColor(0xff000000);\n\t\ttvName.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);\n\t\ttvName.setSingleLine();\n\t\tlp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);\n\t\tlp.gravity = Gravity.CENTER_VERTICAL;\n\t\tlp.weight = 1;\n\t\taddView(tvName, lp);\n\n\t\tint resId = ResHelper.getBitmapRes(context, \"ssdk_oks_classic_check_checked\");\n\t\tif (resId > 0) {\n\t\t\tbmChd = BitmapFactory.decodeResource(context.getResources(), resId);\n\t\t}\n\t\tresId = ResHelper.getBitmapRes(getContext(), \"ssdk_oks_classic_check_default\");\n\t\tif (resId > 0) {\n\t\t\tbmUnch = BitmapFactory.decodeResource(context.getResources(), resId);\n\t\t}\n\t}\n\n\tpublic void update(Following following, boolean fling) {\n\t\ttvName.setText(following.screenName);\n\t\tivCheck.setImageBitmap(following.checked ? bmChd : bmUnch);\n\t\tif (aivIcon != null) {\n\t\t\tif (fling) {\n\t\t\t\tBitmap bm = BitmapProcessor.getBitmapFromCache(following.icon);\n\t\t\t\tif (bm != null && !bm.isRecycled()) {\n\t\t\t\t\taivIcon.setImageBitmap(bm);\n\t\t\t\t} else {\n\t\t\t\t\taivIcon.execute(null, 0);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\taivIcon.execute(following.icon, 0);\n\t\t\t}\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/FriendListPage.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\nimport android.graphics.drawable.ColorDrawable;\nimport android.util.TypedValue;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.view.View.OnClickListener;\nimport android.view.ViewGroup.LayoutParams;\nimport android.widget.AdapterView;\nimport android.widget.AdapterView.OnItemClickListener;\nimport android.widget.FrameLayout;\nimport android.widget.LinearLayout;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\nimport cn.sharesdk.framework.Platform;\nimport cn.sharesdk.onekeyshare.OnekeySharePage;\nimport cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;\nimport cn.sharesdk.onekeyshare.themes.classic.FriendAdapter.Following;\n\nimport com.mob.tools.gui.PullToRequestView;\nimport com.mob.tools.utils.ResHelper;\n\n/** 编辑界面，@好友时，弹出的好友列表 */\npublic abstract class FriendListPage extends OnekeySharePage implements OnClickListener, OnItemClickListener {\n\tprivate static final int DESIGN_LEFT_PADDING = 40;\n\n\tprivate Platform platform;\n\tprivate LinearLayout llPage;\n\tprivate RelativeLayout rlTitle;\n\tprivate TextView tvCancel;\n\tprivate TextView tvConfirm;\n\tprivate FriendAdapter adapter;\n\tprivate int lastPosition = -1;\n\t/** 展示好友列表时，已选择要‘@’的好友个数 */\n\tprivate int checkNum = 0;\n\n\tpublic FriendListPage(OnekeyShareThemeImpl impl) {\n\t\tsuper(impl);\n\t}\n\n\tpublic void setPlatform(Platform platform) {\n\t\tthis.platform = platform;\n\t}\n\n\tpublic void onCreate() {\n\t\tactivity.getWindow().setBackgroundDrawable(new ColorDrawable(0xfff3f3f3));\n\n\t\tllPage = new LinearLayout(activity);\n\t\tllPage.setOrientation(LinearLayout.VERTICAL);\n\t\tactivity.setContentView(llPage);\n\n\t\trlTitle = new RelativeLayout(activity);\n\t\tfloat ratio = getRatio();\n\t\tint titleHeight = (int) (getDesignTitleHeight() * ratio);\n\t\tLinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(\n\t\t\t\tLayoutParams.MATCH_PARENT, titleHeight);\n\t\tllPage.addView(rlTitle, lp);\n\t\tinitTitle(rlTitle, ratio);\n\n\t\tView line = new View(activity);\n\t\tLinearLayout.LayoutParams lpline = new LinearLayout.LayoutParams(\n\t\t\t\tLayoutParams.MATCH_PARENT, (int) (ratio < 1 ? 1 : ratio));\n\t\tline.setBackgroundColor(0xffdad9d9);\n\t\tllPage.addView(line, lpline);\n\n\t\tFrameLayout flPage = new FrameLayout(getContext());\n\t\tLinearLayout.LayoutParams lpFl = new LinearLayout.LayoutParams(\n\t\t\t\tLayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);\n\t\tlpFl.weight = 1;\n\t\tflPage.setLayoutParams(lpFl);\n\t\tllPage.addView(flPage);\n\n\t\t// 关注（或朋友）列表\n\t\tPullToRequestView followList = new PullToRequestView(getContext());\n\t\tFrameLayout.LayoutParams lpLv = new FrameLayout.LayoutParams(\n\t\t\t\tLayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);\n\t\tfollowList.setLayoutParams(lpLv);\n\t\tflPage.addView(followList);\n\n\t\tadapter = new FriendAdapter(this, followList);\n\t\tadapter.setPlatform(platform);\n\t\tadapter.setRatio(ratio);\n\t\tadapter.setOnItemClickListener(this);\n\t\tfollowList.setAdapter(adapter);\n\n\t\t// 请求数据\n\t\tfollowList.performPullingDown(true);\n\t}\n\n\tprotected abstract float getRatio();\n\n\tprotected abstract int getDesignTitleHeight();\n\n\tprivate void initTitle(RelativeLayout rlTitle, float ratio) {\n\t\ttvCancel = new TextView(activity);\n\t\ttvCancel.setTextColor(0xff3b3b3b);\n\t\ttvCancel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);\n\t\ttvCancel.setGravity(Gravity.CENTER);\n\t\tint resId = ResHelper.getStringRes(activity, \"ssdk_oks_cancel\");\n\t\tif (resId > 0) {\n\t\t\ttvCancel.setText(resId);\n\t\t}\n\t\tint padding = (int) (DESIGN_LEFT_PADDING * ratio);\n\t\ttvCancel.setPadding(padding, 0, padding, 0);\n\t\tRelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);\n\t\trlTitle.addView(tvCancel, lp);\n\t\ttvCancel.setOnClickListener(this);\n\n\t\tTextView tvTitle = new TextView(activity);\n\t\ttvTitle.setTextColor(0xff3b3b3b);\n\t\ttvTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 22);\n\t\ttvTitle.setGravity(Gravity.CENTER);\n\t\tresId = ResHelper.getStringRes(activity, \"ssdk_oks_contacts\");\n\t\tif (resId > 0) {\n\t\t\ttvTitle.setText(resId);\n\t\t}\n\t\tlp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);\n\t\tlp.addRule(RelativeLayout.CENTER_IN_PARENT);\n\t\trlTitle.addView(tvTitle, lp);\n\n\t\ttvConfirm = new TextView(activity);\n\t\ttvConfirm.setTextColor(0xffff6d11);\n\t\ttvConfirm.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);\n\t\ttvConfirm.setGravity(Gravity.CENTER);\n\t\tresId = ResHelper.getStringRes(activity, \"ssdk_oks_confirm\");\n\t\tif (resId > 0) {\n\t\t\ttvConfirm.setText(resId);\n\t\t}\n\t\ttvConfirm.setPadding(padding, 0, padding, 0);\n\t\tlp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);\n\t\tlp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);\n\t\trlTitle.addView(tvConfirm, lp);\n\t\ttvConfirm.setOnClickListener(this);\n\t}\n\n\tpublic void onClick(View v) {\n\t\tif (v.equals(tvCancel)) {\n\t\t\tfinish();\n\t\t} else {\n\t\t\tArrayList<String> selected = new ArrayList<String>();\n\t\t\tfor (int i = 0, size = adapter.getCount(); i < size; i++) {\n\t\t\t\tif (adapter.getItem(i).checked) {\n\t\t\t\t\tselected.add(adapter.getItem(i).atName);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tHashMap<String, Object> res = new HashMap<String, Object>();\n\t\t\tres.put(\"selected\", selected);\n\t\t\tres.put(\"platform\", platform);\n\t\t\tsetResult(res);\n\t\t\tfinish();\n\t\t}\n\t}\n\n\tpublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {\n\t\tif (\"FacebookMessenger\".equals(platform.getName())) {\n\t\t\tif(lastPosition >= 0) {\n\t\t\t\tFollowing lastFollwing = adapter.getItem(lastPosition);\n\t\t\t\tlastFollwing.checked = false;\n\t\t\t}\n\t\t\tlastPosition = position;\n\t\t}\n\t\tFollowing following = adapter.getItem(position);\n\t\tfollowing.checked = !following.checked;\n\n\t\tif(following.checked) {\n\t\t\tcheckNum++;\n\t\t} else {\n\t\t\tcheckNum--;\n\t\t}\n\n\t\tupdateConfirmView();\n\t\tadapter.notifyDataSetChanged();\n\t}\n\n\tprivate void updateConfirmView() {\n\t\tint resId = ResHelper.getStringRes(activity, \"ssdk_oks_confirm\");\n\t\tString confirm = \"Confirm\";\n\t\tif(resId > 0) {\n\t\t\tconfirm = getContext().getResources().getString(resId);\n\t\t}\n\t\tif(checkNum == 0) {\n\t\t\ttvConfirm.setText(confirm);\n\t\t} else if(checkNum > 0) {\n\t\t\ttvConfirm.setText(confirm + \"(\" + checkNum + \")\");\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/IndicatorView.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.view.View;\n\n/** 九宫格滑动时，下面显示的圆圈 */\npublic class IndicatorView extends View {\n\tprivate static final int DESIGN_INDICATOR_RADIUS = 6;\n\tprivate static final int DESIGN_INDICATOR_DISTANCE = 14;\n\tprivate static final int DESIGN_BOTTOM_HEIGHT = 52;\n\t/** 九格宫有多少页数 */\n\tprivate int count;\n\t/** 当前显示的是九格宫中的第几页 */\n\tprivate int current;\n\n\tpublic IndicatorView(Context context) {\n\t\tsuper(context);\n\t}\n\n\tpublic void setScreenCount(int count) {\n\t\tthis.count = count;\n\t}\n\n\tpublic void onScreenChange(int currentScreen, int lastScreen) {\n\t\tif (currentScreen != current) {\n\t\t\tcurrent = currentScreen;\n\t\t\tpostInvalidate();\n\t\t}\n\t}\n\n\tprotected void onDraw(Canvas canvas) {\n\t\tif (count <= 1) {\n\t\t\tthis.setVisibility(View.GONE);\n\t\t\treturn;\n\t\t}\n\t\tfloat height = getHeight();\n\t\tfloat radius = height * DESIGN_INDICATOR_RADIUS / DESIGN_BOTTOM_HEIGHT;\n\t\tfloat distance = height * DESIGN_INDICATOR_DISTANCE / DESIGN_BOTTOM_HEIGHT;\n\t\tfloat windowWidth = radius * 2 * count + distance * (count - 1);\n\t\tfloat left = (getWidth() - windowWidth) / 2;\n\t\tfloat cy = height / 2;\n\n\t\tcanvas.drawColor(0xffffffff);\n\t\tPaint paint = new Paint();\n\t\tpaint.setAntiAlias(true);\n\t\tfor (int i = 0; i < count; i++) {\n\t\t\tif (i == current) {\n\t\t\t\tpaint.setColor(0xff5d71a0);\n\t\t\t} else {\n\t\t\t\tpaint.setColor(0xffafb1b7);\n\t\t\t}\n\t\t\tfloat cx = left + (radius * 2 + distance) * i;\n\t\t\tcanvas.drawCircle(cx, cy, radius, paint);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PRTHeader.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic;\n\nimport android.content.Context;\nimport android.graphics.drawable.Drawable;\nimport android.util.TypedValue;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.widget.LinearLayout;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport com.mob.tools.utils.ResHelper;\n\n/** 下拉刷新的头部控件  */\npublic class PRTHeader extends LinearLayout {\n\tprivate static final int DESIGN_SCREEN_WIDTH = 720;\n\tprivate static final int DESIGN_AVATAR_WIDTH = 64;\n\tprivate static final int DESIGN_AVATAR_PADDING = 24;\n\n\tprivate TextView tvHeader;\n\tprivate RotateImageView ivArrow;\n\tprivate ProgressBar pbRefreshing;\n\n\tpublic PRTHeader(Context context) {\n\t\tsuper(context);\n\t\tint[] size = ResHelper.getScreenSize(context);\n\t\tfloat screenWidth = size[0] < size[1] ? size[0] : size[1];\n\t\tfloat ratio = screenWidth / DESIGN_SCREEN_WIDTH;\n\n\t\tsetOrientation(VERTICAL);\n\n\t\tLinearLayout llInner = new LinearLayout(context);\n\t\tLayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);\n\t\tlp.gravity = Gravity.CENTER_HORIZONTAL;\n\t\taddView(llInner, lp);\n\n\t\tivArrow = new RotateImageView(context);\n\t\tint resId = ResHelper.getBitmapRes(context, \"ssdk_oks_ptr_ptr\");\n\t\tif (resId > 0) {\n\t\t\tivArrow.setImageResource(resId);\n\t\t}\n\t\tint avatarWidth = (int) (ratio * DESIGN_AVATAR_WIDTH);\n\t\tlp = new LayoutParams(avatarWidth, avatarWidth);\n\t\tlp.gravity = Gravity.CENTER_VERTICAL;\n\t\tint avataPadding = (int) (ratio * DESIGN_AVATAR_PADDING);\n\t\tlp.topMargin = lp.bottomMargin = avataPadding;\n\t\tllInner.addView(ivArrow, lp);\n\n\t\tpbRefreshing = new ProgressBar(context);\n\t\tresId = ResHelper.getBitmapRes(context, \"ssdk_oks_classic_progressbar\");\n\t\tDrawable pbdrawable = context.getResources().getDrawable(resId);\n\t\tpbRefreshing.setIndeterminateDrawable(pbdrawable);\n\t\tllInner.addView(pbRefreshing, lp);\n\t\tpbRefreshing.setVisibility(View.GONE);\n\n\t\ttvHeader = new TextView(getContext());\n\t\ttvHeader.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);\n\t\ttvHeader.setPadding(avataPadding, 0, avataPadding, 0);\n\t\ttvHeader.setTextColor(0xff09bb07);\n\t\tlp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);\n\t\tlp.gravity = Gravity.CENTER_VERTICAL;\n\t\tllInner.addView(tvHeader, lp);\n\t}\n\n\tpublic void onPullDown(int percent) {\n\t\tif (percent > 100) {\n\t\t\tint degree = (percent - 100) * 180 / 20;\n\t\t\tif (degree > 180) {\n\t\t\t\tdegree = 180;\n\t\t\t}\n\t\t\tif (degree < 0) {\n\t\t\t\tdegree = 0;\n\t\t\t}\n\t\t\tivArrow.setRotation(degree);\n\t\t} else {\n\t\t\tivArrow.setRotation(0);\n\t\t}\n\n\t\tif (percent < 100) {\n\t\t\tint resId = ResHelper.getStringRes(getContext(), \"ssdk_oks_pull_to_refresh\");\n\t\t\tif (resId > 0) {\n\t\t\t\ttvHeader.setText(resId);\n\t\t\t}\n\t\t} else {\n\t\t\tint resId = ResHelper.getStringRes(getContext(), \"ssdk_oks_release_to_refresh\");\n\t\t\tif (resId > 0) {\n\t\t\t\ttvHeader.setText(resId);\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void onRequest() {\n\t\tivArrow.setVisibility(View.GONE);\n\t\tpbRefreshing.setVisibility(View.VISIBLE);\n\t\tint resId = ResHelper.getStringRes(getContext(), \"ssdk_oks_refreshing\");\n\t\tif (resId > 0) {\n\t\t\ttvHeader.setText(resId);\n\t\t}\n\t}\n\n\tpublic void reverse() {\n\t\tpbRefreshing.setVisibility(View.GONE);\n\t\tivArrow.setRotation(180);\n\t\tivArrow.setVisibility(View.VISIBLE);\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PicViewerPage.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic;\n\nimport android.graphics.Bitmap;\nimport android.graphics.drawable.ColorDrawable;\nimport android.view.ViewTreeObserver.OnGlobalLayoutListener;\nimport android.widget.ImageView.ScaleType;\nimport cn.sharesdk.onekeyshare.OnekeySharePage;\nimport cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;\n\nimport com.mob.tools.gui.ScaledImageView;\n\n/** 图片浏览的视图类 */\npublic class PicViewerPage extends OnekeySharePage implements OnGlobalLayoutListener {\n\tprivate Bitmap pic;\n\t/** 图片浏览的缩放控件 */\n\tprivate ScaledImageView sivViewer;\n\n\tpublic PicViewerPage(OnekeyShareThemeImpl impl) {\n\t\tsuper(impl);\n\t}\n\n\t/** 设置图片用于浏览 */\n\tpublic void setImageBitmap(Bitmap pic) {\n\t\tthis.pic = pic;\n\t}\n\n\tpublic void onCreate() {\n\t\tactivity.getWindow().setBackgroundDrawable(new ColorDrawable(0x4c000000));\n\n\t\tsivViewer = new ScaledImageView(activity);\n\t\tsivViewer.setScaleType(ScaleType.MATRIX);\n\t\tactivity.setContentView(sivViewer);\n\t\tif (pic != null) {\n\t\t\tsivViewer.getViewTreeObserver().addOnGlobalLayoutListener(this);\n\t\t}\n\t}\n\n\tpublic void onGlobalLayout() {\n\t\tsivViewer.getViewTreeObserver().removeGlobalOnLayoutListener(this);\n\t\tsivViewer.post(new Runnable() {\n\t\t\tpublic void run() {\n\t\t\t\tsivViewer.setBitmap(pic);\n\t\t\t}\n\t\t});\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PlatformPage.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic;\n\nimport java.util.ArrayList;\nimport java.util.HashMap;\n\nimport android.graphics.drawable.ColorDrawable;\nimport android.view.View;\nimport android.view.View.OnClickListener;\nimport android.view.ViewGroup.LayoutParams;\nimport android.view.animation.Animation;\nimport android.view.animation.TranslateAnimation;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\nimport cn.sharesdk.framework.CustomPlatform;\nimport cn.sharesdk.framework.Platform;\nimport cn.sharesdk.framework.Platform.ShareParams;\nimport cn.sharesdk.framework.ShareSDK;\nimport cn.sharesdk.onekeyshare.CustomerLogo;\nimport cn.sharesdk.onekeyshare.OnekeySharePage;\nimport cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;\n\nimport com.mob.tools.gui.MobViewPager;\nimport com.mob.tools.utils.ResHelper;\n\n/** 九宫格的抽象类 */\npublic abstract class PlatformPage extends OnekeySharePage {\n\tprivate ClassicTheme impl;\n\t/** 点击九格宫，展示编辑界面，要执行的子线程 */\n\tprivate Runnable beforeFinish;\n\t/** 九宫格显示时的动画 */\n\tprivate Animation animShow;\n\t/** 九宫格隐藏时的动画 */\n\tprivate Animation animHide;\n\tprivate LinearLayout llPanel;\n\tprivate boolean finished;\n\n\tpublic PlatformPage(OnekeyShareThemeImpl impl) {\n\t\tsuper(impl);\n\t\tthis.impl = ResHelper.forceCast(impl);\n\t}\n\n\tpublic void onCreate() {\n\t\tactivity.getWindow().setBackgroundDrawable(new ColorDrawable(0x4c000000));\n\t\tinitAnims();\n\n\t\tLinearLayout llPage = new LinearLayout(activity);\n\t\tllPage.setOrientation(LinearLayout.VERTICAL);\n\t\tactivity.setContentView(llPage);\n\n\t\tTextView vTop = new TextView(activity);\n\t\tLinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(\n\t\t\t\tLayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);\n\t\tlp.weight = 1;\n\t\tvTop.setOnClickListener(new OnClickListener() {\n\t\t\tpublic void onClick(View v) {\n\t\t\t\tfinish();\n\t\t\t}\n\t\t});\n\t\tllPage.addView(vTop, lp);\n\n\t\tllPanel = new LinearLayout(activity);\n\t\tllPanel.setOrientation(LinearLayout.VERTICAL);\n\t\tlp = new LinearLayout.LayoutParams(\n\t\t\t\tLayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);\n\t\tllPanel.setAnimation(animShow);\n\t\tllPage.addView(llPanel, lp);\n\n\t\tMobViewPager mvp = new MobViewPager(activity);\n\t\tArrayList<Object> cells = collectCells();\n\t\tPlatformPageAdapter adapter = newAdapter(cells);\n\t\tlp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, adapter.getPanelHeight());\n\t\tllPanel.addView(mvp, lp);\n\n\t\tIndicatorView vInd = new IndicatorView(activity);\n\t\tlp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, adapter.getBottomHeight());\n\t\tllPanel.addView(vInd, lp);\n\n\t\tvInd.setScreenCount(adapter.getCount());\n\t\tvInd.onScreenChange(0, 0);\n\t\tadapter.setIndicator(vInd);\n\t\tmvp.setAdapter(adapter);\n\t}\n\n\tprotected abstract PlatformPageAdapter newAdapter(ArrayList<Object> cells);\n\n\tprotected ArrayList<Object> collectCells() {\n\t\tArrayList<Object> cells = new ArrayList<Object>();\n\n\t\tPlatform[] platforms = ShareSDK.getPlatformList();\n\t\tif (platforms == null) {\n\t\t\tplatforms = new Platform[0];\n\t\t}\n\t\tHashMap<String, String> hides = getHiddenPlatforms();\n\t\tif (hides == null) {\n\t\t\thides = new HashMap<String, String>();\n\t\t}\n\t\tfor (Platform p : platforms) {\n\t\t\tif (!hides.containsKey(p.getName())) {\n\t\t\t\tcells.add(p);\n\t\t\t}\n\t\t}\n\n\t\tArrayList<CustomerLogo> customers = getCustomerLogos();\n\t\tif (customers != null && customers.size() > 0) {\n\t\t\tcells.addAll(customers);\n\t\t}\n\n\t\treturn cells;\n\t}\n\n\tpublic final void showEditPage(final Platform platform) {\n\t\tbeforeFinish = new Runnable() {\n\t\t\tpublic void run() {\n\t\t\t\tboolean isSilent = isSilent();\n\t\t\t\tboolean isCustomPlatform = platform instanceof CustomPlatform;\n\t\t\t\tboolean isUseClientToShare = isUseClientToShare(platform);\n\t\t\t\tif (isSilent || isCustomPlatform || isUseClientToShare) {\n\t\t\t\t\tshareSilently(platform);\n\t\t\t\t} else {\n\t\t\t\t\tShareParams sp = formateShareData(platform);\n\t\t\t\t\tif (sp != null) {\n\t\t\t\t\t\t// 编辑分享内容的统计\n\t\t\t\t\t\tShareSDK.logDemoEvent(3, null);\n\t\t\t\t\t\tif (getCustomizeCallback() != null) {\n\t\t\t\t\t\t\tgetCustomizeCallback().onShare(platform, sp);\n\t\t\t\t\t\t}\n\t\t\t\t\t\timpl.showEditPage(activity, platform, sp);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tfinish();\n\t}\n\n\tpublic final void performCustomLogoClick(final View v, final CustomerLogo logo) {\n\t\tbeforeFinish = new Runnable() {\n\t\t\tpublic void run() {\n\t\t\t\tlogo.listener.onClick(v);\n\t\t\t}\n\t\t};\n\t\tfinish();\n\t}\n\n\tprivate void initAnims() {\n\t\tanimShow = new TranslateAnimation(\n\t\t\t\tAnimation.RELATIVE_TO_SELF, 0,\n\t\t\t\tAnimation.RELATIVE_TO_SELF, 0,\n\t\t\t\tAnimation.RELATIVE_TO_SELF, 1,\n\t\t\t\tAnimation.RELATIVE_TO_SELF, 0);\n\t\tanimShow.setDuration(300);\n\n\t\tanimHide = new TranslateAnimation(\n\t\t\t\tAnimation.RELATIVE_TO_SELF, 0,\n\t\t\t\tAnimation.RELATIVE_TO_SELF, 0,\n\t\t\t\tAnimation.RELATIVE_TO_SELF, 0,\n\t\t\t\tAnimation.RELATIVE_TO_SELF, 1);\n\t\tanimHide.setDuration(300);\n\t}\n\n\tpublic boolean onFinish() {\n\t\tif (finished) {\n\t\t\tfinished = false;\n\t\t\treturn false;\n\t\t}\n\n\t\tanimHide.setAnimationListener(new Animation.AnimationListener() {\n\t\t\tpublic void onAnimationStart(Animation animation) {\n\n\t\t\t}\n\n\t\t\tpublic void onAnimationRepeat(Animation animation) {\n\n\t\t\t}\n\n\t\t\tpublic void onAnimationEnd(Animation animation) {\n\t\t\t\tif (beforeFinish == null) {\n\t\t\t\t\t// 取消分享菜单的统计\n\t\t\t\t\tShareSDK.logDemoEvent(2, null);\n\t\t\t\t} else {\n\t\t\t\t\tbeforeFinish.run();\n\t\t\t\t\tbeforeFinish = null;\n\t\t\t\t}\n\n\t\t\t\tfinished = true;\n\t\t\t\tfinish();\n\t\t\t}\n\t\t});\n\t\tllPanel.clearAnimation();\n\t\tllPanel.setAnimation(animHide);\n\t\tllPanel.setVisibility(View.GONE);\n\t\treturn true;\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PlatformPageAdapter.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic;\n\nimport java.util.ArrayList;\n\nimport android.content.Context;\nimport android.util.TypedValue;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.view.View.OnClickListener;\nimport android.view.ViewGroup;\nimport android.view.ViewGroup.LayoutParams;\nimport android.widget.ImageView;\nimport android.widget.ImageView.ScaleType;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\nimport cn.sharesdk.framework.Platform;\nimport cn.sharesdk.onekeyshare.CustomerLogo;\n\nimport com.mob.tools.gui.ViewPagerAdapter;\nimport com.mob.tools.utils.ResHelper;\n\n/** 九宫格的适配器抽象类 */\npublic abstract class PlatformPageAdapter extends ViewPagerAdapter implements OnClickListener {\n\t/** 1秒内多次点击九格宫内的图标无效 */\n\tprotected static final int MIN_CLICK_INTERVAL = 1000;\n\tpublic static final int DESIGN_BOTTOM_HEIGHT = 52;\n\n\t/** 九格宫内图标排列的二维数组，一维对应平台，二维对应页数 */\n\tprotected Object[][] cells;\n\tprivate PlatformPage page;\n\tprivate IndicatorView vInd;\n\n\tprotected int bottomHeight;\n\tprotected int panelHeight;\n\tprotected int cellHeight;\n\tprotected int lineSize;\n\tprotected int sepLineWidth;\n\tprotected int paddingTop;\n\tprotected int logoHeight;\n\n\tprivate long lastClickTime;\n\n\tpublic PlatformPageAdapter(PlatformPage page, ArrayList<Object> cells) {\n\t\tthis.page = page;\n\t\tif (cells != null && !cells.isEmpty()) {\n\t\t\tcalculateSize(page.getContext(), cells);\n\t\t\tcollectCells(cells);\n\t\t}\n\t}\n\n\t/** 计算九宫格的格数，行数，格高，行高，图标大小 */\n\tprotected abstract void calculateSize(Context context, ArrayList<Object> plats);\n\n\t/** 计算九宫格的格数，行数 */\n\tprotected abstract void collectCells(ArrayList<Object> plats);\n\n\tpublic int getBottomHeight() {\n\t\treturn bottomHeight;\n\t}\n\n\tpublic int getPanelHeight() {\n\t\treturn panelHeight;\n\t}\n\n\tpublic int getCount() {\n\t\treturn cells == null? 0: cells.length;\n\t}\n\n\tpublic void setIndicator(IndicatorView view) {\n\t\tvInd = view;\n\t}\n\n\tpublic void onScreenChange(int currentScreen, int lastScreen) {\n\t\tif (vInd != null) {\n\t\t\tvInd.setScreenCount(getCount());\n\t\t\tvInd.onScreenChange(currentScreen, lastScreen);\n\t\t}\n\t}\n\n\tpublic View getView(int index, View convertView, ViewGroup parent) {\n\t\tif (convertView == null) {\n\t\t\tconvertView = createPanel(parent.getContext());\n\t\t}\n\n\t\tLinearLayout llPanel = ResHelper.forceCast(convertView);\n\t\tLinearLayout[] llCells = ResHelper.forceCast(llPanel.getTag());\n\t\trefreshPanel(llCells, cells[index]);\n\t\treturn convertView;\n\t}\n\n\tprivate View createPanel(Context context) {\n\t\tLinearLayout llPanel = new LinearLayout(context);\n\t\tllPanel.setOrientation(LinearLayout.VERTICAL);\n\t\tllPanel.setBackgroundColor(0xfff2f2f2);\n\n\t\tint lineCount = panelHeight / cellHeight;\n\t\tLinearLayout[] llCells = new LinearLayout[lineCount * lineSize];\n\t\tllPanel.setTag(llCells);\n\t\tint cellBack = ResHelper.getBitmapRes(context, \"ssdk_oks_classic_platform_cell_back\");\n\t\tLinearLayout.LayoutParams lp;\n\t\tfor (int i = 0; i < lineCount; i++) {\n\t\t\tLinearLayout llLine = new LinearLayout(context);\n\t\t\tlp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, cellHeight);\n\t\t\tllPanel.addView(llLine, lp);\n\n\t\t\tfor (int j = 0; j < lineSize; j++) {\n\t\t\t\tllCells[i * lineSize + j] = new LinearLayout(context);\n\t\t\t\tllCells[i * lineSize + j].setBackgroundResource(cellBack);\n\t\t\t\tllCells[i * lineSize + j].setOrientation(LinearLayout.VERTICAL);\n\t\t\t\tlp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, cellHeight);\n\t\t\t\tlp.weight = 1;\n\t\t\t\tllLine.addView(llCells[i * lineSize + j], lp);\n\n\t\t\t\tif (j < lineSize - 1) {\n\t\t\t\t\tView vSep = new View(context);\n\t\t\t\t\tlp = new LinearLayout.LayoutParams(sepLineWidth, LayoutParams.MATCH_PARENT);\n\t\t\t\t\tllLine.addView(vSep, lp);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tView vSep = new View(context);\n\t\t\tlp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, sepLineWidth);\n\t\t\tllPanel.addView(vSep, lp);\n\t\t}\n\n\t\tfor (LinearLayout llCell : llCells) {\n\t\t\tImageView ivLogo = new ImageView(context);\n\t\t\tivLogo.setScaleType(ScaleType.CENTER_INSIDE);\n\t\t\tlp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, logoHeight);\n\t\t\tlp.topMargin = paddingTop;\n\t\t\tllCell.addView(ivLogo, lp);\n\n\t\t\tTextView tvName = new TextView(context);\n\t\t\ttvName.setTextColor(0xff646464);\n\t\t\ttvName.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);\n\t\t\ttvName.setGravity(Gravity.CENTER);\n\t\t\tlp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);\n\t\t\tlp.weight = 1;\n\t\t\tllCell.addView(tvName, lp);\n\t\t}\n\n\t\treturn llPanel;\n\t}\n\n\tprivate void refreshPanel(LinearLayout[] llCells, Object[] logos) {\n\t\tint cellBack = ResHelper.getBitmapRes(page.getContext(), \"ssdk_oks_classic_platform_cell_back\");\n\t\tint disableBack = ResHelper.getBitmapRes(page.getContext(), \"ssdk_oks_classic_platfrom_cell_back_nor\");\n\t\tfor (int i = 0; i < logos.length; i++) {\n\t\t\tImageView ivLogo = ResHelper.forceCast(llCells[i].getChildAt(0));\n\t\t\tTextView tvName = ResHelper.forceCast(llCells[i].getChildAt(1));\n\t\t\tif (logos[i] == null) {\n\t\t\t\tivLogo.setVisibility(View.INVISIBLE);\n\t\t\t\ttvName.setVisibility(View.INVISIBLE);\n\t\t\t\tllCells[i].setBackgroundResource(disableBack);\n\t\t\t\tllCells[i].setOnClickListener(null);\n\t\t\t} else {\n\t\t\t\tivLogo.setVisibility(View.VISIBLE);\n\t\t\t\ttvName.setVisibility(View.VISIBLE);\n\t\t\t\tllCells[i].setBackgroundResource(cellBack);\n\t\t\t\tllCells[i].setOnClickListener(this);\n\t\t\t\tllCells[i].setTag(logos[i]);\n\n\t\t\t\tif (logos[i] instanceof CustomerLogo) {\n\t\t\t\t\tCustomerLogo logo = ResHelper.forceCast(logos[i]);\n\t\t\t\t\tif (logo.logo != null) {\n\t\t\t\t\t\tivLogo.setImageBitmap(logo.logo);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tivLogo.setImageBitmap(null);\n\t\t\t\t\t}\n\t\t\t\t\tif (logo.label != null) {\n\t\t\t\t\t\ttvName.setText(logo.label);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttvName.setText(\"\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tPlatform plat = ResHelper.forceCast(logos[i]);\n\t\t\t\t\tString name = plat.getName().toLowerCase();\n\t\t\t\t\tint resId = ResHelper.getBitmapRes(ivLogo.getContext(),\"ssdk_oks_classic_\" + name);\n\t\t\t\t\tif (resId > 0) {\n\t\t\t\t\t\tivLogo.setImageResource(resId);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tivLogo.setImageBitmap(null);\n\t\t\t\t\t}\n\t\t\t\t\tresId = ResHelper.getStringRes(tvName.getContext(), \"ssdk_\" + name);\n\t\t\t\t\tif (resId > 0) {\n\t\t\t\t\t\ttvName.setText(resId);\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttvName.setText(\"\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic void onClick(View v) {\n\t\tlong time = System.currentTimeMillis();\n\t\tif (time - lastClickTime < MIN_CLICK_INTERVAL) {\n\t\t\treturn;\n\t\t}\n\t\tlastClickTime = time;\n\n\t\tif (v.getTag() instanceof CustomerLogo) {\n\t\t\tCustomerLogo logo = ResHelper.forceCast(v.getTag());\n\t\t\tpage.performCustomLogoClick(v, logo);\n\t\t} else {\n\t\t\tPlatform plat = ResHelper.forceCast(v.getTag());\n\t\t\tpage.showEditPage(plat);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/RotateImageView.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.widget.ImageView;\n\n/** 在At好友页面中，下拉刷新列表头部的旋转箭头 */\npublic class RotateImageView extends ImageView {\n\tprivate float rotation;\n\n\tpublic RotateImageView(Context context) {\n\t\tsuper(context);\n\t}\n\n\tpublic void setRotation(float rotation) {\n\t\tthis.rotation = rotation;\n\t\tinvalidate();\n\t}\n\n\tprotected void onDraw(Canvas canvas) {\n\t\tcanvas.rotate(rotation, getWidth() / 2, getHeight() / 2);\n\t\tsuper.onDraw(canvas);\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/XView.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic;\n\nimport android.content.Context;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\nimport android.view.View;\n\n/** 编辑页面中删除图片“X”按钮 */\npublic class XView extends View {\n\tprivate float ratio;\n\n\tpublic XView(Context context) {\n\t\tsuper(context);\n\t}\n\n\tpublic void setRatio(float ratio) {\n\t\tthis.ratio = ratio;\n\t}\n\n\tprotected void onDraw(Canvas canvas) {\n\t\tint width = getWidth() / 2;\n\t\tint height = getHeight() / 2;\n\n\t\tPaint paint = new Paint();\n\t\tpaint.setAntiAlias(true);\n\t\tpaint.setColor(0xffa0a0a0);\n\t\tcanvas.drawRect(width, 0, getWidth(), height, paint);\n\n\t\tpaint = new Paint();\n\t\tpaint.setAntiAlias(true);\n\t\tpaint.setStrokeWidth(3f * ratio);\n\t\tpaint.setColor(0xffffffff);\n\t\tfloat left = 8f * ratio;\n\t\tcanvas.drawLine(width + left, left, getWidth() - left, width - left, paint);\n\t\tcanvas.drawLine(width + left, width - left, getWidth() - left, left, paint);\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/EditPageLand.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic.land;\n\nimport java.io.File;\n\nimport android.graphics.Bitmap;\nimport android.text.TextUtils;\nimport android.text.TextWatcher;\nimport android.util.TypedValue;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.view.View.OnClickListener;\nimport android.view.ViewGroup.LayoutParams;\nimport android.widget.EditText;\nimport android.widget.LinearLayout;\nimport android.widget.RelativeLayout;\nimport android.widget.ScrollView;\nimport android.widget.TextView;\nimport cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;\nimport cn.sharesdk.onekeyshare.themes.classic.EditPage;\nimport cn.sharesdk.onekeyshare.themes.classic.XView;\n\nimport com.mob.tools.gui.AsyncImageView;\nimport com.mob.tools.utils.BitmapHelper;\nimport com.mob.tools.utils.ResHelper;\n\n/** 横屏的编辑页 */\npublic class EditPageLand extends EditPage implements OnClickListener, TextWatcher, Runnable {\n\tprivate static final int DESIGN_SCREEN_WIDTH= 720;\n\tprivate static final int DESIGN_BOTTOM_HEIGHT = 75;\n\tprivate static final int DESIGN_LEFT_PADDING = 40;\n\tprivate static final int DESIGN_TITLE_HEIGHT_L = 70;\n\tprivate static final int DESIGN_THUMB_HEIGHT_L = 280;\n\tprivate static final int DESIGN_REMOVE_THUMB_HEIGHT_L = 60;\n\n\tpublic EditPageLand(OnekeyShareThemeImpl impl) {\n\t\tsuper(impl);\n\t}\n\n\tpublic void onCreate() {\n\t\tsuper.onCreate();\n\n\t\tint screenHeight = ResHelper.getScreenHeight(activity);\n\t\tfloat ratio = ((float) screenHeight) / DESIGN_SCREEN_WIDTH;\n\n\t\tmaxBodyHeight = 0;\n\n\t\tllPage = new LinearLayout(activity);\n\t\tllPage.setOrientation(LinearLayout.VERTICAL);\n\t\tactivity.setContentView(llPage);\n\n\t\trlTitle = new RelativeLayout(activity);\n\t\trlTitle.setBackgroundColor(0xffe6e9ec);\n\t\tint titleHeight = (int) (DESIGN_TITLE_HEIGHT_L * ratio);\n\n\t\tLinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, titleHeight);\n\t\tllPage.addView(rlTitle, lp);\n\t\tinitTitle(rlTitle, ratio);\n\n\t\tRelativeLayout rlBody = new RelativeLayout(activity);\n\t\trlBody.setBackgroundColor(0xffffffff);\n\t\tlp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);\n\t\tllPage.addView(rlBody, lp);\n\t\tinitBody(rlBody, ratio);\n\n\t\tLinearLayout llShadow = new LinearLayout(activity);\n\t\tllShadow.setOrientation(LinearLayout.VERTICAL);\n\t\trlBody.addView(llShadow, new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));\n\t\tinitShadow(llShadow, ratio);\n\n\t\tllBottom = new LinearLayout(activity);\n\t\tllBottom.setOrientation(LinearLayout.VERTICAL);\n\t\tlp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);\n\t\tllPage.addView(llBottom, lp);\n\t\tinitBottom(llBottom, ratio);\n\t}\n\n\tprivate void initTitle(RelativeLayout rlTitle, float ratio) {\n\t\ttvCancel = new TextView(activity);\n\t\ttvCancel.setTextColor(0xff3b3b3b);\n\t\ttvCancel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);\n\t\ttvCancel.setGravity(Gravity.CENTER);\n\t\tint resId = ResHelper.getStringRes(activity, \"ssdk_oks_cancel\");\n\t\tif (resId > 0) {\n\t\t\ttvCancel.setText(resId);\n\t\t}\n\t\tint padding = (int) (DESIGN_LEFT_PADDING * ratio);\n\t\ttvCancel.setPadding(padding, 0, padding, 0);\n\t\tRelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);\n\t\trlTitle.addView(tvCancel, lp);\n\t\ttvCancel.setOnClickListener(this);\n\n\t\tTextView tvTitle = new TextView(activity);\n\t\ttvTitle.setTextColor(0xff3b3b3b);\n\t\ttvTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 22);\n\t\ttvTitle.setGravity(Gravity.CENTER);\n\t\tresId = ResHelper.getStringRes(activity, \"ssdk_oks_multi_share\");\n\t\tif (resId > 0) {\n\t\t\ttvTitle.setText(resId);\n\t\t}\n\t\tlp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);\n\t\tlp.addRule(RelativeLayout.CENTER_IN_PARENT);\n\t\trlTitle.addView(tvTitle, lp);\n\n\t\ttvShare = new TextView(activity);\n\t\ttvShare.setTextColor(0xffff6d11);\n\t\ttvShare.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);\n\t\ttvShare.setGravity(Gravity.CENTER);\n\t\tresId = ResHelper.getStringRes(activity, \"ssdk_oks_share\");\n\t\tif (resId > 0) {\n\t\t\ttvShare.setText(resId);\n\t\t}\n\t\ttvShare.setPadding(padding, 0, padding, 0);\n\t\tlp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);\n\t\tlp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);\n\t\trlTitle.addView(tvShare, lp);\n\t\ttvShare.setOnClickListener(this);\n\t}\n\n\tprivate void initBody(RelativeLayout rlBody, float ratio) {\n\t\tsvContent = new ScrollView(activity);\n\t\trlBody.addView(svContent, new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));\n\n\t\tLinearLayout llContent = new LinearLayout(activity);\n\t\tllContent.setOrientation(LinearLayout.HORIZONTAL);\n\t\tsvContent.addView(llContent, new ScrollView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));\n\n\t\tetContent = new EditText(activity);\n\t\tint padding = (int) (DESIGN_LEFT_PADDING * ratio);\n\t\tetContent.setPadding(padding, padding, padding, padding);\n\t\tetContent.setBackgroundDrawable(null);\n\t\tetContent.setTextColor(0xff3b3b3b);\n\t\tetContent.setTextSize(TypedValue.COMPLEX_UNIT_SP, 21);\n\t\tetContent.setText(sp.getText());\n\t\tLinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT);\n\t\tlp.weight = 1;\n\t\tllContent.addView(etContent, lp);\n\t\tetContent.addTextChangedListener(this);\n\n\t\trlThumb = new RelativeLayout(activity);\n\t\trlThumb.setBackgroundColor(0xff313131);\n\t\tint\tthumbWidth = (int) (DESIGN_THUMB_HEIGHT_L * ratio);\n\t\tint\txWidth = (int) (DESIGN_REMOVE_THUMB_HEIGHT_L * ratio);\n\t\tlp = new LinearLayout.LayoutParams(thumbWidth, thumbWidth);\n\t\tlp.rightMargin = lp.bottomMargin = lp.topMargin = padding;\n\t\tllContent.addView(rlThumb, lp);\n\n\t\taivThumb = new AsyncImageView(activity) {\n\t\t\tpublic void onImageGot(String url, Bitmap bm) {\n\t\t\t\tthumb = bm;\n\t\t\t\tsuper.onImageGot(url, bm);\n\t\t\t}\n\t\t};\n\t\taivThumb.setScaleToCropCenter(true);\n\t\tRelativeLayout.LayoutParams rllp = new RelativeLayout.LayoutParams(thumbWidth, thumbWidth);\n\t\trlThumb.addView(aivThumb, rllp);\n\t\taivThumb.setOnClickListener(this);\n\t\tinitThumb(aivThumb);\n\n\t\txvRemove = new XView(activity);\n\t\txvRemove.setRatio(ratio);\n\t\trllp = new RelativeLayout.LayoutParams(xWidth, xWidth);\n\t\trllp.addRule(RelativeLayout.ALIGN_PARENT_TOP);\n\t\trllp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);\n\t\trlThumb.addView(xvRemove, rllp);\n\t\txvRemove.setOnClickListener(this);\n\t}\n\n\tprivate void initBottom(LinearLayout llBottom, float ratio) {\n\t\tLinearLayout llAt = new LinearLayout(activity);\n\t\tllAt.setPadding(0, 0, 0, 5);\n\t\tllAt.setBackgroundColor(0xffffffff);\n\t\tint bottomHeight = (int) (DESIGN_BOTTOM_HEIGHT * ratio);\n\t\tLinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, bottomHeight);\n\t\tllBottom.addView(llAt, lp);\n\n\t\ttvAt = new TextView(activity);\n\t\ttvAt.setTextColor(0xff3b3b3b);\n\t\ttvAt.setTextSize(TypedValue.COMPLEX_UNIT_SP, 21);\n\t\ttvAt.setGravity(Gravity.BOTTOM);\n\t\ttvAt.setText(\"@\");\n\t\tint padding = (int) (DESIGN_LEFT_PADDING * ratio);\n\t\ttvAt.setPadding(padding, 0, padding, 0);\n\t\tlp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);\n\t\tllAt.addView(tvAt, lp);\n\t\ttvAt.setOnClickListener(this);\n\t\tif (isShowAtUserLayout(platform.getName())) {\n\t\t\ttvAt.setVisibility(View.VISIBLE);\n\t\t} else {\n\t\t\ttvAt.setVisibility(View.INVISIBLE);\n\t\t}\n\n\t\ttvTextCouter = new TextView(activity);\n\t\ttvTextCouter.setTextColor(0xff3b3b3b);\n\t\ttvTextCouter.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);\n\t\ttvTextCouter.setGravity(Gravity.BOTTOM | Gravity.RIGHT);\n\t\tonTextChanged(etContent.getText(), 0, 0, 0);\n\t\ttvTextCouter.setPadding(padding, 0, padding, 0);\n\t\tlp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);\n\t\tlp.weight = 1;\n\t\tllAt.addView(tvTextCouter, lp);\n\n\t\tView v = new View(activity);\n\t\tv.setBackgroundColor(0xffcccccc);\n\t\tint px_1 = ratio > 1 ? ((int) ratio) : 1;\n\t\tlp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, px_1);\n\t\tllBottom.addView(v, lp);\n\t}\n\n\tprivate void initShadow(LinearLayout llShadow, float ratio) {\n\t\tint px_1 = ratio > 1 ? ((int) ratio) : 1;\n\t\tLinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, px_1);\n\n\t\tView v = new View(activity);\n\t\tv.setBackgroundColor(0x29000000);\n\t\tllShadow.addView(v, lp);\n\n\t\tv = new View(activity);\n\t\tv.setBackgroundColor(0x14000000);\n\t\tllShadow.addView(v, lp);\n\n\t\tv = new View(activity);\n\t\tv.setBackgroundColor(0x07000000);\n\t\tllShadow.addView(v, lp);\n\t}\n\n\tprivate void initThumb(AsyncImageView aivThumb) {\n\t\tString imageUrl = sp.getImageUrl();\n\t\tString imagePath = sp.getImagePath();\n\t\tString[] imageArray = sp.getImageArray();\n\n\t\tBitmap pic = null;\n\t\trlThumb.setVisibility(View.VISIBLE);\n\t\tif(!TextUtils.isEmpty(imagePath) && new File(imagePath).exists()) {\n\t\t\ttry {\n\t\t\t\tpic = BitmapHelper.getBitmap(imagePath);\n\t\t\t} catch (Throwable e) {\n\t\t\t\te.printStackTrace();\n\t\t\t}\n\t\t}\n\n\t\tif (pic != null) {\n\t\t\tthumb = pic;\n\t\t\taivThumb.setBitmap(pic);\n\t\t} else if (imageArray != null && imageArray.length > 0) {\n\t\t\tif (!TextUtils.isEmpty(imageArray[0]) && new File(imageArray[0]).exists()) {\n\t\t\t\ttry {\n\t\t\t\t\tpic = BitmapHelper.getBitmap(imagePath);\n\t\t\t\t} catch (Throwable e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (pic != null) {\n\t\t\tthumb = pic;\n\t\t\taivThumb.setBitmap(pic);\n\t\t} else if (pic == null && !TextUtils.isEmpty(imageUrl)) {\n\t\t\taivThumb.execute(imageUrl, 0);\n\t\t} else {\n\t\t\trlThumb.setVisibility(View.GONE);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/FriendListPageLand.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic.land;\n\nimport cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;\nimport cn.sharesdk.onekeyshare.themes.classic.FriendListPage;\n\nimport com.mob.tools.utils.ResHelper;\n\n/** 横屏的好友列表 */\npublic class FriendListPageLand extends FriendListPage {\n\tprivate static final int DESIGN_SCREEN_WIDTH = 1280;\n\tprivate static final int DESIGN_TITLE_HEIGHT = 70;\n\n\tpublic FriendListPageLand(OnekeyShareThemeImpl impl) {\n\t\tsuper(impl);\n\t}\n\n\tprotected float getRatio() {\n\t\tfloat screenWidth = ResHelper.getScreenWidth(activity);\n\t\treturn screenWidth / DESIGN_SCREEN_WIDTH;\n\t}\n\n\tprotected int getDesignTitleHeight() {\n\t\treturn DESIGN_TITLE_HEIGHT;\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/PlatformPageAdapterLand.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic.land;\n\nimport java.util.ArrayList;\n\nimport android.content.Context;\nimport cn.sharesdk.onekeyshare.themes.classic.PlatformPage;\nimport cn.sharesdk.onekeyshare.themes.classic.PlatformPageAdapter;\n\nimport com.mob.tools.utils.ResHelper;\n\n/** 横屏的九宫格页面适配器 */\npublic class PlatformPageAdapterLand extends PlatformPageAdapter {\n\tprivate static final int DESIGN_SCREEN_WIDTH_L = 1280;\n\tprivate static final int DESIGN_CELL_WIDTH_L = 160;\n\tprivate static final int DESIGN_SEP_LINE_WIDTH = 1;\n\tprivate static final int DESIGN_LOGO_HEIGHT = 76;\n\tprivate static final int DESIGN_PADDING_TOP = 20;\n\n\tpublic PlatformPageAdapterLand(PlatformPage page, ArrayList<Object> cells) {\n\t\tsuper(page, cells);\n\t}\n\n\tprotected void calculateSize(Context context, ArrayList<Object> plats) {\n\t\tint screenWidth = ResHelper.getScreenWidth(context);\n\t\tfloat ratio = ((float) screenWidth) / DESIGN_SCREEN_WIDTH_L;\n\t\tint cellWidth = (int) (DESIGN_CELL_WIDTH_L * ratio);\n\t\tlineSize = screenWidth / cellWidth;\n\n\t\tsepLineWidth = (int) (DESIGN_SEP_LINE_WIDTH * ratio);\n\t\tsepLineWidth = sepLineWidth < 1 ? 1 : sepLineWidth;\n\t\tlogoHeight = (int) (DESIGN_LOGO_HEIGHT * ratio);\n\t\tpaddingTop = (int) (DESIGN_PADDING_TOP * ratio);\n\t\tbottomHeight = (int) (DESIGN_BOTTOM_HEIGHT * ratio);\n\t\tcellHeight = (screenWidth - sepLineWidth * 3) / (lineSize - 1);\n\t\tpanelHeight = cellHeight + sepLineWidth;\n\t}\n\n\tprotected void collectCells(ArrayList<Object> plats) {\n\t\tint count = plats.size();\n\t\tif (count < lineSize) {\n\t\t\tint lineCount = (count / lineSize);\n\t\t\tif (count % lineSize != 0) {\n\t\t\t\tlineCount++;\n\t\t\t}\n\t\t\tcells = new Object[1][lineCount * lineSize];\n\t\t} else {\n\t\t\tint pageCount = (count / lineSize);\n\t\t\tif (count % lineSize != 0) {\n\t\t\t\tpageCount++;\n\t\t\t}\n\t\t\tcells = new Object[pageCount][lineSize];\n\t\t}\n\n\t\tfor (int i = 0; i < count; i++) {\n\t\t\tint p = i / lineSize;\n\t\t\tcells[p][i - lineSize * p] = plats.get(i);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/PlatformPageLand.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic.land;\n\nimport java.util.ArrayList;\n\nimport cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;\nimport cn.sharesdk.onekeyshare.themes.classic.PlatformPage;\nimport cn.sharesdk.onekeyshare.themes.classic.PlatformPageAdapter;\n\n/** 横屏的九宫格页面 */\npublic class PlatformPageLand extends PlatformPage {\n\n\tpublic PlatformPageLand(OnekeyShareThemeImpl impl) {\n\t\tsuper(impl);\n\t}\n\n\tpublic void onCreate() {\n\t\trequestLandscapeOrientation();\n\t\tsuper.onCreate();\n\t}\n\n\tprotected PlatformPageAdapter newAdapter(ArrayList<Object> cells) {\n\t\treturn new PlatformPageAdapterLand(this, cells);\n\t}\n\n}\n\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/EditPagePort.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic.port;\n\nimport java.io.File;\n\nimport android.graphics.Bitmap;\nimport android.text.TextUtils;\nimport android.util.TypedValue;\nimport android.view.Gravity;\nimport android.view.View;\nimport android.view.ViewGroup.LayoutParams;\nimport android.widget.EditText;\nimport android.widget.LinearLayout;\nimport android.widget.RelativeLayout;\nimport android.widget.ScrollView;\nimport android.widget.TextView;\nimport cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;\nimport cn.sharesdk.onekeyshare.themes.classic.EditPage;\nimport cn.sharesdk.onekeyshare.themes.classic.XView;\n\nimport com.mob.tools.gui.AsyncImageView;\nimport com.mob.tools.utils.BitmapHelper;\nimport com.mob.tools.utils.ResHelper;\n\n/** 竖屏的编辑页 */\npublic class EditPagePort extends EditPage  {\n\tprivate static final int DESIGN_SCREEN_HEIGHT= 1280;\n\tprivate static final int DESIGN_TITLE_HEIGHT = 96;\n\tprivate static final int DESIGN_BOTTOM_HEIGHT = 75;\n\tprivate static final int DESIGN_LEFT_PADDING = 40;\n\tprivate static final int DESIGN_THUMB_HEIGHT = 300;\n\tprivate static final int DESIGN_REMOVE_THUMB_HEIGHT = 70;\n\n\tpublic EditPagePort(OnekeyShareThemeImpl impl) {\n\t\tsuper(impl);\n\t}\n\n\tpublic void onCreate() {\n\t\tsuper.onCreate();\n\n\t\tint screenHeight = ResHelper.getScreenHeight(activity);\n\t\tfloat ratio = ((float) screenHeight) / DESIGN_SCREEN_HEIGHT;\n\n\t\tmaxBodyHeight = 0;\n\n\t\tllPage = new LinearLayout(activity);\n\t\tllPage.setOrientation(LinearLayout.VERTICAL);\n\t\tactivity.setContentView(llPage);\n\n\t\trlTitle = new RelativeLayout(activity);\n\t\trlTitle.setBackgroundColor(0xffe6e9ec);\n\t\tint titleHeight = (int) (DESIGN_TITLE_HEIGHT * ratio);\n\n\t\tLinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, titleHeight);\n\t\tllPage.addView(rlTitle, lp);\n\t\tinitTitle(rlTitle, ratio);\n\n\t\tRelativeLayout rlBody = new RelativeLayout(activity);\n\t\trlBody.setBackgroundColor(0xffffffff);\n\t\tlp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);\n\t\tllPage.addView(rlBody, lp);\n\t\tinitBody(rlBody, ratio);\n\n\t\tLinearLayout llShadow = new LinearLayout(activity);\n\t\tllShadow.setOrientation(LinearLayout.VERTICAL);\n\t\trlBody.addView(llShadow, new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));\n\t\tinitShadow(llShadow, ratio);\n\n\t\tllBottom = new LinearLayout(activity);\n\t\tllBottom.setOrientation(LinearLayout.VERTICAL);\n\t\tlp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);\n\t\tllPage.addView(llBottom, lp);\n\t\tinitBottom(llBottom, ratio);\n\t}\n\n\tprivate void initTitle(RelativeLayout rlTitle, float ratio) {\n\t\ttvCancel = new TextView(activity);\n\t\ttvCancel.setTextColor(0xff3b3b3b);\n\t\ttvCancel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);\n\t\ttvCancel.setGravity(Gravity.CENTER);\n\t\tint resId = ResHelper.getStringRes(activity, \"ssdk_oks_cancel\");\n\t\tif (resId > 0) {\n\t\t\ttvCancel.setText(resId);\n\t\t}\n\t\tint padding = (int) (DESIGN_LEFT_PADDING * ratio);\n\t\ttvCancel.setPadding(padding, 0, padding, 0);\n\t\tRelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);\n\t\trlTitle.addView(tvCancel, lp);\n\t\ttvCancel.setOnClickListener(this);\n\n\t\tTextView tvTitle = new TextView(activity);\n\t\ttvTitle.setTextColor(0xff3b3b3b);\n\t\ttvTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 22);\n\t\ttvTitle.setGravity(Gravity.CENTER);\n\t\tresId = ResHelper.getStringRes(activity, \"ssdk_oks_multi_share\");\n\t\tif (resId > 0) {\n\t\t\ttvTitle.setText(resId);\n\t\t}\n\t\tlp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);\n\t\tlp.addRule(RelativeLayout.CENTER_IN_PARENT);\n\t\trlTitle.addView(tvTitle, lp);\n\n\t\ttvShare = new TextView(activity);\n\t\ttvShare.setTextColor(0xffff6d11);\n\t\ttvShare.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);\n\t\ttvShare.setGravity(Gravity.CENTER);\n\t\tresId = ResHelper.getStringRes(activity, \"ssdk_oks_share\");\n\t\tif (resId > 0) {\n\t\t\ttvShare.setText(resId);\n\t\t}\n\t\ttvShare.setPadding(padding, 0, padding, 0);\n\t\tlp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);\n\t\tlp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);\n\t\trlTitle.addView(tvShare, lp);\n\t\ttvShare.setOnClickListener(this);\n\t}\n\n\tprivate void initBody(RelativeLayout rlBody, float ratio) {\n\t\tsvContent = new ScrollView(activity);\n\t\trlBody.addView(svContent, new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));\n\n\t\tLinearLayout llContent = new LinearLayout(activity);\n\t\tllContent.setOrientation(LinearLayout.VERTICAL);\n\t\tsvContent.addView(llContent, new ScrollView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));\n\n\t\tetContent = new EditText(activity);\n\t\tint padding = (int) (DESIGN_LEFT_PADDING * ratio);\n\t\tetContent.setPadding(padding, padding, padding, padding);\n\t\tetContent.setBackgroundDrawable(null);\n\t\tetContent.setTextColor(0xff3b3b3b);\n\t\tetContent.setTextSize(TypedValue.COMPLEX_UNIT_SP, 21);\n\t\tetContent.setText(sp.getText());\n\t\tLinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);\n\t\tllContent.addView(etContent, lp);\n\t\tetContent.addTextChangedListener(this);\n\n\t\trlThumb = new RelativeLayout(activity);\n\t\trlThumb.setBackgroundColor(0xff313131);\n\t\tint\tthumbWidth = (int) (DESIGN_THUMB_HEIGHT * ratio);\n\t\tint\txWidth = (int) (DESIGN_REMOVE_THUMB_HEIGHT * ratio);\n\t\tlp = new LinearLayout.LayoutParams(thumbWidth, thumbWidth);\n\t\tlp.leftMargin = lp.rightMargin = lp.bottomMargin = lp.topMargin = padding;\n\t\tllContent.addView(rlThumb, lp);\n\n\t\taivThumb = new AsyncImageView(activity) {\n\t\t\tpublic void onImageGot(String url, Bitmap bm) {\n\t\t\t\tthumb = bm;\n\t\t\t\tsuper.onImageGot(url, bm);\n\t\t\t}\n\t\t};\n\t\taivThumb.setScaleToCropCenter(true);\n\t\tRelativeLayout.LayoutParams rllp = new RelativeLayout.LayoutParams(thumbWidth, thumbWidth);\n\t\trlThumb.addView(aivThumb, rllp);\n\t\taivThumb.setOnClickListener(this);\n\t\tinitThumb(aivThumb);\n\n\t\txvRemove = new XView(activity);\n\t\txvRemove.setRatio(ratio);\n\t\trllp = new RelativeLayout.LayoutParams(xWidth, xWidth);\n\t\trllp.addRule(RelativeLayout.ALIGN_PARENT_TOP);\n\t\trllp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);\n\t\trlThumb.addView(xvRemove, rllp);\n\t\txvRemove.setOnClickListener(this);\n\t}\n\n\tprivate void initBottom(LinearLayout llBottom, float ratio) {\n\t\tLinearLayout llAt = new LinearLayout(activity);\n\t\tllAt.setPadding(0, 0, 0, 5);\n\t\tllAt.setBackgroundColor(0xffffffff);\n\t\tint bottomHeight = (int) (DESIGN_BOTTOM_HEIGHT * ratio);\n\t\tLinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, bottomHeight);\n\t\tllBottom.addView(llAt, lp);\n\n\t\ttvAt = new TextView(activity);\n\t\ttvAt.setTextColor(0xff3b3b3b);\n\t\ttvAt.setTextSize(TypedValue.COMPLEX_UNIT_SP, 22);\n\t\ttvAt.setGravity(Gravity.BOTTOM);\n\t\ttvAt.setText(\"@\");\n\t\tint padding = (int) (DESIGN_LEFT_PADDING * ratio);\n\t\ttvAt.setPadding(padding, 0, padding, 0);\n\t\tlp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);\n\t\tllAt.addView(tvAt, lp);\n\t\ttvAt.setOnClickListener(this);\n\t\tif (isShowAtUserLayout(platform.getName())) {\n\t\t\ttvAt.setVisibility(View.VISIBLE);\n\t\t} else {\n\t\t\ttvAt.setVisibility(View.INVISIBLE);\n\t\t}\n\n\t\ttvTextCouter = new TextView(activity);\n\t\ttvTextCouter.setTextColor(0xff3b3b3b);\n\t\ttvTextCouter.setTextSize(TypedValue.COMPLEX_UNIT_SP, 21);\n\t\ttvTextCouter.setGravity(Gravity.BOTTOM | Gravity.RIGHT);\n\t\tonTextChanged(etContent.getText(), 0, 0, 0);\n\t\ttvTextCouter.setPadding(padding, 0, padding, 0);\n\t\tlp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);\n\t\tlp.weight = 1;\n\t\tllAt.addView(tvTextCouter, lp);\n\n\t\tView v = new View(activity);\n\t\tv.setBackgroundColor(0xffcccccc);\n\t\tint px_1 = ratio > 1 ? ((int) ratio) : 1;\n\t\tlp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, px_1);\n\t\tllBottom.addView(v, lp);\n\t}\n\n\tprivate void initShadow(LinearLayout llShadow, float ratio) {\n\t\tint px_1 = ratio > 1 ? ((int) ratio) : 1;\n\t\tLinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, px_1);\n\n\t\tView v = new View(activity);\n\t\tv.setBackgroundColor(0x29000000);\n\t\tllShadow.addView(v, lp);\n\n\t\tv = new View(activity);\n\t\tv.setBackgroundColor(0x14000000);\n\t\tllShadow.addView(v, lp);\n\n\t\tv = new View(activity);\n\t\tv.setBackgroundColor(0x07000000);\n\t\tllShadow.addView(v, lp);\n\t}\n\n\tprivate void initThumb(AsyncImageView aivThumb) {\n\t\tString imageUrl = sp.getImageUrl();\n\t\tString imagePath = sp.getImagePath();\n\t\tString[] imageArray = sp.getImageArray();\n\n\t\tBitmap pic = null;\n\t\trlThumb.setVisibility(View.VISIBLE);\n\t\tif(!TextUtils.isEmpty(imagePath) && new File(imagePath).exists()) {\n\t\t\ttry {\n\t\t\t\tpic = BitmapHelper.getBitmap(imagePath);\n\t\t\t} catch (Throwable e) {\n\t\t\t\te.printStackTrace();\n\t\t\t}\n\t\t}\n\n\t\tif (pic != null) {\n\t\t\tthumb = pic;\n\t\t\taivThumb.setBitmap(pic);\n\t\t} else if (imageArray != null && imageArray.length > 0) {\n\t\t\tif (!TextUtils.isEmpty(imageArray[0]) && new File(imageArray[0]).exists()) {\n\t\t\t\ttry {\n\t\t\t\t\tpic = BitmapHelper.getBitmap(imagePath);\n\t\t\t\t} catch (Throwable e) {\n\t\t\t\t\te.printStackTrace();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (pic != null) {\n\t\t\tthumb = pic;\n\t\t\taivThumb.setBitmap(pic);\n\t\t} else if (pic == null && !TextUtils.isEmpty(imageUrl)) {\n\t\t\taivThumb.execute(imageUrl, 0);\n\t\t} else {\n\t\t\trlThumb.setVisibility(View.GONE);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/FriendListPagePort.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic.port;\n\nimport cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;\nimport cn.sharesdk.onekeyshare.themes.classic.FriendListPage;\n\nimport com.mob.tools.utils.ResHelper;\n\n/** 竖屏的好友列表 */\npublic class FriendListPagePort extends FriendListPage {\n\tprivate static final int DESIGN_SCREEN_WIDTH = 720;\n\tprivate static final int DESIGN_TITLE_HEIGHT = 96;\n\n\tpublic FriendListPagePort(OnekeyShareThemeImpl impl) {\n\t\tsuper(impl);\n\t}\n\n\tprotected float getRatio() {\n\t\tfloat screenWidth = ResHelper.getScreenWidth(activity);\n\t\treturn screenWidth / DESIGN_SCREEN_WIDTH;\n\t}\n\n\tprotected int getDesignTitleHeight() {\n\t\treturn DESIGN_TITLE_HEIGHT;\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/PlatformPageAdapterPort.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic.port;\n\nimport java.util.ArrayList;\n\nimport android.content.Context;\nimport cn.sharesdk.onekeyshare.themes.classic.PlatformPage;\nimport cn.sharesdk.onekeyshare.themes.classic.PlatformPageAdapter;\n\nimport com.mob.tools.utils.ResHelper;\n\n/** 竖屏的九宫格页面适配器 */\npublic class PlatformPageAdapterPort extends PlatformPageAdapter {\n\tprivate static final int DESIGN_SCREEN_WIDTH_P = 720;\n\tprivate static final int DESIGN_SEP_LINE_WIDTH = 1;\n\tprivate static final int DESIGN_LOGO_HEIGHT = 76;\n\tprivate static final int DESIGN_PADDING_TOP = 20;\n\tprivate static final int PAGE_SIZE_P = 12;\n\tprivate static final int LINE_SIZE_P = 4;\n\n\tpublic PlatformPageAdapterPort(PlatformPage page, ArrayList<Object> cells) {\n\t\tsuper(page, cells);\n\t}\n\n\tprotected void calculateSize(Context context, ArrayList<Object> plats) {\n\t\tint screenWidth = ResHelper.getScreenWidth(context);\n\t\tlineSize = LINE_SIZE_P;\n\n\t\tfloat ratio = ((float) screenWidth) / DESIGN_SCREEN_WIDTH_P;\n\t\tsepLineWidth = (int) (DESIGN_SEP_LINE_WIDTH * ratio);\n\t\tsepLineWidth = sepLineWidth < 1 ? 1 : sepLineWidth;\n\t\tlogoHeight = (int) (DESIGN_LOGO_HEIGHT * ratio);\n\t\tpaddingTop = (int) (DESIGN_PADDING_TOP * ratio);\n\t\tbottomHeight = (int) (DESIGN_BOTTOM_HEIGHT * ratio);\n\t\tcellHeight = (screenWidth - sepLineWidth * 3) / 4;\n\t\tif (plats.size() <= lineSize) {\n\t\t\tpanelHeight = cellHeight + sepLineWidth;\n\t\t} else if (plats.size() <= PAGE_SIZE_P - lineSize) {\n\t\t\tpanelHeight = (cellHeight + sepLineWidth) * 2;\n\t\t} else {\n\t\t\tpanelHeight = (cellHeight + sepLineWidth) * 3;\n\t\t}\n\t}\n\n\tprotected void collectCells(ArrayList<Object> plats) {\n\t\tint count = plats.size();\n\t\tif (count < PAGE_SIZE_P) {\n\t\t\tint lineCount = (count / lineSize);\n\t\t\tif (count % lineSize != 0) {\n\t\t\t\tlineCount++;\n\t\t\t}\n\t\t\tcells = new Object[1][lineCount * lineSize];\n\t\t} else {\n\t\t\tint pageCount = (count / PAGE_SIZE_P);\n\t\t\tif (count % PAGE_SIZE_P != 0) {\n\t\t\t\tpageCount++;\n\t\t\t}\n\t\t\tcells = new Object[pageCount][PAGE_SIZE_P];\n\t\t}\n\n\t\tfor (int i = 0; i < count; i++) {\n\t\t\tint p = i / PAGE_SIZE_P;\n\t\t\tcells[p][i - PAGE_SIZE_P * p] = plats.get(i);\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/PlatformPagePort.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage cn.sharesdk.onekeyshare.themes.classic.port;\n\nimport java.util.ArrayList;\n\nimport cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;\nimport cn.sharesdk.onekeyshare.themes.classic.PlatformPage;\nimport cn.sharesdk.onekeyshare.themes.classic.PlatformPageAdapter;\n\n/** 竖屏的九宫格页面 */\npublic class PlatformPagePort extends PlatformPage {\n\n\tpublic PlatformPagePort(OnekeyShareThemeImpl impl) {\n\t\tsuper(impl);\n\t}\n\n\tpublic void onCreate() {\n\t\trequestPortraitOrientation();\n\t\tsuper.onCreate();\n\t}\n\n\tprotected PlatformPageAdapter newAdapter(ArrayList<Object> cells) {\n\t\treturn new PlatformPageAdapterPort(this, cells);\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/common/api/CacheApi.java",
    "content": "package com.ittianyu.pocenter.common.api;\n\nimport com.ittianyu.pocenter.common.bean.ProjectBean;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.Observable;\nimport io.rx_cache2.DynamicKey;\nimport io.rx_cache2.EvictDynamicKey;\nimport io.rx_cache2.LifeCache;\n\n/**\n * Created by yu on 2017/1/17.\n */\n\npublic interface CacheApi {\n\n    @LifeCache(duration = 15, timeUnit = TimeUnit.MINUTES)\n    Observable<List<ProjectBean>> getList(Observable<List<ProjectBean>> repo, DynamicKey key, EvictDynamicKey isUpdate);\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/common/api/RemoteApi.java",
    "content": "package com.ittianyu.pocenter.common.api;\n\nimport com.ittianyu.pocenter.common.bean.ProjectBean;\n\nimport java.util.List;\n\nimport io.reactivex.Observable;\nimport retrofit2.http.GET;\nimport retrofit2.http.Query;\n\n/**\n * Created by yu on 2017/1/17.\n */\n\npublic interface RemoteApi {\n    interface Type {\n        int OTHER = 0;\n        int WEB = 1;\n        int WE_CHAT = 2;\n        int HTML5 = 3;\n        int APP = 4;\n        int INTELLIGENT_HARDWARE = 5;\n        int DESKTOP_APP = 6;\n        int BIG_DATA = 7;\n        int SYSTEM = 8;\n        int SDK_API = 9;\n        int ART = 10;\n    }\n    interface Status {\n        int RECRUITING = 0;\n        int RECRUITED = 1;\n    }\n\n    /**\n     * select list according to types status and keywords\n     *\n     * @param start    start index\n     * @param count    select count\n     * @param types    support multiple types\n     * @param status\n     * @param keywords title or description keywords\n     * @return\n     */\n    @GET(\"list\")\n    Observable<List<ProjectBean>> getList(@Query(\"start\") int start, @Query(\"count\") int count,\n                                          @Query(\"type\") int[] types, @Query(\"status\") int status,\n                                          @Query(\"keyword\") String[] keywords);\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/common/api/Repertories.java",
    "content": "package com.ittianyu.pocenter.common.api;\n\nimport android.content.Context;\nimport android.support.annotation.NonNull;\nimport android.text.TextUtils;\n\nimport com.ittianyu.pocenter.R;\nimport com.ittianyu.pocenter.common.base.BaseApplication;\nimport com.ittianyu.pocenter.common.bean.ProjectBean;\nimport com.ittianyu.pocenter.common.utils.ConfigUtils;\nimport com.ittianyu.pocenter.common.utils.RxUtils;\nimport com.ittianyu.pocenter.common.utils.UnsafeOkHttpUtils;\nimport com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;\n\nimport java.io.File;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\nimport java.util.Set;\n\nimport io.reactivex.Observable;\nimport io.rx_cache2.DynamicKey;\nimport io.rx_cache2.EvictDynamicKey;\nimport io.rx_cache2.internal.RxCache;\nimport io.victoralbertos.jolyglot.GsonSpeaker;\nimport retrofit2.Retrofit;\nimport retrofit2.converter.gson.GsonConverterFactory;\n\n/**\n * Created by yu on 2017/1/17.\n */\npublic class Repertories {\n    public static final String HOST = \"po.ittianyu.com\";\n    public static final String URL_BASE = \"https://\" + HOST + \"/\";\n\n    private RemoteApi remoteApi;\n    private CacheApi cacheApi;\n    private List<String> types = new ArrayList<>();\n\n    public Repertories(File cacheDir) {\n        // create apis\n        cacheApi = new RxCache.Builder()\n                .useExpiredDataIfLoaderNotAvailable(true)\n                .persistence(cacheDir, new GsonSpeaker())\n                .using(CacheApi.class);\n\n        remoteApi = new Retrofit.Builder()\n                .baseUrl(URL_BASE)\n                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())\n                .addConverterFactory(GsonConverterFactory.create())\n                .client(UnsafeOkHttpUtils.getClient())\n                .build()\n                .create(RemoteApi.class);\n\n        // add types\n        Context context = BaseApplication.getContext();\n        types.add(context.getString(R.string.type_other));\n        types.add(context.getString(R.string.type_web));\n        types.add(context.getString(R.string.type_we_chat));\n        types.add(context.getString(R.string.type_html5));\n        types.add(context.getString(R.string.type_app));\n        types.add(context.getString(R.string.type_intelligent_hardware));\n        types.add(context.getString(R.string.type_desktop_app));\n        types.add(context.getString(R.string.type_big_data));\n        types.add(context.getString(R.string.type_system));\n        types.add(context.getString(R.string.type_sdk_api));\n        types.add(context.getString(R.string.type_art));\n    }\n\n    public Observable<List<ProjectBean>> getList(int start, int count, int[] types, int status, String[] keywords, boolean update) {\n        String key = generateKey(start, count, types, status, keywords);\n        return cacheApi.getList(remoteApi.getList(start, count, types, status, keywords),\n                new DynamicKey(key), new EvictDynamicKey(update))\n                .compose(RxUtils.<List<ProjectBean>>netScheduler());// net on io thread, subscribe on main thread\n//        return remoteApi.getList(start, count, types, status, keywords)\n//                .compose(RxUtils.<List<ProjectBean>>netScheduler());// net on io thread, subscribe on main thread\n    }\n\n    /**\n     * according params to generate key\n     * @param start\n     * @param count\n     * @param types\n     * @param status\n     * @param keywords\n     * @return\n     */\n    @NonNull\n    private String generateKey(int start, int count, int[] types, int status, String[] keywords) {\n        StringBuilder keyBuilder = new StringBuilder(\"start=\" + start + \"&count=\" + count);\n        if (null != types && types.length > 0) {\n            Arrays.sort(types);\n            for (int type : types) {\n                keyBuilder.append(\"&type=\" + type);\n            }\n        }\n        keyBuilder.append(\"&status=\" + status);\n        if (null != keywords && keywords.length > 0) {\n            Arrays.sort(keywords);\n            for (String keyword : keywords) {\n                keyBuilder.append(\"&keyword=\" + keyword);\n            }\n        }\n        return keyBuilder.toString();\n    }\n\n    public List<String> getAllTypes() {\n        return types;\n    }\n\n    public boolean isSettingTypes() {\n        // load config\n        String type = ConfigUtils.getString(BaseApplication.getContext(), ConfigUtils.KEY_TYPE, \"\");\n        if (TextUtils.isEmpty(type))\n            return false;\n        return true;\n    }\n\n    public int[] getTypes() {\n        String type = ConfigUtils.getString(BaseApplication.getContext(), ConfigUtils.KEY_TYPE, \"\");\n        if (TextUtils.isEmpty(type))\n            return null;\n        String[] typesString = type.split(\",\");\n        if (0 == typesString.length)\n            return null;\n\n        int[] types = new int[typesString.length];\n        for (int i = 0; i < typesString.length; i++) {\n            types[i] = Integer.parseInt(typesString[i]);\n        }\n        return types;\n    }\n\n    public void setTypes(Set<Integer> set) {\n        // create types string\n        StringBuilder typeBuilder = new StringBuilder();\n        for (int type : set) {\n            typeBuilder.append(type);\n            typeBuilder.append(',');\n        }\n        typeBuilder.deleteCharAt(typeBuilder.length() - 1);// delete the last ','\n        // save to file\n        ConfigUtils.putString(BaseApplication.getContext(), ConfigUtils.KEY_TYPE, typeBuilder.toString());\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/common/base/BaseActivity.java",
    "content": "package com.ittianyu.pocenter.common.base;\n\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.ittianyu.mvp.lcee.Lcee;\nimport com.ittianyu.mvp.lcee.MvpLceeActivity;\nimport com.ittianyu.pocenter.R;\nimport com.orhanobut.logger.Logger;\n\n/**\n * Created by yu on 2016/11/25.\n */\n@Lcee(loadingViewId = R.id.v_loading, contentViewId = R.id.v_content, errorViewId = R.id.v_error, emptyViewId = R.id.v_empty)\npublic abstract class BaseActivity<CV extends View, M, V extends BaseContract.View<M>, P extends BaseContract.Presenter<V>>\n        extends MvpLceeActivity<CV, M, V, P> implements BaseContract.View<M> {\n//    protected View view;// cache view\n//    protected boolean firstLoad = true;\n\n    @Override\n    protected void onStart() {\n        super.onStart();\n        initView();\n        loadData(false);\n    }\n\n//    /**\n//     * create view\n//     * It will be only create once in a life\n//     * No need set content view when onCreate\n//     */\n//    protected abstract View createView();\n\n    /**\n     * init view\n     */\n    protected abstract void initView();\n\n    @Override\n    protected String getErrorMessage(Throwable e, boolean pullToRefresh) {\n        Logger.e(e, \"\");\n        return pullToRefresh ? getString(R.string.failed_to_refresh) : getString(R.string.failed_to_load_click_to_reload);\n    }\n\n    @Override\n    protected void onSetErrorViewText(View errorView, String errorMsg) {\n        TextView tv = (TextView) errorView.findViewById(R.id.tv);\n        tv.setText(errorMsg);\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/common/base/BaseApplication.java",
    "content": "package com.ittianyu.pocenter.common.base;\n\nimport android.app.Application;\nimport android.content.Context;\nimport android.content.pm.ApplicationInfo;\nimport android.support.multidex.MultiDex;\n\nimport com.ittianyu.pocenter.BuildConfig;\nimport com.ittianyu.pocenter.common.api.Repertories;\nimport com.ittianyu.pocenter.common.tinker.FetchPatchHandler;\nimport com.orhanobut.logger.LogLevel;\nimport com.orhanobut.logger.Logger;\nimport com.squareup.leakcanary.LeakCanary;\nimport com.tencent.tinker.loader.app.ApplicationLike;\nimport com.tinkerpatch.sdk.TinkerPatch;\nimport com.tinkerpatch.sdk.loader.TinkerPatchApplicationLike;\n\n/**\n * Created by yu on 2016/11/24.\n */\npublic class BaseApplication extends Application {\n    private static Context context;\n    private static Repertories repertories;\n\n    // tinker patch config\n    private ApplicationLike tinkerApplicationLike;\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n\n        // tinker patch config\n        tinkerPatchConfig();\n\n        context = getApplicationContext();\n\n        initLogger();\n\n        initLeakCanary();\n\n        repertories = new Repertories(context.getCacheDir());\n    }\n\n    private void tinkerPatchConfig() {\n        // 我们可以从这里获得Tinker加载过程的信息\n        if (BuildConfig.TINKER_ENABLE) {\n            tinkerApplicationLike = TinkerPatchApplicationLike.getTinkerPatchApplicationLike();\n\n            // 初始化TinkerPatch SDK\n            TinkerPatch.init(tinkerApplicationLike)\n                    .reflectPatchLibrary()\n                    .setPatchRollbackOnScreenOff(true)\n                    .setPatchRestartOnSrceenOff(true);\n\n            // 每隔3个小时去访问后台时候有更新,通过handler实现轮训的效果\n            new FetchPatchHandler().fetchPatchWithInterval(3);\n        }\n    }\n\n    /**\n     * use LeakCanary to check mey leak\n     */\n    private void initLeakCanary() {\n        if (LeakCanary.isInAnalyzerProcess(this)) {\n            // This process is dedicated to LeakCanary for heap analysis.\n            // You should not init your app in this process.\n            return;\n        }\n        LeakCanary.install(this);\n    }\n\n    /**\n     * init logger\n     */\n    private void initLogger() {\n        if ((0 != (getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE)))\n            Logger.init(); // for debug, print all log\n        else\n            Logger.init().logLevel(LogLevel.NONE); // for release, remove all log\n//            Logger.init(); // for release, remove all log\n    }\n\n    public static Context getContext() {\n        return context;\n    }\n\n    public static Repertories getRepertories() {\n        return repertories;\n    }\n\n\n    /**\n     * tinker\n     * @param base\n     */\n    @Override\n    public void attachBaseContext(Context base) {\n        super.attachBaseContext(base);\n        //you must install multiDex whatever tinker is installed!\n        MultiDex.install(base);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/common/base/BaseContract.java",
    "content": "package com.ittianyu.pocenter.common.base;\n\nimport com.hannesdorfmann.mosby.mvp.MvpPresenter;\nimport com.ittianyu.mvp.lcee.MvpLceeView;\n\n/**\n * Created by yu on 2016/11/29.\n */\n\npublic interface BaseContract {\n    interface View<M> extends MvpLceeView<M> {\n        <T> T getApp();\n    }\n\n    interface Presenter<V extends View> extends MvpPresenter<V> {\n        BaseApplication getApp();\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/common/base/BaseFragment.java",
    "content": "package com.ittianyu.pocenter.common.base;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.ittianyu.mvp.lcee.Lcee;\nimport com.ittianyu.mvp.lcee.MvpLceeFragment;\nimport com.ittianyu.pocenter.R;\nimport com.orhanobut.logger.Logger;\nimport com.victor.loading.rotate.RotateLoading;\n\n/**\n * Created by yu on 2016/11/25.\n */\n@Lcee(loadingViewId = R.id.v_loading, contentViewId = R.id.v_content, errorViewId = R.id.v_error, emptyViewId = R.id.v_empty)\npublic abstract class BaseFragment<CV extends View, M, V extends BaseContract.View<M>, P extends BaseContract.Presenter<V>>\n        extends MvpLceeFragment<CV, M, V, P> implements BaseContract.View<M> {\n    protected boolean firstLoad = true;\n    protected boolean prepared = false;\n    protected boolean visible = false;\n\n\n    @Override\n    public void setUserVisibleHint(boolean isVisibleToUser) {\n        super.setUserVisibleHint(isVisibleToUser);\n        visible = isVisibleToUser;\n\n        lazyLoad();\n    }\n\n    /**\n     * only load data at first visible\n     */\n    private void lazyLoad() {\n        if (visible && firstLoad && prepared) {\n            firstLoad = false;\n            loadData(false);\n        }\n    }\n\n    @Override\n    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {\n        super.onViewCreated(view, savedInstanceState);\n        initView(view);\n        showLoading(false);\n        prepared = true;\n        lazyLoad();\n    }\n\n    /**\n     * init view\n     */\n    protected abstract void initView(View view);\n\n    @Override\n    protected String getErrorMessage(Throwable e, boolean pullToRefresh) {\n        Logger.e(e, e.getMessage());\n        return pullToRefresh ? getString(R.string.failed_to_refresh) : getString(R.string.failed_to_load_click_to_reload);\n    }\n\n    @Override\n    protected void onSetErrorViewText(View errorView, String errorMsg) {\n        TextView tv = (TextView) errorView.findViewById(R.id.tv);\n        tv.setText(errorMsg);\n    }\n\n    @Override\n    public <T> T getApp() {\n        return (T) getActivity().getApplication();\n    }\n\n    @Override\n    public void showLoading(boolean pullToRefresh) {\n        super.showLoading(pullToRefresh);\n        RotateLoading rotateLoading = (RotateLoading) this.loadingView.findViewById(R.id.rl);\n        if (!rotateLoading.isStart())\n            rotateLoading.start();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/common/base/BasePresenter.java",
    "content": "package com.ittianyu.pocenter.common.base;\n\nimport com.hannesdorfmann.mosby.mvp.MvpNullObjectBasePresenter;\n\n/**\n * Created by yu on 2016/11/25.\n */\n\npublic class BasePresenter<V extends BaseContract.View>\n        extends MvpNullObjectBasePresenter<V>\n        implements BaseContract.Presenter<V>{\n    protected BaseApplication application;\n\n    @Override\n    public void attachView(V view) {\n        super.attachView(view);\n        application = (BaseApplication) getView().getApp();\n    }\n\n    @Override\n    public BaseApplication getApp() {\n        return application;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/common/bean/ProjectBean.java",
    "content": "package com.ittianyu.pocenter.common.bean;\n\nimport java.sql.Timestamp;\n\n/**\n * Created by yu on 2017/1/14.\n */\npublic class ProjectBean {\n    public int id;\n    public String projectId;\n    public String title;\n    public String description;\n    public String price;\n    public int type;\n    public String cycle;\n    public int people;\n    public int status;\n    public Timestamp time;\n    public String reference;\n    public String url;\n\n\n    @Override\n    public String toString() {\n        return \"ProjectBean{\" +\n                \"projectId='\" + projectId + '\\'' +\n                \", title='\" + title + '\\'' +\n                \", description='\" + description + '\\'' +\n                \", price='\" + price + '\\'' +\n                \", type=\" + type +\n                \", cycle='\" + cycle + '\\'' +\n                \", people=\" + people +\n                \", status=\" + status +\n                \", time=\" + time +\n                \", reference='\" + reference + '\\'' +\n                \", url='\" + url + '\\'' +\n                '}';\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/common/tinker/FetchPatchHandler.java",
    "content": "package com.ittianyu.pocenter.common.tinker;\n\nimport android.os.Handler;\nimport android.os.Message;\n\nimport com.tinkerpatch.sdk.TinkerPatch;\n\n/**\n * Created by zhangshaowen on 17/1/8.\n */\n\npublic class FetchPatchHandler extends Handler {\n    public static final long HOUR_INTERVAL = 3600 * 1000;\n\n    private long checkInterval;\n\n    /**\n     * 通过handler, 达到按照时间间隔轮训的效果\n     * @param hour\n     */\n    public void fetchPatchWithInterval(int hour) {\n        //设置TinkerPatch的时间间隔\n        TinkerPatch.with().setFetchPatchIntervalByHours(hour);\n        checkInterval = hour * HOUR_INTERVAL;\n        //立刻尝试去访问,检查是否有更新\n        sendEmptyMessage(0);\n    }\n    @Override\n    public void handleMessage(Message msg) {\n        super.handleMessage(msg);\n\n        //这里使用false即可\n        TinkerPatch.with().fetchPatchUpdate(false);\n        //每隔一段时间都去访问后台, 增加10分钟的buffer时间\n        sendEmptyMessageDelayed(0, checkInterval + 10 * 60 * 1000);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/common/utils/CollectionUtils.java",
    "content": "package com.ittianyu.pocenter.common.utils;\n\nimport java.util.Collection;\n\n/**\n * Created by yu on 2017/1/17.\n */\npublic class CollectionUtils {\n    /**\n     * check the collection is empty\n     * @param collection\n     * @return true if collection == null or size() == 0\n     */\n    public static boolean isEmpty(Collection collection) {\n        if (null == collection || collection.isEmpty())\n            return true;\n        return false;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/common/utils/ConfigUtils.java",
    "content": "package com.ittianyu.pocenter.common.utils;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\n\n/**\n * Created by yu.\n * read and write config utils\n */\npublic class ConfigUtils {\n    private static final String NAME = \"config\";\n\n    public static final String KEY_TYPE = \"type\";\n\n    /**\n     * Put a key-value into config\n     * @param context context\n     * @param key the key\n     * @param value the value\n     */\n    public static void putString(Context context, String key, String value) {\n        SharedPreferences sp = context.getSharedPreferences(NAME, Context.MODE_PRIVATE);\n        SharedPreferences.Editor edit = sp.edit();\n        edit.putString(key, value)\n                .commit();\n    }\n\n    /**\n     * Get value by key in config\n     * @param context context\n     * @param key the key\n     * @param defaultValue if can't find the value of key, will return default value\n     * @return value\n     */\n    public static String getString(Context context, String key, String defaultValue) {\n        SharedPreferences sp = context.getSharedPreferences(NAME, Context.MODE_PRIVATE);\n        return sp.getString(key, defaultValue);\n    }\n\n    /**\n     * Put a key-value into config\n     * @param context context\n     * @param key the key\n     * @param value the value\n     */\n    public static void putInt(Context context, String key, int value) {\n        SharedPreferences sp = context.getSharedPreferences(NAME, Context.MODE_PRIVATE);\n        SharedPreferences.Editor edit = sp.edit();\n        edit.putInt(key, value)\n                .commit();\n    }\n\n    /**\n     * Get value by key in config\n     * @param context context\n     * @param key the key\n     * @param defaultValue if can't find the value of key, will return default value\n     * @return value\n     */\n    public static int getInt(Context context, String key, int defaultValue) {\n        SharedPreferences sp = context.getSharedPreferences(NAME, Context.MODE_PRIVATE);\n        return sp.getInt(key, defaultValue);\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/common/utils/RxUtils.java",
    "content": "package com.ittianyu.pocenter.common.utils;\n\n\nimport java.util.NoSuchElementException;\n\nimport io.reactivex.Observable;\nimport io.reactivex.ObservableSource;\nimport io.reactivex.ObservableTransformer;\nimport io.reactivex.Observer;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.schedulers.Schedulers;\n\n/**\n * Created by yu on 2016/12/2.\n */\npublic class RxUtils {\n    /**\n     * subscribeOn io\n     * observeOn mainThread\n     *\n     * @param <T>\n     * @return\n     */\n    public static <T> ObservableTransformer<T, T> netScheduler() {\n        return new ObservableTransformer<T, T>() {\n            @Override\n            public ObservableSource<T> apply(Observable<T> upstream) {\n                return upstream.subscribeOn(Schedulers.io())\n                        .observeOn(AndroidSchedulers.mainThread());\n            }\n        };\n    }\n\n    /**\n     * If the publish is empty, it wll run onError and throw a NoSuchElementException\n     * @param <T>\n     * @return\n     */\n    public static <T> ObservableTransformer<T, T> notEmptyOrError() {\n        return new ObservableTransformer<T, T>() {\n\n            @Override\n            public ObservableSource<T> apply(Observable<T> upstream) {\n                return upstream.switchIfEmpty(new Observable<T>() {\n                    @Override\n                    protected void subscribeActual(Observer<? super T> observer) {\n                        observer.onError(new NoSuchElementException());\n                    }\n                });\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/common/utils/UnsafeOkHttpUtils.java",
    "content": "package com.ittianyu.pocenter.common.utils;\n\nimport javax.net.ssl.HostnameVerifier;\nimport javax.net.ssl.SSLContext;\nimport javax.net.ssl.SSLSession;\nimport javax.net.ssl.TrustManager;\nimport javax.net.ssl.X509TrustManager;\n\nimport okhttp3.OkHttpClient;\n\n/**\n * Created by yu on 2017/1/20.\n */\npublic class UnsafeOkHttpUtils {\n    /**\n     * don't verify certificate\n     * @return\n     */\n    public static OkHttpClient getClient() {\n        try {\n            // Create a trust manager that does not validate certificate chains\n            final TrustManager[] trustAllCerts = new TrustManager[] {\n                    new X509TrustManager() {\n                        @Override\n                        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {\n                        }\n\n                        @Override\n                        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {\n                        }\n\n                        @Override\n                        public java.security.cert.X509Certificate[] getAcceptedIssuers() {\n                            return new java.security.cert.X509Certificate[]{};\n                        }\n                    }\n            };\n\n            // Install the all-trusting trust manager\n            final SSLContext sslContext = SSLContext.getInstance(\"SSL\");\n            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());\n            // Create an ssl socket factory with our all-trusting manager\n            final javax.net.ssl.SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();\n\n            OkHttpClient.Builder builder = new OkHttpClient.Builder();\n            builder.sslSocketFactory(sslSocketFactory);\n            builder.hostnameVerifier(new HostnameVerifier() {\n                @Override\n                public boolean verify(String hostname, SSLSession session) {\n                    return true;\n                }\n            });\n\n            OkHttpClient okHttpClient = builder.build();\n            return okHttpClient;\n        } catch (Exception e) {\n            throw new RuntimeException(e);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/MainActivity.java",
    "content": "package com.ittianyu.pocenter.features;\n\nimport android.databinding.DataBindingUtil;\nimport android.os.Bundle;\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\nimport android.support.v4.app.FragmentPagerAdapter;\nimport android.support.v7.app.AppCompatActivity;\nimport android.view.KeyEvent;\nimport android.widget.Toast;\n\nimport com.ittianyu.pocenter.R;\nimport com.ittianyu.pocenter.databinding.ActMainBinding;\nimport com.ittianyu.pocenter.features.find.FindFragment;\nimport com.ittianyu.pocenter.features.home.HomeFragment;\nimport com.ittianyu.pocenter.features.mime.MimeFragment;\nimport com.ittianyu.pocenter.features.version.VersionUtils;\nimport com.umeng.analytics.MobclickAgent;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class MainActivity extends AppCompatActivity {\n    public static final long TIME_SPACE = 2000;\n    private ActMainBinding bind;\n    private VpAdapter adapter;\n    // collections\n    private List<Fragment> fragments;// used for ViewPager adapter\n    private long clickTime;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        bind = DataBindingUtil.setContentView(this, R.layout.act_main);\n\n        initData();\n        initView();\n        checkVersion();\n    }\n\n\n    private void initData() {\n        fragments = new ArrayList<>(3);\n\n        // add fragments\n        fragments.add(new HomeFragment());\n        fragments.add(new FindFragment());\n        fragments.add(new MimeFragment());\n    }\n\n    private void initView() {\n        // set bnve style\n        bind.bnve.enableAnimation(false);\n\n        // set adapter\n        adapter = new VpAdapter(getSupportFragmentManager(), fragments);\n        bind.vp.setOffscreenPageLimit(2);\n        bind.vp.setAdapter(adapter);\n\n        // binding with ViewPager\n        bind.bnve.setupWithViewPager(bind.vp);\n    }\n\n    private void checkVersion() {\n        VersionUtils.check(this);\n    }\n\n    @Override\n    public boolean onKeyDown(int keyCode, KeyEvent event) {\n        switch (keyCode) {\n            case KeyEvent.KEYCODE_BACK:\n                exit();\n                return true;\n        }\n        return super.onKeyDown(keyCode, event);\n    }\n\n    /**\n     * if click time space < TIME_SPACE, app will exit\n     */\n    private void exit() {\n        if ((System.currentTimeMillis() - clickTime) > TIME_SPACE) {\n            Toast.makeText(getApplicationContext(), R.string.exit_if_repeat,\n                    Toast.LENGTH_SHORT).show();\n            clickTime = System.currentTimeMillis();\n            return;\n        }\n        finish();\n    }\n\n    /**\n     * view pager adapter\n     */\n    private static class VpAdapter extends FragmentPagerAdapter {\n        private List<Fragment> data;\n\n        public VpAdapter(FragmentManager fm, List<Fragment> data) {\n            super(fm);\n            this.data = data;\n        }\n\n        @Override\n        public int getCount() {\n            return data.size();\n        }\n\n        @Override\n        public Fragment getItem(int position) {\n            return data.get(position);\n        }\n    }\n\n    // 友盟统计\n\n    public void onResume() {\n        super.onResume();\n        MobclickAgent.onResume(this);\n    }\n\n    public void onPause() {\n        super.onPause();\n        MobclickAgent.onPause(this);\n    }\n    // 友盟统计 结束\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/SplashActivity.java",
    "content": "package com.ittianyu.pocenter.features;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.support.v7.app.AppCompatActivity;\n\nimport com.ittianyu.pocenter.R;\nimport com.ittianyu.pocenter.common.base.BaseApplication;\nimport com.ittianyu.pocenter.features.type.TypeActivity;\nimport com.umeng.analytics.MobclickAgent;\n\nimport java.util.concurrent.TimeUnit;\n\nimport io.reactivex.Observable;\nimport io.reactivex.functions.Consumer;\n\npublic class SplashActivity extends AppCompatActivity {\n    private static final long SHOW_TIME = 1000;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.act_splash);\n\n        // wait for 1s to show splash activity\n        Observable.just(new Object())\n                .delay(SHOW_TIME, TimeUnit.MILLISECONDS)\n                .subscribe(new Consumer<Object>() {\n                    @Override\n                    public void accept(Object o) throws Exception {\n                        start();\n                    }\n                });\n    }\n\n    /**\n     * start load config\n     */\n    private void start() {\n        // check type\n        if (!BaseApplication.getRepertories().isSettingTypes()) {\n            // type is empty, need start type activity\n            startActivity(new Intent(this, TypeActivity.class));\n        } else {\n            // enter main activity\n            startActivity(new Intent(this, MainActivity.class));\n        }\n        finish();\n    }\n\n    // 友盟统计\n    public void onResume() {\n        super.onResume();\n        MobclickAgent.onResume(this);\n    }\n    public void onPause() {\n        super.onPause();\n        MobclickAgent.onPause(this);\n    }\n    // 友盟统计 结束\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/detail/DetailActivity.java",
    "content": "package com.ittianyu.pocenter.features.detail;\n\nimport android.content.Intent;\nimport android.databinding.DataBindingUtil;\nimport android.net.Uri;\nimport android.os.Bundle;\nimport android.support.v7.app.ActionBar;\nimport android.support.v7.app.AppCompatActivity;\nimport android.text.TextUtils;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.webkit.WebSettings;\n\nimport com.ittianyu.pocenter.R;\nimport com.ittianyu.pocenter.databinding.ActDetailBinding;\nimport com.umeng.analytics.MobclickAgent;\n\nimport cn.sharesdk.framework.ShareSDK;\nimport cn.sharesdk.onekeyshare.OnekeyShare;\n\npublic class DetailActivity extends AppCompatActivity {\n    public static final String EXTRA_URL = \"url\";\n    public static final String EXTRA_TITLE = \"title\";\n    public static final String EXTRA_DESCRIPTION = \"description\";\n    private ActDetailBinding bind;\n    private String url;\n    private String title;\n    private String description;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n//        setContentView(R.layout.act_detail);\n        bind = DataBindingUtil.setContentView(this, R.layout.act_detail);\n\n\n        Intent intent = getIntent();\n        // get url title description\n        url = intent.getStringExtra(EXTRA_URL);\n        title = intent.getStringExtra(EXTRA_TITLE);\n        description = intent.getStringExtra(EXTRA_DESCRIPTION);\n\n        // load website\n        WebSettings settings = bind.wv.getSettings();\n        settings.setJavaScriptEnabled(true);\n        bind.wv.loadUrl(url);\n\n        // init action bar\n        setSupportActionBar(bind.tb);\n        ActionBar actionBar = getSupportActionBar();\n        actionBar.setTitle(\"\");\n        if (!TextUtils.isEmpty(title))// set title\n            bind.tvTitle.setText(title);\n        // enable back button\n        actionBar.setDisplayHomeAsUpEnabled(true);\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        getMenuInflater().inflate(R.menu.menu_detail, menu);\n        return super.onCreateOptionsMenu(menu);\n    }\n\n    /**\n     * menu selected\n     *\n     * @param item\n     * @return\n     */\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        switch (item.getItemId()) {\n            case android.R.id.home:\n                finish();\n                break;\n            case R.id.i_refresh:\n                bind.wv.reload();\n                break;\n            case R.id.i_open_in_browser:\n                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));\n                break;\n            case R.id.i_share: {\n                showShare();\n                break;\n            }\n        }\n\n        return super.onOptionsItemSelected(item);\n    }\n\n    private void showShare() {\n        ShareSDK.initSDK(this);\n        OnekeyShare oks = new OnekeyShare();\n//关闭sso授权\n        oks.disableSSOWhenAuthorize();\n// title标题，印象笔记、邮箱、信息、微信、人人网和QQ空间等使用\n        oks.setTitle(title);\n// titleUrl是标题的网络链接，QQ和QQ空间等使用\n        oks.setTitleUrl(url);\n// text是分享文本，所有平台都需要这个字段\n        oks.setText(description);\n// imagePath是图片的本地路径，Linked-In以外的平台都支持此参数\n//oks.setImagePath(\"/sdcard/test.jpg\");//确保SDcard下面存在此张图片\n// url仅在微信（包括好友和朋友圈）中使用\n        oks.setUrl(url);\n// site是分享此内容的网站名称，仅在QQ空间使用\n        oks.setSite(getString(R.string.app_name));\n// siteUrl是分享此内容的网站地址，仅在QQ空间使用\n        oks.setSiteUrl(\"https://www.ittianyu.com\");\n// 启动分享GUI\n        oks.show(this);\n    }\n\n    // 友盟统计\n    public void onResume() {\n        super.onResume();\n        MobclickAgent.onResume(this);\n    }\n    public void onPause() {\n        super.onPause();\n        MobclickAgent.onPause(this);\n    }\n    // 友盟统计 结束\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/find/FindAdapter.java",
    "content": "package com.ittianyu.pocenter.features.find;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.chad.library.adapter.base.BaseViewHolder;\nimport com.ittianyu.pocenter.R;\nimport com.ittianyu.pocenter.common.base.BaseApplication;\nimport com.ittianyu.pocenter.common.bean.ProjectBean;\n\nimport java.text.SimpleDateFormat;\nimport java.util.List;\nimport java.util.Locale;\n\n/**\n * Created by yu on 2017/1/17.\n */\n\npublic class FindAdapter extends BaseQuickAdapter<ProjectBean, BaseViewHolder> {\n    public FindAdapter(List<ProjectBean> data) {\n        super(R.layout.item_find, data);\n    }\n\n    @Override\n    protected void convert(BaseViewHolder baseViewHolder, ProjectBean projectBean) {\n        baseViewHolder.setText(R.id.tv_title, projectBean.title);\n        baseViewHolder.setText(R.id.tv_price, projectBean.price);\n//        baseViewHolder.setText(R.id.tv_reference, projectBean.reference);\n        baseViewHolder.setText(R.id.tv_type, transferType(projectBean.type));\n        baseViewHolder.setText(R.id.tv_description, projectBean.description);\n        baseViewHolder.setText(R.id.tv_date, new SimpleDateFormat(\"yyyy-MM-dd\", Locale.CHINESE).format(projectBean.time));\n        baseViewHolder.setText(R.id.tv_people_count, projectBean.people + mContext.getString(R.string.unit_people));\n        baseViewHolder.setText(R.id.tv_cycle, projectBean.cycle + mContext.getString(R.string.unit_day));\n    }\n\n    /**\n     * transfer type from code to string\n     * @param type\n     * @return\n     */\n    private String transferType(int type) {\n        List<String> types = BaseApplication.getRepertories().getAllTypes();\n        if (type < types.size())\n            return types.get(type);\n        return \"\";\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/find/FindContract.java",
    "content": "package com.ittianyu.pocenter.features.find;\n\nimport com.ittianyu.pocenter.common.base.BaseContract;\nimport com.ittianyu.pocenter.common.bean.ProjectBean;\n\nimport java.util.List;\n\n/**\n * Created by yu on 2017/1/17.\n */\n\npublic interface FindContract {\n    interface View extends BaseContract.View<List<ProjectBean>> {\n        void loadDataError(Throwable e, boolean pullToRefresh);\n        void loadDataComplete();\n        void loadMore();\n        void addData(List<ProjectBean> data);\n        void loadMoreError(Throwable e);\n        void loadMoreComplete();\n    }\n\n    interface Presenter extends BaseContract.Presenter<View> {\n        void loadData(boolean pullToRefresh);\n        void loadMore(int start);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/find/FindFragment.java",
    "content": "package com.ittianyu.pocenter.features.find;\n\nimport android.content.Intent;\nimport android.databinding.DataBindingUtil;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.support.v7.widget.DividerItemDecoration;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.chad.library.adapter.base.listener.OnItemClickListener;\nimport com.ittianyu.pocenter.R;\nimport com.ittianyu.pocenter.common.base.BaseFragment;\nimport com.ittianyu.pocenter.common.bean.ProjectBean;\nimport com.ittianyu.pocenter.common.utils.CollectionUtils;\nimport com.ittianyu.pocenter.databinding.FragFindBinding;\nimport com.ittianyu.pocenter.features.detail.DetailActivity;\nimport com.ittianyu.pocenter.features.search.SearchActivity;\nimport com.orhanobut.logger.Logger;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by yu on 2017/1/13.\n */\n\npublic class FindFragment extends BaseFragment<SwipeRefreshLayout, List<ProjectBean>, FindContract.View, FindContract.Presenter>\n        implements FindContract.View {\n    private FragFindBinding bind;\n    private FindAdapter findAdapter;\n\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n//        Logger.d(\"onCreateView\");\n        return View.inflate(getContext(), R.layout.frag_find, null);\n    }\n\n    @Override\n    public FindContract.Presenter createPresenter() {\n        return new FindPresenter();\n    }\n\n    @Override\n    protected void initView(View view) {\n        bind = DataBindingUtil.bind(view);\n\n        // init recycler view\n        findAdapter = new FindAdapter(new ArrayList<ProjectBean>(0));\n        bind.rv.setAdapter(findAdapter);\n        bind.rv.setLayoutManager(new LinearLayoutManager(getContext()));\n        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL);\n        dividerItemDecoration.setDrawable(getResources().getDrawable(R.drawable.shape_drive_line));\n        bind.rv.addItemDecoration(dividerItemDecoration);\n\n        initEvent();\n    }\n\n    /**\n     * set listeners\n     */\n    private void initEvent() {\n        // refresh listener\n        bind.vContent.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                loadData(true);\n            }\n        });\n        // load more listener\n        findAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {\n            @Override\n            public void onLoadMoreRequested() {\n                bind.rv.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        loadMore();\n                    }\n                });\n            }\n        });\n\n        // set listener to start search\n        bind.tb.findViewById(R.id.ll_root).setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                startActivity(new Intent(getContext(), SearchActivity.class));\n            }\n        });\n\n        // item click listener\n        bind.rv.addOnItemTouchListener(new OnItemClickListener() {\n            @Override\n            public void SimpleOnItemClick(BaseQuickAdapter baseQuickAdapter, View view, int i) {\n                // get item url\n                ProjectBean project = (ProjectBean) baseQuickAdapter.getItem(i);\n                // start detail activity\n                Intent intent = new Intent(getContext(), DetailActivity.class);\n                intent.putExtra(DetailActivity.EXTRA_URL, project.url);\n                intent.putExtra(DetailActivity.EXTRA_TITLE, project.title);\n                intent.putExtra(DetailActivity.EXTRA_DESCRIPTION, project.description);\n                startActivity(intent);\n            }\n        });\n    }\n\n    @Override\n    public void loadData(boolean pullToRefresh) {\n        // disable load more when reload data or first load\n        findAdapter.setEnableLoadMore(false);\n\n        // show loading\n        showLoading(pullToRefresh);\n\n        presenter.loadData(pullToRefresh);\n        Logger.d(\"start load data\");\n    }\n\n    @Override\n    public void setData(List<ProjectBean> data) {\n        if (CollectionUtils.isEmpty(data)) {\n            showEmpty();\n        } else {\n            showContent();\n        }\n        findAdapter.setNewData(data);\n\n        Logger.d(\"set data\");\n        loadDataComplete();\n    }\n\n    @Override\n    public void loadDataError(Throwable e, boolean pullToRefresh) {\n        showError(e, pullToRefresh);\n        Logger.d(\"load data error\");\n        loadDataComplete();\n    }\n\n    @Override\n    public void loadDataComplete() {\n        // enable load more after reload completed\n        findAdapter.setEnableLoadMore(true);\n        bind.vContent.setRefreshing(false);\n        Logger.d(\"load data complete\");\n    }\n\n    @Override\n    public void loadMore() {\n        // disable refresh when load more\n        bind.vContent.setEnabled(false);\n\n        presenter.loadMore(findAdapter.getData().size());\n        Logger.d(\"start load more\");\n    }\n\n    @Override\n    public void addData(List<ProjectBean> data) {\n        if (CollectionUtils.isEmpty(data)) {\n            // no more data\n            findAdapter.loadMoreEnd();\n        } else {\n            findAdapter.loadMoreComplete();\n        }\n\n        findAdapter.addData(data);\n        Logger.d(\"add data\");\n        loadMoreComplete();\n    }\n\n    @Override\n    public void loadMoreError(Throwable e) {\n//        showError(e, false);\n        findAdapter.loadMoreFail();\n        Logger.d(\"load more error\");\n        loadMoreComplete();\n    }\n\n    @Override\n    public void loadMoreComplete() {\n        // enable reload after load more completed\n        bind.vContent.setEnabled(true);\n        Logger.d(\"load more complete\");\n    }\n\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/find/FindPresenter.java",
    "content": "package com.ittianyu.pocenter.features.find;\n\nimport com.ittianyu.pocenter.common.api.RemoteApi;\nimport com.ittianyu.pocenter.common.base.BasePresenter;\nimport com.ittianyu.pocenter.common.bean.ProjectBean;\n\nimport java.util.List;\n\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by yu on 2017/1/17.\n */\n\npublic class FindPresenter extends BasePresenter<FindContract.View> implements FindContract.Presenter {\n    private static final int COUNT = 20;\n\n    @Override\n    public void loadData(final boolean pullToRefresh) {\n        application.getRepertories()\n                .getList(0, COUNT, null, RemoteApi.Status.RECRUITING, null, pullToRefresh)\n                .subscribe(new Consumer<List<ProjectBean>>() {\n                    @Override\n                    public void accept(List<ProjectBean> projectBeen) throws Exception {\n                        getView().setData(projectBeen);\n                    }\n                }, new Consumer<Throwable>() {\n                    @Override\n                    public void accept(Throwable throwable) throws Exception {\n                        getView().loadDataError(throwable, pullToRefresh);\n                    }\n                });\n    }\n\n    @Override\n    public void loadMore(int start) {\n        application.getRepertories()\n                .getList(start, COUNT, null, RemoteApi.Status.RECRUITING, null, false)\n                .subscribe(new Consumer<List<ProjectBean>>() {\n                    @Override\n                    public void accept(List<ProjectBean> projectBeen) throws Exception {\n                        getView().addData(projectBeen);\n                    }\n                }, new Consumer<Throwable>() {\n                    @Override\n                    public void accept(Throwable throwable) throws Exception {\n                        getView().loadMoreError(throwable);\n                    }\n                });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/home/HomeAdapter.java",
    "content": "package com.ittianyu.pocenter.features.home;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.chad.library.adapter.base.BaseViewHolder;\nimport com.ittianyu.pocenter.R;\nimport com.ittianyu.pocenter.common.base.BaseApplication;\nimport com.ittianyu.pocenter.common.bean.ProjectBean;\n\nimport java.text.SimpleDateFormat;\nimport java.util.List;\nimport java.util.Locale;\n\n/**\n * Created by yu on 2017/1/17.\n */\n\npublic class HomeAdapter extends BaseQuickAdapter<ProjectBean, BaseViewHolder> {\n    public HomeAdapter(List<ProjectBean> data) {\n        super(R.layout.item_home, data);\n    }\n\n    @Override\n    protected void convert(BaseViewHolder baseViewHolder, ProjectBean projectBean) {\n        baseViewHolder.setText(R.id.tv_title, projectBean.title);\n        baseViewHolder.setText(R.id.tv_price, projectBean.price);\n        baseViewHolder.setText(R.id.tv_reference, projectBean.reference);\n        baseViewHolder.setText(R.id.tv_type, transferType(projectBean.type));\n        baseViewHolder.setText(R.id.tv_description, projectBean.description);\n        baseViewHolder.setText(R.id.tv_date, new SimpleDateFormat(\"yyyy-MM-dd\", Locale.CHINESE).format(projectBean.time));\n        baseViewHolder.setText(R.id.tv_people_count, projectBean.people + mContext.getString(R.string.unit_people));\n        baseViewHolder.setText(R.id.tv_cycle, projectBean.cycle + mContext.getString(R.string.unit_day));\n    }\n\n    /**\n     * transfer type from code to string\n     * @param type\n     * @return\n     */\n    private String transferType(int type) {\n        List<String> types = BaseApplication.getRepertories().getAllTypes();\n        if (type < types.size())\n            return types.get(type);\n        return \"\";\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/home/HomeContract.java",
    "content": "package com.ittianyu.pocenter.features.home;\n\nimport com.ittianyu.pocenter.common.base.BaseContract;\nimport com.ittianyu.pocenter.common.bean.ProjectBean;\n\nimport java.util.List;\n\n/**\n * Created by yu on 2017/1/17.\n */\n\npublic interface HomeContract {\n    interface View extends BaseContract.View<List<ProjectBean>> {\n        void loadDataError(Throwable e, boolean pullToRefresh);\n        void loadDataComplete();\n        void loadMore();\n        void addData(List<ProjectBean> data);\n        void loadMoreError(Throwable e);\n        void loadMoreComplete();\n    }\n\n    interface Presenter extends BaseContract.Presenter<View> {\n        void loadData(boolean pullToRefresh);\n        void loadMore(int start);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/home/HomeFragment.java",
    "content": "package com.ittianyu.pocenter.features.home;\n\nimport android.content.Intent;\nimport android.databinding.DataBindingUtil;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.support.v7.widget.DividerItemDecoration;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.chad.library.adapter.base.listener.OnItemClickListener;\nimport com.ittianyu.pocenter.R;\nimport com.ittianyu.pocenter.common.base.BaseFragment;\nimport com.ittianyu.pocenter.common.bean.ProjectBean;\nimport com.ittianyu.pocenter.common.utils.CollectionUtils;\nimport com.ittianyu.pocenter.databinding.FragHomeBinding;\nimport com.ittianyu.pocenter.features.detail.DetailActivity;\nimport com.orhanobut.logger.Logger;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by yu on 2017/1/13.\n */\npublic class HomeFragment extends BaseFragment<SwipeRefreshLayout, List<ProjectBean>, HomeContract.View, HomeContract.Presenter>\n        implements HomeContract.View {\n    private FragHomeBinding bind;\n    private HomeAdapter homeAdapter;\n\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n//        Logger.d(\"onCreateView\");\n        return View.inflate(getContext(), R.layout.frag_home, null);\n    }\n\n    @Override\n    public HomeContract.Presenter createPresenter() {\n        return new HomePresenter();\n    }\n\n    @Override\n    protected void initView(View view) {\n        bind = DataBindingUtil.bind(view);\n\n        // init recycler view\n        homeAdapter = new HomeAdapter(new ArrayList<ProjectBean>(0));\n        bind.rv.setAdapter(homeAdapter);\n        bind.rv.setLayoutManager(new LinearLayoutManager(getContext()));\n        DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL);\n        dividerItemDecoration.setDrawable(getResources().getDrawable(R.drawable.shape_drive_line));\n        bind.rv.addItemDecoration(dividerItemDecoration);\n\n        initEvent();\n    }\n\n    /**\n     * set listeners\n     */\n    private void initEvent() {\n        // refresh listener\n        bind.vContent.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                loadData(true);\n            }\n        });\n        // load more listener\n        homeAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {\n            @Override\n            public void onLoadMoreRequested() {\n                bind.rv.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        loadMore();\n                    }\n                });\n            }\n        });\n\n        // item click listener\n        bind.rv.addOnItemTouchListener(new OnItemClickListener() {\n            @Override\n            public void SimpleOnItemClick(BaseQuickAdapter baseQuickAdapter, View view, int i) {\n                // get item url\n                ProjectBean project = (ProjectBean) baseQuickAdapter.getItem(i);\n                // start detail activity\n                Intent intent = new Intent(getContext(), DetailActivity.class);\n                intent.putExtra(DetailActivity.EXTRA_URL, project.url);\n                intent.putExtra(DetailActivity.EXTRA_TITLE, project.title);\n                intent.putExtra(DetailActivity.EXTRA_DESCRIPTION, project.description);\n                startActivity(intent);\n            }\n        });\n    }\n\n    @Override\n    public void loadData(boolean pullToRefresh) {\n        // disable load more when reload data or first load\n        homeAdapter.setEnableLoadMore(false);\n\n        // show loading\n        showLoading(pullToRefresh);\n\n        presenter.loadData(pullToRefresh);\n        Logger.d(\"start load data\");\n    }\n\n    @Override\n    public void setData(List<ProjectBean> data) {\n        if (CollectionUtils.isEmpty(data)) {\n            showEmpty();\n        } else {\n            showContent();\n        }\n        homeAdapter.setNewData(data);\n\n        Logger.d(\"set data\");\n        loadDataComplete();\n    }\n\n    @Override\n    public void loadDataError(Throwable e, boolean pullToRefresh) {\n        showError(e, pullToRefresh);\n        Logger.d(\"load data error\");\n        loadDataComplete();\n    }\n\n    @Override\n    public void loadDataComplete() {\n        // enable load more after reload completed\n        homeAdapter.setEnableLoadMore(true);\n        bind.vContent.setRefreshing(false);\n        Logger.d(\"load data complete\");\n    }\n\n    @Override\n    public void loadMore() {\n        // disable refresh when load more\n        bind.vContent.setEnabled(false);\n\n        presenter.loadMore(homeAdapter.getData().size());\n        Logger.d(\"start load more\");\n    }\n\n    @Override\n    public void addData(List<ProjectBean> data) {\n        if (CollectionUtils.isEmpty(data)) {\n            // no more data\n            homeAdapter.loadMoreEnd();\n        } else {\n            homeAdapter.loadMoreComplete();\n        }\n\n        homeAdapter.addData(data);\n        Logger.d(\"add data\");\n        loadMoreComplete();\n    }\n\n    @Override\n    public void loadMoreError(Throwable e) {\n//        showError(e, false);\n        homeAdapter.loadMoreFail();\n        Logger.d(\"load more error\");\n        loadMoreComplete();\n    }\n\n    @Override\n    public void loadMoreComplete() {\n        // enable reload after load more completed\n        bind.vContent.setEnabled(true);\n        Logger.d(\"load more complete\");\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/home/HomePresenter.java",
    "content": "package com.ittianyu.pocenter.features.home;\n\nimport com.ittianyu.pocenter.common.api.RemoteApi;\nimport com.ittianyu.pocenter.common.base.BaseApplication;\nimport com.ittianyu.pocenter.common.base.BasePresenter;\nimport com.ittianyu.pocenter.common.bean.ProjectBean;\n\nimport java.util.List;\n\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by yu on 2017/1/17.\n */\n\npublic class HomePresenter extends BasePresenter<HomeContract.View> implements HomeContract.Presenter {\n    private static final int COUNT = 20;\n    private int[] types;\n\n    public HomePresenter() {\n        loadTypes();\n    }\n\n    /**\n     * load user selected types from config\n     */\n    private void loadTypes() {\n        // load types\n        types = BaseApplication.getRepertories().getTypes();\n    }\n\n    @Override\n    public void loadData(final boolean pullToRefresh) {\n        // if refresh data, update types first\n        if (pullToRefresh)\n            loadTypes();\n\n        application.getRepertories()\n                .getList(0, COUNT, types, RemoteApi.Status.RECRUITING, null, pullToRefresh)\n                .subscribe(new Consumer<List<ProjectBean>>() {\n                    @Override\n                    public void accept(List<ProjectBean> projectBeen) throws Exception {\n                        getView().setData(projectBeen);\n                    }\n                }, new Consumer<Throwable>() {\n                    @Override\n                    public void accept(Throwable throwable) throws Exception {\n                        getView().loadDataError(throwable, pullToRefresh);\n                    }\n                });\n    }\n\n    @Override\n    public void loadMore(int start) {\n        application.getRepertories()\n                .getList(start, COUNT, types, RemoteApi.Status.RECRUITING, null, false)\n                .subscribe(new Consumer<List<ProjectBean>>() {\n                    @Override\n                    public void accept(List<ProjectBean> projectBeen) throws Exception {\n                        getView().addData(projectBeen);\n                    }\n                }, new Consumer<Throwable>() {\n                    @Override\n                    public void accept(Throwable throwable) throws Exception {\n                        getView().loadMoreError(throwable);\n                    }\n                });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/mime/MimeFragment.java",
    "content": "package com.ittianyu.pocenter.features.mime;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.databinding.DataBindingUtil;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v4.app.Fragment;\nimport android.support.v7.app.AlertDialog;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.ittianyu.pocenter.BuildConfig;\nimport com.ittianyu.pocenter.R;\nimport com.ittianyu.pocenter.databinding.FragMimeBinding;\nimport com.ittianyu.pocenter.features.type.TypeActivity;\nimport com.ittianyu.pocenter.features.version.VersionUtils;\n\n/**\n * Created by yu on 2017/1/13.\n */\n\npublic class MimeFragment extends Fragment {\n\n    private FragMimeBinding bind;\n\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {\n        return View.inflate(getContext(), R.layout.frag_mime, null);\n    }\n\n    @Override\n    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {\n        super.onViewCreated(view, savedInstanceState);\n\n        initView(view);\n        initEvent();\n    }\n\n    private void initView(View view) {\n        bind = DataBindingUtil.bind(view);\n    }\n\n    private void initEvent() {\n        // tag manager\n        bind.llTagManager.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                startActivity(new Intent(getContext(), TypeActivity.class));\n            }\n        });\n\n        // about\n        bind.llAbout.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                Context context = getContext();\n                new AlertDialog.Builder(context)\n                        .setTitle(context.getString(R.string.app_name) + \" (\" + BuildConfig.VERSION_NAME + \")\")\n                        .setMessage(R.string.tips_about_us)\n                        .setPositiveButton(R.string.ok, null)\n                        .show();\n            }\n        });\n\n        // version check\n        bind.llVersionCheck.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                VersionUtils.check(getContext(), true);\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/search/SearchActivity.java",
    "content": "package com.ittianyu.pocenter.features.search;\n\nimport android.content.Intent;\nimport android.databinding.DataBindingUtil;\nimport android.os.Bundle;\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.text.TextUtils;\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.arlib.floatingsearchview.FloatingSearchView;\nimport com.arlib.floatingsearchview.suggestions.model.SearchSuggestion;\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.chad.library.adapter.base.listener.OnItemClickListener;\nimport com.ittianyu.mvp.lcee.Lcee;\nimport com.ittianyu.mvp.lcee.MvpLceeActivity;\nimport com.ittianyu.pocenter.R;\nimport com.ittianyu.pocenter.common.bean.ProjectBean;\nimport com.ittianyu.pocenter.common.utils.CollectionUtils;\nimport com.ittianyu.pocenter.databinding.ActSearchBinding;\nimport com.ittianyu.pocenter.features.detail.DetailActivity;\nimport com.orhanobut.logger.Logger;\nimport com.umeng.analytics.MobclickAgent;\nimport com.victor.loading.rotate.RotateLoading;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by yu on 2017/1/13.\n */\n@Lcee(loadingViewId = R.id.v_loading, contentViewId = R.id.v_content, errorViewId = R.id.v_error, emptyViewId = R.id.v_empty)\npublic class SearchActivity extends MvpLceeActivity<SwipeRefreshLayout, List<ProjectBean>, SearchContract.View, SearchContract.Presenter>\n        implements SearchContract.View {\n    private ActSearchBinding bind;\n    private SearchAdapter searchAdapter;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n\n        bind = DataBindingUtil.setContentView(this, R.layout.act_search);\n        initView();\n    }\n\n    @Override\n    protected String getErrorMessage(Throwable e, boolean pullToRefresh) {\n        Logger.e(e, \"\");\n        return pullToRefresh ? getString(R.string.failed_to_refresh) : getString(R.string.failed_to_load_click_to_reload);\n    }\n\n    @Override\n    protected void onSetErrorViewText(View errorView, String errorMsg) {\n        TextView tv = (TextView) errorView.findViewById(R.id.tv);\n        tv.setText(errorMsg);\n    }\n\n    @Override\n    public void showLoading(boolean pullToRefresh) {\n        super.showLoading(pullToRefresh);\n        RotateLoading rotateLoading = (RotateLoading) this.loadingView.findViewById(R.id.rl);\n        if (!rotateLoading.isStart())\n            rotateLoading.start();\n    }\n\n    @Override\n    public SearchContract.Presenter createPresenter() {\n        return new SearchPresenter();\n    }\n\n    protected void initView() {\n        // init recycler view\n        searchAdapter = new SearchAdapter(new ArrayList<ProjectBean>(0));\n        bind.rv.setAdapter(searchAdapter);\n        bind.rv.setLayoutManager(new LinearLayoutManager(this));\n//        bind.rv.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));\n\n        bind.fsv.setSearchFocused(true);\n\n        initEvent();\n        showContent();\n    }\n\n    /**\n     * set listeners\n     */\n    private void initEvent() {\n        // refresh listener\n        bind.vContent.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {\n            @Override\n            public void onRefresh() {\n                loadData(true);\n            }\n        });\n        // load more listener\n        searchAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {\n            @Override\n            public void onLoadMoreRequested() {\n                bind.rv.post(new Runnable() {\n                    @Override\n                    public void run() {\n                        loadMore();\n                    }\n                });\n            }\n        });\n\n        // item click listener\n        bind.rv.addOnItemTouchListener(new OnItemClickListener() {\n            @Override\n            public void SimpleOnItemClick(BaseQuickAdapter baseQuickAdapter, View view, int i) {\n                // get item url\n                ProjectBean project = (ProjectBean) baseQuickAdapter.getItem(i);\n                // start detail activity\n                Intent intent = new Intent(SearchActivity.this, DetailActivity.class);\n                intent.putExtra(DetailActivity.EXTRA_URL, project.url);\n                intent.putExtra(DetailActivity.EXTRA_TITLE, project.title);\n                intent.putExtra(DetailActivity.EXTRA_DESCRIPTION, project.description);\n                startActivity(intent);\n            }\n        });\n\n        // search listener\n        bind.fsv.setOnSearchListener(new FloatingSearchView.OnSearchListener() {\n            @Override\n            public void onSuggestionClicked(SearchSuggestion searchSuggestion) {\n\n            }\n\n            @Override\n            public void onSearchAction(String currentQuery) {\n                if (!TextUtils.isEmpty(currentQuery)) {\n                    presenter.setSearchString(currentQuery);\n                    loadData(false);\n                }\n            }\n        });\n    }\n\n    @Override\n    public void loadData(boolean pullToRefresh) {\n        // disable load more when reload data or first load\n        searchAdapter.setEnableLoadMore(false);\n\n        // show loading\n        showLoading(pullToRefresh);\n\n        presenter.loadData(pullToRefresh);\n        Logger.d(\"start load data\");\n    }\n\n    @Override\n    public void setData(List<ProjectBean> data) {\n        if (CollectionUtils.isEmpty(data)) {\n            showEmpty();\n        } else {\n            showContent();\n        }\n        searchAdapter.setNewData(data);\n        bind.rv.scrollToPosition(0);\n\n        Logger.d(\"set data\");\n        loadDataComplete();\n    }\n\n    @Override\n    public void loadDataError(Throwable e, boolean pullToRefresh) {\n        showError(e, pullToRefresh);\n        Logger.d(\"load data error\");\n        loadDataComplete();\n    }\n\n    @Override\n    public void loadDataComplete() {\n        // enable load more after reload completed\n        searchAdapter.setEnableLoadMore(true);\n        bind.vContent.setRefreshing(false);\n        Logger.d(\"load data complete\");\n    }\n\n    @Override\n    public void loadMore() {\n        // disable refresh when load more\n        bind.vContent.setEnabled(false);\n\n        presenter.loadMore(searchAdapter.getData().size());\n        Logger.d(\"start load more\");\n    }\n\n    @Override\n    public void addData(List<ProjectBean> data) {\n        if (CollectionUtils.isEmpty(data)) {\n            // no more data\n            searchAdapter.loadMoreEnd();\n        } else {\n            searchAdapter.loadMoreComplete();\n        }\n\n        searchAdapter.addData(data);\n        Logger.d(\"add data\");\n        loadMoreComplete();\n    }\n\n    @Override\n    public void loadMoreError(Throwable e) {\n//        showError(e, false);\n        searchAdapter.loadMoreFail();\n        Logger.d(\"load more error\");\n        loadMoreComplete();\n    }\n\n    @Override\n    public void loadMoreComplete() {\n        // enable reload after load more completed\n        bind.vContent.setEnabled(true);\n        Logger.d(\"load more complete\");\n    }\n\n    @Override\n    public <T> T getApp() {\n        return (T) getApplication();\n    }\n\n    // 友盟统计\n    public void onResume() {\n        super.onResume();\n        MobclickAgent.onResume(this);\n    }\n    public void onPause() {\n        super.onPause();\n        MobclickAgent.onPause(this);\n    }\n    // 友盟统计 结束\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/search/SearchAdapter.java",
    "content": "package com.ittianyu.pocenter.features.search;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.chad.library.adapter.base.BaseViewHolder;\nimport com.ittianyu.pocenter.R;\nimport com.ittianyu.pocenter.common.base.BaseApplication;\nimport com.ittianyu.pocenter.common.bean.ProjectBean;\n\nimport java.text.SimpleDateFormat;\nimport java.util.List;\nimport java.util.Locale;\n\n/**\n * Created by yu on 2017/1/17.\n */\n\npublic class SearchAdapter extends BaseQuickAdapter<ProjectBean, BaseViewHolder> {\n    public SearchAdapter(List<ProjectBean> data) {\n        super(R.layout.item_search, data);\n    }\n\n    @Override\n    protected void convert(BaseViewHolder baseViewHolder, ProjectBean projectBean) {\n        baseViewHolder.setText(R.id.tv_title, projectBean.title);\n        baseViewHolder.setText(R.id.tv_price, projectBean.price);\n//        baseViewHolder.setText(R.id.tv_reference, projectBean.reference);\n//        baseViewHolder.setText(R.id.tv_type, transferType(projectBean.type));\n        baseViewHolder.setText(R.id.tv_description, projectBean.description);\n        baseViewHolder.setText(R.id.tv_date, new SimpleDateFormat(\"yyyy-MM-dd\", Locale.CHINESE).format(projectBean.time));\n        baseViewHolder.setText(R.id.tv_people_count, projectBean.people + mContext.getString(R.string.unit_people));\n        baseViewHolder.setText(R.id.tv_cycle, projectBean.cycle + mContext.getString(R.string.unit_day));\n    }\n\n    /**\n     * transfer type from code to string\n     * @param type\n     * @return\n     */\n    private String transferType(int type) {\n        List<String> types = BaseApplication.getRepertories().getAllTypes();\n        if (type < types.size())\n            return types.get(type);\n        return \"\";\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/search/SearchContract.java",
    "content": "package com.ittianyu.pocenter.features.search;\n\nimport com.ittianyu.pocenter.common.base.BaseContract;\nimport com.ittianyu.pocenter.common.bean.ProjectBean;\n\nimport java.util.List;\n\n/**\n * Created by yu on 2017/1/17.\n */\n\npublic interface SearchContract {\n    interface View extends BaseContract.View<List<ProjectBean>> {\n        void loadDataError(Throwable e, boolean pullToRefresh);\n        void loadDataComplete();\n        void loadMore();\n        void addData(List<ProjectBean> data);\n        void loadMoreError(Throwable e);\n        void loadMoreComplete();\n    }\n\n    interface Presenter extends BaseContract.Presenter<View> {\n        void loadData(boolean pullToRefresh);\n        void loadMore(int start);\n        void setSearchString(String search);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/search/SearchPresenter.java",
    "content": "package com.ittianyu.pocenter.features.search;\n\nimport com.ittianyu.pocenter.common.api.RemoteApi;\nimport com.ittianyu.pocenter.common.base.BasePresenter;\nimport com.ittianyu.pocenter.common.bean.ProjectBean;\nimport com.orhanobut.logger.Logger;\n\nimport java.util.List;\n\nimport io.reactivex.functions.Consumer;\n\n/**\n * Created by yu on 2017/1/17.\n */\npublic class SearchPresenter extends BasePresenter<SearchContract.View> implements SearchContract.Presenter {\n    private static final int COUNT = 20;\n    private String[] keywords;\n\n    @Override\n    public void loadData(final boolean pullToRefresh) {\n        application.getRepertories()\n                .getList(0, COUNT, null, RemoteApi.Status.RECRUITING, keywords, pullToRefresh)\n                .subscribe(new Consumer<List<ProjectBean>>() {\n                    @Override\n                    public void accept(List<ProjectBean> projectBeen) throws Exception {\n                        getView().setData(projectBeen);\n                    }\n                }, new Consumer<Throwable>() {\n                    @Override\n                    public void accept(Throwable throwable) throws Exception {\n                        getView().loadDataError(throwable, pullToRefresh);\n                    }\n                });\n    }\n\n    @Override\n    public void loadMore(int start) {\n        application.getRepertories()\n                .getList(start, COUNT, null, RemoteApi.Status.RECRUITING, keywords, false)\n                .subscribe(new Consumer<List<ProjectBean>>() {\n                    @Override\n                    public void accept(List<ProjectBean> projectBeen) throws Exception {\n                        getView().addData(projectBeen);\n                    }\n                }, new Consumer<Throwable>() {\n                    @Override\n                    public void accept(Throwable throwable) throws Exception {\n                        getView().loadMoreError(throwable);\n                    }\n                });\n    }\n\n    @Override\n    public void setSearchString(String search) {\n        keywords = search.split(\" \");\n        Logger.d(keywords);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/type/TypeActivity.java",
    "content": "package com.ittianyu.pocenter.features.type;\n\nimport android.content.Intent;\nimport android.databinding.DataBindingUtil;\nimport android.os.Bundle;\nimport android.support.annotation.NonNull;\nimport android.view.LayoutInflater;\nimport android.view.Menu;\nimport android.view.MenuItem;\nimport android.view.View;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.hannesdorfmann.mosby.mvp.MvpActivity;\nimport com.ittianyu.pocenter.R;\nimport com.ittianyu.pocenter.common.base.BaseApplication;\nimport com.ittianyu.pocenter.databinding.ActTypeBinding;\nimport com.ittianyu.pocenter.features.MainActivity;\nimport com.orhanobut.logger.Logger;\nimport com.umeng.analytics.MobclickAgent;\nimport com.zhy.view.flowlayout.FlowLayout;\nimport com.zhy.view.flowlayout.TagAdapter;\n\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\npublic class TypeActivity extends MvpActivity<TypeContract.View, TypeContract.Presenter>\n        implements TypeContract.View {\n    private ActTypeBinding bind;\n    private MyTagAdapter adapter;\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n//        setContentView(R.layout.act_type);\n        bind = DataBindingUtil.setContentView(this, R.layout.act_type);\n\n        initView();\n        presenter.loadData();\n        initEvent();\n    }\n\n    @NonNull\n    @Override\n    public TypeContract.Presenter createPresenter() {\n        return new TypePresenter();\n    }\n\n    private void initView() {\n        // init action bar\n        setSupportActionBar(bind.tb);\n    }\n\n    private void initEvent() {\n        bind.btnOk.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                Set<Integer> list = bind.tfl.getSelectedList();\n                Logger.d(list);\n                if (list.isEmpty()) {\n                    Toast.makeText(TypeActivity.this, R.string.toast_select_one_or_more_type, Toast.LENGTH_SHORT).show();\n                    return;\n                }\n                // save selected types\n                BaseApplication.getRepertories().setTypes(list);\n\n                // start activity\n                if (presenter.isFirstSetting())\n                    startActivity(new Intent(TypeActivity.this, MainActivity.class));\n                finish();\n            }\n        });\n    }\n\n    @Override\n    public void setData(List<String> data, int[] types) {\n        adapter = new MyTagAdapter(data);\n        bind.tfl.setAdapter(adapter);\n        // set selected list\n        if (null != types)\n            adapter.setSelectedList(types);\n    }\n\n    /**\n     * create menu\n     * @param menu\n     * @return\n     */\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        getMenuInflater().inflate(R.menu.menu_type, menu);\n        return super.onCreateOptionsMenu(menu);\n    }\n\n    @Override\n    public boolean onOptionsItemSelected(MenuItem item) {\n        switch (item.getItemId()) {\n            case R.id.i_select_all:\n                selectAll();\n                break;\n            case R.id.i_cancel_all:\n                cancelAll();\n                break;\n        }\n\n        return super.onOptionsItemSelected(item);\n    }\n\n    /**\n     * cancel all selected item\n     */\n    private void cancelAll() {\n        adapter.setSelectedList(new HashSet<Integer>(0));\n    }\n\n    /**\n     * select all item\n     */\n    private void selectAll() {\n        int count = adapter.getCount();\n        int[] list = new int[count];\n        for (int i = 0; i < count; i++) {\n            list[i] = i;\n        }\n        adapter.setSelectedList(list);\n    }\n\n    private static class MyTagAdapter extends TagAdapter<String> {\n\n        public MyTagAdapter(List<String> data) {\n            super(data);\n        }\n\n        @Override\n        public View getView(FlowLayout parent, int position, String s) {\n            TextView tv = (TextView) LayoutInflater.from(parent.getContext()).inflate(R.layout.view_type, parent, false);\n            tv.setText(s);\n            return tv;\n        }\n    }\n\n    // 友盟统计\n    public void onResume() {\n        super.onResume();\n        MobclickAgent.onResume(this);\n    }\n    public void onPause() {\n        super.onPause();\n        MobclickAgent.onPause(this);\n    }\n    // 友盟统计 结束\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/type/TypeContract.java",
    "content": "package com.ittianyu.pocenter.features.type;\n\nimport com.hannesdorfmann.mosby.mvp.MvpPresenter;\nimport com.hannesdorfmann.mosby.mvp.MvpView;\n\nimport java.util.List;\n\n/**\n * Created by yu on 2017/1/17.\n */\n\npublic interface TypeContract {\n    interface View extends MvpView {\n        void setData(List<String> data, int[] types);\n    }\n\n    interface Presenter extends MvpPresenter<View> {\n        void loadData();\n        boolean isFirstSetting();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/type/TypePresenter.java",
    "content": "package com.ittianyu.pocenter.features.type;\n\nimport com.hannesdorfmann.mosby.mvp.MvpNullObjectBasePresenter;\nimport com.ittianyu.pocenter.common.api.Repertories;\nimport com.ittianyu.pocenter.common.base.BaseApplication;\n\nimport java.util.List;\n\n/**\n * Created by yu on 2017/1/17.\n */\n\npublic class TypePresenter extends MvpNullObjectBasePresenter<TypeContract.View> implements TypeContract.Presenter {\n    private int[] types;\n\n    @Override\n    public void loadData() {\n        // load all types\n        Repertories repertories = BaseApplication.getRepertories();\n        List<String> allTypes = repertories.getAllTypes();\n        // load selected types\n        types = repertories.getTypes();\n        // set data\n        getView().setData(allTypes, types);\n    }\n\n    @Override\n    public boolean isFirstSetting() {\n        return null == types;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/version/CheckVersionService.java",
    "content": "package com.ittianyu.pocenter.features.version;\n\nimport android.content.Intent;\nimport android.os.IBinder;\nimport android.widget.Toast;\n\nimport com.allenliu.versionchecklib.AVersionService;\nimport com.google.gson.Gson;\nimport com.ittianyu.pocenter.BuildConfig;\nimport com.ittianyu.pocenter.R;\nimport com.ittianyu.pocenter.common.utils.UnsafeOkHttpUtils;\nimport com.zhy.http.okhttp.OkHttpUtils;\n\npublic class CheckVersionService extends AVersionService {\n    public static final String SHOW_LAST = \"showLast\";\n\n    private boolean showLast = false;\n\n    public CheckVersionService() {\n        OkHttpUtils.initClient(UnsafeOkHttpUtils.getClient());\n    }\n\n    @Override\n    public int onStartCommand(Intent intent, int flags, int startId) {\n        showLast = intent.getBooleanExtra(SHOW_LAST, showLast);\n        return super.onStartCommand(intent, flags, startId);\n    }\n\n    @Override\n    public IBinder onBind(Intent intent) {\n        throw new UnsupportedOperationException(\"Not yet implemented\");\n    }\n\n    @Override\n    public void onResponses(AVersionService service, String response) {\n        Gson gson = new Gson();\n        VersionBean versionBean = gson.fromJson(response, VersionBean.class);\n        if (versionBean.versionCode > BuildConfig.VERSION_CODE) {\n            //传入下载地址，以及版本更新消息\n            service.showVersionDialog(versionBean.apkUrl, versionBean.changeLog);\n        } else {\n            if (showLast)\n                Toast.makeText(service.getApplicationContext(), R.string.tips_already_last_version, Toast.LENGTH_SHORT).show();\n            //由于是回调方法，当不进行版本升级时，需要手动关闭service。需要进行版本升级时，由库管理生命周期\n            stopSelf();\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/version/VersionBean.java",
    "content": "package com.ittianyu.pocenter.features.version;\n\n/**\n * Created by yu on 2017/1/19.\n */\n\npublic class VersionBean {\n    /*\n  \"versionCode\": 2,\n  \"versionName\": \"1.1\",\n  \"apkUrl\": \"http://oh0vbg8a6.bkt.clouddn.com/app-debug.apk\",\n  \"updateTitle\": \"更新提示\",\n  \"changeLog\":\"1.修复xxx Bug;2.更新了某某UI界面.\"\n     */\n    public int versionCode;\n    public String versionName;\n    public String apkUrl;\n    public String updateTitle;\n    public String changeLog;\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/version/VersionUtils.java",
    "content": "package com.ittianyu.pocenter.features.version;\n\nimport android.content.Context;\nimport android.content.Intent;\n\nimport com.allenliu.versionchecklib.VersionParams;\nimport com.ittianyu.pocenter.common.api.Repertories;\n\n/**\n * Created by yu on 2017/1/19.\n */\npublic class VersionUtils {\n    /**\n     * check version\n     * @param context\n     */\n    public static void check(Context context) {\n        check(context, false);\n    }\n\n    /**\n     * check version\n     * @param context\n     * @param showLast it will show a tip tell user the version is last if true.\n     */\n    public static void check(Context context, boolean showLast) {\n        VersionParams versionField = new VersionParams()\n                //是否强制升级,默认false\n                .setIsForceUpdate(false)\n                //当版本接口请求失败时，service会根据设定的间隔时间继续请求版本接口，\n                // 直到手动关闭service或者接口请求成功，不填默认10s\n//                .setPauseRequestTime(requestTime)\n                //接口地址，必填\n                .setRequestUrl(Repertories.URL_BASE + \"version.json\")\n                //自定service包名,必须填写用于开启service\n                .setVersionServiceName(CheckVersionService.class.getName());\n        Intent intent = new Intent(context, CheckVersionService.class);\n        intent.putExtra(\"versionField\", versionField);\n        intent.putExtra(CheckVersionService.SHOW_LAST, showLast);\n        context.startService(intent);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/com/ittianyu/pocenter/features/wxapi/WXEntryActivity.java",
    "content": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK   （如果发布新版本的话，我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题，也可以通过微信与我们取得联系，我们将会在24小时内给予回复）\n *\n * Copyright (c) 2013年 mob.com. All rights reserved.\n */\n\npackage com.ittianyu.pocenter.features.wxapi;\n\nimport android.content.Intent;\nimport android.widget.Toast;\nimport cn.sharesdk.wechat.utils.WXAppExtendObject;\nimport cn.sharesdk.wechat.utils.WXMediaMessage;\nimport cn.sharesdk.wechat.utils.WechatHandlerActivity;\n\n/** 微信客户端回调activity示例 */\npublic class WXEntryActivity extends WechatHandlerActivity {\n\n\t/**\n\t * 处理微信发出的向第三方应用请求app message\n\t * <p>\n\t * 在微信客户端中的聊天页面有“添加工具”，可以将本应用的图标添加到其中\n\t * 此后点击图标，下面的代码会被执行。Demo仅仅只是打开自己而已，但你可\n\t * 做点其他的事情，包括根本不打开任何页面\n\t */\n\tpublic void onGetMessageFromWXReq(WXMediaMessage msg) {\n\t\tif (msg != null) {\n\t\t\tIntent iLaunchMyself = getPackageManager().getLaunchIntentForPackage(getPackageName());\n\t\t\tstartActivity(iLaunchMyself);\n\t\t}\n\t}\n\n\t/**\n\t * 处理微信向第三方应用发起的消息\n\t * <p>\n\t * 此处用来接收从微信发送过来的消息，比方说本demo在wechatpage里面分享\n\t * 应用时可以不分享应用文件，而分享一段应用的自定义信息。接受方的微信\n\t * 客户端会通过这个方法，将这个信息发送回接收方手机上的本demo中，当作\n\t * 回调。\n\t * <p>\n\t * 本Demo只是将信息展示出来，但你可做点其他的事情，而不仅仅只是Toast\n\t */\n\tpublic void onShowMessageFromWXReq(WXMediaMessage msg) {\n\t\tif (msg != null && msg.mediaObject != null\n\t\t\t\t&& (msg.mediaObject instanceof WXAppExtendObject)) {\n\t\t\tWXAppExtendObject obj = (WXAppExtendObject) msg.mediaObject;\n\t\t\tToast.makeText(this, obj.extInfo, Toast.LENGTH_SHORT).show();\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "app/src/main/res/color/selector_item_color.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:color=\"@color/colorPrimary\" android:state_checked=\"true\"/>\n    <item android:color=\"@color/colorPrimary\" android:state_pressed=\"true\"/>\n    <item android:color=\"@color/colorGray\"/>\n</selector>"
  },
  {
    "path": "app/src/main/res/drawable/ic_about.xml",
    "content": "<vector android:height=\"24dp\" android:viewportHeight=\"1024.0\"\n    android:viewportWidth=\"1024.0\" android:width=\"24dp\" xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#8a8a8a\" android:pathData=\"M512,65.3C265.3,65.3 65.3,265.3 65.3,512c0,246.7 200,446.7 446.7,446.7 246.7,0 446.7,-199.9 446.7,-446.7C958.7,265.3 758.7,65.3 512,65.3zM487.8,785.9c-66.4,-4.9 -98.8,-52 -93.3,-109.3 5.6,-58.8 84.8,-138 70.5,-188 -7,-24.7 -112.2,-6.3 -117.6,-23.6C340.9,443.6 419.5,380.2 512,394.5 530.9,397.4 576.6,440.9 582.6,465c13.4,54.9 -17.5,121.6 -47,164.6C514.9,662.7 505.9,663.8 512,700c19.1,18.2 30.8,26.5 94,23.5C582.6,777.2 508,787.6 487.8,785.9zM535.6,370.9c-39,0 -70.6,-31.6 -70.6,-70.5s31.6,-70.5 70.6,-70.5 70.5,31.6 70.5,70.5S574.5,370.9 535.6,370.9z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_cycle.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"20dp\"\n    android:height=\"20dp\"\n    android:viewportHeight=\"1024.0\"\n    android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#a9a9a9\"\n        android:pathData=\"M912.7,342.7c-21.9,-51.8 -53.3,-98.3 -93.2,-138.2 -39.9,-39.9 -86.4,-71.3 -138.2,-93.2 -53.6,-22.7 -110.6,-34.2 -169.3,-34.2 -58.7,0 -115.7,11.5 -169.3,34.2 -51.8,21.9 -98.3,53.3 -138.2,93.2 -39.9,39.9 -71.3,86.4 -93.2,138.2 -22.7,53.6 -34.2,110.6 -34.2,169.3 0,58.7 11.5,115.7 34.2,169.3 21.9,51.8 53.3,98.3 93.2,138.2s86.4,71.3 138.2,93.2c53.6,22.7 110.6,34.2 169.3,34.2 58.7,0 115.7,-11.5 169.3,-34.2 51.8,-21.9 98.3,-53.3 138.2,-93.2s71.3,-86.4 93.2,-138.2c22.7,-53.6 34.2,-110.6 34.2,-169.3C946.9,453.3 935.4,396.3 912.7,342.7zM783.3,783.3c-72.5,72.5 -168.8,112.4 -271.3,112.4S313.1,855.8 240.7,783.3 128.3,614.5 128.3,512c0,-102.5 39.9,-198.9 112.4,-271.3s168.8,-112.4 271.3,-112.4 198.9,39.9 271.3,112.4S895.7,409.5 895.7,512C895.7,614.5 855.8,710.9 783.3,783.3z\" />\n    <path\n        android:fillColor=\"#a9a9a9\"\n        android:pathData=\"M537.6,225.5c0,-14.1 -11.5,-25.6 -25.6,-25.6s-25.6,11.5 -25.6,25.6l0,274.2c0,2.1 0.3,4.2 0.7,6.1 -0.5,2 -0.7,4 -0.7,6.1 0,14.1 11.5,25.6 25.6,25.6l286.5,0c14.1,0 25.6,-11.5 25.6,-25.6s-11.5,-25.6 -25.6,-25.6l-260.9,0L537.6,225.5z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_date.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"20dp\"\n    android:height=\"20dp\"\n    android:viewportHeight=\"1024.0\"\n    android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#a9a9a9\"\n        android:pathData=\"M537.3,461.5c-44.1,0 -27.6,55.1 -82.7,66.1l-16.5,5.5c-27.6,5.5 -33.1,5.5 -33.1,27.6 0,22 11,27.6 22.1,27.6l66.2,0 0,181.9c0,27.6 5.5,44.1 33.1,44.1 27.6,0 33.1,-22.1 33.1,-44.1l0,-275.6C559.3,467 548.3,461.5 537.3,461.5L537.3,461.5zM537.3,461.5\" />\n    <path\n        android:fillColor=\"#a9a9a9\"\n        android:pathData=\"M322.2,279.6l11,0c16.5,0 27.6,-11 27.6,-27.6L360.8,119.8c0,-16.5 -11,-27.6 -27.6,-27.6l-11,0c-16.5,0 -27.6,11 -27.6,27.6l0,137.8C294.7,268.6 305.7,279.6 322.2,279.6L322.2,279.6zM322.2,279.6\" />\n    <path\n        android:fillColor=\"#a9a9a9\"\n        android:pathData=\"M680.6,279.6l11,0c16.5,0 27.6,-11 27.6,-27.6L719.2,119.8c0,-16.5 -11,-27.6 -27.6,-27.6l-11,0c-16.5,0 -27.6,11 -27.6,27.6l0,137.8C653.1,268.6 669.6,279.6 680.6,279.6L680.6,279.6zM680.6,279.6\" />\n    <path\n        android:fillColor=\"#a9a9a9\"\n        android:pathData=\"M835,158.4l-71.7,0 0,49.6 71.7,0c33.1,0 60.6,27.6 60.6,60.6l0,55.1L118.2,323.7l0,-55.1c0,-33.1 27.6,-60.6 60.6,-60.6l71.7,0 0,-49.6 -66.2,0c-66.2,0 -115.8,55.1 -115.8,115.7l0,534.6c0,60.6 49.6,115.7 115.8,115.7l656.1,0c60.6,0 115.8,-49.6 115.8,-115.7L956.3,274.1C950.8,213.5 901.2,158.4 835,158.4L835,158.4zM835,869.4 L184.4,869.4c-33.1,0 -60.6,-27.6 -60.6,-60.6L123.7,378.8 901.2,378.8l0,424.4C901.2,841.8 873.6,869.4 835,869.4L835,869.4zM835,869.4\" />\n    <path\n        android:fillColor=\"#a9a9a9\"\n        android:pathData=\"M399.4,158.4l220.6,0 0,49.6L399.4,208 399.4,158.4 399.4,158.4zM399.4,158.4\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_empty.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"128dp\"\n    android:height=\"128dp\"\n    android:viewportHeight=\"1024.0\"\n    android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#03A9F4\"\n        android:pathData=\"M456.7,745.3v-1.4,1.4zM513,688.4c-30.9,0 -56.2,24.6 -56.2,55.5v0.7c0,6.3 4.9,11.2 11.2,11.2s11.2,-4.9 11.2,-11.2v-0.7c0,-18.3 14.8,-33.7 33.7,-33.7s33.7,15.5 33.7,33.7v0.7c0,6.3 4.9,11.2 11.2,11.2s11.2,-4.9 11.2,-11.2v-0.7c-0,-30.2 -25.3,-55.5 -56.2,-55.5zM382.3,569.3c-15.5,-3.5 -38.6,-2.8 -43.6,13.4 -2.8,9.8 13.4,11.2 28.1,14.8 11.9,2.8 18.3,9.1 16.9,11.2 -2.8,3.5 -20.4,-3.5 -36.5,2.1 -15.5,5.6 -12.6,19.7 -3.5,23.2 9.1,3.5 23.9,-0.7 58.3,4.9 17.6,2.8 28.1,-2.8 30.2,-13.4 4.2,-23.9 -28.1,-51.3 -49.9,-56.2zM591.7,626.2c2.1,10.5 11.9,16.2 30.2,13.4 34.4,-5.6 49.2,-1.4 58.3,-4.9 9.1,-3.5 11.9,-18.3 -3.5,-23.2 -15.5,-5.6 -33,1.4 -36.5,-2.1 -2.1,-2.8 4.9,-9.1 16.9,-11.9 14.8,-3.5 30.9,-4.9 28.1,-14.8 -4.9,-16.2 -27.4,-16.9 -43.6,-13.4 -21.8,4.9 -54.1,32.3 -49.9,56.9zM1012.6,332.5L817.2,152.6c-6.3,-6.3 -15.5,-9.1 -24.6,-9.1L232.6,143.4c-9.1,0 -17.6,3.5 -23.9,9.1L11.9,332.5C4.2,339.5 0,348.6 0,359.2L0,799.8c0,44.3 35.8,80.8 80.8,80.8h862.9c44.3,0 80.8,-36.5 80.8,-80.8L1024.5,359.2c0,-9.8 -4.9,-19.7 -11.9,-26.7zM659.8,329.7c-12.6,0 -23.2,10.5 -23.2,23.9 0,66.1 -56.2,121.6 -123,121.6s-123,-55.5 -123,-121.6c0,-12.6 -10.5,-23.9 -23.2,-23.9L93.5,329.7l146.2,-133.5h546.7l144.8,133.5L659.8,329.7zM970.4,377.4L970.4,799.8c0,15.5 -11.9,26.7 -26.7,26.7L80.8,826.5c-15.5,0 -28.1,-11.9 -28.1,-26.7L52.7,377.4h292.3c5.6,36.5 23.2,71 51.3,97 32.3,30.9 73.8,47.1 117.3,47.1s85,-16.9 117.3,-47.1c27.4,-26.7 45.7,-60.4 51.3,-97h288.1z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_error.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"128dp\"\n    android:height=\"128dp\"\n    android:viewportHeight=\"1024.0\"\n    android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#03A9F4\"\n        android:pathData=\"M851.9,164.1 L162.3,164.1c-27.5,0 -49.9,22.4 -49.9,49.9l0,474.5c0,27.5 22.4,49.9 49.9,49.9l37.5,0c2.3,7 6.4,13.9 12.7,20.4 1.5,1.6 3.5,2.7 5.6,3.3 62.5,16.2 78.1,36.3 81.7,46.9 4.1,11.7 -2.7,21.1 -3.1,21.7 -4,5.2 -3.1,12.6 2,16.7 5.2,4.1 12.7,3.3 16.8,-1.9 5.7,-7.2 13.5,-24.4 7.1,-43.8 -8.9,-26.5 -40.9,-47.3 -95,-61.8 -4.5,-5.4 -5.9,-9.8 -5.9,-13.3l0,-0.1c0,-4.8 3,-9.6 8.5,-13.8 0.2,-0.1 0.4,-0.2 0.5,-0.4 1.6,-1.1 3.3,-2.2 5.2,-3.3 0.5,-0.3 0.9,-0.5 1.4,-0.7 2.3,-1.1 4.9,-2 7.5,-3 4.2,-1 11.7,-2.3 23.6,-2.3 20.9,0 45.4,4.1 72.6,12.1 4.5,2 9.1,4 13.7,6.5 1.4,0.7 2.8,1.5 4.2,2.3 5.8,3.2 11.5,6.8 17.3,10.8 0.5,0.4 1,0.6 1.5,1 91.5,64.2 81.3,96.6 81.3,96.6 -3.1,5.8 -0.9,13.1 5,16.2 1.8,0.9 3.7,1.4 5.6,1.4 4.3,0 8.4,-2.3 10.6,-6.4 3.8,-7.1 16.3,-42.9 -59.6,-105.2l211.7,0c-75.9,62.3 -63.4,98.1 -59.7,105.2 2.2,4.1 6.5,6.6 11,6.6 1.8,0 3.6,-0.4 5.4,-1.3 5.8,-3.1 8.2,-10 5.1,-15.8 -0.1,-0.3 -10.9,-32.7 81.1,-97.3 6.4,-4.5 12.8,-8.4 19.1,-11.9 1.1,-0.6 2.3,-1.3 3.5,-1.9 4.8,-2.5 9.5,-4.7 14.2,-6.7 27.1,-8 51.5,-12.1 72.4,-12.1 12,0 19.4,1.4 23.6,2.3 2.6,0.9 5.3,1.8 7.6,3 0.5,0.2 0.9,0.4 1.3,0.6 2,1.1 3.9,2.2 5.5,3.5l0.2,0.1c5.5,4.2 8.5,9 8.5,13.8 0,0.1 0,0.1 0,0.2 -0,3.5 -1.5,7.9 -5.9,13.2 -54.2,14.5 -86.2,35.4 -95,61.8 -6.5,19.3 1.4,36.6 7.1,43.8 4.1,5.2 11.6,6.1 16.8,1.9 5.2,-4.1 6.1,-11.6 1.9,-16.8 -0.1,-0.1 -7.1,-9.5 -3.1,-21.3 3.5,-10.6 18.9,-30.9 81.8,-47.2 2.2,-0.6 4.1,-1.7 5.6,-3.3 6.3,-6.5 10.5,-13.5 12.7,-20.6 27,-0.6 48.8,-22.7 48.8,-49.8L901.8,214C901.8,186.5 879.4,164.1 851.9,164.1zM343.3,620.8c14.8,38.1 5.7,59.8 -0.5,69 0,-0 -0,-0 -0,-0 -1.1,-0.4 -2.1,-0.8 -3.2,-1.2 -14.3,-5.4 -28.1,-8.8 -41.1,-10.6 -1.1,-0.1 -2.2,-0.3 -3.4,-0.5 -6.1,-0.7 -12.1,-1.1 -17.8,-1.1 -1.3,0 -2.5,0.1 -3.8,0.1 -4.8,0.1 -9.4,0.5 -13.8,1 -1.2,0.1 -2.4,0.2 -3.5,0.4 -0.9,0.1 -1.8,0.4 -2.7,0.5 4.2,-19.8 7,-49.1 -6.1,-68.7 -14,-21.1 -17.2,-86.1 -0.2,-135.1 7.3,-21.1 -1.5,-59.3 -7.7,-81.1l106.5,0c4.5,15.8 12.2,56 -5.8,106.7l-1.3,3.5C330,528.2 319.1,558.4 343.3,620.8zM805.5,609.9c-13.1,19.6 -10.2,48.9 -6.1,68.7 -0.9,-0.2 -1.8,-0.4 -2.7,-0.5 -0.8,-0.1 -1.6,-0.2 -2.4,-0.3 -5,-0.7 -10.2,-1 -15.6,-1.1 -0.7,-0 -1.4,-0.1 -2.1,-0.1 -20,-0.1 -42.6,3.9 -66.5,13.3 -6.2,-9.2 -15.3,-30.9 -0.6,-69 24.2,-62.5 13.3,-92.7 4.5,-117l-1.2,-3.5c-18,-50.8 -10.3,-90.9 -5.8,-106.7l106.5,0c-6.2,21.8 -15,60 -7.7,81.1C822.7,523.9 819.5,588.9 805.5,609.9zM853,714.5c-1.6,-4.6 -4.1,-9 -7.7,-13.2 -0.5,-0.6 -1.1,-1.1 -1.6,-1.6 -0.2,-0.2 -0.4,-0.4 -0.6,-0.6 -1.8,-1.8 -3.8,-3.5 -5.9,-5.2 -0.7,-0.5 -1.4,-1.1 -2.1,-1.6 -1.7,-1.2 -3.5,-2.3 -5.5,-3.4 -0.8,-0.5 -1.5,-1 -2.4,-1.5 -0.3,-0.1 -0.6,-0.2 -0.9,-0.4 -0,-0 -0,-0 -0.1,-0 -4.5,-15.3 -11.3,-48.3 -0.8,-64 19.9,-30 21.3,-103 2.9,-156.2 -4.9,-14.3 2.8,-49.6 10.1,-73.3l4.7,0c6.6,0 12,-5.4 12,-12 0,-6.6 -5.4,-12 -12,-12l-13.4,0L698.4,369.7l-10.3,0c-6.6,0 -12,5.4 -12,12 0,4.6 2.7,8.5 6.6,10.5 -5.4,21.3 -11.1,63.4 7.6,116.2l1.3,3.6c7.8,21.6 16.6,46.1 -4.3,100.2 -17,43.9 -8.1,72.4 1,87.7 -8,4.2 -16,9 -24.1,14.5l-0,0L388.9,714.5c-0.8,-0.5 -1.5,-0.9 -2.3,-1.4 -6.6,-4.4 -13.1,-8.4 -19.6,-11.9 -0.8,-0.4 -1.6,-1 -2.4,-1.4 9,-15.3 17.9,-43.9 1,-87.7 -20.9,-54 -12.1,-78.5 -4.4,-100.1l1.3,-3.7c18.7,-52.8 13,-94.8 7.6,-116.1 3.9,-2 6.6,-5.9 6.6,-10.5 0,-6.6 -5.4,-12 -12,-12l-10.3,0L223.2,369.7l-13.4,0c-6.6,0 -12,5.4 -12,12 0,6.6 5.4,12 12,12l4.7,0c7.3,23.8 15,59 10.1,73.3 -18.1,52.2 -16.7,126.6 2.9,156.2 10.4,15.6 3.7,48.7 -0.9,64 -0.3,0.2 -0.7,0.3 -1,0.4 -1,0.5 -1.7,1.1 -2.6,1.6 -1.8,1 -3.5,2.1 -5.1,3.2 -0.8,0.5 -1.6,1.1 -2.3,1.7 -2.1,1.6 -4,3.3 -5.7,5 -0.2,0.2 -0.5,0.5 -0.7,0.7 -0.5,0.5 -1.1,1 -1.6,1.5 -1.5,1.7 -2.6,3.5 -3.8,5.3 -0,0.1 -0.1,0.1 -0.1,0.2 -1.6,2.5 -2.9,5.1 -3.9,7.8l-37.5,0c-14.4,0 -26,-11.7 -26,-26L136.3,214c0,-14.3 11.7,-26 26,-26l689.6,0c14.3,0 26,11.7 26,26l0,474.5 0,0C877.9,702.5 866.8,713.9 853,714.5z\" />\n    <path\n        android:fillColor=\"#03A9F4\"\n        android:pathData=\"M481.8,337.9c0,-6.6 -5.4,-12 -12,-12 -40.5,0 -74.9,-25.1 -91.5,-37.1 -3.8,-2.8 -6.8,-4.9 -8.9,-6.1 -5.7,-3.4 -13,-1.5 -16.4,4.2 -3.4,5.7 -1.5,13 4.2,16.4 1.6,1 4,2.7 7,4.9 18.6,13.5 57.2,41.7 105.5,41.7C476.5,349.9 481.8,344.5 481.8,337.9z\" />\n    <path\n        android:fillColor=\"#03A9F4\"\n        android:pathData=\"M653.2,282.7c-2,1.2 -5,3.4 -8.9,6.1 -16.5,12 -50.9,37.1 -91.4,37.1 -6.6,0 -12,5.4 -12,12 0,6.6 5.4,12 12,12 48.3,0 87,-28.2 105.5,-41.7 3,-2.2 5.4,-4 7,-4.9 5.7,-3.4 7.5,-10.7 4.2,-16.4C666.2,281.1 658.9,279.3 653.2,282.7z\" />\n    <path\n        android:fillColor=\"#03A9F4\"\n        android:pathData=\"M592.5,607.7l-80.5,-36.1c-3.3,-1.5 -7.1,-1.4 -10.3,0.2l-71.2,36.1c-5.9,3 -8.3,10.2 -5.3,16.1 3,5.9 10.2,8.2 16.1,5.3l66.1,-33.5 75.3,33.8c1.6,0.7 3.3,1 4.9,1 4.5,0 8.9,-2.6 10.9,-7.1C601.3,617.5 598.6,610.4 592.5,607.7z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_find.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportHeight=\"1024.0\"\n    android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M512,0C229.2,0 0,229.2 0,512c0,282.8 229.2,512 512,512s512,-229.2 512,-512C1024,229.2 794.8,0 512,0zM657.3,512c0,77.2 -60.4,139.7 -136.4,144.4l-175.7,151.7 -22.9,-13.2 58.2,-222c-8.6,-18.5 -13.8,-39.1 -13.8,-60.9 0,-77.2 60.4,-139.7 136.4,-144.4l175.8,-151.7 22.9,13.2 -58.3,222.1C652.1,469.7 657.3,490.2 657.3,512z\" />\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M512,512m-66,0a2.8,2.8 0,1 0,132.1 0,2.8 2.8,0 1,0 -132.1,0Z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_github.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"64dp\"\n    android:height=\"64dp\"\n    android:viewportHeight=\"1024.0\"\n    android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#1296db\"\n        android:pathData=\"M941.7,512q0,143.4 -83.7,258t-216.3,158.6q-15.4,2.9 -22.6,-4t-7.1,-17.2v-120.6q0,-55.4 -29.7,-81.2 32.6,-3.4 58.6,-10.3t53.7,-22.3 46.3,-38 30.3,-60 11.7,-86q0,-69.2 -45.1,-117.7 21.1,-52 -4.6,-116.6 -16,-5.2 -46.3,6.3t-52.6,25.2l-21.7,13.7q-53.1,-14.8 -109.7,-14.8t-109.7,14.8q-9.1,-6.3 -24.3,-15.4t-47.7,-22 -49.2,-7.7q-25.2,64.6 -4,116.6 -45.1,48.6 -45.1,117.7 0,48.6 11.7,85.7t30,60 46,38.3 53.7,22.3 58.6,10.3q-22.9,20.6 -28,58.8 -12,5.7 -25.7,8.6t-32.6,2.9 -37.4,-12.3 -31.7,-35.7q-10.9,-18.3 -27.7,-29.7t-28.3,-13.7l-11.4,-1.7q-12,0 -16.6,2.6t-2.9,6.6 5.2,8 7.4,6.8l4,2.9q12.6,5.7 24.9,21.7t18,29.1l5.7,13.1q7.4,21.7 25.2,35.1t38.3,17.2 39.7,4 31.7,-2l13.1,-2.3q0,21.7 0.3,50.9t0.3,30.9q0,10.3 -7.4,17.2t-22.9,4q-132.6,-44 -216.3,-158.6t-83.7,-258q0,-119.4 58.8,-220.3t159.7,-159.7 220.3,-58.8 220.3,58.8 159.7,159.7 58.8,220.3z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_home.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportHeight=\"1024.0\"\n    android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#bfbfbf\"\n        android:pathData=\"M995.3,478.3c-0.5,-16.7 -3.8,-28.9 -15.6,-45.8 -2.2,-3.4 -363,-388.9 -363,-388.9 -25.1,-26.7 -58.1,-39.5 -91.3,-39.5v-0.3c-0.5,-0 -1.1,0.1 -1.7,0.1s-1.2,-0.2 -1.8,-0.1v0.3c-33.1,0 -66.2,12.8 -91.3,39.5 0,0 -360.6,385.5 -362.9,388.9 -11.8,16.9 -15.1,29.2 -15.6,45.8 0,0 0,5.8 0,6.3 0,52.6 42.7,95.3 95.2,95.3h22.8v341.8c0,55.7 50,100.7 111.5,100.7 61.6,0 111.4,-45.1 111.4,-100.7v-341.8h261v341.8c0,55.7 50,100.7 111.5,100.7s111.4,-45.1 111.4,-100.7v-341.8h22.8c52.7,0 95.3,-42.7 95.3,-95.3 0,-0.5 -0.1,-0.9 -0.1,-1.4l0.1,-4.8z\" />\n    <path\n        android:fillColor=\"#bfbfbf\"\n        android:pathData=\"M853.2,133.8l0.6,0.7 71.7,75.8c10.2,10.7 26.9,11.2 37.6,1.1 0.1,-0.1 0.1,-0.2 0.4,-0.3l0.9,-0.9c3.2,-3.3 5.1,-6.3 6.3,-11.9 0.2,-1.1 0.4,-2.2 0.5,-3.4 0.2,-1.2 0.5,-2.4 0.6,-3.9l8.3,-140.7c0.6,-10.3 -3.2,-19.4 -9.5,-26.1v-0.1c-0.1,-0.1 -0.2,-0.2 -0.4,-0.3 -0.1,-0.1 -0.2,-0.2 -0.4,-0.4v0c-6.4,-6.7 -15.2,-10.9 -25.5,-10.9l-141,0.4c-1.5,0.1 -2.6,0.1 -3.9,0.3 -1.2,0.1 -2.3,0.1 -3.3,0.3 -5.8,0.9 -8.9,2.5 -12.4,5.6l-0.9,0.9c0,0.1 -0.2,0.1 -0.2,0.2 -10.6,10.1 -11.1,26.9 -1.1,37.6l71.7,75.8z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_logo.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"93dp\"\n        android:height=\"117dp\"\n        android:viewportWidth=\"195.86\"\n        android:viewportHeight=\"245.29\">\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M195.11,164.74c-3.9,-28.55 -17,-52.51 -36.14,-73.57C153.09,84.7 146.6,81.3 137.26,82c-12.75,1 -25.64,0.24 -38.46,0.24 -15.33,0 -30.65,0.06 -46,-0.05a9.75,9.75 0,0 0,-7.15 2.64,141.34 141.34,0 0,0 -42.25,67c-10.57,36.4 3.69,66.79 38.35,82.23a128.21,128.21 0,0 0,43.36 10.67c28.66,2.06 56.26,-1.57 80.94,-17.45C188.74,212.72 198.81,191.85 195.11,164.74Z\"/>\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M53.9,57.3c14.48,-0.18 29,-0.07 43.44,-0.07 14.81,0 29.63,-0.07 44.44,0.05 3.43,0 5.63,-1 6.93,-4.35 4.27,-10.92 7,-22.14 7,-33.93 0,-5.42 -1.33,-6.58 -6.92,-6.59 -9.15,0 -18.31,0.14 -27.46,-0.08 -4.21,-0.1 -6.36,1.36 -7.32,5.58 -1.64,7.22 -8.49,9.15 -14.05,4.21 -3.41,-3 -4.83,-7.12 -5.82,-11.35C91.8,1 82.2,-3.25 74,2.83a48,48 0,0 1,-28.78 9.53c-3.79,0.07 -5.18,1.86 -5.45,5.51 -0.92,12.26 1.69,23.74 6.78,34.82C48.09,56 50.18,57.35 53.9,57.3Z\"/>\n    <path\n        android:fillColor=\"#fff\"\n        android:pathData=\"M143.48,65.49q-44.68,0.15 -89.36,0c-3.47,0 -4.44,0.94 -4.53,4.43 -0.1,4 1.76,4.17 4.83,4.15 14.64,-0.11 29.29,0 43.93,0 15,0 30,-0.09 44.93,0.07 3.44,0 4.57,-0.94 4.57,-4.47S146.61,65.48 143.48,65.49Z\"/>\n    <path\n        android:fillColor=\"#03A9F4\"\n        android:pathData=\"M145.74,144.06c0,-1.72 -0.71,-2 -2.19,-2 -2.75,0.08 -5.51,-0.1 -8.25,0.06 -1.89,0.11 -2.41,-0.5 -2.38,-2.39 0.11,-7.33 0.06,-14.67 0,-22 0,-5.54 -2.48,-8 -8,-8.06 -8.76,0 -17.52,0 -26.28,0L73,109.67c-6.1,0 -8.51,2.4 -8.53,8.5 0,7.23 -0.06,14.46 0,21.69 0,1.71 -0.44,2.33 -2.2,2.25 -2.74,-0.13 -5.5,0 -8.25,-0.06 -1.59,0 -2.38,0.27 -2.37,2.15q0.11,19.25 0,38.5c0,1.83 0.7,2.24 2.33,2.18 2.64,-0.1 5.3,0.09 7.94,-0.06 2,-0.11 2.59,0.46 2.56,2.52 -0.13,7.84 -0.08,15.68 0,23.53 0,5.72 2.51,8.22 8.2,8.23q26.12,0 52.25,0c5.48,0 8,-2.57 8,-8.06 0,-7.94 0.07,-15.89 0,-23.83 0,-1.89 0.49,-2.49 2.38,-2.39 2.74,0.16 5.5,0 8.25,0.06 1.48,0 2.2,-0.29 2.19,-2Q145.65,163.46 145.74,144.06ZM71.26,139.38c0.14,-6.31 0.1,-12.63 0,-18.94 0,-1.73 0.5,-2.28 2.23,-2.27q25.21,0.08 50.42,0c1.72,0 2.27,0.52 2.25,2.26 -0.09,6.31 -0.12,12.63 0,18.94 0,2.12 -0.54,2.78 -2.7,2.75 -8.25,-0.12 -16.5,0 -24.75,0s-16.5,-0.07 -24.75,0C71.83,142.15 71.21,141.52 71.26,139.38ZM97.57,171c0.16,1.51 -0.14,3.07 0.07,4.57 0.33,2.39 -1.06,2.47 -2.71,2.25 -1.44,-0.19 -3.64,1 -3.48,-2.14 0.2,-4 0,-7.94 0,-11.9s0.08,-7.94 0,-11.91c0,-1.75 0.28,-2.63 2.3,-2.52 3.45,0.2 6.93,-0.08 10.36,0.29 4.78,0.52 7.24,3 7.74,7.2a9.15,9.15 0,0 1,-6 10.15,11.08 11.08,0 0,1 -5.36,0.91C97.89,167.59 97.34,168.73 97.57,171ZM66.47,176.27c-0.44,1.17 -0.92,1.65 -2.14,1.59 -1.52,-0.07 -3,0 -4.93,0L67.68,155c0.17,-0.48 0.35,-1 0.53,-1.43 1.59,-4.29 3.06,-5.07 7.65,-4.25 1,0.18 1.28,0.69 1.58,1.53 3.18,8.87 6.4,17.73 9.71,26.86 -0.88,0 -1.28,0.07 -1.69,0.07 -4.77,0.05 -4.83,0.07 -6.34,-4.49 -0.52,-1.58 -1.22,-2.46 -3,-2.15a12.76,12.76 0,0 1,-2.14 0C68.42,171.21 68.36,171.18 66.47,176.26ZM98.8,215.65a3.37,3.37 0,0 1,-0.08 -6.74c2.08,0.08 3.33,1.22 3.39,3.19A3.12,3.12 0,0 1,98.79 215.64ZM126.18,203.21c0,1.77 -0.56,2.21 -2.25,2.19 -8.44,-0.08 -16.89,0 -25.33,0 -8.14,0 -16.28,-0.07 -24.41,0 -2.15,0 -3,-0.32 -2.94,-2.77 0.22,-5.18 0.13,-10.37 0,-15.56 0,-1.75 0.54,-2.26 2.25,-2.25q25.18,0.07 50.35,0c1.64,0 2.34,0.38 2.3,2.2Q126,195.1 126.17,203.19ZM128.52,167.44a10.87,10.87 0,0 1,-3.9 0.46c-2.95,-0.44 -3.51,1 -3.18,3.43a21,21 0,0 1,0 2.74c0,3.81 -1.06,4.57 -4.82,3.81 -1.44,-0.29 -1.08,-1.24 -1.09,-2.06 0,-4.06 0,-8.13 0,-12.19s0,-8.13 0,-12.19c0,-1.33 0.23,-2.11 1.82,-2.06 3.45,0.12 6.92,-0.11 10.35,0.2 5.26,0.48 7.9,3.25 8.24,8.07A9.33,9.33 0,0 1,128.51 167.42Z\"/>\n    <path\n        android:fillColor=\"#03A9F4\"\n        android:pathData=\"M73.21,154.81l-3.79,11.81h7.47Z\"/>\n    <path\n        android:fillColor=\"#03A9F4\"\n        android:pathData=\"M122.6,154c-2.37,0.57 -0.75,2.51 -1.11,3.77a20.44,20.44 0,0 0,-0.07 3c-0.23,2 0.43,2.91 2.29,2.45a8.22,8.22 0,0 0,3.75 -0.72c2.43,-1.44 2.24,-3.72 1.68,-5.89C128.64,154.71 125.14,153.39 122.6,154Z\"/>\n    <path\n        android:fillColor=\"#03A9F4\"\n        android:pathData=\"M105.55,158.48c-0.07,-3.08 -2,-4.52 -5.94,-4.51s-1,3.13 -2.41,4.67c1.8,1.1 -1.84,4.53 2.4,4.61S105.62,161.75 105.55,158.48Z\"/>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_mine.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportHeight=\"1024.0\"\n    android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#FF000000\"\n        android:pathData=\"M512,621.1c125.8,0 241.9,-109.9 254.9,-270.6 13.6,-168.1 -98,-326.7 -254.9,-326.7 -156.8,0 -268.5,158.6 -254.9,326.7C270.2,511.3 386.2,621.1 512,621.1L512,621.1zM509.7,660.2C228.2,660.2 0.1,772.2 0.1,910.2c0,47.2 43.4,65.4 171.1,79.2 98.6,10.6 216.5,10.6 340.9,10.6 127.4,0 253.8,0 342.6,-10.6 125.8,-15 169.4,-32 169.4,-79.2C1023.9,772.2 791.3,660.2 509.7,660.2L509.7,660.2z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_people.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"20dp\"\n    android:height=\"20dp\"\n    android:viewportHeight=\"1024.0\"\n    android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#a9a9a9\"\n        android:pathData=\"M664.9,581.1c73,-51.6 120.7,-136.6 120.7,-232.8 0,-157.3 -127.5,-284.8 -284.8,-284.8 -157.3,0 -284.8,127.5 -284.8,284.8 0,99.5 51.1,187.1 128.4,238.1 -144.5,63 -246.4,205.5 -250.4,372.3l40.7,0c4.3,-161.9 110.8,-298.3 257.3,-347 33.5,13.9 70.2,21.5 108.7,21.5 41.8,0 81.5,-9 117.3,-25.2 152.6,45.2 264.7,184.6 269.1,350.7l40.7,0C923.7,787.1 816,641.2 664.9,581.1zM500.7,592.4c-134.8,0 -244.1,-109.3 -244.1,-244.1 0,-134.8 109.3,-244.1 244.1,-244.1 134.8,0 244.1,109.3 244.1,244.1C744.9,483.1 635.6,592.4 500.7,592.4z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_share.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportHeight=\"1024.0\"\n    android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#ffffff\"\n        android:pathData=\"M768,722.8C768,748.7 751.7,784 725.8,784l-468.6,0C231.3,784 208,748.7 208,722.8L208,441.6c0,-25.9 23.3,-41.6 49.2,-41.6l47.7,0 107.8,-144L116.6,256C90.7,256 64,275.1 64,301l0,562.4C64,889.2 90.7,912 116.6,912l749.8,0C892.3,912 912,889.2 912,863.4L912,522.3l-144,122.8L768,722.8z\" />\n    <path\n        android:fillColor=\"#ffffff\"\n        android:pathData=\"M375.2,636.7c0.7,4 1.9,7.8 2.7,11.7 41,-118.9 131.2,-207.4 242.9,-228C641.8,416.6 688,415.5 688,416.6L688,576l37.8,0 234.3,-243.7L725.8,112 688,112l0,135.6c0,0.2 -39.1,1.5 -56.5,4.7C459.1,284 341.9,456.1 375.2,636.7z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_type.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportHeight=\"1024.0\"\n    android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#8a8a8a\"\n        android:pathData=\"M952.3,510q48.1,55.3 1,107.5l-331.8,333.8q-21.5,17.4 -49.2,15.4t-43,-17.4q-123.9,-123.9 -221.2,-222.2l-81.9,-81.9q-39.9,-39.9 -71.2,-71.7t-51.2,-51.7 -21,-22q-3.1,-4.1 -10.8,-14.8t-7.7,-26.1l0,-20.5 0,-41q0,-23.6 0.5,-53.2t0.5,-60.4q1,-71.7 2,-159.7 1,0 1,-1 2,-13.3 4.6,-25.6t13.8,-23.6q10.2,-11.3 23.6,-15.4t24.6,-4.1l337.9,0q2,0 9.2,0.5t10.2,1.5q12.3,5.1 22.5,13.3zM220.2,274.4q27.6,0 47.1,-20t19.5,-47.6 -19.5,-47.1 -47.1,-19.5 -47.1,19.5 -19.5,47.1 19.5,47.6 47.1,20z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ic_version_check.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportHeight=\"1024.0\"\n    android:viewportWidth=\"1024.0\">\n    <path\n        android:fillColor=\"#8a8a8a\"\n        android:pathData=\"M511.7,0.1c-282.6,0 -511.7,229.1 -511.7,511.7s229.1,511.7 511.7,511.7 511.7,-229.1 511.7,-511.7S794.3,0.1 511.7,0.1zM257,437.2c-0.6,-1.7 -1.1,-3.5 -1.1,-5.4L255.9,271.9c0,-8.8 7.2,-16 16,-16 8.8,0 16,7.2 16,16l0,116.1c43.6,-78.7 127.5,-132.1 223.8,-132.1 130.4,0 237.9,97.7 253.6,223.8l-32.3,0c-15.6,-108.4 -108.6,-191.9 -221.3,-191.9 -89.3,0 -166.2,52.3 -202.1,127.9l122.2,0c8.8,0 16,7.2 16,16 0,8.8 -7.2,16 -16,16L297.2,447.8l-25.4,0 -7.5,0c0.2,-0.6 0.2,-1.3 0.4,-1.9 -2.1,-1.1 -3.8,-2.5 -5.2,-4.4 -0.7,-0.8 -1.2,-1.6 -1.7,-2.5C257.5,438.4 257.2,437.8 257,437.2zM767.5,751.6c0,8.8 -7.2,16 -16,16 -8.8,0 -16,-7.2 -16,-16L735.5,635.5c-43.6,78.7 -127.5,132.1 -223.8,132.1 -130.4,0 -237.9,-97.7 -253.6,-223.9l32.3,0c15.6,108.4 108.6,191.9 221.3,191.9 89.2,0 166.1,-52.4 202,-127.9L591.6,607.7c-8.8,0 -16,-7.2 -16,-16 0,-8.8 7.2,-16 16,-16L719.6,575.7l6.6,0 32.9,0c-0.2,0.6 -0.2,1.3 -0.4,1.9 2.1,1 3.8,2.5 5.2,4.4 0.7,0.8 1.2,1.6 1.7,2.5 0.3,0.6 0.6,1.2 0.8,1.8 0.6,1.7 1.1,3.5 1.1,5.4L767.5,751.6z\" />\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable/selector_button.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/shape_button_pressed\" android:state_pressed=\"true\" />\n    <item android:drawable=\"@drawable/shape_button_normal\" />\n</selector>"
  },
  {
    "path": "app/src/main/res/drawable/selector_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@color/colorGray\" android:state_pressed=\"true\" />\n    <item android:drawable=\"@android:color/white\" />\n</selector>"
  },
  {
    "path": "app/src/main/res/drawable/selector_type.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:drawable=\"@drawable/shape_type_checked\" android:state_checked=\"true\"></item>\n    <item android:drawable=\"@drawable/shape_type_normal\"></item>\n</selector>"
  },
  {
    "path": "app/src/main/res/drawable/shape_button_normal.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"@color/colorPrimary\" />\n    <corners android:radius=\"8dp\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/shape_button_pressed.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"@color/colorPrimaryDark\" />\n    <corners android:radius=\"8dp\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/shape_drive_line.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"@color/colorDriverGray\" />\n    <size android:height=\"1px\" />\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/shape_type_checked.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"@color/colorAccent\" />\n    <corners android:radius=\"30dp\" />\n    <stroke android:color=\"@color/colorDarkGray\"  android:width=\"1dp\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/shape_type_normal.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <solid android:color=\"@color/colorPrimary\" />\n    <corners android:radius=\"30dp\" />\n</shape>\n"
  },
  {
    "path": "app/src/main/res/drawable/ssdk_oks_classic_platform_cell_back.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\t<item android:state_pressed=\"true\" android:drawable=\"@drawable/ssdk_oks_classic_platfrom_cell_back_sel\"/>\n\t<item android:drawable=\"@drawable/ssdk_oks_classic_platfrom_cell_back_nor\"/>    \n</selector>\n"
  },
  {
    "path": "app/src/main/res/drawable/ssdk_oks_classic_progressbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rotate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\t    android:fromDegrees=\"0\"\n\t    android:pivotX=\"50%\"\n\t    android:pivotY=\"50%\"\n\t    android:toDegrees=\"360\" >\n\t    <shape\n\t        android:innerRadiusRatio=\"3\"\n\t        android:shape=\"ring\"\n\t        android:thicknessRatio=\"8\"\n\t        android:useLevel=\"false\" >\n\t        <gradient\n\t            android:centerColor=\"#12ff0e\"\n\t            android:centerX=\"0.50\"\n\t            android:centerY=\"0.50\"\n\t            android:endColor=\"#09bb07\"\n\t        \tandroid:startColor=\"#ffffff\"\n\t            android:type=\"sweep\"\n\t            android:useLevel=\"false\" />\n\t    </shape>\n</rotate>\n"
  },
  {
    "path": "app/src/main/res/drawable-v21/selector_button.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:color=\"@color/colorPrimaryDark\">\n    <item android:drawable=\"@drawable/shape_button_normal\" />\n</ripple>\n"
  },
  {
    "path": "app/src/main/res/drawable-v21/selector_item.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:color=\"@color/colorGray\">\n    <item android:drawable=\"@android:color/white\" />\n</ripple>\n"
  },
  {
    "path": "app/src/main/res/layout/act_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <data></data>\n\n    <RelativeLayout xmlns:tools=\"http://schemas.android.com/tools\"\n        android:id=\"@+id/activity_detail\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\"com.ittianyu.pocenter.features.detail.DetailActivity\">\n\n        <android.support.v7.widget.Toolbar\n            android:id=\"@+id/tb\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@color/colorPrimary\">\n\n            <TextView\n                android:id=\"@+id/tv_title\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:maxLines=\"1\"\n                android:ellipsize=\"end\"\n                android:text=\"@string/app_name\"\n                android:textColor=\"@android:color/white\"\n                android:textSize=\"18sp\" />\n        </android.support.v7.widget.Toolbar>\n\n        <WebView\n            android:id=\"@+id/wv\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_below=\"@id/tb\"></WebView>\n\n    </RelativeLayout>\n</layout>"
  },
  {
    "path": "app/src/main/res/layout/act_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <data></data>\n\n    <android.support.design.widget.CoordinatorLayout xmlns:tools=\"http://schemas.android.com/tools\"\n        android:id=\"@+id/activity_with_view_pager\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\".features.viewpager.WithViewPagerActivity\">\n\n        <android.support.v4.view.ViewPager\n            android:id=\"@+id/vp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\" />\n\n        <com.ittianyu.bottomnavigationviewex.BottomNavigationViewEx\n            android:id=\"@+id/bnve\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"bottom\"\n            android:background=\"@android:color/white\"\n            app:itemIconTint=\"@color/selector_item_color\"\n            app:itemTextColor=\"@color/selector_item_color\"\n            app:layout_behavior=\"@string/bye_burger_bottom_behavior\"\n            app:menu=\"@menu/menu_navigation\" />\n\n    </android.support.design.widget.CoordinatorLayout>\n</layout>"
  },
  {
    "path": "app/src/main/res/layout/act_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <data></data>\n\n    <FrameLayout\n        android:background=\"@color/colorLighterGray\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <FrameLayout\n            android:layout_marginTop=\"60sp\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <include layout=\"@layout/view_empty\" />\n\n            <include layout=\"@layout/view_error\" />\n\n            <include layout=\"@layout/view_loading\" />\n\n            <android.support.v4.widget.SwipeRefreshLayout\n                android:id=\"@+id/v_content\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\">\n\n                <android.support.v7.widget.RecyclerView\n                    android:id=\"@+id/rv\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\">\n\n                </android.support.v7.widget.RecyclerView>\n\n            </android.support.v4.widget.SwipeRefreshLayout>\n\n        </FrameLayout>\n\n        <com.arlib.floatingsearchview.FloatingSearchView\n            android:id=\"@+id/fsv\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:floatingSearch_close_search_on_keyboard_dismiss=\"true\"\n            app:floatingSearch_leftActionMode=\"showSearch\"\n            app:floatingSearch_searchBarMarginLeft=\"@dimen/search_view_inset\"\n            app:floatingSearch_searchBarMarginRight=\"@dimen/search_view_inset\"\n            app:floatingSearch_searchBarMarginTop=\"@dimen/search_view_inset\"\n            app:floatingSearch_searchHint=\"@string/search\"\n            app:floatingSearch_showSearchKey=\"false\"\n            app:floatingSearch_suggestionsListAnimDuration=\"250\" />\n    </FrameLayout>\n\n\n</layout>"
  },
  {
    "path": "app/src/main/res/layout/act_splash.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/activity_main\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/colorPrimary\"\n    tools:context=\"com.ittianyu.pocenter.features.SplashActivity\">\n\n    <LinearLayout\n        android:layout_centerInParent=\"true\"\n        android:orientation=\"vertical\"\n        android:gravity=\"center\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\">\n\n        <ImageView\n            app:srcCompat=\"@drawable/ic_logo\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n\n        <TextView\n            android:layout_marginTop=\"20dp\"\n            android:textColor=\"@android:color/white\"\n            android:text=\"@string/tips_tianyu\"\n            android:textAlignment=\"center\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n    </LinearLayout>\n\n\n\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/act_type.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n    <data></data>\n\n    <RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n        xmlns:tools=\"http://schemas.android.com/tools\"\n        android:id=\"@+id/activity_type\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        tools:context=\"com.ittianyu.pocenter.features.type.TypeActivity\">\n\n        <android.support.v7.widget.Toolbar\n            android:id=\"@+id/tb\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@color/colorPrimary\">\n\n            <TextView\n                android:id=\"@+id/tv_title\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/tag_manager\"\n                android:textColor=\"@android:color/white\"\n                android:textSize=\"18sp\" />\n        </android.support.v7.widget.Toolbar>\n\n        <com.zhy.view.flowlayout.TagFlowLayout\n            android:id=\"@+id/tfl\"\n            android:layout_below=\"@id/tb\"\n            android:layout_centerHorizontal=\"true\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_margin=\"@dimen/activity_horizontal_margin\"\n            app:gravity=\"center\"\n            app:max_select=\"-1\"></com.zhy.view.flowlayout.TagFlowLayout>\n\n        <Button\n            android:id=\"@+id/btn_ok\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentBottom=\"true\"\n            android:textColor=\"@android:color/white\"\n            android:background=\"@drawable/selector_button\"\n            android:layout_margin=\"@dimen/activity_horizontal_margin\"\n            android:text=\"@string/ok\" />\n    </RelativeLayout>\n</layout>"
  },
  {
    "path": "app/src/main/res/layout/frag_find.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <data></data>\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\">\n\n        <android.support.v7.widget.Toolbar\n            android:id=\"@+id/tb\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"?attr/actionBarSize\"\n            android:background=\"@color/colorPrimary\"\n            android:paddingTop=\"10dp\"\n            android:paddingBottom=\"10dp\"\n            android:paddingRight=\"@dimen/activity_horizontal_margin\">\n\n            <include\n                layout=\"@layout/view_search\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\" />\n        </android.support.v7.widget.Toolbar>\n\n        <FrameLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <include layout=\"@layout/view_empty\" />\n\n            <include layout=\"@layout/view_error\" />\n\n            <include layout=\"@layout/view_loading\" />\n\n            <android.support.v4.widget.SwipeRefreshLayout\n                android:id=\"@+id/v_content\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\">\n\n                <android.support.v7.widget.RecyclerView\n                    android:id=\"@+id/rv\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\">\n\n                </android.support.v7.widget.RecyclerView>\n\n            </android.support.v4.widget.SwipeRefreshLayout>\n\n        </FrameLayout>\n\n    </LinearLayout>\n\n\n</layout>"
  },
  {
    "path": "app/src/main/res/layout/frag_home.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <data></data>\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\">\n\n        <android.support.v7.widget.Toolbar\n            android:id=\"@+id/tb\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@color/colorPrimary\">\n\n            <TextView\n                android:id=\"@+id/tv_title\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"@string/app_name\"\n                android:layout_gravity=\"center\"\n                android:textColor=\"@android:color/white\"\n                android:textSize=\"18sp\" />\n\n        </android.support.v7.widget.Toolbar>\n\n        <FrameLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\">\n\n            <include layout=\"@layout/view_empty\" />\n\n            <include layout=\"@layout/view_error\" />\n\n            <include layout=\"@layout/view_loading\" />\n\n            <android.support.v4.widget.SwipeRefreshLayout\n                android:id=\"@+id/v_content\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\">\n\n                <android.support.v7.widget.RecyclerView\n                    android:id=\"@+id/rv\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"match_parent\">\n\n                </android.support.v7.widget.RecyclerView>\n\n            </android.support.v4.widget.SwipeRefreshLayout>\n\n        </FrameLayout>\n    </LinearLayout>\n\n\n</layout>"
  },
  {
    "path": "app/src/main/res/layout/frag_mime.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <data></data>\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\">\n\n        <android.support.v7.widget.Toolbar\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@color/colorPrimary\">\n\n            <TextView\n                android:id=\"@+id/tv_title\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_gravity=\"center\"\n                android:text=\"@string/mine\"\n                android:textColor=\"@android:color/white\"\n                android:textSize=\"18sp\" />\n\n        </android.support.v7.widget.Toolbar>\n\n        <android.support.v7.widget.CardView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"@dimen/activity_vertical_margin\"\n            android:layout_marginTop=\"@dimen/activity_vertical_margin\">\n\n            <LinearLayout\n                android:background=\"@drawable/selector_item\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:paddingBottom=\"5dp\"\n                android:paddingTop=\"5dp\">\n\n                <ImageView\n                    android:layout_width=\"wrap_content\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_marginLeft=\"@dimen/activity_horizontal_margin\"\n                    app:srcCompat=\"@drawable/ic_github\" />\n\n                <LinearLayout\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_gravity=\"center_vertical\"\n                    android:layout_marginLeft=\"@dimen/activity_horizontal_margin\"\n                    android:orientation=\"vertical\">\n\n                    <TextView\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:layout_marginBottom=\"3dp\"\n                        android:text=\"@string/user_nick\"\n                        android:textColor=\"@android:color/black\"\n                        android:textSize=\"15sp\" />\n\n                    <TextView\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\"\n                        android:text=\"@string/user_info\" />\n\n                </LinearLayout>\n\n            </LinearLayout>\n\n        </android.support.v7.widget.CardView>\n\n\n        <android.support.v7.widget.CardView\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <LinearLayout\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:divider=\"@drawable/shape_drive_line\"\n                android:orientation=\"vertical\"\n                android:showDividers=\"middle\">\n\n                <LinearLayout\n                    android:id=\"@+id/ll_tag_manager\"\n                    style=\"@style/mime_ll_setting\">\n\n                    <ImageView\n                        style=\"@style/mime_iv_setting\"\n                        app:srcCompat=\"@drawable/ic_type\" />\n\n                    <TextView\n                        style=\"@style/mime_tv_setting\"\n                        android:text=\"@string/tag_manager\" />\n                </LinearLayout>\n\n                <LinearLayout\n                    android:id=\"@+id/ll_version_check\"\n                    style=\"@style/mime_ll_setting\">\n\n                    <ImageView\n                        style=\"@style/mime_iv_setting\"\n                        app:srcCompat=\"@drawable/ic_version_check\" />\n\n                    <TextView\n                        style=\"@style/mime_tv_setting\"\n                        android:text=\"@string/version_check\" />\n                </LinearLayout>\n\n                <LinearLayout\n                    android:id=\"@+id/ll_about\"\n                    style=\"@style/mime_ll_setting\">\n\n                    <ImageView\n                        style=\"@style/mime_iv_setting\"\n                        app:srcCompat=\"@drawable/ic_about\" />\n\n                    <TextView\n                        style=\"@style/mime_tv_setting\"\n                        android:text=\"@string/about\" />\n                </LinearLayout>\n            </LinearLayout>\n\n        </android.support.v7.widget.CardView>\n\n    </LinearLayout>\n</layout>"
  },
  {
    "path": "app/src/main/res/layout/item_find.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    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:background=\"@drawable/selector_item\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"5dp\"\n        android:orientation=\"horizontal\">\n        <!--title-->\n        <TextView\n            android:id=\"@+id/tv_title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:ellipsize=\"end\"\n            android:maxLines=\"2\"\n            android:text=\"标题标题标题标题标题标题标题\"\n            android:textColor=\"@android:color/black\"\n            android:textSize=\"16sp\" />\n\n        <!--price-->\n        <TextView\n            android:id=\"@+id/tv_price\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"300,000元\"\n            android:textColor=\"@android:color/holo_red_dark\"\n            android:textSize=\"16sp\" />\n\n    </LinearLayout>\n\n    <!--description-->\n    <TextView\n        android:id=\"@+id/tv_description\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"5dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:text=\"描述描述描述描述描述描述描述描述描述描述描述描述描述描描述述描述描述描述描述描述\" />\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <!--date-->\n        <ImageView\n            android:id=\"@+id/iv_date\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginRight=\"2dp\"\n            app:srcCompat=\"@drawable/ic_date\" />\n\n        <TextView\n            android:id=\"@+id/tv_date\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:layout_toRightOf=\"@+id/iv_date\"\n            android:textColor=\"@color/colorLightGray\"\n            android:text=\"2017-01-10\" />\n\n        <!--participate people count-->\n        <ImageView\n            android:id=\"@+id/iv_people_count\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentTop=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"10dp\"\n            android:layout_marginRight=\"2dp\"\n            android:layout_toRightOf=\"@+id/tv_date\"\n            app:srcCompat=\"@drawable/ic_people\" />\n\n        <TextView\n            android:id=\"@+id/tv_people_count\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:layout_toRightOf=\"@+id/iv_people_count\"\n            android:textColor=\"@color/colorLightGray\"\n            android:text=\"10人\" />\n\n        <!--cycle-->\n        <ImageView\n            android:id=\"@+id/iv_cycle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignBottom=\"@+id/tv_people_count\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"10dp\"\n            android:layout_marginRight=\"2dp\"\n            android:layout_toRightOf=\"@+id/tv_people_count\"\n            app:srcCompat=\"@drawable/ic_cycle\" />\n\n        <TextView\n            android:id=\"@+id/tv_cycle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:layout_toRightOf=\"@+id/iv_cycle\"\n            android:textColor=\"@color/colorLightGray\"\n            android:text=\"100天\" />\n\n        <!--type-->\n        <TextView\n            android:id=\"@+id/tv_type\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentRight=\"true\"\n            android:background=\"@drawable/shape_type_normal\"\n            android:paddingBottom=\"3dp\"\n            android:paddingLeft=\"10dp\"\n            android:paddingRight=\"10dp\"\n            android:paddingTop=\"3dp\"\n            android:text=\"安卓\"\n            android:textSize=\"12sp\"\n            android:textColor=\"@android:color/white\" />\n    </RelativeLayout>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_home.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=\"wrap_content\"\n    android:background=\"@drawable/selector_item\"\n    android:orientation=\"vertical\"\n    android:paddingBottom=\"@dimen/activity_vertical_margin\"\n    android:paddingLeft=\"@dimen/activity_horizontal_margin\"\n    android:paddingRight=\"@dimen/activity_horizontal_margin\"\n    android:paddingTop=\"@dimen/activity_vertical_margin\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"5dp\"\n        android:orientation=\"horizontal\">\n        <!--title-->\n        <TextView\n            android:id=\"@+id/tv_title\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:ellipsize=\"end\"\n            android:maxLines=\"2\"\n            android:text=\"标题标题标题标题标题标题标题\"\n            android:textColor=\"@android:color/black\"\n            android:textSize=\"16sp\" />\n\n        <!--price-->\n        <TextView\n            android:id=\"@+id/tv_price\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"300,000元\"\n            android:textColor=\"@android:color/holo_red_dark\"\n            android:textSize=\"16sp\" />\n\n    </LinearLayout>\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"5dp\"\n        android:orientation=\"horizontal\">\n        <!--reference-->\n        <TextView\n            android:id=\"@+id/tv_reference\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginRight=\"@dimen/activity_horizontal_margin\"\n            android:ellipsize=\"end\"\n            android:text=\"天宇外包\" />\n        <!--type-->\n        <TextView\n            android:id=\"@+id/tv_type\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@drawable/shape_type_normal\"\n            android:paddingBottom=\"3dp\"\n            android:paddingLeft=\"10dp\"\n            android:paddingRight=\"10dp\"\n            android:paddingTop=\"3dp\"\n            android:text=\"安卓\"\n            android:textColor=\"@android:color/white\"\n            android:textSize=\"12sp\" />\n\n    </LinearLayout>\n\n    <!--description-->\n    <TextView\n        android:id=\"@+id/tv_description\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginBottom=\"5dp\"\n        android:ellipsize=\"end\"\n        android:maxLines=\"2\"\n        android:text=\"描述描述描述描述描述描述描述描述描述描述描述描述描述描描述述描述描述描述描述描述\" />\n\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <!--date-->\n        <ImageView\n            android:id=\"@+id/iv_date\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentLeft=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginRight=\"2dp\"\n            app:srcCompat=\"@drawable/ic_date\" />\n\n        <TextView\n            android:id=\"@+id/tv_date\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:layout_toRightOf=\"@+id/iv_date\"\n            android:textColor=\"@color/colorLightGray\"\n            android:text=\"2017-01-10\" />\n\n        <!--participate people count-->\n        <ImageView\n            android:id=\"@+id/iv_people_count\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentTop=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"10dp\"\n            android:layout_marginRight=\"2dp\"\n            android:layout_toRightOf=\"@+id/tv_date\"\n            app:srcCompat=\"@drawable/ic_people\" />\n\n        <TextView\n            android:id=\"@+id/tv_people_count\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:textColor=\"@color/colorLightGray\"\n            android:layout_toRightOf=\"@+id/iv_people_count\"\n            android:text=\"10人\" />\n\n        <!--cycle-->\n        <ImageView\n            android:id=\"@+id/iv_cycle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignBottom=\"@+id/tv_people_count\"\n            android:layout_centerVertical=\"true\"\n            android:layout_marginLeft=\"10dp\"\n            android:layout_marginRight=\"2dp\"\n            android:layout_toRightOf=\"@+id/tv_people_count\"\n            app:srcCompat=\"@drawable/ic_cycle\" />\n\n        <TextView\n            android:id=\"@+id/tv_cycle\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerVertical=\"true\"\n            android:layout_toRightOf=\"@+id/iv_cycle\"\n            android:textColor=\"@color/colorLightGray\"\n            android:text=\"100天\" />\n\n        <!--status-->\n        <TextView\n            android:id=\"@+id/tv_status\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_centerVertical=\"true\"\n            android:text=\"报名中\"\n            android:textColor=\"@color/colorPrimary\" />\n\n    </RelativeLayout>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/item_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.CardView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_marginLeft=\"@dimen/search_view_inset\"\n    android:layout_marginRight=\"@dimen/search_view_inset\"\n    android:layout_marginTop=\"@dimen/activity_vertical_margin\">\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@drawable/selector_item\"\n        android:orientation=\"vertical\"\n        android:paddingBottom=\"@dimen/activity_vertical_margin\"\n        android:paddingLeft=\"@dimen/search_view_inset\"\n        android:paddingRight=\"@dimen/search_view_inset\"\n        android:paddingTop=\"@dimen/activity_vertical_margin\">\n\n        <LinearLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"5dp\"\n            android:orientation=\"horizontal\">\n            <!--title-->\n            <TextView\n                android:id=\"@+id/tv_title\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n                android:layout_weight=\"1\"\n                android:ellipsize=\"end\"\n                android:maxLines=\"2\"\n                android:text=\"标题标题标题标题标题标题标题\"\n                android:textColor=\"@android:color/black\"\n                android:textSize=\"16sp\" />\n\n            <!--price-->\n            <TextView\n                android:id=\"@+id/tv_price\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:text=\"300,000元\"\n                android:textColor=\"@android:color/holo_red_dark\"\n                android:textSize=\"16sp\" />\n\n        </LinearLayout>\n\n        <!--description-->\n        <TextView\n            android:id=\"@+id/tv_description\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginBottom=\"5dp\"\n            android:ellipsize=\"end\"\n            android:maxLines=\"2\"\n            android:text=\"描述描述描述描述描述描述描述描述描述描述描述描述描述描描述述描述描述描述描述描述\" />\n\n        <RelativeLayout\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\">\n\n            <!--date-->\n            <ImageView\n                android:id=\"@+id/iv_date\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentLeft=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginRight=\"2dp\"\n                app:srcCompat=\"@drawable/ic_date\" />\n\n            <TextView\n                android:id=\"@+id/tv_date\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_centerVertical=\"true\"\n                android:layout_toRightOf=\"@+id/iv_date\"\n                android:textColor=\"@color/colorLightGray\"\n                android:text=\"2017-01-10\" />\n\n            <!--participate people count-->\n            <ImageView\n                android:id=\"@+id/iv_people_count\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignParentTop=\"true\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginLeft=\"10dp\"\n                android:layout_marginRight=\"2dp\"\n                android:layout_toRightOf=\"@+id/tv_date\"\n                app:srcCompat=\"@drawable/ic_people\" />\n\n            <TextView\n                android:id=\"@+id/tv_people_count\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_centerVertical=\"true\"\n                android:layout_toRightOf=\"@+id/iv_people_count\"\n                android:textColor=\"@color/colorLightGray\"\n                android:text=\"10人\" />\n\n            <!--cycle-->\n            <ImageView\n                android:id=\"@+id/iv_cycle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_alignBottom=\"@+id/tv_people_count\"\n                android:layout_centerVertical=\"true\"\n                android:layout_marginLeft=\"10dp\"\n                android:layout_marginRight=\"2dp\"\n                android:layout_toRightOf=\"@+id/tv_people_count\"\n                app:srcCompat=\"@drawable/ic_cycle\" />\n\n            <TextView\n                android:id=\"@+id/tv_cycle\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_centerVertical=\"true\"\n                android:layout_toRightOf=\"@+id/iv_cycle\"\n                android:textColor=\"@color/colorLightGray\"\n                android:text=\"100天\" />\n\n        </RelativeLayout>\n\n    </LinearLayout>\n</android.support.v7.widget.CardView>"
  },
  {
    "path": "app/src/main/res/layout/view_empty.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/v_empty\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <ImageView\n        android:id=\"@+id/iv\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        app:srcCompat=\"@drawable/ic_empty\" />\n    <TextView\n        android:layout_below=\"@id/iv\"\n        android:text=\"@string/no_data\"\n        android:gravity=\"center\"\n        android:layout_marginTop=\"10dp\"\n        android:textColor=\"@color/colorPrimary\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\" />\n\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/view_error.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/v_error\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <LinearLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:gravity=\"center\"\n        android:orientation=\"vertical\" >\n\n        <ImageView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            app:srcCompat=\"@drawable/ic_error\" />\n\n        <TextView\n            android:id=\"@+id/tv\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"10dp\"\n            android:textColor=\"@color/colorPrimary\"\n            android:text=\"加载失败,点击重试\" />\n    </LinearLayout>\n\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/view_loading.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/v_loading\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <!--<ProgressBar-->\n        <!--android:layout_width=\"wrap_content\"-->\n        <!--android:layout_height=\"wrap_content\"-->\n        <!--android:layout_centerInParent=\"true\"-->\n        <!--android:indeterminateBehavior=\"repeat\" />-->\n\n    <com.victor.loading.rotate.RotateLoading\n        android:id=\"@+id/rl\"\n        android:layout_width=\"80dp\"\n        android:layout_height=\"80dp\"\n        app:loading_width=\"5dp\"\n        app:loading_color=\"@color/colorAccent\"\n        android:layout_centerInParent=\"true\"/>\n\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/view_search.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/ll_root\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@color/colorSearchWhite\"\n    android:gravity=\"center_vertical\"\n    android:orientation=\"horizontal\">\n\n    <ImageView\n        android:id=\"@+id/iv_icon\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginLeft=\"@dimen/activity_horizontal_margin\"\n        android:src=\"@drawable/ic_search_black_24dp\" />\n\n    <TextView\n        android:id=\"@+id/tv_hint\"\n        android:layout_toRightOf=\"@id/iv_icon\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginLeft=\"30dp\"\n        android:text=\"@string/search\"\n        android:textSize=\"18sp\" />\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/view_type.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<CheckedTextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/tv\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/selector_type\"\n    android:paddingBottom=\"5dp\"\n    android:paddingLeft=\"10dp\"\n    android:paddingRight=\"10dp\"\n    android:paddingTop=\"5dp\"\n    android:layout_marginLeft=\"15dp\"\n    android:layout_marginRight=\"15dp\"\n    android:layout_marginBottom=\"@dimen/activity_vertical_margin\"\n    android:text=\"@string/type_app\"\n    android:textColor=\"@android:color/white\" />\n"
  },
  {
    "path": "app/src/main/res/menu/menu_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n\n    <item\n        android:id=\"@+id/i_share\"\n        app:showAsAction=\"always\"\n        android:icon=\"@drawable/ic_share\"\n        android:title=\"@string/share\" />\n    <item\n        android:id=\"@+id/i_refresh\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/refresh\" />\n    <item\n        android:id=\"@+id/i_open_in_browser\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/open_in_browser\" />\n\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/menu_navigation.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item\n        android:id=\"@+id/menu_music\"\n        android:checked=\"true\"\n        android:icon=\"@drawable/ic_home\"\n        android:title=\"@string/home\" />\n\n    <item\n        android:id=\"@+id/menu_backup\"\n        android:icon=\"@drawable/ic_find\"\n        android:title=\"@string/find\" />\n\n    <item\n        android:id=\"@+id/menu_friends\"\n        android:icon=\"@drawable/ic_mine\"\n        android:title=\"@string/mine\" />\n\n</menu>"
  },
  {
    "path": "app/src/main/res/menu/menu_type.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <item\n        android:id=\"@+id/i_select_all\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/select_all\" />\n    <item\n        android:id=\"@+id/i_cancel_all\"\n        app:showAsAction=\"never\"\n        android:title=\"@string/cancel_all\" />\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\">#03A9F4</color>\n    <color name=\"colorPrimaryDark\">#0288D1</color>\n    <color name=\"colorAccent\">#4CAF50</color>\n\n    <color name=\"colorDarkGray\">#e6969696</color>\n    <color name=\"colorGray\">#ccc</color>\n    <color name=\"colorLightGray\">#a9a9a9</color>\n    <color name=\"colorLighterGray\">#eee</color>\n    <color name=\"colorDriverGray\">#21000000</color>\n    <color name=\"colorSearchWhite\">#ffffff</color>\n    <color name=\"colorMenu\">#ffffff</color>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n    <dimen name=\"search_view_inset\">10dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/ssdk_instapaper_strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<resources>\n    <string name=\"ssdk_instapager_login_html\" formatted=\"false\" translatable=\"false\"><![CDATA[\n<!DOCTYPE html>\n<html>\n<head>\n<meta content=\\\"text/html; charset=utf-8\\\" http-equiv=\\\"Content-Type\\\">\n<meta content=\\\"width=device-width,minimum-scale=1,maximum-scale=1,initial-scale=1,user-scalable=no\\\" id=\\\"viewport\\\" name=\\\"viewport\\\">\n<meta content=\\\"yes\\\" name=\\\"apple-mobile-web-app-capable\\\">\n<title>%s</title>\n<style type=\\\"text/css\\\">\nbody{margin:0;padding:0}\n.inputstyle {\n    -webkit-tap-highlight-color:rgba(255,255,255,0);\n    width:100%%;\n    height:44px;\n    color:#000;\n    background:0;\n    border:0;\n    font-size:16px;\n    outline: none;\n    -webkit-appearance:none\n}\n\n.btn {\n    width:90%%;\n    height:44px;\n    line-height:44px;\n    background:#A0C035;\n    border:0;\n    border-radius:4px;\n    color:#fff;\n    font-size:16px;\n    text-align:center;\n    margin-top:15px;\n    display:block\n}\n.btn:disabled {\n    background: #dddddd;\n}\n.error {\n    color:red;\n}\n</style>\n</head>\n\n<body>\n<script type=\\\"text/javascript\\\">\nfunction login(form){\n    var u=form[\\\"u\\\"].value,p=form[\\\"p\\\"].value;\n    if(!u || !p)\n        return false;\n    form[\\\"s\\\"].disabled = true;\n    return true;\n}\n</script>\n<form style=\\\"margin-top:45px;\\\" action=\\\"%s\\\" metho=\\\"get\\\" onsubmit=\\\"return login(this);\\\">\n%s\n<div style=\\\"padding-left:15px;border-top:1px solid #E3E3E5;border-bottom:1px solid #E3E3E5;\\\">\n <input type=\\\"hidden\\\" name=\\\"ID_SIGN\\\" value=\\\"OWELJSFPWECSFEW\\\"/>\n <input class=\\\"inputstyle\\\" id=\\\"u\\\" name=\\\"u\\\" type=\\\"text\\\" value=\\\"%s\\\" placeholder=\\\"%s\\\" style=\\\"border-bottom:1px solid #E3E3E5;\\\"/>\n <input class=\\\"inputstyle\\\" id=\\\"p\\\" name=\\\"p\\\" type=\\\"password\\\" placeholder=\\\"%s\\\"/>\n</div>\n<p><input style=\\\"margin:0 auto;\\\" type=\\\"submit\\\" name=\\\"s\\\" value=\\\"  %s  \\\" class=\\\"btn\\\"/></p>\n</form>\n</body>\n</html>\n]]></string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/ssdk_oks_color_drawables.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <drawable name=\"ssdk_oks_classic_platfrom_cell_back_nor\">#ffffffff</drawable>\n    <drawable name=\"ssdk_oks_classic_platfrom_cell_back_sel\">#ffeeeeee</drawable>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/ssdk_oks_strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"ssdk_oks_share\">分享</string>\n    <string name=\"ssdk_oks_sharing\">分享操作正在后台进行…</string>\n    <string name=\"ssdk_oks_share_failed\">分享失败</string>\n    <string name=\"ssdk_oks_share_completed\">分享成功</string>\n    <string name=\"ssdk_oks_share_canceled\">分享已取消</string>\n    <string name=\"ssdk_oks_cancel\">取消</string>\n    <string name=\"ssdk_oks_multi_share\">图文分享</string>\n    <string name=\"ssdk_oks_confirm\">确定</string>\n    <string name=\"ssdk_oks_contacts\">联系人</string>\n    <string name=\"ssdk_oks_pull_to_refresh\">下拉刷新</string>\n\t<string name=\"ssdk_oks_release_to_refresh\">松开刷新</string>\n\t<string name=\"ssdk_oks_refreshing\">刷新中…</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/ssdk_strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"ssdk_weibo_oauth_regiseter\">应用授权</string>\n    <string name=\"ssdk_website\">http://www.mob.com</string>\n    <string name=\"ssdk_weibo_upload_content\">分享图片</string>\n    <string name=\"ssdk_wechat_client_inavailable\">目前您的微信版本过低或未安装微信，需要安装微信才能使用</string>\n    <string name=\"ssdk_google_plus_client_inavailable\">Google+ 版本过低或者没有安装，需要升级或安装Google+才能使用！</string>\n    <string name=\"ssdk_qq_client_inavailable\">QQ 版本过低或者没有安装，需要升级或安装QQ才能使用！</string>\n    <string name=\"ssdk_pinterest_client_inavailable\">Pinterest版本过低或者没有安装，需要升级或安装Pinterest才能使用！</string>\n    <string name=\"ssdk_instagram_client_inavailable\">Instagram版本过低或者没有安装，需要升级或安装Instagram才能使用！</string>\n    <string name=\"ssdk_yixin_client_inavailable\">目前您的易信版本过低或未安装，需要安装易信才能使用</string>\n    <string name=\"ssdk_line_client_inavailable\">目前您的Line版本过低或未安装，需要安装Line才能使用</string>\n    <string name=\"ssdk_kakaotalk_client_inavailable\">目前您的KakaoTalk版本过低或未安装，需要安装KakaoTalk才能使用</string>\n    <string name=\"ssdk_kakaostory_client_inavailable\">目前您的KakaoStory版本过低或未安装，需要安装KakaoStory才能使用</string>\n    <string name=\"ssdk_whatsapp_client_inavailable\">目前您的WhatsApp版本过低或未安装，需要安装WhatsApp才能使用</string>\n    <string name=\"ssdk_laiwang_client_inavailable\">目前您的来往版本过低或未安装，需要安装来往才能使用</string>\n    <string name=\"ssdk_alipay_client_inavailable\">目前您的支付宝版本过低或未安装，需要安装支付宝才能使用</string>\n    <string name=\"ssdk_facebookmessenger_client_inavailable\">目前您的FacebookMessenger版本过低或未安装，需要安装才能使用</string>\n    \n\t<string name=\"ssdk_sinaweibo\">新浪微博</string>\n\t<string name=\"ssdk_tencentweibo\">腾讯微博</string>\n\t<string name=\"ssdk_qzone\">QQ空间</string>\n\t<string name=\"ssdk_wechat\">微信好友</string>\n\t<string name=\"ssdk_wechatmoments\">微信朋友圈</string>\n\t<string name=\"ssdk_wechatfavorite\">微信收藏</string>\n\t<string name=\"ssdk_facebook\">Facebook</string>\n\t<string name=\"ssdk_twitter\">Twitter</string>\n\t<string name=\"ssdk_renren\">人人网</string>\n\t<string name=\"ssdk_kaixin\">开心网</string>\n\t<string name=\"ssdk_email\">邮件</string>\n\t<string name=\"ssdk_shortmessage\">信息</string>\n\t<string name=\"ssdk_sohumicroblog\">搜狐微博</string>\n\t<string name=\"ssdk_sohusuishenkan\">搜狐随身看</string>\n\t<string name=\"ssdk_neteasemicroblog\">网易微博</string>\n\t<string name=\"ssdk_douban\">豆瓣</string>\n\t<string name=\"ssdk_youdao\">有道云笔记</string>\n\t<string name=\"ssdk_evernote\">印象笔记</string>\n\t<string name=\"ssdk_linkedin\">领英</string>\n\t<string name=\"ssdk_googleplus\">Google+</string>\n\t<string name=\"ssdk_foursquare\">FourSquare</string>\n\t<string name=\"ssdk_qq\">QQ</string>\n\t<string name=\"ssdk_pinterest\">Pinterest</string>\n\t<string name=\"ssdk_flickr\">Flickr</string>\n\t<string name=\"ssdk_tumblr\">Tumblr</string>\n\t<string name=\"ssdk_dropbox\">Dropbox</string>\n\t<string name=\"ssdk_vkontakte\">VK</string>\n\t<string name=\"ssdk_instagram\">Instagram</string>\n\t<string name=\"ssdk_yixin\">易信</string>\n\t<string name=\"ssdk_yixinmoments\">易信朋友圈</string>\n\t<string name=\"ssdk_mingdao\">明道</string>\n\t<string name=\"ssdk_kakaotalk\">KakaoTalk</string>\n\t<string name=\"ssdk_kakaostory\">KakaoStory</string>\n\t<string name=\"ssdk_line\">Line</string>\n\t<string name=\"ssdk_bluetooth\">蓝牙</string>\n\t<string name=\"ssdk_whatsapp\">WhatsApp</string>\n\t<string name=\"ssdk_pocket\">Pocket</string>\n\t<string name=\"ssdk_instapaper\">Instapaper</string>\n\t<string name=\"ssdk_instapaper_email\">邮箱</string>\n\t<string name=\"ssdk_instapaper_pwd\">密码</string>\n\t<string name=\"ssdk_instapaper_login\">登录</string>\n\t<string name=\"ssdk_instapaper_logining\">登录中…</string>\n\t<string name=\"ssdk_instapager_email_or_password_incorrect\">Email或密码不正确</string>\n    <string name=\"ssdk_facebookmessenger\">Facebook Messenger</string>\n    <string name=\"ssdk_laiwang\">来往</string>\n    <string name=\"ssdk_laiwangmoments\">来往动态</string>\n    <string name=\"ssdk_alipay\">支付宝好友</string>\n    <string name=\"ssdk_alipaymoments\">支付宝生活圈</string>\n    <string name=\"ssdk_plurk\">Plurk</string>\n\n\t<string name=\"ssdk_share_to_qzone\">分享到QQ空间</string>\n\t<string name=\"ssdk_share_to_qq\">分享到QQ</string>\n\t<string name=\"ssdk_share_to_facebook\">分享到Facebook</string>\n\t<string name=\"ssdk_mingdao_share_content\">网页分享</string>\n\t<string name=\"ssdk_share_to_mingdao\">分享到明道</string>\n\t<string name=\"ssdk_share_to_googleplus\">分享到Google+</string>\n\t<string name=\"ssdk_share_to_qzone_default\">来自%s的分享</string>\n\t<string name=\"ssdk_use_login_button\">请改用“登录”按钮</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\" translatable=\"false\">外包集中营</string>\n    <string name=\"no_data\" translatable=\"false\">没有数据</string>\n    <string name=\"failed_to_refresh\" translatable=\"false\">刷新失败</string>\n    <string name=\"failed_to_load_click_to_reload\" translatable=\"false\">加载失败，点击重新加载</string>\n    <string name=\"home\" translatable=\"false\">首页</string>\n    <string name=\"find\" translatable=\"false\">发现</string>\n    <string name=\"mine\" translatable=\"false\">我的</string>\n    <string name=\"ok\" translatable=\"false\">确定</string>\n    <string name=\"type_other\" translatable=\"false\">其他</string>\n    <string name=\"type_web\" translatable=\"false\">网站开发</string>\n    <string name=\"type_we_chat\" translatable=\"false\">微信/小程序</string>\n    <string name=\"type_html5\" translatable=\"false\">HTML5</string>\n    <string name=\"type_app\" translatable=\"false\">移动 APP</string>\n    <string name=\"type_intelligent_hardware\" translatable=\"false\">智能硬件</string>\n    <string name=\"type_desktop_app\" translatable=\"false\">桌面应用</string>\n    <string name=\"type_big_data\" translatable=\"false\">大数据</string>\n    <string name=\"type_system\" translatable=\"false\">系统开发</string>\n    <string name=\"type_sdk_api\" translatable=\"false\">SDK/API</string>\n    <string name=\"type_art\" translatable=\"false\">美工设计</string>\n    <string name=\"unit_people\" translatable=\"false\">人</string>\n    <string name=\"unit_day\" translatable=\"false\">天</string>\n    <string name=\"toast_select_one_or_more_type\" translatable=\"false\">请先选择一个或多个关注的类型</string>\n    <string name=\"search\" translatable=\"false\">搜索</string>\n    <string name=\"refresh\" translatable=\"false\">刷新</string>\n    <string name=\"open_in_browser\" translatable=\"false\">在浏览器中打开</string>\n    <string name=\"share\" translatable=\"false\">分享</string>\n    <string name=\"tag_manager\" translatable=\"false\">标签管理</string>\n    <string name=\"version_check\" translatable=\"false\">版本更新</string>\n    <string name=\"about\" translatable=\"false\">关于</string>\n    <string name=\"user_nick\" translatable=\"false\">我可能是登录了假账号</string>\n    <string name=\"user_info\" translatable=\"false\">敬请期待</string>\n    <string name=\"tips_about_us\" translatable=\"false\">© 2017 天宇工作室.版权所有\\n\\t\\t\\twww.ittianyu.com</string>\n    <string name=\"tips_tianyu\" translatable=\"false\">© 2017 天宇工作室\\nwww.ittianyu.com</string>\n    <string name=\"tips_already_last_version\" translatable=\"false\">已经是最新版本</string>\n    <string name=\"exit_if_repeat\" translatable=\"false\">再点一次退出</string>\n    <string name=\"select_all\" translatable=\"false\">全选</string>\n    <string name=\"cancel_all\" translatable=\"false\">取消所有</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    <style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\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\n        <item name=\"android:textColorSecondary\">@android:color/white</item>\n    </style>\n\n    <style name=\"mime_ll_setting\">\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:background\">@drawable/selector_item</item>\n        <item name=\"android:gravity\">center_vertical</item>\n        <item name=\"android:paddingBottom\">10dp</item>\n        <item name=\"android:paddingTop\">10dp</item>\n    </style>\n\n    <style name=\"mime_iv_setting\">\n        <item name=\"android:layout_width\">wrap_content</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:layout_marginLeft\">@dimen/activity_horizontal_margin</item>\n    </style>\n\n    <style name=\"mime_tv_setting\">\n        <item name=\"android:layout_width\">wrap_content</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:layout_marginLeft\">@dimen/activity_horizontal_margin</item>\n        <item name=\"android:textColor\">@android:color/black</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/values.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item name=\"v_content\" type=\"id\" />\n    <item name=\"v_loading\" type=\"id\" />\n    <item name=\"v_error\" type=\"id\" />\n    <item name=\"v_empty\" type=\"id\" />\n</resources>"
  },
  {
    "path": "app/src/main/res/values-en/ssdk_oks_strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"ssdk_oks_share\">Share</string>\n    <string name=\"ssdk_oks_sharing\">Sharing operation is working in the background…</string>\n    <string name=\"ssdk_oks_share_failed\">Operation failed</string>\n    <string name=\"ssdk_oks_share_completed\">Operation succeeded</string>\n    <string name=\"ssdk_oks_share_canceled\">Operation canceled</string>\n    <string name=\"ssdk_oks_cancel\">Cancel</string>\n    <string name=\"ssdk_oks_multi_share\">Photo Sharing</string>\n    <string name=\"ssdk_oks_confirm\">Confirm</string>\n    <string name=\"ssdk_oks_contacts\">Contacts</string>\n    <string name=\"ssdk_oks_pull_to_refresh\">Pull down to refresh</string>\n\t<string name=\"ssdk_oks_release_to_refresh\">Release to refresh</string>\n\t<string name=\"ssdk_oks_refreshing\">Refreshing…</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-en/ssdk_strings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string name=\"ssdk_weibo_oauth_regiseter\">Authorization</string>\n    <string name=\"ssdk_website\">http://www.mob.com</string>\n    <string name=\"ssdk_weibo_upload_content\">分享图片</string>\n    <string name=\"ssdk_wechat_client_inavailable\">Wechat client not exists or the version is too low</string>\n    <string name=\"ssdk_google_plus_client_inavailable\">Google+ client not exists or the version is too low</string>\n    <string name=\"ssdk_qq_client_inavailable\">Mobile QQ client not exists or the version is too low</string>\n    <string name=\"ssdk_pinterest_client_inavailable\">Pinterest client not exists or the version is too low</string>\n    <string name=\"ssdk_instagram_client_inavailable\">Instagram client not exists or the version is too low</string>\n    <string name=\"ssdk_yixin_client_inavailable\">Yixin client not exists or the version is too low</string>\n    <string name=\"ssdk_line_client_inavailable\">Line client not exists or the version is too low</string>\n    <string name=\"ssdk_kakaotalk_client_inavailable\">KakaoTalk client not exists or the version is too low</string>\n    <string name=\"ssdk_kakaostory_client_inavailable\">KakaoStory client not exists or the version is too low</string>\n    <string name=\"ssdk_whatsapp_client_inavailable\">WhatsApp client not exists or the version is too low</string>\n    <string name=\"ssdk_laiwang_client_inavailable\">Laiwangs client not exists or the version is too low</string>\n    <string name=\"ssdk_alipay_client_inavailable\">Alipay client not exists or the version is too low</string>\n    <string name=\"ssdk_facebookmessenger_client_inavailable\">Facebookmessenger client not exists or the version is too low</string>\n    \n\t<string name=\"ssdk_sinaweibo\">Sina Weibo</string>\n\t<string name=\"ssdk_tencentweibo\">Tencent Weibo</string>\n\t<string name=\"ssdk_qzone\">QZone</string>\n\t<string name=\"ssdk_wechat\">WeChat</string>\n\t<string name=\"ssdk_wechatmoments\">WeChat Moments</string>\n\t<string name=\"ssdk_wechatfavorite\">WeChat Favorites</string>\n\t<string name=\"ssdk_facebook\">Facebook</string>\n\t<string name=\"ssdk_twitter\">Twitter</string>\n\t<string name=\"ssdk_renren\">Renren</string>\n\t<string name=\"ssdk_kaixin\">Kaixin</string>\n\t<string name=\"ssdk_email\">Email</string>\n\t<string name=\"ssdk_shortmessage\">Short Message</string>\n\t<string name=\"ssdk_sohumicroblog\">Sohu Microblog</string>\n\t<string name=\"ssdk_neteasemicroblog\">Netease Microblog</string>\n\t<string name=\"ssdk_douban\">Douban</string>\n\t<string name=\"ssdk_youdao\">Youdao</string>\n\t<string name=\"ssdk_evernote\">Evernote</string>\n\t<string name=\"ssdk_linkedin\">Linked in</string>\n\t<string name=\"ssdk_googleplus\">Google+</string>\n\t<string name=\"ssdk_foursquare\">FourSquare</string>\n\t<string name=\"ssdk_qq\">QQ</string>\n\t<string name=\"ssdk_sohusuishenkan\">Sohu Suishenkan</string>\n\t<string name=\"ssdk_pinterest\">Pinterest</string>\n\t<string name=\"ssdk_flickr\">Flickr</string>\n\t<string name=\"ssdk_tumblr\">Tumblr</string>\n\t<string name=\"ssdk_dropbox\">Dropbox</string>\n\t<string name=\"ssdk_vkontakte\">VK</string>\n\t<string name=\"ssdk_instagram\">Instagram</string>\n\t<string name=\"ssdk_yixin\">Yixin</string>\n\t<string name=\"ssdk_yixinmoments\">Yixin Moments</string>\n\t<string name=\"ssdk_mingdao\">Mingdao</string>\n\t<string name=\"ssdk_kakaotalk\">KakaoTalk</string>\n\t<string name=\"ssdk_kakaostory\">KakaoStory</string>\n\t<string name=\"ssdk_line\">Line</string>\n\t<string name=\"ssdk_bluetooth\">Bluetooth</string>\n\t<string name=\"ssdk_whatsapp\">WhatsApp</string>\n    <string name=\"ssdk_pocket\">Pocket</string>\n    <string name=\"ssdk_instapaper\">Instapaper</string>\n\t<string name=\"ssdk_instapaper_email\">Email</string>\n\t<string name=\"ssdk_instapaper_pwd\">Password</string>\n\t<string name=\"ssdk_instapaper_login\">Sign In</string>\n    <string name=\"ssdk_instapaper_logining\">Sign In…</string>\n\t<string name=\"ssdk_instapager_email_or_password_incorrect\">Email or Password incorrect</string>\n    <string name=\"ssdk_facebookmessenger\">Facebook Messenger</string>\n    <string name=\"ssdk_laiwang\">Laiwang</string>\n    <string name=\"ssdk_laiwangmoments\">Laiwang Moments</string>\n    <string name=\"ssdk_alipay\">Alipay</string>\n    <string name=\"ssdk_alipaymoments\">Alipay Moments</string>\n    <string name=\"ssdk_plurk\">Plurk</string>\n\n\t<string name=\"ssdk_share_to_qzone\">Share To QZone</string>\n\t<string name=\"ssdk_share_to_qq\">Share To QQ</string>\n\t<string name=\"ssdk_share_to_googleplus\">Share To Google+</string>\n\t<string name=\"ssdk_share_to_facebook\">Share To Facebook</string>\n\t<string name=\"ssdk_mingdao_share_content\">Share webpage</string>\n\t<string name=\"ssdk_share_to_mingdao\">Share To Mingdao</string>\n\t<string name=\"ssdk_share_to_qzone_default\">Shared from %s</string>\n\t<string name=\"ssdk_use_login_button\">use login button instead</string>\n</resources>"
  },
  {
    "path": "app/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/test/java/com/ittianyu/pocenter/ExampleUnitTest.java",
    "content": "package com.ittianyu.pocenter;\n\nimport com.ittianyu.pocenter.common.utils.UnsafeOkHttpUtils;\nimport com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;\n\nimport org.junit.Test;\n\nimport java.io.IOException;\n\nimport io.reactivex.Observable;\nimport io.reactivex.functions.Consumer;\nimport okhttp3.ResponseBody;\nimport retrofit2.Retrofit;\nimport retrofit2.http.GET;\nimport retrofit2.http.Query;\n\nimport static org.junit.Assert.assertEquals;\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        public static final String HOST = \"po.ittianyu.com\";\n    public static final String URL_BASE = \"https://\" + HOST + \"/\";\n//    public static final String HOST = \"192.168.1.106\";\n//    public static final String URL_BASE = \"http://\" + HOST + \"/pocenter/\";\n\n    interface RemoteApi {\n        @GET(\"list\")\n        Observable<ResponseBody> getList(@Query(\"start\") int start, @Query(\"count\") int count,\n                           @Query(\"type\") int[] types, @Query(\"status\") int status,\n                           @Query(value = \"keyword\") String[] keywords);\n    }\n\n\n    @Test\n    public void testSearch() throws IOException {\n        RemoteApi remoteApi = new Retrofit.Builder()\n                .baseUrl(URL_BASE)\n                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())\n//                .addConverterFactory(GsonConverterFactory.create())\n                .client(UnsafeOkHttpUtils.getClient())\n                .build()\n                .create(RemoteApi.class);\n        remoteApi.getList(0, 20, null, 0, new String[]{\"微信\"})\n                .subscribe(new Consumer<ResponseBody>() {\n                    @Override\n                    public void accept(ResponseBody responseBody) throws Exception {\n                        String string = responseBody.string();\n                        System.out.println(string);\n                    }\n                }, new Consumer<Throwable>() {\n                    @Override\n                    public void accept(Throwable throwable) throws Exception {\n                        throwable.printStackTrace();\n                    }\n                });\n\n    }\n\n    @Test\n    public void addition_isCorrect() throws Exception {\n        assertEquals(4, 2 + 2);\n    }\n}"
  },
  {
    "path": "app/tinkerpatch.gradle",
    "content": "apply plugin: 'tinkerpatch-support'\n\ndef bakPath = file(\"${buildDir}/bakApk/\")\n\ndef baseInfo = \"app-0115-23-11-20\"\ndef variantName = \"debug\"\n\n/**\n * 对于插件各参数的详细解析请参考\n * http://tinkerpatch.com/Docs/SDK\n */\ntinkerpatchSupport {\n    /** 可以在debug的时候关闭 tinkerPatch **/\n    tinkerEnable = false\n    reflectApplication = true\n\n    autoBackupApkPath = \"${bakPath}\"\n\n    appKey = \"1ff86eb14499a4d9\"\n    appVersion = \"1.0.0\"\n\n    def pathPrefix = \"${bakPath}/${baseInfo}/${variantName}/\"\n    def name = \"${project.name}-${variantName}\"\n\n    baseApkFile = \"${pathPrefix}/${name}.apk\"\n    baseProguardMappingFile = \"${pathPrefix}/${name}-mapping.txt\"\n    baseResourceRFile = \"${pathPrefix}/${name}-R.txt\"\n\n//    baseApkFile = \"G:/大学学习记录/工作室产品/外包集中营/安装包/app-1.0.0-0121-22-56-37/pocenter_baidu_1.0.0.apk\"\n//    baseProguardMappingFile = \"G:/大学学习记录/工作室产品/外包集中营/安装包/app-1.0.0-0121-22-56-37/app-release-mapping.txt\"\n//    baseResourceRFile = \"G:/大学学习记录/工作室产品/外包集中营/安装包/app-1.0.0-0121-22-56-37/app-release-R.txt\"\n\n    /** 若有编译多flavors需求,可在flavors中覆盖以下参数\n     *  你也可以直接通过tinkerPatchAllFlavorDebug/tinkerPatchAllFlavorRelease, 一次编译所有的flavor补丁包\n     *  注意的是:除非你不同的flavor代码是不一样的,不然建议采用zip comment或者文件方式生成渠道信息\n     **/\n//    productFlavors {\n//        flavor {\n//            flavorName = \"tianyu\"\n//            appVersion = \"${tinkerpatchSupport.appVersion}_${flavorName}\"\n//\n//            pathPrefix = \"${bakPath}/${baseInfo}/${flavorName}${variantName}/\"\n//            name = \"${project.name}-${flavorName}${variantName}\"\n//\n//            baseApkFile = \"${pathPrefix}/${name}.apk\"\n//            baseProguardMappingFile = \"${pathPrefix}/${name}-mapping.txt\"\n//            baseResourceRFile = \"${pathPrefix}/${name}-R.txt\"\n//        }\n//\n//        flavor {\n//            flavorName = \"flavor2\"\n//            appVersion = \"${tinkerpatchSupport.appVersion}_${flavorName}\"\n//\n//            pathPrefix = \"${bakPath}/${baseInfo}/${flavorName}${variantName}/\"\n//            name = \"${project.name}-${flavorName}${variantName}\"\n//\n//            baseApkFile = \"${pathPrefix}/${name}.apk\"\n//            baseProguardMappingFile = \"${pathPrefix}/${name}-mapping.txt\"\n//            baseResourceRFile = \"${pathPrefix}/${name}-R.txt\"\n//        }\n//    }\n}\n\n/**\n * 用于用户在代码中判断tinkerPatch是否被使能\n */\nandroid {\n    defaultConfig {\n        buildConfigField \"boolean\", \"TINKER_ENABLE\", \"${tinkerpatchSupport.tinkerEnable}\"\n    }\n}\n\n/**\n * 一般来说,我们无需对下面的参数做任何的修改\n * 对于各参数的详细介绍请参考:\n * https://github.com/Tencent/tinker/wiki/Tinker-%E6%8E%A5%E5%85%A5%E6%8C%87%E5%8D%97\n */\ntinkerPatch {\n    ignoreWarning = false\n    useSign = true\n    dex {\n        dexMode = \"jar\"\n        pattern = [\"classes*.dex\"]\n        loader = []\n    }\n    lib {\n        pattern = [\"lib/*/*.so\"]\n    }\n\n    res {\n        pattern = [\"res/*\", \"r/*\", \"assets/*\", \"resources.arsc\", \"AndroidManifest.xml\"]\n        ignoreChange = []\n        largeModSize = 100\n    }\n\n    packageConfig {\n    }\n    sevenZip {\n        zipArtifact = \"com.tencent.mm:SevenZip:1.1.10\"\n//        path = \"/usr/local/bin/7za\"\n    }\n    buildConfig {\n        keepDexApply = false\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.2.3'\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n        // TinkerPatch 插件\n        classpath \"com.tinkerpatch.sdk:tinkerpatch-gradle-plugin:1.1.0\"\n    }\n}\n\nallprojects {\n    repositories {\n        jcenter()\n        maven { url \"https://jitpack.io\" }\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Mon Dec 28 10:00:20 PST 2015\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-2.14.1-all.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\norg.gradle.jvmargs=-Xmx1536m\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windowz variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\ngoto execute\n\n:4NT_args\n@rem Get arguments from the 4NT Shell from JP Software\nset CMD_LINE_ARGS=%$\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app'\n"
  }
]