[
  {
    "path": "LiveCircle/.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": "LiveCircle/.idea/compiler.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CompilerConfiguration\">\n    <resourceExtensions />\n    <wildcardResourcePatterns>\n      <entry name=\"!?*.java\" />\n      <entry name=\"!?*.form\" />\n      <entry name=\"!?*.class\" />\n      <entry name=\"!?*.groovy\" />\n      <entry name=\"!?*.scala\" />\n      <entry name=\"!?*.flex\" />\n      <entry name=\"!?*.kt\" />\n      <entry name=\"!?*.clj\" />\n      <entry name=\"!?*.aj\" />\n    </wildcardResourcePatterns>\n    <annotationProcessing>\n      <profile default=\"true\" name=\"Default\" enabled=\"false\">\n        <processorPath useClasspath=\"true\" />\n      </profile>\n    </annotationProcessing>\n  </component>\n</project>"
  },
  {
    "path": "LiveCircle/.idea/copyright/profiles_settings.xml",
    "content": "<component name=\"CopyrightManager\">\n  <settings default=\"\" />\n</component>"
  },
  {
    "path": "LiveCircle/.idea/encodings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\">\n    <file url=\"PROJECT\" charset=\"UTF-8\" />\n  </component>\n</project>"
  },
  {
    "path": "LiveCircle/.idea/gradle.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"GradleSettings\">\n    <option name=\"linkedExternalProjectsSettings\">\n      <GradleProjectSettings>\n        <option name=\"distributionType\" value=\"DEFAULT_WRAPPED\" />\n        <option name=\"externalProjectPath\" value=\"$PROJECT_DIR$\" />\n        <option name=\"modules\">\n          <set>\n            <option value=\"$PROJECT_DIR$\" />\n            <option value=\"$PROJECT_DIR$/app\" />\n          </set>\n        </option>\n        <option name=\"resolveModulePerSourceSet\" value=\"false\" />\n      </GradleProjectSettings>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": "LiveCircle/.idea/inspectionProfiles/Project_Default.xml",
    "content": "<component name=\"InspectionProjectProfileManager\">\n  <profile version=\"1.0\">\n    <option name=\"myName\" value=\"Project Default\" />\n    <inspection_tool class=\"AndroidLintGradleCompatible\" enabled=\"false\" level=\"ERROR\" enabled_by_default=\"false\" />\n    <inspection_tool class=\"AndroidLintNewApi\" enabled=\"false\" level=\"ERROR\" enabled_by_default=\"false\" />\n    <inspection_tool class=\"LoggerInitializedWithForeignClass\" enabled=\"false\" level=\"WARNING\" enabled_by_default=\"false\">\n      <option name=\"loggerClassName\" value=\"org.apache.log4j.Logger,org.slf4j.LoggerFactory,org.apache.commons.logging.LogFactory,java.util.logging.Logger\" />\n      <option name=\"loggerFactoryMethodName\" value=\"getLogger,getLogger,getLog,getLogger\" />\n    </inspection_tool>\n  </profile>\n</component>"
  },
  {
    "path": "LiveCircle/.idea/inspectionProfiles/profiles_settings.xml",
    "content": "<component name=\"InspectionProjectProfileManager\">\n  <settings>\n    <option name=\"PROJECT_PROFILE\" value=\"Project Default\" />\n    <option name=\"USE_PROJECT_PROFILE\" value=\"true\" />\n    <version value=\"1.0\" />\n  </settings>\n</component>"
  },
  {
    "path": "LiveCircle/.idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"EntryPointsManager\">\n    <entry_points version=\"2.0\" />\n  </component>\n  <component name=\"NullableNotNullManager\">\n    <option name=\"myDefaultNullable\" value=\"android.support.annotation.Nullable\" />\n    <option name=\"myDefaultNotNull\" value=\"android.support.annotation.NonNull\" />\n    <option name=\"myNullables\">\n      <value>\n        <list size=\"4\">\n          <item index=\"0\" class=\"java.lang.String\" itemvalue=\"org.jetbrains.annotations.Nullable\" />\n          <item index=\"1\" class=\"java.lang.String\" itemvalue=\"javax.annotation.Nullable\" />\n          <item index=\"2\" class=\"java.lang.String\" itemvalue=\"edu.umd.cs.findbugs.annotations.Nullable\" />\n          <item index=\"3\" class=\"java.lang.String\" itemvalue=\"android.support.annotation.Nullable\" />\n        </list>\n      </value>\n    </option>\n    <option name=\"myNotNulls\">\n      <value>\n        <list size=\"4\">\n          <item index=\"0\" class=\"java.lang.String\" itemvalue=\"org.jetbrains.annotations.NotNull\" />\n          <item index=\"1\" class=\"java.lang.String\" itemvalue=\"javax.annotation.Nonnull\" />\n          <item index=\"2\" class=\"java.lang.String\" itemvalue=\"edu.umd.cs.findbugs.annotations.NonNull\" />\n          <item index=\"3\" class=\"java.lang.String\" itemvalue=\"android.support.annotation.NonNull\" />\n        </list>\n      </value>\n    </option>\n  </component>\n  <component name=\"ProjectLevelVcsManager\" settingsEditedManually=\"false\">\n    <OptionsSetting value=\"true\" id=\"Add\" />\n    <OptionsSetting value=\"true\" id=\"Remove\" />\n    <OptionsSetting value=\"true\" id=\"Checkout\" />\n    <OptionsSetting value=\"true\" id=\"Update\" />\n    <OptionsSetting value=\"true\" id=\"Status\" />\n    <OptionsSetting value=\"true\" id=\"Edit\" />\n    <ConfirmationsSetting value=\"0\" id=\"Add\" />\n    <ConfirmationsSetting value=\"0\" id=\"Remove\" />\n  </component>\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_1_7\" default=\"true\" assert-keyword=\"true\" jdk-15=\"true\" project-jdk-name=\"1.8\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"ProjectType\">\n    <option name=\"id\" value=\"Android\" />\n  </component>\n  <component name=\"masterDetails\">\n    <states>\n      <state key=\"ProjectJDKs.UI\">\n        <settings>\n          <last-edited>1.8</last-edited>\n          <splitter-proportions>\n            <option name=\"proportions\">\n              <list>\n                <option value=\"0.2\" />\n              </list>\n            </option>\n          </splitter-proportions>\n        </settings>\n      </state>\n    </states>\n  </component>\n</project>"
  },
  {
    "path": "LiveCircle/.idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/LiveCircle.iml\" filepath=\"$PROJECT_DIR$/LiveCircle.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/app/app.iml\" filepath=\"$PROJECT_DIR$/app/app.iml\" />\n    </modules>\n  </component>\n</project>"
  },
  {
    "path": "LiveCircle/.idea/runConfigurations.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"RunConfigurationProducerService\">\n    <option name=\"ignoredProducers\">\n      <set>\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer\" />\n        <option value=\"org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer\" />\n      </set>\n    </option>\n  </component>\n</project>"
  },
  {
    "path": "LiveCircle/app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "LiveCircle/app/build.gradle",
    "content": "apply plugin: 'com.android.application'\napply plugin: 'com.neenbedankt.android-apt'\nandroid {\n    compileSdkVersion 25\n    buildToolsVersion \"25.0.2\"\n    defaultConfig {\n        applicationId \"com.lvr.livecircle\"\n        minSdkVersion 15\n        targetSdkVersion 25\n        versionCode 1\n        versionName \"1.0\"\n        testInstrumentationRunner \"android.support.test.runner.AndroidJUnitRunner\"\n    }\n    buildTypes {\n        release {\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n    }\n}\n\ndependencies {\n    compile fileTree(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    compile 'com.android.support:design:25.1.0'\n    //视图绑定 butterknife\n    compile 'com.jakewharton:butterknife:8.4.0'\n    apt 'com.jakewharton:butterknife-compiler:8.4.0'\n    compile 'de.greenrobot:eventbus:3.0.0-beta1'\n    //引入okhttp\n    compile 'com.squareup.okhttp3:okhttp:3.5.0'\n    //引入retrofit\n    compile 'com.squareup.retrofit2:retrofit:2.1.0'\n    //引入rxjava\n    compile 'io.reactivex.rxjava2:rxjava:2.0.4'\n    //引入Log拦截器，方便DEBUG模式输出log信息\n    compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'\n    //引入rxjava适配器，方便rxjava与retrofit的结合\n    compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'\n    //引入json转换器，方便将返回的数据转换为json格式\n    compile 'com.squareup.retrofit2:converter-gson:2.1.0'\n    //引入rxandroid\n    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'\n    compile 'com.github.bumptech.glide:glide:3.7.0'\n    compile 'com.android.support:cardview-v7:25.1.0'\n    compile 'com.android.support:recyclerview-v7:25.1.0'\n    compile 'com.github.Aspsine:IRecyclerView:0.0.5'\n}\n"
  },
  {
    "path": "LiveCircle/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:\\AndroidStudio\\SDKinstallpackage/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "LiveCircle/app/src/androidTest/java/com/lvr/livecircle/ExampleInstrumentedTest.java",
    "content": "package com.lvr.livecircle;\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.lvr.livecircle\", appContext.getPackageName());\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          package=\"com.lvr.livecircle\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\"/>\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>\n    <uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"></uses-permission>\n    <uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"></uses-permission>\n\n    <application\n        android:name=\".app.AppApplication\"\n        android:allowBackup=\"true\"\n        android:icon=\"@drawable/icon\"\n        android:label=\"@string/app_name\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n        <activity\n            android:theme=\"@style/AppTheme.Launcher\"\n            android:name=\".home.SplashActivity\"\n            android:configChanges=\"orientation|keyboardHidden|screenSize|screenLayout\">\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=\".home.MainActivity\"></activity>\n        <activity android:name=\".news.activity.NewsChannelActivity\"></activity>\n        <activity android:name=\".news.activity.NewsDetailActivity\"></activity>\n        <activity android:name=\".news.activity.NewsPhotoDetailActivity\"></activity>\n    </application>\n\n</manifest>"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/adapter/CardAdapter.java",
    "content": "package com.lvr.livecircle.adapter;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.news.model.bean.NewsPhotoDetail;\nimport com.lvr.livecircle.recycleviewcardgallery.CardAdapterHelper;\nimport com.lvr.livecircle.utils.ImageLoaderUtils;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n\n/**\n * Created by lvr on 2017/2/6.\n */\npublic class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> {\n    private List<NewsPhotoDetail.Picture> mList = new ArrayList<>();\n    private CardAdapterHelper mCardAdapterHelper = new CardAdapterHelper();\n    private Context mContext;\n    public CardAdapter(Context context,List<NewsPhotoDetail.Picture> mList) {\n        this.mList = mList;\n        this.mContext = context;\n    }\n\n    @Override\n    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_card_view, parent, false);\n        mCardAdapterHelper.onCreateViewHolder(parent, itemView);\n        return new ViewHolder(itemView);\n    }\n\n    @Override\n    public void onBindViewHolder(final ViewHolder holder, final int position) {\n        mCardAdapterHelper.onBindViewHolder(holder.itemView, position, getItemCount());\n        ImageLoaderUtils.displayBigPhoto(mContext,holder.mImageView,mList.get(position).getImgSrc());\n    }\n\n    @Override\n    public int getItemCount() {\n        return mList.size();\n    }\n\n    public class ViewHolder extends RecyclerView.ViewHolder {\n        public final ImageView mImageView;\n\n        public ViewHolder(final View itemView) {\n            super(itemView);\n            mImageView = (ImageView) itemView.findViewById(R.id.imageView);\n        }\n\n    }\n\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/adapter/HomeViewPagerAdapter.java",
    "content": "package com.lvr.livecircle.adapter;\n\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\n\nimport com.lvr.livecircle.base.BaseFragmentAdapter;\n\nimport java.util.List;\n\n/**\n * Created by lvr on 2017/2/6.\n */\n\npublic class HomeViewPagerAdapter extends BaseFragmentAdapter {\n    public HomeViewPagerAdapter(FragmentManager fm, List<Fragment> fragmentList, List<String> mTitles) {\n        super(fm, fragmentList, mTitles);\n    }\n\n    public HomeViewPagerAdapter(FragmentManager fm, List<Fragment> fragmentList) {\n        super(fm, fragmentList);\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/adapter/NewsChannelAdapter.java",
    "content": "package com.lvr.livecircle.adapter;\n\nimport android.content.Context;\nimport android.support.v7.widget.CardView;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.bean.ChannelBean;\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\nimport com.lvr.livecircle.widget.ItemDragHelperCallback;\n\nimport java.util.Collections;\nimport java.util.List;\n\nimport de.greenrobot.event.EventBus;\n\n/**\n * Created by lvr on 2017/2/14.\n */\n\npublic class NewsChannelAdapter extends RecyclerView.Adapter<NewsChannelAdapter.ChannelViewHolder> implements ItemDragHelperCallback.OnItemMoveListener {\n    private final Context context;\n    private final LayoutInflater inflater;\n    private List<NewsChannelTable> mTables;\n    private ItemDragHelperCallback mItemDragHelperCallback;\n    private OnItemClickListener mOnItemClickListener;\n\n    public NewsChannelAdapter(Context context, List<NewsChannelTable> tables) {\n        this.context = context;\n        this.mTables = tables;\n        this.inflater = LayoutInflater.from(context);\n    }\n\n    public void setItemDragHelperCallback(ItemDragHelperCallback itemDragHelperCallback) {\n        mItemDragHelperCallback = itemDragHelperCallback;\n    }\n\n    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {\n        mOnItemClickListener = onItemClickListener;\n    }\n\n    @Override\n    public ChannelViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        return new ChannelViewHolder(inflater.inflate(R.layout.item_channel_card, parent, false));\n    }\n\n    @Override\n    public void onBindViewHolder(ChannelViewHolder holder, int position) {\n        NewsChannelTable table = mTables.get(position);\n        holder.mTextView.setText(table.getNewsChannelName());\n        holder.mImageView.setImageResource(table.getImgRes());\n        handleLongPress(holder, table);\n        handleOnClick(holder, table);\n    }\n\n    //处理点击事件\n    private void handleOnClick(final ChannelViewHolder holder, final NewsChannelTable table) {\n        if (mOnItemClickListener != null) {\n            holder.mLayout.setOnClickListener(new View.OnClickListener() {\n                @Override\n                public void onClick(View view) {\n\n                    if (!table.getNewsChannelFixed()) {\n                        //对项目点击后增删操作的监听\n                        mOnItemClickListener.onItemClick(view, holder.getLayoutPosition());\n                    }\n                }\n            });\n        }\n    }\n\n    //处理长按事件 开启ItemDragHelperCallBack拖拽\n    private void handleLongPress(ChannelViewHolder holder, final NewsChannelTable table) {\n        if (mItemDragHelperCallback != null) {\n            holder.mLayout.setOnTouchListener(new View.OnTouchListener() {\n                @Override\n                public boolean onTouch(View v, MotionEvent event) {\n                    mItemDragHelperCallback.setLongPressEnabled(table.getNewsChannelIndex() == 0 ? false : true);\n                    return false;\n                }\n            });\n        }\n    }\n\n    @Override\n    public int getItemCount() {\n        return mTables.size();\n    }\n\n    @Override\n    public boolean onItemMove(int fromPosition, int toPosition) {\n        if (isChannelFixed(fromPosition, toPosition)) {\n            return false;\n        }\n        //在我的频道子频道的移动\n        Collections.swap(getAdapterData(), fromPosition, toPosition);\n        notifyItemMoved(fromPosition, toPosition);\n        //通知顺序变换，存储，设置频道顺序，以及显示的顺序\n        System.out.println(\"发送移动的消息\");\n        EventBus.getDefault().post(new ChannelBean(getAdapterData()));\n        return true;\n    }\n\n    //不能移动头条\n    private boolean isChannelFixed(int fromPosition, int toPosition) {\n        return fromPosition == 0 || toPosition == 0;\n    }\n\n    public class ChannelViewHolder extends RecyclerView.ViewHolder {\n        private TextView mTextView;\n        private ImageView mImageView;\n        private CardView mCardView;\n        private RelativeLayout mLayout;\n\n        public ChannelViewHolder(View itemView) {\n            super(itemView);\n            mImageView = (ImageView) itemView.findViewById(R.id.iv_channel_logo);\n            mTextView = (TextView) itemView.findViewById(R.id.tv_channel_name);\n            mCardView = (CardView) itemView.findViewById(R.id.cardView);\n            mLayout = (RelativeLayout) itemView.findViewById(R.id.rl_root);\n        }\n    }\n\n    public List<NewsChannelTable> getAdapterData() {\n        return mTables;\n    }\n\n    //Item点击事件的监听接口\n    public interface OnItemClickListener {\n        void onItemClick(View view, int position);\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/adapter/NewsChannelGridAdapter.java",
    "content": "package com.lvr.livecircle.adapter;\n\nimport android.content.Context;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.BaseAdapter;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\n\nimport java.util.List;\n\n/**\n * Created by lvr on 2017/2/7.\n */\n\npublic class NewsChannelGridAdapter extends BaseAdapter {\n    private List<NewsChannelTable> mTables;\n    private Context mContext;\n    private LayoutInflater mInflater;\n\n    public NewsChannelGridAdapter(List<NewsChannelTable> mTables, Context context) {\n        this.mTables = mTables;\n        this.mContext = context;\n        mInflater = LayoutInflater.from(mContext);\n    }\n\n    @Override\n    public int getCount() {\n        return mTables.size();\n    }\n\n    @Override\n    public Object getItem(int i) {\n        return mTables.get(i);\n    }\n\n    @Override\n    public long getItemId(int i) {\n        return i;\n    }\n\n    @Override\n    public View getView(int position, View convertView, ViewGroup group) {\n        View view = null;\n        ViewHolder viewHolder;\n        if(convertView==null){\n            viewHolder = new ViewHolder();\n            view = mInflater.inflate(R.layout.item_grid_news_channel,group,false);\n            viewHolder.mImageView = (ImageView) view.findViewById(R.id.iv_channel_logo);\n            viewHolder.mTextView= (TextView) view.findViewById(R.id.tv_channel_name);\n            view.setTag(viewHolder);\n        }else{\n           view =  convertView;\n           viewHolder = (ViewHolder) view.getTag();\n        }\n        viewHolder.mImageView.setImageResource(mTables.get(position).getImgRes());\n        viewHolder.mTextView.setText(mTables.get(position).getNewsChannelName());\n        return view;\n    }\n\n    public static class ViewHolder {\n        ImageView mImageView;\n        TextView mTextView;\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/adapter/NewsListAdapter.java",
    "content": "package com.lvr.livecircle.adapter;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\nimport android.text.TextUtils;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.AdapterView;\nimport android.widget.GridView;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.bean.NewsInfo;\nimport com.lvr.livecircle.home.MainActivity;\nimport com.lvr.livecircle.news.activity.NewsChannelActivity;\nimport com.lvr.livecircle.news.activity.NewsDetailActivity;\nimport com.lvr.livecircle.news.activity.NewsPhotoDetailActivity;\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\nimport com.lvr.livecircle.news.model.bean.NewsPhotoDetail;\nimport com.lvr.livecircle.utils.DisplayUtil;\nimport com.lvr.livecircle.utils.ImageLoaderUtils;\nimport com.lvr.livecircle.utils.ToastUitl;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport static com.lvr.livecircle.R.id.news_summary_photo_iv_group;\n\n/**\n * Created by lvr on 2017/2/8.\n */\n\npublic class NewsListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {\n    private final Context context;\n    private final LayoutInflater inflater;\n    private List<NewsInfo> list ;\n    private List<NewsChannelTable> mTables;\n    //新闻模式\n    private static final int TYPE_SINGLE = 0;\n    //图集模式\n    private static final int TYPE_MULTI = 1;\n    //头布局模式\n    private static final int TYPE_HEADER = 2;\n    //尾布局模式\n    private static final int TYPE_FOOT = 3;\n    //新闻频道切换监听\n    private OnNewsChannelListener mNewsChannelListener;\n\n    public NewsListAdapter(Context context, List<NewsInfo> list, List<NewsChannelTable> tables) {\n        this.context = context;\n        this.list = list;\n        this.mTables = tables;\n        this.inflater = LayoutInflater.from(context);\n    }\n\n    @Override\n    public int getItemViewType(int position) {\n        NewsInfo info = list.get(position);\n        if(info.getTitle().endsWith(\"头布局\")){\n            return TYPE_HEADER;\n        }\n\n        if (!TextUtils.isEmpty(info.getDigest()))\n        {\n            return TYPE_SINGLE;\n        }\n        return TYPE_MULTI;\n    }\n\n    @Override\n    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        switch (viewType) {\n            case TYPE_SINGLE:\n                return new SingleViewHolder(inflater.inflate(R.layout.item_news, parent, false));\n            case TYPE_MULTI:\n                return new MultiViewHolder(inflater.inflate(R.layout.item_news_photo, parent, false));\n            case TYPE_HEADER:\n                return new HeaderViewHolder(inflater.inflate(R.layout.item_news_header,parent,false));\n\n        }\n        return null;\n    }\n\n    @Override\n    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {\n        //新闻模式\n        if (holder instanceof SingleViewHolder) {\n            setNormalItemValues((SingleViewHolder) holder,position);\n        }else if(holder instanceof  MultiViewHolder){\n            setMultiItemValues((MultiViewHolder) holder,position);\n        }else if(holder instanceof HeaderViewHolder){\n            setHeaderItemValues((HeaderViewHolder) holder);\n        }\n    }\n\n\n\n    //设置头布局的值\n    private void setHeaderItemValues(HeaderViewHolder holder) {\n        NewsChannelGridAdapter mAdapter = new NewsChannelGridAdapter(mTables, context);\n        holder.mGridView.setAdapter(mAdapter);\n        //解决GridView只显示一行的原因 主动设置GridView的高度\n        ViewGroup.LayoutParams params = holder.mGridView.getLayoutParams();\n        View view = mAdapter.getView(0, null, holder.mGridView);\n        view.measure(0,0);\n        int height =view.getMeasuredHeight();\n        int totalHeight = holder.mGridView.getVerticalSpacing() * 2 + height * 2;\n        params.height = totalHeight;\n        holder.mGridView.setLayoutParams(params);\n    }\n\n    @Override\n    public int getItemCount() {\n        return list.size();\n    }\n\n    //新闻模式下item值的设置\n    private void setNormalItemValues(final SingleViewHolder holder, int position) {\n        final NewsInfo newsInfo = list.get(position);\n        String title = newsInfo.getTitle();\n        final String content = newsInfo.getDigest();\n        String time = newsInfo.getPtime();\n        String imgsrc = newsInfo.getImgsrc();\n        holder.mTitle.setText(title==null?\"新闻头条\":title);\n        holder.mContent.setText(content);\n        holder.mTime.setText(time);\n        ImageLoaderUtils.display(context,holder.mImageView,imgsrc);\n        holder.mLayout.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                NewsDetailActivity.startAction(context,holder.mImageView,newsInfo.getPostid(),newsInfo.getImgsrc());\n            }\n        });\n    }\n\n    //图集模式下item值的设置\n    private void setMultiItemValues(MultiViewHolder holder, int position) {\n        final NewsInfo newsInfo = list.get(position);\n        String title = newsInfo.getTitle();\n        String time = newsInfo.getPtime();\n        holder.mTitle.setText(title==null?\"新闻头条\":title);\n        holder.mTime.setText(time);\n        setImageView(holder,newsInfo);\n        holder.mRoot.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                NewsPhotoDetailActivity.startAction(context,getPhotoDetail(newsInfo));\n            }\n        });\n    }\n\n    private NewsPhotoDetail getPhotoDetail(NewsInfo info) {\n        NewsPhotoDetail newsPhotoDetail = new NewsPhotoDetail();\n        newsPhotoDetail.setTitle(info.getTitle());\n        setPictures(info, newsPhotoDetail);\n        return newsPhotoDetail;\n    }\n\n    private void setPictures(NewsInfo info, NewsPhotoDetail detail) {\n        List<NewsPhotoDetail.Picture> pictureList = new ArrayList<>();\n        if (info.getAds() != null) {\n            for (NewsInfo.AdsBean entity : info.getAds()) {\n                setValuesAndAddToList(pictureList, entity.getTitle(), entity.getImgsrc());\n            }\n        } else if (info.getImgextra() != null) {\n            for (NewsInfo.ImgextraBean entity : info.getImgextra()) {\n                setValuesAndAddToList(pictureList, null, entity.getImgsrc());\n            }\n        } else {\n            setValuesAndAddToList(pictureList, null, info.getImgsrc());\n        }\n\n        detail.setPictures(pictureList);\n    }\n\n    private void setValuesAndAddToList(List<NewsPhotoDetail.Picture> list, String title, String imgsrc) {\n        NewsPhotoDetail.Picture picture = new NewsPhotoDetail.Picture();\n        if (title != null) {\n            picture.setTitle(title);\n        }\n        picture.setImgSrc(imgsrc);\n\n        list.add(picture);\n    }\n\n    //根据图片的张数设置不同的显示模式\n    private void setImageView(MultiViewHolder holder, NewsInfo newsInfo) {\n        //根据图片张数确定图片的高度\n        int PhotoThreeHeight = (int) DisplayUtil.dip2px(90);\n        int PhotoTwoHeight = (int) DisplayUtil.dip2px(120);\n        int PhotoOneHeight = (int) DisplayUtil.dip2px(150);\n        //存放图片url\n        String imgSrcLeft = null;\n        String imgSrcMiddle = null;\n        String imgSrcRight = null;\n        LinearLayout layout = holder.mLayout;\n        ViewGroup.LayoutParams params = layout.getLayoutParams();\n        //先从ads域中拿图片\n        if (newsInfo.getAds() != null) {\n            List<NewsInfo.AdsBean> adsBeanList = newsInfo.getAds();\n            int size = adsBeanList.size();\n            if (size >= 3) {\n                //图片数量大于3  只取前三个\n                imgSrcLeft = adsBeanList.get(0).getImgsrc();\n                imgSrcMiddle = adsBeanList.get(1).getImgsrc();\n                imgSrcRight = adsBeanList.get(2).getImgsrc();\n                params.height = PhotoThreeHeight;\n            } else if (size >= 2) {\n                //图片数量2个\n                imgSrcLeft = adsBeanList.get(0).getImgsrc();\n                imgSrcMiddle = adsBeanList.get(1).getImgsrc();\n                params.height = PhotoTwoHeight;\n            } else if (size >= 1) {\n                //图片数量1个\n                imgSrcLeft = adsBeanList.get(0).getImgsrc();\n                params.height = PhotoOneHeight;\n            }\n            //从imgextra域中拿图片\n        } else if (newsInfo.getImgextra() != null) {\n            int size = newsInfo.getImgextra().size();\n            if (size >= 3) {\n                imgSrcLeft = newsInfo.getImgextra().get(0).getImgsrc();\n                imgSrcMiddle = newsInfo.getImgextra().get(1).getImgsrc();\n                imgSrcRight = newsInfo.getImgextra().get(2).getImgsrc();\n                params.height = PhotoThreeHeight;\n            } else if (size >= 2) {\n                imgSrcLeft = newsInfo.getImgextra().get(0).getImgsrc();\n                imgSrcMiddle = newsInfo.getImgextra().get(1).getImgsrc();\n\n                params.height = PhotoTwoHeight;\n            } else if (size >= 1) {\n                imgSrcLeft = newsInfo.getImgextra().get(0).getImgsrc();\n                params.height = PhotoOneHeight;\n            }\n        } else {\n            //从imgsrc域中拿图片\n            imgSrcLeft = newsInfo.getImgsrc();\n            params.height = PhotoOneHeight;\n        }\n        layout.setLayoutParams(params);\n        setPhotoImageView(holder, imgSrcLeft, imgSrcMiddle, imgSrcRight);\n    }\n\n    //将拿到的图片加载显示\n    private void setPhotoImageView(MultiViewHolder holder, String left, String middle, String right) {\n        if (left != null) {\n            holder.mIvLeft.setVisibility(View.VISIBLE);\n            ImageLoaderUtils.display(context,holder.mIvLeft,left);\n        } else {\n            holder.mIvLeft.setVisibility(View.GONE);//设置为Gone不占位\n        }\n        if (middle != null) {\n            holder.mIvMiddle.setVisibility(View.VISIBLE);\n            ImageLoaderUtils.display(context,holder.mIvMiddle,middle);\n        } else {\n            holder.mIvMiddle.setVisibility(View.GONE);//设置为Gone不占位\n        }\n        if (right != null) {\n            holder.mIvRight.setVisibility(View.VISIBLE);\n            ImageLoaderUtils.display(context,holder.mIvRight,right);\n        } else {\n            holder.mIvRight.setVisibility(View.GONE);//设置为Gone不占位\n        }\n    }\n\n\n\n\n    public class SingleViewHolder extends RecyclerView.ViewHolder{\n        private ImageView mImageView;\n        private TextView mTitle;\n        private TextView mContent;\n        private TextView mTime;\n        private RelativeLayout mLayout;\n        public SingleViewHolder(View itemView) {\n            super(itemView);\n            mImageView = (ImageView) itemView.findViewById(R.id.news_summary_photo_iv);\n            mTitle = (TextView) itemView.findViewById(R.id.news_summary_title_tv);\n            mContent = (TextView) itemView.findViewById(R.id.news_summary_digest_tv);\n            mTime = (TextView) itemView.findViewById(R.id.news_summary_ptime_tv);\n            mLayout = (RelativeLayout) itemView.findViewById(R.id.rl_root);\n\n        }\n\n    }\n    public class MultiViewHolder extends RecyclerView.ViewHolder{\n        private LinearLayout mLayout;\n        private TextView mTitle;\n        private TextView mTime;\n        private ImageView mIvLeft;\n        private ImageView mIvMiddle;\n        private ImageView mIvRight;\n        private LinearLayout mRoot;\n\n        public MultiViewHolder(View itemView) {\n            super(itemView);\n            mLayout = (LinearLayout) itemView.findViewById(news_summary_photo_iv_group);\n            mTitle = (TextView) itemView.findViewById(R.id.news_summary_title_tv);\n            mTime = (TextView) itemView.findViewById(R.id.news_summary_ptime_tv);\n            mIvLeft = (ImageView) itemView.findViewById(R.id.news_summary_photo_iv_left);\n            mIvMiddle = (ImageView) itemView.findViewById(R.id.news_summary_photo_iv_middle);\n            mIvRight = (ImageView) itemView.findViewById(R.id.news_summary_photo_iv_right);\n            mRoot = (LinearLayout) itemView.findViewById(R.id.ll_root);\n\n        }\n\n\n    }\n    public class HeaderViewHolder extends RecyclerView.ViewHolder{\n        private GridView mGridView;\n        public HeaderViewHolder(View itemView) {\n            super(itemView);\n            mGridView = (GridView) itemView.findViewById(R.id.gv_news_channel);\n            mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {\n                @Override\n                public void onItemClick(AdapterView<?> parent, View v, int position, long id) {\n                    String name = mTables.get(position).getNewsChannelName();\n                    if(name.contains(\"全部\")){\n                        ToastUitl.showShort(\"切换到新闻频道管理页面：\"+name);\n                        NewsChannelActivity.startAction((MainActivity) context);\n                    }else{\n                        ToastUitl.showShort(\"切换到新闻频道：\"+name);\n                        mNewsChannelListener.changeChannelListener(mTables.get(position));\n\n                    }\n                }\n            });\n        }\n    }\n    public void setNewsChannelListener(OnNewsChannelListener listener){\n        mNewsChannelListener = listener;\n    }\n\n    public List<NewsInfo> getAdapterData(){\n        return list;\n    }\n    public void setTables(List<NewsChannelTable> list){\n        mTables = list;\n    }\n\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/adapter/OnNewsChannelListener.java",
    "content": "package com.lvr.livecircle.adapter;\n\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\n\n/**\n * Created by lvr on 2017/2/11.\n */\n\npublic interface OnNewsChannelListener {\n    void changeChannelListener(NewsChannelTable newsChannelTable);\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/adapter/PhotoListAdapter.java",
    "content": "package com.lvr.livecircle.adapter;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.widget.ImageView;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.meitu.model.bean.PhotoGirl;\nimport com.lvr.livecircle.utils.ImageLoaderUtils;\n\nimport java.util.List;\n\n/**\n * Created by lvr on 2017/2/20.\n */\n\npublic class PhotoListAdapter extends RecyclerView.Adapter<PhotoListAdapter.PhotoViewHolder> {\n    private  Context mContext;\n    private List<PhotoGirl> mData;\n    private final LayoutInflater inflater;\n    public PhotoListAdapter(Context context, List<PhotoGirl> list) {\n        this.mContext = context;\n        this.inflater = LayoutInflater.from(context);\n        this.mData = list;\n    }\n\n\n    @Override\n    public PhotoListAdapter.PhotoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {\n        return new PhotoViewHolder(inflater.inflate(R.layout.item_photo_girl,parent,false));\n    }\n\n    @Override\n    public void onBindViewHolder(PhotoListAdapter.PhotoViewHolder holder, int position) {\n        ImageLoaderUtils.display(mContext,holder.mImageView,mData.get(position).getUrl());\n    }\n\n    @Override\n    public int getItemCount() {\n        return mData.size();\n    }\n    public class PhotoViewHolder extends RecyclerView.ViewHolder{\n        private ImageView mImageView;\n        public PhotoViewHolder(View itemView) {\n            super(itemView);\n            mImageView = (ImageView) itemView.findViewById(R.id.iv_photo);\n        }\n\n    }\n    public List<PhotoGirl> getAdapterData(){\n        return mData;\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/api/ApiConstants.java",
    "content": "/*\n * Copyright (c) 2016 咖枯 <kaku201313@163.com | 3772304@qq.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\npackage com.lvr.livecircle.api;\n\npublic class ApiConstants {\n\n\n\n\n    // 头条TYPE\n    public static final String HEADLINE_TYPE = \"headline\";\n    // 房产TYPE\n    public static final String HOUSE_TYPE = \"house\";\n    // 其他TYPE\n    public static final String OTHER_TYPE = \"list\";\n\n\n    // 头条id\n    public static final String HEADLINE_ID = \"T1348647909107\";\n    // 房产id\n    public static final String HOUSE_ID = \"5YyX5Lqs\";\n\n\n    /**\n     * 视频 http://c.3g.163.com/nc/video/list/V9LG4CHOR/n/10-10.html\n     */\n    public static final String Video = \"nc/video/list/\";\n    public static final String VIDEO_CENTER = \"/n/\";\n    public static final String VIDEO_END_URL = \"-10.html\";\n    // 热点视频\n    public static final String VIDEO_HOT_ID = \"V9LG4B3A0\";\n    // 娱乐视频\n    public static final String VIDEO_ENTERTAINMENT_ID = \"V9LG4CHOR\";\n    // 搞笑视频\n    public static final String VIDEO_FUN_ID = \"V9LG4E6VR\";\n    // 精品视频\n    public static final String VIDEO_CHOICE_ID = \"00850FRB\";\n\n\n\n    /**\n     * 图片\n     * http://gank.io/api/data/福利/{size}/{page}\n     */\n    public static final String PHOTO_HOST = \"http://gank.io/api/\";\n\n\n\n    /**\n     * 新闻id获取类型\n     *\n     * @param id 新闻id\n     * @return 新闻类型\n     */\n    public static String getType(String id) {\n        switch (id) {\n            case HEADLINE_ID:\n                return HEADLINE_TYPE;\n            case HOUSE_ID:\n                return HOUSE_TYPE;\n            default:\n                break;\n        }\n        return OTHER_TYPE;\n    }\n\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/api/ApiService.java",
    "content": "package com.lvr.livecircle.api;\n\n\nimport com.lvr.livecircle.bean.NewsInfo;\nimport com.lvr.livecircle.meitu.model.bean.GirlData;\nimport com.lvr.livecircle.news.model.bean.NewsDetail;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport io.reactivex.Observable;\nimport okhttp3.ResponseBody;\nimport retrofit2.http.GET;\nimport retrofit2.http.Path;\nimport retrofit2.http.Url;\n\n/**\n * Created by lvr on 2017/2/8.\n */\n\npublic interface ApiService {\n    public static final String NEWS_BASE_URL = \"http://c.m.163.com/nc/article/\";\n    public static final String PHOTO_BASE_URL = \"http://gank.io/api/data/福利/\";\n    @GET(\"{type}/{id}/{startPage}-20.html\")\n    Observable<Map<String, List<NewsInfo>>> getNewsList(\n            @Path(\"type\") String type, @Path(\"id\") String id,\n            @Path(\"startPage\") int startPage);\n\n    @GET(\"{postId}/full.html\")\n    Observable<Map<String, NewsDetail>> getNewDetail(\n            @Path(\"postId\") String postId);\n    @GET\n    Observable<ResponseBody> getNewsBodyHtmlPhoto(\n            @Url String photoPath);\n    @GET(\"{size}/{page}\")\n    Observable<GirlData> getPhotoList(@Path(\"size\") int size, @Path(\"page\") int page);\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/api/HostType.java",
    "content": "/*\n * Copyright (c) 2016 咖枯 <kaku201313@163.com | 3772304@qq.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\npackage com.lvr.livecircle.api;\n\npublic class HostType {\n\n    /**\n     * 多少种Host类型\n     */\n    public static final int TYPE_COUNT = 3;\n\n    /**\n     * 网易新闻视频的host\n     */\n    public static final int NETEASE_NEWS_VIDEO = 1;\n\n    /**\n     * 新浪图片的host\n     */\n    public static final int GANK_GIRL_PHOTO = 2;\n\n    /**\n     * 新闻详情html图片的host\n     */\n    public static final int NEWS_DETAIL_HTML_PHOTO = 3;\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/app/AppApplication.java",
    "content": "package com.lvr.livecircle.app;\n\nimport com.lvr.livecircle.base.BaseApplication;\n\n/**\n * APPLICATION\n */\npublic class AppApplication extends BaseApplication {\n    @Override\n    public void onCreate() {\n        super.onCreate();\n\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/app/AppConstant.java",
    "content": "package com.lvr.livecircle.app;\n\n\npublic class AppConstant {\n\n    public static final String HOME_CURRENT_TAB_POSITION=\"HOME_CURRENT_TAB_POSITION\";\n    public static final String MENU_SHOW_HIDE=\"MENU_SHOW_HIDE\";\n\n    /* 新闻*/\n    public static final String NEWS_ID = \"news_id\";\n    public static final String NEWS_TYPE = \"news_type\";\n    public static final String CHANNEL_POSITION = \"channel_position\";\n    public static final String CHANNEL_MINE = \"CHANNEL_MINE\";\n    public static final String CHANNEL_MORE = \"CHANNEL_MORE\";\n    public static final String CHANNEL_SWAP = \"CHANNEL_SWAP\";\n    public static final String NEWS_CHANNEL_CHANGED = \"NEWS_CHANNEL_CHANGED\";\n\n    /* 视频*/\n    public static final String VIDEO_TYPE = \"VIDEO_TYPE\";\n\n    public static String NEWS_LIST_TO_TOP = \"NEWS_LIST_TO_TOP\";//列表返回顶部\n    public static String ZONE_PUBLISH_ADD = \"ZONE_PUBLISH_ADD\";//发布说说\n\n    public static String NEWS_POST_ID = \"NEWS_POST_ID\";//新闻详情id\n    public static String NEWS_LINK = \"NEWS_LINK\";\n    public static String NEWS_TITLE = \"NEWS_TITLE\";\n\n    public static final String PHOTO_DETAIL_IMGSRC = \"photo_detail_imgsrc\";\n    public static final String PHOTO_DETAIL = \"photo_detail\";\n    public static final String PHOTO_TAB_CLICK = \"PHOTO_TAB_CLICK\";\n\n    public static final String NEWS_IMG_RES = \"news_img_res\";\n    public static final String TRANSITION_ANIMATION_NEWS_PHOTOS = \"transition_animation_news_photos\";\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/app/AppManager.java",
    "content": "\npackage com.lvr.livecircle.app;\n\nimport android.app.Activity;\nimport android.app.ActivityManager;\nimport android.content.Context;\n\nimport java.util.Stack;\n\n/**\n * activity管理\n */\npublic class AppManager {\n    private static Stack<Activity> activityStack;\n    private volatile static AppManager instance;\n\n    private AppManager() {\n\n    }\n    /**\n     * 单一实例\n     */\n    public static AppManager getAppManager() {\n        if (instance == null) {\n            synchronized (AppManager.class){\n                if(instance==null){\n                    instance = new AppManager();\n                    instance.activityStack = new Stack();\n                }\n            }\n\n        }\n        return instance;\n    }\n\n    /**\n     * 添加Activity到堆栈\n     */\n    public void addActivity(Activity activity) {\n        if (activityStack == null) {\n            activityStack = new Stack<Activity>();\n        }\n        activityStack.add(activity);\n    }\n\n    /**\n     * 获取当前Activity（堆栈中最后一个压入的）\n     */\n    public Activity currentActivity() {\n        try {\n            Activity activity = activityStack.lastElement();\n            return activity;\n        } catch (Exception e) {\n//            e.printStackTrace();\n            return null;\n        }\n    }\n\n    /**\n     * 获取当前Activity的前一个Activity\n     */\n    public Activity preActivity() {\n        int index = activityStack.size() - 2;\n        if (index < 0) {\n            return null;\n        }\n        Activity activity = activityStack.get(index);\n        return activity;\n    }\n\n    /**\n     * 结束当前Activity（堆栈中最后一个压入的）\n     */\n    public void finishActivity() {\n        Activity activity = activityStack.lastElement();\n        finishActivity(activity);\n    }\n\n    /**\n     * 结束指定的Activity\n     */\n    public void finishActivity(Activity activity) {\n        if (activity != null) {\n            activityStack.remove(activity);\n            activity.finish();\n            activity = null;\n        }\n    }\n\n    /**\n     * 移除指定的Activity\n     */\n    public void removeActivity(Activity activity) {\n        if (activity != null) {\n            activityStack.remove(activity);\n            activity = null;\n        }\n    }\n\n    /**\n     * 结束指定类名的Activity\n     */\n    public void finishActivity(Class<?> cls) {\n        try {\n            for (Activity activity : activityStack) {\n                if (activity.getClass().equals(cls)) {\n                    finishActivity(activity);\n                }\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n\n    }\n\n    /**\n     * 结束所有Activity\n     */\n    public void finishAllActivity() {\n        for (int i = 0, size = activityStack.size(); i < size; i++) {\n            if (null != activityStack.get(i)) {\n                activityStack.get(i).finish();\n            }\n        }\n        activityStack.clear();\n    }\n\n    /**\n     * 返回到指定的activity\n     *\n     * @param cls\n     */\n    public void returnToActivity(Class<?> cls) {\n        while (activityStack.size() != 0)\n            if (activityStack.peek().getClass() == cls) {\n                break;\n            } else {\n                finishActivity(activityStack.peek());\n            }\n    }\n\n\n    /**\n     * 是否已经打开指定的activity\n     * @param cls\n     * @return\n     */\n    public boolean isOpenActivity(Class<?> cls) {\n        if (activityStack!=null){\n            for (int i = 0, size = activityStack.size(); i < size; i++) {\n                if (cls == activityStack.peek().getClass()) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n\n    /**\n     * 退出应用程序\n     *\n     * @param context      上下文\n     * @param isBackground 是否开开启后台运行\n     */\n    public void AppExit(Context context, Boolean isBackground) {\n        try {\n            finishAllActivity();\n            ActivityManager activityMgr = (ActivityManager) context\n                    .getSystemService(Context.ACTIVITY_SERVICE);\n            activityMgr.restartPackage(context.getPackageName());\n        } catch (Exception e) {\n\n        } finally {\n            // 注意，如果您有后台程序运行，请不要支持此句子\n            if (!isBackground) {\n                System.exit(0);\n            }\n        }\n    }\n}"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/base/BaseActivity.java",
    "content": "package com.lvr.livecircle.base;\n\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.pm.ActivityInfo;\nimport android.os.Bundle;\nimport android.support.v7.app.AppCompatActivity;\nimport android.view.Window;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.app.AppManager;\nimport com.lvr.livecircle.utils.StatusBarSetting;\nimport com.lvr.livecircle.utils.ToastUitl;\nimport com.lvr.livecircle.widget.LoadingDialog;\n\nimport butterknife.ButterKnife;\nimport butterknife.Unbinder;\n\n/**\n * 基类\n */\n\npublic abstract class BaseActivity extends AppCompatActivity {\n\n    public Context mContext;\n    private Unbinder mUnbinder;\n    private int count;//记录开启进度条的情况 只能开一个\n\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        doBeforeSetcontentView();\n        setContentView(getLayoutId());\n        // 默认着色状态栏\n        SetStatusBarColor();\n        mUnbinder = ButterKnife.bind(this);\n        mContext = this;\n\n        this.initPresenter();\n        this.initView();\n    }\n\n    /**\n     * 设置layout前配置\n     */\n    private void doBeforeSetcontentView() {\n        // 把actvity放到application栈中管理\n        AppManager.getAppManager().addActivity(this);\n        // 无标题\n        requestWindowFeature(Window.FEATURE_NO_TITLE);\n        // 设置竖屏\n        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);\n\n\n    }\n\n    /*********************\n     * 子类实现\n     *****************************/\n    //获取布局文件\n    public abstract int getLayoutId();\n\n    //简单页面无需mvp就不用管此方法即可,完美兼容各种实际场景的变通\n    public abstract void initPresenter();\n\n    //初始化view\n    public abstract void initView();\n\n    /**\n     * 着色状态栏（4.4以上系统有效）\n     */\n    protected void SetStatusBarColor() {\n        StatusBarSetting.setColor(this, getResources().getColor(R.color.colorPrimary));\n    }\n\n    /**\n     * 着色状态栏（4.4以上系统有效）\n     */\n    protected void SetStatusBarColor(int color) {\n        StatusBarSetting.setColor(this, color);\n    }\n\n    /**\n     * 沉浸状态栏（4.4以上系统有效）\n     */\n    protected void SetTranslanteBar() {\n        StatusBarSetting.setTranslucent(this);\n    }\n\n\n    /**\n     * 通过Class跳转界面\n     **/\n    public void startActivity(Class<?> cls) {\n        startActivity(cls, null);\n    }\n\n    /**\n     * 通过Class跳转界面\n     **/\n    public void startActivityForResult(Class<?> cls, int requestCode) {\n        startActivityForResult(cls, null, requestCode);\n    }\n\n    /**\n     * 含有Bundle通过Class跳转界面\n     **/\n    public void startActivityForResult(Class<?> cls, Bundle bundle,\n                                       int requestCode) {\n        Intent intent = new Intent();\n        intent.setClass(this, cls);\n        if (bundle != null) {\n            intent.putExtras(bundle);\n        }\n        startActivityForResult(intent, requestCode);\n    }\n\n    /**\n     * 含有Bundle通过Class跳转界面\n     **/\n    public void startActivity(Class<?> cls, Bundle bundle) {\n        Intent intent = new Intent();\n        intent.setClass(this, cls);\n        if (bundle != null) {\n            intent.putExtras(bundle);\n        }\n        startActivity(intent);\n    }\n\n    /**\n     * 开启浮动加载进度条\n     */\n    public void startProgressDialog() {\n        count++;\n        if(count==1){\n            LoadingDialog.showDialogForLoading(this);\n        }\n    }\n\n    /**\n     * 开启浮动加载进度条\n     *\n     * @param msg\n     */\n    public void startProgressDialog(String msg) {\n        count++;\n        if(count==1){\n            LoadingDialog.showDialogForLoading(this, msg, true);\n        }\n    }\n\n    /**\n     * 停止浮动加载进度条\n     */\n    public void stopProgressDialog() {\n        count--;\n        if(count==0){\n            LoadingDialog.cancelDialogForLoading();\n        }\n\n    }\n\n    /**\n     * 短暂显示Toast提示(来自String)\n     **/\n    public void showShortToast(String text) {\n        ToastUitl.showShort(text);\n    }\n\n    /**\n     * 短暂显示Toast提示(id)\n     **/\n    public void showShortToast(int resId) {\n        ToastUitl.showShort(resId);\n    }\n\n    /**\n     * 长时间显示Toast提示(来自res)\n     **/\n    public void showLongToast(int resId) {\n        ToastUitl.showLong(resId);\n    }\n\n    /**\n     * 长时间显示Toast提示(来自String)\n     **/\n    public void showLongToast(String text) {\n        ToastUitl.showLong(text);\n    }\n\n    /**\n     * 带图片的toast\n     *\n     * @param text\n     * @param res\n     */\n    public void showToastWithImg(String text, int res) {\n        ToastUitl.showToastWithImg(text, res);\n    }\n\n    /**\n     * 网络访问错误提醒\n     */\n    public void showNetErrorTip() {\n        ToastUitl.showToastWithImg(getText(R.string.net_error).toString(), R.drawable.ic_wifi_off);\n    }\n\n    public void showNetErrorTip(String error) {\n        ToastUitl.showToastWithImg(error, R.drawable.ic_wifi_off);\n    }\n\n    @Override\n    protected void onResume() {\n        super.onResume();\n\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n\n    }\n\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        mUnbinder.unbind();\n        AppManager.getAppManager().finishActivity(this);\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/base/BaseApplication.java",
    "content": "package com.lvr.livecircle.base;\n\nimport android.app.Application;\nimport android.content.Context;\nimport android.content.res.Resources;\n\n/**\n * APPLICATION\n */\npublic class BaseApplication extends Application {\n\n    private static BaseApplication baseApplication;\n\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        baseApplication = this;\n    }\n\n    public static Context getAppContext() {\n        return baseApplication;\n    }\n    public static Resources getAppResources() {\n        return baseApplication.getResources();\n    }\n    @Override\n    public void onTerminate() {\n        super.onTerminate();\n    }\n\n\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/base/BaseFragment.java",
    "content": "package com.lvr.livecircle.base;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.support.v4.app.Fragment;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.lvr.livecircle.utils.ToastUitl;\nimport com.lvr.livecircle.widget.LoadingDialog;\n\nimport butterknife.ButterKnife;\nimport butterknife.Unbinder;\n\n\npublic abstract class BaseFragment extends Fragment {\n    protected View rootView;\n\n    private Unbinder mUnbinder;\n    private int count;//记录开启进度条的情况 只能开一个\n    //当前Fragment是否处于可见状态标志，防止因ViewPager的缓存机制而导致回调函数的触发\n    private boolean isFragmentVisible;\n    //是否是第一次开启网络加载\n    public boolean isFirst;\n\n    @Nullable\n    @Override\n    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n        if (rootView == null)\n            rootView = inflater.inflate(getLayoutResource(), container, false);\n        mUnbinder = ButterKnife.bind(this, rootView);\n        initView();\n        //可见，但是并没有加载过\n        if (isFragmentVisible && !isFirst) {\n            onFragmentVisibleChange(true);\n        }\n        return rootView;\n    }\n\n    //获取布局文件\n    protected abstract int getLayoutResource();\n\n\n    //初始化view\n    protected abstract void initView();\n\n\n    /**\n     * 通过Class跳转界面\n     **/\n    public void startActivity(Class<?> cls) {\n        startActivity(cls, null);\n    }\n\n    /**\n     * 通过Class跳转界面\n     **/\n    public void startActivityForResult(Class<?> cls, int requestCode) {\n        startActivityForResult(cls, null, requestCode);\n    }\n\n    /**\n     * 含有Bundle通过Class跳转界面\n     **/\n    public void startActivityForResult(Class<?> cls, Bundle bundle,\n                                       int requestCode) {\n        Intent intent = new Intent();\n        intent.setClass(getActivity(), cls);\n        if (bundle != null) {\n            intent.putExtras(bundle);\n        }\n        startActivityForResult(intent, requestCode);\n    }\n\n    /**\n     * 含有Bundle通过Class跳转界面\n     **/\n    public void startActivity(Class<?> cls, Bundle bundle) {\n        Intent intent = new Intent();\n        intent.setClass(getActivity(), cls);\n        if (bundle != null) {\n            intent.putExtras(bundle);\n        }\n        startActivity(intent);\n    }\n\n    @Override\n    public void setUserVisibleHint(boolean isVisibleToUser) {\n        super.setUserVisibleHint(isVisibleToUser);\n        if (isVisibleToUser) {\n            isFragmentVisible = true;\n        }\n        if (rootView == null) {\n            return;\n        }\n        //可见，并且没有加载过\n        if (!isFirst&&isFragmentVisible) {\n            onFragmentVisibleChange(true);\n            return;\n        }\n        //由可见——>不可见 已经加载过\n        if (isFragmentVisible) {\n            onFragmentVisibleChange(false);\n            isFragmentVisible = false;\n        }\n    }\n\n    /**\n     * 开启加载进度条\n     */\n    public void startProgressDialog() {\n        count++;\n        if (count == 1) {\n            LoadingDialog.showDialogForLoading(getActivity());\n        }\n    }\n\n    /**\n     * 开启加载进度条\n     *\n     * @param msg\n     */\n    public void startProgressDialog(String msg) {\n        LoadingDialog.showDialogForLoading(getActivity(), msg, true);\n\n    }\n\n    /**\n     * 停止加载进度条\n     */\n    public void stopProgressDialog() {\n        count--;\n        if (count == 0) {\n            LoadingDialog.cancelDialogForLoading();\n        }\n\n    }\n\n\n    /**\n     * 短暂显示Toast提示(来自String)\n     **/\n    public void showShortToast(String text) {\n        ToastUitl.showShort(text);\n    }\n\n    /**\n     * 短暂显示Toast提示(id)\n     **/\n    public void showShortToast(int resId) {\n        ToastUitl.showShort(resId);\n    }\n\n    /**\n     * 长时间显示Toast提示(来自res)\n     **/\n    public void showLongToast(int resId) {\n        ToastUitl.showLong(resId);\n    }\n\n    /**\n     * 长时间显示Toast提示(来自String)\n     **/\n    public void showLongToast(String text) {\n        ToastUitl.showLong(text);\n    }\n\n\n    public void showToastWithImg(String text, int res) {\n        ToastUitl.showToastWithImg(text, res);\n    }\n\n    /**\n     * 网络访问错误提醒\n     */\n    public void showNetErrorTip() {\n\n    }\n\n    public void showNetErrorTip(String error) {\n\n    }\n\n    public void showLoading() {\n\n    }\n\n    public void stopLoading() {\n\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        mUnbinder.unbind();\n    }\n\n    /**\n     * 当前fragment可见状态发生变化时会回调该方法\n     * 如果当前fragment是第一次加载，等待onCreateView后才会回调该方法，其它情况回调时机跟 {@link #setUserVisibleHint(boolean)}一致\n     * 在该回调方法中你可以做一些加载数据操作，甚至是控件的操作.\n     *\n     * @param isVisible true  不可见 -> 可见\n     *                  false 可见  -> 不可见\n     */\n    protected void onFragmentVisibleChange(boolean isVisible) {\n\n    }\n\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/base/BaseFragmentAdapter.java",
    "content": "package com.lvr.livecircle.base;\n\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\nimport android.support.v4.app.FragmentPagerAdapter;\n\nimport com.lvr.livecircle.utils.CollectionUtils;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class BaseFragmentAdapter extends FragmentPagerAdapter {\n\n    List<Fragment> fragmentList = new ArrayList<Fragment>();\n    private List<String> mTitles;\n\n    public BaseFragmentAdapter(FragmentManager fm, List<Fragment> fragmentList) {\n        super(fm);\n        this.fragmentList = fragmentList;\n    }\n\n    public BaseFragmentAdapter(FragmentManager fm, List<Fragment> fragmentList, List<String> mTitles) {\n        super(fm);\n        this.fragmentList = fragmentList;\n        this.mTitles = mTitles;\n    }\n\n    @Override\n    public CharSequence getPageTitle(int position) {\n        return !CollectionUtils.isNullOrEmpty(mTitles) ? mTitles.get(position) : \"\";\n    }\n\n    @Override\n    public Fragment getItem(int position) {\n        return fragmentList.get(position);\n    }\n\n    @Override\n    public int getCount() {\n        return fragmentList.size();\n    }\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/bean/ChannelBean.java",
    "content": "package com.lvr.livecircle.bean;\n\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\n\nimport java.util.List;\n\n/**\n * Created by lvr on 2017/2/14.\n */\n\n//通知频道变换的Event类\npublic class ChannelBean {\n    public List<NewsChannelTable> mList;\n    public int fromPosition;\n    public int toPosition;\n    public ChannelBean(List<NewsChannelTable> list) {\n        mList = list;\n\n    }\n\n    public List<NewsChannelTable> getList() {\n        return mList;\n    }\n\n\n    public void setList(List<NewsChannelTable> list) {\n        mList = list;\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/bean/FabScrollBean.java",
    "content": "package com.lvr.livecircle.bean;\n\n/**\n * Created by lvr on 2017/2/12.\n */\n\npublic class FabScrollBean {\n    private String scrollMsg;\n\n    public int getPosition() {\n        return position;\n    }\n\n    public void setPosition(int position) {\n        this.position = position;\n    }\n\n    private int position;\n\n\n    public FabScrollBean(String scrollMsg,int position) {\n        this.scrollMsg = scrollMsg;\n        this.position = position;\n    }\n\n    public String getScrollMsg() {\n        return scrollMsg;\n    }\n\n    public void setScrollMsg(String scrollMsg) {\n        this.scrollMsg = scrollMsg;\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/bean/HeaderBean.java",
    "content": "package com.lvr.livecircle.bean;\n\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\n\nimport java.util.List;\n\n/**\n * Created by lvr on 2017/2/14.\n */\n\npublic class HeaderBean {\n    private List<NewsChannelTable> mList;\n\n    public HeaderBean(List<NewsChannelTable> list) {\n        mList = list;\n    }\n\n    public List<NewsChannelTable> getList() {\n        return mList;\n    }\n\n    public void setList(List<NewsChannelTable> list) {\n        mList = list;\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/bean/NewsInfo.java",
    "content": "package com.lvr.livecircle.bean;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by lvr on 2017/2/8.\n */\n//使用GsonFormat插件 使用Parcelable插件\npublic class NewsInfo implements Parcelable {\n\n    /**\n     * postid : PHOT24589000100A\n     * hasCover : false\n     * hasHead : 1\n     * replyCount : 32056\n     * hasImg : 1\n     * digest :\n     * hasIcon : false\n     * docid : 9IG74V5H00963VRO_CCP0IVDUcaoruiupdateDoc\n     * title : 韩民众举\"包青天\"头像 抗议总统弹劾案\n     * order : 1\n     * priority : 354\n     * lmodify : 2017-02-08 16:14:08\n     * boardid : photoview_bbs\n     * ads : [{\"title\":\"直击云南边境扫雷 地雷炮弹摆满地\",\"tag\":\"photoset\",\"imgsrc\":\"http://cms-bucket.nosdn.127.net/e4c85b6a0db74b139b0c40572181883a20170208163525.jpeg\",\"subtitle\":\"\",\"url\":\"00AP0001|2233612\"},{\"title\":\"特朗普任后首批被遣墨西哥移民回国\",\"tag\":\"photoset\",\"imgsrc\":\"http://cms-bucket.nosdn.127.net/40dd56cbd22043519fc7bdbb95cc954820170208164609.jpeg\",\"subtitle\":\"\",\"url\":\"00AO0001|2233614\"},{\"title\":\"巴西警察罢工引发骚乱 已致75人死亡\",\"tag\":\"photoset\",\"imgsrc\":\"http://cms-bucket.nosdn.127.net/0c27e0f72fab46c08c4399e6146cc4a120170208163826.jpeg\",\"subtitle\":\"\",\"url\":\"00AO0001|2233613\"},{\"title\":\"大圣驾车被交警拦下 车上坐一群\\\"妖怪\\\"\",\"tag\":\"photoset\",\"imgsrc\":\"http://cms-bucket.nosdn.127.net/376884a7cff14a95839f23a032c3f60620170208100814.jpeg\",\"subtitle\":\"\",\"url\":\"00AP0001|2233503\"},{\"title\":\"广东揭阳江中现观音像 村民打捞参拜\",\"tag\":\"photoset\",\"imgsrc\":\"http://cms-bucket.nosdn.127.net/f7fb6acf5e424a12aeaacb7b6192006320170208093602.jpeg\",\"subtitle\":\"\",\"url\":\"00AP0001|2233473\"}]\n     * photosetID : 00AO0001|2233609\n     * imgsum : 4\n     * topic_background : http://img2.cache.netease.com/m/newsapp/reading/cover1/C1348646712614.jpg\n     * template : normal1\n     * votecount : 29790\n     * skipID : 00AO0001|2233609\n     * alias : Top News\n     * skipType : photoset\n     * cid : C1348646712614\n     * hasAD : 1\n     * imgextra : [{\"imgsrc\":\"http://cms-bucket.nosdn.127.net/3e8167782a344c47886dd4b818274e3720170208161145.jpeg\"},{\"imgsrc\":\"http://cms-bucket.nosdn.127.net/1bef3f98431f4be780320ce58d7c68d920170208160645.jpeg\"}]\n     * source : 网易原创\n     * ename : androidnews\n     * tname : 头条\n     * imgsrc : http://cms-bucket.nosdn.127.net/37148e8af39440be9b41606f72dc49d520170208161145.jpeg\n     * ptime : 2017-02-08 16:07:25\n     */\n\n    private String postid;\n    private boolean hasCover;\n    private int hasHead;\n    private int replyCount;\n    private int hasImg;\n    private String digest;\n    private boolean hasIcon;\n    private String docid;\n    private String title;\n    private int order;\n    private int priority;\n    private String lmodify;\n    private String boardid;\n    private String photosetID;\n    private int imgsum;\n    private String topic_background;\n    private String template;\n    private int votecount;\n    private String skipID;\n    private String alias;\n    private String skipType;\n    private String cid;\n    private int hasAD;\n    private String source;\n    private String ename;\n    private String tname;\n    private String imgsrc;\n    private String ptime;\n    private List<AdsBean> ads;\n    private List<ImgextraBean> imgextra;\n\n    public String getPostid() {\n        return postid;\n    }\n\n    public void setPostid(String postid) {\n        this.postid = postid;\n    }\n\n    public boolean isHasCover() {\n        return hasCover;\n    }\n\n    public void setHasCover(boolean hasCover) {\n        this.hasCover = hasCover;\n    }\n\n    public int getHasHead() {\n        return hasHead;\n    }\n\n    public void setHasHead(int hasHead) {\n        this.hasHead = hasHead;\n    }\n\n    public int getReplyCount() {\n        return replyCount;\n    }\n\n    public void setReplyCount(int replyCount) {\n        this.replyCount = replyCount;\n    }\n\n    public int getHasImg() {\n        return hasImg;\n    }\n\n    public void setHasImg(int hasImg) {\n        this.hasImg = hasImg;\n    }\n\n    public String getDigest() {\n        return digest;\n    }\n\n    public void setDigest(String digest) {\n        this.digest = digest;\n    }\n\n    public boolean isHasIcon() {\n        return hasIcon;\n    }\n\n    public void setHasIcon(boolean hasIcon) {\n        this.hasIcon = hasIcon;\n    }\n\n    public String getDocid() {\n        return docid;\n    }\n\n    public void setDocid(String docid) {\n        this.docid = docid;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    public int getOrder() {\n        return order;\n    }\n\n    public void setOrder(int order) {\n        this.order = order;\n    }\n\n    public int getPriority() {\n        return priority;\n    }\n\n    public void setPriority(int priority) {\n        this.priority = priority;\n    }\n\n    public String getLmodify() {\n        return lmodify;\n    }\n\n    public void setLmodify(String lmodify) {\n        this.lmodify = lmodify;\n    }\n\n    public String getBoardid() {\n        return boardid;\n    }\n\n    public void setBoardid(String boardid) {\n        this.boardid = boardid;\n    }\n\n    public String getPhotosetID() {\n        return photosetID;\n    }\n\n    public void setPhotosetID(String photosetID) {\n        this.photosetID = photosetID;\n    }\n\n    public int getImgsum() {\n        return imgsum;\n    }\n\n    public void setImgsum(int imgsum) {\n        this.imgsum = imgsum;\n    }\n\n    public String getTopic_background() {\n        return topic_background;\n    }\n\n    public void setTopic_background(String topic_background) {\n        this.topic_background = topic_background;\n    }\n\n    public String getTemplate() {\n        return template;\n    }\n\n    public void setTemplate(String template) {\n        this.template = template;\n    }\n\n    public int getVotecount() {\n        return votecount;\n    }\n\n    public void setVotecount(int votecount) {\n        this.votecount = votecount;\n    }\n\n    public String getSkipID() {\n        return skipID;\n    }\n\n    public void setSkipID(String skipID) {\n        this.skipID = skipID;\n    }\n\n    public String getAlias() {\n        return alias;\n    }\n\n    public void setAlias(String alias) {\n        this.alias = alias;\n    }\n\n    public String getSkipType() {\n        return skipType;\n    }\n\n    public void setSkipType(String skipType) {\n        this.skipType = skipType;\n    }\n\n    public String getCid() {\n        return cid;\n    }\n\n    public void setCid(String cid) {\n        this.cid = cid;\n    }\n\n    public int getHasAD() {\n        return hasAD;\n    }\n\n    public void setHasAD(int hasAD) {\n        this.hasAD = hasAD;\n    }\n\n    public String getSource() {\n        return source;\n    }\n\n    public void setSource(String source) {\n        this.source = source;\n    }\n\n    public String getEname() {\n        return ename;\n    }\n\n    public void setEname(String ename) {\n        this.ename = ename;\n    }\n\n    public String getTname() {\n        return tname;\n    }\n\n    public void setTname(String tname) {\n        this.tname = tname;\n    }\n\n    public String getImgsrc() {\n        return imgsrc;\n    }\n\n    public void setImgsrc(String imgsrc) {\n        this.imgsrc = imgsrc;\n    }\n\n    public String getPtime() {\n        return ptime;\n    }\n\n    public void setPtime(String ptime) {\n        this.ptime = ptime;\n    }\n\n    public List<AdsBean> getAds() {\n        return ads;\n    }\n\n    public void setAds(List<AdsBean> ads) {\n        this.ads = ads;\n    }\n\n    public List<ImgextraBean> getImgextra() {\n        return imgextra;\n    }\n\n    public void setImgextra(List<ImgextraBean> imgextra) {\n        this.imgextra = imgextra;\n    }\n\n    public static class AdsBean {\n        /**\n         * title : 直击云南边境扫雷 地雷炮弹摆满地\n         * tag : photoset\n         * imgsrc : http://cms-bucket.nosdn.127.net/e4c85b6a0db74b139b0c40572181883a20170208163525.jpeg\n         * subtitle :\n         * url : 00AP0001|2233612\n         */\n\n        private String title;\n        private String tag;\n        private String imgsrc;\n        private String subtitle;\n        private String url;\n\n        public String getTitle() {\n            return title;\n        }\n\n        public void setTitle(String title) {\n            this.title = title;\n        }\n\n        public String getTag() {\n            return tag;\n        }\n\n        public void setTag(String tag) {\n            this.tag = tag;\n        }\n\n        public String getImgsrc() {\n            return imgsrc;\n        }\n\n        public void setImgsrc(String imgsrc) {\n            this.imgsrc = imgsrc;\n        }\n\n        public String getSubtitle() {\n            return subtitle;\n        }\n\n        public void setSubtitle(String subtitle) {\n            this.subtitle = subtitle;\n        }\n\n        public String getUrl() {\n            return url;\n        }\n\n        public void setUrl(String url) {\n            this.url = url;\n        }\n    }\n\n    public static class ImgextraBean {\n        /**\n         * imgsrc : http://cms-bucket.nosdn.127.net/3e8167782a344c47886dd4b818274e3720170208161145.jpeg\n         */\n\n        private String imgsrc;\n\n        public String getImgsrc() {\n            return imgsrc;\n        }\n\n        public void setImgsrc(String imgsrc) {\n            this.imgsrc = imgsrc;\n        }\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeString(this.postid);\n        dest.writeByte(this.hasCover ? (byte) 1 : (byte) 0);\n        dest.writeInt(this.hasHead);\n        dest.writeInt(this.replyCount);\n        dest.writeInt(this.hasImg);\n        dest.writeString(this.digest);\n        dest.writeByte(this.hasIcon ? (byte) 1 : (byte) 0);\n        dest.writeString(this.docid);\n        dest.writeString(this.title);\n        dest.writeInt(this.order);\n        dest.writeInt(this.priority);\n        dest.writeString(this.lmodify);\n        dest.writeString(this.boardid);\n        dest.writeString(this.photosetID);\n        dest.writeInt(this.imgsum);\n        dest.writeString(this.topic_background);\n        dest.writeString(this.template);\n        dest.writeInt(this.votecount);\n        dest.writeString(this.skipID);\n        dest.writeString(this.alias);\n        dest.writeString(this.skipType);\n        dest.writeString(this.cid);\n        dest.writeInt(this.hasAD);\n        dest.writeString(this.source);\n        dest.writeString(this.ename);\n        dest.writeString(this.tname);\n        dest.writeString(this.imgsrc);\n        dest.writeString(this.ptime);\n        dest.writeList(this.ads);\n        dest.writeList(this.imgextra);\n    }\n\n    public NewsInfo() {\n    }\n\n    protected NewsInfo(Parcel in) {\n        this.postid = in.readString();\n        this.hasCover = in.readByte() != 0;\n        this.hasHead = in.readInt();\n        this.replyCount = in.readInt();\n        this.hasImg = in.readInt();\n        this.digest = in.readString();\n        this.hasIcon = in.readByte() != 0;\n        this.docid = in.readString();\n        this.title = in.readString();\n        this.order = in.readInt();\n        this.priority = in.readInt();\n        this.lmodify = in.readString();\n        this.boardid = in.readString();\n        this.photosetID = in.readString();\n        this.imgsum = in.readInt();\n        this.topic_background = in.readString();\n        this.template = in.readString();\n        this.votecount = in.readInt();\n        this.skipID = in.readString();\n        this.alias = in.readString();\n        this.skipType = in.readString();\n        this.cid = in.readString();\n        this.hasAD = in.readInt();\n        this.source = in.readString();\n        this.ename = in.readString();\n        this.tname = in.readString();\n        this.imgsrc = in.readString();\n        this.ptime = in.readString();\n        this.ads = new ArrayList<AdsBean>();\n        in.readList(this.ads, AdsBean.class.getClassLoader());\n        this.imgextra = new ArrayList<ImgextraBean>();\n        in.readList(this.imgextra, ImgextraBean.class.getClassLoader());\n    }\n\n    public static final Parcelable.Creator<NewsInfo> CREATOR = new Parcelable.Creator<NewsInfo>() {\n        @Override\n        public NewsInfo createFromParcel(Parcel source) {\n            return new NewsInfo(source);\n        }\n\n        @Override\n        public NewsInfo[] newArray(int size) {\n            return new NewsInfo[size];\n        }\n    };\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/client/BaseApiService.java",
    "content": "package com.lvr.livecircle.client;\n\n\nimport java.util.Map;\n\nimport io.reactivex.Observable;\nimport okhttp3.RequestBody;\nimport okhttp3.ResponseBody;\nimport retrofit2.http.Body;\nimport retrofit2.http.GET;\nimport retrofit2.http.Multipart;\nimport retrofit2.http.POST;\nimport retrofit2.http.Part;\nimport retrofit2.http.PartMap;\nimport retrofit2.http.Path;\nimport retrofit2.http.QueryMap;\n\n\npublic interface BaseApiService<T> {\n\n    public static final String Base_URL = \"http://ip.taobao.com/\";\n\n\n\n    @GET(\"{url}\")\n    Observable<BaseResponse<IpResult>> executeGet(\n            @Path(\"url\") String url,\n            @QueryMap Map<String, String> maps\n    );\n    @POST(\"{url}\")\n    Observable<BaseResponse<IpResult>> executePost(\n            @Path(\"url\") String url,\n            @QueryMap Map<String, String> maps);\n\n    @POST(\"{url}\")\n    Observable<ResponseBody> json(\n            @Path(\"url\") String url,\n            @Body RequestBody jsonStr);\n\n    @Multipart\n    @POST(\"{url}\")\n    Observable<ResponseBody> upLoadFile(\n            @Path(\"url\") String url,\n            @Part(\"image\\\"; filename=\\\"image.jpg\") RequestBody requestBody);\n\n    @POST(\"{url}\")\n    Observable<ResponseBody> uploadFiles(\n            @Path(\"url\") String url,\n            @Part(\"userName\") String description,\n            @PartMap() Map<String, RequestBody> maps);\n\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/client/BaseInterceptor.java",
    "content": "package com.lvr.livecircle.client;\nimport java.io.IOException;\nimport java.util.Map;\nimport java.util.Set;\n\nimport okhttp3.Interceptor;\nimport okhttp3.Request;\nimport okhttp3.Response;\n\n\npublic class BaseInterceptor implements Interceptor {\n    private Map<String, String> headers;\n    public BaseInterceptor(Map<String, String> headers) {\n        this.headers = headers;\n    }\n\n    @Override\n    public Response intercept(Chain chain) throws IOException {\n\n        Request.Builder builder = chain.request()\n                .newBuilder();\n        if (headers != null && headers.size() > 0) {\n            Set<String> keys = headers.keySet();\n            for (String headerKey : keys) {\n                builder.addHeader(headerKey, headers.get(headerKey)).build();\n            }\n        }\n        return chain.proceed(builder.build());\n\n    }\n}"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/client/BaseObserver.java",
    "content": "package com.lvr.livecircle.client;\n\nimport android.content.Context;\nimport android.util.Log;\nimport android.widget.Toast;\n\nimport io.reactivex.Observer;\nimport io.reactivex.disposables.Disposable;\n\n\npublic abstract class BaseObserver<T> implements Observer<T> {\n    private Context context;\n    public BaseObserver(Context context) {\n        this.context = context;\n    }\n    @Override\n    public void onError(Throwable e) {\n        Log.e(\"lvr\", e.getMessage());\n        // todo error somthing\n\n        if(e instanceof ExceptionHandle.ResponeThrowable){\n            onError((ExceptionHandle.ResponeThrowable)e);\n        } else {\n            onError(new ExceptionHandle.ResponeThrowable(e, ExceptionHandle.ERROR.UNKNOWN));\n        }\n    }\n\n    @Override\n    public void onSubscribe(Disposable d) {\n        Toast.makeText(context, \"建立连接\", Toast.LENGTH_SHORT).show();\n\n        //可以弹出Dialog 提示正在加载\n        showDialog();\n\n    }\n\n    protected abstract void hideDialog();\n\n    protected abstract void showDialog();\n\n    @Override\n    public void onComplete() {\n\n        Toast.makeText(context, \"请求完毕\", Toast.LENGTH_SHORT).show();\n        //可以取消Dialog 加载完毕\n        hideDialog();\n    }\n\n\n    public abstract void onError(ExceptionHandle.ResponeThrowable e);\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/client/BaseResponse.java",
    "content": "package com.lvr.livecircle.client;\n\n\n\npublic class BaseResponse<T> {\n\n    private int code;\n    private String msg;\n    private T data;\n\n    public int getCode() {\n        return code;\n    }\n\n    public void setCode(int code) {\n        this.code = code;\n    }\n\n    public String getMsg() {\n        return msg;\n    }\n\n    public void setMsg(String msg) {\n        this.msg = msg;\n    }\n\n    public T getData() {\n        return data;\n    }\n\n    public void setData(T data) {\n        this.data = data;\n    }\n\n    public boolean isOk() {\n        return code == 0;\n    }\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/client/CaheInterceptor.java",
    "content": "package com.lvr.livecircle.client;\n\nimport android.content.Context;\nimport android.util.Log;\n\nimport java.io.IOException;\n\nimport okhttp3.CacheControl;\nimport okhttp3.Interceptor;\nimport okhttp3.Request;\nimport okhttp3.Response;\n\npublic class CaheInterceptor implements Interceptor {\n\n    private Context context;\n\n    public CaheInterceptor(Context context) {\n        this.context = context;\n    }\n\n    @Override\n    public Response intercept(Chain chain) throws IOException {\n        Request request = chain.request();\n        if (NetworkUtil.isNetworkAvailable(context)) {\n            Response response = chain.proceed(request);\n            // read from cache for 60 s\n            int maxAge = 60;\n            String cacheControl = request.cacheControl().toString();\n            Log.e(\"CacheInterceptor\", \"6s load cahe\" + cacheControl);\n            return response.newBuilder()\n                    .removeHeader(\"Pragma\")\n                    .removeHeader(\"Cache-Control\")\n                    .header(\"Cache-Control\", \"public, max-age=\" + maxAge)\n                    .build();\n        } else {\n            Log.e(\"CacheInterceptor\", \" no network load cahe\");\n            request = request.newBuilder()\n                    .cacheControl(CacheControl.FORCE_CACHE)\n                    .build();\n            Response response = chain.proceed(request);\n            //set cahe times is 3 days\n            int maxStale = 60 * 60 * 24 * 3;\n            return response.newBuilder()\n                    .removeHeader(\"Pragma\")\n                    .removeHeader(\"Cache-Control\")\n                    .header(\"Cache-Control\", \"public, only-if-cached, max-stale=\" + maxStale)\n                    .build();\n        }\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/client/ExceptionHandle.java",
    "content": "package com.lvr.livecircle.client;\n\nimport android.net.ParseException;\n\nimport com.google.gson.JsonParseException;\nimport com.jakewharton.retrofit2.adapter.rxjava2.HttpException;\n\nimport org.apache.http.conn.ConnectTimeoutException;\nimport org.json.JSONException;\n\nimport java.net.ConnectException;\n\n\npublic class ExceptionHandle {\n\n    private static final int UNAUTHORIZED = 401;\n    private static final int FORBIDDEN = 403;\n    private static final int NOT_FOUND = 404;\n    private static final int REQUEST_TIMEOUT = 408;\n    private static final int INTERNAL_SERVER_ERROR = 500;\n    private static final int BAD_GATEWAY = 502;\n    private static final int SERVICE_UNAVAILABLE = 503;\n    private static final int GATEWAY_TIMEOUT = 504;\n\n    public static ResponeThrowable handleException(Throwable e) {\n        ResponeThrowable ex;\n        if (e instanceof HttpException) {\n            HttpException httpException = (HttpException) e;\n            ex = new ResponeThrowable(e, ERROR.HTTP_ERROR);\n            switch (httpException.code()) {\n                case UNAUTHORIZED:\n                case FORBIDDEN:\n                case NOT_FOUND:\n                case REQUEST_TIMEOUT:\n                case GATEWAY_TIMEOUT:\n                case INTERNAL_SERVER_ERROR:\n                case BAD_GATEWAY:\n                case SERVICE_UNAVAILABLE:\n                default:\n                    ex.message = \"网络错误\";\n                    break;\n            }\n            return ex;\n        } else if (e instanceof ServerException) {\n            ServerException resultException = (ServerException) e;\n            ex = new ResponeThrowable(resultException, resultException.code);\n            ex.message = resultException.message;\n            return ex;\n        } else if (e instanceof JsonParseException\n                || e instanceof JSONException\n                || e instanceof ParseException) {\n            ex = new ResponeThrowable(e, ERROR.PARSE_ERROR);\n            ex.message = \"解析错误\";\n            return ex;\n        } else if (e instanceof ConnectException) {\n            ex = new ResponeThrowable(e, ERROR.NETWORD_ERROR);\n            ex.message = \"连接失败\";\n            return ex;\n        } else if (e instanceof javax.net.ssl.SSLHandshakeException) {\n            ex = new ResponeThrowable(e, ERROR.SSL_ERROR);\n            ex.message = \"证书验证失败\";\n            return ex;\n        } else if (e instanceof ConnectTimeoutException){\n            ex = new ResponeThrowable(e, ERROR.TIMEOUT_ERROR);\n            ex.message = \"连接超时\";\n            return ex;\n        } else if (e instanceof java.net.SocketTimeoutException) {\n            ex = new ResponeThrowable(e, ERROR.TIMEOUT_ERROR);\n            ex.message = \"连接超时\";\n            return ex;\n        }\n        else {\n            ex = new ResponeThrowable(e, ERROR.UNKNOWN);\n            ex.message = \"未知错误\";\n            return ex;\n        }\n    }\n\n\n    /**\n     * 约定异常\n     */\n    class ERROR {\n        /**\n         * 未知错误\n         */\n        public static final int UNKNOWN = 1000;\n        /**\n         * 解析错误\n         */\n        public static final int PARSE_ERROR = 1001;\n        /**\n         * 网络错误\n         */\n        public static final int NETWORD_ERROR = 1002;\n        /**\n         * 协议出错\n         */\n        public static final int HTTP_ERROR = 1003;\n\n        /**\n         * 证书出错\n         */\n        public static final int SSL_ERROR = 1005;\n\n        /**\n         * 连接超时\n         */\n        public static final int TIMEOUT_ERROR = 1006;\n    }\n\n    public static class ResponeThrowable extends Exception {\n        public int code;\n        public String message;\n\n        public ResponeThrowable(Throwable throwable, int code) {\n            super(throwable);\n            this.code = code;\n\n        }\n    }\n\n    public class ServerException extends RuntimeException {\n        public int code;\n        public String message;\n    }\n}\n\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/client/IpResult.java",
    "content": "package com.lvr.livecircle.client;\n\n\npublic class IpResult {\n\n    private String country;\n    private String country_id;\n    private String area;\n    private String area_id;\n    private String region;\n    private String region_id;\n    private String city;\n    private String city_id;\n    private String county;\n    private String county_id;\n    private String isp;\n    private String isp_id;\n    private String ip;\n\n    public String getCountry() {\n        return country;\n    }\n\n    public void setCountry(String country) {\n        this.country = country;\n    }\n\n    public String getCountry_id() {\n        return country_id;\n    }\n\n    public void setCountry_id(String country_id) {\n        this.country_id = country_id;\n    }\n\n    public String getArea() {\n        return area;\n    }\n\n    public void setArea(String area) {\n        this.area = area;\n    }\n\n    public String getArea_id() {\n        return area_id;\n    }\n\n    public void setArea_id(String area_id) {\n        this.area_id = area_id;\n    }\n\n    public String getRegion() {\n        return region;\n    }\n\n    public void setRegion(String region) {\n        this.region = region;\n    }\n\n    public String getRegion_id() {\n        return region_id;\n    }\n\n    public void setRegion_id(String region_id) {\n        this.region_id = region_id;\n    }\n\n    public String getCity() {\n        return city;\n    }\n\n    public void setCity(String city) {\n        this.city = city;\n    }\n\n    public String getCity_id() {\n        return city_id;\n    }\n\n    public void setCity_id(String city_id) {\n        this.city_id = city_id;\n    }\n\n    public String getCounty() {\n        return county;\n    }\n\n    public void setCounty(String county) {\n        this.county = county;\n    }\n\n    public String getCounty_id() {\n        return county_id;\n    }\n\n    public void setCounty_id(String county_id) {\n        this.county_id = county_id;\n    }\n\n    public String getIsp() {\n        return isp;\n    }\n\n    public void setIsp(String isp) {\n        this.isp = isp;\n    }\n\n    public String getIsp_id() {\n        return isp_id;\n    }\n\n    public void setIsp_id(String isp_id) {\n        this.isp_id = isp_id;\n    }\n\n    public String getIp() {\n        return ip;\n    }\n\n    public void setIp(String ip) {\n        this.ip = ip;\n    }\n\n    @Override\n    public String toString() {\n        return \"IpResult{\" +\n                \"country='\" + country + '\\'' +\n                \", country_id='\" + country_id + '\\'' +\n                \", area='\" + area + '\\'' +\n                \", area_id='\" + area_id + '\\'' +\n                \", region='\" + region + '\\'' +\n                \", region_id='\" + region_id + '\\'' +\n                \", city='\" + city + '\\'' +\n                \", city_id='\" + city_id + '\\'' +\n                \", county='\" + county + '\\'' +\n                \", county_id='\" + county_id + '\\'' +\n                \", isp='\" + isp + '\\'' +\n                \", isp_id='\" + isp_id + '\\'' +\n                \", ip='\" + ip + '\\'' +\n                '}';\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/client/NetworkUtil.java",
    "content": "package com.lvr.livecircle.client;\n\nimport android.content.Context;\nimport android.net.ConnectivityManager;\nimport android.net.NetworkInfo;\nimport android.telephony.TelephonyManager;\n\nimport java.io.IOException;\nimport java.net.HttpURLConnection;\nimport java.net.InetAddress;\nimport java.net.NetworkInterface;\nimport java.net.SocketException;\nimport java.net.URL;\nimport java.util.Enumeration;\n\npublic class NetworkUtil {\n\n    public static int NET_CNNT_BAIDU_OK = 1; // NetworkAvailable\n    public static int NET_CNNT_BAIDU_TIMEOUT = 2; // no NetworkAvailable\n    public static int NET_NOT_PREPARE = 3; // Net no ready\n    public static int NET_ERROR = 4; //net error\n    private static int TIMEOUT = 3000; // TIMEOUT\n\n\n    /**\n     * check NetworkAvailable\n     * @param context\n     * @return\n     */\n    public static boolean isNetworkAvailable(Context context) {\n        ConnectivityManager manager = (ConnectivityManager) context.getApplicationContext().getSystemService(\n                Context.CONNECTIVITY_SERVICE);\n        if (null == manager)\n            return false;\n        NetworkInfo info = manager.getActiveNetworkInfo();\n        if (null == info || !info.isAvailable())\n            return false;\n        return true;\n    }\n\n    /**\n     * getLocalIpAddress\n     * @return\n     */\n    public static String getLocalIpAddress() {\n        String ret = \"\";\n        try {\n            for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {\n                NetworkInterface intf = en.nextElement();\n                for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {\n                    InetAddress inetAddress = enumIpAddr.nextElement();\n                    if (!inetAddress.isLoopbackAddress()) {\n                        ret = inetAddress.getHostAddress().toString();\n                    }\n                }\n            }\n        } catch (SocketException ex) {\n            ex.printStackTrace();\n        }\n        return ret;\n    }\n\n    /**\n     * 返回当前网络状态\n     *\n     * @param context\n     * @return\n     */\n    public static int getNetState(Context context) {\n        try {\n            ConnectivityManager connectivity = (ConnectivityManager) context\n                    .getSystemService(Context.CONNECTIVITY_SERVICE);\n            if (connectivity != null) {\n                NetworkInfo networkinfo = connectivity.getActiveNetworkInfo();\n                if (networkinfo != null) {\n                    if (networkinfo.isAvailable() && networkinfo.isConnected()) {\n                        if (!connectionNetwork())\n                            return NET_CNNT_BAIDU_TIMEOUT;\n                        else\n                            return NET_CNNT_BAIDU_OK;\n                    } else {\n                        return NET_NOT_PREPARE;\n                    }\n                }\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return NET_ERROR;\n    }\n\n    /**\n     *ping \"http://www.baidu.com\"\n     * @return\n     */\n    static private boolean connectionNetwork() {\n        boolean result = false;\n        HttpURLConnection httpUrl = null;\n        try {\n            httpUrl = (HttpURLConnection) new URL(\"http://www.baidu.com\")\n                    .openConnection();\n            httpUrl.setConnectTimeout(TIMEOUT);\n            httpUrl.connect();\n            result = true;\n        } catch (IOException e) {\n        } finally {\n            if (null != httpUrl) {\n                httpUrl.disconnect();\n            }\n            httpUrl = null;\n        }\n        return result;\n    }\n\n    /**\n     * check is3G\n     * @param context\n     * @return boolean\n     */\n    public static boolean is3G(Context context) {\n        ConnectivityManager connectivityManager = (ConnectivityManager) context\n                .getSystemService(Context.CONNECTIVITY_SERVICE);\n        NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();\n        if (activeNetInfo != null\n                && activeNetInfo.getType() == ConnectivityManager.TYPE_MOBILE) {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * isWifi\n     * @param context\n     * @return boolean\n     */\n    public static boolean isWifi(Context context) {\n        ConnectivityManager connectivityManager = (ConnectivityManager) context\n                .getSystemService(Context.CONNECTIVITY_SERVICE);\n        NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();\n        if (activeNetInfo != null\n                && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     * is2G\n     * @param context\n     * @return boolean\n     */\n    public static boolean is2G(Context context) {\n        ConnectivityManager connectivityManager = (ConnectivityManager) context\n                .getSystemService(Context.CONNECTIVITY_SERVICE);\n        NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();\n        if (activeNetInfo != null\n                && (activeNetInfo.getSubtype() == TelephonyManager.NETWORK_TYPE_EDGE\n                || activeNetInfo.getSubtype() == TelephonyManager.NETWORK_TYPE_GPRS || activeNetInfo\n                .getSubtype() == TelephonyManager.NETWORK_TYPE_CDMA)) {\n            return true;\n        }\n        return false;\n    }\n\n    /**\n     *  is wifi on\n     */\n    public static boolean isWifiEnabled(Context context) {\n        ConnectivityManager mgrConn = (ConnectivityManager) context\n                .getSystemService(Context.CONNECTIVITY_SERVICE);\n        TelephonyManager mgrTel = (TelephonyManager) context\n                .getSystemService(Context.TELEPHONY_SERVICE);\n        return ((mgrConn.getActiveNetworkInfo() != null && mgrConn\n                .getActiveNetworkInfo().getState() == NetworkInfo.State.CONNECTED) || mgrTel\n                .getNetworkType() == TelephonyManager.NETWORK_TYPE_UMTS);\n    }\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/client/RetrofitClient.java",
    "content": "package com.lvr.livecircle.client;\n\nimport android.content.Context;\nimport android.text.TextUtils;\nimport android.util.Log;\n\nimport com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;\n\nimport java.io.File;\nimport java.util.Map;\nimport java.util.concurrent.TimeUnit;\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.functions.Function;\nimport io.reactivex.schedulers.Schedulers;\nimport okhttp3.Cache;\nimport okhttp3.OkHttpClient;\nimport okhttp3.RequestBody;\nimport okhttp3.ResponseBody;\nimport okhttp3.logging.HttpLoggingInterceptor;\nimport retrofit2.Retrofit;\nimport retrofit2.converter.gson.GsonConverterFactory;\n\n\n/**\n * RetrofitClient\n */\npublic class RetrofitClient {\n\n    private static final int DEFAULT_TIMEOUT = 20;\n    private BaseApiService apiService;\n    private static OkHttpClient okHttpClient;\n    public static String baseUrl = BaseApiService.Base_URL;\n    private static Context mContext;\n    private static RetrofitClient sNewInstance;\n    private static ErrorTransformer transformer = new ErrorTransformer();\n\n    private static Retrofit retrofit;\n    private Cache cache = null;\n    private File httpCacheDirectory;\n\n\n    private static Retrofit.Builder builder =\n            new Retrofit.Builder()\n                    .addConverterFactory(GsonConverterFactory.create())\n                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())\n                    .baseUrl(baseUrl);\n    private static OkHttpClient.Builder httpClient =\n            new OkHttpClient.Builder()\n                    .addNetworkInterceptor(\n                            new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.HEADERS))\n                    .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);\n    private static Class<? extends Class> aClass;\n\n    //默认baseUrl的单例\n    private static class SingletonHolder {\n        private static RetrofitClient INSTANCE = new RetrofitClient(\n                mContext);\n    }\n    public static RetrofitClient getInstance(Context context) {\n        if (context != null) {\n            mContext = context;\n        }\n        return SingletonHolder.INSTANCE;\n    }\n\n    //自己提供url\n    public static RetrofitClient getInstance(Context context, String url) {\n        if (context != null) {\n            mContext = context;\n        }\n\n        return new RetrofitClient(context, url);\n    }\n\n    //不仅有url还有headers\n    public static RetrofitClient getInstance(Context context, String url, Map<String, String> headers) {\n        if (context != null) {\n            mContext = context;\n        }\n        return new RetrofitClient(context, url, headers);\n    }\n\n    private RetrofitClient() {\n\n    }\n\n    private RetrofitClient(Context context) {\n\n        this(context, baseUrl, null);\n    }\n\n    private RetrofitClient(Context context, String url) {\n\n        this(context, url, null);\n    }\n\n    private RetrofitClient(Context context, String url, Map<String, String> headers) {\n        //url为空，则默认使用baseUrl\n        if (TextUtils.isEmpty(url)) {\n            url = baseUrl;\n        }\n        //缓存地址\n        if (httpCacheDirectory == null) {\n            httpCacheDirectory = new File(mContext.getCacheDir(), \"app_cache\");\n        }\n\n        try {\n            if (cache == null) {\n                cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024);\n            }\n        } catch (Exception e) {\n            Log.e(\"OKHttp\", \"Could not create http cache\", e);\n        }\n        //okhttp创建了\n        okHttpClient = new OkHttpClient.Builder()\n                .addNetworkInterceptor(\n                        new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))\n                .cache(cache)\n                .addInterceptor(new BaseInterceptor(headers))\n                .addInterceptor(new CaheInterceptor(context))\n                .addNetworkInterceptor(new CaheInterceptor(context))\n                .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)\n                .writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)\n                .build();\n        //retrofit创建了\n        retrofit = new Retrofit.Builder()\n                .client(okHttpClient)\n                .addConverterFactory(GsonConverterFactory.create())\n                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())\n                .baseUrl(url)\n                .build();\n\n    }\n\n\n    public  void get(String url, Map parameters, Observer<?> observer) {\n        apiService.executeGet(url, parameters)\n                .compose(schedulersTransformer)\n                .compose(transformer)\n                .subscribe(observer);\n    }\n\n    public  void post(String url, Map<String, String> parameters, Observer<?> observer) {\n        apiService.executePost(url, parameters)\n                .compose(schedulersTransformer)\n                .compose(transformer)\n                .subscribe(observer);\n    }\n\n    public  void json(String url, RequestBody jsonStr, Observer<ResponseBody> observer) {\n\n        apiService.json(url, jsonStr)\n                .compose(schedulersTransformer)\n                .compose(transformer)\n                .subscribe(observer);\n    }\n\n    public void upload(String url, RequestBody requestBody, Observer<ResponseBody> observer) {\n        apiService.upLoadFile(url, requestBody)\n                .compose(schedulersTransformer)\n                .compose(transformer)\n                .subscribe(observer);\n    }\n    //处理线程调度的变换\n    public static ObservableTransformer schedulersTransformer = new ObservableTransformer() {\n        @Override\n        public ObservableSource apply(Observable upstream) {\n            return ((Observable) upstream).subscribeOn(Schedulers.io())\n                    .unsubscribeOn(Schedulers.io())\n                    .observeOn(AndroidSchedulers.mainThread());\n        }\n    };\n    //处理错误的变换\n    private static class ErrorTransformer<T> implements ObservableTransformer{\n\n        @Override\n        public ObservableSource apply(Observable upstream) {\n            //onErrorResumeNext当发生错误的时候，由另外一个Observable来代替当前的Observable并继续发射数据\n            return (Observable<T>) upstream.map(new HandleFuc<T>()).onErrorResumeNext(new HttpResponseFunc<T>());\n        }\n    }\n\n\n    public static class HttpResponseFunc<T> implements Function<Throwable, Observable<T>> {\n        @Override\n        public Observable<T> apply(Throwable throwable) throws Exception {\n            return Observable.error(ExceptionHandle.handleException(throwable));\n        }\n    }\n\n    public static class HandleFuc<T> implements Function<BaseResponse<T>, T> {\n        @Override\n        public T apply(BaseResponse<T> response) throws Exception {\n            //response中code码不会0 出现错误\n            if (!response.isOk())\n                throw new RuntimeException(response.getCode() + \"\" + response.getMsg() != null ? response.getMsg() : \"\");\n            return response.getData();\n        }\n    }\n    /**\n     * 创建默认url的api类\n     * @return ApiManager\n     */\n    public RetrofitClient createBaseApi() {\n        apiService = create(BaseApiService.class);\n        return this;\n    }\n\n    /**\n     * create you ApiService\n     * Create an implementation of the API endpoints defined by the {@code service} interface.\n     */\n    public  <T> T create(final Class<T> service) {\n        if (service == null) {\n            throw new RuntimeException(\"Api service is null!\");\n        }\n        return retrofit.create(service);\n    }\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/client/RxDisposeManager.java",
    "content": "package com.lvr.livecircle.client;\n\nimport android.support.v4.util.ArrayMap;\n\nimport java.util.Set;\n\nimport io.reactivex.disposables.Disposable;\n\n/**\n * Created by lvr on 2017/2/9.\n */\n\npublic class RxDisposeManager {\n    private static RxDisposeManager sInstance = null;\n\n    private ArrayMap<Object, Disposable> maps;\n\n    public static RxDisposeManager get() {\n\n        if (sInstance == null) {\n            synchronized (RxDisposeManager.class) {\n                if (sInstance == null) {\n                    sInstance = new RxDisposeManager();\n                }\n            }\n        }\n        return sInstance;\n    }\n\n    private RxDisposeManager() {\n        maps = new ArrayMap<>();\n    }\n\n\n    public void add(Object tag, Disposable disposable) {\n        maps.put(tag, disposable);\n    }\n\n\n    public void remove(Object tag) {\n        if (!maps.isEmpty()) {\n            maps.remove(tag);\n        }\n    }\n\n    public void removeAll() {\n        if (!maps.isEmpty()) {\n            maps.clear();\n        }\n    }\n\n\n    public void cancel(Object tag) {\n        if (maps.isEmpty()) {\n            return;\n        }\n        if (maps.get(tag) == null) {\n            return;\n        }\n        if (!maps.get(tag).isDisposed()) {\n            maps.get(tag).dispose();\n            maps.remove(tag);\n        }\n    }\n\n    public void cancelAll() {\n        if (maps.isEmpty()) {\n            return;\n        }\n        Set<Object> keys = maps.keySet();\n        for (Object apiKey : keys) {\n            cancel(apiKey);\n        }\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/find/FindFragment.java",
    "content": "package com.lvr.livecircle.find;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.base.BaseFragment;\n\n/**\n * Created by lvr on 2017/2/6.\n */\n\npublic class FindFragment extends BaseFragment {\n    @Override\n    protected int getLayoutResource() {\n        return R.layout.fragment_find;\n    }\n\n\n\n    @Override\n    protected void initView() {\n\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/home/MainActivity.java",
    "content": "package com.lvr.livecircle.home;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.support.design.widget.FloatingActionButton;\nimport android.support.design.widget.NavigationView;\nimport android.support.design.widget.TabLayout;\nimport android.support.v4.app.Fragment;\nimport android.support.v4.app.FragmentManager;\nimport android.support.v4.app.FragmentTransaction;\nimport android.support.v4.view.ViewPager;\nimport android.support.v4.widget.DrawerLayout;\nimport android.support.v7.app.ActionBar;\nimport android.support.v7.app.ActionBarDrawerToggle;\nimport android.support.v7.widget.Toolbar;\nimport android.view.Menu;\nimport android.view.View;\nimport android.widget.ImageView;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.adapter.HomeViewPagerAdapter;\nimport com.lvr.livecircle.base.BaseActivity;\nimport com.lvr.livecircle.bean.FabScrollBean;\nimport com.lvr.livecircle.find.FindFragment;\nimport com.lvr.livecircle.meitu.MeiTuFragment;\nimport com.lvr.livecircle.music.MusicFragment;\nimport com.lvr.livecircle.nearby.NearByFragment;\nimport com.lvr.livecircle.news.fragment.NewsFragment;\nimport com.lvr.livecircle.recommend.RecommendFragment;\nimport com.lvr.livecircle.utils.StatusBarSetting;\nimport com.lvr.livecircle.video.VideoFragment;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\n\nimport butterknife.BindView;\nimport de.greenrobot.event.EventBus;\n\npublic class MainActivity extends BaseActivity {\n\n    @BindView(R.id.toolbar)\n    Toolbar mToolbar;\n    @BindView(R.id.navigation)\n    NavigationView mAmNv;\n    @BindView(R.id.drawer_layout)\n    DrawerLayout mAmDl;\n    @BindView(R.id.tabs)\n    TabLayout mTabs;\n    @BindView(R.id.vp_moudle)\n    ViewPager mVpMoudle;\n    @BindView(R.id.fab)\n    FloatingActionButton mFab;\n    private View mView_nav;\n    private ImageView mIv_photo;\n    private String[] mMoudleName = {\"推荐\", \"新闻\", \"音乐\", \"美图\", \"附近\", \"视频\", \"发现\"};\n    private ArrayList<Fragment> mFragmentList = new ArrayList<Fragment>();\n    private NewsFragment mNewsFragment;\n    private RecommendFragment mRecommendFragment;\n    private MusicFragment mMusicFragment;\n    private MeiTuFragment mMeiTuFragment;\n    private NearByFragment mNearByFragment;\n    private VideoFragment mVideoFragment;\n    private FindFragment mFindFragment;\n    private HomeViewPagerAdapter mAdapter;\n\n    @Override\n    public int getLayoutId() {\n        return R.layout.activity_main;\n    }\n\n    @Override\n    public void initPresenter() {\n\n    }\n\n    @Override\n    public void initView() {\n        StatusBarSetting.setColorForDrawerLayout(this, mAmDl, getResources().getColor(R.color.colorPrimary), StatusBarSetting.DEFAULT_STATUS_BAR_ALPHA);\n        setToolBar();\n        setNavigationView();\n        mFab.setOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                EventBus.getDefault().post(new FabScrollBean(\"滑动到顶端\",mTabs.getSelectedTabPosition()));\n\n            }\n        });\n        mTabs.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {\n            @Override\n            public void onTabSelected(TabLayout.Tab tab) {\n                int position = tab.getPosition();\n                if(position==1||position==3){\n                    mFab.setVisibility(View.VISIBLE);\n                }else{\n                    mFab.setVisibility(View.GONE);\n                }\n            }\n\n            @Override\n            public void onTabUnselected(TabLayout.Tab tab) {\n\n            }\n\n            @Override\n            public void onTabReselected(TabLayout.Tab tab) {\n\n            }\n        });\n\n    }\n    @Override\n    public void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        //初始化frament\n        initFragment(savedInstanceState);\n        setViewPager();\n    }\n\n    /**\n     * 填充ViewPager内容\n     */\n    private void setViewPager() {\n        mAdapter = new HomeViewPagerAdapter(getSupportFragmentManager(), mFragmentList, Arrays.asList(mMoudleName));\n        mVpMoudle.setAdapter(mAdapter);\n        mTabs.setupWithViewPager(mVpMoudle);\n        mTabs.setTabTextColors(getResources().getColor(R.color.white), getResources().getColor(R.color.black));\n    }\n\n    @Override\n    protected void onSaveInstanceState(Bundle outState) {\n        super.onSaveInstanceState(outState);\n        FragmentManager manager = getSupportFragmentManager();\n        if (mNewsFragment.isAdded()) {\n            manager.putFragment(outState, \"NewsFragment\", mNewsFragment);\n        }\n        if (mFindFragment.isAdded()) {\n            manager.putFragment(outState, \"FindFragment\", mFindFragment);\n        }\n        if (mVideoFragment.isAdded()) {\n            manager.putFragment(outState, \"VideoFragment\", mVideoFragment);\n        }\n        if (mNearByFragment.isAdded()) {\n            manager.putFragment(outState, \"NearByFragment\", mNearByFragment);\n        }\n        if (mMeiTuFragment.isAdded()) {\n            manager.putFragment(outState, \"MeiTuFragment\", mMeiTuFragment);\n        }\n        if (mMusicFragment.isAdded()) {\n            manager.putFragment(outState, \"MusicFragment\", mMusicFragment);\n        }\n        if (mRecommendFragment.isAdded()) {\n            manager.putFragment(outState, \"RecommendFragment\", mRecommendFragment);\n        }\n    }\n\n    /**\n     * 初始化fragment的记忆状态\n     *\n     * @param savedInstanceState\n     */\n    private void initFragment(Bundle savedInstanceState) {\n        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();\n        if (savedInstanceState != null) {\n            mNewsFragment = (NewsFragment) getSupportFragmentManager().getFragment(savedInstanceState, \"NewsFragment\");\n            mRecommendFragment = (RecommendFragment) getSupportFragmentManager().getFragment(savedInstanceState, \"RecommendFragment\");\n            mFindFragment = (FindFragment) getSupportFragmentManager().getFragment(savedInstanceState, \"FindFragment\");\n            mVideoFragment = (VideoFragment) getSupportFragmentManager().getFragment(savedInstanceState, \"VideoFragment\");\n            mNearByFragment = (NearByFragment) getSupportFragmentManager().getFragment(savedInstanceState, \"NearByFragment\");\n            mMeiTuFragment = (MeiTuFragment) getSupportFragmentManager().getFragment(savedInstanceState, \"MeiTuFragment\");\n            mMusicFragment = (MusicFragment) getSupportFragmentManager().getFragment(savedInstanceState, \"MusicFragment\");\n        } else {\n            mNewsFragment = new NewsFragment();\n            mRecommendFragment = new RecommendFragment();\n            mFindFragment = new FindFragment();\n            mVideoFragment = new VideoFragment();\n            mNearByFragment = new NearByFragment();\n            mMeiTuFragment = new MeiTuFragment();\n            mMusicFragment = new MusicFragment();\n        }\n        mFragmentList.add(mRecommendFragment);\n        mFragmentList.add(mNewsFragment);\n        mFragmentList.add(mMusicFragment);\n        mFragmentList.add(mMeiTuFragment);\n        mFragmentList.add(mNearByFragment);\n        mFragmentList.add(mVideoFragment);\n        mFragmentList.add(mFindFragment);\n    }\n\n    /**\n     * 设置导航页信息\n     */\n    private void setNavigationView() {\n        //NavigationView初始化\n        mAmNv.setItemIconTintList(null);\n        View headerView = mAmNv.getHeaderView(0);\n        mIv_photo = (ImageView) headerView.findViewById(R.id.iv_user_photo);\n    }\n\n    /**\n     * 设置状态栏\n     */\n    private void setToolBar() {\n        setSupportActionBar(mToolbar);\n        ActionBar actionBar = getSupportActionBar();\n        //菜单按钮可用\n        actionBar.setHomeButtonEnabled(true);\n        //回退按钮可用\n        actionBar.setDisplayHomeAsUpEnabled(true);\n        //将drawlayout与toolbar绑定在一起\n        ActionBarDrawerToggle abdt = new ActionBarDrawerToggle(this, mAmDl, mToolbar, R.string.app_name, R.string.app_name);\n        abdt.syncState();//初始化状态\n        //设置drawlayout的监听事件 打开/关闭\n        mAmDl.setDrawerListener(abdt);\n        //actionbar中的内容进行初始化\n        mToolbar.setTitle(\"Live圈\");//设置标题\n        mToolbar.setTitleTextColor(getResources().getColor(R.color.white));\n    }\n\n    /**\n     * 入口\n     *\n     * @param activity\n     */\n    public static void startAction(Activity activity) {\n        Intent intent = new Intent(activity, MainActivity.class);\n        activity.startActivity(intent);\n        activity.overridePendingTransition(R.anim.fade_in,\n                R.anim.fade_out);\n    }\n\n    @Override\n    public boolean onCreateOptionsMenu(Menu menu) {\n        getMenuInflater().inflate(R.menu.menu_toolabr, menu);\n        return true;\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/home/SplashActivity.java",
    "content": "package com.lvr.livecircle.home;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorSet;\nimport android.animation.ObjectAnimator;\nimport android.animation.PropertyValuesHolder;\nimport android.view.animation.AccelerateInterpolator;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.base.BaseActivity;\n\nimport butterknife.BindView;\n\n/**\n * Created by lvr on 2017/2/6.\n */\n\npublic class SplashActivity extends BaseActivity {\n    @BindView(R.id.iv_logo)\n    ImageView mIvLogo;\n    @BindView(R.id.tv_name)\n    TextView mTvName;\n\n    @Override\n    public int getLayoutId() {\n        return R.layout.activty_splash;\n    }\n\n    @Override\n    public void initPresenter() {\n\n    }\n\n    @Override\n    public void initView() {\n        SetTranslanteBar();\n        PropertyValuesHolder alpha = PropertyValuesHolder.ofFloat(\"alpha\", 0.3f, 1f);\n        PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat(\"scaleX\", 0.3f, 1f);\n        PropertyValuesHolder scaleY = PropertyValuesHolder.ofFloat(\"scaleY\", 0.3f, 1f);\n        ObjectAnimator objectAnimator1 = ObjectAnimator.ofPropertyValuesHolder(mTvName, alpha, scaleX, scaleY);\n        ObjectAnimator objectAnimator2 = ObjectAnimator.ofPropertyValuesHolder(mIvLogo, alpha, scaleX, scaleY);\n        AnimatorSet animatorSet = new AnimatorSet();\n        animatorSet.playTogether(objectAnimator1, objectAnimator2);\n        animatorSet.setInterpolator(new AccelerateInterpolator());\n        animatorSet.setDuration(2000);\n        animatorSet.addListener(new Animator.AnimatorListener() {\n            @Override\n            public void onAnimationStart(Animator animator) {\n\n            }\n\n            @Override\n            public void onAnimationEnd(Animator animator) {\n                MainActivity.startAction(SplashActivity.this);\n                finish();\n            }\n\n            @Override\n            public void onAnimationCancel(Animator animator) {\n\n            }\n\n            @Override\n            public void onAnimationRepeat(Animator animator) {\n\n            }\n        });\n        animatorSet.start();\n    }\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/meitu/MeiTuFragment.java",
    "content": "package com.lvr.livecircle.meitu;\n\nimport android.content.Context;\nimport android.support.v7.widget.StaggeredGridLayoutManager;\n\nimport com.aspsine.irecyclerview.IRecyclerView;\nimport com.aspsine.irecyclerview.OnLoadMoreListener;\nimport com.aspsine.irecyclerview.OnRefreshListener;\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.adapter.PhotoListAdapter;\nimport com.lvr.livecircle.base.BaseFragment;\nimport com.lvr.livecircle.bean.FabScrollBean;\nimport com.lvr.livecircle.client.RxDisposeManager;\nimport com.lvr.livecircle.meitu.model.bean.PhotoGirl;\nimport com.lvr.livecircle.meitu.presenter.impl.PhotoPresenterImpl;\nimport com.lvr.livecircle.meitu.view.PhotoView;\nimport com.lvr.livecircle.widget.LoadMoreFooterView;\nimport com.lvr.livecircle.widget.LoadingDialog;\n\nimport java.util.List;\n\nimport butterknife.BindView;\nimport de.greenrobot.event.EventBus;\nimport de.greenrobot.event.Subscribe;\n\n/**\n * Created by lvr on 2017/2/6.\n */\n\npublic class MeiTuFragment extends BaseFragment implements PhotoView, OnRefreshListener, OnLoadMoreListener {\n    @BindView(R.id.recyclerView)\n    IRecyclerView mRecyclerView;\n    private Context mContext;\n    private static int SIZE = 20;\n    private int mStartPage = 1;\n    private PhotoPresenterImpl mPresenter;\n    private PhotoListAdapter mAdapter;\n    private LoadMoreFooterView mFooterView;\n\n    @Override\n    protected int getLayoutResource() {\n        return R.layout.fragment_meitu;\n    }\n\n    @Override\n    protected void onFragmentVisibleChange(boolean isVisible) {\n        if(isVisible){\n            //可见，并且是第一次加载\n            mPresenter.requestPhotoList(SIZE,mStartPage);\n            LoadingDialog.showDialogForLoading(getActivity());\n        }else{\n            //取消加载\n            RxDisposeManager.get().cancel(\"photoList\");\n            LoadingDialog.cancelDialogForLoading();\n        }\n    }\n\n    @Override\n    protected void initView() {\n\n        mContext = getActivity();\n        mPresenter = new PhotoPresenterImpl(this);\n        StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);\n        manager.setItemPrefetchEnabled(false);\n        mRecyclerView.setLayoutManager(manager);\n        mRecyclerView.setOnRefreshListener(this);\n        mRecyclerView.setOnLoadMoreListener(this);\n        mFooterView = (LoadMoreFooterView) mRecyclerView.getLoadMoreFooterView();\n        if (!EventBus.getDefault().isRegistered(this)) {\n            EventBus.getDefault().register(this);\n        }\n    }\n\n    @Subscribe\n    public void onFabScrollEvent(FabScrollBean event) {\n        if(event.getPosition()==3){\n            mRecyclerView.smoothScrollToPosition(0);\n        }\n    }\n\n    @Override\n    public void returnPhotoList(List<PhotoGirl> photoGirlList) {\n        if (!isFirst) {\n            isFirst = true;\n            LoadingDialog.cancelDialogForLoading();\n            mAdapter = new PhotoListAdapter(mContext, photoGirlList);\n            mRecyclerView.setIAdapter(mAdapter);\n        } else if (photoGirlList != null) {\n            if (mStartPage == 1) {\n                //刷新请求\n                mRecyclerView.setRefreshing(false);\n                List<PhotoGirl> data = mAdapter.getAdapterData();\n                data.clear();\n                data.addAll(photoGirlList);\n                mAdapter.notifyDataSetChanged();\n            } else {\n                //加载更多\n                List<PhotoGirl> data = mAdapter.getAdapterData();\n                data.addAll(photoGirlList);\n                mAdapter.notifyDataSetChanged();\n            }\n        } else {\n            mStartPage--;\n            mFooterView.setStatus(LoadMoreFooterView.Status.THE_END);\n        }\n    }\n\n    @Override\n    public void showErrorTip() {\n        if (mFooterView != null) {\n            mFooterView.setStatus(LoadMoreFooterView.Status.ERROR);\n        }\n    }\n\n    @Override\n    public void onLoadMore() {\n        mStartPage++;\n        mPresenter.requestPhotoList(SIZE, mStartPage);\n        mFooterView.setStatus(LoadMoreFooterView.Status.LOADING);\n    }\n\n    @Override\n    public void onRefresh() {\n        //发起请求\n        mRecyclerView.setRefreshing(true);\n        mStartPage = 1;\n        mPresenter.requestPhotoList(SIZE, mStartPage);\n        mFooterView.setStatus(LoadMoreFooterView.Status.GONE);\n    }\n\n\n\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/meitu/model/PhotoModel.java",
    "content": "package com.lvr.livecircle.meitu.model;\n\nimport com.lvr.livecircle.meitu.model.bean.PhotoGirl;\n\nimport java.util.List;\n\nimport io.reactivex.Observable;\n\n/**\n * Created by lvr on 2017/2/20.\n */\n\npublic interface PhotoModel {\n    Observable<List<PhotoGirl>> getPhotoList(int size, int page);\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/meitu/model/bean/GirlData.java",
    "content": "package com.lvr.livecircle.meitu.model.bean;\n\nimport java.util.List;\n\n/**\n * Created by lvr on 2017/2/20.\n */\n\npublic class GirlData {\n\n    /**\n     * error : false\n     * results : [{\"_id\":\"58a9752b421aa93d3d15aa31\",\"createdAt\":\"2017-02-19T18:36:27.16Z\",\"desc\":\"2-20\",\"publishedAt\":\"2017-02-20T11:56:22.616Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://7xi8d6.com1.z0.glb.clouddn.com/2017-02-19-16789884_666922016823652_4719569931841044480_n.jpg\",\"used\":true,\"who\":\"daimajia\"},{\"_id\":\"58a641a4421aa9662f429734\",\"createdAt\":\"2017-02-17T08:19:48.413Z\",\"desc\":\"2-17\",\"publishedAt\":\"2017-02-17T11:31:19.996Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://7xi8d6.com1.z0.glb.clouddn.com/2017-02-17-16464474_721724277990542_654863958657728512_n.jpg\",\"used\":true,\"who\":\"daimajia\"},{\"_id\":\"58a504d1421aa966366d05ce\",\"createdAt\":\"2017-02-16T09:48:01.526Z\",\"desc\":\"2-16\",\"publishedAt\":\"2017-02-16T10:07:37.13Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://7xi8d6.com1.z0.glb.clouddn.com/2017-02-16-16790004_607292222809583_5160406710837313536_n.jpg\",\"used\":true,\"who\":\"daimajia\"},{\"_id\":\"58a39d1c421aa966366d05c0\",\"createdAt\":\"2017-02-15T08:13:16.351Z\",\"desc\":\"2-15\",\"publishedAt\":\"2017-02-15T11:24:04.127Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://7xi8d6.com1.z0.glb.clouddn.com/2017-02-15-16464434_414363458902323_3665858302006263808_n.jpg\",\"used\":true,\"who\":\"daimajia\"},{\"_id\":\"58a24ce0421aa901ef40579f\",\"createdAt\":\"2017-02-14T08:18:40.781Z\",\"desc\":\"2-14\",\"publishedAt\":\"2017-02-14T11:42:37.303Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://7xi8d6.com1.z0.glb.clouddn.com/2017-02-14-16123260_755771577930478_8918176595718438912_n.jpg\",\"used\":true,\"who\":\"daimajia\"},{\"_id\":\"58a10619421aa901f7902c6a\",\"createdAt\":\"2017-02-13T09:04:25.996Z\",\"desc\":\"2-13\",\"publishedAt\":\"2017-02-13T11:54:17.922Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://7xi8d6.com1.z0.glb.clouddn.com/2017-02-13-16464498_1247940031909047_2763412151866490880_n.jpg\",\"used\":true,\"who\":\"daimajia\"},{\"_id\":\"589d31a2421aa9270bc7332e\",\"createdAt\":\"2017-02-10T11:21:06.747Z\",\"desc\":\"2-10\",\"publishedAt\":\"2017-02-10T11:38:22.122Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://7xi8d6.com1.z0.glb.clouddn.com/2017-02-10-16465759_171779496648995_128281069584646144_n.jpg\",\"used\":true,\"who\":\"代码家\"},{\"_id\":\"589bb252421aa92dc0dfd3bf\",\"createdAt\":\"2017-02-09T08:05:38.361Z\",\"desc\":\"2-9\",\"publishedAt\":\"2017-02-09T11:46:26.70Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://7xi8d6.com1.z0.glb.clouddn.com/2017-02-09-16583339_172818256542563_353855393375453184_n.jpg\",\"used\":true,\"who\":\"daimajia\"},{\"_id\":\"589a7161421aa92db8a0041b\",\"createdAt\":\"2017-02-08T09:16:17.678Z\",\"desc\":\"2-8\",\"publishedAt\":\"2017-02-08T11:39:51.371Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://7xi8d6.com1.z0.glb.clouddn.com/2017-02-08-16230686_191036801373876_4789664128824246272_n.jpg\",\"used\":true,\"who\":\"daimajia\"},{\"_id\":\"58993f2c421aa970b84523ab\",\"createdAt\":\"2017-02-07T11:29:48.689Z\",\"desc\":\"2-7\",\"publishedAt\":\"2017-02-07T11:37:03.683Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://7xi8d6.com1.z0.glb.clouddn.com/2017-02-07-032924.jpg\",\"used\":true,\"who\":\"daimajia\"},{\"_id\":\"5897d9e9421aa970bb154891\",\"createdAt\":\"2017-02-06T10:05:29.443Z\",\"desc\":\"2-6\",\"publishedAt\":\"2017-02-06T11:36:12.36Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://7xi8d6.com1.z0.glb.clouddn.com/2017-02-06-16464762_1304611439576933_4803269855073533952_n.jpg\",\"used\":true,\"who\":\"代码家\"},{\"_id\":\"58947b15421aa970bb154878\",\"createdAt\":\"2017-02-03T20:44:05.311Z\",\"desc\":\"2-4\",\"publishedAt\":\"2017-02-04T11:47:42.336Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://7xi8d6.com1.z0.glb.clouddn.com/2017-02-03-123209.jpg\",\"used\":true,\"who\":\"代码家\"},{\"_id\":\"5893f544421aa90e69b17f8c\",\"createdAt\":\"2017-02-03T11:13:08.967Z\",\"desc\":\"2-3\",\"publishedAt\":\"2017-02-03T11:52:22.806Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://7xi8d6.com1.z0.glb.clouddn.com/16123958_1630476787257847_7576387494862651392_n.jpg\",\"used\":true,\"who\":\"daimajia\"},{\"_id\":\"58857746421aa95eae2d92b3\",\"createdAt\":\"2017-01-23T11:23:50.64Z\",\"desc\":\"1-23\",\"publishedAt\":\"2017-01-23T11:35:32.450Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://7xi8d6.com1.z0.glb.clouddn.com/16124047_121657248344062_4191645221970247680_n.jpg\",\"used\":true,\"who\":\"代码家\"},{\"_id\":\"58841c08421aa95ea9de7a0c\",\"createdAt\":\"2017-01-22T10:42:16.648Z\",\"desc\":\"1-22\",\"publishedAt\":\"2017-01-22T11:39:29.779Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://7xi8d6.com1.z0.glb.clouddn.com/16229501_482786908558452_6858241750058663936_n.jpg\",\"used\":true,\"who\":\"daimajia\"},{\"_id\":\"58817e1e421aa9119735ac5f\",\"createdAt\":\"2017-01-20T11:03:58.727Z\",\"desc\":\"1-20\",\"publishedAt\":\"2017-01-20T11:50:52.750Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://7xi8d6.com1.z0.glb.clouddn.com/2017-01-20-030332.jpg\",\"used\":true,\"who\":\"daimajia\"},{\"_id\":\"58802bea421aa9119a6ca6ab\",\"createdAt\":\"2017-01-19T11:00:58.838Z\",\"desc\":\"1-19\",\"publishedAt\":\"2017-01-19T11:40:09.118Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://7xi8d6.com1.z0.glb.clouddn.com/16124351_1863111260639981_4361246625721483264_n.jpg\",\"used\":true,\"who\":\"daimajia\"},{\"_id\":\"587c6073421aa91194ca0e2c\",\"createdAt\":\"2017-01-16T13:56:03.417Z\",\"desc\":\"1-16\",\"publishedAt\":\"2017-01-16T14:12:18.71Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://ww3.sinaimg.cn/large/610dc034gw1fbsfgssfrwj20u011h48y.jpg\",\"used\":true,\"who\":\"daimajia\"},{\"_id\":\"5878471d421aa9119735ac13\",\"createdAt\":\"2017-01-13T11:18:53.183Z\",\"desc\":\"1-13\",\"publishedAt\":\"2017-01-13T11:58:16.991Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://ww3.sinaimg.cn/large/610dc034gw1fbou2xsqpaj20u00u0q4h.jpg\",\"used\":true,\"who\":\"daimajia\"},{\"_id\":\"5876e811421aa9315bfbe85f\",\"createdAt\":\"2017-01-12T10:21:05.74Z\",\"desc\":\"1-12\",\"publishedAt\":\"2017-01-12T11:30:59.369Z\",\"source\":\"chrome\",\"type\":\"福利\",\"url\":\"http://ww2.sinaimg.cn/large/0060lm7Tgw1fbnmsjogt9j30u00u0jvv.jpg\",\"used\":true,\"who\":\"daimajia\"}]\n     */\n\n    private boolean error;\n    private List<PhotoGirl> results;\n\n    public boolean isError() {\n        return error;\n    }\n\n    public void setError(boolean error) {\n        this.error = error;\n    }\n\n    public List<PhotoGirl> getResults() {\n        return results;\n    }\n\n    public void setResults(List<PhotoGirl> results) {\n        this.results = results;\n    }\n\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/meitu/model/bean/PhotoGirl.java",
    "content": "package com.lvr.livecircle.meitu.model.bean;\n\n/**\n * Created by lvr on 2017/2/20.\n */\n\npublic class PhotoGirl {\n\n    /**\n     * _id : 58a9752b421aa93d3d15aa31\n     * createdAt : 2017-02-19T18:36:27.16Z\n     * desc : 2-20\n     * publishedAt : 2017-02-20T11:56:22.616Z\n     * source : chrome\n     * type : 福利\n     * url : http://7xi8d6.com1.z0.glb.clouddn.com/2017-02-19-16789884_666922016823652_4719569931841044480_n.jpg\n     * used : true\n     * who : daimajia\n     */\n\n    private String _id;\n    private String createdAt;\n    private String desc;\n    private String publishedAt;\n    private String source;\n    private String type;\n    private String url;\n    private boolean used;\n    private String who;\n\n    public String get_id() {\n        return _id;\n    }\n\n    public void set_id(String _id) {\n        this._id = _id;\n    }\n\n    public String getCreatedAt() {\n        return createdAt;\n    }\n\n    public void setCreatedAt(String createdAt) {\n        this.createdAt = createdAt;\n    }\n\n    public String getDesc() {\n        return desc;\n    }\n\n    public void setDesc(String desc) {\n        this.desc = desc;\n    }\n\n    public String getPublishedAt() {\n        return publishedAt;\n    }\n\n    public void setPublishedAt(String publishedAt) {\n        this.publishedAt = publishedAt;\n    }\n\n    public String getSource() {\n        return source;\n    }\n\n    public void setSource(String source) {\n        this.source = source;\n    }\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public String getUrl() {\n        return url;\n    }\n\n    public void setUrl(String url) {\n        this.url = url;\n    }\n\n    public boolean isUsed() {\n        return used;\n    }\n\n    public void setUsed(boolean used) {\n        this.used = used;\n    }\n\n    public String getWho() {\n        return who;\n    }\n\n    public void setWho(String who) {\n        this.who = who;\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/meitu/model/impl/PhotoModelImpl.java",
    "content": "package com.lvr.livecircle.meitu.model.impl;\n\nimport com.lvr.livecircle.api.ApiService;\nimport com.lvr.livecircle.app.AppApplication;\nimport com.lvr.livecircle.client.RetrofitClient;\nimport com.lvr.livecircle.meitu.model.PhotoModel;\nimport com.lvr.livecircle.meitu.model.bean.GirlData;\nimport com.lvr.livecircle.meitu.model.bean.PhotoGirl;\n\nimport java.util.List;\n\nimport io.reactivex.Observable;\nimport io.reactivex.functions.Function;\n\n/**\n * Created by lvr on 2017/2/20.\n */\n\npublic class PhotoModelImpl implements PhotoModel {\n    @Override\n    public Observable<List<PhotoGirl>> getPhotoList(int size, int page) {\n        RetrofitClient client = RetrofitClient.getInstance(AppApplication.getAppContext(), ApiService.PHOTO_BASE_URL);\n        ApiService api = client.create(ApiService.class);\n\n        return api.getPhotoList(size,page).map(new Function<GirlData, List<PhotoGirl>>() {\n            @Override\n            public List<PhotoGirl> apply(GirlData data) throws Exception {\n                return  data.getResults();\n            }\n        }).compose(RetrofitClient.schedulersTransformer);\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/meitu/presenter/PhotoPresenter.java",
    "content": "package com.lvr.livecircle.meitu.presenter;\n\n/**\n * Created by lvr on 2017/2/20.\n */\n\npublic interface PhotoPresenter {\n    void requestPhotoList(int size,int page);\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/meitu/presenter/impl/PhotoPresenterImpl.java",
    "content": "package com.lvr.livecircle.meitu.presenter.impl;\n\nimport com.lvr.livecircle.client.RxDisposeManager;\nimport com.lvr.livecircle.meitu.MeiTuFragment;\nimport com.lvr.livecircle.meitu.model.bean.PhotoGirl;\nimport com.lvr.livecircle.meitu.model.impl.PhotoModelImpl;\nimport com.lvr.livecircle.meitu.presenter.PhotoPresenter;\n\nimport java.util.List;\n\nimport io.reactivex.Observer;\nimport io.reactivex.disposables.Disposable;\n\n/**\n * Created by lvr on 2017/2/20.\n */\n\npublic class PhotoPresenterImpl implements PhotoPresenter {\n    private PhotoModelImpl mModel;\n    private MeiTuFragment mView;\n    //是否开启了dialog\n    private boolean showDialog;\n    public PhotoPresenterImpl(MeiTuFragment mView) {\n        this.mView = mView;\n        this.mModel = new PhotoModelImpl();\n    }\n\n    @Override\n    public void requestPhotoList(int size, int page) {\n        mModel.getPhotoList(size,page).subscribe(new Observer<List<PhotoGirl>>() {\n            @Override\n            public void onSubscribe(Disposable d) {\n                RxDisposeManager.get().add(\"photoList\",d);\n\n            }\n\n            @Override\n            public void onNext(List<PhotoGirl> girls) {\n                mView.returnPhotoList(girls);\n            }\n\n            @Override\n            public void onError(Throwable e) {\n               mView.showErrorTip();\n            }\n\n            @Override\n            public void onComplete() {\n\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/meitu/view/PhotoView.java",
    "content": "package com.lvr.livecircle.meitu.view;\n\nimport com.lvr.livecircle.meitu.model.bean.PhotoGirl;\n\nimport java.util.List;\n\n/**\n * Created by lvr on 2017/2/20.\n */\n\npublic interface PhotoView {\n    void returnPhotoList(List<PhotoGirl> photoGirlList);\n    void showErrorTip();\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/music/MusicFragment.java",
    "content": "package com.lvr.livecircle.music;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.base.BaseFragment;\n\n/**\n * Created by lvr on 2017/2/6.\n */\n\npublic class MusicFragment extends BaseFragment {\n    @Override\n    protected int getLayoutResource() {\n        return R.layout.fragment_music;\n    }\n\n\n    @Override\n    protected void initView() {\n\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/nearby/NearByFragment.java",
    "content": "package com.lvr.livecircle.nearby;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.base.BaseFragment;\n\n/**\n * Created by lvr on 2017/2/6.\n */\n\npublic class NearByFragment extends BaseFragment {\n    @Override\n    protected int getLayoutResource() {\n        return R.layout.fragment_nearby;\n    }\n\n\n\n    @Override\n    protected void initView() {\n\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/activity/NewsChannelActivity.java",
    "content": "package com.lvr.livecircle.news.activity;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Build;\nimport android.support.v7.widget.DefaultItemAnimator;\nimport android.support.v7.widget.GridLayoutManager;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.support.v7.widget.Toolbar;\nimport android.support.v7.widget.helper.ItemTouchHelper;\nimport android.view.View;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.adapter.NewsChannelAdapter;\nimport com.lvr.livecircle.base.BaseActivity;\nimport com.lvr.livecircle.bean.ChannelBean;\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\nimport com.lvr.livecircle.news.presenter.NewsChannelPresenter;\nimport com.lvr.livecircle.news.presenter.impl.NewsChannelPresenterImpl;\nimport com.lvr.livecircle.news.view.NewsChannelView;\nimport com.lvr.livecircle.utils.ToastUitl;\nimport com.lvr.livecircle.widget.ItemDragHelperCallback;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport butterknife.BindView;\nimport de.greenrobot.event.EventBus;\nimport de.greenrobot.event.Subscribe;\n\n/**\n * 新闻频道管理页面\n * Created by lvr on 2017/2/11.\n */\n\npublic class NewsChannelActivity extends BaseActivity implements NewsChannelView {\n    @BindView(R.id.toolbar)\n    Toolbar mToolbar;\n    @BindView(R.id.news_channel_mine_rv)\n    RecyclerView mNewsChannelMineRv;\n    @BindView(R.id.news_channel_more_rv)\n    RecyclerView mNewsChannelMoreRv;\n    private NewsChannelPresenter mPresenter;\n    private Context mContext;\n    private NewsChannelAdapter mMineAdapter;\n    private NewsChannelAdapter mMoreAdapter;\n\n    @Override\n    public int getLayoutId() {\n        return R.layout.activity_news_channel;\n    }\n\n    @Override\n    public void initPresenter() {\n        mPresenter = new NewsChannelPresenterImpl(this);\n    }\n\n    @Override\n    public void initView() {\n        SetStatusBarColor();\n        mContext = this;\n        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n                    finishAfterTransition();\n                } else {\n                    finish();\n                }\n            }\n        });\n        mPresenter.lodeChannelsRequest();\n        if(!EventBus.getDefault().isRegistered(this)){\n            EventBus.getDefault().register(this);\n        }\n    }\n    @Subscribe\n    public void onChannelEvent(ChannelBean event){\n        List<NewsChannelTable> list = event.getList();\n        System.out.println(\"接收移动的消息\");\n        mPresenter.onItemSwap((ArrayList<NewsChannelTable>) list);\n    }\n\n    /**\n     * 入口\n     *\n     * @param activity\n     */\n    public static void startAction(Activity activity) {\n        Intent intent = new Intent(activity, NewsChannelActivity.class);\n        activity.startActivity(intent);\n        activity.overridePendingTransition(R.anim.fade_in,\n                R.anim.fade_out);\n    }\n\n\n    @Override\n    public void returnMineNewsChannels(List<NewsChannelTable> newsChannelsMine) {\n        mMineAdapter = new NewsChannelAdapter(mContext, newsChannelsMine);\n        mNewsChannelMineRv.setLayoutManager(new GridLayoutManager(this, 4, LinearLayoutManager.VERTICAL, false));\n        mNewsChannelMineRv.setItemAnimator(new DefaultItemAnimator());\n        mNewsChannelMineRv.setAdapter(mMineAdapter);\n        //加载数据完毕后 设置监听，拖拽移动事件 和 点击事件  把ItemDragHelperCallback设置给RecyclerView使用\n        ItemDragHelperCallback callback = new ItemDragHelperCallback(mMineAdapter);\n        ItemTouchHelper touchHelper = new ItemTouchHelper(callback);\n        touchHelper.attachToRecyclerView(mNewsChannelMineRv);\n        mMineAdapter.setItemDragHelperCallback(callback);\n        mMineAdapter.setOnItemClickListener(new NewsChannelAdapter.OnItemClickListener() {\n            @Override\n            public void onItemClick(View view, int position) {\n                NewsChannelTable newsChannel = mMineAdapter.getAdapterData().get(position);\n                mMoreAdapter.getAdapterData().add(newsChannel);\n                mMoreAdapter.notifyDataSetChanged();\n                mMineAdapter.getAdapterData().remove(position);\n                mMineAdapter.notifyDataSetChanged();\n                //进行添加或删除操作后，要更新的列表 进行存储\n                mPresenter.onItemAddOrRemove((ArrayList<NewsChannelTable>) mMineAdapter.getAdapterData(), (ArrayList<NewsChannelTable>) mMoreAdapter.getAdapterData());\n\n            }\n        });\n    }\n\n    @Override\n    public void returnMoreNewsChannels(List<NewsChannelTable> newsChannelsMore) {\n        mMoreAdapter = new NewsChannelAdapter(mContext, newsChannelsMore);\n        mNewsChannelMoreRv.setLayoutManager(new GridLayoutManager(this, 4, LinearLayoutManager.VERTICAL, false));\n        mNewsChannelMoreRv.setItemAnimator(new DefaultItemAnimator());\n        mNewsChannelMoreRv.setAdapter(mMoreAdapter);\n        mMoreAdapter.setOnItemClickListener(new NewsChannelAdapter.OnItemClickListener() {\n            @Override\n            public void onItemClick(View view, int position) {\n                if(mMineAdapter.getAdapterData().size()==7){\n                    ToastUitl.showShort(\"最多只能添加7个\");\n                }else{\n                NewsChannelTable newsChannel = mMoreAdapter.getAdapterData().get(position);\n                mMoreAdapter.getAdapterData().remove(position);\n                mMoreAdapter.notifyDataSetChanged();\n                mMineAdapter.getAdapterData().add(newsChannel);\n                mMineAdapter.notifyDataSetChanged();\n                List<NewsChannelTable> data = mMineAdapter.getAdapterData();\n                for (NewsChannelTable table : data) {\n                    System.out.println(table);\n                }\n                //进行添加或删除操作后，要更新的列表 进行存储\n                mPresenter.onItemAddOrRemove((ArrayList<NewsChannelTable>) mMineAdapter.getAdapterData(), (ArrayList<NewsChannelTable>) mMoreAdapter.getAdapterData());\n            }\n\n\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/activity/NewsDetailActivity.java",
    "content": "package com.lvr.livecircle.news.activity;\n\nimport android.app.Activity;\nimport android.app.ActivityOptions;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.os.Build;\nimport android.support.design.widget.AppBarLayout;\nimport android.support.design.widget.CollapsingToolbarLayout;\nimport android.support.v4.app.ActivityCompat;\nimport android.support.v4.app.ActivityOptionsCompat;\nimport android.support.v4.content.ContextCompat;\nimport android.support.v7.widget.Toolbar;\nimport android.text.Html;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.app.AppConstant;\nimport com.lvr.livecircle.base.BaseActivity;\nimport com.lvr.livecircle.client.RetrofitClient;\nimport com.lvr.livecircle.client.RxDisposeManager;\nimport com.lvr.livecircle.news.model.bean.NewsDetail;\nimport com.lvr.livecircle.news.presenter.impl.NewsDetailPresenterImpl;\nimport com.lvr.livecircle.news.view.NewsDetailView;\nimport com.lvr.livecircle.utils.ImageLoaderUtils;\nimport com.lvr.livecircle.utils.StatusBarSetting;\nimport com.lvr.livecircle.utils.TimeUtil;\nimport com.lvr.livecircle.widget.URLImageGetter;\n\nimport java.util.List;\nimport java.util.concurrent.TimeUnit;\n\nimport butterknife.BindView;\nimport io.reactivex.Observable;\nimport io.reactivex.Observer;\nimport io.reactivex.disposables.Disposable;\n\n/**\n * 普通新闻详情\n */\npublic class NewsDetailActivity extends BaseActivity implements NewsDetailView {\n\n    @BindView(R.id.news_detail_photo_iv)\n    ImageView mNewsDetailPhotoIv;\n    @BindView(R.id.toolbar)\n    Toolbar mToolbar;\n    @BindView(R.id.toolbar_layout)\n    CollapsingToolbarLayout mToolbarLayout;\n    @BindView(R.id.app_bar)\n    AppBarLayout mAppBar;\n    @BindView(R.id.news_detail_from_tv)\n    TextView mNewsDetailFromTv;\n    @BindView(R.id.news_detail_body_tv)\n    TextView mNewsDetailBodyTv;\n    @BindView(R.id.progress_bar)\n    ProgressBar mProgressBar;\n    private String postId;\n    private String mNewsTitle;\n    private String mShareLink;\n    private NewsDetailPresenterImpl mPresenter;\n    private Context mContext;\n    private URLImageGetter mUrlImageGetter;\n    /**\n     * 入口\n     *\n     * @param mContext\n     * @param postId\n     */\n    public static void startAction(Context mContext, View view, String postId, String imgUrl) {\n        Intent intent = new Intent(mContext, NewsDetailActivity.class);\n        intent.putExtra(AppConstant.NEWS_POST_ID, postId);\n        intent.putExtra(AppConstant.NEWS_IMG_RES, imgUrl);\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n            ActivityOptions options = ActivityOptions\n                    .makeSceneTransitionAnimation((Activity) mContext, view, AppConstant.TRANSITION_ANIMATION_NEWS_PHOTOS);\n            mContext.startActivity(intent, options.toBundle());\n        } else {\n            //让新的Activity从一个小的范围扩大到全屏\n            ActivityOptionsCompat options = ActivityOptionsCompat\n                    .makeScaleUpAnimation(view, view.getWidth() / 2, view.getHeight() / 2, 0, 0);\n            ActivityCompat.startActivity((Activity) mContext, intent, options.toBundle());\n        }\n\n    }\n\n    @Override\n    public int getLayoutId() {\n        return R.layout.activity_news_detail;\n    }\n\n    @Override\n    public void initPresenter() {\n        mPresenter = new NewsDetailPresenterImpl(this);\n    }\n\n    @Override\n    public void initView() {\n        StatusBarSetting.setTranslucent(NewsDetailActivity.this);\n        mContext = this;\n        postId = getIntent().getStringExtra(AppConstant.NEWS_POST_ID);\n        System.out.println(postId);\n        mPresenter.requestDetailNews(postId);\n        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                finish();\n            }\n        });\n    }\n\n    @Override\n    public void returnNewsDetail(NewsDetail detail) {\n        System.out.println(\"返回的数据：\"+detail);\n        mShareLink = detail.getShareLink();\n        mNewsTitle = detail.getTitle();\n        String newsSource = detail.getSource();\n        String newsTime = TimeUtil.formatDate(detail.getPtime());\n        String newsBody = detail.getBody();\n        String NewsImgSrc = getImgSrcs(detail);\n        setToolBarLayout(mNewsTitle);\n        mNewsDetailFromTv.setText(getString(R.string.news_from, newsSource, newsTime));\n        setNewsDetailPhotoIv(NewsImgSrc);\n        setNewsDetailBodyTv(detail, newsBody);\n    }\n\n    //设置新闻主体内容\n    private void setNewsDetailBodyTv(final NewsDetail detail, final String body) {\n        Observable.timer(1, TimeUnit.MILLISECONDS)\n                .compose(RetrofitClient.schedulersTransformer)\n                .subscribe(new Observer() {\n                    @Override\n                    public void onSubscribe(Disposable d) {\n                        RxDisposeManager.get().add(\"newsBody\",d);\n                        mProgressBar.setVisibility(View.GONE);\n                    }\n\n                    @Override\n                    public void onNext(Object o) {\n                        mProgressBar.setVisibility(View.VISIBLE);\n                        setBody(detail, body);\n                    }\n\n                    @Override\n                    public void onError(Throwable e) {\n                        mProgressBar.setVisibility(View.GONE);\n                    }\n\n                    @Override\n                    public void onComplete() {\n                        mProgressBar.setVisibility(View.GONE);\n                    }\n                });\n    }\n\n    private void setBody(NewsDetail detail, String body) {\n        int imgTotal = detail.getImg().size();\n        if (isShowBody(body, imgTotal)) {\n            mUrlImageGetter = new URLImageGetter(mNewsDetailBodyTv, body, imgTotal);\n            mNewsDetailBodyTv.setText(Html.fromHtml(body, mUrlImageGetter, null));\n        } else {\n            mNewsDetailBodyTv.setText(Html.fromHtml(body));\n        }\n    }\n\n    private boolean isShowBody(String body, int total) {\n        return total >= 2 && body != null;\n    }\n\n    //加载图片\n    private void setNewsDetailPhotoIv(String src) {\n        ImageLoaderUtils.displayBigPhoto(mContext,mNewsDetailPhotoIv,src);\n    }\n\n    //设置toolbar内容\n    private void setToolBarLayout(String title) {\n        mToolbarLayout.setTitle(title);\n        mToolbarLayout.setExpandedTitleColor(ContextCompat.getColor(this, R.color.white));\n        mToolbarLayout.setCollapsedTitleTextColor(ContextCompat.getColor(this, R.color.primary_text_white));\n    }\n\n    //获取图片资源\n    private String getImgSrcs(NewsDetail newsDetail) {\n        List<NewsDetail.ImgBean> imgSrcs = newsDetail.getImg();\n        String imgSrc;\n        if (imgSrcs != null && imgSrcs.size() > 0) {\n            imgSrc = imgSrcs.get(0).getSrc();\n        } else {\n            imgSrc = getIntent().getStringExtra(AppConstant.NEWS_IMG_RES);\n        }\n        return imgSrc;\n    }\n\n    @Override\n    protected void onDestroy() {\n        super.onDestroy();\n        RxDisposeManager.get().cancel(\"newsBody\");\n        RxDisposeManager.get().cancel(\"newsDetail\");\n\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/activity/NewsPhotoDetailActivity.java",
    "content": "package com.lvr.livecircle.news.activity;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.support.v7.widget.Toolbar;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.adapter.CardAdapter;\nimport com.lvr.livecircle.app.AppConstant;\nimport com.lvr.livecircle.base.BaseActivity;\nimport com.lvr.livecircle.news.model.bean.NewsPhotoDetail;\nimport com.lvr.livecircle.recycleviewcardgallery.CardScaleHelper;\nimport com.lvr.livecircle.recycleviewcardgallery.SpeedRecyclerView;\nimport com.lvr.livecircle.utils.StatusBarSetting;\n\nimport butterknife.BindView;\n\n/**\n * Created by lvr on 2017/2/11.\n */\n\npublic class NewsPhotoDetailActivity extends BaseActivity {\n    @BindView(R.id.toolbar)\n    Toolbar mToolbar;\n    @BindView(R.id.blurView)\n    ImageView mBlurView;\n    @BindView(R.id.recyclerView)\n    SpeedRecyclerView mRecyclerView;\n    @BindView(R.id.photo_detail_title_tv)\n    TextView mPhotoDetailTitleTv;\n    private NewsPhotoDetail mNewsPhotoDetail;\n    private CardScaleHelper mCardScaleHelper = null;\n    private int mLastPos = -1;\n    private Runnable mBlurRunnable;\n    /**\n     * 入口\n     *\n     * @param context\n     * @param mNewsPhotoDetail\n     */\n    public static void startAction(Context context, NewsPhotoDetail mNewsPhotoDetail) {\n        Intent intent = new Intent(context, NewsPhotoDetailActivity.class);\n        intent.putExtra(AppConstant.PHOTO_DETAIL, mNewsPhotoDetail);\n        context.startActivity(intent);\n    }\n\n    @Override\n    public int getLayoutId() {\n        return R.layout.activity_news_photo_detail;\n    }\n\n    @Override\n    public void initPresenter() {\n\n    }\n\n    @Override\n    public void initView() {\n        StatusBarSetting.setColor(NewsPhotoDetailActivity.this,getResources().getColor(R.color.black));\n        mNewsPhotoDetail = getIntent().getParcelableExtra(AppConstant.PHOTO_DETAIL);\n        System.out.println(mNewsPhotoDetail);\n        mRecyclerView = (SpeedRecyclerView) findViewById(R.id.recyclerView);\n        final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);\n        mRecyclerView.setLayoutManager(linearLayoutManager);\n        mRecyclerView.setAdapter(new CardAdapter(mContext,mNewsPhotoDetail.getPictures()));\n        // mRecyclerView绑定scale效果\n        mCardScaleHelper = new CardScaleHelper();\n        mCardScaleHelper.setCurrentItemPos(0);\n        mCardScaleHelper.attachToRecyclerView(mRecyclerView);\n        String title = mNewsPhotoDetail.getPictures().get(0).getTitle()==null?\"\":mNewsPhotoDetail.getPictures().get(0).getTitle();\n        mPhotoDetailTitleTv.setText(1+\"/\"+mNewsPhotoDetail.getPictures().size()+\"  \"+title);\n        mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {\n                super.onScrollStateChanged(recyclerView, newState);\n                int pos = mCardScaleHelper.getCurrentItemPos();\n                String title = mNewsPhotoDetail.getPictures().get(pos).getTitle() == null ? \"\" : mNewsPhotoDetail.getPictures().get(pos).getTitle();\n                if(mPhotoDetailTitleTv!=null){\n                    mPhotoDetailTitleTv.setText(pos+1+\"/\"+mNewsPhotoDetail.getPictures().size()+\"  \"+title);\n                }\n            }\n\n        });\n        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                finish();\n            }\n        });\n    }\n\n\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/db/NewsChannelTableManager.java",
    "content": "/*\n * Copyright (c) 2016 咖枯 <kaku201313@163.com | 3772304@qq.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\npackage com.lvr.livecircle.news.db;\n\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.api.ApiConstants;\nimport com.lvr.livecircle.app.AppApplication;\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\n\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class NewsChannelTableManager {\n\n    /**\n     * 加载新闻类型\n     *\n     * @return\n     */\n\n\n    public static List<NewsChannelTable> loadNewsChannelsMore() {\n        List<String> channelName = Arrays.asList(AppApplication.getAppContext().getResources().getStringArray(R.array.news_channel_name));\n        List<String> channelId = Arrays.asList(AppApplication.getAppContext().getResources().getStringArray(R.array.news_channel_id));\n        List<Integer> channelImgRes = new ArrayList<Integer>();\n        channelImgRes.add(R.drawable.news_house);\n        channelImgRes.add(R.drawable.news_play);\n        channelImgRes.add(R.drawable.news_movie);\n        channelImgRes.add(R.drawable.news_car);\n        channelImgRes.add(R.drawable.news_game);\n        channelImgRes.add(R.drawable.news_education);\n        channelImgRes.add(R.drawable.news_travel);\n        channelImgRes.add(R.drawable.news_mobile);\n        channelImgRes.add(R.drawable.news_social);\n        ArrayList<NewsChannelTable> newsChannelTables = new ArrayList<>();\n        for (int i = 0; i < channelName.size(); i++) {\n            NewsChannelTable entity = new NewsChannelTable(channelName.get(i), channelId.get(i)\n                    , ApiConstants.getType(channelId.get(i)), i <= 5, i, false, channelImgRes.get(i));\n            newsChannelTables.add(entity);\n        }\n        return newsChannelTables;\n    }\n\n    /**\n     * 加载固定新闻类型\n     *\n     * @return\n     */\n\n    public static List<NewsChannelTable> loadNewsChannelsStatic() {\n        List<String> channelName = Arrays.asList(AppApplication.getAppContext().getResources().getStringArray(R.array.news_channel_name_static));\n        System.out.println(channelName);\n        List<String> channelId = Arrays.asList(AppApplication.getAppContext().getResources().getStringArray(R.array.news_channel_id_static));\n        List<Integer> channelImgRes = new ArrayList<Integer>();\n        channelImgRes.add(R.drawable.news_header);\n        channelImgRes.add(R.drawable.news_tech);\n        channelImgRes.add(R.drawable.news_fincial);\n        channelImgRes.add(R.drawable.news_military);\n        channelImgRes.add(R.drawable.news_sports);\n        ArrayList<NewsChannelTable> newsChannelTables = new ArrayList<>();\n        for (int i = 0; i < channelName.size(); i++) {\n            System.out.println(channelName.get(i));\n            System.out.println(channelId.get(i));\n            System.out.println(channelImgRes.get(i));\n            NewsChannelTable entity = new NewsChannelTable(channelName.get(i), channelId.get(i)\n                    , ApiConstants.getType(channelId.get(i)), i <= 5, i, i==0?true:false, channelImgRes.get(i));\n            newsChannelTables.add(entity);\n        }\n        return newsChannelTables;\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/fragment/NewsFragment.java",
    "content": "package com.lvr.livecircle.news.fragment;\n\nimport android.content.Context;\nimport android.support.v4.widget.SwipeRefreshLayout;\nimport android.support.v7.widget.LinearLayoutManager;\nimport android.support.v7.widget.RecyclerView;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.adapter.NewsListAdapter;\nimport com.lvr.livecircle.adapter.OnNewsChannelListener;\nimport com.lvr.livecircle.base.BaseFragment;\nimport com.lvr.livecircle.bean.FabScrollBean;\nimport com.lvr.livecircle.bean.HeaderBean;\nimport com.lvr.livecircle.bean.NewsInfo;\nimport com.lvr.livecircle.client.RxDisposeManager;\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\nimport com.lvr.livecircle.news.presenter.impl.NewsPresenterImpl;\nimport com.lvr.livecircle.news.view.NewsView;\nimport com.lvr.livecircle.widget.LoadingTip;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport butterknife.BindView;\nimport de.greenrobot.event.EventBus;\nimport de.greenrobot.event.Subscribe;\n\n/**\n * Created by lvr on 2017/2/6.\n */\n\npublic class NewsFragment extends BaseFragment implements NewsView, SwipeRefreshLayout.OnRefreshListener, OnNewsChannelListener {\n    @BindView(R.id.recyclerView)\n    RecyclerView mRecyclerView;\n    @BindView(R.id.refreshLayout)\n    SwipeRefreshLayout mRefreshLayout;\n    @BindView(R.id.loadedTip)\n    LoadingTip mLoadedTip;\n    private NewsPresenterImpl mPresenter;\n    private Context mContext;\n    private List<NewsChannelTable> mTables = new ArrayList<>();\n    private List<NewsInfo> mInfos = new ArrayList<>();\n    private NewsListAdapter mNewsListAdapter;\n    //当前加载新闻类型\n    private String cur_news_type = \"headline\";\n    //当前加载新闻类型的id\n    private String cur_news_id = \"T1348647909107\";\n    //当前加载新闻页数\n    private int cur_news_page = 0;\n\n\n\n    @Override\n    protected int getLayoutResource() {\n        return R.layout.fragment_news;\n    }\n\n\n    @Override\n    protected void initView() {\n        mContext = getActivity();\n        mPresenter = new NewsPresenterImpl(this);\n        mRecyclerView.setHasFixedSize(true);\n        mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));\n        mRefreshLayout.setOnRefreshListener(this);\n        //设置下拉刷新的按钮的颜色\n        mRefreshLayout.setColorSchemeResources(R.color.colorPrimary);\n        setLoadMoreListener();\n        if (!EventBus.getDefault().isRegistered(this)) {\n            EventBus.getDefault().register(this);\n        }\n    }\n\n    @Override\n    protected void onFragmentVisibleChange(boolean isVisible) {\n        if (isVisible) {\n            mPresenter.lodeMineChannelsRequest();\n            mPresenter.loadNewsListRequest(cur_news_type, cur_news_id, cur_news_page);\n        }else{\n            RxDisposeManager.get().cancel(\"newschannel\");\n            RxDisposeManager.get().cancel(\"newslist\");\n        }\n    }\n\n    @Subscribe\n    public void onFabScrollEvent(FabScrollBean event) {\n        if(event.getPosition()==1){\n            mRecyclerView.smoothScrollToPosition(0);\n        }\n\n    }\n\n    @Subscribe\n    public void onHeaderEvent(HeaderBean event) {\n        returnNewsChannel(event.getList());\n    }\n\n    private void setLoadMoreListener() {\n        mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {\n\n            boolean isSlidingToLast = false;\n\n            @Override\n            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {\n\n                LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();\n                // 当不滚动时\n                if (newState == RecyclerView.SCROLL_STATE_IDLE) {\n                    // 获取最后一个完全显示的item position\n                    int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();\n                    int totalItemCount = manager.getItemCount();\n                    // 判断是否滚动到底部并且是向下滑动\n                    if (lastVisibleItem == (totalItemCount - 1) && isSlidingToLast) {\n                        cur_news_page += 20;\n                        System.out.println(\"加载页数：\" + cur_news_page);\n                        mPresenter.loadNewsListRequest(cur_news_type, cur_news_id, cur_news_page);\n                    }\n                }\n\n                super.onScrollStateChanged(recyclerView, newState);\n            }\n\n            @Override\n            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n                super.onScrolled(recyclerView, dx, dy);\n                isSlidingToLast = dy > 0;\n\n            }\n        });\n\n    }\n\n\n    @Override\n    public void returnNewsChannel(List<NewsChannelTable> tables) {\n        System.out.println(tables);\n        System.out.println(\"频道个数:\" + tables.size());\n        mTables.clear();\n        mTables.addAll(tables);\n        addAllChannel();\n        if (mNewsListAdapter != null) {\n            mNewsListAdapter.setTables(mTables);\n            mNewsListAdapter.notifyItemChanged(0);\n        }\n\n    }\n\n    @Override\n    public void returnNewsList(List<NewsInfo> infos) {\n        mInfos = infos;\n        if (!isFirst) {\n            isFirst = true;\n            mNewsListAdapter = new NewsListAdapter(mContext, mInfos, mTables);\n            mNewsListAdapter.setNewsChannelListener(this);\n            mRecyclerView.setAdapter(mNewsListAdapter);\n        } else if (cur_news_page == 0) {\n            mRefreshLayout.setRefreshing(false);\n            List<NewsInfo> data = mNewsListAdapter.getAdapterData();\n            data.clear();\n            data.addAll(infos);\n            System.out.println(\"刷新后的数据：\" + data.size());\n            mNewsListAdapter.notifyDataSetChanged();\n        } else if (cur_news_page > 0) {\n            infos.remove(0);\n            List<NewsInfo> data = mNewsListAdapter.getAdapterData();\n            data.addAll(infos);\n            System.out.println(\"加载后的数据：\" + data.size());\n            mNewsListAdapter.notifyDataSetChanged();\n        }\n\n\n    }\n\n    /**\n     * 添加跳转到管理新闻频道的界面\n     */\n    private void addAllChannel() {\n        if (mTables != null) {\n            NewsChannelTable allChannel = new NewsChannelTable(\"全部\", \"\", \"\", false, 0, true, R.drawable.news_all);\n            mTables.add(allChannel);\n        }\n    }\n\n    @Override\n    public void showNetErrorTip() {\n        super.showNetErrorTip();\n        mRefreshLayout.setRefreshing(false);\n        mLoadedTip.setLoadingTip(LoadingTip.LoadStatus.error);\n    }\n\n    public void showLoading() {\n        mLoadedTip.setLoadingTip(LoadingTip.LoadStatus.loading);\n    }\n\n    public void stopLoading() {\n        mLoadedTip.setLoadingTip(LoadingTip.LoadStatus.finish);\n    }\n\n    @Override\n    public void onRefresh() {\n        cur_news_page = 0;\n        mRefreshLayout.setRefreshing(true);\n        mPresenter.loadNewsListRequest(cur_news_type, cur_news_id, cur_news_page);\n    }\n\n\n    @Override\n    public void changeChannelListener(NewsChannelTable newsChannelTable) {\n        String type = newsChannelTable.getNewsChannelType();\n        String id = newsChannelTable.getNewsChannelId();\n        cur_news_type = type;\n        cur_news_id = id;\n        cur_news_page = 0;\n        System.out.println(cur_news_type);\n        System.out.println(cur_news_id);\n        mPresenter.loadNewsListRequest(cur_news_type, cur_news_id, cur_news_page);\n    }\n\n    @Override\n    public void onDestroyView() {\n        super.onDestroyView();\n        RxDisposeManager.get().cancel(\"newschannel\");\n        RxDisposeManager.get().cancel(\"newslist\");\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/model/NewsChannelModel.java",
    "content": "package com.lvr.livecircle.news.model;\n\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport io.reactivex.Observable;\n\n/**\n * Created by lvr on 2017/2/14.\n */\n\npublic interface NewsChannelModel {\n    Observable<List<NewsChannelTable>> lodeMoreNewsChannels();\n    Observable<String> swapDb(ArrayList<NewsChannelTable> newsChannelTableList);\n    Observable<String> updateDb(ArrayList<NewsChannelTable> mineChannelTableList, ArrayList<NewsChannelTable> moreChannelTableList);\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/model/NewsDetailModel.java",
    "content": "package com.lvr.livecircle.news.model;\n\nimport com.lvr.livecircle.news.model.bean.NewsDetail;\n\nimport io.reactivex.Observable;\n\n/**\n * Created by lvr on 2017/2/11.\n */\n\npublic interface NewsDetailModel {\n    Observable<NewsDetail> getDetailNews(String postId);\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/model/NewsModel.java",
    "content": "package com.lvr.livecircle.news.model;\n\nimport com.lvr.livecircle.bean.NewsInfo;\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\n\nimport java.util.List;\n\nimport io.reactivex.Observable;\n\n/**\n * Created by lvr on 2017/2/7.\n */\n\npublic interface NewsModel {\n    Observable<List<NewsChannelTable>> requestNewsChannels();\n    Observable<NewsInfo> requestNewsList(String newsType, final String id, int startPage);\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/model/bean/NewsChannelTable.java",
    "content": "package com.lvr.livecircle.news.model.bean;\n\n\nimport java.io.Serializable;\n\npublic class NewsChannelTable implements Serializable {\n\n    private String newsChannelName;\n    private String newsChannelId;\n    private String newsChannelType;\n    private boolean newsChannelSelect;\n    private int newsChannelIndex;\n    private Boolean newsChannelFixed;\n    private int ImgRes;\n\n    public NewsChannelTable() {\n    }\n    public NewsChannelTable(String newsChannelName) {\n        this.newsChannelName = newsChannelName;\n    }\n\n    public NewsChannelTable(String newsChannelName, String newsChannelId, String newsChannelType, boolean newsChannelSelect, int newsChannelIndex, Boolean newsChannelFixed,int imgRes) {\n        this.ImgRes = imgRes;\n        this.newsChannelName = newsChannelName;\n        this.newsChannelId = newsChannelId;\n        this.newsChannelType = newsChannelType;\n        this.newsChannelSelect = newsChannelSelect;\n        this.newsChannelIndex = newsChannelIndex;\n        this.newsChannelFixed = newsChannelFixed;\n    }\n    public boolean isNewsChannelSelect() {\n        return newsChannelSelect;\n    }\n\n    public void setImgRes(int imgRes) {\n        ImgRes = imgRes;\n    }\n\n    public int getImgRes() {\n        return ImgRes;\n    }\n\n    public String getNewsChannelName() {\n        return newsChannelName;\n    }\n\n    public void setNewsChannelName(String newsChannelName) {\n        this.newsChannelName = newsChannelName;\n    }\n\n    public String getNewsChannelId() {\n        return newsChannelId;\n    }\n\n    public void setNewsChannelId(String newsChannelId) {\n        this.newsChannelId = newsChannelId;\n    }\n\n    public String getNewsChannelType() {\n        return newsChannelType;\n    }\n\n    public void setNewsChannelType(String newsChannelType) {\n        this.newsChannelType = newsChannelType;\n    }\n\n    public boolean getNewsChannelSelect() {\n        return newsChannelSelect;\n    }\n\n    public void setNewsChannelSelect(boolean newsChannelSelect) {\n        this.newsChannelSelect = newsChannelSelect;\n    }\n\n    public int getNewsChannelIndex() {\n        return newsChannelIndex;\n    }\n\n    public void setNewsChannelIndex(int newsChannelIndex) {\n        this.newsChannelIndex = newsChannelIndex;\n    }\n\n    public Boolean getNewsChannelFixed() {\n        return newsChannelFixed;\n    }\n\n    public void setNewsChannelFixed(Boolean newsChannelFixed) {\n        this.newsChannelFixed = newsChannelFixed;\n    }\n\n    @Override\n    public String toString() {\n        return \"NewsChannelTable{\" +\n                \"newsChannelName='\" + newsChannelName + '\\'' +\n                \", newsChannelId='\" + newsChannelId + '\\'' +\n                \", newsChannelType='\" + newsChannelType + '\\'' +\n                \", newsChannelSelect=\" + newsChannelSelect +\n                \", newsChannelIndex=\" + newsChannelIndex +\n                \", newsChannelFixed=\" + newsChannelFixed +\n                \", ImgRes=\" + ImgRes +\n                '}';\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/model/bean/NewsDetail.java",
    "content": "package com.lvr.livecircle.news.model.bean;\n\nimport java.util.List;\n\n/**\n * Created by lvr on 2017/2/11.\n */\n\npublic class NewsDetail {\n\n    /**\n     * body : <p>　　<strong>版权声明：本文版权为网易汽车所有，转载请注明出处。</strong></p><p>　　<strong>网易汽车9月13日报道</strong>近日，海外媒体曝光了一组本田新一代Freed的路试谍照，新车定位为MPV车型，基于飞度平台打造，将于今年9月内在日本发布。</p><!--IMG#0--><p>　　<b>新车信息：</b></p><p>　　·新车基于飞度平台打造，同样采用了倾斜度较大的A柱加三角窗的设计，减少侧前方的盲区。较高的车顶和侧滑门的设计则凸显其MPV属性；</p><!--IMG#1--><!--IMG#2--><p>　　·内部采用平地板设计，无论是中控台下方还是后排地板均没有明显的突起，较高的平整度进一步提升空间利用率。同时，新车提供5座、6座以及7座三种座椅布局，满足不同消费者的需求；</p><!--IMG#3--><!--IMG#4--><!--IMG#5--><p>　　·动力方面，新车将搭载1.5L汽油发动机和全新的SPORT HYBRID i-DCD油电混动系统，其中，油电混动车型将匹配7速双离合变速箱。</p><p>　　<b>点评：</b></p><p>　　飞度本身就已经是“魔术空间”了，而基于飞度平台的Freed尺寸比飞度大不了多少却能得到比飞度大得多的空间，进一步提升实用性。只可惜目前并没有引入国内的计划。</p><p>　　作者：沙墨瑀</p>\n     * users : []\n     * ydbaike : []\n     * replyCount : 5651\n     * link : []\n     * img : [{\"ref\":\"<!--IMG#0-->\",\"pixel\":\"550*413\",\"alt\":\"\",\"src\":\"http://img4.cache.netease.com/auto/2016/9/6/20160906095943e0deb_550.jpg\"},{\"ref\":\"<!--IMG#1-->\",\"pixel\":\"550*413\",\"alt\":\"\",\"src\":\"http://img1.cache.netease.com/auto/2016/9/6/20160906101623484a2_550.jpg\"},{\"ref\":\"<!--IMG#2-->\",\"pixel\":\"550*413\",\"alt\":\"\",\"src\":\"http://img4.cache.netease.com/auto/2016/9/6/2016090610162781cd3_550.jpg\"},{\"ref\":\"<!--IMG#3-->\",\"pixel\":\"550*243\",\"alt\":\"\",\"src\":\"http://img4.cache.netease.com/auto/2016/9/6/201609061016535ab4e_550.jpg\"},{\"ref\":\"<!--IMG#4-->\",\"pixel\":\"550*413\",\"alt\":\"\",\"src\":\"http://img2.cache.netease.com/auto/2016/9/6/2016090610165690032_550.jpg\"},{\"ref\":\"<!--IMG#5-->\",\"pixel\":\"550*246\",\"alt\":\"\",\"src\":\"http://img4.cache.netease.com/auto/2016/9/6/20160906101659aec96_550.jpg\"}]\n     * votes : []\n     * shareLink : https://c.m.163.com/news/a/C0Q6KKML00084TUO.html?spss=newsapp&spsw=1\n     * digest : 本田新一代Freed谍照曝光，基于飞度打造，空间更大。\n     * topiclist_news : [{\"hasCover\":false,\"subnum\":\"超过1000万\",\"alias\":\"Autos\",\"tname\":\"汽车\",\"ename\":\"qiche\",\"tid\":\"T1348654060988\",\"cid\":\"C1348652751993\"}]\n     * extraCard : {\"title\":\"热车推荐\",\"extraurl\":\"\",\"list\":[{\"name\":\"雪铁龙C5\",\"imgsrc\":\"http://img3.cache.netease.com/photo/0008/2014-08-25/300x225_A4GNKQRP29RB0008.png\",\"digest\":\"直降5.6万↓\",\"url\":\"http://auto.3g.163.com/citroen/2077/#khd002\"},{\"name\":\"名图\",\"imgsrc\":\"http://img4.cache.netease.com/photo/0008/2016-07-26/300x225_BSTJ5R6I59TM0008.png\",\"digest\":\"直降2.0万↓\",\"url\":\"http://auto.3g.163.com/hyundai/17039/#khd002\"},{\"name\":\"全新英朗\",\"imgsrc\":\"http://img3.cache.netease.com/photo/0008/2016-06-21/300x225_BQ3GFBRB3MQL0008.png\",\"digest\":\"直降1.5万↓\",\"url\":\"http://auto.3g.163.com/buick/10003/#khd002\"}]}\n     * dkeys : 本田,Freed,新车\n     * ec : 王海陆_NA1702\n     * topiclist : [{\"hasCover\":false,\"subnum\":\"31.2万\",\"alias\":\"未来汽车生活体验平台\",\"tname\":\"网易汽车\",\"ename\":\"wangyiqicheqiche\",\"tid\":\"T1454656350893\",\"cid\":\"C1374477981139\"}]\n     * docid : C0Q6KKML00084TUO\n     * sourceinfo : {\"alias\":\"未来汽车生活体验平台\",\"ename\":\"wangyiqicheqiche\",\"tname\":\"网易汽车\",\"tid\":\"T1454656350893\"}\n     * picnews : true\n     * title : 放大版的飞度 本田新一代Freed谍照曝光\n     * tid :\n     * template : normal\n     * threadVote : 13\n     * askbar : [{\"title\":\"汽车媒体人 \",\"headpicurl\":\"http://dingyue.nosdn.127.net/6qrnKjR9P7VaWHw60hb8z52iUdJ4edQg4wE3XAm=Xqawu1471420744994.jpg\",\"alias\":\"我是汽车媒体人张超，关于买车、换车、用车的相关问题，问我吧！\",\"expertId\":\"EX1729495850059568996\",\"name\":\"张超\",\"concernCount\":43570}]\n     * threadAgainst : 10\n     * autoRecomends : [{\"name\":\"雪铁龙C5\",\"imgsrc\":\"http://img3.cache.netease.com/photo/0008/2014-08-25/300x225_A4GNKQRP29RB0008.png\",\"chexi_id\":\"2077\",\"youhui\":5.6,\"youhuinew\":\"直降5.6万↓\",\"url\":\"http://auto.3g.163.com/citroen/2077/#khd002\"},{\"name\":\"名图\",\"imgsrc\":\"http://img4.cache.netease.com/photo/0008/2016-07-26/300x225_BSTJ5R6I59TM0008.png\",\"chexi_id\":\"17039\",\"youhui\":2,\"youhuinew\":\"直降2.0万↓\",\"url\":\"http://auto.3g.163.com/hyundai/17039/#khd002\"},{\"name\":\"全新英朗\",\"imgsrc\":\"http://img3.cache.netease.com/photo/0008/2016-06-21/300x225_BQ3GFBRB3MQL0008.png\",\"chexi_id\":\"10003\",\"youhui\":1.5,\"youhuinew\":\"直降1.5万↓\",\"url\":\"http://auto.3g.163.com/buick/10003/#khd002\"}]\n     * boboList : []\n     * replyBoard : auto_bbs\n     * source : 网易汽车\n     * huati : [{\"topicId\":\"SJ8240509424738212213\",\"topicName\":\"本田\"}]\n     * hasNext : false\n     * voicecomment : off\n     * ptime : 2016-09-13 00:03:17\n     */\n\n    private String body;\n    private int replyCount;\n    private String shareLink;\n    private String digest;\n    private ExtraCardBean extraCard;\n    private String dkeys;\n    private String ec;\n    private String docid;\n    private SourceinfoBean sourceinfo;\n    private boolean picnews;\n    private String title;\n    private String tid;\n    private String template;\n    private int threadVote;\n    private int threadAgainst;\n    private String replyBoard;\n    private String source;\n    private boolean hasNext;\n    private String voicecomment;\n    private String ptime;\n    private List<?> users;\n    private List<?> ydbaike;\n    private List<?> link;\n    private List<ImgBean> img;\n    private List<?> votes;\n    private List<TopiclistNewsBean> topiclist_news;\n    private List<TopiclistBean> topiclist;\n    private List<AskbarBean> askbar;\n    private List<AutoRecomendsBean> autoRecomends;\n    private List<?> boboList;\n    private List<HuatiBean> huati;\n\n    public String getBody() {\n        return body;\n    }\n\n    public void setBody(String body) {\n        this.body = body;\n    }\n\n    public int getReplyCount() {\n        return replyCount;\n    }\n\n    public void setReplyCount(int replyCount) {\n        this.replyCount = replyCount;\n    }\n\n    public String getShareLink() {\n        return shareLink;\n    }\n\n    public void setShareLink(String shareLink) {\n        this.shareLink = shareLink;\n    }\n\n    public String getDigest() {\n        return digest;\n    }\n\n    public void setDigest(String digest) {\n        this.digest = digest;\n    }\n\n    public ExtraCardBean getExtraCard() {\n        return extraCard;\n    }\n\n    public void setExtraCard(ExtraCardBean extraCard) {\n        this.extraCard = extraCard;\n    }\n\n    public String getDkeys() {\n        return dkeys;\n    }\n\n    public void setDkeys(String dkeys) {\n        this.dkeys = dkeys;\n    }\n\n    public String getEc() {\n        return ec;\n    }\n\n    public void setEc(String ec) {\n        this.ec = ec;\n    }\n\n    public String getDocid() {\n        return docid;\n    }\n\n    public void setDocid(String docid) {\n        this.docid = docid;\n    }\n\n    public SourceinfoBean getSourceinfo() {\n        return sourceinfo;\n    }\n\n    public void setSourceinfo(SourceinfoBean sourceinfo) {\n        this.sourceinfo = sourceinfo;\n    }\n\n    public boolean isPicnews() {\n        return picnews;\n    }\n\n    public void setPicnews(boolean picnews) {\n        this.picnews = picnews;\n    }\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    public String getTid() {\n        return tid;\n    }\n\n    public void setTid(String tid) {\n        this.tid = tid;\n    }\n\n    public String getTemplate() {\n        return template;\n    }\n\n    public void setTemplate(String template) {\n        this.template = template;\n    }\n\n    public int getThreadVote() {\n        return threadVote;\n    }\n\n    public void setThreadVote(int threadVote) {\n        this.threadVote = threadVote;\n    }\n\n    public int getThreadAgainst() {\n        return threadAgainst;\n    }\n\n    public void setThreadAgainst(int threadAgainst) {\n        this.threadAgainst = threadAgainst;\n    }\n\n    public String getReplyBoard() {\n        return replyBoard;\n    }\n\n    public void setReplyBoard(String replyBoard) {\n        this.replyBoard = replyBoard;\n    }\n\n    public String getSource() {\n        return source;\n    }\n\n    public void setSource(String source) {\n        this.source = source;\n    }\n\n    public boolean isHasNext() {\n        return hasNext;\n    }\n\n    public void setHasNext(boolean hasNext) {\n        this.hasNext = hasNext;\n    }\n\n    public String getVoicecomment() {\n        return voicecomment;\n    }\n\n    public void setVoicecomment(String voicecomment) {\n        this.voicecomment = voicecomment;\n    }\n\n    public String getPtime() {\n        return ptime;\n    }\n\n    public void setPtime(String ptime) {\n        this.ptime = ptime;\n    }\n\n    public List<?> getUsers() {\n        return users;\n    }\n\n    public void setUsers(List<?> users) {\n        this.users = users;\n    }\n\n    public List<?> getYdbaike() {\n        return ydbaike;\n    }\n\n    public void setYdbaike(List<?> ydbaike) {\n        this.ydbaike = ydbaike;\n    }\n\n    public List<?> getLink() {\n        return link;\n    }\n\n    public void setLink(List<?> link) {\n        this.link = link;\n    }\n\n    public List<ImgBean> getImg() {\n        return img;\n    }\n\n    public void setImg(List<ImgBean> img) {\n        this.img = img;\n    }\n\n    public List<?> getVotes() {\n        return votes;\n    }\n\n    public void setVotes(List<?> votes) {\n        this.votes = votes;\n    }\n\n    public List<TopiclistNewsBean> getTopiclist_news() {\n        return topiclist_news;\n    }\n\n    public void setTopiclist_news(List<TopiclistNewsBean> topiclist_news) {\n        this.topiclist_news = topiclist_news;\n    }\n\n    public List<TopiclistBean> getTopiclist() {\n        return topiclist;\n    }\n\n    public void setTopiclist(List<TopiclistBean> topiclist) {\n        this.topiclist = topiclist;\n    }\n\n    public List<AskbarBean> getAskbar() {\n        return askbar;\n    }\n\n    public void setAskbar(List<AskbarBean> askbar) {\n        this.askbar = askbar;\n    }\n\n    public List<AutoRecomendsBean> getAutoRecomends() {\n        return autoRecomends;\n    }\n\n    public void setAutoRecomends(List<AutoRecomendsBean> autoRecomends) {\n        this.autoRecomends = autoRecomends;\n    }\n\n    public List<?> getBoboList() {\n        return boboList;\n    }\n\n    public void setBoboList(List<?> boboList) {\n        this.boboList = boboList;\n    }\n\n    public List<HuatiBean> getHuati() {\n        return huati;\n    }\n\n    public void setHuati(List<HuatiBean> huati) {\n        this.huati = huati;\n    }\n\n    public static class ExtraCardBean {\n        @Override\n        public String toString() {\n            return \"ExtraCardBean{\" +\n                    \"title='\" + title + '\\'' +\n                    \", extraurl='\" + extraurl + '\\'' +\n                    \", list=\" + list +\n                    '}';\n        }\n\n        /**\n         * title : 热车推荐\n         * extraurl :\n         * list : [{\"name\":\"雪铁龙C5\",\"imgsrc\":\"http://img3.cache.netease.com/photo/0008/2014-08-25/300x225_A4GNKQRP29RB0008.png\",\"digest\":\"直降5.6万↓\",\"url\":\"http://auto.3g.163.com/citroen/2077/#khd002\"},{\"name\":\"名图\",\"imgsrc\":\"http://img4.cache.netease.com/photo/0008/2016-07-26/300x225_BSTJ5R6I59TM0008.png\",\"digest\":\"直降2.0万↓\",\"url\":\"http://auto.3g.163.com/hyundai/17039/#khd002\"},{\"name\":\"全新英朗\",\"imgsrc\":\"http://img3.cache.netease.com/photo/0008/2016-06-21/300x225_BQ3GFBRB3MQL0008.png\",\"digest\":\"直降1.5万↓\",\"url\":\"http://auto.3g.163.com/buick/10003/#khd002\"}]\n         */\n\n        private String title;\n        private String extraurl;\n        private List<ListBean> list;\n\n        public String getTitle() {\n            return title;\n        }\n\n        public void setTitle(String title) {\n            this.title = title;\n        }\n\n        public String getExtraurl() {\n            return extraurl;\n        }\n\n        public void setExtraurl(String extraurl) {\n            this.extraurl = extraurl;\n        }\n\n        public List<ListBean> getList() {\n            return list;\n        }\n\n        public void setList(List<ListBean> list) {\n            this.list = list;\n        }\n\n        public static class ListBean {\n            @Override\n            public String toString() {\n                return \"ListBean{\" +\n                        \"name='\" + name + '\\'' +\n                        \", imgsrc='\" + imgsrc + '\\'' +\n                        \", digest='\" + digest + '\\'' +\n                        \", url='\" + url + '\\'' +\n                        '}';\n            }\n\n            /**\n             * name : 雪铁龙C5\n             * imgsrc : http://img3.cache.netease.com/photo/0008/2014-08-25/300x225_A4GNKQRP29RB0008.png\n             * digest : 直降5.6万↓\n             * url : http://auto.3g.163.com/citroen/2077/#khd002\n             */\n\n            private String name;\n            private String imgsrc;\n            private String digest;\n            private String url;\n\n            public String getName() {\n                return name;\n            }\n\n            public void setName(String name) {\n                this.name = name;\n            }\n\n            public String getImgsrc() {\n                return imgsrc;\n            }\n\n            public void setImgsrc(String imgsrc) {\n                this.imgsrc = imgsrc;\n            }\n\n            public String getDigest() {\n                return digest;\n            }\n\n            public void setDigest(String digest) {\n                this.digest = digest;\n            }\n\n            public String getUrl() {\n                return url;\n            }\n\n            public void setUrl(String url) {\n                this.url = url;\n            }\n        }\n    }\n\n    public static class SourceinfoBean {\n        @Override\n        public String toString() {\n            return \"SourceinfoBean{\" +\n                    \"alias='\" + alias + '\\'' +\n                    \", ename='\" + ename + '\\'' +\n                    \", tname='\" + tname + '\\'' +\n                    \", tid='\" + tid + '\\'' +\n                    '}';\n        }\n\n        /**\n         * alias : 未来汽车生活体验平台\n         * ename : wangyiqicheqiche\n         * tname : 网易汽车\n         * tid : T1454656350893\n         */\n\n        private String alias;\n        private String ename;\n        private String tname;\n        private String tid;\n\n        public String getAlias() {\n            return alias;\n        }\n\n        public void setAlias(String alias) {\n            this.alias = alias;\n        }\n\n        public String getEname() {\n            return ename;\n        }\n\n        public void setEname(String ename) {\n            this.ename = ename;\n        }\n\n        public String getTname() {\n            return tname;\n        }\n\n        public void setTname(String tname) {\n            this.tname = tname;\n        }\n\n        public String getTid() {\n            return tid;\n        }\n\n        public void setTid(String tid) {\n            this.tid = tid;\n        }\n    }\n\n    public static class ImgBean {\n        /**\n         * ref : <!--IMG#0-->\n         * pixel : 550*413\n         * alt :\n         * src : http://img4.cache.netease.com/auto/2016/9/6/20160906095943e0deb_550.jpg\n         */\n\n        private String ref;\n        private String pixel;\n        private String alt;\n        private String src;\n\n        public String getRef() {\n            return ref;\n        }\n\n        public void setRef(String ref) {\n            this.ref = ref;\n        }\n\n        public String getPixel() {\n            return pixel;\n        }\n\n        public void setPixel(String pixel) {\n            this.pixel = pixel;\n        }\n\n        public String getAlt() {\n            return alt;\n        }\n\n        public void setAlt(String alt) {\n            this.alt = alt;\n        }\n\n        public String getSrc() {\n            return src;\n        }\n\n        public void setSrc(String src) {\n            this.src = src;\n        }\n    }\n\n    public static class TopiclistNewsBean {\n        @Override\n        public String toString() {\n            return \"TopiclistNewsBean{\" +\n                    \"hasCover=\" + hasCover +\n                    \", subnum='\" + subnum + '\\'' +\n                    \", alias='\" + alias + '\\'' +\n                    \", tname='\" + tname + '\\'' +\n                    \", ename='\" + ename + '\\'' +\n                    \", tid='\" + tid + '\\'' +\n                    \", cid='\" + cid + '\\'' +\n                    '}';\n        }\n\n        /**\n         * hasCover : false\n         * subnum : 超过1000万\n         * alias : Autos\n         * tname : 汽车\n         * ename : qiche\n         * tid : T1348654060988\n         * cid : C1348652751993\n         */\n\n        private boolean hasCover;\n        private String subnum;\n        private String alias;\n        private String tname;\n        private String ename;\n        private String tid;\n        private String cid;\n\n        public boolean isHasCover() {\n            return hasCover;\n        }\n\n        public void setHasCover(boolean hasCover) {\n            this.hasCover = hasCover;\n        }\n\n        public String getSubnum() {\n            return subnum;\n        }\n\n        public void setSubnum(String subnum) {\n            this.subnum = subnum;\n        }\n\n        public String getAlias() {\n            return alias;\n        }\n\n        public void setAlias(String alias) {\n            this.alias = alias;\n        }\n\n        public String getTname() {\n            return tname;\n        }\n\n        public void setTname(String tname) {\n            this.tname = tname;\n        }\n\n        public String getEname() {\n            return ename;\n        }\n\n        public void setEname(String ename) {\n            this.ename = ename;\n        }\n\n        public String getTid() {\n            return tid;\n        }\n\n        public void setTid(String tid) {\n            this.tid = tid;\n        }\n\n        public String getCid() {\n            return cid;\n        }\n\n        public void setCid(String cid) {\n            this.cid = cid;\n        }\n    }\n\n    public static class TopiclistBean {\n        @Override\n        public String toString() {\n            return \"TopiclistBean{\" +\n                    \"hasCover=\" + hasCover +\n                    \", subnum='\" + subnum + '\\'' +\n                    \", alias='\" + alias + '\\'' +\n                    \", tname='\" + tname + '\\'' +\n                    \", ename='\" + ename + '\\'' +\n                    \", tid='\" + tid + '\\'' +\n                    \", cid='\" + cid + '\\'' +\n                    '}';\n        }\n\n        /**\n         * hasCover : false\n         * subnum : 31.2万\n         * alias : 未来汽车生活体验平台\n         * tname : 网易汽车\n         * ename : wangyiqicheqiche\n         * tid : T1454656350893\n         * cid : C1374477981139\n         */\n\n        private boolean hasCover;\n        private String subnum;\n        private String alias;\n        private String tname;\n        private String ename;\n        private String tid;\n        private String cid;\n\n        public boolean isHasCover() {\n            return hasCover;\n        }\n\n        public void setHasCover(boolean hasCover) {\n            this.hasCover = hasCover;\n        }\n\n        public String getSubnum() {\n            return subnum;\n        }\n\n        public void setSubnum(String subnum) {\n            this.subnum = subnum;\n        }\n\n        public String getAlias() {\n            return alias;\n        }\n\n        public void setAlias(String alias) {\n            this.alias = alias;\n        }\n\n        public String getTname() {\n            return tname;\n        }\n\n        public void setTname(String tname) {\n            this.tname = tname;\n        }\n\n        public String getEname() {\n            return ename;\n        }\n\n        public void setEname(String ename) {\n            this.ename = ename;\n        }\n\n        public String getTid() {\n            return tid;\n        }\n\n        public void setTid(String tid) {\n            this.tid = tid;\n        }\n\n        public String getCid() {\n            return cid;\n        }\n\n        public void setCid(String cid) {\n            this.cid = cid;\n        }\n    }\n\n    public static class AskbarBean {\n        @Override\n        public String toString() {\n            return \"AskbarBean{\" +\n                    \"title='\" + title + '\\'' +\n                    \", headpicurl='\" + headpicurl + '\\'' +\n                    \", alias='\" + alias + '\\'' +\n                    \", expertId='\" + expertId + '\\'' +\n                    \", name='\" + name + '\\'' +\n                    \", concernCount=\" + concernCount +\n                    '}';\n        }\n\n        /**\n         * title : 汽车媒体人\n         * headpicurl : http://dingyue.nosdn.127.net/6qrnKjR9P7VaWHw60hb8z52iUdJ4edQg4wE3XAm=Xqawu1471420744994.jpg\n         * alias : 我是汽车媒体人张超，关于买车、换车、用车的相关问题，问我吧！\n         * expertId : EX1729495850059568996\n         * name : 张超\n         * concernCount : 43570\n         */\n\n        private String title;\n        private String headpicurl;\n        private String alias;\n        private String expertId;\n        private String name;\n        private int concernCount;\n\n        public String getTitle() {\n            return title;\n        }\n\n        public void setTitle(String title) {\n            this.title = title;\n        }\n\n        public String getHeadpicurl() {\n            return headpicurl;\n        }\n\n        public void setHeadpicurl(String headpicurl) {\n            this.headpicurl = headpicurl;\n        }\n\n        public String getAlias() {\n            return alias;\n        }\n\n        public void setAlias(String alias) {\n            this.alias = alias;\n        }\n\n        public String getExpertId() {\n            return expertId;\n        }\n\n        public void setExpertId(String expertId) {\n            this.expertId = expertId;\n        }\n\n        public String getName() {\n            return name;\n        }\n\n        public void setName(String name) {\n            this.name = name;\n        }\n\n        public int getConcernCount() {\n            return concernCount;\n        }\n\n        public void setConcernCount(int concernCount) {\n            this.concernCount = concernCount;\n        }\n    }\n\n    public static class AutoRecomendsBean {\n        @Override\n        public String toString() {\n            return \"AutoRecomendsBean{\" +\n                    \"name='\" + name + '\\'' +\n                    \", imgsrc='\" + imgsrc + '\\'' +\n                    \", chexi_id='\" + chexi_id + '\\'' +\n                    \", youhui=\" + youhui +\n                    \", youhuinew='\" + youhuinew + '\\'' +\n                    \", url='\" + url + '\\'' +\n                    '}';\n        }\n\n        /**\n         * name : 雪铁龙C5\n         * imgsrc : http://img3.cache.netease.com/photo/0008/2014-08-25/300x225_A4GNKQRP29RB0008.png\n         * chexi_id : 2077\n         * youhui : 5.6\n         * youhuinew : 直降5.6万↓\n         * url : http://auto.3g.163.com/citroen/2077/#khd002\n         */\n\n        private String name;\n        private String imgsrc;\n        private String chexi_id;\n        private double youhui;\n        private String youhuinew;\n        private String url;\n\n        public String getName() {\n            return name;\n        }\n\n        public void setName(String name) {\n            this.name = name;\n        }\n\n        public String getImgsrc() {\n            return imgsrc;\n        }\n\n        public void setImgsrc(String imgsrc) {\n            this.imgsrc = imgsrc;\n        }\n\n        public String getChexi_id() {\n            return chexi_id;\n        }\n\n        public void setChexi_id(String chexi_id) {\n            this.chexi_id = chexi_id;\n        }\n\n        public double getYouhui() {\n            return youhui;\n        }\n\n        public void setYouhui(double youhui) {\n            this.youhui = youhui;\n        }\n\n        public String getYouhuinew() {\n            return youhuinew;\n        }\n\n        public void setYouhuinew(String youhuinew) {\n            this.youhuinew = youhuinew;\n        }\n\n        public String getUrl() {\n            return url;\n        }\n\n        public void setUrl(String url) {\n            this.url = url;\n        }\n    }\n\n    public static class HuatiBean {\n        /**\n         * topicId : SJ8240509424738212213\n         * topicName : 本田\n         */\n\n        private String topicId;\n        private String topicName;\n\n        public String getTopicId() {\n            return topicId;\n        }\n\n        public void setTopicId(String topicId) {\n            this.topicId = topicId;\n        }\n\n        public String getTopicName() {\n            return topicName;\n        }\n\n        public void setTopicName(String topicName) {\n            this.topicName = topicName;\n        }\n\n        @Override\n        public String toString() {\n            return \"HuatiBean{\" +\n                    \"topicId='\" + topicId + '\\'' +\n                    \", topicName='\" + topicName + '\\'' +\n                    '}';\n        }\n    }\n\n    @Override\n    public String toString() {\n        return \"NewsDetail{\" +\n                \"body='\" + body + '\\'' +\n                \", replyCount=\" + replyCount +\n                \", shareLink='\" + shareLink + '\\'' +\n                \", digest='\" + digest + '\\'' +\n                \", extraCard=\" + extraCard +\n                \", dkeys='\" + dkeys + '\\'' +\n                \", ec='\" + ec + '\\'' +\n                \", docid='\" + docid + '\\'' +\n                \", sourceinfo=\" + sourceinfo +\n                \", picnews=\" + picnews +\n                \", title='\" + title + '\\'' +\n                \", tid='\" + tid + '\\'' +\n                \", template='\" + template + '\\'' +\n                \", threadVote=\" + threadVote +\n                \", threadAgainst=\" + threadAgainst +\n                \", replyBoard='\" + replyBoard + '\\'' +\n                \", source='\" + source + '\\'' +\n                \", hasNext=\" + hasNext +\n                \", voicecomment='\" + voicecomment + '\\'' +\n                \", ptime='\" + ptime + '\\'' +\n                \", users=\" + users +\n                \", ydbaike=\" + ydbaike +\n                \", link=\" + link +\n                \", img=\" + img +\n                \", votes=\" + votes +\n                \", topiclist_news=\" + topiclist_news +\n                \", topiclist=\" + topiclist +\n                \", askbar=\" + askbar +\n                \", autoRecomends=\" + autoRecomends +\n                \", boboList=\" + boboList +\n                \", huati=\" + huati +\n                '}';\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/model/bean/NewsPhotoDetail.java",
    "content": "package com.lvr.livecircle.news.model.bean;\n\nimport android.os.Parcel;\nimport android.os.Parcelable;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Created by lvr on 2017/2/11.\n */\n\npublic class NewsPhotoDetail implements Parcelable{\n    private String title;\n    private List<Picture> pictures;\n\n    public String getTitle() {\n        return title;\n    }\n\n    public void setTitle(String title) {\n        this.title = title;\n    }\n\n    public List<Picture> getPictures() {\n        return pictures;\n    }\n\n    public void setPictures(List<Picture> pictures) {\n        this.pictures = pictures;\n    }\n\n    public static class Picture implements Parcelable {\n        private String title;\n\n        public String getImgSrc() {\n            return imgSrc;\n        }\n\n        public void setImgSrc(String imgSrc) {\n            this.imgSrc = imgSrc;\n        }\n\n        public String getTitle() {\n            return title;\n        }\n\n        public void setTitle(String title) {\n            this.title = title;\n        }\n\n        private String imgSrc;\n\n        @Override\n        public int describeContents() {\n            return 0;\n        }\n\n        @Override\n        public void writeToParcel(Parcel dest, int flags) {\n            dest.writeString(this.title);\n            dest.writeString(this.imgSrc);\n        }\n\n        public Picture() {\n        }\n\n        protected Picture(Parcel in) {\n            this.title = in.readString();\n            this.imgSrc = in.readString();\n        }\n\n        public static final Creator<Picture> CREATOR = new Creator<Picture>() {\n            @Override\n            public Picture createFromParcel(Parcel source) {\n                return new Picture(source);\n            }\n\n            @Override\n            public Picture[] newArray(int size) {\n                return new Picture[size];\n            }\n        };\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n    @Override\n    public void writeToParcel(Parcel dest, int flags) {\n        dest.writeString(this.title);\n        dest.writeList(this.pictures);\n    }\n\n    public NewsPhotoDetail() {\n    }\n\n    protected NewsPhotoDetail(Parcel in) {\n        this.title = in.readString();\n        this.pictures = new ArrayList<>();\n        in.readList(this.pictures, Picture.class.getClassLoader());\n    }\n\n    public static final Parcelable.Creator<NewsPhotoDetail> CREATOR = new Parcelable.Creator<NewsPhotoDetail>() {\n        @Override\n        public NewsPhotoDetail createFromParcel(Parcel source) {\n            return new NewsPhotoDetail(source);\n        }\n\n        @Override\n        public NewsPhotoDetail[] newArray(int size) {\n            return new NewsPhotoDetail[size];\n        }\n    };\n\n    @Override\n    public String toString() {\n        return \"NewsPhotoDetail{\" +\n                \"title='\" + title + '\\'' +\n                \", pictures=\" + pictures +\n                '}';\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/model/impl/NewsChannelModelImpl.java",
    "content": "package com.lvr.livecircle.news.model.impl;\n\nimport com.lvr.livecircle.app.AppApplication;\nimport com.lvr.livecircle.app.AppConstant;\nimport com.lvr.livecircle.client.RetrofitClient;\nimport com.lvr.livecircle.news.db.NewsChannelTableManager;\nimport com.lvr.livecircle.news.model.NewsChannelModel;\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\nimport com.lvr.livecircle.utils.ACache;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport io.reactivex.Observable;\nimport io.reactivex.ObservableEmitter;\nimport io.reactivex.ObservableOnSubscribe;\n\n/**\n * Created by lvr on 2017/2/14.\n */\n\npublic class NewsChannelModelImpl implements NewsChannelModel {\n\n\n    @Override\n    public Observable<List<NewsChannelTable>> lodeMoreNewsChannels() {\n        return Observable.create(new ObservableOnSubscribe<List<NewsChannelTable>>() {\n            @Override\n            public void subscribe(ObservableEmitter<List<NewsChannelTable>> e) throws Exception {\n                ArrayList<NewsChannelTable> newsChannelTableList = (ArrayList<NewsChannelTable>) ACache.get(AppApplication.getAppContext()).getAsObject(AppConstant.CHANNEL_MORE);\n                if(newsChannelTableList==null){\n                    newsChannelTableList = (ArrayList<NewsChannelTable>) NewsChannelTableManager.loadNewsChannelsMore();\n                    ACache.get(AppApplication.getAppContext()).put(AppConstant.CHANNEL_MORE,newsChannelTableList);\n\n                }\n                e.onNext(newsChannelTableList);\n                e.onComplete();\n            }\n\n        }).compose(RetrofitClient.schedulersTransformer);\n    }\n\n    @Override\n    public Observable<String> swapDb(final ArrayList<NewsChannelTable> newsChannelTableList) {\n        return Observable.create(new ObservableOnSubscribe<String>() {\n            @Override\n            public void subscribe(ObservableEmitter<String> e) throws Exception {\n                //交换过的列表进行缓存\n                ACache.get(AppApplication.getAppContext()).put(AppConstant.CHANNEL_MINE,newsChannelTableList);\n                e.onNext(\"\");\n                e.onComplete();\n            }\n        }).compose(RetrofitClient.schedulersTransformer);\n    }\n\n    @Override\n    public Observable<String> updateDb(final ArrayList<NewsChannelTable> mineChannelTableList, final ArrayList<NewsChannelTable> moreChannelTableList) {\n        return Observable.create(new ObservableOnSubscribe<String>() {\n            @Override\n            public void subscribe(ObservableEmitter<String> e) throws Exception {\n                ACache.get(AppApplication.getAppContext()).put(AppConstant.CHANNEL_MINE,mineChannelTableList);\n                ACache.get(AppApplication.getAppContext()).put(AppConstant.CHANNEL_MORE,moreChannelTableList);\n                e.onNext(\"\");\n                e.onComplete();\n            }\n        }).compose(RetrofitClient.schedulersTransformer);\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/model/impl/NewsDetailModelImpl.java",
    "content": "package com.lvr.livecircle.news.model.impl;\n\nimport com.lvr.livecircle.api.ApiService;\nimport com.lvr.livecircle.app.AppApplication;\nimport com.lvr.livecircle.client.RetrofitClient;\nimport com.lvr.livecircle.news.model.NewsDetailModel;\nimport com.lvr.livecircle.news.model.bean.NewsDetail;\n\nimport java.util.List;\nimport java.util.Map;\n\nimport io.reactivex.Observable;\nimport io.reactivex.functions.Function;\n\n/**\n * Created by lvr on 2017/2/11.\n */\n\npublic class NewsDetailModelImpl implements NewsDetailModel {\n    @Override\n    public Observable<NewsDetail> getDetailNews(final String postId) {\n        RetrofitClient retrofitClient = RetrofitClient.getInstance(AppApplication.getAppContext(), ApiService.NEWS_BASE_URL);\n        ApiService api = retrofitClient.create(ApiService.class);\n        return api.getNewDetail(postId).map(new Function<Map<String,NewsDetail>, Object>() {\n            @Override\n            public Object apply(Map<String, NewsDetail> map) throws Exception {\n                NewsDetail newsDetail = map.get(postId);\n                //把body中空的图片连接换成img中的\n                changeNewsDetail(newsDetail);\n                return newsDetail;\n            }\n        }).compose(RetrofitClient.schedulersTransformer);\n    }\n    private void changeNewsDetail(NewsDetail newsDetail) {\n        List<NewsDetail.ImgBean> imgSrcs = newsDetail.getImg();\n        if (isChange(imgSrcs)) {\n            String newsBody = newsDetail.getBody();\n            newsBody = changeNewsBody(imgSrcs, newsBody);\n            newsDetail.setBody(newsBody);\n        }\n    }\n\n    private boolean isChange(List<NewsDetail.ImgBean> imgSrcs) {\n        return imgSrcs != null && imgSrcs.size() >= 2;\n    }\n\n    private String changeNewsBody(List<NewsDetail.ImgBean> imgSrcs, String newsBody) {\n        for (int i = 0; i < imgSrcs.size(); i++) {\n            String oldChars = \"<!--IMG#\" + i + \"-->\";\n            String newChars;\n            if (i == 0) {\n                newChars = \"\";\n            } else {\n                newChars = \"<img src=\\\"\" + imgSrcs.get(i).getSrc() + \"\\\" />\";\n            }\n            newsBody = newsBody.replace(oldChars, newChars);\n\n        }\n        return newsBody;\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/model/impl/NewsModelImpl.java",
    "content": "package com.lvr.livecircle.news.model.impl;\n\nimport com.lvr.livecircle.api.ApiConstants;\nimport com.lvr.livecircle.api.ApiService;\nimport com.lvr.livecircle.app.AppApplication;\nimport com.lvr.livecircle.app.AppConstant;\nimport com.lvr.livecircle.bean.NewsInfo;\nimport com.lvr.livecircle.client.RetrofitClient;\nimport com.lvr.livecircle.news.db.NewsChannelTableManager;\nimport com.lvr.livecircle.news.model.NewsModel;\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\nimport com.lvr.livecircle.utils.ACache;\nimport com.lvr.livecircle.utils.TimeUtil;\n\nimport java.util.ArrayList;\nimport java.util.Comparator;\nimport java.util.List;\nimport java.util.Map;\n\nimport io.reactivex.Observable;\nimport io.reactivex.ObservableEmitter;\nimport io.reactivex.ObservableOnSubscribe;\nimport io.reactivex.ObservableSource;\nimport io.reactivex.functions.Function;\nimport io.reactivex.schedulers.Schedulers;\n\n/**\n * Created by lvr on 2017/2/7.\n */\n\npublic class NewsModelImpl implements NewsModel {\n    @Override\n    public Observable<List<NewsChannelTable>> requestNewsChannels() {\n        return Observable.create(new ObservableOnSubscribe<List<NewsChannelTable>>() {\n            @Override\n            public void subscribe(ObservableEmitter<List<NewsChannelTable>> e) throws Exception {\n                ArrayList<NewsChannelTable> newsChannelTableList = (ArrayList<NewsChannelTable>) ACache.get(AppApplication.getAppContext()).getAsObject(AppConstant.CHANNEL_MINE);\n                if(newsChannelTableList==null){\n                    newsChannelTableList= (ArrayList<NewsChannelTable>) NewsChannelTableManager.loadNewsChannelsStatic();\n                    ACache.get(AppApplication.getAppContext()).put(AppConstant.CHANNEL_MINE,newsChannelTableList);\n                }\n                e.onNext(newsChannelTableList);\n                e.onComplete();\n            }\n        }).subscribeOn(Schedulers.io());\n    }\n\n    @Override\n    public Observable<NewsInfo> requestNewsList(String newsType, final String id, int startPage) {\n        RetrofitClient retrofitClient = RetrofitClient.getInstance(AppApplication.getAppContext(), ApiService.NEWS_BASE_URL);\n        ApiService api = retrofitClient.create(ApiService.class);\n        return api.getNewsList(newsType,id,startPage).flatMap(new Function<Map<String, List<NewsInfo>>, ObservableSource<NewsInfo>>() {\n            @Override\n            public ObservableSource<NewsInfo> apply(Map<String, List<NewsInfo>> map) throws Exception {\n                //房产类型的信息\n                if (id.endsWith(ApiConstants.HOUSE_ID)) {\n                    return Observable.fromIterable(map.get(\"北京\"));\n                }else{\n                    return Observable.fromIterable(map.get(id));\n                }\n            }\n        }).map(new Function<NewsInfo, NewsInfo>() {//转换时间格式\n            @Override\n            public NewsInfo apply(NewsInfo info) throws Exception {\n                String ptime = TimeUtil.formatDate(info.getPtime());\n                info.setPtime(ptime);\n                return info;\n            }\n        }).distinct().sorted(new Comparator<NewsInfo>() {\n            @Override\n            public int compare(NewsInfo info, NewsInfo t1) {\n                return t1.getPtime().compareTo(info.getPtime());\n            }\n        }).compose(RetrofitClient.schedulersTransformer);//线程调度\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/presenter/NewPresenter.java",
    "content": "package com.lvr.livecircle.news.presenter;\n\n/**\n * Created by lvr on 2017/2/7.\n */\n\npublic interface NewPresenter {\n    void lodeMineChannelsRequest();\n    void loadNewsListRequest(String newsType, final String id, int startPage);\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/presenter/NewsChannelPresenter.java",
    "content": "package com.lvr.livecircle.news.presenter;\n\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\n\nimport java.util.ArrayList;\n\n/**\n * Created by lvr on 2017/2/14.\n */\n\npublic interface NewsChannelPresenter {\n    void lodeChannelsRequest();\n\n    void onItemSwap(ArrayList<NewsChannelTable> newsChannelTableList);\n\n    void onItemAddOrRemove(ArrayList<NewsChannelTable> mineChannelTableList, ArrayList<NewsChannelTable> moreChannelTableList);\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/presenter/NewsDetailPresenter.java",
    "content": "package com.lvr.livecircle.news.presenter;\n\n/**\n * Created by lvr on 2017/2/11.\n */\n\npublic interface NewsDetailPresenter {\n    void requestDetailNews(String postId);\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/presenter/impl/NewsChannelPresenterImpl.java",
    "content": "package com.lvr.livecircle.news.presenter.impl;\n\nimport com.lvr.livecircle.bean.HeaderBean;\nimport com.lvr.livecircle.client.RxDisposeManager;\nimport com.lvr.livecircle.news.activity.NewsChannelActivity;\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\nimport com.lvr.livecircle.news.model.impl.NewsChannelModelImpl;\nimport com.lvr.livecircle.news.model.impl.NewsModelImpl;\nimport com.lvr.livecircle.news.presenter.NewsChannelPresenter;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport de.greenrobot.event.EventBus;\nimport io.reactivex.Observable;\nimport io.reactivex.Observer;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.disposables.Disposable;\n\n/**\n * Created by lvr on 2017/2/14.\n */\n\npublic class NewsChannelPresenterImpl implements NewsChannelPresenter {\n    private NewsChannelActivity mView;\n    private NewsChannelModelImpl mModel;\n    private NewsModelImpl mNewsModel;\n\n    public NewsChannelPresenterImpl(NewsChannelActivity activity) {\n        this.mView = activity;\n        this.mModel = new NewsChannelModelImpl();\n        this.mNewsModel = new NewsModelImpl();\n    }\n\n    @Override\n    public void lodeChannelsRequest() {\n        Observable<List<NewsChannelTable>> observable = mNewsModel.requestNewsChannels();\n        observable.observeOn(AndroidSchedulers.mainThread())\n                .subscribe(new Observer<List<NewsChannelTable>>() {\n                    @Override\n                    public void onSubscribe(Disposable d) {\n                        RxDisposeManager.get().add(\"newsMinechannel\", d);\n\n                    }\n\n                    @Override\n                    public void onNext(List<NewsChannelTable> tables) {\n                        mView.returnMineNewsChannels(tables);\n                    }\n\n                    @Override\n                    public void onError(Throwable e) {\n                    }\n\n                    @Override\n                    public void onComplete() {\n\n                    }\n                });\n        Observable<List<NewsChannelTable>> moreObservable = mModel.lodeMoreNewsChannels();\n        moreObservable.subscribe(new Observer<List<NewsChannelTable>>() {\n                    @Override\n                    public void onSubscribe(Disposable d) {\n                        RxDisposeManager.get().add(\"newsMorechannel\", d);\n\n                    }\n\n                    @Override\n                    public void onNext(List<NewsChannelTable> tables) {\n                        mView.returnMoreNewsChannels(tables);\n                    }\n\n                    @Override\n                    public void onError(Throwable e) {\n                    }\n\n                    @Override\n                    public void onComplete() {\n\n                    }\n                });\n    }\n\n    @Override\n    public void onItemSwap(final ArrayList<NewsChannelTable> newsChannelTableList) {\n        mModel.swapDb(newsChannelTableList).subscribe(new Observer<String>() {\n            @Override\n            public void onSubscribe(Disposable d) {\n                EventBus.getDefault().post(new HeaderBean(newsChannelTableList));\n            }\n\n            @Override\n            public void onNext(String s) {\n\n            }\n\n            @Override\n            public void onError(Throwable e) {\n\n            }\n\n            @Override\n            public void onComplete() {\n\n            }\n        });\n    }\n\n    @Override\n    public void onItemAddOrRemove(final ArrayList<NewsChannelTable> mineChannelTableList, ArrayList<NewsChannelTable> moreChannelTableList) {\n        mModel.updateDb(mineChannelTableList,moreChannelTableList).subscribe(new Observer<String>() {\n            @Override\n            public void onSubscribe(Disposable d) {\n\n            }\n\n            @Override\n            public void onNext(String s) {\n                //发送消息 通知NewsFragment更改头布局信息\n                EventBus.getDefault().post(new HeaderBean(mineChannelTableList));\n            }\n\n            @Override\n            public void onError(Throwable e) {\n\n            }\n\n            @Override\n            public void onComplete() {\n\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/presenter/impl/NewsDetailPresenterImpl.java",
    "content": "package com.lvr.livecircle.news.presenter.impl;\n\nimport com.lvr.livecircle.client.RxDisposeManager;\nimport com.lvr.livecircle.news.activity.NewsDetailActivity;\nimport com.lvr.livecircle.news.model.bean.NewsDetail;\nimport com.lvr.livecircle.news.model.impl.NewsDetailModelImpl;\nimport com.lvr.livecircle.widget.LoadingDialog;\n\nimport io.reactivex.Observable;\nimport io.reactivex.Observer;\nimport io.reactivex.disposables.Disposable;\n\n/**\n * Created by lvr on 2017/2/11.\n */\n\npublic class NewsDetailPresenterImpl implements com.lvr.livecircle.news.presenter.NewsDetailPresenter {\n    private NewsDetailModelImpl mModel;\n    private NewsDetailActivity mView;\n    //是否开启了dialog\n    private boolean showDialog;\n\n    public NewsDetailPresenterImpl(NewsDetailActivity view) {\n        mView = view;\n        mModel = new NewsDetailModelImpl();\n    }\n\n    @Override\n    public void requestDetailNews(String postId) {\n        Observable<NewsDetail> observable = mModel.getDetailNews(postId);\n        observable.subscribe(new Observer<NewsDetail>() {\n            @Override\n            public void onSubscribe(Disposable d) {\n                RxDisposeManager.get().add(\"newsDetail\", d);\n                if(!showDialog){\n                    showDialog = true;\n                    LoadingDialog.showDialogForLoading(mView);\n                }\n            }\n\n            @Override\n            public void onNext(NewsDetail detail) {\n                mView.returnNewsDetail(detail);\n            }\n\n            @Override\n            public void onError(Throwable e) {\n                if(showDialog){\n                    showDialog = false;\n                    LoadingDialog.cancelDialogForLoading();\n                }\n                mView.showNetErrorTip();\n            }\n\n            @Override\n            public void onComplete() {\n                if(showDialog){\n                    showDialog = false;\n                    LoadingDialog.cancelDialogForLoading();\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/presenter/impl/NewsPresenterImpl.java",
    "content": "package com.lvr.livecircle.news.presenter.impl;\n\nimport com.lvr.livecircle.bean.HeaderBean;\nimport com.lvr.livecircle.bean.NewsInfo;\nimport com.lvr.livecircle.client.RxDisposeManager;\nimport com.lvr.livecircle.news.fragment.NewsFragment;\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\nimport com.lvr.livecircle.news.model.impl.NewsModelImpl;\nimport com.lvr.livecircle.news.presenter.NewPresenter;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport de.greenrobot.event.Subscribe;\nimport io.reactivex.Observable;\nimport io.reactivex.Observer;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.disposables.Disposable;\n\n/**\n * Created by lvr on 2017/2/11.\n */\n\npublic class NewsPresenterImpl implements NewPresenter {\n    private NewsFragment mNewsView;\n    private NewsModelImpl mNewsModel;\n    private List<NewsInfo> mInfos;\n\n\n    public NewsPresenterImpl(NewsFragment view) {\n        this.mNewsView = view;\n        this.mNewsModel = new NewsModelImpl();\n    }\n\n    @Override\n    public void lodeMineChannelsRequest() {\n        Observable<List<NewsChannelTable>> observable = mNewsModel.requestNewsChannels();\n        observable.observeOn(AndroidSchedulers.mainThread())\n                .subscribe(new Observer<List<NewsChannelTable>>() {\n            @Override\n            public void onSubscribe(Disposable d) {\n                RxDisposeManager.get().add(\"newschannel\", d);\n\n            }\n\n            @Override\n            public void onNext(List<NewsChannelTable> tables) {\n                mNewsView.returnNewsChannel(tables);\n            }\n\n            @Override\n            public void onError(Throwable e) {\n            }\n\n            @Override\n            public void onComplete() {\n\n            }\n        });\n    }\n\n    @Override\n    public void loadNewsListRequest(String newsType, final String id, int startPage) {\n        mInfos = new ArrayList<>();\n        NewsInfo newsInfo = new NewsInfo();\n        newsInfo.setTitle(\"头布局\");\n        mInfos.add(newsInfo);\n        Observable<NewsInfo> observable = mNewsModel.requestNewsList(newsType, id, startPage);\n        observable.subscribe(new Observer<NewsInfo>() {\n            @Override\n            public void onSubscribe(Disposable d) {\n                RxDisposeManager.get().add(\"newslist\", d);\n                mNewsView.showLoading();\n\n\n            }\n\n            @Override\n            public void onNext(NewsInfo info) {\n                mInfos.add(info);\n            }\n\n            @Override\n            public void onError(Throwable e) {\n                System.out.println(e.getMessage());\n                System.out.println(e.getStackTrace());\n                mNewsView.showNetErrorTip();\n\n\n            }\n\n            @Override\n            public void onComplete() {\n                mNewsView.stopLoading();\n                mNewsView.returnNewsList(mInfos);\n            }\n        });\n    }\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/view/NewsChannelView.java",
    "content": "package com.lvr.livecircle.news.view;\n\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\n\nimport java.util.List;\n\n/**\n * Created by lvr on 2017/2/14.\n */\n\npublic interface NewsChannelView {\n    void returnMineNewsChannels(List<NewsChannelTable> newsChannelsMine);\n    void returnMoreNewsChannels(List<NewsChannelTable> newsChannelsMore);\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/view/NewsDetailView.java",
    "content": "package com.lvr.livecircle.news.view;\n\nimport com.lvr.livecircle.news.model.bean.NewsDetail;\n\n/**\n * Created by lvr on 2017/2/11.\n */\n\npublic interface NewsDetailView {\n    void returnNewsDetail(NewsDetail detail);\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/news/view/NewsView.java",
    "content": "package com.lvr.livecircle.news.view;\n\nimport com.lvr.livecircle.bean.NewsInfo;\nimport com.lvr.livecircle.news.model.bean.NewsChannelTable;\n\nimport java.util.List;\n\n/**\n * Created by lvr on 2017/2/7.\n */\n\npublic interface NewsView {\n    void returnNewsChannel(List<NewsChannelTable> tables);\n    void returnNewsList(List<NewsInfo> info);\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/recommend/RecommendFragment.java",
    "content": "package com.lvr.livecircle.recommend;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.base.BaseFragment;\n\n/**\n * Created by lvr on 2017/2/6.\n */\n\npublic class RecommendFragment extends BaseFragment {\n    @Override\n    protected int getLayoutResource() {\n        return R.layout.fragment_recommend;\n    }\n\n\n\n    @Override\n    protected void initView() {\n\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/recycleviewcardgallery/CardAdapterHelper.java",
    "content": "package com.lvr.livecircle.recycleviewcardgallery;\n\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.lvr.livecircle.utils.DisplayUtil;\n\n/**\n * adapter中调用onCreateViewHolder, onBindViewHolder\n * Created by jameson on 9/1/16.\n */\npublic class CardAdapterHelper {\n    private int mPagePadding = 15;\n    private int mShowLeftCardWidth = 15;\n\n    public void onCreateViewHolder(ViewGroup parent, View itemView) {\n        RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) itemView.getLayoutParams();\n        lp.width = parent.getWidth() - DisplayUtil.dip2px( 2 * (mPagePadding + mShowLeftCardWidth));\n        itemView.setLayoutParams(lp);\n    }\n\n    public void onBindViewHolder(View itemView, final int position, int itemCount) {\n        int padding = DisplayUtil.dip2px(mPagePadding);\n        itemView.setPadding(padding, 0, padding, 0);\n        int leftMarin = position == 0 ? padding + DisplayUtil.dip2px( mShowLeftCardWidth) : 0;\n        int rightMarin = position == itemCount - 1 ? padding + DisplayUtil.dip2px(mShowLeftCardWidth) : 0;\n        setViewMargin(itemView, leftMarin, 0, rightMarin, 0);\n    }\n\n    private void setViewMargin(View view, int left, int top, int right, int bottom) {\n        ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();\n        if (lp.leftMargin != left || lp.topMargin != top || lp.rightMargin != right || lp.bottomMargin != bottom) {\n            lp.setMargins(left, top, right, bottom);\n            view.setLayoutParams(lp);\n        }\n    }\n\n    public void setPagePadding(int pagePadding) {\n        mPagePadding = pagePadding;\n    }\n\n    public void setShowLeftCardWidth(int showLeftCardWidth) {\n        mShowLeftCardWidth = showLeftCardWidth;\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/recycleviewcardgallery/CardLinearSnapHelper.java",
    "content": "package com.lvr.livecircle.recycleviewcardgallery;\n\nimport android.support.annotation.NonNull;\nimport android.support.v7.widget.LinearSnapHelper;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\n\n/**\n * 防止卡片在第一页和最后一页因无法\"居中\"而一直循环调用onScrollStateChanged-->SnapHelper.snapToTargetExistingView-->onScrollStateChanged\n * Created by jameson on 9/3/16.\n */\npublic class CardLinearSnapHelper extends LinearSnapHelper {\n    public boolean mNoNeedToScroll = false;\n\n    @Override\n    public int[] calculateDistanceToFinalSnap(@NonNull RecyclerView.LayoutManager layoutManager, @NonNull View targetView) {\n        if (mNoNeedToScroll) {\n            return new int[]{0, 0};\n        } else {\n            return super.calculateDistanceToFinalSnap(layoutManager, targetView);\n        }\n    }\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/recycleviewcardgallery/CardScaleHelper.java",
    "content": "package com.lvr.livecircle.recycleviewcardgallery;\n\nimport android.content.Context;\nimport android.support.v7.widget.RecyclerView;\nimport android.view.View;\n\nimport com.lvr.livecircle.utils.DisplayUtil;\n\n\n/**\n * Created by jameson on 8/30/16.\n */\npublic class CardScaleHelper {\n    private RecyclerView mRecyclerView;\n    private Context mContext;\n\n    private float mScale = 0.9f; // 两边视图scale\n    private int mPagePadding = 15; // 卡片的padding, 卡片间的距离等于2倍的mPagePadding\n    private int mShowLeftCardWidth = 15;   // 左边卡片显示大小\n\n    private int mCardWidth; // 卡片宽度\n    private int mOnePageWidth; // 滑动一页的距离\n    private int mCardGalleryWidth;\n\n    private int mCurrentItemPos;\n    private int mCurrentItemOffset;\n\n    private CardLinearSnapHelper mLinearSnapHelper = new CardLinearSnapHelper();\n\n    public void attachToRecyclerView(final RecyclerView mRecyclerView) {\n\n        this.mRecyclerView = mRecyclerView;\n        mContext = mRecyclerView.getContext();\n        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {\n            @Override\n            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {\n                super.onScrollStateChanged(recyclerView, newState);\n                if (newState == RecyclerView.SCROLL_STATE_IDLE) {\n                    mLinearSnapHelper.mNoNeedToScroll = mCurrentItemOffset == 0 || mCurrentItemOffset == getDestItemOffset(mRecyclerView.getAdapter().getItemCount() - 1);\n                } else {\n                    mLinearSnapHelper.mNoNeedToScroll = false;\n                }\n            }\n\n            @Override\n            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {\n                super.onScrolled(recyclerView, dx, dy);\n                // dx>0则表示右滑, dx<0表示左滑, dy<0表示上滑, dy>0表示下滑\n                mCurrentItemOffset += dx;\n                computeCurrentItemPos();\n                onScrolledChangedCallback();\n            }\n        });\n\n        initWidth();\n        mLinearSnapHelper.attachToRecyclerView(mRecyclerView);\n    }\n\n    /**\n     * 初始化卡片宽度\n     */\n    private void initWidth() {\n        mRecyclerView.post(new Runnable() {\n            @Override\n            public void run() {\n                mCardGalleryWidth = mRecyclerView.getWidth();\n                mCardWidth = mCardGalleryWidth - DisplayUtil.dip2px(2 * (mPagePadding + mShowLeftCardWidth));\n                mOnePageWidth = mCardWidth;\n                mRecyclerView.smoothScrollToPosition(mCurrentItemPos);\n                onScrolledChangedCallback();\n            }\n        });\n    }\n\n    public void setCurrentItemPos(int currentItemPos) {\n        this.mCurrentItemPos = currentItemPos;\n    }\n\n    public int getCurrentItemPos() {\n        return mCurrentItemPos;\n    }\n\n    private int getDestItemOffset(int destPos) {\n        return mOnePageWidth * destPos;\n    }\n\n    /**\n     * 计算mCurrentItemOffset\n     */\n    private void computeCurrentItemPos() {\n        if (mOnePageWidth <= 0) return;\n        boolean pageChanged = false;\n        // 滑动超过一页说明已翻页\n        if (Math.abs(mCurrentItemOffset - mCurrentItemPos * mOnePageWidth) >= mOnePageWidth) {\n            pageChanged = true;\n        }\n        if (pageChanged) {\n            int tempPos = mCurrentItemPos;\n\n            mCurrentItemPos = mCurrentItemOffset / mOnePageWidth;\n        }\n    }\n\n    /**\n     * RecyclerView位移事件监听, view大小随位移事件变化\n     */\n    private void onScrolledChangedCallback() {\n        int offset = mCurrentItemOffset - mCurrentItemPos * mOnePageWidth;\n        float percent = (float) Math.max(Math.abs(offset) * 1.0 / mOnePageWidth, 0.0001);\n\n        View leftView = null;\n        View currentView;\n        View rightView = null;\n        if (mCurrentItemPos > 0) {\n            leftView = mRecyclerView.getLayoutManager().findViewByPosition(mCurrentItemPos - 1);\n        }\n        currentView = mRecyclerView.getLayoutManager().findViewByPosition(mCurrentItemPos);\n        if (mCurrentItemPos < mRecyclerView.getAdapter().getItemCount() - 1) {\n            rightView = mRecyclerView.getLayoutManager().findViewByPosition(mCurrentItemPos + 1);\n        }\n\n        if (leftView != null) {\n            // y = (1 - mScale)x + mScale\n            leftView.setScaleY((1 - mScale) * percent + mScale);\n        }\n        if (currentView != null) {\n            // y = (mScale - 1)x + 1\n            currentView.setScaleY((mScale - 1) * percent + 1);\n        }\n        if (rightView != null) {\n            // y = (1 - mScale)x + mScale\n            rightView.setScaleY((1 - mScale) * percent + mScale);\n        }\n    }\n\n    public void setScale(float scale) {\n        mScale = scale;\n    }\n\n    public void setPagePadding(int pagePadding) {\n        mPagePadding = pagePadding;\n    }\n\n    public void setShowLeftCardWidth(int showLeftCardWidth) {\n        mShowLeftCardWidth = showLeftCardWidth;\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/recycleviewcardgallery/SpeedRecyclerView.java",
    "content": "package com.lvr.livecircle.recycleviewcardgallery;\n\nimport android.content.Context;\nimport android.support.annotation.Nullable;\nimport android.support.v7.widget.RecyclerView;\nimport android.util.AttributeSet;\n\n/**\n * 控制fling速度的RecyclerView\n *\n * Created by jameson on 9/1/16.\n */\npublic class SpeedRecyclerView extends RecyclerView {\n    private static final float FLING_SCALE_DOWN_FACTOR = 0.5f; // 减速因子\n    private static final int FLING_MAX_VELOCITY = 8000; // 最大顺时滑动速度\n\n    public SpeedRecyclerView(Context context) {\n        super(context);\n    }\n\n    public SpeedRecyclerView(Context context, @Nullable AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public SpeedRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {\n        super(context, attrs, defStyle);\n    }\n\n    @Override\n    public boolean fling(int velocityX, int velocityY) {\n        velocityX = solveVelocity(velocityX);\n        velocityY = solveVelocity(velocityY);\n        return super.fling(velocityX, velocityY);\n    }\n\n    private int solveVelocity(int velocity) {\n        if (velocity > 0) {\n            return Math.min(velocity, FLING_MAX_VELOCITY);\n        } else {\n            return Math.max(velocity, -FLING_MAX_VELOCITY);\n        }\n    }\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/utils/ACache.java",
    "content": "package com.lvr.livecircle.utils;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapFactory;\nimport android.graphics.Canvas;\nimport android.graphics.PixelFormat;\nimport android.graphics.drawable.BitmapDrawable;\nimport android.graphics.drawable.Drawable;\n\nimport org.json.JSONArray;\nimport org.json.JSONObject;\n\nimport java.io.BufferedReader;\nimport java.io.BufferedWriter;\nimport java.io.ByteArrayInputStream;\nimport java.io.ByteArrayOutputStream;\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.FileReader;\nimport java.io.FileWriter;\nimport java.io.IOException;\nimport java.io.ObjectInputStream;\nimport java.io.ObjectOutputStream;\nimport java.io.RandomAccessFile;\nimport java.io.Serializable;\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\nimport java.util.Map.Entry;\nimport java.util.Set;\nimport java.util.concurrent.atomic.AtomicInteger;\nimport java.util.concurrent.atomic.AtomicLong;\n\n/**\n * 本地文件缓存工具类\n */\n\n/********************使用例子********************/\n/*\n支持对象、数组、json、字符串（对象要序列化Serializable）\nACache.get(AppApplication.getAppContext()).put(AppConstant.CHANNEL_MINE,mineChannelTableList);\nACache.get(AppApplication.getAppContext()).get(AppConstant.CHANNEL_MINE);\n*/\npublic class ACache {\n\n    public static final int TIME_HOUR = 60 * 60;\n    public static final int TIME_DAY = TIME_HOUR * 24;\n    private static final int MAX_SIZE = 1000 * 1000 * 50; // 50 mb\n    private static final int MAX_COUNT = Integer.MAX_VALUE; // 不限制存放数据的数量\n    private static Map<String, ACache> mInstanceMap = new HashMap<String, ACache>();\n    private ACacheManager mCache;\n\n    public static ACache get(Context ctx) {\n        return get(ctx, \"ACache\");\n    }\n\n    public static ACache get(Context ctx, String cacheName) {\n        File f = new File(ctx.getCacheDir(), cacheName);\n        return get(f, MAX_SIZE, MAX_COUNT);\n    }\n\n    public static ACache get(File cacheDir) {\n        return get(cacheDir, MAX_SIZE, MAX_COUNT);\n    }\n\n    public static ACache get(Context ctx, long max_zise, int max_count) {\n        File f = new File(ctx.getCacheDir(), \"ACache\");\n        return get(f, max_zise, max_count);\n    }\n\n    public static ACache get(File cacheDir, long max_zise, int max_count) {\n        ACache manager = mInstanceMap.get(cacheDir.getAbsoluteFile() + myPid());\n        if (manager == null) {\n            manager = new ACache(cacheDir, max_zise, max_count);\n            mInstanceMap.put(cacheDir.getAbsolutePath() + myPid(), manager);\n        }\n        return manager;\n    }\n\n    private static String myPid() {\n        return \"_\" + android.os.Process.myPid();\n    }\n\n    private ACache(File cacheDir, long max_size, int max_count) {\n        if (!cacheDir.exists() && !cacheDir.mkdirs()) {\n            throw new RuntimeException(\"can't make dirs in \"\n                    + cacheDir.getAbsolutePath());\n        }\n        mCache = new ACacheManager(cacheDir, max_size, max_count);\n    }\n\n    // =======================================\n    // ============ String数据 读写 ==============\n    // =======================================\n\n    /**\n     * 保存 String数据 到 缓存中\n     *\n     * @param key\n     *            保存的key\n     * @param value\n     *            保存的String数据\n     */\n    public void put(String key, String value) {\n        File file = mCache.newFile(key);\n        BufferedWriter out = null;\n        try {\n            out = new BufferedWriter(new FileWriter(file), 1024);\n            out.write(value);\n        } catch (IOException e) {\n            e.printStackTrace();\n        } finally {\n            if (out != null) {\n                try {\n                    out.flush();\n                    out.close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            }\n            mCache.put(file);\n        }\n    }\n\n    /**\n     * 保存 String数据 到 缓存中\n     *\n     * @param key\n     *            保存的key\n     * @param value\n     *            保存的String数据\n     * @param saveTime\n     *            保存的时间，单位：秒\n     */\n    public void put(String key, String value, int saveTime) {\n        put(key, Utils.newStringWithDateInfo(saveTime, value));\n    }\n\n    /**\n     * 读取 String数据\n     *\n     * @param key\n     * @return String 数据\n     */\n    public String getAsString(String key) {\n        File file = mCache.get(key);\n        if (!file.exists())\n            return null;\n        boolean removeFile = false;\n        BufferedReader in = null;\n        try {\n            in = new BufferedReader(new FileReader(file));\n            String readString = \"\";\n            String currentLine;\n            while ((currentLine = in.readLine()) != null) {\n                readString += currentLine;\n            }\n            if (!Utils.isDue(readString)) {\n                return Utils.clearDateInfo(readString);\n            } else {\n                removeFile = true;\n                return null;\n            }\n        } catch (IOException e) {\n            e.printStackTrace();\n            return null;\n        } finally {\n            if (in != null) {\n                try {\n                    in.close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            }\n            if (removeFile)\n                remove(key);\n        }\n    }\n\n    // =======================================\n    // ============= JSONObject 数据 读写 ==============\n    // =======================================\n\n    /**\n     * 保存 JSONObject数据 到 缓存中\n     *\n     * @param key\n     *            保存的key\n     * @param value\n     *            保存的JSON数据\n     */\n    public void put(String key, JSONObject value) {\n        put(key, value.toString());\n    }\n\n    /**\n     * 保存 JSONObject数据 到 缓存中\n     *\n     * @param key\n     *            保存的key\n     * @param value\n     *            保存的JSONObject数据\n     * @param saveTime\n     *            保存的时间，单位：秒\n     */\n    public void put(String key, JSONObject value, int saveTime) {\n        put(key, value.toString(), saveTime);\n    }\n\n    /**\n     * 读取JSONObject数据\n     *\n     * @param key\n     * @return JSONObject数据\n     */\n    public JSONObject getAsJSONObject(String key) {\n        String JSONString = getAsString(key);\n        try {\n            JSONObject obj = new JSONObject(JSONString);\n            return obj;\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n\n    // =======================================\n    // ============ JSONArray 数据 读写 =============\n    // =======================================\n\n    /**\n     * 保存 JSONArray数据 到 缓存中\n     *\n     * @param key\n     *            保存的key\n     * @param value\n     *            保存的JSONArray数据\n     */\n    public void put(String key, JSONArray value) {\n        put(key, value.toString());\n    }\n\n    /**\n     * 保存 JSONArray数据 到 缓存中\n     *\n     * @param key\n     *            保存的key\n     * @param value\n     *            保存的JSONArray数据\n     * @param saveTime\n     *            保存的时间，单位：秒\n     */\n    public void put(String key, JSONArray value, int saveTime) {\n        put(key, value.toString(), saveTime);\n    }\n\n    /**\n     * 读取JSONArray数据\n     *\n     * @param key\n     * @return JSONArray数据\n     */\n    public JSONArray getAsJSONArray(String key) {\n        String JSONString = getAsString(key);\n        try {\n            JSONArray obj = new JSONArray(JSONString);\n            return obj;\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        }\n    }\n\n    // =======================================\n    // ============== byte 数据 读写 =============\n    // =======================================\n\n    /**\n     * 保存 byte数据 到 缓存中\n     *\n     * @param key\n     *            保存的key\n     * @param value\n     *            保存的数据\n     */\n    public void put(String key, byte[] value) {\n        File file = mCache.newFile(key);\n        FileOutputStream out = null;\n        try {\n            out = new FileOutputStream(file);\n            out.write(value);\n        } catch (Exception e) {\n            e.printStackTrace();\n        } finally {\n            if (out != null) {\n                try {\n                    out.flush();\n                    out.close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            }\n            mCache.put(file);\n        }\n    }\n\n    /**\n     * 保存 byte数据 到 缓存中\n     *\n     * @param key\n     *            保存的key\n     * @param value\n     *            保存的数据\n     * @param saveTime\n     *            保存的时间，单位：秒\n     */\n    public void put(String key, byte[] value, int saveTime) {\n        put(key, Utils.newByteArrayWithDateInfo(saveTime, value));\n    }\n\n    /**\n     * 获取 byte 数据\n     *\n     * @param key\n     * @return byte 数据\n     */\n    public byte[] getAsBinary(String key) {\n        RandomAccessFile RAFile = null;\n        boolean removeFile = false;\n        try {\n            File file = mCache.get(key);\n            if (!file.exists())\n                return null;\n            RAFile = new RandomAccessFile(file, \"r\");\n            byte[] byteArray = new byte[(int) RAFile.length()];\n            RAFile.read(byteArray);\n            if (!Utils.isDue(byteArray)) {\n                return Utils.clearDateInfo(byteArray);\n            } else {\n                removeFile = true;\n                return null;\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n            return null;\n        } finally {\n            if (RAFile != null) {\n                try {\n                    RAFile.close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            }\n            if (removeFile)\n                remove(key);\n        }\n    }\n\n    // =======================================\n    // ============= 序列化 数据 读写 ===============\n    // =======================================\n\n    /**\n     * 保存 Serializable数据 到 缓存中\n     *\n     * @param key\n     *            保存的key\n     * @param value\n     *            保存的value\n     */\n    public void put(String key, Serializable value) {\n        put(key, value, -1);\n    }\n\n    /**\n     * 保存 Serializable数据到 缓存中\n     *\n     * @param key\n     *            保存的key\n     * @param value\n     *            保存的value\n     * @param saveTime\n     *            保存的时间，单位：秒\n     */\n    public void put(String key, Serializable value, int saveTime) {\n        ByteArrayOutputStream baos = null;\n        ObjectOutputStream oos = null;\n        try {\n            baos = new ByteArrayOutputStream();\n            oos = new ObjectOutputStream(baos);\n            oos.writeObject(value);\n            byte[] data = baos.toByteArray();\n            if (saveTime != -1) {\n                put(key, data, saveTime);\n            } else {\n                put(key, data);\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        } finally {\n            try {\n                oos.close();\n            } catch (IOException e) {\n            }\n        }\n    }\n\n    /**\n     * 读取 Serializable数据\n     *\n     * @param key\n     * @return Serializable 数据\n     */\n    public Object getAsObject(String key) {\n        byte[] data = getAsBinary(key);\n        if (data != null) {\n            ByteArrayInputStream bais = null;\n            ObjectInputStream ois = null;\n            try {\n                bais = new ByteArrayInputStream(data);\n                ois = new ObjectInputStream(bais);\n                Object reObject = ois.readObject();\n                return reObject;\n            } catch (Exception e) {\n                e.printStackTrace();\n                return null;\n            } finally {\n                try {\n                    if (bais != null)\n                        bais.close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n                try {\n                    if (ois != null)\n                        ois.close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            }\n        }\n        return null;\n\n    }\n\n    // =======================================\n    // ============== bitmap 数据 读写 =============\n    // =======================================\n\n    /**\n     * 保存 bitmap 到 缓存中\n     *\n     * @param key\n     *            保存的key\n     * @param value\n     *            保存的bitmap数据\n     */\n    public void put(String key, Bitmap value) {\n        put(key, Utils.Bitmap2Bytes(value));\n    }\n\n    /**\n     * 保存 bitmap 到 缓存中\n     *\n     * @param key\n     *            保存的key\n     * @param value\n     *            保存的 bitmap 数据\n     * @param saveTime\n     *            保存的时间，单位：秒\n     */\n    public void put(String key, Bitmap value, int saveTime) {\n        put(key, Utils.Bitmap2Bytes(value), saveTime);\n    }\n\n    /**\n     * 读取 bitmap 数据\n     *\n     * @param key\n     * @return bitmap 数据\n     */\n    public Bitmap getAsBitmap(String key) {\n        if (getAsBinary(key) == null) {\n            return null;\n        }\n        return Utils.Bytes2Bimap(getAsBinary(key));\n    }\n\n    // =======================================\n    // ============= drawable 数据 读写 =============\n    // =======================================\n\n    /**\n     * 保存 drawable 到 缓存中\n     *\n     * @param key\n     *            保存的key\n     * @param value\n     *            保存的drawable数据\n     */\n    public void put(String key, Drawable value) {\n        put(key, Utils.drawable2Bitmap(value));\n    }\n\n    /**\n     * 保存 drawable 到 缓存中\n     *\n     * @param key\n     *            保存的key\n     * @param value\n     *            保存的 drawable 数据\n     * @param saveTime\n     *            保存的时间，单位：秒\n     */\n    public void put(String key, Drawable value, int saveTime) {\n        put(key, Utils.drawable2Bitmap(value), saveTime);\n    }\n\n    /**\n     * 读取 Drawable 数据\n     *\n     * @param key\n     * @return Drawable 数据\n     */\n    public Drawable getAsDrawable(String key) {\n        if (getAsBinary(key) == null) {\n            return null;\n        }\n        return Utils.bitmap2Drawable(Utils.Bytes2Bimap(getAsBinary(key)));\n    }\n\n    /**\n     * 获取缓存文件\n     *\n     * @param key\n     * @return value 缓存的文件\n     */\n    public File file(String key) {\n        File f = mCache.newFile(key);\n        if (f.exists())\n            return f;\n        return null;\n    }\n\n    /**\n     * 移除某个key\n     *\n     * @param key\n     * @return 是否移除成功\n     */\n    public boolean remove(String key) {\n        return mCache.remove(key);\n    }\n\n    /**\n     * 清除所有数据\n     */\n    public void clear() {\n        mCache.clear();\n    }\n\n    /**\n     * @title 缓存管理器\n     * @author 杨福海（michael） www.yangfuhai.com\n     * @version 1.0\n     */\n    public class ACacheManager {\n        private final AtomicLong cacheSize;\n        private final AtomicInteger cacheCount;\n        private final long sizeLimit;\n        private final int countLimit;\n        private final Map<File, Long> lastUsageDates = Collections\n                .synchronizedMap(new HashMap<File, Long>());\n        protected File cacheDir;\n\n        private ACacheManager(File cacheDir, long sizeLimit, int countLimit) {\n            this.cacheDir = cacheDir;\n            this.sizeLimit = sizeLimit;\n            this.countLimit = countLimit;\n            cacheSize = new AtomicLong();\n            cacheCount = new AtomicInteger();\n            calculateCacheSizeAndCacheCount();\n        }\n\n        /**\n         * 计算 cacheSize和cacheCount\n         */\n        private void calculateCacheSizeAndCacheCount() {\n            new Thread(new Runnable() {\n                @Override\n                public void run() {\n                    int size = 0;\n                    int count = 0;\n                    File[] cachedFiles = cacheDir.listFiles();\n                    if (cachedFiles != null) {\n                        for (File cachedFile : cachedFiles) {\n                            size += calculateSize(cachedFile);\n                            count += 1;\n                            lastUsageDates.put(cachedFile,\n                                    cachedFile.lastModified());\n                        }\n                        cacheSize.set(size);\n                        cacheCount.set(count);\n                    }\n                }\n            }).start();\n        }\n\n        private void put(File file) {\n            int curCacheCount = cacheCount.get();\n            while (curCacheCount + 1 > countLimit) {\n                long freedSize = removeNext();\n                cacheSize.addAndGet(-freedSize);\n\n                curCacheCount = cacheCount.addAndGet(-1);\n            }\n            cacheCount.addAndGet(1);\n\n            long valueSize = calculateSize(file);\n            long curCacheSize = cacheSize.get();\n            while (curCacheSize + valueSize > sizeLimit) {\n                long freedSize = removeNext();\n                curCacheSize = cacheSize.addAndGet(-freedSize);\n            }\n            cacheSize.addAndGet(valueSize);\n\n            Long currentTime = System.currentTimeMillis();\n            file.setLastModified(currentTime);\n            lastUsageDates.put(file, currentTime);\n        }\n\n        private File get(String key) {\n            File file = newFile(key);\n            Long currentTime = System.currentTimeMillis();\n            file.setLastModified(currentTime);\n            lastUsageDates.put(file, currentTime);\n\n            return file;\n        }\n\n        private File newFile(String key) {\n            return new File(cacheDir, key.hashCode() + \"\");\n        }\n\n        private boolean remove(String key) {\n            File image = get(key);\n            return image.delete();\n        }\n\n        private void clear() {\n            lastUsageDates.clear();\n            cacheSize.set(0);\n            File[] files = cacheDir.listFiles();\n            if (files != null) {\n                for (File f : files) {\n                    f.delete();\n                }\n            }\n        }\n\n        /**\n         * 移除旧的文件\n         *\n         * @return\n         */\n        private long removeNext() {\n            if (lastUsageDates.isEmpty()) {\n                return 0;\n            }\n\n            Long oldestUsage = null;\n            File mostLongUsedFile = null;\n            Set<Entry<File, Long>> entries = lastUsageDates.entrySet();\n            synchronized (lastUsageDates) {\n                for (Entry<File, Long> entry : entries) {\n                    if (mostLongUsedFile == null) {\n                        mostLongUsedFile = entry.getKey();\n                        oldestUsage = entry.getValue();\n                    } else {\n                        Long lastValueUsage = entry.getValue();\n                        if (lastValueUsage < oldestUsage) {\n                            oldestUsage = lastValueUsage;\n                            mostLongUsedFile = entry.getKey();\n                        }\n                    }\n                }\n            }\n\n            long fileSize = calculateSize(mostLongUsedFile);\n            if (mostLongUsedFile.delete()) {\n                lastUsageDates.remove(mostLongUsedFile);\n            }\n            return fileSize;\n        }\n\n        private long calculateSize(File file) {\n            return file.length();\n        }\n    }\n\n    /**\n     * @title 时间计算工具类\n     * @author 杨福海（michael） www.yangfuhai.com\n     * @version 1.0\n     */\n    private static class Utils {\n\n        /**\n         * 判断缓存的String数据是否到期\n         *\n         * @param str\n         * @return true：到期了 false：还没有到期\n         */\n        private static boolean isDue(String str) {\n            return isDue(str.getBytes());\n        }\n\n        /**\n         * 判断缓存的byte数据是否到期\n         *\n         * @param data\n         * @return true：到期了 false：还没有到期\n         */\n        private static boolean isDue(byte[] data) {\n            String[] strs = getDateInfoFromDate(data);\n            if (strs != null && strs.length == 2) {\n                String saveTimeStr = strs[0];\n                while (saveTimeStr.startsWith(\"0\")) {\n                    saveTimeStr = saveTimeStr\n                            .substring(1, saveTimeStr.length());\n                }\n                long saveTime = Long.valueOf(saveTimeStr);\n                long deleteAfter = Long.valueOf(strs[1]);\n                if (System.currentTimeMillis() > saveTime + deleteAfter * 1000) {\n                    return true;\n                }\n            }\n            return false;\n        }\n\n        private static String newStringWithDateInfo(int second, String strInfo) {\n            return createDateInfo(second) + strInfo;\n        }\n\n        private static byte[] newByteArrayWithDateInfo(int second, byte[] data2) {\n            byte[] data1 = createDateInfo(second).getBytes();\n            byte[] retdata = new byte[data1.length + data2.length];\n            System.arraycopy(data1, 0, retdata, 0, data1.length);\n            System.arraycopy(data2, 0, retdata, data1.length, data2.length);\n            return retdata;\n        }\n\n        private static String clearDateInfo(String strInfo) {\n            if (strInfo != null && hasDateInfo(strInfo.getBytes())) {\n                strInfo = strInfo.substring(strInfo.indexOf(mSeparator) + 1,\n                        strInfo.length());\n            }\n            return strInfo;\n        }\n\n        private static byte[] clearDateInfo(byte[] data) {\n            if (hasDateInfo(data)) {\n                return copyOfRange(data, indexOf(data, mSeparator) + 1,\n                        data.length);\n            }\n            return data;\n        }\n\n        private static boolean hasDateInfo(byte[] data) {\n            return data != null && data.length > 15 && data[13] == '-'\n                    && indexOf(data, mSeparator) > 14;\n        }\n\n        private static String[] getDateInfoFromDate(byte[] data) {\n            if (hasDateInfo(data)) {\n                String saveDate = new String(copyOfRange(data, 0, 13));\n                String deleteAfter = new String(copyOfRange(data, 14,\n                        indexOf(data, mSeparator)));\n                return new String[]{saveDate, deleteAfter};\n            }\n            return null;\n        }\n\n        private static int indexOf(byte[] data, char c) {\n            for (int i = 0; i < data.length; i++) {\n                if (data[i] == c) {\n                    return i;\n                }\n            }\n            return -1;\n        }\n\n        private static byte[] copyOfRange(byte[] original, int from, int to) {\n            int newLength = to - from;\n            if (newLength < 0)\n                throw new IllegalArgumentException(from + \" > \" + to);\n            byte[] copy = new byte[newLength];\n            System.arraycopy(original, from, copy, 0,\n                    Math.min(original.length - from, newLength));\n            return copy;\n        }\n\n        private static final char mSeparator = ' ';\n\n        private static String createDateInfo(int second) {\n            String currentTime = System.currentTimeMillis() + \"\";\n            while (currentTime.length() < 13) {\n                currentTime = \"0\" + currentTime;\n            }\n            return currentTime + \"-\" + second + mSeparator;\n        }\n\n        /*\n         * Bitmap → byte[]\n         */\n        private static byte[] Bitmap2Bytes(Bitmap bm) {\n            if (bm == null) {\n                return null;\n            }\n            ByteArrayOutputStream baos = new ByteArrayOutputStream();\n            bm.compress(Bitmap.CompressFormat.PNG, 100, baos);\n            return baos.toByteArray();\n        }\n\n        /*\n         * byte[] → Bitmap\n         */\n        private static Bitmap Bytes2Bimap(byte[] b) {\n            if (b.length == 0) {\n                return null;\n            }\n            return BitmapFactory.decodeByteArray(b, 0, b.length);\n        }\n\n        /*\n         * Drawable → Bitmap\n         */\n        private static Bitmap drawable2Bitmap(Drawable drawable) {\n            if (drawable == null) {\n                return null;\n            }\n            // 取 drawable 的长宽\n            int w = drawable.getIntrinsicWidth();\n            int h = drawable.getIntrinsicHeight();\n            // 取 drawable 的颜色格式\n            Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888\n                    : Bitmap.Config.RGB_565;\n            // 建立对应 bitmap\n            Bitmap bitmap = Bitmap.createBitmap(w, h, config);\n            // 建立对应 bitmap 的画布\n            Canvas canvas = new Canvas(bitmap);\n            drawable.setBounds(0, 0, w, h);\n            // 把 drawable 内容画到画布中\n            drawable.draw(canvas);\n            return bitmap;\n        }\n\n        /*\n         * Bitmap → Drawable\n         */\n        @SuppressWarnings(\"deprecation\")\n        private static Drawable bitmap2Drawable(Bitmap bm) {\n            if (bm == null) {\n                return null;\n            }\n            return new BitmapDrawable(bm);\n        }\n    }\n\n}"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/utils/CollectionUtils.java",
    "content": "package com.lvr.livecircle.utils;\n\nimport java.util.Collection;\n\n/**\n * 集合操作工具类\n *\n */\npublic class CollectionUtils {\n\n    /**\n     * 判断集合是否为null或者0个元素\n     *\n     * @param c\n     * @return\n     */\n    public static boolean isNullOrEmpty(Collection c) {\n        if (null == c || c.isEmpty()) {\n            return true;\n        }\n        return false;\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/utils/DisplayUtil.java",
    "content": "package com.lvr.livecircle.utils;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.Rect;\nimport android.util.DisplayMetrics;\nimport android.view.View;\nimport android.view.ViewTreeObserver;\nimport android.view.ViewTreeObserver.OnGlobalLayoutListener;\nimport android.view.WindowManager;\nimport android.widget.LinearLayout;\n\nimport com.lvr.livecircle.app.AppApplication;\n\n\n/**\n * 屏幕相关的辅助类\n */\npublic class DisplayUtil {\n\tprivate DisplayUtil() {\n\t\t/* cannot be instantiated */\n\t\tthrow new UnsupportedOperationException(\"cannot be instantiated\");\n\t}\n\n\n\t/**\n\t * 将px值转换为dip或dp值，保证尺寸大小不变\n\t *\n\t * @param pxValue\n\t *            （DisplayMetrics类中属性density）\n\t * @return\n\t */\n\tpublic static int px2dip(float pxValue) {\n\t\tfinal float scale = AppApplication.getAppContext().getResources().getDisplayMetrics().density;\n\t\treturn (int) (pxValue / scale + 0.5f);\n\t}\n\n\t/**\n\t * 将dip或dp值转换为px值，保证尺寸大小不变\n\t *\n\t * @param dipValue\n\t *            （DisplayMetrics类中属性density）\n\t * @return\n\t */\n\tpublic static int dip2px( float dipValue) {\n\t\tfinal float scale = AppApplication.getAppContext().getResources().getDisplayMetrics().density;\n\t\treturn (int) (dipValue * scale + 0.5f);\n\t}\n\n\t/**\n\t * 将px值转换为sp值，保证文字大小不变\n\t *\n\t * @param pxValue\n\t *            （DisplayMetrics类中属性scaledDensity）\n\t * @return\n\t */\n\tpublic static int px2sp(float pxValue) {\n\t\tfinal float fontScale = AppApplication.getAppContext().getResources().getDisplayMetrics().scaledDensity;\n\t\treturn (int) (pxValue / fontScale + 0.5f);\n\t}\n\n\t/**\n\t * 将sp值转换为px值，保证文字大小不变\n\t *\n\t * @param spValue\n\t *            （DisplayMetrics类中属性scaledDensity）\n\t * @return\n\t */\n\tpublic static int sp2px(float spValue) {\n\t\tfinal float fontScale = AppApplication.getAppContext().getResources().getDisplayMetrics().scaledDensity;\n\t\treturn (int) (spValue * fontScale + 0.5f);\n\t}\n\n\t/**\n\t * 直接获取控件的宽、高\n\t * @param view\n\t * @return int[]\n\t */\n\tpublic static int[] getWidgetWH(final View view){\n\t    ViewTreeObserver vto2 = view.getViewTreeObserver();\n\t    vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {\n\t        @Override\n\t        public void onGlobalLayout() {\n\t        \tview.getViewTreeObserver().removeGlobalOnLayoutListener(this);\n\t        }\n\t    });\n\t\treturn new int[]{view.getWidth(),view.getHeight()};\n\t}\n\n\t/**\n\t * 直接获取控件的宽、高\n\t * @param view\n\t * @return int[]\n\t */\n\tpublic static int getViewHeight(final View view){\n\t\tViewTreeObserver vto2 = view.getViewTreeObserver();\n\t\tvto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {\n\t\t\t@Override\n\t\t\tpublic void onGlobalLayout() {\n\t\t\t\tview.getViewTreeObserver().removeGlobalOnLayoutListener(this);\n\t\t\t}\n\t\t});\n\t\treturn view.getHeight();\n\t}\n\n\t/**\n\t * 直接获取控件的宽、高\n\t * @param view\n\t * @return int[]\n\t */\n\tpublic static int getViewWidth(final View view){\n\t\tViewTreeObserver vto2 = view.getViewTreeObserver();\n\t\tvto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {\n\t\t\t@Override\n\t\t\tpublic void onGlobalLayout() {\n\t\t\t\tview.getViewTreeObserver().removeGlobalOnLayoutListener(this);\n\t\t\t}\n\t\t});\n\t\treturn view.getWidth();\n\t}\n\t\n\t/**\n\t * 获得屏幕宽度\n\t * \n\t * @param context\n\t * @return\n\t */\n\tpublic static int getScreenWidth(Context context) {\n\t\tWindowManager wm = (WindowManager) context\n\t\t\t\t.getSystemService(Context.WINDOW_SERVICE);\n\t\tDisplayMetrics outMetrics = new DisplayMetrics();\n\t\twm.getDefaultDisplay().getMetrics(outMetrics);\n\t\treturn outMetrics.widthPixels;\n\t}\n\n\t/**\n\t * 获得屏幕高度\n\t * \n\t * @param context\n\t * @return\n\t */\n\tpublic static int getScreenHeight(Context context) {\n\t\tWindowManager wm = (WindowManager) context\n\t\t\t\t.getSystemService(Context.WINDOW_SERVICE);\n\t\tDisplayMetrics outMetrics = new DisplayMetrics();\n\t\twm.getDefaultDisplay().getMetrics(outMetrics);\n\t\treturn outMetrics.heightPixels;\n\t}\n\t\n\t/**\n\t * 获得状态栏的高度\n\t * 注意：该方法只能在Activity类中使用，在测试模式下失败\n\t * @param context\n\t * @return\n\t */\n\tpublic static int getStatusBarHeight(Context context) {\n\t\tint statusBarHeight = -1;\n\t\ttry {\n\t\t\tClass<?> clazz = Class.forName(\"com.android.internal.R$dimen\");\n\t\t\tObject object = clazz.newInstance();\n\t\t\tint height = Integer.parseInt(clazz.getField(\"status_bar_height\")\n\t\t\t\t\t.get(object).toString());\n\t\t\tstatusBarHeight = context.getResources().getDimensionPixelSize(height);\n\t\t} catch (Exception e) {\n\t\t\te.printStackTrace();\n\t\t}\n\t\treturn statusBarHeight;\n\t}\n\t\n\t/**\n\t * 获取控件的宽\n\t * @param view\n\t * @return\n\t */\n\tpublic static int getWidgetWidth(View view){\n\t\tint w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);\n\t\tint h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);\n\t\tview.measure(w, h);//先度量  \n\t\tint width = view.getMeasuredWidth();  \n\t\treturn width;\n\t}\n\t/**\n\t * 获取控件的高\n\t * @param view\n\t * @return\n\t */\n\tpublic static int getWidgetHeight(View view){\n\t\tint w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);\n\t\tint h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);\n\t\tview.measure(w, h);//先度量  \n\t\tint height = view.getMeasuredHeight();\n\t\treturn height;\n\t}\n\t/**\n\t * 设置控件宽\n\t * @param view\n\t * @param width\n\t */\n\tpublic static void setWidgetWidth(View view, int width){\n\t\tLinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();\n\t\tparams.width = width;\n\t\tview.setLayoutParams(params);\n\t}\n\t/**\n\t * 设置控件高\n\t * @param view\n\t * @param height\n\t */\n\tpublic static void setWidgetHeight(View view, int height){\n\t\tLinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();\n\t\tparams.height = height;\n\t\tview.setLayoutParams(params);\n\t}\n\n\t\n\t//----------------------------------------------\n\t\n\t/**\n\t * 获取当前屏幕截图，包含状态栏（这个方法没测试通过）\n\t * \n\t * @param activity\n\t * @return Bitmap\n\t */\n\tpublic static Bitmap snapShotWithStatusBar(Activity activity) {\n\t\tView view = activity.getWindow().getDecorView();\n\t\tview.setDrawingCacheEnabled(true);\n\t\tview.buildDrawingCache();\n\t\tBitmap bmp = view.getDrawingCache();\n\t\tint width = getScreenWidth(activity);\n\t\tint height = getScreenHeight(activity);\n\t\tBitmap bp = null;\n\t\tbp = Bitmap.createBitmap(bmp, 0, 0, width, height);\n\t\tview.destroyDrawingCache();\n\t\treturn bp;\n\t}\n\n\t/**\n\t * 获取当前屏幕截图，不包含状态栏（这个方法没测试通过）\n\t * \n\t * @param activity\n\t * @return Bitmap\n\t */\n\tpublic static Bitmap snapShotWithoutStatusBar(Activity activity) {\n\t\tView view = activity.getWindow().getDecorView();\n\t\tview.setDrawingCacheEnabled(true);\n\t\tview.buildDrawingCache();\n\t\tBitmap bmp = view.getDrawingCache();\n\t\tRect frame = new Rect();\n\t\tactivity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);\n\t\tint statusBarHeight = frame.top;\n\n\t\tint width = getScreenWidth(activity);\n\t\tint height = getScreenHeight(activity);\n\t\tBitmap bp = null;\n\t\tbp = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height\n\t\t\t\t- statusBarHeight);\n\t\tview.destroyDrawingCache();\n\t\treturn bp;\n\t}\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/utils/GlideRoundTransformUtil.java",
    "content": "package com.lvr.livecircle.utils;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.graphics.BitmapShader;\nimport android.graphics.Canvas;\nimport android.graphics.Paint;\n\nimport com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;\nimport com.bumptech.glide.load.resource.bitmap.BitmapTransformation;\n\n/**\n * description:glide转换圆角图片\n * Created by xsf\n * on 2016.04.15:17\n */\npublic class GlideRoundTransformUtil extends BitmapTransformation {\n    public GlideRoundTransformUtil(Context context) {\n        super(context);\n    }\n\n    @Override\n    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {\n        return circleCrop(pool, toTransform);\n    }\n\n    private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {\n        if (source == null) return null;\n\n        int size = Math.min(source.getWidth(), source.getHeight());\n        int x = (source.getWidth() - size) / 2;\n        int y = (source.getHeight() - size) / 2;\n\n        // TODO this could be acquired from the pool too\n        Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);\n\n        Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);\n        if (result == null) {\n            result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);\n        }\n\n        Canvas canvas = new Canvas(result);\n        Paint paint = new Paint();\n        paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));\n        paint.setAntiAlias(true);\n        float r = size / 2f;\n        canvas.drawCircle(r, r, r, paint);\n        return result;\n    }\n\n    @Override\n    public String getId() {\n        return getClass().getName();\n    }\n}"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/utils/ImageLoaderUtils.java",
    "content": "package com.lvr.livecircle.utils;\n\nimport android.content.Context;\nimport android.widget.ImageView;\n\nimport com.bumptech.glide.Glide;\nimport com.bumptech.glide.load.DecodeFormat;\nimport com.bumptech.glide.load.engine.DiskCacheStrategy;\nimport com.lvr.livecircle.R;\n\nimport java.io.File;\n\n/**\n * Description : 图片加载工具类 使用glide框架封装\n */\npublic class ImageLoaderUtils {\n\n    public static void display(Context context, ImageView imageView, String url, int placeholder, int error) {\n        if (imageView == null) {\n            throw new IllegalArgumentException(\"argument error\");\n        }\n        Glide.with(context).load(url).placeholder(placeholder)\n                .error(error).crossFade().into(imageView);\n    }\n\n    public static void display(Context context, ImageView imageView, String url) {\n        if (imageView == null) {\n            throw new IllegalArgumentException(\"argument error\");\n        }\n        Glide.with(context).load(url)\n                .diskCacheStrategy(DiskCacheStrategy.ALL)\n                .centerCrop()\n                .placeholder(R.drawable.ic_image_loading)\n                .error(R.drawable.ic_empty_picture)\n                .crossFade().into(imageView);\n    }\n\n    public static void display(Context context, ImageView imageView, File url) {\n        if (imageView == null) {\n            throw new IllegalArgumentException(\"argument error\");\n        }\n        Glide.with(context).load(url)\n                .diskCacheStrategy(DiskCacheStrategy.ALL)\n                .centerCrop()\n                .placeholder(R.drawable.ic_image_loading)\n                .error(R.drawable.ic_empty_picture)\n                .crossFade().into(imageView);\n    }\n    public static void displaySmallPhoto(Context context, ImageView imageView, String url) {\n        if (imageView == null) {\n            throw new IllegalArgumentException(\"argument error\");\n        }\n        Glide.with(context).load(url).asBitmap()\n                .diskCacheStrategy(DiskCacheStrategy.ALL)\n                .placeholder(R.drawable.ic_image_loading)\n                .error(R.drawable.ic_empty_picture)\n                .thumbnail(0.5f)\n                .into(imageView);\n    }\n    public static void displayBigPhoto(Context context, ImageView imageView, String url) {\n        if (imageView == null) {\n            throw new IllegalArgumentException(\"argument error\");\n        }\n        Glide.with(context).load(url).asBitmap()\n                .format(DecodeFormat.PREFER_ARGB_8888)\n                .diskCacheStrategy(DiskCacheStrategy.ALL)\n                .placeholder(R.drawable.ic_image_loading)\n                .error(R.drawable.ic_empty_picture)\n                .into(imageView);\n    }\n    public static void display(Context context, ImageView imageView, int url) {\n        if (imageView == null) {\n            throw new IllegalArgumentException(\"argument error\");\n        }\n        Glide.with(context).load(url)\n                .diskCacheStrategy(DiskCacheStrategy.ALL)\n                .centerCrop()\n                .placeholder(R.drawable.ic_image_loading)\n                .error(R.drawable.ic_empty_picture)\n                .crossFade().into(imageView);\n    }\n    public static void displayRound(Context context, ImageView imageView, String url) {\n        if (imageView == null) {\n            throw new IllegalArgumentException(\"argument error\");\n        }\n        Glide.with(context).load(url)\n                .diskCacheStrategy(DiskCacheStrategy.ALL)\n                .error(R.drawable.toux2)\n                .centerCrop().transform(new GlideRoundTransformUtil(context)).into(imageView);\n    }\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/utils/StatusBarSetting.java",
    "content": "package com.lvr.livecircle.utils;\n\nimport android.annotation.TargetApi;\nimport android.app.Activity;\nimport android.content.Context;\nimport android.graphics.Color;\nimport android.os.Build;\nimport android.support.annotation.ColorInt;\nimport android.support.design.widget.CoordinatorLayout;\nimport android.support.v4.widget.DrawerLayout;\nimport android.view.View;\nimport android.view.ViewGroup;\nimport android.view.WindowManager;\nimport android.widget.LinearLayout;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.widget.StatusBarView;\n\n/**\n * Created by lvr on 2017/2/7.\n */\n\npublic class StatusBarSetting {\n    public static final int DEFAULT_STATUS_BAR_ALPHA = 112;\n    public static final int FAKE_STATUS_BAR_VIEW_ID = R.id.statusbarutil_fake_status_bar_view;\n    public static final int FAKE_TRANSLUCENT_VIEW_ID = R.id.statusbarutil_translucent_view;\n    private static final int COLOR_TRANSLUCENT = Color.parseColor(\"#00000000\");\n    /**\n     * 设置状态栏颜色\n     *\n     * @param activity 需要设置的 activity\n     * @param color    状态栏颜色值\n     */\n    public static void setColor(Activity activity, @ColorInt int color) {\n        setColor(activity, color, DEFAULT_STATUS_BAR_ALPHA);\n    }\n\n    /**\n     * 设置状态栏颜色\n     *\n     * @param activity       需要设置的activity\n     * @param color          状态栏颜色值\n     * @param statusBarAlpha 状态栏透明度\n     */\n\n    public static void setColor(Activity activity, @ColorInt int color, int statusBarAlpha) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);\n            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n            activity.getWindow().setStatusBarColor(calculateStatusColor(color, statusBarAlpha));\n        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {\n            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n            ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();\n            View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);\n            if (fakeStatusBarView != null) {\n                if (fakeStatusBarView.getVisibility() == View.GONE) {\n                    fakeStatusBarView.setVisibility(View.VISIBLE);\n                }\n                fakeStatusBarView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha));\n            } else {\n                decorView.addView(createStatusBarView(activity, color, statusBarAlpha));\n            }\n            setRootView(activity);\n        }\n    }\n\n    /**\n     * 为滑动返回界面设置状态栏颜色\n     *\n     * @param activity 需要设置的activity\n     * @param color    状态栏颜色值\n     */\n    public static void setColorForSwipeBack(Activity activity, int color) {\n        setColorForSwipeBack(activity, color, DEFAULT_STATUS_BAR_ALPHA);\n    }\n\n    /**\n     * 为滑动返回界面设置状态栏颜色\n     *\n     * @param activity       需要设置的activity\n     * @param color          状态栏颜色值\n     * @param statusBarAlpha 状态栏透明度\n     */\n    public static void setColorForSwipeBack(Activity activity, @ColorInt int color, int statusBarAlpha) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {\n\n            ViewGroup contentView = ((ViewGroup) activity.findViewById(android.R.id.content));\n            View rootView = contentView.getChildAt(0);\n            int statusBarHeight = getStatusBarHeight(activity);\n            if (rootView != null && rootView instanceof CoordinatorLayout) {\n                final CoordinatorLayout coordinatorLayout = (CoordinatorLayout) rootView;\n                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {\n                    coordinatorLayout.setFitsSystemWindows(false);\n                    contentView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha));\n                    boolean isNeedRequestLayout = contentView.getPaddingTop() < statusBarHeight;\n                    if (isNeedRequestLayout) {\n                        contentView.setPadding(0, statusBarHeight, 0, 0);\n                        coordinatorLayout.post(new Runnable() {\n                            @Override\n                            public void run() {\n                                coordinatorLayout.requestLayout();\n                            }\n                        });\n                    }\n                } else {\n                    coordinatorLayout.setStatusBarBackgroundColor(calculateStatusColor(color, statusBarAlpha));\n                }\n            } else {\n                contentView.setPadding(0, statusBarHeight, 0, 0);\n                contentView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha));\n            }\n            setTransparentForWindow(activity);\n        }\n    }\n\n    /**\n     * 设置状态栏纯色 不加半透明效果\n     *\n     * @param activity 需要设置的 activity\n     * @param color    状态栏颜色值\n     */\n    public static void setColorNoTranslucent(Activity activity, @ColorInt int color) {\n        setColor(activity, color, 0);\n    }\n\n    /**\n     * 设置状态栏颜色(5.0以下无半透明效果,不建议使用)\n     *\n     * @param activity 需要设置的 activity\n     * @param color    状态栏颜色值\n     */\n    @Deprecated\n    public static void setColorDiff(Activity activity, @ColorInt int color) {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {\n            return;\n        }\n        transparentStatusBar(activity);\n        ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);\n        // 移除半透明矩形,以免叠加\n        View fakeStatusBarView = contentView.findViewById(FAKE_STATUS_BAR_VIEW_ID);\n        if (fakeStatusBarView != null) {\n            if (fakeStatusBarView.getVisibility() == View.GONE) {\n                fakeStatusBarView.setVisibility(View.VISIBLE);\n            }\n            fakeStatusBarView.setBackgroundColor(color);\n        } else {\n            contentView.addView(createStatusBarView(activity, color));\n        }\n        setRootView(activity);\n    }\n\n    /**\n     * 使状态栏半透明\n     *\n     * 适用于图片作为背景的界面,此时需要图片填充到状态栏\n     *\n     * @param activity 需要设置的activity\n     */\n    public static void setTranslucent(Activity activity) {\n        setTranslucent(activity, DEFAULT_STATUS_BAR_ALPHA);\n    }\n\n    /**\n     * 使状态栏半透明\n     *\n     * 适用于图片作为背景的界面,此时需要图片填充到状态栏\n     *\n     * @param activity       需要设置的activity\n     * @param statusBarAlpha 状态栏透明度\n     */\n    public static void setTranslucent(Activity activity, int statusBarAlpha) {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {\n            return;\n        }\n        setTransparent(activity);\n        addTranslucentView(activity, statusBarAlpha);\n    }\n\n    /**\n     * 针对根布局是 CoordinatorLayout, 使状态栏半透明\n     *\n     * 适用于图片作为背景的界面,此时需要图片填充到状态栏\n     *\n     * @param activity       需要设置的activity\n     * @param statusBarAlpha 状态栏透明度\n     */\n    public static void setTranslucentForCoordinatorLayout(Activity activity, int statusBarAlpha) {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {\n            return;\n        }\n        transparentStatusBar(activity);\n        addTranslucentView(activity, statusBarAlpha);\n    }\n\n    /**\n     * 设置状态栏全透明\n     *\n     * @param activity 需要设置的activity\n     */\n    public static void setTransparent(Activity activity) {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {\n            return;\n        }\n        transparentStatusBar(activity);\n        setRootView(activity);\n    }\n\n    /**\n     * 使状态栏透明(5.0以上半透明效果,不建议使用)\n     *\n     * 适用于图片作为背景的界面,此时需要图片填充到状态栏\n     *\n     * @param activity 需要设置的activity\n     */\n    @Deprecated\n    public static void setTranslucentDiff(Activity activity) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {\n            // 设置状态栏透明\n            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n            setRootView(activity);\n        }\n    }\n\n    /**\n     * 为DrawerLayout 布局设置状态栏变色\n     *\n     * @param activity     需要设置的activity\n     * @param drawerLayout DrawerLayout\n     * @param color        状态栏颜色值\n     */\n    public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, @ColorInt int color) {\n        setColorForDrawerLayout(activity, drawerLayout, color, DEFAULT_STATUS_BAR_ALPHA);\n    }\n\n    /**\n     * 为DrawerLayout 布局设置状态栏颜色,纯色\n     *\n     * @param activity     需要设置的activity\n     * @param drawerLayout DrawerLayout\n     * @param color        状态栏颜色值\n     */\n    public static void setColorNoTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout, @ColorInt int color) {\n        setColorForDrawerLayout(activity, drawerLayout, color, 0);\n    }\n\n    /**\n     * 为DrawerLayout 布局设置状态栏变色\n     *\n     * @param activity       需要设置的activity\n     * @param drawerLayout   DrawerLayout\n     * @param color          状态栏颜色值\n     * @param statusBarAlpha 状态栏透明度\n     */\n    public static void setColorForDrawerLayout(Activity activity, DrawerLayout drawerLayout, @ColorInt int color,\n                                               int statusBarAlpha) {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {\n            return;\n        }\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);\n            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);\n        } else {\n            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n        }\n        // 生成一个状态栏大小的矩形\n        // 添加 statusBarView 到布局中\n        ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);\n        View fakeStatusBarView = contentLayout.findViewById(FAKE_STATUS_BAR_VIEW_ID);\n        if (fakeStatusBarView != null) {\n            if (fakeStatusBarView.getVisibility() == View.GONE) {\n                fakeStatusBarView.setVisibility(View.VISIBLE);\n            }\n            fakeStatusBarView.setBackgroundColor(color);\n        } else {\n            contentLayout.addView(createStatusBarView(activity, color), 0);\n        }\n        // 内容布局不是 LinearLayout 时,设置padding top\n        if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {\n            contentLayout.getChildAt(1)\n                    .setPadding(contentLayout.getPaddingLeft(), getStatusBarHeight(activity) + contentLayout.getPaddingTop(),\n                            contentLayout.getPaddingRight(), contentLayout.getPaddingBottom());\n        }\n        // 设置属性\n        setDrawerLayoutProperty(drawerLayout, contentLayout);\n        addTranslucentView(activity, statusBarAlpha);\n    }\n\n    /**\n     * 设置 DrawerLayout 属性\n     *\n     * @param drawerLayout              DrawerLayout\n     * @param drawerLayoutContentLayout DrawerLayout 的内容布局\n     */\n    private static void setDrawerLayoutProperty(DrawerLayout drawerLayout, ViewGroup drawerLayoutContentLayout) {\n        ViewGroup drawer = (ViewGroup) drawerLayout.getChildAt(1);\n        drawerLayout.setFitsSystemWindows(false);\n        drawerLayoutContentLayout.setFitsSystemWindows(false);\n        drawerLayoutContentLayout.setClipToPadding(true);\n        drawer.setFitsSystemWindows(false);\n    }\n\n    /**\n     * 为DrawerLayout 布局设置状态栏变色(5.0以下无半透明效果,不建议使用)\n     *\n     * @param activity     需要设置的activity\n     * @param drawerLayout DrawerLayout\n     * @param color        状态栏颜色值\n     */\n    @Deprecated\n    public static void setColorForDrawerLayoutDiff(Activity activity, DrawerLayout drawerLayout, @ColorInt int color) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {\n            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n            // 生成一个状态栏大小的矩形\n            ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);\n            View fakeStatusBarView = contentLayout.findViewById(FAKE_STATUS_BAR_VIEW_ID);\n            if (fakeStatusBarView != null) {\n                if (fakeStatusBarView.getVisibility() == View.GONE) {\n                    fakeStatusBarView.setVisibility(View.VISIBLE);\n                }\n                fakeStatusBarView.setBackgroundColor(calculateStatusColor(color, DEFAULT_STATUS_BAR_ALPHA));\n            } else {\n                // 添加 statusBarView 到布局中\n                contentLayout.addView(createStatusBarView(activity, color), 0);\n            }\n            // 内容布局不是 LinearLayout 时,设置padding top\n            if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {\n                contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0);\n            }\n            // 设置属性\n            setDrawerLayoutProperty(drawerLayout, contentLayout);\n        }\n    }\n\n    /**\n     * 为 DrawerLayout 布局设置状态栏透明\n     *\n     * @param activity     需要设置的activity\n     * @param drawerLayout DrawerLayout\n     */\n    public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) {\n        setTranslucentForDrawerLayout(activity, drawerLayout, DEFAULT_STATUS_BAR_ALPHA);\n    }\n\n    /**\n     * 为 DrawerLayout 布局设置状态栏透明\n     *\n     * @param activity     需要设置的activity\n     * @param drawerLayout DrawerLayout\n     */\n    public static void setTranslucentForDrawerLayout(Activity activity, DrawerLayout drawerLayout, int statusBarAlpha) {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {\n            return;\n        }\n        setTransparentForDrawerLayout(activity, drawerLayout);\n        addTranslucentView(activity, statusBarAlpha);\n    }\n\n    /**\n     * 为 DrawerLayout 布局设置状态栏透明\n     *\n     * @param activity     需要设置的activity\n     * @param drawerLayout DrawerLayout\n     */\n    public static void setTransparentForDrawerLayout(Activity activity, DrawerLayout drawerLayout) {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {\n            return;\n        }\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);\n            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);\n        } else {\n            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n        }\n\n        ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);\n        // 内容布局不是 LinearLayout 时,设置padding top\n        if (!(contentLayout instanceof LinearLayout) && contentLayout.getChildAt(1) != null) {\n            contentLayout.getChildAt(1).setPadding(0, getStatusBarHeight(activity), 0, 0);\n        }\n\n        // 设置属性\n        setDrawerLayoutProperty(drawerLayout, contentLayout);\n    }\n\n    /**\n     * 为 DrawerLayout 布局设置状态栏透明(5.0以上半透明效果,不建议使用)\n     *\n     * @param activity     需要设置的activity\n     * @param drawerLayout DrawerLayout\n     */\n    @Deprecated\n    public static void setTranslucentForDrawerLayoutDiff(Activity activity, DrawerLayout drawerLayout) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {\n            // 设置状态栏透明\n            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n            // 设置内容布局属性\n            ViewGroup contentLayout = (ViewGroup) drawerLayout.getChildAt(0);\n            contentLayout.setFitsSystemWindows(true);\n            contentLayout.setClipToPadding(true);\n            // 设置抽屉布局属性\n            ViewGroup vg = (ViewGroup) drawerLayout.getChildAt(1);\n            vg.setFitsSystemWindows(false);\n            // 设置 DrawerLayout 属性\n            drawerLayout.setFitsSystemWindows(false);\n        }\n    }\n\n    /**\n     * 为头部是 ImageView 的界面设置状态栏全透明\n     *\n     * @param activity       需要设置的activity\n     * @param needOffsetView 需要向下偏移的 View\n     */\n    public static void setTransparentForImageView(Activity activity, View needOffsetView) {\n        setTranslucentForImageView(activity, 0, needOffsetView);\n    }\n\n    /**\n     * 为头部是 ImageView 的界面设置状态栏透明(使用默认透明度)\n     *\n     * @param activity       需要设置的activity\n     * @param needOffsetView 需要向下偏移的 View\n     */\n    public static void setTranslucentForImageView(Activity activity, View needOffsetView) {\n        setTranslucentForImageView(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView);\n    }\n\n    /**\n     * 为头部是 ImageView 的界面设置状态栏透明\n     *\n     * @param activity       需要设置的activity\n     * @param statusBarAlpha 状态栏透明度\n     * @param needOffsetView 需要向下偏移的 View\n     */\n    public static void setTranslucentForImageView(Activity activity, int statusBarAlpha, View needOffsetView) {\n        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {\n            return;\n        }\n        setTransparentForWindow(activity);\n        addTranslucentView(activity, statusBarAlpha);\n        if (needOffsetView != null) {\n            ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) needOffsetView.getLayoutParams();\n            layoutParams.setMargins(layoutParams.leftMargin, layoutParams.topMargin + getStatusBarHeight(activity),\n                    layoutParams.rightMargin, layoutParams.bottomMargin);\n        }\n    }\n\n    /**\n     * 为 fragment 头部是 ImageView 的设置状态栏透明\n     *\n     * @param activity       fragment 对应的 activity\n     * @param needOffsetView 需要向下偏移的 View\n     */\n    public static void setTranslucentForImageViewInFragment(Activity activity, View needOffsetView) {\n        setTranslucentForImageViewInFragment(activity, DEFAULT_STATUS_BAR_ALPHA, needOffsetView);\n    }\n\n    /**\n     * 为 fragment 头部是 ImageView 的设置状态栏透明\n     *\n     * @param activity       fragment 对应的 activity\n     * @param needOffsetView 需要向下偏移的 View\n     */\n    public static void setTransparentForImageViewInFragment(Activity activity, View needOffsetView) {\n        setTranslucentForImageViewInFragment(activity, 0, needOffsetView);\n    }\n\n    /**\n     * 为 fragment 头部是 ImageView 的设置状态栏透明\n     *\n     * @param activity       fragment 对应的 activity\n     * @param statusBarAlpha 状态栏透明度\n     * @param needOffsetView 需要向下偏移的 View\n     */\n    public static void setTranslucentForImageViewInFragment(Activity activity, int statusBarAlpha, View needOffsetView) {\n        setTranslucentForImageView(activity, statusBarAlpha, needOffsetView);\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {\n            clearPreviousSetting(activity);\n        }\n    }\n\n    /**\n     * 隐藏伪状态栏 View\n     *\n     * @param activity 调用的 Activity\n     */\n    public static void hideFakeStatusBarView(Activity activity) {\n        ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();\n        View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);\n        if (fakeStatusBarView != null) {\n            fakeStatusBarView.setVisibility(View.GONE);\n        }\n        View fakeTranslucentView = decorView.findViewById(FAKE_TRANSLUCENT_VIEW_ID);\n        if (fakeTranslucentView != null) {\n            fakeTranslucentView.setVisibility(View.GONE);\n        }\n    }\n\n    ///////////////////////////////////////////////////////////////////////////////////\n\n    @TargetApi(Build.VERSION_CODES.KITKAT)\n    private static void clearPreviousSetting(Activity activity) {\n        ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();\n        View fakeStatusBarView = decorView.findViewById(FAKE_STATUS_BAR_VIEW_ID);\n        if (fakeStatusBarView != null) {\n            decorView.removeView(fakeStatusBarView);\n            ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);\n            rootView.setPadding(0, 0, 0, 0);\n        }\n    }\n\n    /**\n     * 添加半透明矩形条\n     *\n     * @param activity       需要设置的 activity\n     * @param statusBarAlpha 透明值\n     */\n    private static void addTranslucentView(Activity activity, int statusBarAlpha) {\n        ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);\n        View fakeTranslucentView = contentView.findViewById(FAKE_TRANSLUCENT_VIEW_ID);\n        if (fakeTranslucentView != null) {\n            if (fakeTranslucentView.getVisibility() == View.GONE) {\n                fakeTranslucentView.setVisibility(View.VISIBLE);\n            }\n            fakeTranslucentView.setBackgroundColor(Color.argb(statusBarAlpha, 0, 0, 0));\n        } else {\n            contentView.addView(createTranslucentStatusBarView(activity, statusBarAlpha));\n        }\n    }\n\n    /**\n     * 生成一个和状态栏大小相同的彩色矩形条\n     *\n     * @param activity 需要设置的 activity\n     * @param color    状态栏颜色值\n     * @return 状态栏矩形条\n     */\n    private static StatusBarView createStatusBarView(Activity activity, @ColorInt int color) {\n        return createStatusBarView(activity, color, 0);\n    }\n\n    /**\n     * 生成一个和状态栏大小相同的半透明矩形条\n     *\n     * @param activity 需要设置的activity\n     * @param color    状态栏颜色值\n     * @param alpha    透明值\n     * @return 状态栏矩形条\n     */\n    private static StatusBarView createStatusBarView(Activity activity, @ColorInt int color, int alpha) {\n        // 绘制一个和状态栏一样高的矩形\n        StatusBarView statusBarView = new StatusBarView(activity);\n        LinearLayout.LayoutParams params =\n                new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));\n        statusBarView.setLayoutParams(params);\n        statusBarView.setBackgroundColor(calculateStatusColor(color, alpha));\n        statusBarView.setId(FAKE_STATUS_BAR_VIEW_ID);\n        return statusBarView;\n    }\n\n    /**\n     * 设置根布局参数\n     */\n    private static void setRootView(Activity activity) {\n        ViewGroup parent = (ViewGroup) activity.findViewById(android.R.id.content);\n        for (int i = 0, count = parent.getChildCount(); i < count; i++) {\n            View childView = parent.getChildAt(i);\n            if (childView instanceof ViewGroup) {\n                childView.setFitsSystemWindows(true);\n                ((ViewGroup) childView).setClipToPadding(true);\n            }\n        }\n    }\n\n    /**\n     * 设置透明\n     */\n    private static void setTransparentForWindow(Activity activity) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);\n            activity.getWindow()\n                    .getDecorView()\n                    .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);\n        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {\n            activity.getWindow()\n                    .setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n        }\n    }\n\n    /**\n     * 使状态栏透明\n     */\n    @TargetApi(Build.VERSION_CODES.KITKAT)\n    private static void transparentStatusBar(Activity activity) {\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {\n            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);\n            activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);\n            activity.getWindow().setStatusBarColor(Color.TRANSPARENT);\n        } else {\n            activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);\n        }\n    }\n\n    /**\n     * 创建半透明矩形 View\n     *\n     * @param alpha 透明值\n     * @return 半透明 View\n     */\n    private static StatusBarView createTranslucentStatusBarView(Activity activity, int alpha) {\n        // 绘制一个和状态栏一样高的矩形\n        StatusBarView statusBarView = new StatusBarView(activity);\n        LinearLayout.LayoutParams params =\n                new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));\n        statusBarView.setLayoutParams(params);\n        statusBarView.setBackgroundColor(Color.argb(alpha, 0, 0, 0));\n        statusBarView.setId(FAKE_TRANSLUCENT_VIEW_ID);\n        return statusBarView;\n    }\n\n    /**\n     * 获取状态栏高度\n     *\n     * @param context context\n     * @return 状态栏高度\n     */\n    private static int getStatusBarHeight(Context context) {\n        // 获得状态栏高度\n        int resourceId = context.getResources().getIdentifier(\"status_bar_height\", \"dimen\", \"android\");\n        return context.getResources().getDimensionPixelSize(resourceId);\n    }\n\n    /**\n     * 计算状态栏颜色\n     *\n     * @param color color值\n     * @param alpha alpha值\n     * @return 最终的状态栏颜色\n     */\n    private static int calculateStatusColor(@ColorInt int color, int alpha) {\n        if (alpha == 0) {\n            return color;\n        }\n        float a = 1 - alpha / 255f;\n        int red = color >> 16 & 0xff;\n        int green = color >> 8 & 0xff;\n        int blue = color & 0xff;\n        red = (int) (red * a + 0.5);\n        green = (int) (green * a + 0.5);\n        blue = (int) (blue * a + 0.5);\n        return 0xff << 24 | red << 16 | green << 8 | blue;\n    }\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/utils/TUtil.java",
    "content": "package com.lvr.livecircle.utils;\n\nimport java.lang.reflect.ParameterizedType;\n\n/**\n * 类转换初始化\n */\npublic class TUtil {\n    public static <T> T getT(Object o, int i) {\n        try {\n            return ((Class<T>) ((ParameterizedType) (o.getClass()\n                    .getGenericSuperclass())).getActualTypeArguments()[i])\n                    .newInstance();\n        } catch (InstantiationException e) {\n            e.printStackTrace();\n        } catch (IllegalAccessException e) {\n            e.printStackTrace();\n        } catch (ClassCastException e) {\n            e.printStackTrace();\n        }\n        return null;\n    }\n\n    public static Class<?> forName(String className) {\n        try {\n            return Class.forName(className);\n        } catch (ClassNotFoundException e) {\n            e.printStackTrace();\n        }\n        return null;\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/utils/TimeUtil.java",
    "content": "/*\n * \n */\npackage com.lvr.livecircle.utils;\n\nimport android.annotation.SuppressLint;\nimport android.text.TextUtils;\nimport android.util.Log;\n\nimport java.text.DateFormat;\nimport java.text.ParseException;\nimport java.text.SimpleDateFormat;\nimport java.util.Calendar;\nimport java.util.Date;\nimport java.util.GregorianCalendar;\nimport java.util.Locale;\n\n/**\n * 描述：日期处理类.\n *\n */\n@SuppressWarnings(\"all\")\npublic class TimeUtil {\n    /**\n     * one day millisecond count\n     */\n    public static final long ONE_DAY_MILLISECONDS = 1000 * 3600 * 24;\n\n    public static final long ONE_HOUR_MILLISECONDS = 1000 * 3600;\n\n    public static final long ONE_MIN_MILLISECONDS = 1000 * 60;\n\n    /**\n     * 时间日期格式化到年月日时分秒.\n     */\n    public static String dateFormatYMDHMS = \"yyyy-MM-dd HH:mm:ss\";\n    public static String dateFormatYMDHMS_f = \"yyyyMMddHHmmss\";\n    public static String dateFormatMDHM = \"MM-dd HH:mm\";\n    public static String dateFormat = \"yyyy-MM-dd HH:mm\";\n    /**\n     * 时间日期格式化到年月日.\n     */\n    public static String dateFormatYMD = \"yyyy-MM-dd\";\n\n    /**\n     * 时间日期格式化到年月日时分.中文显示\n     */\n    public static String dateFormatYMDHMofChinese = \"yyyy年MM月dd日 HH:mm\";\n\n    /**\n     * 时间日期格式化到年月日.中文显示\n     */\n    public static String dateFormatYMDofChinese = \"yyyy年MM月dd日\";\n    /**\n     * 时间日期格式化到月日.中文显示\n     */\n    public static String dateFormatMDofChinese = \"MM月dd日\";\n    /**\n     * 时间日期格式化到月.中文显示\n     */\n    public static String dateFormatMofChinese = \"MM月\";\n    /**\n     * 时间日期格式化到年月.\n     */\n    public static String dateFormatYM = \"yyyy-MM\";\n\n    /**\n     * 时间日期格式化到年月日时分.\n     */\n    public static String dateFormatYMDHM = \"yyyy-MM-dd HH:mm\";\n\n    /**\n     * 时间日期格式化到月日.\n     */\n    public static String dateFormatMD = \"MM/dd\";\n    public static String dateFormatM_D = \"MM-dd\";\n\n    public static String dateFormatM = \"MM月\";\n    public static String dateFormatD = \"dd\";\n    public static String dateFormatM2 = \"MM\";\n\n    public static String dateFormatMDHMofChinese = \"MM月dd日HH时mm分\";\n    public static String dateFormatHMofChinese = \"HH时mm分\";\n\n    /**\n     * 时分秒.\n     */\n    public static String dateFormatHMS = \"HH:mm:ss\";\n\n    /**\n     * 时分.\n     */\n    public static String dateFormatHM = \"HH:mm\";\n\n    /**\n     * 上午/下午时分\n     */\n    public static String dateFormatAHM = \"aHH:mm\";\n\n    public static String dateFormatYMDE = \"yyyy/MM/dd E\";\n    public static String dateFormatYMD2 = \"yyyy/MM/dd\";\n\n    private final static ThreadLocal<SimpleDateFormat> dateFormater = new ThreadLocal<SimpleDateFormat>() {\n        @SuppressLint(\"SimpleDateFormat\")\n        @Override\n        protected SimpleDateFormat initialValue() {\n            return new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");\n        }\n    };\n\n    @SuppressLint(\"SimpleDateFormat\")\n    private final static ThreadLocal<SimpleDateFormat> dateFormater2 = new ThreadLocal<SimpleDateFormat>() {\n        @Override\n        protected SimpleDateFormat initialValue() {\n            return new SimpleDateFormat(\"yyyy-MM-dd\");\n        }\n    };\n\n    /**\n     * 时间戳转特定格式时间\n     * @param dataFormat\n     * @param timeStamp\n     * @return\n     */\n    public static String formatData(String dataFormat, long timeStamp) {\n        if (timeStamp == 0) {\n            return \"\";\n        }\n        timeStamp = timeStamp * 1000;\n        SimpleDateFormat format = new SimpleDateFormat(dataFormat);\n        return format.format(new Date(timeStamp));\n    }\n\n    /**\n     * 将毫秒转换成秒\n     *\n     * @param time\n     * @return\n     */\n    public static int convertToSecond(Long time) {\n        Date date = new Date();\n        date.setTime(time);\n        return date.getSeconds();\n    }\n\n    /**\n     * 描述：String类型的日期时间转化为Date类型.\n     *\n     * @param strDate String形式的日期时间\n     * @param format  格式化字符串，如：\"yyyy-MM-dd HH:mm:ss\"\n     * @return Date Date类型日期时间\n     */\n    public static Date getDateByFormat(String strDate, String format) {\n        SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);\n        Date date = null;\n        try {\n            date = mSimpleDateFormat.parse(strDate);\n        } catch (ParseException e) {\n            e.printStackTrace();\n        }\n        return date;\n    }\n\n    /**\n     * 描述：获取偏移之后的Date.\n     *\n     * @param date          日期时间\n     * @param calendarField Calendar属性，对应offset的值， 如(Calendar.DATE,表示+offset天,Calendar.HOUR_OF_DAY,表示＋offset小时)\n     * @param offset        偏移(值大于0,表示+,值小于0,表示－)\n     * @return Date 偏移之后的日期时间\n     */\n    public Date getDateByOffset(Date date, int calendarField, int offset) {\n        Calendar c = new GregorianCalendar();\n        try {\n            c.setTime(date);\n            c.add(calendarField, offset);\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return c.getTime();\n    }\n\n    /**\n     * 描述：获取指定日期时间的字符串(可偏移).\n     *\n     * @param strDate       String形式的日期时间\n     * @param format        格式化字符串，如：\"yyyy-MM-dd HH:mm:ss\"\n     * @param calendarField Calendar属性，对应offset的值， 如(Calendar.DATE,表示+offset天,Calendar.HOUR_OF_DAY,表示＋offset小时)\n     * @param offset        偏移(值大于0,表示+,值小于0,表示－)\n     * @return String String类型的日期时间\n     */\n    public static String getStringByOffset(String strDate, String format, int calendarField, int offset) {\n        String mDateTime = null;\n        try {\n            Calendar c = new GregorianCalendar();\n            SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);\n            c.setTime(mSimpleDateFormat.parse(strDate));\n            c.add(calendarField, offset);\n            mDateTime = mSimpleDateFormat.format(c.getTime());\n        } catch (ParseException e) {\n            e.printStackTrace();\n        }\n        return mDateTime;\n    }\n\n    /**\n     * 描述：Date类型转化为String类型(可偏移).\n     *\n     * @param date          the date\n     * @param format        the format\n     * @param calendarField the calendar field\n     * @param offset        the offset\n     * @return String String类型日期时间\n     */\n    public static String getStringByOffset(Date date, String format, int calendarField, int offset) {\n        String strDate = null;\n        try {\n            Calendar c = new GregorianCalendar();\n            SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);\n            c.setTime(date);\n            c.add(calendarField, offset);\n            strDate = mSimpleDateFormat.format(c.getTime());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return strDate;\n    }\n\n    /**\n     * from yyyy-MM-dd HH:mm:ss to MM-dd HH:mm\n     */\n    public static String formatDate(String before) {\n        String after;\n        try {\n            Date date = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\", Locale.getDefault())\n                    .parse(before);\n            after = new SimpleDateFormat(\"MM-dd HH:mm\", Locale.getDefault()).format(date);\n        } catch (ParseException e) {\n            return before;\n        }\n        return after;\n    }\n\n    /**\n     * 描述：Date类型转化为String类型.\n     *\n     * @param date   the date\n     * @param format the format\n     * @return String String类型日期时间\n     */\n    public static String getStringByFormat(Date date, String format) {\n        SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);\n        String strDate = null;\n        try {\n            strDate = mSimpleDateFormat.format(date);\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return strDate;\n    }\n\n    /**\n     * 描述：获取指定日期时间的字符串,用于导出想要的格式.\n     *\n     * @param strDate String形式的日期时间，必须为yyyy-MM-dd HH:mm:ss格式\n     * @param format  输出格式化字符串，如：\"yyyy-MM-dd HH:mm:ss\"\n     * @return String 转换后的String类型的日期时间\n     */\n    public static String getStringByFormat(String strDate, String format) {\n        String mDateTime = null;\n        try {\n            Calendar c = new GregorianCalendar();\n            SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);\n            c.setTime(mSimpleDateFormat.parse(strDate));\n            SimpleDateFormat mSimpleDateFormat2 = new SimpleDateFormat(format);\n            mDateTime = mSimpleDateFormat2.format(c.getTime());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return mDateTime;\n    }\n\n    /**\n     * 描述：获取milliseconds表示的日期时间的字符串.\n     *\n     * @param format 格式化字符串，如：\"yyyy-MM-dd HH:mm:ss\"\n     * @return String 日期时间字符串\n     */\n    public static String getStringByFormat(long milliseconds, String format) {\n        String thisDateTime = null;\n        try {\n            SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);\n            thisDateTime = mSimpleDateFormat.format(milliseconds);\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return thisDateTime;\n    }\n\n    /**\n     * 描述：获取表示当前日期时间的字符串.\n     *\n     * @param format 格式化字符串，如：\"yyyy-MM-dd HH:mm:ss\"\n     * @return String String类型的当前日期时间\n     */\n    public static String getCurrentDate(String format) {\n        String curDateTime = null;\n        try {\n            SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);\n            Calendar c = new GregorianCalendar();\n            curDateTime = mSimpleDateFormat.format(c.getTime());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return curDateTime;\n\n    }\n\n\n    //获取当前系统当天日期\n    public static String getCurrentDay() {\n        String curDateTime = null;\n        try {\n            SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(dateFormat);\n            Calendar c = new GregorianCalendar();\n            c.add(Calendar.DAY_OF_MONTH, 0);\n            curDateTime = mSimpleDateFormat.format(c.getTime());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return curDateTime;\n    }\n\n    //获取当前系统当天日期\n    public static String getCurrentDay2() {\n        String curDateTime = null;\n        try {\n            SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(dateFormatYMDHMS);\n            Calendar c = new GregorianCalendar();\n            c.add(Calendar.DAY_OF_MONTH, 0);\n            curDateTime = mSimpleDateFormat.format(c.getTime());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return curDateTime;\n    }\n\n    //获取当前系统前后第几天\n    public static String getNextDay(int i) {\n        String curDateTime = null;\n        try {\n            SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(dateFormat);\n            Calendar c = new GregorianCalendar();\n            c.add(Calendar.DAY_OF_MONTH, i);\n            curDateTime = mSimpleDateFormat.format(c.getTime());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return curDateTime;\n    }\n    //获取当前系统前后第几小时\n    public static String getNextHour(int i) {\n        String curDateTime = null;\n        try {\n            SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(dateFormat);\n            Calendar c = new GregorianCalendar();\n            c.add(Calendar.HOUR_OF_DAY, i);\n            curDateTime = mSimpleDateFormat.format(c.getTime());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return curDateTime;\n    }\n\n    /**\n     * 描述：获取表示当前日期时间的字符串(可偏移).\n     *\n     * @param format        格式化字符串，如：\"yyyy-MM-dd HH:mm:ss\"\n     * @param calendarField Calendar属性，对应offset的值， 如(Calendar.DATE,表示+offset天,Calendar.HOUR_OF_DAY,表示＋offset小时)\n     * @param offset        偏移(值大于0,表示+,值小于0,表示－)\n     * @return String String类型的日期时间\n     */\n    public static String getCurrentDateByOffset(String format, int calendarField, int offset) {\n        String mDateTime = null;\n        try {\n            SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);\n            Calendar c = new GregorianCalendar();\n            c.add(calendarField, offset);\n            mDateTime = mSimpleDateFormat.format(c.getTime());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return mDateTime;\n\n    }\n\n    /**\n     * 描述：计算两个日期所差的天数.\n     *\n     * @param date1 第一个时间的毫秒表示\n     * @param date2 第二个时间的毫秒表示\n     * @return int 所差的天数\n     */\n    public static int getOffectDay(long date1, long date2) {\n        Calendar calendar1 = Calendar.getInstance();\n        calendar1.setTimeInMillis(date1);\n        Calendar calendar2 = Calendar.getInstance();\n        calendar2.setTimeInMillis(date2);\n        //先判断是否同年\n        int y1 = calendar1.get(Calendar.YEAR);\n        int y2 = calendar2.get(Calendar.YEAR);\n        int d1 = calendar1.get(Calendar.DAY_OF_YEAR);\n        int d2 = calendar2.get(Calendar.DAY_OF_YEAR);\n        int maxDays = 0;\n        int day = 0;\n        if (y1 - y2 > 0) {\n            maxDays = calendar2.getActualMaximum(Calendar.DAY_OF_YEAR);\n            day = d1 - d2 + maxDays;\n        } else if (y1 - y2 < 0) {\n            maxDays = calendar1.getActualMaximum(Calendar.DAY_OF_YEAR);\n            day = d1 - d2 - maxDays;\n        } else {\n            day = d1 - d2;\n        }\n        return day;\n    }\n\n    /**\n     * 描述：计算两个日期所差的小时数.\n     *\n     * @param date1 第一个时间的毫秒表示\n     * @param date2 第二个时间的毫秒表示\n     * @return int 所差的小时数\n     */\n    public static int getOffectHour(long date1, long date2) {\n        Calendar calendar1 = Calendar.getInstance();\n        calendar1.setTimeInMillis(date1);\n        Calendar calendar2 = Calendar.getInstance();\n        calendar2.setTimeInMillis(date2);\n        int h1 = calendar1.get(Calendar.HOUR_OF_DAY);\n        int h2 = calendar2.get(Calendar.HOUR_OF_DAY);\n        int h = 0;\n        int day = getOffectDay(date1, date2);\n        h = h1 - h2 + day * 24;\n        return h;\n    }\n\n    /**\n     * 描述：计算两个日期所差的分钟数.\n     *\n     * @param date1 第一个时间的毫秒表示\n     * @param date2 第二个时间的毫秒表示\n     * @return int 所差的分钟数\n     */\n    public static int getOffectMinutes(long date1, long date2) {\n        Calendar calendar1 = Calendar.getInstance();\n        calendar1.setTimeInMillis(date1);\n        Calendar calendar2 = Calendar.getInstance();\n        calendar2.setTimeInMillis(date2);\n        int m1 = calendar1.get(Calendar.MINUTE);\n        int m2 = calendar2.get(Calendar.MINUTE);\n        int h = getOffectHour(date1, date2);\n        int m = 0;\n        m = m1 - m2 + h * 60;\n        return m;\n    }\n\n    /**\n     * 描述：获取本周一.\n     *\n     * @param format the format\n     * @return String String类型日期时间\n     */\n    public static String getFirstDayOfWeek(String format) {\n        return getDayOfWeek(format, Calendar.MONDAY);\n    }\n\n    /**\n     * 描述：获取本周日.\n     *\n     * @param format the format\n     * @return String String类型日期时间\n     */\n    public static String getLastDayOfWeek(String format) {\n        return getDayOfWeek(format, Calendar.SUNDAY);\n    }\n\n    /**\n     * 描述：获取本周的某一天.\n     *\n     * @param format        the format\n     * @param calendarField the calendar field\n     * @return String String类型日期时间\n     */\n    private static String getDayOfWeek(String format, int calendarField) {\n        String strDate = null;\n        try {\n            Calendar c = new GregorianCalendar();\n            SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);\n            int week = c.get(Calendar.DAY_OF_WEEK);\n            if (week == calendarField) {\n                strDate = mSimpleDateFormat.format(c.getTime());\n            } else {\n                int offectDay = calendarField - week;\n                if (calendarField == Calendar.SUNDAY) {\n                    offectDay = 7 - Math.abs(offectDay);\n                }\n                c.add(Calendar.DATE, offectDay);\n                strDate = mSimpleDateFormat.format(c.getTime());\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return strDate;\n    }\n\n    /**\n     * 描述：获取本月第一天.\n     *\n     * @param format the format\n     * @return String String类型日期时间\n     */\n    public static String getFirstDayOfMonth(String format) {\n        String strDate = null;\n        try {\n            Calendar c = new GregorianCalendar();\n            SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);\n            //当前月的第一天\n            c.set(GregorianCalendar.DAY_OF_MONTH, 1);\n            strDate = mSimpleDateFormat.format(c.getTime());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return strDate;\n    }\n\n    /**\n     * 描述：获取本月最后一天.\n     *\n     * @param format the format\n     * @return String String类型日期时间\n     */\n    public static String getLastDayOfMonth(String format) {\n        String strDate = null;\n        try {\n            Calendar c = new GregorianCalendar();\n            SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);\n            // 当前月的最后一天\n            c.set(Calendar.DATE, 1);\n            c.roll(Calendar.DATE, -1);\n            strDate = mSimpleDateFormat.format(c.getTime());\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return strDate;\n    }\n\n\n    /**\n     * 描述：获取表示当前日期的0点时间毫秒数.\n     *\n     * @return the first time of day\n     */\n    public static long getFirstTimeOfDay() {\n        Date date = null;\n        try {\n            String currentDate = getCurrentDate(dateFormatYMD);\n            date = getDateByFormat(currentDate + \" 00:00:00\", dateFormatYMDHMS);\n            return date.getTime();\n        } catch (Exception e) {\n        }\n        return -1;\n    }\n\n    /**\n     * 描述：获取表示当前日期24点时间毫秒数.\n     *\n     * @return the last time of day\n     */\n    public static long getLastTimeOfDay() {\n        Date date = null;\n        try {\n            String currentDate = getCurrentDate(dateFormatYMD);\n            date = getDateByFormat(currentDate + \" 24:00:00\", dateFormatYMDHMS);\n            return date.getTime();\n        } catch (Exception e) {\n        }\n        return -1;\n    }\n\n    /**\n     * 描述：判断是否是闰年()\n     * <p>(year能被4整除 并且 不能被100整除) 或者 year能被400整除,则该年为闰年.\n     *\n     * @param year 年代（如2012）\n     * @return boolean 是否为闰年\n     */\n    public static boolean isLeapYear(int year) {\n        if ((year % 4 == 0 && year % 400 != 0) || year % 400 == 0) {\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * 描述：根据时间返回几天前或几分钟的描述.\n     *\n     * @param strDate the str date\n     * @return the string\n     */\n    public static String formatDateStr2Desc(String strDate, String outFormat) {\n\n        DateFormat df = new SimpleDateFormat(dateFormatYMDHM);\n        Calendar c1 = Calendar.getInstance();\n        Calendar c2 = Calendar.getInstance();\n        try {\n            c2.setTime(df.parse(strDate));\n            c1.setTime(new Date());\n            int d = getOffectDay(c1.getTimeInMillis(), c2.getTimeInMillis());\n            if (d == 0) {\n                int h = getOffectHour(c1.getTimeInMillis(), c2.getTimeInMillis());\n                if (h > 0) {\n                    return h + \"小时前\";\n                } else if (h < 0) {\n                    return Math.abs(h) + \"小时后\";\n                } else if (h == 0) {\n                    int m = getOffectMinutes(c1.getTimeInMillis(), c2.getTimeInMillis());\n                    if (m > 0) {\n                        return m + \"分钟前\";\n                    } else if (m < 0) {\n                        return Math.abs(m) + \"分钟后\";\n                    } else {\n                        return \"刚刚\";\n                    }\n                }\n            } else if (d > 0) {\n                if (d == 1) {\n                    return \"昨天\";\n                } else if (d == 2) {\n                    return \"前天\";\n                }\n            } else if (d < 0) {\n                if (d == -1) {\n                    return \"明天\";\n                } else if (d == -2) {\n                    return \"后天\";\n                }\n                return Math.abs(d) + \"天后\";\n            }\n\n            String out = getStringByFormat(strDate, outFormat);\n            if (!TextUtils.isEmpty(out)) {\n                return out;\n            }\n        } catch (Exception e) {\n        }\n\n        return strDate;\n    }\n\n\n    /**\n     * 取指定日期为星期几\n     *\n     * @param strDate  指定日期\n     * @param inFormat 指定日期格式\n     * @return String   星期几\n     */\n    public static String getWeekNumber(String strDate, String inFormat) {\n        String week = \"星期日\";\n        Calendar calendar = new GregorianCalendar();\n        DateFormat df = new SimpleDateFormat(inFormat);\n        try {\n            calendar.setTime(df.parse(strDate));\n        } catch (Exception e) {\n            return \"错误\";\n        }\n        int intTemp = calendar.get(Calendar.DAY_OF_WEEK) - 1;\n        switch (intTemp) {\n            case 0:\n                week = \"星期日\";\n                break;\n            case 1:\n                week = \"星期一\";\n                break;\n            case 2:\n                week = \"星期二\";\n                break;\n            case 3:\n                week = \"星期三\";\n                break;\n            case 4:\n                week = \"星期四\";\n                break;\n            case 5:\n                week = \"星期五\";\n                break;\n            case 6:\n                week = \"星期六\";\n                break;\n        }\n        return week;\n    }\n\n    /**\n     * 将字符串转位日期类型\n     *\n     * @param sdate\n     * @return\n     */\n    private static Date toDate(String sdate) {\n        try {\n            return dateFormater.get().parse(sdate);\n        } catch (ParseException e) {\n            return null;\n        }\n    }\n\n    /**\n     * 以友好的方式显示时间\n     *\n     * @param ms\n     * @return\n     */\n    public static String getfriendlyTime(Long ms) {\n        if (ms == null) return \"\";\n//\t\tDate time = toDate(sdate);\n        Date time = new Date();\n        time.setTime(ms);\n\n        if (time == null) {\n            return \"Unknown\";\n        }\n        String ftime = \"\";\n        Calendar cal = Calendar.getInstance();\n\n        // 判断是否是同一天\n        String curDate = dateFormater2.get().format(cal.getTime());\n        String paramDate = dateFormater2.get().format(time);\n        if (curDate.equals(paramDate)) {\n            int hour = (int) ((cal.getTimeInMillis() - time.getTime()) / 3600000);\n            if (hour == 0) {\n                if (((cal.getTimeInMillis() - time.getTime()) / 60000) < 1) {\n                    ftime = \"刚刚\";\n                } else {\n                    ftime = Math.max((cal.getTimeInMillis() - time.getTime()) / 60000, 1) + \"分钟前\";\n                }\n            } else {\n                ftime = hour + \"小时前\";\n            }\n            return ftime;\n        }\n\n        long lt = time.getTime() / 86400000;\n        long ct = cal.getTimeInMillis() / 86400000;\n        int days = (int) (ct - lt);\n        if (days == 0) {\n            int hour = (int) ((cal.getTimeInMillis() - time.getTime()) / 3600000);\n            if (hour == 0)\n                ftime = Math.max(\n                        (cal.getTimeInMillis() - time.getTime()) / 60000, 1)\n                        + \"分钟前\";\n            else\n                ftime = hour + \"小时前\";\n        } else if (days == 1) {\n            ftime = \"昨天\";\n        } else if (days == 2) {\n            ftime = \"前天\";\n        } else if (days > 2 && days <= 10) {\n            ftime = days + \"天前\";\n        } else if (days > 10) {\n            ftime = dateFormater2.get().format(time);\n        }\n        return ftime;\n    }\n\n    /**\n     * 距离当前多少个小时\n     *\n     * @param dateStr\n     * @return\n     */\n    @SuppressLint(\"SimpleDateFormat\")\n    public static int getExpiredHour(String dateStr) {\n        int ret = -1;\n\n        SimpleDateFormat sdf = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");\n\n        Date date;\n        try {\n            date = sdf.parse(dateStr);\n            Date dateNow = new Date();\n\n            long times = date.getTime() - dateNow.getTime();\n            if (times > 0) {\n                ret = ((int) (times / ONE_HOUR_MILLISECONDS));\n            } else {\n                ret = -1;\n            }\n        } catch (ParseException e) {\n            e.printStackTrace();\n        }\n\n        return ret;\n    }\n\n    /**\n     * 过了多少个小时\n     * @param dateStr\n     * @return\n     */\n    @SuppressLint(\"SimpleDateFormat\")\n    public static int getExpiredHour2(String dateStr) {\n        int ret = -1;\n        SimpleDateFormat sdf = new SimpleDateFormat(\"yyyy-MM-dd HH:mm:ss\");\n        Date sendDate;\n        try {\n            sendDate = sdf.parse(dateStr);\n            Date dateNow = new Date(System.currentTimeMillis());\n            Log.e(\"JPush\",\"date=\"+sendDate);\n            long times = dateNow.getTime() - sendDate.getTime();\n            Log.e(\"JPush\",\"date.getTime()=\"+sendDate.getTime());\n            if (times > 0) {\n                ret = ((int) (times / ONE_HOUR_MILLISECONDS));\n                int sdqf =(int) Math.floor(times /ONE_HOUR_MILLISECONDS);\n            } else {\n                ret = -1;\n            }\n        } catch (ParseException e) {\n            e.printStackTrace();\n        }\n        Log.e(\"JPush\",\"ret=\"+ret);\n        return ret;\n    }\n\n\n    /**\n     * 判断给定字符串时间是否为今日\n     *\n     * @param sdate\n     * @return boolean\n     */\n    public static boolean isToday(String sdate) {\n        boolean b = false;\n        Date time = toDate(sdate);\n        Date today = new Date();\n        if (time != null) {\n            String nowDate = dateFormater2.get().format(today);\n            String timeDate = dateFormater2.get().format(time);\n            if (nowDate.equals(timeDate)) {\n                b = true;\n            }\n        }\n        return b;\n    }\n\n    /**\n     * 判断给定字符串时间是否为今日\n     *\n     * @param sdate\n     * @return boolean\n     */\n    public static boolean isToday(long sdate) {\n        boolean b = false;\n        Date time = new Date(sdate);\n        Date today = new Date();\n        if (time != null) {\n            String nowDate = dateFormater2.get().format(today);\n            String timeDate = dateFormater2.get().format(time);\n            if (nowDate.equals(timeDate)) {\n                b = true;\n            }\n        }\n        return b;\n    }\n\n    /**\n     * 根据用户生日计算年龄\n     */\n    public static int getAgeByBirthday(Date birthday) {\n        Calendar cal = Calendar.getInstance();\n\n        if (cal.before(birthday)) {\n            throw new IllegalArgumentException(\n                    \"The birthDay is before Now.It's unbelievable!\");\n        }\n\n        int yearNow = cal.get(Calendar.YEAR);\n        int monthNow = cal.get(Calendar.MONTH) + 1;\n        int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);\n\n        cal.setTime(birthday);\n        int yearBirth = cal.get(Calendar.YEAR);\n        int monthBirth = cal.get(Calendar.MONTH) + 1;\n        int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);\n\n        int age = yearNow - yearBirth;\n\n        if (monthNow <= monthBirth) {\n            if (monthNow == monthBirth) {\n                // monthNow==monthBirth\n                if (dayOfMonthNow < dayOfMonthBirth) {\n                    age--;\n                }\n            } else {\n                // monthNow>monthBirth\n                age--;\n            }\n        }\n        return age;\n    }\n\n    /**\n     * 友好显示时间差\n     *\n     * @param diff 毫秒\n     * @return\n     */\n    public static String getFriendTimeOffer(long diff) {\n        int day = (int) (diff / (24 * 60 * 60 * 1000));\n        if (day > 0)\n            return day + \"天\";\n        int time = (int) (diff / (60 * 60 * 1000));\n        if (time > 0)\n            return time + \"小时\";\n        int min = (int) (diff / (60 * 1000));\n        if (min > 0)\n            return min + \"分钟\";\n        int sec = (int) diff / 1000;\n        if (sec > 0)\n            return sec + \"秒\";\n        return \"1秒\";\n    }\n\n    /**\n     * 友好的时间间隔\n     *\n     * @param duration 秒\n     * @return\n     */\n    public static String getFriendlyDuration(long duration) {\n        String str = \"\";\n        long tmpDuration = duration;\n        str += (tmpDuration / 60 > 10 ? tmpDuration / 60 : \"0\" + tmpDuration / 60) + \":\";\n        tmpDuration %= 60;\n        str += (tmpDuration / 1 >= 10 ? tmpDuration / 1 : \"0\" + tmpDuration / 1);\n        tmpDuration %= 1;\n        return str;\n    }\n    /**\n     * 友好的时间间隔2\n     *\n     * @param duration 秒\n     * @return\n     */\n    public static String getFriendlyDuration2(long duration) {\n        String str = \"\";\n        long tmpDuration = duration;\n        str += (tmpDuration / 60>0?tmpDuration / 60+\"'\":\"\");\n        tmpDuration %= 60;\n        str += (tmpDuration / 1>=10?tmpDuration / 1+\"''\":\"0\"+tmpDuration / 1+\"''\");\n        tmpDuration %= 1;\n        return str;\n    }\n\n    public static String getFriendlyMusicDuration(long duration) {\n        String str = \"-\";\n        int tmpDuration = (int) (duration / 1000);//秒\n        str += (tmpDuration / 3600 > 10 ? tmpDuration / 3600 : \"0\" + tmpDuration / 3600) + \":\";\n        tmpDuration %= 3600;\n        str += (tmpDuration / 60 > 10 ? tmpDuration / 60 : \"0\" + tmpDuration / 60) + \":\";\n        tmpDuration %= 60;\n        str += (tmpDuration / 1 >= 10 ? tmpDuration / 1 : \"0\" + tmpDuration / 1);\n        tmpDuration %= 1;\n        return str;\n    }\n\n    /**\n     * 通过日期来确定星座\n     *\n     * @param mouth\n     * @param day\n     * @return\n     */\n    public static String getStarSeat(int mouth, int day) {\n        String starSeat = null;\n        if ((mouth == 3 && day >= 21) || (mouth == 4 && day <= 19)) {\n            starSeat = \"白羊座\";\n        } else if ((mouth == 4 && day >= 20) || (mouth == 5 && day <= 20)) {\n            starSeat = \"金牛座\";\n        } else if ((mouth == 5 && day >= 21) || (mouth == 6 && day <= 21)) {\n            starSeat = \"双子座\";\n        } else if ((mouth == 6 && day >= 22) || (mouth == 7 && day <= 22)) {\n            starSeat = \"巨蟹座\";\n        } else if ((mouth == 7 && day >= 23) || (mouth == 8 && day <= 22)) {\n            starSeat = \"狮子座\";\n        } else if ((mouth == 8 && day >= 23) || (mouth == 9 && day <= 22)) {\n            starSeat = \"处女座\";\n        } else if ((mouth == 9 && day >= 23) || (mouth == 10 && day <= 23)) {\n            starSeat = \"天秤座\";\n        } else if ((mouth == 10 && day >= 24) || (mouth == 11 && day <= 22)) {\n            starSeat = \"天蝎座\";\n        } else if ((mouth == 11 && day >= 23) || (mouth == 12 && day <= 21)) {\n            starSeat = \"射手座\";\n        } else if ((mouth == 12 && day >= 22) || (mouth == 1 && day <= 19)) {\n            starSeat = \"摩羯座\";\n        } else if ((mouth == 1 && day >= 20) || (mouth == 2 && day <= 18)) {\n            starSeat = \"水瓶座\";\n        } else {\n            starSeat = \"双鱼座\";\n        }\n        return starSeat;\n    }\n\n    /**\n     * 返回聊天时间\n     * @return\n     */\n    public static String getChatTimeForShow(long time){\n        if(TimeUtil.isToday(time)){\n            return TimeUtil.getStringByFormat(time, TimeUtil.dateFormatHMofChinese);\n        }else{\n            return TimeUtil.getStringByFormat(time, TimeUtil.dateFormatMDHMofChinese);\n        }\n    }\n\n    /**\n     * 获取指定时间的毫秒值\n     */\n    public static long getDatelongMills(String fomat, String dateStr){\n        SimpleDateFormat sdf = new SimpleDateFormat(fomat);\n        Date date = null;\n        try {\n            date = sdf.parse(dateStr);\n        } catch (ParseException e) {\n            e.printStackTrace();\n        }\n        long longDate = date.getTime();\n        return longDate;\n    }\n\n    /**\n     * 两个日期比较\n     * @param DATE1\n     * @param DATE2\n     * @return\n     */\n    public static int compare_date(String DATE1, String DATE2) {\n        DateFormat df = new SimpleDateFormat(\"yyyy-MM-dd HH:mm\", Locale.CHINA);\n        try {\n            Date dt1 = df.parse(DATE1);\n            Date dt2 = df.parse(DATE2);\n            if (dt1.getTime() - dt2.getTime()>0) {//date1>date2\n                return 1;\n            } else {\n                return -1;\n            }\n        } catch (Exception exception) {\n            exception.printStackTrace();\n        }\n        return 0;\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/utils/ToastUitl.java",
    "content": "package com.lvr.livecircle.utils;\n\nimport android.content.Context;\nimport android.text.TextUtils;\nimport android.view.Gravity;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.TextView;\nimport android.widget.Toast;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.base.BaseApplication;\n\n\n/**\n * Toast统一管理类\n */\npublic class ToastUitl {\n\n\n    private static Toast toast;\n    private static Toast toast2;\n\n    private static Toast initToast(CharSequence message, int duration) {\n        if (toast == null) {\n            toast = Toast.makeText(BaseApplication.getAppContext(), message, duration);\n        } else {\n            toast.setText(message);\n            toast.setDuration(duration);\n        }\n        return toast;\n    }\n\n    /**\n     * 短时间显示Toast\n     *\n     * @param message\n     */\n    public static void showShort(CharSequence message) {\n        initToast(message, Toast.LENGTH_SHORT).show();\n    }\n\n\n    /**\n     * 短时间显示Toast\n     *\n     * @param strResId\n     */\n    public static void showShort(int strResId) {\n//\t\tToast.makeText(context, strResId, Toast.LENGTH_SHORT).show();\n        initToast(BaseApplication.getAppContext().getResources().getText(strResId), Toast.LENGTH_SHORT).show();\n    }\n\n    /**\n     * 长时间显示Toast\n     *\n     * @param message\n     */\n    public static void showLong(CharSequence message) {\n        initToast(message, Toast.LENGTH_LONG).show();\n    }\n\n    /**\n     * 长时间显示Toast\n     *\n     * @param strResId\n     */\n    public static void showLong(int strResId) {\n        initToast(BaseApplication.getAppContext().getResources().getText(strResId), Toast.LENGTH_LONG).show();\n    }\n\n    /**\n     * 自定义显示Toast时间\n     *\n     * @param message\n     * @param duration\n     */\n    public static void show(CharSequence message, int duration) {\n        initToast(message, duration).show();\n    }\n\n    /**\n     * 自定义显示Toast时间\n     *\n     * @param context\n     * @param strResId\n     * @param duration\n     */\n    public static void show(Context context, int strResId, int duration) {\n        initToast(context.getResources().getText(strResId), duration).show();\n    }\n\n    /**\n     * 显示有image的toast\n     *\n     * @param tvStr\n     * @param imageResource\n     * @return\n     */\n    public static Toast showToastWithImg(final String tvStr, final int imageResource) {\n        if (toast2 == null) {\n            toast2 = new Toast(BaseApplication.getAppContext());\n        }\n        View view = LayoutInflater.from(BaseApplication.getAppContext()).inflate(R.layout.toast_custom, null);\n        TextView tv = (TextView) view.findViewById(R.id.toast_custom_tv);\n        tv.setText(TextUtils.isEmpty(tvStr) ? \"\" : tvStr);\n        ImageView iv = (ImageView) view.findViewById(R.id.toast_custom_iv);\n        if (imageResource > 0) {\n            iv.setVisibility(View.VISIBLE);\n            iv.setImageResource(imageResource);\n        } else {\n            iv.setVisibility(View.GONE);\n        }\n        toast2.setView(view);\n        toast2.setGravity(Gravity.CENTER, 0, 0);\n        toast2.show();\n        return toast2;\n\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/video/VideoFragment.java",
    "content": "package com.lvr.livecircle.video;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.base.BaseFragment;\n\n/**\n * Created by lvr on 2017/2/6.\n */\n\npublic class VideoFragment extends BaseFragment {\n    @Override\n    protected int getLayoutResource() {\n        return R.layout.fragment_video;\n    }\n\n\n\n    @Override\n    protected void initView() {\n\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/widget/ClassicRefreshHeaderView.java",
    "content": "package com.lvr.livecircle.widget;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.animation.Animation;\nimport android.view.animation.AnimationUtils;\nimport android.widget.ImageView;\nimport android.widget.ProgressBar;\nimport android.widget.RelativeLayout;\nimport android.widget.TextView;\n\nimport com.aspsine.irecyclerview.RefreshTrigger;\nimport com.lvr.livecircle.R;\n\n\npublic class ClassicRefreshHeaderView extends RelativeLayout implements RefreshTrigger {\n    private ImageView ivArrow;\n\n    private ImageView ivSuccess;\n\n    private TextView tvRefresh;\n\n    private ProgressBar progressBar;\n\n    private Animation rotateUp;\n\n    private Animation rotateDown;\n\n    private boolean rotated = false;\n\n    private int mHeight;\n\n    public ClassicRefreshHeaderView(Context context) {\n        this(context, null);\n    }\n\n    public ClassicRefreshHeaderView(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public ClassicRefreshHeaderView(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n\n        inflate(context, R.layout.layout_irecyclerview_classic_refresh_header_view, this);\n\n        tvRefresh = (TextView) findViewById(R.id.tvRefresh);\n\n        ivArrow = (ImageView) findViewById(R.id.ivArrow);\n\n        ivSuccess = (ImageView) findViewById(R.id.ivSuccess);\n\n        progressBar = (ProgressBar) findViewById(R.id.progressbar);\n\n        rotateUp = AnimationUtils.loadAnimation(context, R.anim.rotate_up);\n\n        rotateDown = AnimationUtils.loadAnimation(context, R.anim.rotate_down);\n    }\n\n    @Override\n    public void onStart(boolean automatic, int headerHeight, int finalHeight) {\n        this.mHeight = headerHeight;\n        progressBar.setIndeterminate(false);\n    }\n\n    @Override\n    public void onMove(boolean isComplete, boolean automatic, int moved) {\n        if (!isComplete) {\n            ivArrow.setVisibility(VISIBLE);\n            progressBar.setVisibility(GONE);\n            ivSuccess.setVisibility(GONE);\n            if (moved <= mHeight) {\n                if (rotated) {\n                    ivArrow.clearAnimation();\n                    ivArrow.startAnimation(rotateDown);\n                    rotated = false;\n                }\n\n                tvRefresh.setText(\"下拉刷新\");\n            } else {\n                tvRefresh.setText(\"释放刷新\");\n                if (!rotated) {\n                    ivArrow.clearAnimation();\n                    ivArrow.startAnimation(rotateUp);\n                    rotated = true;\n                }\n            }\n        }\n    }\n\n    @Override\n    public void onRefresh() {\n        ivSuccess.setVisibility(GONE);\n        ivArrow.clearAnimation();\n        ivArrow.setVisibility(GONE);\n        progressBar.setVisibility(VISIBLE);\n        tvRefresh.setText(\"正在刷新\");\n    }\n\n    @Override\n    public void onRelease() {\n\n    }\n\n    @Override\n    public void onComplete() {\n        rotated = false;\n        ivSuccess.setVisibility(VISIBLE);\n        ivArrow.clearAnimation();\n        ivArrow.setVisibility(GONE);\n        progressBar.setVisibility(GONE);\n        tvRefresh.setText(\"刷新完成\");\n    }\n\n    @Override\n    public void onReset() {\n        rotated = false;\n        ivSuccess.setVisibility(GONE);\n        ivArrow.clearAnimation();\n        ivArrow.setVisibility(GONE);\n        progressBar.setVisibility(GONE);\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/widget/ItemDragHelperCallback.java",
    "content": "/*\n * Copyright (c) 2016 咖枯 <kaku201313@163.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\npackage com.lvr.livecircle.widget;\n\nimport android.support.v7.widget.GridLayoutManager;\nimport android.support.v7.widget.RecyclerView;\nimport android.support.v7.widget.StaggeredGridLayoutManager;\nimport android.support.v7.widget.helper.ItemTouchHelper;\n\npublic class ItemDragHelperCallback extends ItemTouchHelper.Callback {\n    private OnItemMoveListener mOnItemMoveListener;\n    private boolean mIsLongPressEnabled;\n    public void setLongPressEnabled(boolean longPressEnabled) {\n        mIsLongPressEnabled = longPressEnabled;\n    }\n\n    public interface OnItemMoveListener {\n        boolean onItemMove(int fromPosition, int toPosition);\n    }\n    //相当于 set 设置监听 传入ChannelAdapter中的OnItemMoveListener对象\n    public ItemDragHelperCallback(OnItemMoveListener onItemMoveListener) {\n        mOnItemMoveListener = onItemMoveListener;\n    }\n    //返回true 允许拖拽\n    @Override\n    public boolean isLongPressDragEnabled() {\n        return mIsLongPressEnabled;\n    }\n\n    @Override\n    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {\n        //根据recyclerView的布局，进行设置拖拽的方向\n        int dragFlags = setDragFlags(recyclerView);\n        //不允许进行滑动\n        int swipeFlags = 0;\n        return makeMovementFlags(dragFlags, swipeFlags);\n    }\n\n    private int setDragFlags(RecyclerView recyclerView) {\n        int dragFlags;\n        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();\n        if (layoutManager instanceof GridLayoutManager || layoutManager instanceof StaggeredGridLayoutManager) {\n            dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;\n        } else {\n            dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;\n        }\n        return dragFlags;\n    }\n\n    @Override\n    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {\n        return mOnItemMoveListener.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());\n\n    }\n\n\n    @Override\n    public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {\n        super.clearView(recyclerView, viewHolder);\n\n    }\n\n    @Override\n    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {\n\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/widget/LoadMoreFooterView.java",
    "content": "package com.lvr.livecircle.widget;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.FrameLayout;\n\nimport com.lvr.livecircle.R;\n\n\npublic class LoadMoreFooterView extends FrameLayout {\n\n    private Status mStatus;\n\n    private View mLoadingView;\n\n    private View mErrorView;\n\n    private View mTheEndView;\n\n    private OnRetryListener mOnRetryListener;\n\n    public LoadMoreFooterView(Context context) {\n        this(context, null);\n    }\n\n    public LoadMoreFooterView(Context context, AttributeSet attrs) {\n        this(context, attrs, 0);\n    }\n\n    public LoadMoreFooterView(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        LayoutInflater.from(context).inflate(R.layout.layout_irecyclerview_load_more_footer_view, this, true);\n\n        mLoadingView = findViewById(R.id.loadingView);\n        mErrorView = findViewById(R.id.errorView);\n        mTheEndView = findViewById(R.id.theEndView);\n\n        mErrorView.setOnClickListener(new OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                if (mOnRetryListener != null) {\n                    mOnRetryListener.onRetry(LoadMoreFooterView.this);\n                }\n            }\n        });\n\n        setStatus(Status.GONE);\n    }\n\n    public void setOnRetryListener(OnRetryListener listener) {\n        this.mOnRetryListener = listener;\n    }\n\n    public Status getStatus() {\n        return mStatus;\n    }\n\n    public void setStatus(Status status) {\n        this.mStatus = status;\n        change();\n    }\n\n    public boolean canLoadMore() {\n        return mStatus == Status.GONE || mStatus == Status.ERROR;\n    }\n\n    private void change() {\n        switch (mStatus) {\n            case GONE:\n                mLoadingView.setVisibility(GONE);\n                mErrorView.setVisibility(GONE);\n                mTheEndView.setVisibility(GONE);\n                break;\n\n            case LOADING:\n                mLoadingView.setVisibility(VISIBLE);\n                mErrorView.setVisibility(GONE);\n                mTheEndView.setVisibility(GONE);\n                break;\n\n            case ERROR:\n                mLoadingView.setVisibility(GONE);\n                mErrorView.setVisibility(VISIBLE);\n                mTheEndView.setVisibility(GONE);\n                break;\n\n            case THE_END:\n                mLoadingView.setVisibility(GONE);\n                mErrorView.setVisibility(GONE);\n                mTheEndView.setVisibility(VISIBLE);\n                break;\n        }\n    }\n\n    public enum Status {\n        GONE, LOADING, ERROR, THE_END\n    }\n\n    public interface OnRetryListener {\n        void onRetry(LoadMoreFooterView view);\n    }\n\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/widget/LoadingDialog.java",
    "content": "package com.lvr.livecircle.widget;\n\nimport android.app.Activity;\nimport android.app.Dialog;\nimport android.view.LayoutInflater;\nimport android.view.View;\nimport android.widget.LinearLayout;\nimport android.widget.TextView;\n\nimport com.lvr.livecircle.R;\n\n\npublic class LoadingDialog {\n    /** 加载数据对话框 */\n    private static Dialog mLoadingDialog;\n    /**\n     * 显示加载对话框\n     * @param context 上下文\n     * @param msg 对话框显示内容\n     * @param cancelable 对话框是否可以取消\n     */\n    public static Dialog showDialogForLoading(Activity context, String msg, boolean cancelable) {\n        View view = LayoutInflater.from(context).inflate(R.layout.dialog_loading, null);\n        TextView loadingText = (TextView)view.findViewById(R.id.id_tv_loading_dialog_text);\n        loadingText.setText(msg);\n\n        mLoadingDialog = new Dialog(context, R.style.CustomProgressDialog);\n        mLoadingDialog.setCancelable(cancelable);\n        mLoadingDialog.setCanceledOnTouchOutside(false);\n        mLoadingDialog.setContentView(view, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));\n        mLoadingDialog.show();\n        return  mLoadingDialog;\n    }\n\n    public static Dialog showDialogForLoading(Activity context) {\n        View view = LayoutInflater.from(context).inflate(R.layout.dialog_loading, null);\n        TextView loadingText = (TextView)view.findViewById(R.id.id_tv_loading_dialog_text);\n        loadingText.setText(\"加载中...\");\n\n        mLoadingDialog = new Dialog(context, R.style.CustomProgressDialog);\n        mLoadingDialog.setCancelable(true);\n        mLoadingDialog.setCanceledOnTouchOutside(false);\n        mLoadingDialog.setContentView(view, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));\n        mLoadingDialog.show();\n        return  mLoadingDialog;\n    }\n\n    /**\n     * 关闭加载对话框\n     */\n    public static void cancelDialogForLoading() {\n        if(mLoadingDialog != null) {\n            mLoadingDialog.cancel();\n        }\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/widget/LoadingTip.java",
    "content": "package com.lvr.livecircle.widget;\n\nimport android.annotation.TargetApi;\nimport android.content.Context;\nimport android.os.Build;\nimport android.text.TextUtils;\nimport android.util.AttributeSet;\nimport android.view.View;\nimport android.widget.Button;\nimport android.widget.ImageView;\nimport android.widget.LinearLayout;\nimport android.widget.ProgressBar;\nimport android.widget.TextView;\n\nimport com.lvr.livecircle.R;\n\n\n/**\n * 加载页面内嵌提示\n */\npublic class LoadingTip extends LinearLayout {\n\n    private ImageView img_tip_logo;\n    private ProgressBar progress;\n    private TextView tv_tips;\n    private Button bt_operate;\n    private String errorMsg;\n    private onReloadListener onReloadListener;\n\n\n    public LoadingTip(Context context) {\n        super(context);\n        initView(context);\n    }\n\n    public LoadingTip(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        initView(context);\n    }\n\n    public LoadingTip(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        initView(context);\n    }\n\n    @TargetApi(Build.VERSION_CODES.LOLLIPOP)\n    public LoadingTip(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {\n        super(context, attrs, defStyleAttr, defStyleRes);\n        initView(context);\n    }\n\n    //分为服务器失败，网络加载失败、数据为空、加载中、完成四种状态\n    public static enum LoadStatus {\n        sereverError,error, empty, loading,finish\n    }\n\n    private void initView(Context context) {\n        View.inflate(context, R.layout.dialog_loading_tip, this);\n        img_tip_logo = (ImageView) findViewById(R.id.img_tip_logo);\n        progress = (ProgressBar) findViewById(R.id.progress);\n        tv_tips = (TextView) findViewById(R.id.tv_tips);\n        bt_operate = (Button) findViewById(R.id.bt_operate);\n        //重新尝试\n        bt_operate.setOnClickListener(new OnClickListener() {\n            @Override\n            public void onClick(View view) {\n                if(onReloadListener!=null){\n                    onReloadListener.reload();\n                }\n            }\n        });\n        setVisibility(View.GONE);\n    }\n\n    public void setTips(String tips){\n        if(tv_tips!=null){\n            tv_tips.setText(tips);\n        }\n    }\n\n    /**\n     * 根据状态显示不同的提示\n     * @param loadStatus\n     */\n    public void setLoadingTip(LoadStatus loadStatus){\n        switch (loadStatus){\n            case empty:\n                setVisibility(View.VISIBLE);\n                img_tip_logo.setVisibility(View.VISIBLE);\n                progress.setVisibility(View.GONE);\n                tv_tips.setText(getContext().getText(R.string.empty).toString());\n                img_tip_logo.setImageResource(R.drawable.no_content_tip);\n                break;\n            case sereverError:\n                setVisibility(View.VISIBLE);\n                img_tip_logo.setVisibility(View.VISIBLE);\n                progress.setVisibility(View.GONE);\n                if (TextUtils.isEmpty(errorMsg)){\n                    tv_tips.setText(getContext().getText(R.string.net_error).toString());\n                }else {\n                    tv_tips.setText(errorMsg);\n                }\n                img_tip_logo.setImageResource(R.drawable.ic_wrong);\n                break;\n            case error:\n                setVisibility(View.VISIBLE);\n                img_tip_logo.setVisibility(View.VISIBLE);\n                progress.setVisibility(View.GONE);\n                if (TextUtils.isEmpty(errorMsg)){\n                    tv_tips.setText(getContext().getText(R.string.net_error).toString());\n                }else {\n                    tv_tips.setText(errorMsg);\n                }\n                img_tip_logo.setImageResource(R.drawable.ic_wifi_off);\n                break;\n            case loading:\n                setVisibility(View.VISIBLE);\n                img_tip_logo.setVisibility(View.GONE);\n                progress.setVisibility(View.VISIBLE);\n                tv_tips.setText(getContext().getText(R.string.loading).toString());\n                break;\n            case finish:\n                setVisibility(View.GONE);\n                break;\n        }\n    }\n\n\n    public void setOnReloadListener(onReloadListener onReloadListener){\n        this.onReloadListener=onReloadListener;\n    }\n    /**\n     * 重新尝试接口\n     */\n    public interface onReloadListener{\n        void reload();\n    }\n\n\n}\n\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/widget/ScrollAwareFABBehavior.java",
    "content": "/*\n * Copyright (c) 2016 咖枯 <kaku201313@163.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\npackage com.lvr.livecircle.widget;\n\nimport android.content.Context;\nimport android.support.design.widget.CoordinatorLayout;\nimport android.support.design.widget.FloatingActionButton;\nimport android.support.v4.view.ViewCompat;\nimport android.util.AttributeSet;\nimport android.view.View;\n\npublic class ScrollAwareFABBehavior extends FloatingActionButton.Behavior {\n    public ScrollAwareFABBehavior(Context context, AttributeSet attrs) {\n        super();\n\n    }\n\n    @Override\n    public boolean onStartNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child,\n                                       final View directTargetChild, final View target, final int nestedScrollAxes) {\n        // Ensure we react to vertical scrolling\n        return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL\n                || super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);\n    }\n\n\n    @Override\n    public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child,\n                               View target, int dxConsumed, int dyConsumed, int dxUnconsumed,\n                               int dyUnconsumed) {\n        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);\n        if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) {\n            child.setVisibility(View.INVISIBLE);\n        } else if (dyConsumed < 0 && child.getVisibility() ==View.INVISIBLE) {\n            child.setVisibility(View.VISIBLE);\n        }\n\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/widget/StatusBarView.java",
    "content": "package com.lvr.livecircle.widget;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.View;\n\n/**\n * Created by Jaeger on 16/6/8.\n *\n * Email: chjie.jaeger@gmail.com\n * GitHub: https://github.com/laobie\n */\npublic class StatusBarView extends View {\n    public StatusBarView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n    }\n\n    public StatusBarView(Context context) {\n        super(context);\n    }\n}\n"
  },
  {
    "path": "LiveCircle/app/src/main/java/com/lvr/livecircle/widget/URLImageGetter.java",
    "content": "/*\n * Copyright (c) 2016 咖枯 <kaku201313@163.com | 3772304@qq.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\npackage com.lvr.livecircle.widget;\n\nimport android.graphics.drawable.ColorDrawable;\nimport android.graphics.drawable.Drawable;\nimport android.support.annotation.NonNull;\nimport android.support.annotation.Nullable;\nimport android.text.Html;\nimport android.widget.TextView;\n\nimport com.lvr.livecircle.R;\nimport com.lvr.livecircle.api.ApiService;\nimport com.lvr.livecircle.app.AppApplication;\nimport com.lvr.livecircle.client.RetrofitClient;\n\nimport java.io.File;\nimport java.io.FileOutputStream;\nimport java.io.IOException;\nimport java.io.InputStream;\n\nimport io.reactivex.Observer;\nimport io.reactivex.android.schedulers.AndroidSchedulers;\nimport io.reactivex.disposables.Disposable;\nimport io.reactivex.functions.Function;\nimport io.reactivex.schedulers.Schedulers;\nimport okhttp3.ResponseBody;\n\n\n/**\n * @author 咖枯\n * @version 1.0 2016/6/19\n */\npublic class URLImageGetter implements Html.ImageGetter {\n    private TextView mTextView;\n    private int mPicWidth;\n    private String mNewsBody;\n    private int mPicCount;\n    private int mPicTotal;\n    private static final String mFilePath = AppApplication.getAppContext().getCacheDir().getAbsolutePath();\n    public Disposable mDisposable;\n\n    public URLImageGetter(TextView textView, String newsBody, int picTotal) {\n        mTextView = textView;\n        mPicWidth = mTextView.getWidth();\n        mNewsBody = newsBody;\n        mPicTotal = picTotal;\n    }\n\n    @Override\n    public Drawable getDrawable(final String source) {\n        Drawable drawable;\n        File file = new File(mFilePath, source.hashCode() + \"\");\n        if (file.exists()) {\n            mPicCount++;\n            drawable = getDrawableFromDisk(file);\n        } else {\n            drawable = getDrawableFromNet(source);\n        }\n        return drawable;\n    }\n\n    @Nullable\n    private Drawable getDrawableFromDisk(File file) {\n        Drawable drawable = Drawable.createFromPath(file.getAbsolutePath());\n        if (drawable != null) {\n            int picHeight = calculatePicHeight(drawable);\n            drawable.setBounds(0, 0, mPicWidth, picHeight);\n        }\n        return drawable;\n    }\n\n    private int calculatePicHeight(Drawable drawable) {\n        float imgWidth = drawable.getIntrinsicWidth();\n        float imgHeight = drawable.getIntrinsicHeight();\n        float rate = imgHeight / imgWidth;\n        return (int) (mPicWidth * rate);\n    }\n\n    @NonNull\n    private Drawable getDrawableFromNet(final String source) {\n        RetrofitClient retrofitClient = RetrofitClient.getInstance(AppApplication.getAppContext(), ApiService.NEWS_BASE_URL);\n        ApiService api = retrofitClient.create(ApiService.class);\n\n        api.getNewsBodyHtmlPhoto(source)\n                .unsubscribeOn(Schedulers.io())\n                .subscribeOn(Schedulers.io())\n                .observeOn(AndroidSchedulers.mainThread())\n                .map(new Function<ResponseBody, Boolean>() {\n                    @Override\n                    public Boolean apply(ResponseBody body) throws Exception {\n                        return WritePicToDisk(body, source);\n                    }\n                })\n                .subscribe(new Observer<Boolean>() {\n            @Override\n            public void onError(Throwable e) {\n            }\n\n            @Override\n            public void onComplete() {\n\n            }\n\n            @Override\n            public void onSubscribe(Disposable d) {\n                mDisposable = d;\n            }\n\n            @Override\n            public void onNext(Boolean isLoadSuccess) {\n                mPicCount++;\n                if (isLoadSuccess && (mPicCount == mPicTotal - 1)) {\n                    mTextView.setText(Html.fromHtml(mNewsBody, URLImageGetter.this, null));\n                }\n            }\n        });\n\n        return createPicPlaceholder();\n    }\n\n    @NonNull\n    private Boolean WritePicToDisk(ResponseBody response, String source) {\n        File file = new File(mFilePath, source.hashCode() + \"\");\n        InputStream in = null;\n        FileOutputStream out = null;\n        try {\n            in = response.byteStream();\n            out = new FileOutputStream(file);\n            byte[] buffer = new byte[1024];\n            int len;\n            while ((len = in.read(buffer)) != -1) {\n                out.write(buffer, 0, len);\n            }\n            return true;\n        } catch (Exception e) {\n            return false;\n        } finally {\n            try {\n                if (in != null) {\n                    in.close();\n                }\n                if (out != null) {\n                    out.close();\n                }\n            } catch (IOException e) {\n            }\n        }\n    }\n\n    @SuppressWarnings(\"deprecation\")\n    @NonNull\n    private Drawable createPicPlaceholder() {\n        Drawable drawable;\n        int color = R.color.white;\n        drawable = new ColorDrawable(AppApplication.getAppContext().getResources().getColor(color));\n        drawable.setBounds(0, 0, mPicWidth, mPicWidth / 3);\n        return drawable;\n    }\n\n}"
  },
  {
    "path": "LiveCircle/app/src/main/res/anim/act_fade_in_center.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n     android:shareInterpolator=\"false\"\n     android:duration=\"300\">\n\n    <scale\n        android:fromXScale=\"0%\"\n        android:toXScale=\"100%\"\n        android:fromYScale=\"0%\"\n        android:toYScale=\"100%\"\n        android:pivotX=\"50%\"\n        android:pivotY=\"50%\"/>\n\n    <alpha\n        android:fromAlpha=\"0\"\n        android:toAlpha=\"1\"/>\n\n</set>"
  },
  {
    "path": "LiveCircle/app/src/main/res/anim/act_fade_out_center.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\"\n     android:shareInterpolator=\"false\"\n     android:duration=\"300\">\n\n    <scale\n        android:fromXScale=\"100%\"\n        android:toXScale=\"0%\"\n        android:fromYScale=\"100%\"\n        android:toYScale=\"0%\"\n        android:pivotX=\"50%\"\n        android:pivotY=\"50%\"/>\n\n    <alpha\n        android:fromAlpha=\"1\"\n        android:toAlpha=\"0\"/>\n\n</set>"
  },
  {
    "path": "LiveCircle/app/src/main/res/anim/fade_in.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<alpha xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:interpolator=\"@android:anim/accelerate_interpolator\"\n    android:fromAlpha=\"0.0\" android:toAlpha=\"1.0\"\n    android:duration=\"300\" />"
  },
  {
    "path": "LiveCircle/app/src/main/res/anim/fade_out.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<alpha xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:interpolator=\"@android:anim/accelerate_interpolator\"\n    android:fromAlpha=\"1.0\" android:toAlpha=\"0.0\"\n    android:duration=\"300\" />"
  },
  {
    "path": "LiveCircle/app/src/main/res/anim/rotate_down.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<rotate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:duration=\"150\"\n    android:fillAfter=\"true\"\n    android:fromDegrees=\"-180\"\n    android:interpolator=\"@android:anim/linear_interpolator\"\n    android:pivotX=\"50%\"\n    android:pivotY=\"50%\"\n    android:repeatCount=\"0\"\n    android:toDegrees=\"0\" />\n"
  },
  {
    "path": "LiveCircle/app/src/main/res/anim/rotate_up.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<rotate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:duration=\"150\"\n    android:fillAfter=\"true\"\n    android:fromDegrees=\"0\"\n    android:interpolator=\"@android:anim/linear_interpolator\"\n    android:pivotX=\"50%\"\n    android:pivotY=\"50%\"\n    android:toDegrees=\"-180\" />\n"
  },
  {
    "path": "LiveCircle/app/src/main/res/anim/slide_in_left.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <translate\n        android:duration=\"300\"\n        android:fromXDelta=\"100%\"\n        android:toXDelta=\"0\"/>\n</set>"
  },
  {
    "path": "LiveCircle/app/src/main/res/anim/slide_in_right.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <translate\n        android:duration=\"300\"\n        android:fromXDelta=\"-100%\"\n        android:toXDelta=\"0\"/>\n\n</set>"
  },
  {
    "path": "LiveCircle/app/src/main/res/anim/slide_out_left.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <translate\n        android:duration=\"300\"\n        android:fromXDelta=\"0\"\n        android:toXDelta=\"-100%\"/>\n\n</set>"
  },
  {
    "path": "LiveCircle/app/src/main/res/anim/slide_out_right.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<set xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <translate\n        android:duration=\"300\"\n        android:fromXDelta=\"0\"\n        android:toXDelta=\"100%\"/>\n</set>"
  },
  {
    "path": "LiveCircle/app/src/main/res/drawable/loading_dialog_progressbar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<animated-rotate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:drawable=\"@drawable/ic_loading_progress\"\n    android:pivotX=\"50%\"\n    android:pivotY=\"50%\" />"
  },
  {
    "path": "LiveCircle/app/src/main/res/drawable/selector_gray.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item android:state_pressed=\"true\">\n    <shape >\n        <solid android:color=\"@color/gray\"/>\n        <stroke android:color=\"@color/gray\" android:width=\"1.5dp\"/>\n        <corners android:radius=\"4dp\"/>\n    </shape>\n    </item>\n    <item android:state_pressed=\"false\">\n        <shape >\n            <solid android:color=\"@color/white\"/>\n            <corners android:radius=\"4dp\"/>\n            <stroke android:color=\"@color/gray\" android:width=\"1.5dp\"/>\n        </shape>\n    </item>\n</selector>"
  },
  {
    "path": "LiveCircle/app/src/main/res/drawable/shape_loading_dialog.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n    <corners android:radius=\"10dp\"/>\n    <solid android:color=\"@color/transparent\"/>\n</shape>\n"
  },
  {
    "path": "LiveCircle/app/src/main/res/drawable/tv_rounded_corners.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/transparent\" />\n    <corners android:radius=\"4dp\" />\n  <stroke android:color=\"@color/transparent\" android:width=\"0.5dp\"/>\n</shape>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v4.widget.DrawerLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/drawer_layout\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/white\"\n    android:fitsSystemWindows=\"true\">\n\n    <FrameLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n        <include layout=\"@layout/app_bar\"></include>\n    </FrameLayout>\n\n    <android.support.design.widget.NavigationView\n        android:id=\"@+id/navigation\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"start\"\n        android:background=\"@color/white\"\n        app:headerLayout=\"@layout/view_nav\"\n        app:menu=\"@menu/menu_nav\"/>\n\n</android.support.v4.widget.DrawerLayout>\n"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/activity_news_channel.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:background=\"@color/white\"\n              android:clipToPadding=\"true\"\n              android:fitsSystemWindows=\"true\"\n              android:orientation=\"vertical\">\n\n    <android.support.v7.widget.Toolbar\n        android:id=\"@+id/toolbar\"\n        style=\"@style/action_bar\"\n        android:background=\"@color/colorPrimary\"\n        app:navigationIcon=\"@drawable/ic_arrow_back\"\n        app:theme=\"@style/AppTheme.PopupOverlay\"\n        app:title=\"@string/channel_manage\" />\n\n    <TextView\n        style=\"@style/news_channel_sort_title\"\n        android:text=\"@string/my_channel\" />\n\n    <android.support.v7.widget.RecyclerView\n        android:id=\"@+id/news_channel_mine_rv\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:overScrollMode=\"never\"></android.support.v7.widget.RecyclerView>\n\n    <TextView\n        style=\"@style/news_channel_sort_title\"\n        android:text=\"@string/more_channel\" />\n\n    <android.support.v7.widget.RecyclerView\n        android:id=\"@+id/news_channel_more_rv\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:overScrollMode=\"never\"></android.support.v7.widget.RecyclerView>\n</LinearLayout>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/activity_news_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.design.widget.CoordinatorLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:fitsSystemWindows=\"true\"\n    android:layout_height=\"match_parent\">\n\n    <android.support.design.widget.AppBarLayout\n        android:id=\"@+id/app_bar\"\n        android:fitsSystemWindows=\"true\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"256dp\"\n        android:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\">\n\n        <android.support.design.widget.CollapsingToolbarLayout\n            android:id=\"@+id/toolbar_layout\"\n            android:fitsSystemWindows=\"true\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            app:contentScrim=\"@color/colorPrimary\"\n            app:statusBarScrim=\"@android:color/transparent\"\n            app:expandedTitleMarginEnd=\"@dimen/title_margin\"\n            app:expandedTitleMarginStart=\"@dimen/title_margin\"\n            app:expandedTitleTextAppearance=\"@style/TextAppearance.AppCompat.Large\"\n            app:layout_scrollFlags=\"scroll|exitUntilCollapsed\">\n            <ImageView\n                android:id=\"@+id/news_detail_photo_iv\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:fitsSystemWindows=\"true\"\n                android:scaleType=\"centerCrop\"\n                android:transitionName=\"@string/transition_photos\"\n                app:layout_collapseMode=\"parallax\"\n                app:layout_collapseParallaxMultiplier=\"0.7\"\n                tools:targetApi=\"lollipop\"/>\n\n\n            <android.support.v7.widget.Toolbar\n                android:id=\"@+id/toolbar\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"?attr/actionBarSize\"\n                app:layout_collapseMode=\"pin\"\n                app:navigationIcon=\"@drawable/ic_arrow_back\"\n                app:popupTheme=\"@style/ThemeOverlay.AppCompat.Light\"\n                />\n\n        </android.support.design.widget.CollapsingToolbarLayout>\n    </android.support.design.widget.AppBarLayout>\n    <include layout=\"@layout/item_content_news_detail\"/>\n\n</android.support.design.widget.CoordinatorLayout>\n"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/activity_news_photo_detail.xml",
    "content": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\"\n              android:orientation=\"vertical\"\n              xmlns:tools=\"http://schemas.android.com/tools\"\n              xmlns:app=\"http://schemas.android.com/apk/res-auto\">\n    <android.support.v7.widget.Toolbar\n        android:id=\"@+id/toolbar\"\n        android:background=\"@color/black\"\n        android:layout_width=\"match_parent\"\n        android:title=\"图片新闻\"\n        android:layout_height=\"?attr/actionBarSize\"\n        app:navigationIcon=\"@drawable/ic_arrow_back\"\n        app:popupTheme=\"@style/ThemeOverlay.AppCompat.Light\"\n        />\n    <RelativeLayout\n\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:orientation=\"vertical\">\n        <ImageView\n            android:id=\"@+id/blurView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:background=\"@color/black\"\n            android:scaleType=\"centerCrop\"/>\n\n        <com.lvr.livecircle.recycleviewcardgallery.SpeedRecyclerView\n            android:id=\"@+id/recyclerView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_marginBottom=\"30dp\"\n            android:layout_marginTop=\"30dp\"/>\n        <TextView\n            android:id=\"@+id/photo_detail_title_tv\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentBottom=\"true\"\n            android:layout_marginBottom=\"10dp\"\n            android:padding=\"@dimen/item_margin\"\n            android:textColor=\"@color/primary_text_white\"\n            android:textSize=\"@dimen/font_normal\"\n            tools:text=\"1/5  武汉奢华别墅区被洪水围困成孤岛\"/>\n    </RelativeLayout>\n</LinearLayout>\n\n"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/activty_splash.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/gray\"\n    android:orientation=\"vertical\">\n\n    <ImageView\n        android:id=\"@+id/iv_logo\"\n        android:layout_width=\"100dp\"\n        android:layout_height=\"100dp\"\n        android:layout_centerInParent=\"true\"\n        android:layout_gravity=\"center\"\n        android:src=\"@drawable/icon\" />\n\n    <TextView\n        android:id=\"@+id/tv_name\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/iv_logo\"\n        android:layout_centerInParent=\"true\"\n        android:padding=\"10dp\"\n        android:text=\"@string/app_name\"\n        android:textColor=\"@color/gray_deep\" />\n</RelativeLayout>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/app_bar.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.design.widget.CoordinatorLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".home.MainActivity\">\n\n    <android.support.design.widget.AppBarLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        style=\"@style/Theme.AppCompat.Light\"\n        app:elevation=\"0dp\">\n\n        <android.support.v7.widget.Toolbar\n            android:id=\"@+id/toolbar\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"?attr/actionBarSize\"\n            android:background=\"@color/colorPrimary\"\n            app:layout_scrollFlags=\"scroll|enterAlways\"\n            app:popupTheme=\"@style/AppTheme.PopupOverlay\"/>\n        <android.support.design.widget.TabLayout\n            android:id=\"@+id/tabs\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            app:tabBackground=\"@color/colorPrimary\"\n            app:tabIndicatorColor=\"@color/white\">\n        </android.support.design.widget.TabLayout>\n\n\n    </android.support.design.widget.AppBarLayout>\n    <android.support.v4.view.ViewPager\n        android:id=\"@+id/vp_moudle\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\">\n    </android.support.v4.view.ViewPager>\n    <android.support.design.widget.FloatingActionButton\n        android:id=\"@+id/fab\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"bottom|end\"\n        android:layout_margin=\"@dimen/fab_margin\"\n        app:backgroundTint=\"@color/colorPrimary\"\n        android:src=\"@drawable/ic_arrow_upward\"\n        app:layout_behavior=\"com.lvr.livecircle.widget.ScrollAwareFABBehavior\"/>\n\n\n</android.support.design.widget.CoordinatorLayout>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/dialog_loading.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:background=\"@drawable/shape_loading_dialog\"\n    android:gravity=\"center\"\n    android:minHeight=\"60dp\"\n    android:minWidth=\"180dp\"\n    android:orientation=\"vertical\"\n    android:padding=\"10dp\" >\n\n    <ProgressBar\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:indeterminateDrawable=\"@drawable/loading_dialog_progressbar\" />\n\n    <TextView\n        android:id=\"@+id/id_tv_loading_dialog_text\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"5dp\"\n        android:text=\"@string/loading\"\n        android:textSize=\"14sp\" />\n\n</LinearLayout>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/dialog_loading_tip.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:gravity=\"center\"\n    android:orientation=\"vertical\">\n\n    <ImageView\n        android:id=\"@+id/img_tip_logo\"\n        android:layout_width=\"80dp\"\n        android:layout_height=\"80dp\"\n        android:visibility=\"gone\"\n        android:src=\"@drawable/no_content_tip\" />\n    <ProgressBar\n        android:id=\"@+id/progress\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:indeterminateDrawable=\"@drawable/loading_dialog_progressbar\" />\n    <TextView\n        android:id=\"@+id/tv_tips\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:padding=\"15dp\"\n        android:textColor=\"@color/black\"\n        android:textSize=\"@dimen/font_normal\"\n        android:text=\"加载中...\" />\n    <Button\n        android:id=\"@+id/bt_operate\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"35dp\"\n        android:layout_marginTop=\"10dp\"\n        android:background=\"@drawable/selector_gray\"\n        android:paddingBottom=\"5dp\"\n        android:paddingLeft=\"20dp\"\n        android:paddingRight=\"20dp\"\n        android:paddingTop=\"5dp\"\n        android:textColor=\"@color/black\"\n        android:visibility=\"gone\"\n        tools:text=\"@string/reload\" />\n</LinearLayout>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/fragment_find.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:orientation=\"vertical\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\">\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"find\"/>\n\n</LinearLayout>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/fragment_meitu.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.aspsine.irecyclerview.IRecyclerView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:id=\"@+id/recyclerView\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    app:loadMoreEnabled=\"true\"\n    app:loadMoreFooterLayout=\"@layout/layout_irecyclerview_load_more_footer\"\n    app:refreshEnabled=\"true\"\n    app:refreshHeaderLayout=\"@layout/layout_irecyclerview_refresh_header\">\n</com.aspsine.irecyclerview.IRecyclerView>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/fragment_music.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:orientation=\"vertical\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\">\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"music\"/>\n\n</LinearLayout>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/fragment_nearby.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:orientation=\"vertical\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\">\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"nearby\"/>\n\n</LinearLayout>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/fragment_news.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n             android:layout_width=\"match_parent\"\n             android:layout_height=\"match_parent\">\n\n    <android.support.v4.widget.SwipeRefreshLayout\n        android:id=\"@+id/refreshLayout\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\">\n\n        <android.support.v7.widget.RecyclerView\n            android:id=\"@+id/recyclerView\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:fadeScrollbars=\"true\"\n            android:scrollbarFadeDuration=\"1\"\n            android:scrollbars=\"vertical\"/>\n    </android.support.v4.widget.SwipeRefreshLayout>\n\n    <com.lvr.livecircle.widget.LoadingTip\n        android:id=\"@+id/loadedTip\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"center\"\n        android:gravity=\"center\">\n    </com.lvr.livecircle.widget.LoadingTip>\n\n</FrameLayout>\n\n\n"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/fragment_recommend.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:orientation=\"vertical\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\">\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"recommend\"/>\n\n</LinearLayout>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/fragment_video.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:orientation=\"vertical\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"match_parent\">\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"video\"/>\n\n</LinearLayout>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/item_card_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.CardView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    app:cardCornerRadius=\"8dp\"\n    app:cardElevation=\"6dp\"\n    android:background=\"@color/black\"\n    app:cardMaxElevation=\"12dp\"\n    app:cardUseCompatPadding=\"true\">\n\n    <ImageView\n        android:id=\"@+id/imageView\"\n        android:background=\"@color/black\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:scaleType=\"fitCenter\"\n        android:src=\"@drawable/no_content_tip\"/>\n\n</android.support.v7.widget.CardView>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/item_channel_card.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout\n    android:id=\"@+id/rl_root\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\">\n\n    <android.support.v7.widget.CardView\n        android:id=\"@+id/cardView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@color/black\"\n        app:cardCornerRadius=\"8dp\"\n        app:cardElevation=\"6dp\"\n        app:cardMaxElevation=\"12dp\"\n        app:cardUseCompatPadding=\"true\"\n        android:layout_alignParentTop=\"true\"\n        android:layout_alignParentLeft=\"true\"\n        android:layout_alignParentStart=\"true\">\n        <ImageView\n            android:id=\"@+id/iv_channel_logo\"\n            android:layout_width=\"40dp\"\n            android:layout_height=\"40dp\"\n            android:src=\"@drawable/news_car\"/>\n    </android.support.v7.widget.CardView>\n    <TextView\n        android:id=\"@+id/tv_channel_name\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_below=\"@+id/cardView\"\n        android:text=\"汽车\"\n        android:layout_centerHorizontal=\"true\"/>\n</RelativeLayout>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/item_content_news_detail.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v4.widget.NestedScrollView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:background=\"@color/container_background\"\n    app:layout_behavior=\"@string/appbar_scrolling_view_behavior\"\n    tools:showIn=\"@layout/act_news_detail\">\n\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:padding=\"@dimen/text_margin\">\n        <TextView\n            android:id=\"@+id/news_detail_from_tv\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:textSize=\"@dimen/font_small\"\n            tools:text=\"澎湃新闻 06-06 17:24\"/>\n        <!--        android:layout_below=\"@id/news_detail_title_tv\"\n                android:layout_marginTop=\"10dp\"-->\n\n        <TextView\n            android:textColor=\"@color/black\"\n            android:id=\"@+id/news_detail_body_tv\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@id/news_detail_from_tv\"\n            android:layout_marginTop=\"10dp\"\n            android:lineSpacingExtra=\"6dp\"\n            android:textSize=\"@dimen/font_normal\"\n            tools:text=\"最近，“民国无名女神”在微博上火了。讲真，这位无名女神是比现在那些整容脸、\n            网红脸让人看的赏心悦目。但是，比起那些年轰动的民国美女和才女们，她还是略有逊色。\n            要知道这些美女和才女们，不论是本尊还是是后世扮演她们的演员，真真是极美的。这些人里有你心中女神么？\"/>\n\n        <ProgressBar\n            android:id=\"@+id/progress_bar\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_centerHorizontal=\"true\"\n            android:layout_marginTop=\"200dp\"\n            android:visibility=\"gone\"/>\n    </RelativeLayout>\n</android.support.v4.widget.NestedScrollView>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/item_foot_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"wrap_content\"\n              android:gravity=\"center\"\n              android:orientation=\"horizontal\">\n\n    <ProgressBar\n        style=\"@android:style/Widget.ProgressBar.Small\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\" />\n\n    <TextView\n        android:layout_marginLeft=\"10dp\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:text=\"正在加载...\" />\n\n</LinearLayout>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/item_grid_news_channel.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:layout_width=\"wrap_content\"\n              android:layout_height=\"wrap_content\"\n    android:layout_gravity=\"center\">\n    <ImageView\n        android:padding=\"5dp\"\n        android:layout_width=\"40dp\"\n        android:layout_height=\"40dp\"\n        android:src=\"@drawable/news_car\"\n        android:id=\"@+id/iv_channel_logo\"/>\n    <TextView\n        android:padding=\"5dp\"\n        android:id=\"@+id/tv_channel_name\"\n        android:layout_below=\"@id/iv_channel_logo\"\n        android:text=\"汽车\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"/>\n\n</RelativeLayout>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/item_header_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"wrap_content\"\n    android:gravity=\"center\">\n\n    <ImageView\n        android:id=\"@+id/iv_hander\"\n        android:scaleType=\"centerCrop\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:src=\"@drawable/ic_loading_progress\" />\n\n</LinearLayout>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/item_news.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.CardView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    style=\"@style/news_summary_card_view\"\n    android:clickable=\"true\"\n    app:cardCornerRadius=\"3dp\"\n    app:cardElevation=\"8dp\"\n    >\n\n    <RelativeLayout\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:id=\"@+id/rl_root\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\">\n\n        <ImageView\n            android:id=\"@+id/news_summary_photo_iv\"\n            android:layout_width=\"72dp\"\n            android:layout_height=\"72dp\"\n            android:layout_centerVertical=\"true\"\n            android:layout_margin=\"@dimen/item_margin\"\n            android:scaleType=\"centerCrop\"\n            android:transitionName=\"@string/transition_photos\"\n            tools:src=\"@mipmap/ic_launcher\"\n            tools:targetApi=\"lollipop\"/>\n\n        <TextView\n            android:id=\"@+id/news_summary_title_tv\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignTop=\"@id/news_summary_photo_iv\"\n            android:layout_marginRight=\"@dimen/item_margin\"\n            android:layout_toRightOf=\"@+id/news_summary_photo_iv\"\n            android:lines=\"2\"\n            android:textSize=\"@dimen/font_normal\"\n            tools:text=\"习近平:吹响建设科技强国号角国号角国号角\"/>\n\n        <TextView\n            android:id=\"@+id/news_summary_digest_tv\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_below=\"@+id/news_summary_title_tv\"\n            android:layout_marginRight=\"@dimen/item_margin\"\n            android:layout_marginTop=\"2dp\"\n            android:layout_toRightOf=\"@+id/news_summary_photo_iv\"\n            android:ellipsize=\"end\"\n            android:singleLine=\"true\"\n            android:textAppearance=\"@style/TextAppearance.AppCompat.Small\"\n            android:textSize=\"@dimen/font_small\"\n            tools:text=\"科技是国之利器，中国人民生活要好，必须有强大科技。\"/>\n\n        <TextView\n            android:id=\"@+id/news_summary_ptime_tv\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_alignParentRight=\"true\"\n            android:layout_below=\"@id/news_summary_digest_tv\"\n            android:layout_marginTop=\"10dp\"\n            android:layout_marginRight=\"@dimen/item_margin\"\n            android:textSize=\"@dimen/font_tiny\"\n            tools:text=\"05-28 20:09\"/>\n\n    </RelativeLayout>\n\n</android.support.v7.widget.CardView>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/item_news_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.CardView\n    style=\"@style/news_summary_card_view\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:clickable=\"true\"\n    app:cardCornerRadius=\"3dp\"\n    app:cardElevation=\"8dp\"\n    >\n<GridView\n    android:id=\"@+id/gv_news_channel\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:layout_marginLeft=\"10dp\"\n    android:layout_marginRight=\"10dp\"\n    android:layout_marginTop=\"10dp\"\n    android:gravity=\"center\"\n    android:horizontalSpacing=\"4dp\"\n    android:numColumns=\"4\"\n    android:scrollbars=\"none\"\n    android:verticalSpacing=\"8dp\">\n</GridView>\n</android.support.v7.widget.CardView>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/item_news_photo.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.CardView\n    style=\"@style/news_summary_card_view\"\n    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:clickable=\"true\"\n    app:cardCornerRadius=\"3dp\"\n    app:cardElevation=\"8dp\"\n    >\n    <LinearLayout\n        android:id=\"@+id/ll_root\"\n        xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:gravity=\"center\"\n        android:orientation=\"vertical\">\n        <TextView\n            android:id=\"@+id/news_summary_title_tv\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginLeft=\"@dimen/item_margin\"\n            android:layout_marginRight=\"@dimen/item_margin\"\n            android:layout_marginTop=\"@dimen/item_margin\"\n            android:singleLine=\"true\"\n            android:textSize=\"@dimen/font_normal\"\n            tools:text=\"图集：这是个大新闻\"/>\n        <LinearLayout\n            android:id=\"@+id/news_summary_photo_iv_group\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"100dp\"\n            android:gravity=\"center\"\n            android:orientation=\"horizontal\">\n            <ImageView\n                android:id=\"@+id/news_summary_photo_iv_left\"\n                style=\"@style/news_summary_photo_iv\"\n                tools:src=\"@mipmap/ic_launcher\"/>\n            <ImageView\n                android:id=\"@+id/news_summary_photo_iv_middle\"\n                style=\"@style/news_summary_photo_iv\"\n                tools:src=\"@mipmap/ic_launcher\"/>\n            <ImageView\n                android:id=\"@+id/news_summary_photo_iv_right\"\n                style=\"@style/news_summary_photo_iv\"\n                tools:src=\"@mipmap/ic_launcher\"/>\n        </LinearLayout>\n        <TextView\n            android:id=\"@+id/news_summary_ptime_tv\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"right\"\n            android:layout_marginBottom=\"4dp\"\n            android:layout_marginRight=\"@dimen/item_margin\"\n            android:textSize=\"@dimen/font_small\"\n            tools:text=\"05-28 20:09\"/>\n    </LinearLayout>\n\n</android.support.v7.widget.CardView>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/item_photo_girl.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.CardView\n    android:layout_height=\"wrap_content\"\n    android:layout_margin=\"4dp\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:clickable=\"true\"\n    app:cardCornerRadius=\"3dp\"\n    app:cardElevation=\"8dp\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\">\n    <ImageView\n        android:id=\"@+id/iv_photo\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:adjustViewBounds=\"true\"\n        android:scaleType=\"centerCrop\"\n        android:transitionName=\"@string/transition_photos\"\n        android:src=\"@mipmap/ic_launcher\"/>\n</android.support.v7.widget.CardView>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/layout_irecyclerview_classic_refresh_header_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"60dp\">\n\n    <ImageView\n        android:id=\"@+id/ivArrow\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerVertical=\"true\"\n        android:layout_marginRight=\"48dp\"\n        android:layout_toLeftOf=\"@+id/tvRefresh\"\n        android:background=\"@drawable/twitter_pull_arrow\" />\n\n    <ImageView\n        android:id=\"@+id/ivSuccess\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerVertical=\"true\"\n        android:layout_marginRight=\"48dp\"\n        android:layout_toLeftOf=\"@+id/tvRefresh\"\n        android:background=\"@drawable/qq_refresh_success\" />\n\n    <ProgressBar\n        android:id=\"@+id/progressbar\"\n        style=\"?android:attr/progressBarStyleSmallInverse\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerVertical=\"true\"\n        android:layout_marginRight=\"48dp\"\n        android:layout_toLeftOf=\"@+id/tvRefresh\" />\n\n    <TextView\n        android:id=\"@+id/tvRefresh\"\n        android:layout_width=\"150dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerInParent=\"true\"\n        android:gravity=\"center\" />\n\n</merge>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/layout_irecyclerview_load_more_footer.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.lvr.livecircle.widget.LoadMoreFooterView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"48dp\"/>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/layout_irecyclerview_load_more_footer_error_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/tvError\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"36dp\"\n    android:gravity=\"center\"\n    android:layout_gravity=\"center\"\n    android:text=\"网络错误，请重试\" />"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/layout_irecyclerview_load_more_footer_loading_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ProgressBar xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/progressBar\"\n    style=\"?android:progressBarStyleInverse\"\n    android:layout_width=\"36dp\"\n    android:layout_height=\"36dp\"\n    android:layout_gravity=\"center\" />"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/layout_irecyclerview_load_more_footer_the_end_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<TextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/tvTheEnd\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"36dp\"\n    android:gravity=\"center\"\n    android:text=\"没有更多\"\n    android:layout_gravity=\"center\" />"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/layout_irecyclerview_load_more_footer_view.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<merge xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"48dp\">\n    <include\n        android:id=\"@+id/theEndView\"\n        layout=\"@layout/layout_irecyclerview_load_more_footer_the_end_view\" />\n\n    <include\n        android:id=\"@+id/errorView\"\n        layout=\"@layout/layout_irecyclerview_load_more_footer_error_view\" />\n\n    <include\n        android:id=\"@+id/loadingView\"\n        layout=\"@layout/layout_irecyclerview_load_more_footer_loading_view\" />\n\n</merge>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/layout_irecyclerview_refresh_header.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<com.lvr.livecircle.widget.ClassicRefreshHeaderView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n              android:layout_width=\"match_parent\"\n              android:layout_height=\"60dp\">\n</com.lvr.livecircle.widget.ClassicRefreshHeaderView>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/toast_custom.xml",
    "content": "<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"wrap_content\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center\"\n    android:orientation=\"vertical\">\n\n    <FrameLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@drawable/tv_rounded_corners\"\n        >\n        <LinearLayout\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:padding=\"10dp\"\n            android:layout_marginLeft=\"10dp\"\n            android:layout_marginRight=\"10dp\"\n            android:orientation=\"vertical\">\n            <ImageView\n                android:layout_marginTop=\"10dp\"\n                android:id=\"@+id/toast_custom_iv\"\n                android:layout_width=\"60dp\"\n                android:layout_height=\"60dp\"\n                android:src=\"@drawable/ic_success\"\n                android:layout_gravity=\"center\"/>\n\n            <TextView\n\n                android:id=\"@+id/toast_custom_tv\"\n                android:layout_width=\"wrap_content\"\n                android:layout_height=\"wrap_content\"\n                android:layout_marginTop=\"5dp\"\n                android:textSize=\"16sp\"\n                android:layout_marginLeft=\"5dp\"\n                android:layout_marginRight=\"5dp\"\n                android:layout_marginBottom=\"10dp\"\n                android:textColor=\"@color/black\"\n                tools:text=\"登录成功\" />\n        </LinearLayout>\n\n    </FrameLayout>\n\n</LinearLayout>"
  },
  {
    "path": "LiveCircle/app/src/main/res/layout/view_nav.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n                android:orientation=\"vertical\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"150dp\"\n                android:background=\"@drawable/nav_header\">\n    <ImageView\n\n        android:layout_marginBottom=\"10dp\"\n        android:layout_marginLeft=\"20dp\"\n        android:src=\"@drawable/nav_header_image\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:id=\"@+id/iv_user_photo\"\n        android:layout_above=\"@+id/tv_login\"/>\n    <TextView\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_centerVertical=\"true\"\n        android:textSize=\"12sp\"\n        android:text=\"点击头像登录\"\n        android:textColor=\"@color/white\"\n        android:padding=\"8dp\"\n        android:layout_marginLeft=\"20dp\"\n        android:layout_marginBottom=\"20dp\"\n        android:gravity=\"center\"\n        android:id=\"@+id/tv_login\"\n        android:layout_alignParentBottom=\"true\"/>\n\n\n\n</RelativeLayout>"
  },
  {
    "path": "LiveCircle/app/src/main/res/menu/menu_nav.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    >\n    <group android:checkableBehavior=\"single\"\n        >\n\n\n        <item android:title=\"首页\" android:id=\"@+id/mn_home\" android:icon=\"@drawable/menu_home\"></item>\n        <item android:title=\"离线缓存\" android:id=\"@+id/mn_download\" android:icon=\"@drawable/menu_download\"></item>\n        <item android:title=\"我的收藏\" android:id=\"@+id/mn_store\" android:icon=\"@drawable/menu_store\"></item>\n        <item android:title=\"个性化信息\" android:id=\"@+id/mn_personal\" android:icon=\"@drawable/menu_personal\" ></item>\n        <item android:title=\"设置与帮助\" android:id=\"@+id/mn_setting\" android:icon=\"@drawable/menu_setting\"></item>\n        <item android:title=\"注销\" android:id=\"@+id/mn_out\" android:icon=\"@drawable/menu_out\"></item>\n\n\n    </group>\n</menu>"
  },
  {
    "path": "LiveCircle/app/src/main/res/menu/menu_toolabr.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 android:id=\"@+id/mn_it_download\"\n          android:title=\"@string/download\"\n          android:icon=\"@drawable/ic_download_menu\"\n          app:showAsAction=\"always\"/>\n    <item\n        android:id=\"@+id/mn_it_search\"\n        android:icon=\"@drawable/ic_search_menu\"\n        android:title=\"@string/search\"\n        app:actionViewClass=\"android.support.v7.widget.SearchView\"\n        app:showAsAction=\"collapseActionView|ifRoom\"\n        ></item>\n</menu>"
  },
  {
    "path": "LiveCircle/app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"colorPrimary\">#ff33b5e5</color>\n    <color name=\"colorPrimaryDark\">#ff33b5e5</color>\n    <color name=\"colorAccent\">#e57a00</color>\n    <color name=\"accent_material_light\">#e57a00</color>\n    <color name=\"toast_white\">#ffffff</color>\n    <color name=\"toast_stroke_gray\">#99d4d4d4</color>\n    <color name=\"black\">#FF000000</color>\n    <color name=\"white\">#FFFFFFFF</color>\n    <color name=\"primary_text_white\">#deffffff</color>\n    <color name=\"red\">#FFFF0000</color>\n    <color name=\"green\">#FF00FF00</color>\n    <color name=\"gray\">#FFF0F0F0</color>\n    <color name=\"gray_deep\">#c9000000</color>\n    <color name=\"transparent\">#00000000</color>\n    <color name=\"role_right_gray\">#929292</color>\n    <color name=\"role_yellow_gray\">#33CC99</color>\n    <color name=\"container_background\">#EBEBEB</color>\n</resources>\n"
  },
  {
    "path": "LiveCircle/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=\"fab_margin\">10dp</dimen>\n    <dimen name=\"text_margin\">16dp</dimen>\n    <dimen name=\"item_margin\">8dp</dimen>\n    <dimen name=\"title_margin\">24dp</dimen>\n    <!-- font -->\n    <dimen name=\"font_tiny\">10sp</dimen>\n    <dimen name=\"font_small\">12sp</dimen>\n    <dimen name=\"font_normal\">14sp</dimen>\n    <dimen name=\"font_normal2\">16sp</dimen>\n    <dimen name=\"font_normal3\">20sp</dimen>\n    <dimen name=\"font_large\">24sp</dimen>\n</resources>\n"
  },
  {
    "path": "LiveCircle/app/src/main/res/values/ids.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <item type=\"id\" name=\"statusbarutil_fake_status_bar_view\" />\n    <item type=\"id\" name=\"statusbarutil_translucent_view\" />\n</resources>"
  },
  {
    "path": "LiveCircle/app/src/main/res/values/news_channel_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <string-array name=\"news_channel_name_static\">\n        <!--定死不能更改的5个频道-->\n        <item>头条</item>\n        <item>科技</item>\n        <item>财经</item>\n        <item>军事</item>\n        <item>体育</item>\n    </string-array>\n\n    <!--新闻的可选频道-->\n    <string-array name=\"news_channel_name\">\n        <item>房产</item>\n        <item>娱乐</item>\n        <item>电影</item>\n        <item>汽车</item>\n        <item>游戏</item>\n        <item>教育</item>\n        <item>旅游</item>\n        <item>手机</item>\n        <item>社会</item>\n    </string-array>\n\n    <string-array name=\"news_channel_id_static\">\n        <!--定死不能更改的5个频道ID-->\n        <item>T1348647909107</item>\n        <item>T1348649580692</item>\n        <item>T1348648756099</item>\n        <item>T1348648141035</item>\n        <item>T1348649079062</item>\n    </string-array>\n    <string-array name=\"news_channel_id\">\n        <!--<item>5YyX5Lqs</item>-->\n        <item>5YyX5Lqs</item>\n        <item>T1348648517839</item>\n        <item>T1348648650048</item>\n        <item>T1348654060988</item>\n        <item>T1348654151579</item>\n        <item>T1351233117091</item>\n        <item>T1348654225495</item>\n        <item>T1348654204705</item>\n        <item>T1348649654285</item>\n\n    </string-array>\n\n\n</resources>"
  },
  {
    "path": "LiveCircle/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Live圈</string>\n    <string name=\"loading\">请稍候</string>\n    <string name=\"net_error\">网络访问错误，请稍后再试</string>\n    <string name=\"download\">下载中心</string>\n    <string name=\"search\">搜索</string>\n    <!-- 共享过度动画 -->\n    <string name=\"transition_photos\">transition_animation_news_photos</string>\n    <string name=\"channel_manage\">频道管理</string>\n    <string name=\"my_channel\">我的频道       长按并拖拽可排序</string>\n    <string name=\"more_channel\">更多频道       点击添加</string>\n    <string name=\"reload\">重新尝试</string>\n    <string name=\"empty\">还没有数据</string>\n    <string name=\"news_from\">%1$s %2$s</string>\n</resources>\n"
  },
  {
    "path": "LiveCircle/app/src/main/res/values/styles.xml",
    "content": "<resources>\n    <style name=\"MyTheme\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <item name=\"android:colorPrimary\">@android:color/holo_blue_light</item>\n        <item name=\"android:colorAccent\">@color/accent_material_light</item>\n        <item name=\"android:colorPrimaryDark\">@android:color/holo_blue_light</item>\n    </style>\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"MyTheme\">\n        <item name=\"android:windowAnimationStyle\">@style/AnimationActivity</item>\n    </style>\n    <!--冷启动界面-->\n    <style name=\"AppTheme.Launcher\" parent=\"Theme.AppCompat.Light.NoActionBar\">\n        <item name=\"android:windowBackground\">@color/transparent</item>\n    </style>\n    <style name=\"AppTheme.PopupOverlay\" parent=\"ThemeOverlay.AppCompat.Light\" />\n\n    <!--普通dialog-->\n    <style name=\"CustomProgressDialog\" parent=\"@style/CustomDialog\">\n        <item name=\"android:windowBackground\">@android:color/transparent</item>\n        <item name=\"android:windowNoTitle\">true</item>\n    </style>\n    <style name=\"CustomDialog\" parent=\"@android:style/Theme.Dialog\">\n        <item name=\"android:windowFrame\">@null</item>\n        <item name=\"android:windowIsFloating\">true</item>\n        <item name=\"android:windowContentOverlay\">@null</item>\n        <item name=\"android:windowAnimationStyle\">@android:style/Animation.Dialog</item>\n        <item name=\"android:windowSoftInputMode\">stateUnspecified|adjustPan</item>\n    </style>\n    <style name=\"AnimationActivity\" parent=\"@android:style/Animation.Activity\">\n        <item name=\"android:activityOpenEnterAnimation\">@anim/slide_in_left</item>\n        <item name=\"android:activityOpenExitAnimation\">@anim/slide_out_left</item>\n        <item name=\"android:activityCloseEnterAnimation\">@anim/slide_in_right</item>\n        <item name=\"android:activityCloseExitAnimation\">@anim/slide_out_right</item>\n    </style>\n\n    <!--新闻频道卡片样式-->\n    <style name=\"news_summary_card_view\">\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:layout_marginLeft\">4dp</item>\n        <item name=\"android:layout_marginRight\">4dp</item>\n        <item name=\"android:layout_marginTop\">5dp</item>\n        <item name=\"android:foreground\">?android:attr/selectableItemBackground</item>\n    </style>\n    <!--新闻频道图片样式-->\n    <style name=\"news_summary_photo_iv\">\n        <item name=\"android:layout_width\">0dp</item>\n        <item name=\"android:layout_height\">match_parent</item>\n        <item name=\"android:layout_weight\">1</item>\n        <item name=\"android:layout_margin\">@dimen/item_margin</item>\n        <item name=\"android:scaleType\">centerCrop</item>\n    </style>\n\n    <style name=\"news_channel_sort_title\">\n        <item name=\"android:layout_width\">wrap_content</item>\n        <item name=\"android:layout_height\">wrap_content</item>\n        <item name=\"android:padding\">@dimen/item_margin</item>\n        <item name=\"android:textColor\">@color/gray_deep</item>\n        <item name=\"android:textSize\">@dimen/font_normal</item>\n    </style>\n\n    <style name=\"action_bar\">\n        <item name=\"android:background\">@color/colorPrimary</item>\n        <item name=\"android:layout_width\">match_parent</item>\n        <item name=\"android:layout_height\">?attr/actionBarSize</item>\n    </style>\n</resources>\n"
  },
  {
    "path": "LiveCircle/app/src/main/res/values-v19/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n\n    <dimen name=\"toolbar_padding_top\">25dp</dimen>\n</resources>\n"
  },
  {
    "path": "LiveCircle/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": "LiveCircle/app/src/test/java/com/lvr/livecircle/ExampleUnitTest.java",
    "content": "package com.lvr.livecircle;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit test, which will execute on the development machine (host).\n *\n * @see <a href=\"http://d.android.com/tools/testing\">Testing documentation</a>\n */\npublic class ExampleUnitTest {\n    @Test\n    public void addition_isCorrect() throws Exception {\n        assertEquals(4, 2 + 2);\n    }\n}"
  },
  {
    "path": "LiveCircle/build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    repositories {\n        jcenter()\n        maven { url \"https://jitpack.io\" }\n    }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:2.2.2'\n        //这里配置 apt 供butterknife使用\n        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        jcenter()\n        maven { url \"https://jitpack.io\" }\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "LiveCircle/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": "LiveCircle/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": "LiveCircle/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": "LiveCircle/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": "LiveCircle/settings.gradle",
    "content": "include ':app'\n"
  },
  {
    "path": "README.md",
    "content": "# LiveCircle\nLive圈 边学边做，不断完善\n\n**新闻模块**\n\n1.Toolbar+NavigationView+DrawerLayout 并实现沉浸式状态栏\n\n2.RecycleView+GridView嵌套 实现多布局格式\n\n3.SwipeRefreshLayout+自定义模式 实现上拉刷新 下拉加载更多（有缺陷，没有下拉加载更多的提示，后期会尝试通过自定义RecycleView实现上拉刷新 下拉加载更多）\n\n4.RecycleView+ItemTouchHelper.Callback 实现Item的拖拽及滑动操作 实现新闻频道管理页面\n\n**图片模块**\n\nIRecyleView开源自定义控件，实现上拉刷新 下拉加载更多\n\nFragment+ViewPager+TabLayout懒加载机制的实现  \n![](http://upload-images.jianshu.io/upload_images/3985563-9fd54f74ee60ed5c.png?imageMogr2/auto-orient/strip%7CimageView2/2)\n![](http://upload-images.jianshu.io/upload_images/3985563-6a141a248f2f279a.png?imageMogr2/auto-orient/strip%7CimageView2/2)\n![](http://upload-images.jianshu.io/upload_images/3985563-23d52fd7c7e3fad2.png?imageMogr2/auto-orient/strip%7CimageView2/2)\n"
  }
]