Showing preview only (347K chars total). Download the full file or copy to clipboard to get everything.
Repository: ittianyu/POCenter
Branch: master
Commit: 24f6bdb545a4
Files: 148
Total size: 292.2 KB
Directory structure:
gitextract_i280fmca/
├── .gitignore
├── LICENSE
├── README.md
├── app/
│ ├── .gitignore
│ ├── build.gradle
│ ├── libs/
│ │ ├── MobCommons-2016.1222.1756.jar
│ │ ├── MobTools-2016.1222.1756.jar
│ │ ├── ShareSDK-Core-2.8.0.jar
│ │ ├── ShareSDK-Email-2.8.0.jar
│ │ ├── ShareSDK-QQ-2.8.0.jar
│ │ ├── ShareSDK-Wechat-2.8.0.jar
│ │ ├── ShareSDK-Wechat-Core-2.8.0.jar
│ │ ├── ShareSDK-Wechat-Favorite-2.8.0.jar
│ │ └── ShareSDK-Wechat-Moments-2.8.0.jar
│ ├── proguard-rules.pro
│ ├── src/
│ │ ├── androidTest/
│ │ │ └── java/
│ │ │ └── com/
│ │ │ └── ittianyu/
│ │ │ └── pocenter/
│ │ │ └── ExampleInstrumentedTest.java
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── assets/
│ │ │ │ └── ShareSDK.xml
│ │ │ ├── java/
│ │ │ │ ├── cn/
│ │ │ │ │ └── sharesdk/
│ │ │ │ │ └── onekeyshare/
│ │ │ │ │ ├── CustomerLogo.java
│ │ │ │ │ ├── OnekeyShare.java
│ │ │ │ │ ├── OnekeySharePage.java
│ │ │ │ │ ├── OnekeyShareTheme.java
│ │ │ │ │ ├── OnekeyShareThemeImpl.java
│ │ │ │ │ ├── ShareContentCustomizeCallback.java
│ │ │ │ │ └── themes/
│ │ │ │ │ └── classic/
│ │ │ │ │ ├── ClassicTheme.java
│ │ │ │ │ ├── EditPage.java
│ │ │ │ │ ├── FriendAdapter.java
│ │ │ │ │ ├── FriendListItem.java
│ │ │ │ │ ├── FriendListPage.java
│ │ │ │ │ ├── IndicatorView.java
│ │ │ │ │ ├── PRTHeader.java
│ │ │ │ │ ├── PicViewerPage.java
│ │ │ │ │ ├── PlatformPage.java
│ │ │ │ │ ├── PlatformPageAdapter.java
│ │ │ │ │ ├── RotateImageView.java
│ │ │ │ │ ├── XView.java
│ │ │ │ │ ├── land/
│ │ │ │ │ │ ├── EditPageLand.java
│ │ │ │ │ │ ├── FriendListPageLand.java
│ │ │ │ │ │ ├── PlatformPageAdapterLand.java
│ │ │ │ │ │ └── PlatformPageLand.java
│ │ │ │ │ └── port/
│ │ │ │ │ ├── EditPagePort.java
│ │ │ │ │ ├── FriendListPagePort.java
│ │ │ │ │ ├── PlatformPageAdapterPort.java
│ │ │ │ │ └── PlatformPagePort.java
│ │ │ │ └── com/
│ │ │ │ └── ittianyu/
│ │ │ │ └── pocenter/
│ │ │ │ ├── common/
│ │ │ │ │ ├── api/
│ │ │ │ │ │ ├── CacheApi.java
│ │ │ │ │ │ ├── RemoteApi.java
│ │ │ │ │ │ └── Repertories.java
│ │ │ │ │ ├── base/
│ │ │ │ │ │ ├── BaseActivity.java
│ │ │ │ │ │ ├── BaseApplication.java
│ │ │ │ │ │ ├── BaseContract.java
│ │ │ │ │ │ ├── BaseFragment.java
│ │ │ │ │ │ └── BasePresenter.java
│ │ │ │ │ ├── bean/
│ │ │ │ │ │ └── ProjectBean.java
│ │ │ │ │ ├── tinker/
│ │ │ │ │ │ └── FetchPatchHandler.java
│ │ │ │ │ └── utils/
│ │ │ │ │ ├── CollectionUtils.java
│ │ │ │ │ ├── ConfigUtils.java
│ │ │ │ │ ├── RxUtils.java
│ │ │ │ │ └── UnsafeOkHttpUtils.java
│ │ │ │ └── features/
│ │ │ │ ├── MainActivity.java
│ │ │ │ ├── SplashActivity.java
│ │ │ │ ├── detail/
│ │ │ │ │ └── DetailActivity.java
│ │ │ │ ├── find/
│ │ │ │ │ ├── FindAdapter.java
│ │ │ │ │ ├── FindContract.java
│ │ │ │ │ ├── FindFragment.java
│ │ │ │ │ └── FindPresenter.java
│ │ │ │ ├── home/
│ │ │ │ │ ├── HomeAdapter.java
│ │ │ │ │ ├── HomeContract.java
│ │ │ │ │ ├── HomeFragment.java
│ │ │ │ │ └── HomePresenter.java
│ │ │ │ ├── mime/
│ │ │ │ │ └── MimeFragment.java
│ │ │ │ ├── search/
│ │ │ │ │ ├── SearchActivity.java
│ │ │ │ │ ├── SearchAdapter.java
│ │ │ │ │ ├── SearchContract.java
│ │ │ │ │ └── SearchPresenter.java
│ │ │ │ ├── type/
│ │ │ │ │ ├── TypeActivity.java
│ │ │ │ │ ├── TypeContract.java
│ │ │ │ │ └── TypePresenter.java
│ │ │ │ ├── version/
│ │ │ │ │ ├── CheckVersionService.java
│ │ │ │ │ ├── VersionBean.java
│ │ │ │ │ └── VersionUtils.java
│ │ │ │ └── wxapi/
│ │ │ │ └── WXEntryActivity.java
│ │ │ └── res/
│ │ │ ├── color/
│ │ │ │ └── selector_item_color.xml
│ │ │ ├── drawable/
│ │ │ │ ├── ic_about.xml
│ │ │ │ ├── ic_cycle.xml
│ │ │ │ ├── ic_date.xml
│ │ │ │ ├── ic_empty.xml
│ │ │ │ ├── ic_error.xml
│ │ │ │ ├── ic_find.xml
│ │ │ │ ├── ic_github.xml
│ │ │ │ ├── ic_home.xml
│ │ │ │ ├── ic_logo.xml
│ │ │ │ ├── ic_mine.xml
│ │ │ │ ├── ic_people.xml
│ │ │ │ ├── ic_share.xml
│ │ │ │ ├── ic_type.xml
│ │ │ │ ├── ic_version_check.xml
│ │ │ │ ├── selector_button.xml
│ │ │ │ ├── selector_item.xml
│ │ │ │ ├── selector_type.xml
│ │ │ │ ├── shape_button_normal.xml
│ │ │ │ ├── shape_button_pressed.xml
│ │ │ │ ├── shape_drive_line.xml
│ │ │ │ ├── shape_type_checked.xml
│ │ │ │ ├── shape_type_normal.xml
│ │ │ │ ├── ssdk_oks_classic_platform_cell_back.xml
│ │ │ │ └── ssdk_oks_classic_progressbar.xml
│ │ │ ├── drawable-v21/
│ │ │ │ ├── selector_button.xml
│ │ │ │ └── selector_item.xml
│ │ │ ├── layout/
│ │ │ │ ├── act_detail.xml
│ │ │ │ ├── act_main.xml
│ │ │ │ ├── act_search.xml
│ │ │ │ ├── act_splash.xml
│ │ │ │ ├── act_type.xml
│ │ │ │ ├── frag_find.xml
│ │ │ │ ├── frag_home.xml
│ │ │ │ ├── frag_mime.xml
│ │ │ │ ├── item_find.xml
│ │ │ │ ├── item_home.xml
│ │ │ │ ├── item_search.xml
│ │ │ │ ├── view_empty.xml
│ │ │ │ ├── view_error.xml
│ │ │ │ ├── view_loading.xml
│ │ │ │ ├── view_search.xml
│ │ │ │ └── view_type.xml
│ │ │ ├── menu/
│ │ │ │ ├── menu_detail.xml
│ │ │ │ ├── menu_navigation.xml
│ │ │ │ └── menu_type.xml
│ │ │ ├── values/
│ │ │ │ ├── colors.xml
│ │ │ │ ├── dimens.xml
│ │ │ │ ├── ssdk_instapaper_strings.xml
│ │ │ │ ├── ssdk_oks_color_drawables.xml
│ │ │ │ ├── ssdk_oks_strings.xml
│ │ │ │ ├── ssdk_strings.xml
│ │ │ │ ├── strings.xml
│ │ │ │ ├── styles.xml
│ │ │ │ └── values.xml
│ │ │ ├── values-en/
│ │ │ │ ├── ssdk_oks_strings.xml
│ │ │ │ └── ssdk_strings.xml
│ │ │ └── values-w820dp/
│ │ │ └── dimens.xml
│ │ └── test/
│ │ └── java/
│ │ └── com/
│ │ └── ittianyu/
│ │ └── pocenter/
│ │ └── ExampleUnitTest.java
│ └── tinkerpatch.gradle
├── build.gradle
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2017 ittianyu
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
## 外包集中营 ##
整合多个软件外包平台项目信息,替你筛选优质项目
 
## 关于我们 ##
[](http://www.ittianyu.com)
## 功能 ##
- ### 首页 ###
展示你关注的外包信息,比如: 移动app、网站开发、微信/小程序。
- ### 发现 ###
展示所有的外包信息。
- ### 搜索 ###
展示标题或描述中含有指定关键词的外包信息。
## 截图 ##
 
 
 
 
## 下载 ##
已在 [百度手机助手](http://shouji.baidu.com/software/10867391.html)、[91市场](http://apk.91.com/Soft/Android/com.ittianyu.pocenter-1.html)、[安卓市场](http://apk.hiapk.com/appinfo/com.ittianyu.pocenter/1) 上线。
贴出二维码方便下载

## 技术点 ##
- 框架:MVP
- 网络访问:Retrofit2 + OkHttp3
- 网络缓存:RxCache
- 数据及解析:Gson 解析 json
- 异步框架:RxJava2
- 设计规范:Material Design
- 界面布局:BottomNavigationView + ViewPager + Fragment
- 第三方接入:ShareSdk、友盟 app 统计、TinkerPatch 热更新
## 亮点 ##
- ViewPager 懒加载:在 Activity 生命周期内仅加载一次,且第一次可见时加载。
- LCEE 界面逻辑:也就是加载、内容、错误、空视图。
## 项目包结构 ##
- com.ittianyu.pocenter
- common            公用代码
- api               网络访问代码
- base               基类
- bean               实体类
- utils              工具类
- features           功能
- detail             详情
- find               发现
- home             主页
- mime             我的
- search              搜索
- type              标签管理
- version             版本更新
- MainActivity          主界面
- SplashActivity         欢迎界面
## 踩坑经历 ##
- 混淆:如果项目中有用到 Gson 解析数据,不要混淆实体类。最好养成用一个库,就加上一个库的混淆代码的习惯。
## 致谢 ##
感谢工作室的 UI大大 给与了关于配色方面的建议。
## 授权 ##
MIT License
Copyright (c) 2017 ittianyu
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: app/.gitignore
================================================
/build
================================================
FILE: app/build.gradle
================================================
apply plugin: 'com.android.application'
android {
// signingConfigs {
// release {
// keyAlias 'pocenter'
// keyPassword 'xxx'
// storeFile file('keystore.jks')
// storePassword 'xxx'
// }
// }
compileSdkVersion 25
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "com.ittianyu.pocenter"
minSdkVersion 14
targetSdkVersion 25
versionCode 1
versionName "1.0.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
// signingConfig signingConfigs.release// 使用签名
}
}
dataBinding {
enabled true
}
android.defaultConfig.vectorDrawables.useSupportLibrary = true
// 多渠道打包
// productFlavors {
// tianyu {}
// productFlavors.all { flavor ->
// flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
// }
// }
}
// TinkerPatch 相关的配置
apply from: 'tinkerpatch.gradle'
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.1.0'
testCompile 'junit:junit:4.12'
// leakcanary
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
// log
compile 'com.orhanobut:logger:1.15'
// http
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okio:okio:1.10.0'
// retrofit
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
// json
compile 'com.google.code.gson:gson:2.7'
// RxJava2
compile 'io.reactivex.rxjava2:rxjava:2.0.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.0'
compile 'org.reactivestreams:reactive-streams:1.0.0'
// retrofit-adapter
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
// RxCache
compile 'com.github.VictorAlbertos.RxCache:runtime:1.6.9-2.x'
// To use Gson
compile 'com.github.VictorAlbertos.Jolyglot:gson:0.0.3'
// other
compile 'com.github.ittianyu:BottomNavigationViewEx:1.1.2'
// bottom navigation
compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.6.1'
// recycler adapter
compile 'com.github.ittianyu:mvp:0.0.1'
// mvp
compile 'com.github.githubwing:ByeBurger:1.2.3'
// hide actionbar and bottom navigation
compile 'com.zhy:flowlayout-lib:1.0.3'
// flow tag
compile 'com.victor:lib:1.0.4'
// loading animation
compile 'com.github.arimorty:floatingsearchview:2.0.3'
// search view
compile 'com.allenliu:checkversionlib:1.0.4'
// check version
// share sdk
compile files('libs/MobCommons-2016.1222.1756.jar')
compile files('libs/MobTools-2016.1222.1756.jar')
compile files('libs/ShareSDK-Core-2.8.0.jar')
compile files('libs/ShareSDK-Email-2.8.0.jar')
compile files('libs/ShareSDK-QQ-2.8.0.jar')
compile files('libs/ShareSDK-Wechat-2.8.0.jar')
compile files('libs/ShareSDK-Wechat-Core-2.8.0.jar')
compile files('libs/ShareSDK-Wechat-Favorite-2.8.0.jar')
compile files('libs/ShareSDK-Wechat-Moments-2.8.0.jar')
// share sdk end
// 友盟统计
compile 'com.umeng.analytics:analytics:latest.integration'
// TinkerPatch SDK
compile 'com.tinkerpatch.sdk:tinkerpatch-android-sdk:1.1.0'
}
================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in E:\Android\sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
#http
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn retrofit2.Platform$Java8
#databinding
-dontwarn android.databinding.**
-keep class android.databinding.** { *; }
-keep class android.databinding.annotationprocessor.** { *; }
##---------------Begin: proguard configuration for Gson ----------
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }
# Prevent proguard from stripping interface information from TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
##---------------End: proguard configuration for Gson ----------
#友盟
-keepclassmembers class * {
public <init> (org.json.JSONObject);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
#fastjson
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.** { *; }
#rx cache
-dontwarn io.rx_cache.internal.**
-keepclassmembers enum io.rx_cache.Source { *; }
-keep class io.rx_cache2.** { *; }
# bottom navigation
-keep public class android.support.design.widget.BottomNavigationView { *; }
-keep public class android.support.design.internal.BottomNavigationMenuView { *; }
-keep public class android.support.design.internal.BottomNavigationPresenter { *; }
-keep public class android.support.design.internal.BottomNavigationItemView { *; }
#beans
-keep public class **.*Bean {*;}
#指定压缩级别
-optimizationpasses 5
#不跳过非公共的库的类成员
-dontskipnonpubliclibraryclassmembers
#混淆时采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#把混淆类中的方法名也混淆了
-useuniqueclassmembernames
#优化时允许访问并修改有修饰符的类和类的成员
-allowaccessmodification
#将文件来源重命名为“SourceFile”字符串
-renamesourcefileattribute SourceFile
#保留行号
-keepattributes SourceFile,LineNumberTable
#保持所有实现 Serializable 接口的类成员
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
#Fragment不需要在AndroidManifest.xml中注册,需要额外保护下
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment
# 保持测试相关的代码
-dontnote junit.framework.**
-dontnote junit.runner.**
-dontwarn android.test.**
-dontwarn android.support.test.**
-dontwarn org.junit.**
================================================
FILE: app/src/androidTest/java/com/ittianyu/pocenter/ExampleInstrumentedTest.java
================================================
package com.ittianyu.pocenter;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumentation test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();
assertEquals("com.ittianyu.pocenter", appContext.getPackageName());
}
}
================================================
FILE: app/src/main/AndroidManifest.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.ittianyu.pocenter">
<uses-sdk tools:overrideLibrary="com.wingsofts.byeburgernavigationview" />
<!-- share sdk -->
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- share sdk end -->
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".common.base.BaseApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!--友盟统计-->
<meta-data
android:name="UMENG_APPKEY"
android:value="5880acc1a40fa35dca000afe" />
<meta-data
android:name="UMENG_CHANNEL"
android:value="baidu" />
<!--友盟统计 结束-->
<!-- share sdk -->
<activity
android:name="com.mob.tools.MobUIShell"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:windowSoftInputMode="stateHidden|adjustResize">
<!-- QQ和QQ空间分享 QQ登录的回调必须要配置的 -->
<intent-filter>
<data android:scheme="tencent100371282" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<!-- 微信分享回调 -->
<activity
android:name=".features.wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<!-- share sdk end -->
<activity android:name=".features.SplashActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".features.MainActivity" />
<activity android:name=".features.type.TypeActivity" />
<activity android:name=".features.search.SearchActivity" />
<activity android:name=".features.detail.DetailActivity" />
<service
android:name=".features.version.CheckVersionService"
android:enabled="true"
android:exported="true"></service>
</application>
</manifest>
================================================
FILE: app/src/main/assets/ShareSDK.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<DevInfor>
<!--
说明:
1、表格中的第一项
<ShareSDK
AppKey="api20" />
是必须的,其中的AppKey是您在ShareSDK上注册的开发者帐号的AppKey
2、所有集成到您项目的平台都应该为其在表格中填写相对应的开发者信息,以新浪微博为例:
<SinaWeibo
Id="1"
SortId="1"
AppKey="568898243"
AppSecret="38a4f8204cc784f81f9f0daaf31e02e3"
RedirectUrl="http://www.mob.com"
Enable="true" />
其中的SortId是此平台在分享列表中的位置,由开发者自行定义,可以是任何整型数字,数值越大
越靠后AppKey、AppSecret和RedirectUrl是您在新浪微博上注册开发者信息和应用后得到的信息
Id是一个保留的识别符,整型,ShareSDK不使用此字段,供您在自己的项目中当作平台的识别符。
Enable字段表示此平台是否有效,布尔值,默认为true,如果Enable为false,即便平台的jar包
已经添加到应用中,平台实例依然不可获取。
各个平台注册应用信息的地址如下:
新浪微博 http://open.weibo.com
微信好友 http://open.weixin.qq.com
Facebook https://developers.facebook.com
Twitter https://dev.twitter.com
人人网 http://dev.renren.com
开心网 http://open.kaixin001.com
搜狐微博 http://open.t.sohu.com
网易微博 http://open.t.163.com
豆瓣 http://developers.douban.com
有道云笔记 http://note.youdao.com/open/developguide.html#app
印象笔记 https://dev.evernote.com/
Linkedin https://developer.linkedin.com
FourSquare https://developer.foursquare.com/
搜狐随身看 https://open.sohu.com/
Flickr http://www.flickr.com/services/
Pinterest http://developers.pinterest.com/
Tumblr http://www.tumblr.com/developers
Dropbox https://www.dropbox.com/developers
Instagram http://instagram.com/developer#
VKontakte http://vk.com/dev
易信好友 http://open.yixin.im/
明道 http://open.mingdao.com/
Line http://media.line.me/zh-hant/ https://developers.line.me
Pocket http://getpocket.com/developer/apps/new
KakaoTalk https://developers.kakao.com/
KakaoStory https://developers.kakao.com/
Plurk http://www.plurk.com/API
-->
<ShareSDK
AppKey = "1aeacd4785e72"/> <!-- 修改成你在sharesdk后台注册的应用的appkey"-->
<!-- ShareByAppClient标识是否使用微博客户端分享,默认是false -->
<SinaWeibo
Id="1"
SortId="1"
AppKey="568898243"
AppSecret="38a4f8204cc784f81f9f0daaf31e02e3"
RedirectUrl="http://www.sharesdk.cn"
ShareByAppClient="true"
Enable="true" />
<TencentWeibo
Id="2"
SortId="2"
AppKey="801307650"
AppSecret="ae36f4ee3946e1cbb98d6965b0b2ff5c"
RedirectUri="http://sharesdk.cn"
Enable="true" />
<QZone
Id="3"
SortId="3"
AppId="100371282"
AppKey="aed9b0303e3ed1e27bae87c33761161d"
Enable="true" />
<!--
Wechat微信和WechatMoments微信朋友圈的appid是一样的;
注意:开发者不能用我们这两个平台的appid,否则分享不了
微信测试的时候,微信测试需要先签名打包出apk,
sample测试微信,要先签名打包,keystore在sample项目中,密码123456
BypassApproval是绕过审核的标记,设置为true后AppId将被忽略,故不经过
审核的应用也可以执行分享,但是仅限于分享文字和图片,不能分享其他类型,
默认值为false。此外,微信收藏不支持此字段。
-->
<Wechat
Id="4"
SortId="4"
AppId="wx4868b35061f87885"
AppSecret="64020361b8ec4c99936c0e3999a9f249"
BypassApproval="false"
Enable="true" />
<WechatMoments
Id="5"
SortId="5"
AppId="wx4868b35061f87885"
AppSecret="64020361b8ec4c99936c0e3999a9f249"
BypassApproval="false"
Enable="true" />
<WechatFavorite
Id="6"
SortId="6"
AppId="wx4868b35061f87885"
AppSecret="64020361b8ec4c99936c0e3999a9f249"
Enable="true" />
<!-- ShareByAppClient标识是否使用微博客户端分享,默认是false -->
<QQ
Id="7"
SortId="7"
AppId="100371282"
AppKey="aed9b0303e3ed1e27bae87c33761161d"
ShareByAppClient="true"
Enable="true" />
<Facebook
Id="8"
SortId="8"
ConsumerKey="107704292745179"
ConsumerSecret="38053202e1a5fe26c80c753071f0b573"
RedirectUrl="http://mob.com"
Enable="true" />
<Twitter
Id="9"
SortId="9"
ConsumerKey="LRBM0H75rWrU9gNHvlEAA2aOy"
ConsumerSecret="gbeWsZvA9ELJSdoBzJ5oLKX0TU09UOwrzdGfo9Tg7DjyGuMe8G"
CallbackUrl="http://mob.com"
Enable="true" />
<Renren
Id="10"
SortId="10"
AppId="226427"
ApiKey="fc5b8aed373c4c27a05b712acba0f8c3"
SecretKey="f29df781abdd4f49beca5a2194676ca4"
Enable="true" />
<KaiXin
Id="11"
SortId="11"
AppKey="358443394194887cee81ff5890870c7c"
AppSecret="da32179d859c016169f66d90b6db2a23"
RedirectUri="http://www.sharesdk.cn"
Enable="true" />
<Email
Id="12"
SortId="12"
Enable="true" />
<ShortMessage
Id="13"
SortId="13"
Enable="true" />
<Douban
Id="16"
SortId="16"
ApiKey="031a96a3aa8b28af094fc3eaffa17a0d"
Secret="2e675e730571b75d"
RedirectUri="http://mob.com"
Enable="true" />
<YouDao
Id="17"
SortId="17"
HostType="product"
ConsumerKey="dcde25dca105bcc36884ed4534dab940"
ConsumerSecret="d98217b4020e7f1874263795f44838fe"
RedirectUri="http://www.sharesdk.cn/"
Enable="true" />
<!--
在中国大陆,印象笔记有两个服务器,一个是沙箱(sandbox),一个是生产服务器(china)。
一般你注册应用,它会先让你使用sandbox,当你完成测试以后,可以到
http://dev.yinxiang.com/support/上激活你的ConsumerKey,激活成功后,修改HostType
为china就好了。至于如果您申请的是国际版的印象笔记(Evernote),则其生产服务器类型为
“product”。
如果目标设备上已经安装了印象笔记客户端,ShareSDK允许应用调用本地API来完成分享,但
是需要将应用信息中的“ShareByAppClient”设置为true,此字段默认值为false。
-->
<Evernote
Id="19"
SortId="19"
HostType="sandbox"
ConsumerKey="sharesdk-7807"
ConsumerSecret="d05bf86993836004"
ShareByAppClient="true"
Enable="true" />
<LinkedIn
Id="20"
SortId="20"
ApiKey="ejo5ibkye3vo"
SecretKey="cC7B2jpxITqPLZ5M"
RedirectUrl="http://sharesdk.cn"
Enable="true" />
<GooglePlus
Id="21"
SortId="21"
ClientID="682795613743-cfo3a8r4va0ujja7qofr54hobt2kv3cq.apps.googleusercontent.com"
RedirectUrl="http://localhost"
ShareByAppClient = "false"
Enable="true" />
<FourSquare
Id="22"
SortId="22"
ClientID="G0ZI20FM30SJAJTX2RIBGD05QV1NE2KVIM2SPXML2XUJNXEU"
ClientSecret="3XHQNSMMHIFBYOLWEPONNV4DOTCDBQH0AEMVGCBG0MZ32XNU"
RedirectUrl="http://www.sharesdk.cn"
Enable="true" />
<Pinterest
Id="23"
SortId="23"
ClientId="1432928"
Enable="true" />
<Flickr
Id="24"
SortId="24"
ApiKey="33d833ee6b6fca49943363282dd313dd"
ApiSecret="3a2c5b42a8fbb8bb"
RedirectUri="http://www.sharesdk.cn"
Enable="true" />
<Tumblr
Id="25"
SortId="25"
OAuthConsumerKey="2QUXqO9fcgGdtGG1FcvML6ZunIQzAEL8xY6hIaxdJnDti2DYwM"
SecretKey="3Rt0sPFj7u2g39mEVB3IBpOzKnM3JnTtxX2bao2JKk4VV1gtNo"
CallbackUrl="http://sharesdk.cn"
Enable="true" />
<Dropbox
Id="26"
SortId="26"
AppKey="i5vw2mex1zcgjcj"
AppSecret="3i9xifsgb4omr0s"
RedirectUri="https://www.sharesdk.cn"
Enable="true" />
<VKontakte
Id="27"
SortId="27"
ApplicationId="3921561"
Enable="true" />
<Instagram
Id="28"
SortId="28"
ClientId="ff68e3216b4f4f989121aa1c2962d058"
ClientSecret="1b2e82f110264869b3505c3fe34e31a1"
RedirectUri="http://sharesdk.cn"
Enable="true" />
<!--
Yixin易信和YixinMoments易信朋友圈的appid是一样的;
注意:开发者不能用我们这两个平台的appid,否则分享不了
易信测试的时候需要先签名打包出apk,
sample测试易信,要先签名打包,keystore在sample项目中,密码123456
BypassApproval是绕过审核的标记,设置为true后AppId将被忽略,故不经过
审核的应用也可以执行分享,但是仅限于分享文字或图片,不能分享其他类型,
默认值为false。
-->
<Yixin
Id="29"
SortId="29"
AppId="yx0d9a9f9088ea44d78680f3274da1765f"
BypassApproval="true"
Enable="true" />
<YixinMoments
Id="30"
SortId="30"
AppId="yx0d9a9f9088ea44d78680f3274da1765f"
BypassApproval="true"
Enable="true" />
<Mingdao
Id="31"
SortId="31"
AppKey="EEEE9578D1D431D3215D8C21BF5357E3"
AppSecret="5EDE59F37B3EFA8F65EEFB9976A4E933"
RedirectUri="http://sharesdk.cn"
Enable="true" />
<Line
Id="32"
SortId="32"
ChannelID = "1477692153"
ChannelSecret ="f30c036370f2e04ade71c52eef73a9af"
Enable="true" />
<KakaoTalk
Id="33"
SortId="33"
AppKey="48d3f524e4a636b08d81b3ceb50f1003"
Enable="true" />
<KakaoStory
Id="34"
SortId="34"
AppKey="48d3f524e4a636b08d81b3ceb50f1003"
Enable="true" />
<WhatsApp
Id="35"
SortId="35"
Enable="true" />
<Bluetooth
Id="36"
SortId="36"
Enable="true" />
<Pocket
Id="37"
SortId="37"
ConsumerKey="32741-389c565043c49947ba7edf05"
Enable="true" />
<Instapaper
Id="38"
SortId="38"
ConsumerKey="4rDJORmcOcSAZL1YpqGHRI605xUvrLbOhkJ07yO0wWrYrc61FA"
ConsumerSecret="GNr1GespOQbrm8nvd7rlUsyRQsIo3boIbMguAl9gfpdL0aKZWe"
Enable="true" />
<FacebookMessenger
Id="39"
SortId="39"
AppId="107704292745179"
Enable="true" />
<Alipay
Id="50"
SortId="50"
AppId="2015072400185895"
Enable="true"/>
<AlipayMoments
Id="51"
SortId="51"
AppId="2015072400185895"
Enable="true"/>
</DevInfor>
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/CustomerLogo.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare;
import android.graphics.Bitmap;
import android.view.View.OnClickListener;
/** 九宫格自定义的图标对象 */
public class CustomerLogo {
public String label;
public Bitmap logo;
public OnClickListener listener;
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/OnekeyShare.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare;
import static com.mob.tools.utils.BitmapHelper.captureView;
import java.util.ArrayList;
import java.util.HashMap;
import android.content.Context;
import android.graphics.Bitmap;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.PlatformActionListener;
import cn.sharesdk.framework.ShareSDK;
import com.mob.tools.utils.ResHelper;
/**
* 快捷分享的入口
* <p>
* 通过不同的setter设置参数,然后调用{@link #show(Context)}方法启动快捷分享
*/
public class OnekeyShare {
private HashMap<String, Object> params;
public OnekeyShare() {
params = new HashMap<String, Object>();
params.put("customers", new ArrayList<CustomerLogo>());
params.put("hiddenPlatforms", new HashMap<String, String>());
}
/** address是接收人地址,仅在信息和邮件使用,否则可以不提供 */
public void setAddress(String address) {
params.put("address", address);
}
/**
* title标题,在印象笔记、邮箱、信息、微信(包括好友、朋友圈和收藏)、
* 易信(包括好友、朋友圈)、人人网和QQ空间使用,否则可以不提供
*/
public void setTitle(String title) {
params.put("title", title);
}
/** titleUrl是标题的网络链接,仅在人人网和QQ空间使用,否则可以不提供 */
public void setTitleUrl(String titleUrl) {
params.put("titleUrl", titleUrl);
}
/** text是分享文本,所有平台都需要这个字段 */
public void setText(String text) {
params.put("text", text);
}
/** 获取text字段的值 */
public String getText() {
return params.containsKey("text") ? String.valueOf(params.get("text")) : null;
}
/** imagePath是本地的图片路径,除Linked-In外的所有平台都支持这个字段 */
public void setImagePath(String imagePath) {
if(!TextUtils.isEmpty(imagePath))
params.put("imagePath", imagePath);
}
/** imageUrl是图片的网络路径,新浪微博、人人网、QQ空间和Linked-In支持此字段 */
public void setImageUrl(String imageUrl) {
if (!TextUtils.isEmpty(imageUrl))
params.put("imageUrl", imageUrl);
}
/** url在微信(包括好友、朋友圈收藏)和易信(包括好友和朋友圈)中使用,否则可以不提供 */
public void setUrl(String url) {
params.put("url", url);
}
/** filePath是待分享应用程序的本地路劲,仅在微信(易信)好友和Dropbox中使用,否则可以不提供 */
public void setFilePath(String filePath) {
params.put("filePath", filePath);
}
/** comment是我对这条分享的评论,仅在人人网和QQ空间使用,否则可以不提供 */
public void setComment(String comment) {
params.put("comment", comment);
}
/** site是分享此内容的网站名称,仅在QQ空间使用,否则可以不提供 */
public void setSite(String site) {
params.put("site", site);
}
/** siteUrl是分享此内容的网站地址,仅在QQ空间使用,否则可以不提供 */
public void setSiteUrl(String siteUrl) {
params.put("siteUrl", siteUrl);
}
/** foursquare分享时的地方名 */
public void setVenueName(String venueName) {
params.put("venueName", venueName);
}
/** foursquare分享时的地方描述 */
public void setVenueDescription(String venueDescription) {
params.put("venueDescription", venueDescription);
}
/** 分享地纬度,新浪微博、腾讯微博和foursquare支持此字段 */
public void setLatitude(float latitude) {
params.put("latitude", latitude);
}
/** 分享地经度,新浪微博、腾讯微博和foursquare支持此字段 */
public void setLongitude(float longitude) {
params.put("longitude", longitude);
}
/** 是否直接分享 */
public void setSilent(boolean silent) {
params.put("silent", silent);
}
/** 设置编辑页的初始化选中平台 */
public void setPlatform(String platform) {
params.put("platform", platform);
}
/** 设置KakaoTalk的应用下载地址 */
public void setInstallUrl(String installurl) {
params.put("installurl", installurl);
}
/** 设置KakaoTalk的应用打开地址 */
public void setExecuteUrl(String executeurl) {
params.put("executeurl", executeurl);
}
/** 设置微信分享的音乐的地址 */
public void setMusicUrl(String musicUrl) {
params.put("musicUrl", musicUrl);
}
/** 设置自定义的外部回调 */
public void setCallback(PlatformActionListener callback) {
params.put("callback", callback);
}
/** 返回操作回调 */
public PlatformActionListener getCallback() {
return ResHelper.forceCast(params.get("callback"));
}
/** 设置用于分享过程中,根据不同平台自定义分享内容的回调 */
public void setShareContentCustomizeCallback(ShareContentCustomizeCallback callback) {
params.put("customizeCallback", callback);
}
/** 自定义不同平台分享不同内容的回调 */
public ShareContentCustomizeCallback getShareContentCustomizeCallback() {
return ResHelper.forceCast(params.get("customizeCallback"));
}
/** 设置自己图标和点击事件,可以重复调用添加多次 */
public void setCustomerLogo(Bitmap logo, String label, OnClickListener ocl) {
CustomerLogo cl = new CustomerLogo();
cl.logo = logo;
cl.label = label;
cl.listener = ocl;
ArrayList<CustomerLogo> customers = ResHelper.forceCast(params.get("customers"));
customers.add(cl);
}
/** 设置一个总开关,用于在分享前若需要授权,则禁用sso功能 */
public void disableSSOWhenAuthorize() {
params.put("disableSSO", true);
}
/** 设置视频网络地址 */
public void setVideoUrl(String url) {
params.put("url", url);
params.put("shareType", Platform.SHARE_VIDEO);
}
/** 设置编辑页面的显示模式为Dialog模式 */
@Deprecated
public void setDialogMode() {
params.put("dialogMode", true);
}
/** 添加一个隐藏的platform */
public void addHiddenPlatform(String platform) {
HashMap<String, String> hiddenPlatforms = ResHelper.forceCast(params.get("hiddenPlatforms"));
hiddenPlatforms.put(platform, platform);
}
/** 设置一个将被截图分享的View , surfaceView是截不了图片的*/
public void setViewToShare(View viewToShare) {
try {
Bitmap bm = captureView(viewToShare, viewToShare.getWidth(), viewToShare.getHeight());
params.put("viewToShare", bm);
} catch (Throwable e) {
e.printStackTrace();
}
}
/** 腾讯微博分享多张图片 */
public void setImageArray(String[] imageArray) {
params.put("imageArray", imageArray);
}
/** 设置在执行分享到QQ或QZone的同时,分享相同的内容腾讯微博 */
public void setShareToTencentWeiboWhenPerformingQQOrQZoneSharing() {
params.put("isShareTencentWeibo", true);
}
/** 设置分享界面的样式,目前只有一种,不需要设置 */
public void setTheme(OnekeyShareTheme theme) {
params.put("theme", theme.getValue());
}
@SuppressWarnings("unchecked")
public void show(Context context) {
HashMap<String, Object> shareParamsMap = new HashMap<String, Object>();
shareParamsMap.putAll(params);
ShareSDK.initSDK(context.getApplicationContext());
// 打开分享菜单的统计
ShareSDK.logDemoEvent(1, null);
int iTheme = 0;
try {
iTheme = ResHelper.parseInt(String.valueOf(shareParamsMap.remove("theme")));
} catch (Throwable t) {}
OnekeyShareTheme theme = OnekeyShareTheme.fromValue(iTheme);
OnekeyShareThemeImpl themeImpl = theme.getImpl();
themeImpl.setShareParamsMap(shareParamsMap);
themeImpl.setDialogMode(shareParamsMap.containsKey("dialogMode") ? ((Boolean) shareParamsMap.remove("dialogMode")) : false);
themeImpl.setSilent(shareParamsMap.containsKey("silent") ? ((Boolean) shareParamsMap.remove("silent")) : false);
themeImpl.setCustomerLogos((ArrayList<CustomerLogo>) shareParamsMap.remove("customers"));
themeImpl.setHiddenPlatforms((HashMap<String, String>) shareParamsMap.remove("hiddenPlatforms"));
themeImpl.setPlatformActionListener((PlatformActionListener) shareParamsMap.remove("callback"));
themeImpl.setShareContentCustomizeCallback((ShareContentCustomizeCallback) shareParamsMap.remove("customizeCallback"));
if (shareParamsMap.containsKey("disableSSO") ? ((Boolean) shareParamsMap.remove("disableSSO")) : false) {
themeImpl.disableSSO();
}
themeImpl.show(context.getApplicationContext());
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/OnekeySharePage.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare;
import java.util.ArrayList;
import java.util.HashMap;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.Platform.ShareParams;
import cn.sharesdk.framework.PlatformActionListener;
import com.mob.tools.FakeActivity;
/** 快捷分享的基类 */
public class OnekeySharePage extends FakeActivity {
private OnekeyShareThemeImpl impl;
public OnekeySharePage(OnekeyShareThemeImpl impl) {
this.impl = impl;
}
/** 分享界面是否弹窗模式 */
protected final boolean isDialogMode() {
return impl.dialogMode;
}
protected final HashMap<String, Object> getShareParamsMap() {
return impl.shareParamsMap;
}
/** 静默分享开关(没有界面,直接分享 )*/
protected final boolean isSilent() {
return impl.silent;
}
protected final ArrayList<CustomerLogo> getCustomerLogos() {
return impl.customerLogos;
}
protected final HashMap<String, String> getHiddenPlatforms() {
return impl.hiddenPlatforms;
}
protected final PlatformActionListener getCallback() {
return impl.callback;
}
protected final ShareContentCustomizeCallback getCustomizeCallback() {
return impl.customizeCallback;
}
protected final boolean isDisableSSO() {
return impl.disableSSO;
}
protected final void shareSilently(Platform platform) {
impl.shareSilently(platform);
}
protected final ShareParams formateShareData(Platform platform) {
if (impl.formateShareData(platform)) {
return impl.shareDataToShareParams(platform);
}
return null;
}
protected final boolean isUseClientToShare(Platform platform) {
return impl.isUseClientToShare(platform);
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/OnekeyShareTheme.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare;
import cn.sharesdk.onekeyshare.themes.classic.ClassicTheme;
/** 快捷分享的主题样式 */
public enum OnekeyShareTheme {
/** 九格宫的主题样式 ,对应的实现类ClassicTheme */
CLASSIC(0, new ClassicTheme());
private final int value;
private final OnekeyShareThemeImpl impl;
private OnekeyShareTheme(int value, OnekeyShareThemeImpl impl) {
this.value = value;
this.impl = impl;
}
public int getValue() {
return value;
}
public OnekeyShareThemeImpl getImpl() {
return impl;
}
public static OnekeyShareTheme fromValue(int value) {
for (OnekeyShareTheme theme : OnekeyShareTheme.values()) {
if (theme.value == value) {
return theme;
}
}
return CLASSIC;
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/OnekeyShareThemeImpl.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.os.Handler.Callback;
import android.os.Message;
import android.text.TextUtils;
import android.widget.Toast;
import cn.sharesdk.framework.CustomPlatform;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.Platform.ShareParams;
import cn.sharesdk.framework.PlatformActionListener;
import cn.sharesdk.framework.ShareSDK;
import com.mob.tools.utils.ResHelper;
import com.mob.tools.utils.UIHandler;
/** 快捷分享的主题样式的实现父类 */
public abstract class OnekeyShareThemeImpl implements PlatformActionListener, Callback {
protected boolean dialogMode;
protected HashMap<String, Object> shareParamsMap;
protected boolean silent;
protected ArrayList<CustomerLogo> customerLogos;
protected HashMap<String, String> hiddenPlatforms;
protected PlatformActionListener callback;
protected ShareContentCustomizeCallback customizeCallback;
protected boolean disableSSO;
protected Context context;
public OnekeyShareThemeImpl() {
callback = this;
}
public final void setDialogMode(boolean dialogMode) {
this.dialogMode = dialogMode;
}
public final void setShareParamsMap(HashMap<String, Object> shareParamsMap) {
this.shareParamsMap = shareParamsMap;
}
public final void setSilent(boolean silent) {
this.silent = silent;
}
public final void setCustomerLogos(ArrayList<CustomerLogo> customerLogos) {
this.customerLogos = customerLogos;
}
public final void setHiddenPlatforms(HashMap<String, String> hiddenPlatforms) {
this.hiddenPlatforms = hiddenPlatforms;
}
public final void setPlatformActionListener(PlatformActionListener callback) {
this.callback = callback == null ? this : callback;
}
public final void setShareContentCustomizeCallback(ShareContentCustomizeCallback customizeCallback) {
this.customizeCallback = customizeCallback;
}
public final void disableSSO() {
disableSSO = true;
}
public final void show(Context context) {
this.context = context;
// 显示方式是由platform和silent两个字段控制的
// 如果platform设置了,则无须显示九宫格,否则都会显示;
// 如果silent为true,表示不进入编辑页面,否则会进入。
if (shareParamsMap.containsKey("platform")) {
String name = String.valueOf(shareParamsMap.get("platform"));
Platform platform = ShareSDK.getPlatform(name);
boolean isCustomPlatform = platform instanceof CustomPlatform;
boolean isUseClientToShare = isUseClientToShare(platform);
if (silent || isCustomPlatform || isUseClientToShare) {
shareSilently(platform);
} else {
prepareForEditPage(platform);
}
} else {
showPlatformPage(context);
}
}
/** 判断指定平台是否只能使用客户端分享 */
final boolean isUseClientToShare(Platform platform) {
String name = platform.getName();
if ("Wechat".equals(name) || "WechatMoments".equals(name)
|| "WechatFavorite".equals(name) || "ShortMessage".equals(name)
|| "Email".equals(name) || "Qzone".equals(name)
|| "QQ".equals(name) || "Pinterest".equals(name)
|| "Instagram".equals(name) || "Yixin".equals(name)
|| "YixinMoments".equals(name) || "QZone".equals(name)
|| "Mingdao".equals(name) || "Line".equals(name)
|| "KakaoStory".equals(name) || "KakaoTalk".equals(name)
|| "Bluetooth".equals(name) || "WhatsApp".equals(name)
|| "BaiduTieba".equals(name) || "Laiwang".equals(name)
|| "LaiwangMoments".equals(name) || "Alipay".equals(name)
|| "AlipayMoments".equals(name)|| "FacebookMessenger".equals(name)
|| "GooglePlus".equals(name)
) {
return true;
} else if ("Evernote".equals(name)) {
if ("true".equals(platform.getDevinfo("ShareByAppClient"))) {
return true;
}
} else if ("SinaWeibo".equals(name)) {
if ("true".equals(platform.getDevinfo("ShareByAppClient"))) {
Intent test = new Intent(Intent.ACTION_SEND);
test.setPackage("com.sina.weibo");
test.setType("image/*");
ResolveInfo ri = platform.getContext().getPackageManager().resolveActivity(test, 0);
if(ri == null) {
test = new Intent(Intent.ACTION_SEND);
test.setPackage("com.sina.weibog3");
test.setType("image/*");
ri = platform.getContext().getPackageManager().resolveActivity(test, 0);
}
return (ri != null);
}
}
return false;
}
final void shareSilently(Platform platform) {
if (formateShareData(platform)) {
ShareParams sp = shareDataToShareParams(platform);
if (sp != null) {
toast("ssdk_oks_sharing");
if (customizeCallback != null) {
customizeCallback.onShare(platform, sp);
}
if (disableSSO) {
platform.SSOSetting(disableSSO);
}
platform.setPlatformActionListener(callback);
platform.share(sp);
}
}
}
private void prepareForEditPage(Platform platform) {
if (formateShareData(platform)) {
ShareParams sp = shareDataToShareParams(platform);
if (sp != null) {
// 编辑分享内容的统计
ShareSDK.logDemoEvent(3, null);
if (customizeCallback != null) {
customizeCallback.onShare(platform, sp);
}
showEditPage(context, platform, sp);
}
}
}
final boolean formateShareData(Platform plat) {
String name = plat.getName();
boolean isAlipay = "Alipay".equals(name) || "AlipayMoments".equals(name);
if (isAlipay && !plat.isClientValid()) {
toast("ssdk_alipay_client_inavailable");
return false;
}
boolean isKakaoTalk = "KakaoTalk".equals(name);
if (isKakaoTalk && !plat.isClientValid()) {
toast("ssdk_kakaotalk_client_inavailable");
return false;
}
boolean isKakaoStory = "KakaoStory".equals(name);
if (isKakaoStory && !plat.isClientValid()) {
toast("ssdk_kakaostory_client_inavailable");
return false;
}
boolean isLine = "Line".equals(name);
if (isLine && !plat.isClientValid()) {
toast("ssdk_line_client_inavailable");
return false;
}
boolean isWhatsApp = "WhatsApp".equals(name);
if (isWhatsApp && !plat.isClientValid()) {
toast("ssdk_whatsapp_client_inavailable");
return false;
}
boolean isPinterest = "Pinterest".equals(name);
if (isPinterest && !plat.isClientValid()) {
toast("ssdk_pinterest_client_inavailable");
return false;
}
if ("Instagram".equals(name) && !plat.isClientValid()) {
toast("ssdk_instagram_client_inavailable");
return false;
}
if ("QZone".equals(name) && !plat.isClientValid()) {
toast("ssdk_qq_client_inavailable");
return false;
}
boolean isLaiwang = "Laiwang".equals(name);
boolean isLaiwangMoments = "LaiwangMoments".equals(name);
if(isLaiwang || isLaiwangMoments){
if (!plat.isClientValid()) {
toast("ssdk_laiwang_client_inavailable");
return false;
}
}
boolean isYixin = "YixinMoments".equals(name) || "Yixin".equals(name);
if (isYixin && !plat.isClientValid()) {
toast("ssdk_yixin_client_inavailable");
return false;
}
boolean isWechat = "WechatFavorite".equals(name) || "Wechat".equals(name) || "WechatMoments".equals(name);
if (isWechat && !plat.isClientValid()) {
toast("ssdk_wechat_client_inavailable");
return false;
}
if ("FacebookMessenger".equals(name) && !plat.isClientValid()) {
toast("ssdk_facebookmessenger_client_inavailable");
return false;
}
if (!shareParamsMap.containsKey("shareType")) {
int shareType = Platform.SHARE_TEXT;
String imagePath = String.valueOf(shareParamsMap.get("imagePath"));
if (imagePath != null && (new File(imagePath)).exists()) {
shareType = Platform.SHARE_IMAGE;
if (imagePath.endsWith(".gif") && isWechat) {
shareType = Platform.SHARE_EMOJI;
} else if (shareParamsMap.containsKey("url") && !TextUtils.isEmpty(shareParamsMap.get("url").toString())) {
shareType = Platform.SHARE_WEBPAGE;
if (shareParamsMap.containsKey("musicUrl") && !TextUtils.isEmpty(shareParamsMap.get("musicUrl").toString()) && isWechat) {
shareType = Platform.SHARE_MUSIC;
}
}
} else {
Bitmap viewToShare = ResHelper.forceCast(shareParamsMap.get("viewToShare"));
if (viewToShare != null && !viewToShare.isRecycled()) {
shareType = Platform.SHARE_IMAGE;
if (shareParamsMap.containsKey("url") && !TextUtils.isEmpty(shareParamsMap.get("url").toString())) {
shareType = Platform.SHARE_WEBPAGE;
if (shareParamsMap.containsKey("musicUrl") && !TextUtils.isEmpty(shareParamsMap.get("musicUrl").toString()) && isWechat) {
shareType = Platform.SHARE_MUSIC;
}
}
} else {
Object imageUrl = shareParamsMap.get("imageUrl");
if (imageUrl != null && !TextUtils.isEmpty(String.valueOf(imageUrl))) {
shareType = Platform.SHARE_IMAGE;
if (String.valueOf(imageUrl).endsWith(".gif") && isWechat) {
shareType = Platform.SHARE_EMOJI;
} else if (shareParamsMap.containsKey("url") && !TextUtils.isEmpty(shareParamsMap.get("url").toString())) {
shareType = Platform.SHARE_WEBPAGE;
if (shareParamsMap.containsKey("musicUrl") && !TextUtils.isEmpty(shareParamsMap.get("musicUrl").toString()) && isWechat) {
shareType = Platform.SHARE_MUSIC;
}
}
}
}
}
shareParamsMap.put("shareType", shareType);
}
return true;
}
final ShareParams shareDataToShareParams(Platform plat) {
if (plat == null || shareParamsMap == null) {
toast("ssdk_oks_share_failed");
return null;
}
try {
String imagePath = ResHelper.forceCast(shareParamsMap.get("imagePath"));
Bitmap viewToShare = ResHelper.forceCast(shareParamsMap.get("viewToShare"));
if (TextUtils.isEmpty(imagePath) && viewToShare != null && !viewToShare.isRecycled()) {
String path = ResHelper.getCachePath(plat.getContext(), "screenshot");
File ss = new File(path, String.valueOf(System.currentTimeMillis()) + ".jpg");
FileOutputStream fos = new FileOutputStream(ss);
viewToShare.compress(CompressFormat.JPEG, 100, fos);
fos.flush();
fos.close();
shareParamsMap.put("imagePath", ss.getAbsolutePath());
}
} catch (Throwable t) {
t.printStackTrace();
toast("ssdk_oks_share_failed");
return null;
}
return new ShareParams(shareParamsMap);
}
private void toast(final String resOrName) {
UIHandler.sendEmptyMessage(0, new Callback() {
public boolean handleMessage(Message msg) {
int resId = ResHelper.getStringRes(context, resOrName);
if (resId > 0) {
Toast.makeText(context, resId, Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, resOrName, Toast.LENGTH_SHORT).show();
}
return false;
}
});
}
protected abstract void showPlatformPage(Context context);
protected abstract void showEditPage(Context context, Platform platform, ShareParams sp);
public final void onComplete(Platform platform, int action,
HashMap<String, Object> res) {
Message msg = new Message();
msg.arg1 = 1;
msg.arg2 = action;
msg.obj = platform;
UIHandler.sendMessage(msg, this);
}
public final void onError(Platform platform, int action, Throwable t) {
t.printStackTrace();
Message msg = new Message();
msg.arg1 = 2;
msg.arg2 = action;
msg.obj = t;
UIHandler.sendMessage(msg, this);
// 分享失败的统计
ShareSDK.logDemoEvent(4, platform);
}
public final void onCancel(Platform platform, int action) {
Message msg = new Message();
msg.arg1 = 3;
msg.arg2 = action;
msg.obj = platform;
UIHandler.sendMessage(msg, this);
// 分享失败的统计
ShareSDK.logDemoEvent(5, platform);
}
public final boolean handleMessage(Message msg) {
switch (msg.arg1) {
case 1: {
// 成功
int resId = ResHelper.getStringRes(context, "ssdk_oks_share_completed");
if (resId > 0) {
toast(context.getString(resId));
}
} break;
case 2: {
// 失败
String expName = msg.obj.getClass().getSimpleName();
if ("WechatClientNotExistException".equals(expName)
|| "WechatTimelineNotSupportedException".equals(expName)
|| "WechatFavoriteNotSupportedException".equals(expName)) {
toast("ssdk_wechat_client_inavailable");
} else if ("GooglePlusClientNotExistException".equals(expName)) {
toast("ssdk_google_plus_client_inavailable");
} else if ("QQClientNotExistException".equals(expName)) {
toast("ssdk_qq_client_inavailable");
} else if ("YixinClientNotExistException".equals(expName)
|| "YixinTimelineNotSupportedException".equals(expName)) {
toast("ssdk_yixin_client_inavailable");
} else if ("KakaoTalkClientNotExistException".equals(expName)) {
toast("ssdk_kakaotalk_client_inavailable");
} else if ("KakaoStoryClientNotExistException".equals(expName)) {
toast("ssdk_kakaostory_client_inavailable");
} else if("WhatsAppClientNotExistException".equals(expName)){
toast("ssdk_whatsapp_client_inavailable");
} else if("FacebookMessengerClientNotExistException".equals(expName)){
toast("ssdk_facebookmessenger_client_inavailable");
} else {
toast("ssdk_oks_share_failed");
}
} break;
case 3: {
// 取消
toast("ssdk_oks_share_canceled");
} break;
}
return false;
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/ShareContentCustomizeCallback.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.Platform.ShareParams;
/** 自定义不同平台分享不同内容的接口 */
public interface ShareContentCustomizeCallback {
public void onShare(Platform platform, ShareParams paramsToShare);
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/ClassicTheme.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic;
import android.content.Context;
import android.content.res.Configuration;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.Platform.ShareParams;
import cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;
import cn.sharesdk.onekeyshare.themes.classic.land.EditPageLand;
import cn.sharesdk.onekeyshare.themes.classic.land.PlatformPageLand;
import cn.sharesdk.onekeyshare.themes.classic.port.EditPagePort;
import cn.sharesdk.onekeyshare.themes.classic.port.PlatformPagePort;
/** 九宫格经典主题样式的实现类*/
public class ClassicTheme extends OnekeyShareThemeImpl {
/** 展示平台列表*/
protected void showPlatformPage(Context context) {
PlatformPage page;
int orientation = context.getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
page = new PlatformPagePort(this);
} else {
page = new PlatformPageLand(this);
}
page.show(context, null);
}
/** 展示编辑界面*/
protected void showEditPage(Context context, Platform platform, ShareParams sp) {
EditPage page;
int orientation = context.getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
page = new EditPagePort(this);
} else {
page = new EditPageLand(this);
}
page.setPlatform(platform);
page.setShareParams(sp);
page.show(context, null);
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/EditPage.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.drawable.ColorDrawable;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.Platform.ShareParams;
import cn.sharesdk.framework.ShareSDK;
import cn.sharesdk.onekeyshare.OnekeySharePage;
import cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;
import cn.sharesdk.onekeyshare.themes.classic.land.FriendListPageLand;
import cn.sharesdk.onekeyshare.themes.classic.port.FriendListPagePort;
import com.mob.tools.gui.AsyncImageView;
import com.mob.tools.utils.DeviceHelper;
import com.mob.tools.utils.ResHelper;
public class EditPage extends OnekeySharePage implements OnClickListener, TextWatcher, Runnable {
private OnekeyShareThemeImpl impl;
protected Platform platform;
protected ShareParams sp;
protected LinearLayout llPage;
protected RelativeLayout rlTitle;
protected ScrollView svContent;
protected EditText etContent;
protected TextView tvCancel;
protected TextView tvShare;
protected RelativeLayout rlThumb;
/** 异步加载图片的控件 */
protected AsyncImageView aivThumb;
protected XView xvRemove;
protected LinearLayout llBottom;
protected TextView tvAt;
protected TextView tvTextCouter;
protected Bitmap thumb;
protected int maxBodyHeight;
public EditPage(OnekeyShareThemeImpl impl) {
super(impl);
this.impl = impl;
}
public void setPlatform(Platform platform) {
this.platform = platform;
}
public void setShareParams(ShareParams sp) {
this.sp = sp;
}
public void setActivity(Activity activity) {
super.setActivity(activity);
if (isDialogMode()) {
System.err.println("Theme classic does not support dialog mode!");
// activity.setTheme(android.R.style.Theme_Dialog);
// activity.requestWindowFeature(Window.FEATURE_NO_TITLE);
// if (Build.VERSION.SDK_INT >= 11) {
// try {
// ReflectHelper.invokeInstanceMethod(activity, "setFinishOnTouchOutside", false);
// } catch (Throwable e) {}
// }
}
activity.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE |
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
}
public void onCreate() {
activity.getWindow().setBackgroundDrawable(new ColorDrawable(0xfff3f3f3));
}
/** 取消分享时,执行的方法 */
private void cancelAndFinish() {
// 分享失败的统计
ShareSDK.logDemoEvent(5, platform);
finish();
}
/** 执行分享时的方法 */
private void shareAndFinish() {
int resId = ResHelper.getStringRes(activity, "ssdk_oks_sharing");
if (resId > 0) {
Toast.makeText(activity, resId, Toast.LENGTH_SHORT).show();
}
if (isDisableSSO()) {
platform.SSOSetting(true);
}
platform.setPlatformActionListener(getCallback());
platform.share(sp);
finish();
}
/** 编辑界面,显示的图片 */
private void showThumb(Bitmap pic) {
PicViewerPage page = new PicViewerPage(impl);
page.setImageBitmap(pic);
page.show(activity, null);
}
private void removeThumb() {
sp.setImageArray(null);
sp.setImageData(null);
sp.setImagePath(null);
sp.setImageUrl(null);
}
/** @ 好友时,展示的好友列表 */
private void showFriendList() {
FriendListPage page;
int orientation = activity.getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
page = new FriendListPagePort(impl);
} else {
page = new FriendListPageLand(impl);
}
page.setPlatform(platform);
page.showForResult(platform.getContext(), null, this);
}
public void onResult(HashMap<String, Object> data) {
String atText = getJoinSelectedUser(data);
if(!TextUtils.isEmpty(atText)) {
etContent.append(atText);
}
}
private String getJoinSelectedUser(HashMap<String, Object> data) {
if (data != null && data.containsKey("selected")) {
@SuppressWarnings("unchecked")
ArrayList<String> selected = (ArrayList<String>) data.get("selected");
String platform = ((Platform)data.get("platform")).getName();
if("FacebookMessenger".equals(platform)) {
return null;
}
StringBuilder sb = new StringBuilder();
for (String sel : selected) {
sb.append('@').append(sel).append(' ');
}
return sb.toString();
}
return null;
}
protected boolean isShowAtUserLayout(String platformName) {
return "SinaWeibo".equals(platformName)
|| "TencentWeibo".equals(platformName)
|| "Facebook".equals(platformName)
|| "Twitter".equals(platformName);
}
public void onClick(View v) {
if (v.equals(tvCancel)) {
cancelAndFinish();
} else if (v.equals(tvShare)) {
sp.setText(etContent.getText().toString().trim());
shareAndFinish();
} else if (v.equals(aivThumb)) {
showThumb(thumb);
} else if (v.equals(xvRemove)) {
maxBodyHeight = 0;
rlThumb.setVisibility(View.GONE);
llPage.measure(0, 0);
onTextChanged(etContent.getText(), 0, 0, 0);
removeThumb();
} else if (v.equals(tvAt)) {
showFriendList();
}
}
public void onTextChanged(CharSequence s, int start, int before, int count) {
tvTextCouter.setText(String.valueOf(s.length()));
if (maxBodyHeight == 0) {
maxBodyHeight = llPage.getHeight() - rlTitle.getHeight() - llBottom.getHeight();
}
if (maxBodyHeight > 0) {
svContent.post(this);
}
}
/** 动态适配编辑界面的高度 */
public void run() {
int height = svContent.getChildAt(0).getHeight();
RelativeLayout.LayoutParams lp = ResHelper.forceCast(svContent.getLayoutParams());
if (height > maxBodyHeight && lp.height != maxBodyHeight) {
lp.height = maxBodyHeight;
svContent.setLayoutParams(lp);
} else if (height < maxBodyHeight && lp.height == maxBodyHeight) {
lp.height = LayoutParams.WRAP_CONTENT;
svContent.setLayoutParams(lp);
}
}
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
public void onPause() {
DeviceHelper.getInstance(activity).hideSoftInput(getContentView());
super.onPause();
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/FriendAdapter.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic;
import java.util.ArrayList;
import java.util.HashMap;
import android.graphics.drawable.ColorDrawable;
import android.os.Handler.Callback;
import android.os.Message;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.LinearLayout;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.PlatformActionListener;
import com.mob.tools.gui.PullToRequestListAdapter;
import com.mob.tools.gui.PullToRequestView;
import com.mob.tools.utils.UIHandler;
/** 好友列表的适配器 */
public class FriendAdapter extends PullToRequestListAdapter implements PlatformActionListener {
private FriendListPage activity;
private boolean hasNext;
private Platform platform;
/** 请求好友列表时,每页15个 */
private final int pageCount = 15;
/** 当前的好友列表是第几页 */
private int curPage;
/** 好友列表数据 */
private ArrayList<Following> follows;
/** 判断当前的好友列表数据与请求的新数据是否有重复 */
private HashMap<String, Boolean> map;
/** 好友列表的头部View */
private PRTHeader llHeader;
/** 根据设计,按照比例来布局,以此来适配所有手机 */
private float ratio;
public FriendAdapter(FriendListPage activity, PullToRequestView view) {
super(view);
this.activity = activity;
curPage = -1;
hasNext = true;
map = new HashMap<String, Boolean>();
follows = new ArrayList<Following>();
getListView().setDivider(new ColorDrawable(0xffeaeaea));
}
public void setRatio(float ratio) {
this.ratio = ratio;
getListView().setDividerHeight((int) (ratio < 1 ? 1 : ratio));
}
public void setOnItemClickListener(OnItemClickListener listener) {
getListView().setOnItemClickListener(listener);
}
public void setPlatform(Platform platform) {
this.platform = platform;
platform.setPlatformActionListener(this);
}
private void next() {
if (hasNext) {
platform.listFriend(pageCount, curPage + 1, null);
}
}
public void onComplete(Platform plat, int action, HashMap<String, Object> res) {
final FollowersResult followersResult = parseFollowers(platform.getName(), res, map);
if (followersResult == null) {
UIHandler.sendEmptyMessage(0, new Callback() {
public boolean handleMessage(Message msg) {
notifyDataSetChanged();
return false;
}
});
return;
}
hasNext = followersResult.hasNextPage;
if (followersResult.list != null && followersResult.list.size() > 0) {
curPage++;
Message msg = new Message();
msg.what = 1;
msg.obj = followersResult.list;
UIHandler.sendMessage(msg, new Callback() {
public boolean handleMessage(Message msg) {
if (curPage <= 0) {
follows.clear();
}
follows.addAll(followersResult.list);
notifyDataSetChanged();
return false;
}
});
}
}
private FollowersResult parseFollowers(String platform, HashMap<String, Object> res, HashMap<String, Boolean> uidMap) {
if (res == null || res.size() <= 0) {
return null;
}
boolean hasNext = false;
ArrayList<Following> data = new ArrayList<Following>();
if ("SinaWeibo".equals(platform)) {
// users[id, name, description]
@SuppressWarnings("unchecked")
ArrayList<HashMap<String, Object>> users = (ArrayList<HashMap<String,Object>>) res.get("users");
for (HashMap<String, Object> user : users) {
String uid = String.valueOf(user.get("id"));
if (!uidMap.containsKey(uid)) {
Following following = new Following();
following.uid = uid;
following.screenName = String.valueOf(user.get("name"));
following.description = String.valueOf(user.get("description"));
following.icon = String.valueOf(user.get("profile_image_url"));
following.atName = following.screenName;
uidMap.put(following.uid, true);
data.add(following);
}
}
hasNext = (Integer) res.get("total_number") > uidMap.size();
} else if ("TencentWeibo".equals(platform)) {
hasNext = ((Integer)res.get("hasnext") == 0);
// info[nick, name, tweet[text]]
@SuppressWarnings("unchecked")
ArrayList<HashMap<String, Object>> infos = (ArrayList<HashMap<String,Object>>) res.get("info");
for (HashMap<String, Object> info : infos) {
String uid = String.valueOf(info.get("name"));
if (!uidMap.containsKey(uid)) {
Following following = new Following();
following.screenName = String.valueOf(info.get("nick"));
following.uid = uid;
following.atName = uid;
@SuppressWarnings("unchecked")
ArrayList<HashMap<String, Object>> tweets = (ArrayList<HashMap<String,Object>>) info.get("tweet");
for (HashMap<String, Object> tweet : tweets) {
following.description = String.valueOf(tweet.get("text"));
break;
}
following.icon = String.valueOf(info.get("head")) + "/100";
uidMap.put(following.uid, true);
data.add(following);
}
}
} else if ("Facebook".equals(platform)) {
// data[id, name]
@SuppressWarnings("unchecked")
ArrayList<HashMap<String, Object>> datas = (ArrayList<HashMap<String,Object>>) res.get("data");
for (HashMap<String, Object> d : datas) {
String uid = String.valueOf(d.get("id"));
if (!uidMap.containsKey(uid)) {
Following following = new Following();
following.uid = uid;
following.atName = "["+uid+"]";
following.screenName = String.valueOf(d.get("name"));
@SuppressWarnings("unchecked")
HashMap<String, Object> picture = (HashMap<String, Object>) d.get("picture");
if (picture != null) {
@SuppressWarnings("unchecked")
HashMap<String, Object> pData = (HashMap<String, Object>) picture.get("data");
following.icon = String.valueOf(pData.get("url"));
}
uidMap.put(following.uid, true);
data.add(following);
}
}
@SuppressWarnings("unchecked")
HashMap<String, Object> paging = (HashMap<String, Object>) res.get("paging");
hasNext = paging.containsKey("next");
} else if ("Twitter".equals(platform)) {
// users[screen_name, name, description]
@SuppressWarnings("unchecked")
ArrayList<HashMap<String, Object>> users = (ArrayList<HashMap<String,Object>>) res.get("users");
for (HashMap<String, Object> user : users) {
String uid = String.valueOf(user.get("screen_name"));
if (!uidMap.containsKey(uid)) {
Following following = new Following();
following.uid = uid;
following.atName = uid;
following.screenName = String.valueOf(user.get("name"));
following.description = String.valueOf(user.get("description"));
following.icon = String.valueOf(user.get("profile_image_url"));
uidMap.put(following.uid, true);
data.add(following);
}
}
}
FollowersResult ret = new FollowersResult();
ret.list = data;
ret.hasNextPage = hasNext;
return ret;
}
public void onError(Platform plat, int action, Throwable t) {
t.printStackTrace();
}
public void onCancel(Platform plat, int action) {
UIHandler.sendEmptyMessage(0, new Callback() {
public boolean handleMessage(Message msg) {
activity.finish();
return false;
}
});
}
public Following getItem(int position) {
return follows.get(position);
}
public long getItemId(int position) {
return position;
}
public int getCount() {
return follows == null ? 0 : follows.size();
}
public View getHeaderView() {
if (llHeader == null) {
llHeader = new PRTHeader(getContext());
}
return llHeader;
}
public void onPullDown(int percent) {
llHeader.onPullDown(percent);
}
public void onRefresh() {
llHeader.onRequest();
curPage = -1;
hasNext = true;
map.clear();
next();
}
public void onReversed() {
llHeader.reverse();
}
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
FriendListItem llItem = new FriendListItem(parent.getContext(), ratio);
convertView = llItem;
}
FriendListItem llItem = (FriendListItem) convertView;
llItem.update(getItem(position), isFling());
if (position == getCount() - 1) {
next();
}
return convertView;
}
public static class Following {
public boolean checked;
public String screenName;
public String description;
public String uid;
public String icon;
//@Name 用于微博等提示或关联某个人
public String atName;
}
private static class FollowersResult {
public ArrayList<Following> list;
public boolean hasNextPage = false;
}
public View getFooterView() {
LinearLayout footerView = new LinearLayout(getContext());
footerView.setMinimumHeight(10);
return footerView;
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/FriendListItem.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.TypedValue;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import cn.sharesdk.onekeyshare.themes.classic.FriendAdapter.Following;
import com.mob.tools.gui.AsyncImageView;
import com.mob.tools.gui.BitmapProcessor;
import com.mob.tools.utils.ResHelper;
/** 好友列表的item */
public class FriendListItem extends LinearLayout {
private static final int DESIGN_AVATAR_WIDTH = 64;
private static final int DESIGN_AVATAR_PADDING = 24;
private static final int DESIGN_ITEM_HEIGHT = 96;
private static final int DESIGN_ITEM_PADDING = 20;
private ImageView ivCheck;
private AsyncImageView aivIcon;
private TextView tvName;
/** 好友列表中,被选中的checkbox图标 */
private Bitmap bmChd;
/** 好友列表中,没选中的checkbox图标 */
private Bitmap bmUnch;
public FriendListItem(Context context, float ratio) {
super(context);
int itemPadding = (int) (ratio * DESIGN_ITEM_PADDING);
setPadding(itemPadding, 0, itemPadding, 0);
setMinimumHeight((int) (ratio * DESIGN_ITEM_HEIGHT));
setBackgroundColor(0xffffffff);
ivCheck = new ImageView(context);
LayoutParams lp = new LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.CENTER_VERTICAL;
addView(ivCheck, lp);
aivIcon = new AsyncImageView(context);
int avatarWidth = (int) (ratio * DESIGN_AVATAR_WIDTH);
lp = new LayoutParams(avatarWidth, avatarWidth);
lp.gravity = Gravity.CENTER_VERTICAL;
int avatarMargin = (int) (ratio * DESIGN_AVATAR_PADDING);
lp.setMargins(avatarMargin, 0, avatarMargin, 0);
addView(aivIcon, lp);
tvName = new TextView(context);
tvName.setTextColor(0xff000000);
tvName.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
tvName.setSingleLine();
lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.CENTER_VERTICAL;
lp.weight = 1;
addView(tvName, lp);
int resId = ResHelper.getBitmapRes(context, "ssdk_oks_classic_check_checked");
if (resId > 0) {
bmChd = BitmapFactory.decodeResource(context.getResources(), resId);
}
resId = ResHelper.getBitmapRes(getContext(), "ssdk_oks_classic_check_default");
if (resId > 0) {
bmUnch = BitmapFactory.decodeResource(context.getResources(), resId);
}
}
public void update(Following following, boolean fling) {
tvName.setText(following.screenName);
ivCheck.setImageBitmap(following.checked ? bmChd : bmUnch);
if (aivIcon != null) {
if (fling) {
Bitmap bm = BitmapProcessor.getBitmapFromCache(following.icon);
if (bm != null && !bm.isRecycled()) {
aivIcon.setImageBitmap(bm);
} else {
aivIcon.execute(null, 0);
}
} else {
aivIcon.execute(following.icon, 0);
}
}
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/FriendListPage.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic;
import java.util.ArrayList;
import java.util.HashMap;
import android.graphics.drawable.ColorDrawable;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.onekeyshare.OnekeySharePage;
import cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;
import cn.sharesdk.onekeyshare.themes.classic.FriendAdapter.Following;
import com.mob.tools.gui.PullToRequestView;
import com.mob.tools.utils.ResHelper;
/** 编辑界面,@好友时,弹出的好友列表 */
public abstract class FriendListPage extends OnekeySharePage implements OnClickListener, OnItemClickListener {
private static final int DESIGN_LEFT_PADDING = 40;
private Platform platform;
private LinearLayout llPage;
private RelativeLayout rlTitle;
private TextView tvCancel;
private TextView tvConfirm;
private FriendAdapter adapter;
private int lastPosition = -1;
/** 展示好友列表时,已选择要‘@’的好友个数 */
private int checkNum = 0;
public FriendListPage(OnekeyShareThemeImpl impl) {
super(impl);
}
public void setPlatform(Platform platform) {
this.platform = platform;
}
public void onCreate() {
activity.getWindow().setBackgroundDrawable(new ColorDrawable(0xfff3f3f3));
llPage = new LinearLayout(activity);
llPage.setOrientation(LinearLayout.VERTICAL);
activity.setContentView(llPage);
rlTitle = new RelativeLayout(activity);
float ratio = getRatio();
int titleHeight = (int) (getDesignTitleHeight() * ratio);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, titleHeight);
llPage.addView(rlTitle, lp);
initTitle(rlTitle, ratio);
View line = new View(activity);
LinearLayout.LayoutParams lpline = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, (int) (ratio < 1 ? 1 : ratio));
line.setBackgroundColor(0xffdad9d9);
llPage.addView(line, lpline);
FrameLayout flPage = new FrameLayout(getContext());
LinearLayout.LayoutParams lpFl = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
lpFl.weight = 1;
flPage.setLayoutParams(lpFl);
llPage.addView(flPage);
// 关注(或朋友)列表
PullToRequestView followList = new PullToRequestView(getContext());
FrameLayout.LayoutParams lpLv = new FrameLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
followList.setLayoutParams(lpLv);
flPage.addView(followList);
adapter = new FriendAdapter(this, followList);
adapter.setPlatform(platform);
adapter.setRatio(ratio);
adapter.setOnItemClickListener(this);
followList.setAdapter(adapter);
// 请求数据
followList.performPullingDown(true);
}
protected abstract float getRatio();
protected abstract int getDesignTitleHeight();
private void initTitle(RelativeLayout rlTitle, float ratio) {
tvCancel = new TextView(activity);
tvCancel.setTextColor(0xff3b3b3b);
tvCancel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
tvCancel.setGravity(Gravity.CENTER);
int resId = ResHelper.getStringRes(activity, "ssdk_oks_cancel");
if (resId > 0) {
tvCancel.setText(resId);
}
int padding = (int) (DESIGN_LEFT_PADDING * ratio);
tvCancel.setPadding(padding, 0, padding, 0);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
rlTitle.addView(tvCancel, lp);
tvCancel.setOnClickListener(this);
TextView tvTitle = new TextView(activity);
tvTitle.setTextColor(0xff3b3b3b);
tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 22);
tvTitle.setGravity(Gravity.CENTER);
resId = ResHelper.getStringRes(activity, "ssdk_oks_contacts");
if (resId > 0) {
tvTitle.setText(resId);
}
lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
rlTitle.addView(tvTitle, lp);
tvConfirm = new TextView(activity);
tvConfirm.setTextColor(0xffff6d11);
tvConfirm.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
tvConfirm.setGravity(Gravity.CENTER);
resId = ResHelper.getStringRes(activity, "ssdk_oks_confirm");
if (resId > 0) {
tvConfirm.setText(resId);
}
tvConfirm.setPadding(padding, 0, padding, 0);
lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
rlTitle.addView(tvConfirm, lp);
tvConfirm.setOnClickListener(this);
}
public void onClick(View v) {
if (v.equals(tvCancel)) {
finish();
} else {
ArrayList<String> selected = new ArrayList<String>();
for (int i = 0, size = adapter.getCount(); i < size; i++) {
if (adapter.getItem(i).checked) {
selected.add(adapter.getItem(i).atName);
}
}
HashMap<String, Object> res = new HashMap<String, Object>();
res.put("selected", selected);
res.put("platform", platform);
setResult(res);
finish();
}
}
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if ("FacebookMessenger".equals(platform.getName())) {
if(lastPosition >= 0) {
Following lastFollwing = adapter.getItem(lastPosition);
lastFollwing.checked = false;
}
lastPosition = position;
}
Following following = adapter.getItem(position);
following.checked = !following.checked;
if(following.checked) {
checkNum++;
} else {
checkNum--;
}
updateConfirmView();
adapter.notifyDataSetChanged();
}
private void updateConfirmView() {
int resId = ResHelper.getStringRes(activity, "ssdk_oks_confirm");
String confirm = "Confirm";
if(resId > 0) {
confirm = getContext().getResources().getString(resId);
}
if(checkNum == 0) {
tvConfirm.setText(confirm);
} else if(checkNum > 0) {
tvConfirm.setText(confirm + "(" + checkNum + ")");
}
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/IndicatorView.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;
/** 九宫格滑动时,下面显示的圆圈 */
public class IndicatorView extends View {
private static final int DESIGN_INDICATOR_RADIUS = 6;
private static final int DESIGN_INDICATOR_DISTANCE = 14;
private static final int DESIGN_BOTTOM_HEIGHT = 52;
/** 九格宫有多少页数 */
private int count;
/** 当前显示的是九格宫中的第几页 */
private int current;
public IndicatorView(Context context) {
super(context);
}
public void setScreenCount(int count) {
this.count = count;
}
public void onScreenChange(int currentScreen, int lastScreen) {
if (currentScreen != current) {
current = currentScreen;
postInvalidate();
}
}
protected void onDraw(Canvas canvas) {
if (count <= 1) {
this.setVisibility(View.GONE);
return;
}
float height = getHeight();
float radius = height * DESIGN_INDICATOR_RADIUS / DESIGN_BOTTOM_HEIGHT;
float distance = height * DESIGN_INDICATOR_DISTANCE / DESIGN_BOTTOM_HEIGHT;
float windowWidth = radius * 2 * count + distance * (count - 1);
float left = (getWidth() - windowWidth) / 2;
float cy = height / 2;
canvas.drawColor(0xffffffff);
Paint paint = new Paint();
paint.setAntiAlias(true);
for (int i = 0; i < count; i++) {
if (i == current) {
paint.setColor(0xff5d71a0);
} else {
paint.setColor(0xffafb1b7);
}
float cx = left + (radius * 2 + distance) * i;
canvas.drawCircle(cx, cy, radius, paint);
}
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PRTHeader.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.mob.tools.utils.ResHelper;
/** 下拉刷新的头部控件 */
public class PRTHeader extends LinearLayout {
private static final int DESIGN_SCREEN_WIDTH = 720;
private static final int DESIGN_AVATAR_WIDTH = 64;
private static final int DESIGN_AVATAR_PADDING = 24;
private TextView tvHeader;
private RotateImageView ivArrow;
private ProgressBar pbRefreshing;
public PRTHeader(Context context) {
super(context);
int[] size = ResHelper.getScreenSize(context);
float screenWidth = size[0] < size[1] ? size[0] : size[1];
float ratio = screenWidth / DESIGN_SCREEN_WIDTH;
setOrientation(VERTICAL);
LinearLayout llInner = new LinearLayout(context);
LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.CENTER_HORIZONTAL;
addView(llInner, lp);
ivArrow = new RotateImageView(context);
int resId = ResHelper.getBitmapRes(context, "ssdk_oks_ptr_ptr");
if (resId > 0) {
ivArrow.setImageResource(resId);
}
int avatarWidth = (int) (ratio * DESIGN_AVATAR_WIDTH);
lp = new LayoutParams(avatarWidth, avatarWidth);
lp.gravity = Gravity.CENTER_VERTICAL;
int avataPadding = (int) (ratio * DESIGN_AVATAR_PADDING);
lp.topMargin = lp.bottomMargin = avataPadding;
llInner.addView(ivArrow, lp);
pbRefreshing = new ProgressBar(context);
resId = ResHelper.getBitmapRes(context, "ssdk_oks_classic_progressbar");
Drawable pbdrawable = context.getResources().getDrawable(resId);
pbRefreshing.setIndeterminateDrawable(pbdrawable);
llInner.addView(pbRefreshing, lp);
pbRefreshing.setVisibility(View.GONE);
tvHeader = new TextView(getContext());
tvHeader.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
tvHeader.setPadding(avataPadding, 0, avataPadding, 0);
tvHeader.setTextColor(0xff09bb07);
lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
lp.gravity = Gravity.CENTER_VERTICAL;
llInner.addView(tvHeader, lp);
}
public void onPullDown(int percent) {
if (percent > 100) {
int degree = (percent - 100) * 180 / 20;
if (degree > 180) {
degree = 180;
}
if (degree < 0) {
degree = 0;
}
ivArrow.setRotation(degree);
} else {
ivArrow.setRotation(0);
}
if (percent < 100) {
int resId = ResHelper.getStringRes(getContext(), "ssdk_oks_pull_to_refresh");
if (resId > 0) {
tvHeader.setText(resId);
}
} else {
int resId = ResHelper.getStringRes(getContext(), "ssdk_oks_release_to_refresh");
if (resId > 0) {
tvHeader.setText(resId);
}
}
}
public void onRequest() {
ivArrow.setVisibility(View.GONE);
pbRefreshing.setVisibility(View.VISIBLE);
int resId = ResHelper.getStringRes(getContext(), "ssdk_oks_refreshing");
if (resId > 0) {
tvHeader.setText(resId);
}
}
public void reverse() {
pbRefreshing.setVisibility(View.GONE);
ivArrow.setRotation(180);
ivArrow.setVisibility(View.VISIBLE);
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PicViewerPage.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic;
import android.graphics.Bitmap;
import android.graphics.drawable.ColorDrawable;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.ImageView.ScaleType;
import cn.sharesdk.onekeyshare.OnekeySharePage;
import cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;
import com.mob.tools.gui.ScaledImageView;
/** 图片浏览的视图类 */
public class PicViewerPage extends OnekeySharePage implements OnGlobalLayoutListener {
private Bitmap pic;
/** 图片浏览的缩放控件 */
private ScaledImageView sivViewer;
public PicViewerPage(OnekeyShareThemeImpl impl) {
super(impl);
}
/** 设置图片用于浏览 */
public void setImageBitmap(Bitmap pic) {
this.pic = pic;
}
public void onCreate() {
activity.getWindow().setBackgroundDrawable(new ColorDrawable(0x4c000000));
sivViewer = new ScaledImageView(activity);
sivViewer.setScaleType(ScaleType.MATRIX);
activity.setContentView(sivViewer);
if (pic != null) {
sivViewer.getViewTreeObserver().addOnGlobalLayoutListener(this);
}
}
public void onGlobalLayout() {
sivViewer.getViewTreeObserver().removeGlobalOnLayoutListener(this);
sivViewer.post(new Runnable() {
public void run() {
sivViewer.setBitmap(pic);
}
});
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PlatformPage.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic;
import java.util.ArrayList;
import java.util.HashMap;
import android.graphics.drawable.ColorDrawable;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.LinearLayout;
import android.widget.TextView;
import cn.sharesdk.framework.CustomPlatform;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.Platform.ShareParams;
import cn.sharesdk.framework.ShareSDK;
import cn.sharesdk.onekeyshare.CustomerLogo;
import cn.sharesdk.onekeyshare.OnekeySharePage;
import cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;
import com.mob.tools.gui.MobViewPager;
import com.mob.tools.utils.ResHelper;
/** 九宫格的抽象类 */
public abstract class PlatformPage extends OnekeySharePage {
private ClassicTheme impl;
/** 点击九格宫,展示编辑界面,要执行的子线程 */
private Runnable beforeFinish;
/** 九宫格显示时的动画 */
private Animation animShow;
/** 九宫格隐藏时的动画 */
private Animation animHide;
private LinearLayout llPanel;
private boolean finished;
public PlatformPage(OnekeyShareThemeImpl impl) {
super(impl);
this.impl = ResHelper.forceCast(impl);
}
public void onCreate() {
activity.getWindow().setBackgroundDrawable(new ColorDrawable(0x4c000000));
initAnims();
LinearLayout llPage = new LinearLayout(activity);
llPage.setOrientation(LinearLayout.VERTICAL);
activity.setContentView(llPage);
TextView vTop = new TextView(activity);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
lp.weight = 1;
vTop.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
finish();
}
});
llPage.addView(vTop, lp);
llPanel = new LinearLayout(activity);
llPanel.setOrientation(LinearLayout.VERTICAL);
lp = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
llPanel.setAnimation(animShow);
llPage.addView(llPanel, lp);
MobViewPager mvp = new MobViewPager(activity);
ArrayList<Object> cells = collectCells();
PlatformPageAdapter adapter = newAdapter(cells);
lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, adapter.getPanelHeight());
llPanel.addView(mvp, lp);
IndicatorView vInd = new IndicatorView(activity);
lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, adapter.getBottomHeight());
llPanel.addView(vInd, lp);
vInd.setScreenCount(adapter.getCount());
vInd.onScreenChange(0, 0);
adapter.setIndicator(vInd);
mvp.setAdapter(adapter);
}
protected abstract PlatformPageAdapter newAdapter(ArrayList<Object> cells);
protected ArrayList<Object> collectCells() {
ArrayList<Object> cells = new ArrayList<Object>();
Platform[] platforms = ShareSDK.getPlatformList();
if (platforms == null) {
platforms = new Platform[0];
}
HashMap<String, String> hides = getHiddenPlatforms();
if (hides == null) {
hides = new HashMap<String, String>();
}
for (Platform p : platforms) {
if (!hides.containsKey(p.getName())) {
cells.add(p);
}
}
ArrayList<CustomerLogo> customers = getCustomerLogos();
if (customers != null && customers.size() > 0) {
cells.addAll(customers);
}
return cells;
}
public final void showEditPage(final Platform platform) {
beforeFinish = new Runnable() {
public void run() {
boolean isSilent = isSilent();
boolean isCustomPlatform = platform instanceof CustomPlatform;
boolean isUseClientToShare = isUseClientToShare(platform);
if (isSilent || isCustomPlatform || isUseClientToShare) {
shareSilently(platform);
} else {
ShareParams sp = formateShareData(platform);
if (sp != null) {
// 编辑分享内容的统计
ShareSDK.logDemoEvent(3, null);
if (getCustomizeCallback() != null) {
getCustomizeCallback().onShare(platform, sp);
}
impl.showEditPage(activity, platform, sp);
}
}
}
};
finish();
}
public final void performCustomLogoClick(final View v, final CustomerLogo logo) {
beforeFinish = new Runnable() {
public void run() {
logo.listener.onClick(v);
}
};
finish();
}
private void initAnims() {
animShow = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0,
Animation.RELATIVE_TO_SELF, 0,
Animation.RELATIVE_TO_SELF, 1,
Animation.RELATIVE_TO_SELF, 0);
animShow.setDuration(300);
animHide = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0,
Animation.RELATIVE_TO_SELF, 0,
Animation.RELATIVE_TO_SELF, 0,
Animation.RELATIVE_TO_SELF, 1);
animHide.setDuration(300);
}
public boolean onFinish() {
if (finished) {
finished = false;
return false;
}
animHide.setAnimationListener(new Animation.AnimationListener() {
public void onAnimationStart(Animation animation) {
}
public void onAnimationRepeat(Animation animation) {
}
public void onAnimationEnd(Animation animation) {
if (beforeFinish == null) {
// 取消分享菜单的统计
ShareSDK.logDemoEvent(2, null);
} else {
beforeFinish.run();
beforeFinish = null;
}
finished = true;
finish();
}
});
llPanel.clearAnimation();
llPanel.setAnimation(animHide);
llPanel.setVisibility(View.GONE);
return true;
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PlatformPageAdapter.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic;
import java.util.ArrayList;
import android.content.Context;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.TextView;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.onekeyshare.CustomerLogo;
import com.mob.tools.gui.ViewPagerAdapter;
import com.mob.tools.utils.ResHelper;
/** 九宫格的适配器抽象类 */
public abstract class PlatformPageAdapter extends ViewPagerAdapter implements OnClickListener {
/** 1秒内多次点击九格宫内的图标无效 */
protected static final int MIN_CLICK_INTERVAL = 1000;
public static final int DESIGN_BOTTOM_HEIGHT = 52;
/** 九格宫内图标排列的二维数组,一维对应平台,二维对应页数 */
protected Object[][] cells;
private PlatformPage page;
private IndicatorView vInd;
protected int bottomHeight;
protected int panelHeight;
protected int cellHeight;
protected int lineSize;
protected int sepLineWidth;
protected int paddingTop;
protected int logoHeight;
private long lastClickTime;
public PlatformPageAdapter(PlatformPage page, ArrayList<Object> cells) {
this.page = page;
if (cells != null && !cells.isEmpty()) {
calculateSize(page.getContext(), cells);
collectCells(cells);
}
}
/** 计算九宫格的格数,行数,格高,行高,图标大小 */
protected abstract void calculateSize(Context context, ArrayList<Object> plats);
/** 计算九宫格的格数,行数 */
protected abstract void collectCells(ArrayList<Object> plats);
public int getBottomHeight() {
return bottomHeight;
}
public int getPanelHeight() {
return panelHeight;
}
public int getCount() {
return cells == null? 0: cells.length;
}
public void setIndicator(IndicatorView view) {
vInd = view;
}
public void onScreenChange(int currentScreen, int lastScreen) {
if (vInd != null) {
vInd.setScreenCount(getCount());
vInd.onScreenChange(currentScreen, lastScreen);
}
}
public View getView(int index, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = createPanel(parent.getContext());
}
LinearLayout llPanel = ResHelper.forceCast(convertView);
LinearLayout[] llCells = ResHelper.forceCast(llPanel.getTag());
refreshPanel(llCells, cells[index]);
return convertView;
}
private View createPanel(Context context) {
LinearLayout llPanel = new LinearLayout(context);
llPanel.setOrientation(LinearLayout.VERTICAL);
llPanel.setBackgroundColor(0xfff2f2f2);
int lineCount = panelHeight / cellHeight;
LinearLayout[] llCells = new LinearLayout[lineCount * lineSize];
llPanel.setTag(llCells);
int cellBack = ResHelper.getBitmapRes(context, "ssdk_oks_classic_platform_cell_back");
LinearLayout.LayoutParams lp;
for (int i = 0; i < lineCount; i++) {
LinearLayout llLine = new LinearLayout(context);
lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, cellHeight);
llPanel.addView(llLine, lp);
for (int j = 0; j < lineSize; j++) {
llCells[i * lineSize + j] = new LinearLayout(context);
llCells[i * lineSize + j].setBackgroundResource(cellBack);
llCells[i * lineSize + j].setOrientation(LinearLayout.VERTICAL);
lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, cellHeight);
lp.weight = 1;
llLine.addView(llCells[i * lineSize + j], lp);
if (j < lineSize - 1) {
View vSep = new View(context);
lp = new LinearLayout.LayoutParams(sepLineWidth, LayoutParams.MATCH_PARENT);
llLine.addView(vSep, lp);
}
}
View vSep = new View(context);
lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, sepLineWidth);
llPanel.addView(vSep, lp);
}
for (LinearLayout llCell : llCells) {
ImageView ivLogo = new ImageView(context);
ivLogo.setScaleType(ScaleType.CENTER_INSIDE);
lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, logoHeight);
lp.topMargin = paddingTop;
llCell.addView(ivLogo, lp);
TextView tvName = new TextView(context);
tvName.setTextColor(0xff646464);
tvName.setTextSize(TypedValue.COMPLEX_UNIT_SP, 14);
tvName.setGravity(Gravity.CENTER);
lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
lp.weight = 1;
llCell.addView(tvName, lp);
}
return llPanel;
}
private void refreshPanel(LinearLayout[] llCells, Object[] logos) {
int cellBack = ResHelper.getBitmapRes(page.getContext(), "ssdk_oks_classic_platform_cell_back");
int disableBack = ResHelper.getBitmapRes(page.getContext(), "ssdk_oks_classic_platfrom_cell_back_nor");
for (int i = 0; i < logos.length; i++) {
ImageView ivLogo = ResHelper.forceCast(llCells[i].getChildAt(0));
TextView tvName = ResHelper.forceCast(llCells[i].getChildAt(1));
if (logos[i] == null) {
ivLogo.setVisibility(View.INVISIBLE);
tvName.setVisibility(View.INVISIBLE);
llCells[i].setBackgroundResource(disableBack);
llCells[i].setOnClickListener(null);
} else {
ivLogo.setVisibility(View.VISIBLE);
tvName.setVisibility(View.VISIBLE);
llCells[i].setBackgroundResource(cellBack);
llCells[i].setOnClickListener(this);
llCells[i].setTag(logos[i]);
if (logos[i] instanceof CustomerLogo) {
CustomerLogo logo = ResHelper.forceCast(logos[i]);
if (logo.logo != null) {
ivLogo.setImageBitmap(logo.logo);
} else {
ivLogo.setImageBitmap(null);
}
if (logo.label != null) {
tvName.setText(logo.label);
} else {
tvName.setText("");
}
} else {
Platform plat = ResHelper.forceCast(logos[i]);
String name = plat.getName().toLowerCase();
int resId = ResHelper.getBitmapRes(ivLogo.getContext(),"ssdk_oks_classic_" + name);
if (resId > 0) {
ivLogo.setImageResource(resId);
} else {
ivLogo.setImageBitmap(null);
}
resId = ResHelper.getStringRes(tvName.getContext(), "ssdk_" + name);
if (resId > 0) {
tvName.setText(resId);
} else {
tvName.setText("");
}
}
}
}
}
public void onClick(View v) {
long time = System.currentTimeMillis();
if (time - lastClickTime < MIN_CLICK_INTERVAL) {
return;
}
lastClickTime = time;
if (v.getTag() instanceof CustomerLogo) {
CustomerLogo logo = ResHelper.forceCast(v.getTag());
page.performCustomLogoClick(v, logo);
} else {
Platform plat = ResHelper.forceCast(v.getTag());
page.showEditPage(plat);
}
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/RotateImageView.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic;
import android.content.Context;
import android.graphics.Canvas;
import android.widget.ImageView;
/** 在At好友页面中,下拉刷新列表头部的旋转箭头 */
public class RotateImageView extends ImageView {
private float rotation;
public RotateImageView(Context context) {
super(context);
}
public void setRotation(float rotation) {
this.rotation = rotation;
invalidate();
}
protected void onDraw(Canvas canvas) {
canvas.rotate(rotation, getWidth() / 2, getHeight() / 2);
super.onDraw(canvas);
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/XView.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.View;
/** 编辑页面中删除图片“X”按钮 */
public class XView extends View {
private float ratio;
public XView(Context context) {
super(context);
}
public void setRatio(float ratio) {
this.ratio = ratio;
}
protected void onDraw(Canvas canvas) {
int width = getWidth() / 2;
int height = getHeight() / 2;
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(0xffa0a0a0);
canvas.drawRect(width, 0, getWidth(), height, paint);
paint = new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(3f * ratio);
paint.setColor(0xffffffff);
float left = 8f * ratio;
canvas.drawLine(width + left, left, getWidth() - left, width - left, paint);
canvas.drawLine(width + left, width - left, getWidth() - left, left, paint);
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/EditPageLand.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic.land;
import java.io.File;
import android.graphics.Bitmap;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;
import cn.sharesdk.onekeyshare.themes.classic.EditPage;
import cn.sharesdk.onekeyshare.themes.classic.XView;
import com.mob.tools.gui.AsyncImageView;
import com.mob.tools.utils.BitmapHelper;
import com.mob.tools.utils.ResHelper;
/** 横屏的编辑页 */
public class EditPageLand extends EditPage implements OnClickListener, TextWatcher, Runnable {
private static final int DESIGN_SCREEN_WIDTH= 720;
private static final int DESIGN_BOTTOM_HEIGHT = 75;
private static final int DESIGN_LEFT_PADDING = 40;
private static final int DESIGN_TITLE_HEIGHT_L = 70;
private static final int DESIGN_THUMB_HEIGHT_L = 280;
private static final int DESIGN_REMOVE_THUMB_HEIGHT_L = 60;
public EditPageLand(OnekeyShareThemeImpl impl) {
super(impl);
}
public void onCreate() {
super.onCreate();
int screenHeight = ResHelper.getScreenHeight(activity);
float ratio = ((float) screenHeight) / DESIGN_SCREEN_WIDTH;
maxBodyHeight = 0;
llPage = new LinearLayout(activity);
llPage.setOrientation(LinearLayout.VERTICAL);
activity.setContentView(llPage);
rlTitle = new RelativeLayout(activity);
rlTitle.setBackgroundColor(0xffe6e9ec);
int titleHeight = (int) (DESIGN_TITLE_HEIGHT_L * ratio);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, titleHeight);
llPage.addView(rlTitle, lp);
initTitle(rlTitle, ratio);
RelativeLayout rlBody = new RelativeLayout(activity);
rlBody.setBackgroundColor(0xffffffff);
lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
llPage.addView(rlBody, lp);
initBody(rlBody, ratio);
LinearLayout llShadow = new LinearLayout(activity);
llShadow.setOrientation(LinearLayout.VERTICAL);
rlBody.addView(llShadow, new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
initShadow(llShadow, ratio);
llBottom = new LinearLayout(activity);
llBottom.setOrientation(LinearLayout.VERTICAL);
lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
llPage.addView(llBottom, lp);
initBottom(llBottom, ratio);
}
private void initTitle(RelativeLayout rlTitle, float ratio) {
tvCancel = new TextView(activity);
tvCancel.setTextColor(0xff3b3b3b);
tvCancel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
tvCancel.setGravity(Gravity.CENTER);
int resId = ResHelper.getStringRes(activity, "ssdk_oks_cancel");
if (resId > 0) {
tvCancel.setText(resId);
}
int padding = (int) (DESIGN_LEFT_PADDING * ratio);
tvCancel.setPadding(padding, 0, padding, 0);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
rlTitle.addView(tvCancel, lp);
tvCancel.setOnClickListener(this);
TextView tvTitle = new TextView(activity);
tvTitle.setTextColor(0xff3b3b3b);
tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 22);
tvTitle.setGravity(Gravity.CENTER);
resId = ResHelper.getStringRes(activity, "ssdk_oks_multi_share");
if (resId > 0) {
tvTitle.setText(resId);
}
lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
rlTitle.addView(tvTitle, lp);
tvShare = new TextView(activity);
tvShare.setTextColor(0xffff6d11);
tvShare.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
tvShare.setGravity(Gravity.CENTER);
resId = ResHelper.getStringRes(activity, "ssdk_oks_share");
if (resId > 0) {
tvShare.setText(resId);
}
tvShare.setPadding(padding, 0, padding, 0);
lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
rlTitle.addView(tvShare, lp);
tvShare.setOnClickListener(this);
}
private void initBody(RelativeLayout rlBody, float ratio) {
svContent = new ScrollView(activity);
rlBody.addView(svContent, new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
LinearLayout llContent = new LinearLayout(activity);
llContent.setOrientation(LinearLayout.HORIZONTAL);
svContent.addView(llContent, new ScrollView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
etContent = new EditText(activity);
int padding = (int) (DESIGN_LEFT_PADDING * ratio);
etContent.setPadding(padding, padding, padding, padding);
etContent.setBackgroundDrawable(null);
etContent.setTextColor(0xff3b3b3b);
etContent.setTextSize(TypedValue.COMPLEX_UNIT_SP, 21);
etContent.setText(sp.getText());
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT);
lp.weight = 1;
llContent.addView(etContent, lp);
etContent.addTextChangedListener(this);
rlThumb = new RelativeLayout(activity);
rlThumb.setBackgroundColor(0xff313131);
int thumbWidth = (int) (DESIGN_THUMB_HEIGHT_L * ratio);
int xWidth = (int) (DESIGN_REMOVE_THUMB_HEIGHT_L * ratio);
lp = new LinearLayout.LayoutParams(thumbWidth, thumbWidth);
lp.rightMargin = lp.bottomMargin = lp.topMargin = padding;
llContent.addView(rlThumb, lp);
aivThumb = new AsyncImageView(activity) {
public void onImageGot(String url, Bitmap bm) {
thumb = bm;
super.onImageGot(url, bm);
}
};
aivThumb.setScaleToCropCenter(true);
RelativeLayout.LayoutParams rllp = new RelativeLayout.LayoutParams(thumbWidth, thumbWidth);
rlThumb.addView(aivThumb, rllp);
aivThumb.setOnClickListener(this);
initThumb(aivThumb);
xvRemove = new XView(activity);
xvRemove.setRatio(ratio);
rllp = new RelativeLayout.LayoutParams(xWidth, xWidth);
rllp.addRule(RelativeLayout.ALIGN_PARENT_TOP);
rllp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
rlThumb.addView(xvRemove, rllp);
xvRemove.setOnClickListener(this);
}
private void initBottom(LinearLayout llBottom, float ratio) {
LinearLayout llAt = new LinearLayout(activity);
llAt.setPadding(0, 0, 0, 5);
llAt.setBackgroundColor(0xffffffff);
int bottomHeight = (int) (DESIGN_BOTTOM_HEIGHT * ratio);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, bottomHeight);
llBottom.addView(llAt, lp);
tvAt = new TextView(activity);
tvAt.setTextColor(0xff3b3b3b);
tvAt.setTextSize(TypedValue.COMPLEX_UNIT_SP, 21);
tvAt.setGravity(Gravity.BOTTOM);
tvAt.setText("@");
int padding = (int) (DESIGN_LEFT_PADDING * ratio);
tvAt.setPadding(padding, 0, padding, 0);
lp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
llAt.addView(tvAt, lp);
tvAt.setOnClickListener(this);
if (isShowAtUserLayout(platform.getName())) {
tvAt.setVisibility(View.VISIBLE);
} else {
tvAt.setVisibility(View.INVISIBLE);
}
tvTextCouter = new TextView(activity);
tvTextCouter.setTextColor(0xff3b3b3b);
tvTextCouter.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
tvTextCouter.setGravity(Gravity.BOTTOM | Gravity.RIGHT);
onTextChanged(etContent.getText(), 0, 0, 0);
tvTextCouter.setPadding(padding, 0, padding, 0);
lp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
lp.weight = 1;
llAt.addView(tvTextCouter, lp);
View v = new View(activity);
v.setBackgroundColor(0xffcccccc);
int px_1 = ratio > 1 ? ((int) ratio) : 1;
lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, px_1);
llBottom.addView(v, lp);
}
private void initShadow(LinearLayout llShadow, float ratio) {
int px_1 = ratio > 1 ? ((int) ratio) : 1;
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, px_1);
View v = new View(activity);
v.setBackgroundColor(0x29000000);
llShadow.addView(v, lp);
v = new View(activity);
v.setBackgroundColor(0x14000000);
llShadow.addView(v, lp);
v = new View(activity);
v.setBackgroundColor(0x07000000);
llShadow.addView(v, lp);
}
private void initThumb(AsyncImageView aivThumb) {
String imageUrl = sp.getImageUrl();
String imagePath = sp.getImagePath();
String[] imageArray = sp.getImageArray();
Bitmap pic = null;
rlThumb.setVisibility(View.VISIBLE);
if(!TextUtils.isEmpty(imagePath) && new File(imagePath).exists()) {
try {
pic = BitmapHelper.getBitmap(imagePath);
} catch (Throwable e) {
e.printStackTrace();
}
}
if (pic != null) {
thumb = pic;
aivThumb.setBitmap(pic);
} else if (imageArray != null && imageArray.length > 0) {
if (!TextUtils.isEmpty(imageArray[0]) && new File(imageArray[0]).exists()) {
try {
pic = BitmapHelper.getBitmap(imagePath);
} catch (Throwable e) {
e.printStackTrace();
}
}
}
if (pic != null) {
thumb = pic;
aivThumb.setBitmap(pic);
} else if (pic == null && !TextUtils.isEmpty(imageUrl)) {
aivThumb.execute(imageUrl, 0);
} else {
rlThumb.setVisibility(View.GONE);
}
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/FriendListPageLand.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic.land;
import cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;
import cn.sharesdk.onekeyshare.themes.classic.FriendListPage;
import com.mob.tools.utils.ResHelper;
/** 横屏的好友列表 */
public class FriendListPageLand extends FriendListPage {
private static final int DESIGN_SCREEN_WIDTH = 1280;
private static final int DESIGN_TITLE_HEIGHT = 70;
public FriendListPageLand(OnekeyShareThemeImpl impl) {
super(impl);
}
protected float getRatio() {
float screenWidth = ResHelper.getScreenWidth(activity);
return screenWidth / DESIGN_SCREEN_WIDTH;
}
protected int getDesignTitleHeight() {
return DESIGN_TITLE_HEIGHT;
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/PlatformPageAdapterLand.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic.land;
import java.util.ArrayList;
import android.content.Context;
import cn.sharesdk.onekeyshare.themes.classic.PlatformPage;
import cn.sharesdk.onekeyshare.themes.classic.PlatformPageAdapter;
import com.mob.tools.utils.ResHelper;
/** 横屏的九宫格页面适配器 */
public class PlatformPageAdapterLand extends PlatformPageAdapter {
private static final int DESIGN_SCREEN_WIDTH_L = 1280;
private static final int DESIGN_CELL_WIDTH_L = 160;
private static final int DESIGN_SEP_LINE_WIDTH = 1;
private static final int DESIGN_LOGO_HEIGHT = 76;
private static final int DESIGN_PADDING_TOP = 20;
public PlatformPageAdapterLand(PlatformPage page, ArrayList<Object> cells) {
super(page, cells);
}
protected void calculateSize(Context context, ArrayList<Object> plats) {
int screenWidth = ResHelper.getScreenWidth(context);
float ratio = ((float) screenWidth) / DESIGN_SCREEN_WIDTH_L;
int cellWidth = (int) (DESIGN_CELL_WIDTH_L * ratio);
lineSize = screenWidth / cellWidth;
sepLineWidth = (int) (DESIGN_SEP_LINE_WIDTH * ratio);
sepLineWidth = sepLineWidth < 1 ? 1 : sepLineWidth;
logoHeight = (int) (DESIGN_LOGO_HEIGHT * ratio);
paddingTop = (int) (DESIGN_PADDING_TOP * ratio);
bottomHeight = (int) (DESIGN_BOTTOM_HEIGHT * ratio);
cellHeight = (screenWidth - sepLineWidth * 3) / (lineSize - 1);
panelHeight = cellHeight + sepLineWidth;
}
protected void collectCells(ArrayList<Object> plats) {
int count = plats.size();
if (count < lineSize) {
int lineCount = (count / lineSize);
if (count % lineSize != 0) {
lineCount++;
}
cells = new Object[1][lineCount * lineSize];
} else {
int pageCount = (count / lineSize);
if (count % lineSize != 0) {
pageCount++;
}
cells = new Object[pageCount][lineSize];
}
for (int i = 0; i < count; i++) {
int p = i / lineSize;
cells[p][i - lineSize * p] = plats.get(i);
}
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/PlatformPageLand.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic.land;
import java.util.ArrayList;
import cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;
import cn.sharesdk.onekeyshare.themes.classic.PlatformPage;
import cn.sharesdk.onekeyshare.themes.classic.PlatformPageAdapter;
/** 横屏的九宫格页面 */
public class PlatformPageLand extends PlatformPage {
public PlatformPageLand(OnekeyShareThemeImpl impl) {
super(impl);
}
public void onCreate() {
requestLandscapeOrientation();
super.onCreate();
}
protected PlatformPageAdapter newAdapter(ArrayList<Object> cells) {
return new PlatformPageAdapterLand(this, cells);
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/EditPagePort.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic.port;
import java.io.File;
import android.graphics.Bitmap;
import android.text.TextUtils;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;
import cn.sharesdk.onekeyshare.themes.classic.EditPage;
import cn.sharesdk.onekeyshare.themes.classic.XView;
import com.mob.tools.gui.AsyncImageView;
import com.mob.tools.utils.BitmapHelper;
import com.mob.tools.utils.ResHelper;
/** 竖屏的编辑页 */
public class EditPagePort extends EditPage {
private static final int DESIGN_SCREEN_HEIGHT= 1280;
private static final int DESIGN_TITLE_HEIGHT = 96;
private static final int DESIGN_BOTTOM_HEIGHT = 75;
private static final int DESIGN_LEFT_PADDING = 40;
private static final int DESIGN_THUMB_HEIGHT = 300;
private static final int DESIGN_REMOVE_THUMB_HEIGHT = 70;
public EditPagePort(OnekeyShareThemeImpl impl) {
super(impl);
}
public void onCreate() {
super.onCreate();
int screenHeight = ResHelper.getScreenHeight(activity);
float ratio = ((float) screenHeight) / DESIGN_SCREEN_HEIGHT;
maxBodyHeight = 0;
llPage = new LinearLayout(activity);
llPage.setOrientation(LinearLayout.VERTICAL);
activity.setContentView(llPage);
rlTitle = new RelativeLayout(activity);
rlTitle.setBackgroundColor(0xffe6e9ec);
int titleHeight = (int) (DESIGN_TITLE_HEIGHT * ratio);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, titleHeight);
llPage.addView(rlTitle, lp);
initTitle(rlTitle, ratio);
RelativeLayout rlBody = new RelativeLayout(activity);
rlBody.setBackgroundColor(0xffffffff);
lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
llPage.addView(rlBody, lp);
initBody(rlBody, ratio);
LinearLayout llShadow = new LinearLayout(activity);
llShadow.setOrientation(LinearLayout.VERTICAL);
rlBody.addView(llShadow, new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
initShadow(llShadow, ratio);
llBottom = new LinearLayout(activity);
llBottom.setOrientation(LinearLayout.VERTICAL);
lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
llPage.addView(llBottom, lp);
initBottom(llBottom, ratio);
}
private void initTitle(RelativeLayout rlTitle, float ratio) {
tvCancel = new TextView(activity);
tvCancel.setTextColor(0xff3b3b3b);
tvCancel.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
tvCancel.setGravity(Gravity.CENTER);
int resId = ResHelper.getStringRes(activity, "ssdk_oks_cancel");
if (resId > 0) {
tvCancel.setText(resId);
}
int padding = (int) (DESIGN_LEFT_PADDING * ratio);
tvCancel.setPadding(padding, 0, padding, 0);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
rlTitle.addView(tvCancel, lp);
tvCancel.setOnClickListener(this);
TextView tvTitle = new TextView(activity);
tvTitle.setTextColor(0xff3b3b3b);
tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_SP, 22);
tvTitle.setGravity(Gravity.CENTER);
resId = ResHelper.getStringRes(activity, "ssdk_oks_multi_share");
if (resId > 0) {
tvTitle.setText(resId);
}
lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
lp.addRule(RelativeLayout.CENTER_IN_PARENT);
rlTitle.addView(tvTitle, lp);
tvShare = new TextView(activity);
tvShare.setTextColor(0xffff6d11);
tvShare.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18);
tvShare.setGravity(Gravity.CENTER);
resId = ResHelper.getStringRes(activity, "ssdk_oks_share");
if (resId > 0) {
tvShare.setText(resId);
}
tvShare.setPadding(padding, 0, padding, 0);
lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
rlTitle.addView(tvShare, lp);
tvShare.setOnClickListener(this);
}
private void initBody(RelativeLayout rlBody, float ratio) {
svContent = new ScrollView(activity);
rlBody.addView(svContent, new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
LinearLayout llContent = new LinearLayout(activity);
llContent.setOrientation(LinearLayout.VERTICAL);
svContent.addView(llContent, new ScrollView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
etContent = new EditText(activity);
int padding = (int) (DESIGN_LEFT_PADDING * ratio);
etContent.setPadding(padding, padding, padding, padding);
etContent.setBackgroundDrawable(null);
etContent.setTextColor(0xff3b3b3b);
etContent.setTextSize(TypedValue.COMPLEX_UNIT_SP, 21);
etContent.setText(sp.getText());
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
llContent.addView(etContent, lp);
etContent.addTextChangedListener(this);
rlThumb = new RelativeLayout(activity);
rlThumb.setBackgroundColor(0xff313131);
int thumbWidth = (int) (DESIGN_THUMB_HEIGHT * ratio);
int xWidth = (int) (DESIGN_REMOVE_THUMB_HEIGHT * ratio);
lp = new LinearLayout.LayoutParams(thumbWidth, thumbWidth);
lp.leftMargin = lp.rightMargin = lp.bottomMargin = lp.topMargin = padding;
llContent.addView(rlThumb, lp);
aivThumb = new AsyncImageView(activity) {
public void onImageGot(String url, Bitmap bm) {
thumb = bm;
super.onImageGot(url, bm);
}
};
aivThumb.setScaleToCropCenter(true);
RelativeLayout.LayoutParams rllp = new RelativeLayout.LayoutParams(thumbWidth, thumbWidth);
rlThumb.addView(aivThumb, rllp);
aivThumb.setOnClickListener(this);
initThumb(aivThumb);
xvRemove = new XView(activity);
xvRemove.setRatio(ratio);
rllp = new RelativeLayout.LayoutParams(xWidth, xWidth);
rllp.addRule(RelativeLayout.ALIGN_PARENT_TOP);
rllp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
rlThumb.addView(xvRemove, rllp);
xvRemove.setOnClickListener(this);
}
private void initBottom(LinearLayout llBottom, float ratio) {
LinearLayout llAt = new LinearLayout(activity);
llAt.setPadding(0, 0, 0, 5);
llAt.setBackgroundColor(0xffffffff);
int bottomHeight = (int) (DESIGN_BOTTOM_HEIGHT * ratio);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, bottomHeight);
llBottom.addView(llAt, lp);
tvAt = new TextView(activity);
tvAt.setTextColor(0xff3b3b3b);
tvAt.setTextSize(TypedValue.COMPLEX_UNIT_SP, 22);
tvAt.setGravity(Gravity.BOTTOM);
tvAt.setText("@");
int padding = (int) (DESIGN_LEFT_PADDING * ratio);
tvAt.setPadding(padding, 0, padding, 0);
lp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
llAt.addView(tvAt, lp);
tvAt.setOnClickListener(this);
if (isShowAtUserLayout(platform.getName())) {
tvAt.setVisibility(View.VISIBLE);
} else {
tvAt.setVisibility(View.INVISIBLE);
}
tvTextCouter = new TextView(activity);
tvTextCouter.setTextColor(0xff3b3b3b);
tvTextCouter.setTextSize(TypedValue.COMPLEX_UNIT_SP, 21);
tvTextCouter.setGravity(Gravity.BOTTOM | Gravity.RIGHT);
onTextChanged(etContent.getText(), 0, 0, 0);
tvTextCouter.setPadding(padding, 0, padding, 0);
lp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
lp.weight = 1;
llAt.addView(tvTextCouter, lp);
View v = new View(activity);
v.setBackgroundColor(0xffcccccc);
int px_1 = ratio > 1 ? ((int) ratio) : 1;
lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, px_1);
llBottom.addView(v, lp);
}
private void initShadow(LinearLayout llShadow, float ratio) {
int px_1 = ratio > 1 ? ((int) ratio) : 1;
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, px_1);
View v = new View(activity);
v.setBackgroundColor(0x29000000);
llShadow.addView(v, lp);
v = new View(activity);
v.setBackgroundColor(0x14000000);
llShadow.addView(v, lp);
v = new View(activity);
v.setBackgroundColor(0x07000000);
llShadow.addView(v, lp);
}
private void initThumb(AsyncImageView aivThumb) {
String imageUrl = sp.getImageUrl();
String imagePath = sp.getImagePath();
String[] imageArray = sp.getImageArray();
Bitmap pic = null;
rlThumb.setVisibility(View.VISIBLE);
if(!TextUtils.isEmpty(imagePath) && new File(imagePath).exists()) {
try {
pic = BitmapHelper.getBitmap(imagePath);
} catch (Throwable e) {
e.printStackTrace();
}
}
if (pic != null) {
thumb = pic;
aivThumb.setBitmap(pic);
} else if (imageArray != null && imageArray.length > 0) {
if (!TextUtils.isEmpty(imageArray[0]) && new File(imageArray[0]).exists()) {
try {
pic = BitmapHelper.getBitmap(imagePath);
} catch (Throwable e) {
e.printStackTrace();
}
}
}
if (pic != null) {
thumb = pic;
aivThumb.setBitmap(pic);
} else if (pic == null && !TextUtils.isEmpty(imageUrl)) {
aivThumb.execute(imageUrl, 0);
} else {
rlThumb.setVisibility(View.GONE);
}
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/FriendListPagePort.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic.port;
import cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;
import cn.sharesdk.onekeyshare.themes.classic.FriendListPage;
import com.mob.tools.utils.ResHelper;
/** 竖屏的好友列表 */
public class FriendListPagePort extends FriendListPage {
private static final int DESIGN_SCREEN_WIDTH = 720;
private static final int DESIGN_TITLE_HEIGHT = 96;
public FriendListPagePort(OnekeyShareThemeImpl impl) {
super(impl);
}
protected float getRatio() {
float screenWidth = ResHelper.getScreenWidth(activity);
return screenWidth / DESIGN_SCREEN_WIDTH;
}
protected int getDesignTitleHeight() {
return DESIGN_TITLE_HEIGHT;
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/PlatformPageAdapterPort.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic.port;
import java.util.ArrayList;
import android.content.Context;
import cn.sharesdk.onekeyshare.themes.classic.PlatformPage;
import cn.sharesdk.onekeyshare.themes.classic.PlatformPageAdapter;
import com.mob.tools.utils.ResHelper;
/** 竖屏的九宫格页面适配器 */
public class PlatformPageAdapterPort extends PlatformPageAdapter {
private static final int DESIGN_SCREEN_WIDTH_P = 720;
private static final int DESIGN_SEP_LINE_WIDTH = 1;
private static final int DESIGN_LOGO_HEIGHT = 76;
private static final int DESIGN_PADDING_TOP = 20;
private static final int PAGE_SIZE_P = 12;
private static final int LINE_SIZE_P = 4;
public PlatformPageAdapterPort(PlatformPage page, ArrayList<Object> cells) {
super(page, cells);
}
protected void calculateSize(Context context, ArrayList<Object> plats) {
int screenWidth = ResHelper.getScreenWidth(context);
lineSize = LINE_SIZE_P;
float ratio = ((float) screenWidth) / DESIGN_SCREEN_WIDTH_P;
sepLineWidth = (int) (DESIGN_SEP_LINE_WIDTH * ratio);
sepLineWidth = sepLineWidth < 1 ? 1 : sepLineWidth;
logoHeight = (int) (DESIGN_LOGO_HEIGHT * ratio);
paddingTop = (int) (DESIGN_PADDING_TOP * ratio);
bottomHeight = (int) (DESIGN_BOTTOM_HEIGHT * ratio);
cellHeight = (screenWidth - sepLineWidth * 3) / 4;
if (plats.size() <= lineSize) {
panelHeight = cellHeight + sepLineWidth;
} else if (plats.size() <= PAGE_SIZE_P - lineSize) {
panelHeight = (cellHeight + sepLineWidth) * 2;
} else {
panelHeight = (cellHeight + sepLineWidth) * 3;
}
}
protected void collectCells(ArrayList<Object> plats) {
int count = plats.size();
if (count < PAGE_SIZE_P) {
int lineCount = (count / lineSize);
if (count % lineSize != 0) {
lineCount++;
}
cells = new Object[1][lineCount * lineSize];
} else {
int pageCount = (count / PAGE_SIZE_P);
if (count % PAGE_SIZE_P != 0) {
pageCount++;
}
cells = new Object[pageCount][PAGE_SIZE_P];
}
for (int i = 0; i < count; i++) {
int p = i / PAGE_SIZE_P;
cells[p][i - PAGE_SIZE_P * p] = plats.get(i);
}
}
}
================================================
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/PlatformPagePort.java
================================================
/*
* 官网地站:http://www.mob.com
* 技术支持QQ: 4006852216
* 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也可以通过微信与我们取得联系,我们将会在24小时内给予回复)
*
* Copyright (c) 2013年 mob.com. All rights reserved.
*/
package cn.sharesdk.onekeyshare.themes.classic.port;
import java.util.ArrayList;
import cn.sharesdk.onekeyshare.OnekeyShareThemeImpl;
import cn.sharesdk.onekeyshare.themes.classic.PlatformPage;
import cn.sharesdk.onekeyshare.themes.classic.PlatformPageAdapter;
/** 竖屏的九宫格页面 */
public class PlatformPagePort extends PlatformPage {
public PlatformPagePort(OnekeyShareThemeImpl impl) {
super(impl);
}
public void onCreate() {
requestPortraitOrientation();
super.onCreate();
}
protected PlatformPageAdapter newAdapter(ArrayList<Object> cells) {
return new PlatformPageAdapterPort(this, cells);
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/common/api/CacheApi.java
================================================
package com.ittianyu.pocenter.common.api;
import com.ittianyu.pocenter.common.bean.ProjectBean;
import java.util.List;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.rx_cache2.DynamicKey;
import io.rx_cache2.EvictDynamicKey;
import io.rx_cache2.LifeCache;
/**
* Created by yu on 2017/1/17.
*/
public interface CacheApi {
@LifeCache(duration = 15, timeUnit = TimeUnit.MINUTES)
Observable<List<ProjectBean>> getList(Observable<List<ProjectBean>> repo, DynamicKey key, EvictDynamicKey isUpdate);
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/common/api/RemoteApi.java
================================================
package com.ittianyu.pocenter.common.api;
import com.ittianyu.pocenter.common.bean.ProjectBean;
import java.util.List;
import io.reactivex.Observable;
import retrofit2.http.GET;
import retrofit2.http.Query;
/**
* Created by yu on 2017/1/17.
*/
public interface RemoteApi {
interface Type {
int OTHER = 0;
int WEB = 1;
int WE_CHAT = 2;
int HTML5 = 3;
int APP = 4;
int INTELLIGENT_HARDWARE = 5;
int DESKTOP_APP = 6;
int BIG_DATA = 7;
int SYSTEM = 8;
int SDK_API = 9;
int ART = 10;
}
interface Status {
int RECRUITING = 0;
int RECRUITED = 1;
}
/**
* select list according to types status and keywords
*
* @param start start index
* @param count select count
* @param types support multiple types
* @param status
* @param keywords title or description keywords
* @return
*/
@GET("list")
Observable<List<ProjectBean>> getList(@Query("start") int start, @Query("count") int count,
@Query("type") int[] types, @Query("status") int status,
@Query("keyword") String[] keywords);
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/common/api/Repertories.java
================================================
package com.ittianyu.pocenter.common.api;
import android.content.Context;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import com.ittianyu.pocenter.R;
import com.ittianyu.pocenter.common.base.BaseApplication;
import com.ittianyu.pocenter.common.bean.ProjectBean;
import com.ittianyu.pocenter.common.utils.ConfigUtils;
import com.ittianyu.pocenter.common.utils.RxUtils;
import com.ittianyu.pocenter.common.utils.UnsafeOkHttpUtils;
import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import io.reactivex.Observable;
import io.rx_cache2.DynamicKey;
import io.rx_cache2.EvictDynamicKey;
import io.rx_cache2.internal.RxCache;
import io.victoralbertos.jolyglot.GsonSpeaker;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Created by yu on 2017/1/17.
*/
public class Repertories {
public static final String HOST = "po.ittianyu.com";
public static final String URL_BASE = "https://" + HOST + "/";
private RemoteApi remoteApi;
private CacheApi cacheApi;
private List<String> types = new ArrayList<>();
public Repertories(File cacheDir) {
// create apis
cacheApi = new RxCache.Builder()
.useExpiredDataIfLoaderNotAvailable(true)
.persistence(cacheDir, new GsonSpeaker())
.using(CacheApi.class);
remoteApi = new Retrofit.Builder()
.baseUrl(URL_BASE)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(UnsafeOkHttpUtils.getClient())
.build()
.create(RemoteApi.class);
// add types
Context context = BaseApplication.getContext();
types.add(context.getString(R.string.type_other));
types.add(context.getString(R.string.type_web));
types.add(context.getString(R.string.type_we_chat));
types.add(context.getString(R.string.type_html5));
types.add(context.getString(R.string.type_app));
types.add(context.getString(R.string.type_intelligent_hardware));
types.add(context.getString(R.string.type_desktop_app));
types.add(context.getString(R.string.type_big_data));
types.add(context.getString(R.string.type_system));
types.add(context.getString(R.string.type_sdk_api));
types.add(context.getString(R.string.type_art));
}
public Observable<List<ProjectBean>> getList(int start, int count, int[] types, int status, String[] keywords, boolean update) {
String key = generateKey(start, count, types, status, keywords);
return cacheApi.getList(remoteApi.getList(start, count, types, status, keywords),
new DynamicKey(key), new EvictDynamicKey(update))
.compose(RxUtils.<List<ProjectBean>>netScheduler());// net on io thread, subscribe on main thread
// return remoteApi.getList(start, count, types, status, keywords)
// .compose(RxUtils.<List<ProjectBean>>netScheduler());// net on io thread, subscribe on main thread
}
/**
* according params to generate key
* @param start
* @param count
* @param types
* @param status
* @param keywords
* @return
*/
@NonNull
private String generateKey(int start, int count, int[] types, int status, String[] keywords) {
StringBuilder keyBuilder = new StringBuilder("start=" + start + "&count=" + count);
if (null != types && types.length > 0) {
Arrays.sort(types);
for (int type : types) {
keyBuilder.append("&type=" + type);
}
}
keyBuilder.append("&status=" + status);
if (null != keywords && keywords.length > 0) {
Arrays.sort(keywords);
for (String keyword : keywords) {
keyBuilder.append("&keyword=" + keyword);
}
}
return keyBuilder.toString();
}
public List<String> getAllTypes() {
return types;
}
public boolean isSettingTypes() {
// load config
String type = ConfigUtils.getString(BaseApplication.getContext(), ConfigUtils.KEY_TYPE, "");
if (TextUtils.isEmpty(type))
return false;
return true;
}
public int[] getTypes() {
String type = ConfigUtils.getString(BaseApplication.getContext(), ConfigUtils.KEY_TYPE, "");
if (TextUtils.isEmpty(type))
return null;
String[] typesString = type.split(",");
if (0 == typesString.length)
return null;
int[] types = new int[typesString.length];
for (int i = 0; i < typesString.length; i++) {
types[i] = Integer.parseInt(typesString[i]);
}
return types;
}
public void setTypes(Set<Integer> set) {
// create types string
StringBuilder typeBuilder = new StringBuilder();
for (int type : set) {
typeBuilder.append(type);
typeBuilder.append(',');
}
typeBuilder.deleteCharAt(typeBuilder.length() - 1);// delete the last ','
// save to file
ConfigUtils.putString(BaseApplication.getContext(), ConfigUtils.KEY_TYPE, typeBuilder.toString());
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/common/base/BaseActivity.java
================================================
package com.ittianyu.pocenter.common.base;
import android.view.View;
import android.widget.TextView;
import com.ittianyu.mvp.lcee.Lcee;
import com.ittianyu.mvp.lcee.MvpLceeActivity;
import com.ittianyu.pocenter.R;
import com.orhanobut.logger.Logger;
/**
* Created by yu on 2016/11/25.
*/
@Lcee(loadingViewId = R.id.v_loading, contentViewId = R.id.v_content, errorViewId = R.id.v_error, emptyViewId = R.id.v_empty)
public abstract class BaseActivity<CV extends View, M, V extends BaseContract.View<M>, P extends BaseContract.Presenter<V>>
extends MvpLceeActivity<CV, M, V, P> implements BaseContract.View<M> {
// protected View view;// cache view
// protected boolean firstLoad = true;
@Override
protected void onStart() {
super.onStart();
initView();
loadData(false);
}
// /**
// * create view
// * It will be only create once in a life
// * No need set content view when onCreate
// */
// protected abstract View createView();
/**
* init view
*/
protected abstract void initView();
@Override
protected String getErrorMessage(Throwable e, boolean pullToRefresh) {
Logger.e(e, "");
return pullToRefresh ? getString(R.string.failed_to_refresh) : getString(R.string.failed_to_load_click_to_reload);
}
@Override
protected void onSetErrorViewText(View errorView, String errorMsg) {
TextView tv = (TextView) errorView.findViewById(R.id.tv);
tv.setText(errorMsg);
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/common/base/BaseApplication.java
================================================
package com.ittianyu.pocenter.common.base;
import android.app.Application;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.support.multidex.MultiDex;
import com.ittianyu.pocenter.BuildConfig;
import com.ittianyu.pocenter.common.api.Repertories;
import com.ittianyu.pocenter.common.tinker.FetchPatchHandler;
import com.orhanobut.logger.LogLevel;
import com.orhanobut.logger.Logger;
import com.squareup.leakcanary.LeakCanary;
import com.tencent.tinker.loader.app.ApplicationLike;
import com.tinkerpatch.sdk.TinkerPatch;
import com.tinkerpatch.sdk.loader.TinkerPatchApplicationLike;
/**
* Created by yu on 2016/11/24.
*/
public class BaseApplication extends Application {
private static Context context;
private static Repertories repertories;
// tinker patch config
private ApplicationLike tinkerApplicationLike;
@Override
public void onCreate() {
super.onCreate();
// tinker patch config
tinkerPatchConfig();
context = getApplicationContext();
initLogger();
initLeakCanary();
repertories = new Repertories(context.getCacheDir());
}
private void tinkerPatchConfig() {
// 我们可以从这里获得Tinker加载过程的信息
if (BuildConfig.TINKER_ENABLE) {
tinkerApplicationLike = TinkerPatchApplicationLike.getTinkerPatchApplicationLike();
// 初始化TinkerPatch SDK
TinkerPatch.init(tinkerApplicationLike)
.reflectPatchLibrary()
.setPatchRollbackOnScreenOff(true)
.setPatchRestartOnSrceenOff(true);
// 每隔3个小时去访问后台时候有更新,通过handler实现轮训的效果
new FetchPatchHandler().fetchPatchWithInterval(3);
}
}
/**
* use LeakCanary to check mey leak
*/
private void initLeakCanary() {
if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
LeakCanary.install(this);
}
/**
* init logger
*/
private void initLogger() {
if ((0 != (getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE)))
Logger.init(); // for debug, print all log
else
Logger.init().logLevel(LogLevel.NONE); // for release, remove all log
// Logger.init(); // for release, remove all log
}
public static Context getContext() {
return context;
}
public static Repertories getRepertories() {
return repertories;
}
/**
* tinker
* @param base
*/
@Override
public void attachBaseContext(Context base) {
super.attachBaseContext(base);
//you must install multiDex whatever tinker is installed!
MultiDex.install(base);
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/common/base/BaseContract.java
================================================
package com.ittianyu.pocenter.common.base;
import com.hannesdorfmann.mosby.mvp.MvpPresenter;
import com.ittianyu.mvp.lcee.MvpLceeView;
/**
* Created by yu on 2016/11/29.
*/
public interface BaseContract {
interface View<M> extends MvpLceeView<M> {
<T> T getApp();
}
interface Presenter<V extends View> extends MvpPresenter<V> {
BaseApplication getApp();
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/common/base/BaseFragment.java
================================================
package com.ittianyu.pocenter.common.base;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.TextView;
import com.ittianyu.mvp.lcee.Lcee;
import com.ittianyu.mvp.lcee.MvpLceeFragment;
import com.ittianyu.pocenter.R;
import com.orhanobut.logger.Logger;
import com.victor.loading.rotate.RotateLoading;
/**
* Created by yu on 2016/11/25.
*/
@Lcee(loadingViewId = R.id.v_loading, contentViewId = R.id.v_content, errorViewId = R.id.v_error, emptyViewId = R.id.v_empty)
public abstract class BaseFragment<CV extends View, M, V extends BaseContract.View<M>, P extends BaseContract.Presenter<V>>
extends MvpLceeFragment<CV, M, V, P> implements BaseContract.View<M> {
protected boolean firstLoad = true;
protected boolean prepared = false;
protected boolean visible = false;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
visible = isVisibleToUser;
lazyLoad();
}
/**
* only load data at first visible
*/
private void lazyLoad() {
if (visible && firstLoad && prepared) {
firstLoad = false;
loadData(false);
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initView(view);
showLoading(false);
prepared = true;
lazyLoad();
}
/**
* init view
*/
protected abstract void initView(View view);
@Override
protected String getErrorMessage(Throwable e, boolean pullToRefresh) {
Logger.e(e, e.getMessage());
return pullToRefresh ? getString(R.string.failed_to_refresh) : getString(R.string.failed_to_load_click_to_reload);
}
@Override
protected void onSetErrorViewText(View errorView, String errorMsg) {
TextView tv = (TextView) errorView.findViewById(R.id.tv);
tv.setText(errorMsg);
}
@Override
public <T> T getApp() {
return (T) getActivity().getApplication();
}
@Override
public void showLoading(boolean pullToRefresh) {
super.showLoading(pullToRefresh);
RotateLoading rotateLoading = (RotateLoading) this.loadingView.findViewById(R.id.rl);
if (!rotateLoading.isStart())
rotateLoading.start();
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/common/base/BasePresenter.java
================================================
package com.ittianyu.pocenter.common.base;
import com.hannesdorfmann.mosby.mvp.MvpNullObjectBasePresenter;
/**
* Created by yu on 2016/11/25.
*/
public class BasePresenter<V extends BaseContract.View>
extends MvpNullObjectBasePresenter<V>
implements BaseContract.Presenter<V>{
protected BaseApplication application;
@Override
public void attachView(V view) {
super.attachView(view);
application = (BaseApplication) getView().getApp();
}
@Override
public BaseApplication getApp() {
return application;
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/common/bean/ProjectBean.java
================================================
package com.ittianyu.pocenter.common.bean;
import java.sql.Timestamp;
/**
* Created by yu on 2017/1/14.
*/
public class ProjectBean {
public int id;
public String projectId;
public String title;
public String description;
public String price;
public int type;
public String cycle;
public int people;
public int status;
public Timestamp time;
public String reference;
public String url;
@Override
public String toString() {
return "ProjectBean{" +
"projectId='" + projectId + '\'' +
", title='" + title + '\'' +
", description='" + description + '\'' +
", price='" + price + '\'' +
", type=" + type +
", cycle='" + cycle + '\'' +
", people=" + people +
", status=" + status +
", time=" + time +
", reference='" + reference + '\'' +
", url='" + url + '\'' +
'}';
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/common/tinker/FetchPatchHandler.java
================================================
package com.ittianyu.pocenter.common.tinker;
import android.os.Handler;
import android.os.Message;
import com.tinkerpatch.sdk.TinkerPatch;
/**
* Created by zhangshaowen on 17/1/8.
*/
public class FetchPatchHandler extends Handler {
public static final long HOUR_INTERVAL = 3600 * 1000;
private long checkInterval;
/**
* 通过handler, 达到按照时间间隔轮训的效果
* @param hour
*/
public void fetchPatchWithInterval(int hour) {
//设置TinkerPatch的时间间隔
TinkerPatch.with().setFetchPatchIntervalByHours(hour);
checkInterval = hour * HOUR_INTERVAL;
//立刻尝试去访问,检查是否有更新
sendEmptyMessage(0);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//这里使用false即可
TinkerPatch.with().fetchPatchUpdate(false);
//每隔一段时间都去访问后台, 增加10分钟的buffer时间
sendEmptyMessageDelayed(0, checkInterval + 10 * 60 * 1000);
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/common/utils/CollectionUtils.java
================================================
package com.ittianyu.pocenter.common.utils;
import java.util.Collection;
/**
* Created by yu on 2017/1/17.
*/
public class CollectionUtils {
/**
* check the collection is empty
* @param collection
* @return true if collection == null or size() == 0
*/
public static boolean isEmpty(Collection collection) {
if (null == collection || collection.isEmpty())
return true;
return false;
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/common/utils/ConfigUtils.java
================================================
package com.ittianyu.pocenter.common.utils;
import android.content.Context;
import android.content.SharedPreferences;
/**
* Created by yu.
* read and write config utils
*/
public class ConfigUtils {
private static final String NAME = "config";
public static final String KEY_TYPE = "type";
/**
* Put a key-value into config
* @param context context
* @param key the key
* @param value the value
*/
public static void putString(Context context, String key, String value) {
SharedPreferences sp = context.getSharedPreferences(NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
edit.putString(key, value)
.commit();
}
/**
* Get value by key in config
* @param context context
* @param key the key
* @param defaultValue if can't find the value of key, will return default value
* @return value
*/
public static String getString(Context context, String key, String defaultValue) {
SharedPreferences sp = context.getSharedPreferences(NAME, Context.MODE_PRIVATE);
return sp.getString(key, defaultValue);
}
/**
* Put a key-value into config
* @param context context
* @param key the key
* @param value the value
*/
public static void putInt(Context context, String key, int value) {
SharedPreferences sp = context.getSharedPreferences(NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
edit.putInt(key, value)
.commit();
}
/**
* Get value by key in config
* @param context context
* @param key the key
* @param defaultValue if can't find the value of key, will return default value
* @return value
*/
public static int getInt(Context context, String key, int defaultValue) {
SharedPreferences sp = context.getSharedPreferences(NAME, Context.MODE_PRIVATE);
return sp.getInt(key, defaultValue);
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/common/utils/RxUtils.java
================================================
package com.ittianyu.pocenter.common.utils;
import java.util.NoSuchElementException;
import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.ObservableTransformer;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
/**
* Created by yu on 2016/12/2.
*/
public class RxUtils {
/**
* subscribeOn io
* observeOn mainThread
*
* @param <T>
* @return
*/
public static <T> ObservableTransformer<T, T> netScheduler() {
return new ObservableTransformer<T, T>() {
@Override
public ObservableSource<T> apply(Observable<T> upstream) {
return upstream.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
};
}
/**
* If the publish is empty, it wll run onError and throw a NoSuchElementException
* @param <T>
* @return
*/
public static <T> ObservableTransformer<T, T> notEmptyOrError() {
return new ObservableTransformer<T, T>() {
@Override
public ObservableSource<T> apply(Observable<T> upstream) {
return upstream.switchIfEmpty(new Observable<T>() {
@Override
protected void subscribeActual(Observer<? super T> observer) {
observer.onError(new NoSuchElementException());
}
});
}
};
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/common/utils/UnsafeOkHttpUtils.java
================================================
package com.ittianyu.pocenter.common.utils;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import okhttp3.OkHttpClient;
/**
* Created by yu on 2017/1/20.
*/
public class UnsafeOkHttpUtils {
/**
* don't verify certificate
* @return
*/
public static OkHttpClient getClient() {
try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final javax.net.ssl.SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
OkHttpClient okHttpClient = builder.build();
return okHttpClient;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/features/MainActivity.java
================================================
package com.ittianyu.pocenter.features;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v7.app.AppCompatActivity;
import android.view.KeyEvent;
import android.widget.Toast;
import com.ittianyu.pocenter.R;
import com.ittianyu.pocenter.databinding.ActMainBinding;
import com.ittianyu.pocenter.features.find.FindFragment;
import com.ittianyu.pocenter.features.home.HomeFragment;
import com.ittianyu.pocenter.features.mime.MimeFragment;
import com.ittianyu.pocenter.features.version.VersionUtils;
import com.umeng.analytics.MobclickAgent;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
public static final long TIME_SPACE = 2000;
private ActMainBinding bind;
private VpAdapter adapter;
// collections
private List<Fragment> fragments;// used for ViewPager adapter
private long clickTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bind = DataBindingUtil.setContentView(this, R.layout.act_main);
initData();
initView();
checkVersion();
}
private void initData() {
fragments = new ArrayList<>(3);
// add fragments
fragments.add(new HomeFragment());
fragments.add(new FindFragment());
fragments.add(new MimeFragment());
}
private void initView() {
// set bnve style
bind.bnve.enableAnimation(false);
// set adapter
adapter = new VpAdapter(getSupportFragmentManager(), fragments);
bind.vp.setOffscreenPageLimit(2);
bind.vp.setAdapter(adapter);
// binding with ViewPager
bind.bnve.setupWithViewPager(bind.vp);
}
private void checkVersion() {
VersionUtils.check(this);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
exit();
return true;
}
return super.onKeyDown(keyCode, event);
}
/**
* if click time space < TIME_SPACE, app will exit
*/
private void exit() {
if ((System.currentTimeMillis() - clickTime) > TIME_SPACE) {
Toast.makeText(getApplicationContext(), R.string.exit_if_repeat,
Toast.LENGTH_SHORT).show();
clickTime = System.currentTimeMillis();
return;
}
finish();
}
/**
* view pager adapter
*/
private static class VpAdapter extends FragmentPagerAdapter {
private List<Fragment> data;
public VpAdapter(FragmentManager fm, List<Fragment> data) {
super(fm);
this.data = data;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Fragment getItem(int position) {
return data.get(position);
}
}
// 友盟统计
public void onResume() {
super.onResume();
MobclickAgent.onResume(this);
}
public void onPause() {
super.onPause();
MobclickAgent.onPause(this);
}
// 友盟统计 结束
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/features/SplashActivity.java
================================================
package com.ittianyu.pocenter.features;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.ittianyu.pocenter.R;
import com.ittianyu.pocenter.common.base.BaseApplication;
import com.ittianyu.pocenter.features.type.TypeActivity;
import com.umeng.analytics.MobclickAgent;
import java.util.concurrent.TimeUnit;
import io.reactivex.Observable;
import io.reactivex.functions.Consumer;
public class SplashActivity extends AppCompatActivity {
private static final long SHOW_TIME = 1000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_splash);
// wait for 1s to show splash activity
Observable.just(new Object())
.delay(SHOW_TIME, TimeUnit.MILLISECONDS)
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
start();
}
});
}
/**
* start load config
*/
private void start() {
// check type
if (!BaseApplication.getRepertories().isSettingTypes()) {
// type is empty, need start type activity
startActivity(new Intent(this, TypeActivity.class));
} else {
// enter main activity
startActivity(new Intent(this, MainActivity.class));
}
finish();
}
// 友盟统计
public void onResume() {
super.onResume();
MobclickAgent.onResume(this);
}
public void onPause() {
super.onPause();
MobclickAgent.onPause(this);
}
// 友盟统计 结束
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/features/detail/DetailActivity.java
================================================
package com.ittianyu.pocenter.features.detail;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.webkit.WebSettings;
import com.ittianyu.pocenter.R;
import com.ittianyu.pocenter.databinding.ActDetailBinding;
import com.umeng.analytics.MobclickAgent;
import cn.sharesdk.framework.ShareSDK;
import cn.sharesdk.onekeyshare.OnekeyShare;
public class DetailActivity extends AppCompatActivity {
public static final String EXTRA_URL = "url";
public static final String EXTRA_TITLE = "title";
public static final String EXTRA_DESCRIPTION = "description";
private ActDetailBinding bind;
private String url;
private String title;
private String description;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.act_detail);
bind = DataBindingUtil.setContentView(this, R.layout.act_detail);
Intent intent = getIntent();
// get url title description
url = intent.getStringExtra(EXTRA_URL);
title = intent.getStringExtra(EXTRA_TITLE);
description = intent.getStringExtra(EXTRA_DESCRIPTION);
// load website
WebSettings settings = bind.wv.getSettings();
settings.setJavaScriptEnabled(true);
bind.wv.loadUrl(url);
// init action bar
setSupportActionBar(bind.tb);
ActionBar actionBar = getSupportActionBar();
actionBar.setTitle("");
if (!TextUtils.isEmpty(title))// set title
bind.tvTitle.setText(title);
// enable back button
actionBar.setDisplayHomeAsUpEnabled(true);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_detail, menu);
return super.onCreateOptionsMenu(menu);
}
/**
* menu selected
*
* @param item
* @return
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
break;
case R.id.i_refresh:
bind.wv.reload();
break;
case R.id.i_open_in_browser:
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
break;
case R.id.i_share: {
showShare();
break;
}
}
return super.onOptionsItemSelected(item);
}
private void showShare() {
ShareSDK.initSDK(this);
OnekeyShare oks = new OnekeyShare();
//关闭sso授权
oks.disableSSOWhenAuthorize();
// title标题,印象笔记、邮箱、信息、微信、人人网和QQ空间等使用
oks.setTitle(title);
// titleUrl是标题的网络链接,QQ和QQ空间等使用
oks.setTitleUrl(url);
// text是分享文本,所有平台都需要这个字段
oks.setText(description);
// imagePath是图片的本地路径,Linked-In以外的平台都支持此参数
//oks.setImagePath("/sdcard/test.jpg");//确保SDcard下面存在此张图片
// url仅在微信(包括好友和朋友圈)中使用
oks.setUrl(url);
// site是分享此内容的网站名称,仅在QQ空间使用
oks.setSite(getString(R.string.app_name));
// siteUrl是分享此内容的网站地址,仅在QQ空间使用
oks.setSiteUrl("https://www.ittianyu.com");
// 启动分享GUI
oks.show(this);
}
// 友盟统计
public void onResume() {
super.onResume();
MobclickAgent.onResume(this);
}
public void onPause() {
super.onPause();
MobclickAgent.onPause(this);
}
// 友盟统计 结束
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/features/find/FindAdapter.java
================================================
package com.ittianyu.pocenter.features.find;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.ittianyu.pocenter.R;
import com.ittianyu.pocenter.common.base.BaseApplication;
import com.ittianyu.pocenter.common.bean.ProjectBean;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
/**
* Created by yu on 2017/1/17.
*/
public class FindAdapter extends BaseQuickAdapter<ProjectBean, BaseViewHolder> {
public FindAdapter(List<ProjectBean> data) {
super(R.layout.item_find, data);
}
@Override
protected void convert(BaseViewHolder baseViewHolder, ProjectBean projectBean) {
baseViewHolder.setText(R.id.tv_title, projectBean.title);
baseViewHolder.setText(R.id.tv_price, projectBean.price);
// baseViewHolder.setText(R.id.tv_reference, projectBean.reference);
baseViewHolder.setText(R.id.tv_type, transferType(projectBean.type));
baseViewHolder.setText(R.id.tv_description, projectBean.description);
baseViewHolder.setText(R.id.tv_date, new SimpleDateFormat("yyyy-MM-dd", Locale.CHINESE).format(projectBean.time));
baseViewHolder.setText(R.id.tv_people_count, projectBean.people + mContext.getString(R.string.unit_people));
baseViewHolder.setText(R.id.tv_cycle, projectBean.cycle + mContext.getString(R.string.unit_day));
}
/**
* transfer type from code to string
* @param type
* @return
*/
private String transferType(int type) {
List<String> types = BaseApplication.getRepertories().getAllTypes();
if (type < types.size())
return types.get(type);
return "";
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/features/find/FindContract.java
================================================
package com.ittianyu.pocenter.features.find;
import com.ittianyu.pocenter.common.base.BaseContract;
import com.ittianyu.pocenter.common.bean.ProjectBean;
import java.util.List;
/**
* Created by yu on 2017/1/17.
*/
public interface FindContract {
interface View extends BaseContract.View<List<ProjectBean>> {
void loadDataError(Throwable e, boolean pullToRefresh);
void loadDataComplete();
void loadMore();
void addData(List<ProjectBean> data);
void loadMoreError(Throwable e);
void loadMoreComplete();
}
interface Presenter extends BaseContract.Presenter<View> {
void loadData(boolean pullToRefresh);
void loadMore(int start);
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/features/find/FindFragment.java
================================================
package com.ittianyu.pocenter.features.find;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.listener.OnItemClickListener;
import com.ittianyu.pocenter.R;
import com.ittianyu.pocenter.common.base.BaseFragment;
import com.ittianyu.pocenter.common.bean.ProjectBean;
import com.ittianyu.pocenter.common.utils.CollectionUtils;
import com.ittianyu.pocenter.databinding.FragFindBinding;
import com.ittianyu.pocenter.features.detail.DetailActivity;
import com.ittianyu.pocenter.features.search.SearchActivity;
import com.orhanobut.logger.Logger;
import java.util.ArrayList;
import java.util.List;
/**
* Created by yu on 2017/1/13.
*/
public class FindFragment extends BaseFragment<SwipeRefreshLayout, List<ProjectBean>, FindContract.View, FindContract.Presenter>
implements FindContract.View {
private FragFindBinding bind;
private FindAdapter findAdapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// Logger.d("onCreateView");
return View.inflate(getContext(), R.layout.frag_find, null);
}
@Override
public FindContract.Presenter createPresenter() {
return new FindPresenter();
}
@Override
protected void initView(View view) {
bind = DataBindingUtil.bind(view);
// init recycler view
findAdapter = new FindAdapter(new ArrayList<ProjectBean>(0));
bind.rv.setAdapter(findAdapter);
bind.rv.setLayoutManager(new LinearLayoutManager(getContext()));
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL);
dividerItemDecoration.setDrawable(getResources().getDrawable(R.drawable.shape_drive_line));
bind.rv.addItemDecoration(dividerItemDecoration);
initEvent();
}
/**
* set listeners
*/
private void initEvent() {
// refresh listener
bind.vContent.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
loadData(true);
}
});
// load more listener
findAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {
@Override
public void onLoadMoreRequested() {
bind.rv.post(new Runnable() {
@Override
public void run() {
loadMore();
}
});
}
});
// set listener to start search
bind.tb.findViewById(R.id.ll_root).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(getContext(), SearchActivity.class));
}
});
// item click listener
bind.rv.addOnItemTouchListener(new OnItemClickListener() {
@Override
public void SimpleOnItemClick(BaseQuickAdapter baseQuickAdapter, View view, int i) {
// get item url
ProjectBean project = (ProjectBean) baseQuickAdapter.getItem(i);
// start detail activity
Intent intent = new Intent(getContext(), DetailActivity.class);
intent.putExtra(DetailActivity.EXTRA_URL, project.url);
intent.putExtra(DetailActivity.EXTRA_TITLE, project.title);
intent.putExtra(DetailActivity.EXTRA_DESCRIPTION, project.description);
startActivity(intent);
}
});
}
@Override
public void loadData(boolean pullToRefresh) {
// disable load more when reload data or first load
findAdapter.setEnableLoadMore(false);
// show loading
showLoading(pullToRefresh);
presenter.loadData(pullToRefresh);
Logger.d("start load data");
}
@Override
public void setData(List<ProjectBean> data) {
if (CollectionUtils.isEmpty(data)) {
showEmpty();
} else {
showContent();
}
findAdapter.setNewData(data);
Logger.d("set data");
loadDataComplete();
}
@Override
public void loadDataError(Throwable e, boolean pullToRefresh) {
showError(e, pullToRefresh);
Logger.d("load data error");
loadDataComplete();
}
@Override
public void loadDataComplete() {
// enable load more after reload completed
findAdapter.setEnableLoadMore(true);
bind.vContent.setRefreshing(false);
Logger.d("load data complete");
}
@Override
public void loadMore() {
// disable refresh when load more
bind.vContent.setEnabled(false);
presenter.loadMore(findAdapter.getData().size());
Logger.d("start load more");
}
@Override
public void addData(List<ProjectBean> data) {
if (CollectionUtils.isEmpty(data)) {
// no more data
findAdapter.loadMoreEnd();
} else {
findAdapter.loadMoreComplete();
}
findAdapter.addData(data);
Logger.d("add data");
loadMoreComplete();
}
@Override
public void loadMoreError(Throwable e) {
// showError(e, false);
findAdapter.loadMoreFail();
Logger.d("load more error");
loadMoreComplete();
}
@Override
public void loadMoreComplete() {
// enable reload after load more completed
bind.vContent.setEnabled(true);
Logger.d("load more complete");
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/features/find/FindPresenter.java
================================================
package com.ittianyu.pocenter.features.find;
import com.ittianyu.pocenter.common.api.RemoteApi;
import com.ittianyu.pocenter.common.base.BasePresenter;
import com.ittianyu.pocenter.common.bean.ProjectBean;
import java.util.List;
import io.reactivex.functions.Consumer;
/**
* Created by yu on 2017/1/17.
*/
public class FindPresenter extends BasePresenter<FindContract.View> implements FindContract.Presenter {
private static final int COUNT = 20;
@Override
public void loadData(final boolean pullToRefresh) {
application.getRepertories()
.getList(0, COUNT, null, RemoteApi.Status.RECRUITING, null, pullToRefresh)
.subscribe(new Consumer<List<ProjectBean>>() {
@Override
public void accept(List<ProjectBean> projectBeen) throws Exception {
getView().setData(projectBeen);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
getView().loadDataError(throwable, pullToRefresh);
}
});
}
@Override
public void loadMore(int start) {
application.getRepertories()
.getList(start, COUNT, null, RemoteApi.Status.RECRUITING, null, false)
.subscribe(new Consumer<List<ProjectBean>>() {
@Override
public void accept(List<ProjectBean> projectBeen) throws Exception {
getView().addData(projectBeen);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
getView().loadMoreError(throwable);
}
});
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/features/home/HomeAdapter.java
================================================
package com.ittianyu.pocenter.features.home;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.ittianyu.pocenter.R;
import com.ittianyu.pocenter.common.base.BaseApplication;
import com.ittianyu.pocenter.common.bean.ProjectBean;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
/**
* Created by yu on 2017/1/17.
*/
public class HomeAdapter extends BaseQuickAdapter<ProjectBean, BaseViewHolder> {
public HomeAdapter(List<ProjectBean> data) {
super(R.layout.item_home, data);
}
@Override
protected void convert(BaseViewHolder baseViewHolder, ProjectBean projectBean) {
baseViewHolder.setText(R.id.tv_title, projectBean.title);
baseViewHolder.setText(R.id.tv_price, projectBean.price);
baseViewHolder.setText(R.id.tv_reference, projectBean.reference);
baseViewHolder.setText(R.id.tv_type, transferType(projectBean.type));
baseViewHolder.setText(R.id.tv_description, projectBean.description);
baseViewHolder.setText(R.id.tv_date, new SimpleDateFormat("yyyy-MM-dd", Locale.CHINESE).format(projectBean.time));
baseViewHolder.setText(R.id.tv_people_count, projectBean.people + mContext.getString(R.string.unit_people));
baseViewHolder.setText(R.id.tv_cycle, projectBean.cycle + mContext.getString(R.string.unit_day));
}
/**
* transfer type from code to string
* @param type
* @return
*/
private String transferType(int type) {
List<String> types = BaseApplication.getRepertories().getAllTypes();
if (type < types.size())
return types.get(type);
return "";
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/features/home/HomeContract.java
================================================
package com.ittianyu.pocenter.features.home;
import com.ittianyu.pocenter.common.base.BaseContract;
import com.ittianyu.pocenter.common.bean.ProjectBean;
import java.util.List;
/**
* Created by yu on 2017/1/17.
*/
public interface HomeContract {
interface View extends BaseContract.View<List<ProjectBean>> {
void loadDataError(Throwable e, boolean pullToRefresh);
void loadDataComplete();
void loadMore();
void addData(List<ProjectBean> data);
void loadMoreError(Throwable e);
void loadMoreComplete();
}
interface Presenter extends BaseContract.Presenter<View> {
void loadData(boolean pullToRefresh);
void loadMore(int start);
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/features/home/HomeFragment.java
================================================
package com.ittianyu.pocenter.features.home;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.listener.OnItemClickListener;
import com.ittianyu.pocenter.R;
import com.ittianyu.pocenter.common.base.BaseFragment;
import com.ittianyu.pocenter.common.bean.ProjectBean;
import com.ittianyu.pocenter.common.utils.CollectionUtils;
import com.ittianyu.pocenter.databinding.FragHomeBinding;
import com.ittianyu.pocenter.features.detail.DetailActivity;
import com.orhanobut.logger.Logger;
import java.util.ArrayList;
import java.util.List;
/**
* Created by yu on 2017/1/13.
*/
public class HomeFragment extends BaseFragment<SwipeRefreshLayout, List<ProjectBean>, HomeContract.View, HomeContract.Presenter>
implements HomeContract.View {
private FragHomeBinding bind;
private HomeAdapter homeAdapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// Logger.d("onCreateView");
return View.inflate(getContext(), R.layout.frag_home, null);
}
@Override
public HomeContract.Presenter createPresenter() {
return new HomePresenter();
}
@Override
protected void initView(View view) {
bind = DataBindingUtil.bind(view);
// init recycler view
homeAdapter = new HomeAdapter(new ArrayList<ProjectBean>(0));
bind.rv.setAdapter(homeAdapter);
bind.rv.setLayoutManager(new LinearLayoutManager(getContext()));
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(getContext(), DividerItemDecoration.VERTICAL);
dividerItemDecoration.setDrawable(getResources().getDrawable(R.drawable.shape_drive_line));
bind.rv.addItemDecoration(dividerItemDecoration);
initEvent();
}
/**
* set listeners
*/
private void initEvent() {
// refresh listener
bind.vContent.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
loadData(true);
}
});
// load more listener
homeAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {
@Override
public void onLoadMoreRequested() {
bind.rv.post(new Runnable() {
@Override
public void run() {
loadMore();
}
});
}
});
// item click listener
bind.rv.addOnItemTouchListener(new OnItemClickListener() {
@Override
public void SimpleOnItemClick(BaseQuickAdapter baseQuickAdapter, View view, int i) {
// get item url
ProjectBean project = (ProjectBean) baseQuickAdapter.getItem(i);
// start detail activity
Intent intent = new Intent(getContext(), DetailActivity.class);
intent.putExtra(DetailActivity.EXTRA_URL, project.url);
intent.putExtra(DetailActivity.EXTRA_TITLE, project.title);
intent.putExtra(DetailActivity.EXTRA_DESCRIPTION, project.description);
startActivity(intent);
}
});
}
@Override
public void loadData(boolean pullToRefresh) {
// disable load more when reload data or first load
homeAdapter.setEnableLoadMore(false);
// show loading
showLoading(pullToRefresh);
presenter.loadData(pullToRefresh);
Logger.d("start load data");
}
@Override
public void setData(List<ProjectBean> data) {
if (CollectionUtils.isEmpty(data)) {
showEmpty();
} else {
showContent();
}
homeAdapter.setNewData(data);
Logger.d("set data");
loadDataComplete();
}
@Override
public void loadDataError(Throwable e, boolean pullToRefresh) {
showError(e, pullToRefresh);
Logger.d("load data error");
loadDataComplete();
}
@Override
public void loadDataComplete() {
// enable load more after reload completed
homeAdapter.setEnableLoadMore(true);
bind.vContent.setRefreshing(false);
Logger.d("load data complete");
}
@Override
public void loadMore() {
// disable refresh when load more
bind.vContent.setEnabled(false);
presenter.loadMore(homeAdapter.getData().size());
Logger.d("start load more");
}
@Override
public void addData(List<ProjectBean> data) {
if (CollectionUtils.isEmpty(data)) {
// no more data
homeAdapter.loadMoreEnd();
} else {
homeAdapter.loadMoreComplete();
}
homeAdapter.addData(data);
Logger.d("add data");
loadMoreComplete();
}
@Override
public void loadMoreError(Throwable e) {
// showError(e, false);
homeAdapter.loadMoreFail();
Logger.d("load more error");
loadMoreComplete();
}
@Override
public void loadMoreComplete() {
// enable reload after load more completed
bind.vContent.setEnabled(true);
Logger.d("load more complete");
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/features/home/HomePresenter.java
================================================
package com.ittianyu.pocenter.features.home;
import com.ittianyu.pocenter.common.api.RemoteApi;
import com.ittianyu.pocenter.common.base.BaseApplication;
import com.ittianyu.pocenter.common.base.BasePresenter;
import com.ittianyu.pocenter.common.bean.ProjectBean;
import java.util.List;
import io.reactivex.functions.Consumer;
/**
* Created by yu on 2017/1/17.
*/
public class HomePresenter extends BasePresenter<HomeContract.View> implements HomeContract.Presenter {
private static final int COUNT = 20;
private int[] types;
public HomePresenter() {
loadTypes();
}
/**
* load user selected types from config
*/
private void loadTypes() {
// load types
types = BaseApplication.getRepertories().getTypes();
}
@Override
public void loadData(final boolean pullToRefresh) {
// if refresh data, update types first
if (pullToRefresh)
loadTypes();
application.getRepertories()
.getList(0, COUNT, types, RemoteApi.Status.RECRUITING, null, pullToRefresh)
.subscribe(new Consumer<List<ProjectBean>>() {
@Override
public void accept(List<ProjectBean> projectBeen) throws Exception {
getView().setData(projectBeen);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
getView().loadDataError(throwable, pullToRefresh);
}
});
}
@Override
public void loadMore(int start) {
application.getRepertories()
.getList(start, COUNT, types, RemoteApi.Status.RECRUITING, null, false)
.subscribe(new Consumer<List<ProjectBean>>() {
@Override
public void accept(List<ProjectBean> projectBeen) throws Exception {
getView().addData(projectBeen);
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
getView().loadMoreError(throwable);
}
});
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/features/mime/MimeFragment.java
================================================
package com.ittianyu.pocenter.features.mime;
import android.content.Context;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.app.AlertDialog;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.ittianyu.pocenter.BuildConfig;
import com.ittianyu.pocenter.R;
import com.ittianyu.pocenter.databinding.FragMimeBinding;
import com.ittianyu.pocenter.features.type.TypeActivity;
import com.ittianyu.pocenter.features.version.VersionUtils;
/**
* Created by yu on 2017/1/13.
*/
public class MimeFragment extends Fragment {
private FragMimeBinding bind;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return View.inflate(getContext(), R.layout.frag_mime, null);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initView(view);
initEvent();
}
private void initView(View view) {
bind = DataBindingUtil.bind(view);
}
private void initEvent() {
// tag manager
bind.llTagManager.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(getContext(), TypeActivity.class));
}
});
// about
bind.llAbout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Context context = getContext();
new AlertDialog.Builder(context)
.setTitle(context.getString(R.string.app_name) + " (" + BuildConfig.VERSION_NAME + ")")
.setMessage(R.string.tips_about_us)
.setPositiveButton(R.string.ok, null)
.show();
}
});
// version check
bind.llVersionCheck.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
VersionUtils.check(getContext(), true);
}
});
}
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/features/search/SearchActivity.java
================================================
package com.ittianyu.pocenter.features.search;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.text.TextUtils;
import android.view.View;
import android.widget.TextView;
import com.arlib.floatingsearchview.FloatingSearchView;
import com.arlib.floatingsearchview.suggestions.model.SearchSuggestion;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.listener.OnItemClickListener;
import com.ittianyu.mvp.lcee.Lcee;
import com.ittianyu.mvp.lcee.MvpLceeActivity;
import com.ittianyu.pocenter.R;
import com.ittianyu.pocenter.common.bean.ProjectBean;
import com.ittianyu.pocenter.common.utils.CollectionUtils;
import com.ittianyu.pocenter.databinding.ActSearchBinding;
import com.ittianyu.pocenter.features.detail.DetailActivity;
import com.orhanobut.logger.Logger;
import com.umeng.analytics.MobclickAgent;
import com.victor.loading.rotate.RotateLoading;
import java.util.ArrayList;
import java.util.List;
/**
* Created by yu on 2017/1/13.
*/
@Lcee(loadingViewId = R.id.v_loading, contentViewId = R.id.v_content, errorViewId = R.id.v_error, emptyViewId = R.id.v_empty)
public class SearchActivity extends MvpLceeActivity<SwipeRefreshLayout, List<ProjectBean>, SearchContract.View, SearchContract.Presenter>
implements SearchContract.View {
private ActSearchBinding bind;
private SearchAdapter searchAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bind = DataBindingUtil.setContentView(this, R.layout.act_search);
initView();
}
@Override
protected String getErrorMessage(Throwable e, boolean pullToRefresh) {
Logger.e(e, "");
return pullToRefresh ? getString(R.string.failed_to_refresh) : getString(R.string.failed_to_load_click_to_reload);
}
@Override
protected void onSetErrorViewText(View errorView, String errorMsg) {
TextView tv = (TextView) errorView.findViewById(R.id.tv);
tv.setText(errorMsg);
}
@Override
public void showLoading(boolean pullToRefresh) {
super.showLoading(pullToRefresh);
RotateLoading rotateLoading = (RotateLoading) this.loadingView.findViewById(R.id.rl);
if (!rotateLoading.isStart())
rotateLoading.start();
}
@Override
public SearchContract.Presenter createPresenter() {
return new SearchPresenter();
}
protected void initView() {
// init recycler view
searchAdapter = new SearchAdapter(new ArrayList<ProjectBean>(0));
bind.rv.setAdapter(searchAdapter);
bind.rv.setLayoutManager(new LinearLayoutManager(this));
// bind.rv.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
bind.fsv.setSearchFocused(true);
initEvent();
showContent();
}
/**
* set listeners
*/
private void initEvent() {
// refresh listener
bind.vContent.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
loadData(true);
}
});
// load more listener
searchAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {
@Override
public void onLoadMoreRequested() {
bind.rv.post(new Runnable() {
@Override
public void run() {
loadMore();
}
});
}
});
// item click listener
bind.rv.addOnItemTouchListener(new OnItemClickListener() {
@Override
public void SimpleOnItemClick(BaseQuickAdapter baseQuickAdapter, View view, int i) {
// get item url
ProjectBean project = (ProjectBean) baseQuickAdapter.getItem(i);
// start detail activity
Intent intent = new Intent(SearchActivity.this, DetailActivity.class);
intent.putExtra(DetailActivity.EXTRA_URL, project.url);
intent.putExtra(DetailActivity.EXTRA_TITLE, project.title);
intent.putExtra(DetailActivity.EXTRA_DESCRIPTION, project.description);
startActivity(intent);
}
});
// search listener
bind.fsv.setOnSearchListener(new FloatingSearchView.OnSearchListener() {
@Override
public void onSuggestionClicked(SearchSuggestion searchSuggestion) {
}
@Override
public void onSearchAction(String currentQuery) {
if (!TextUtils.isEmpty(currentQuery)) {
presenter.setSearchString(currentQuery);
loadData(false);
}
}
});
}
@Override
public void loadData(boolean pullToRefresh) {
// disable load more when reload data or first load
searchAdapter.setEnableLoadMore(false);
// show loading
showLoading(pullToRefresh);
presenter.loadData(pullToRefresh);
Logger.d("start load data");
}
@Override
public void setData(List<ProjectBean> data) {
if (CollectionUtils.isEmpty(data)) {
showEmpty();
} else {
showContent();
}
searchAdapter.setNewData(data);
bind.rv.scrollToPosition(0);
Logger.d("set data");
loadDataComplete();
}
@Override
public void loadDataError(Throwable e, boolean pullToRefresh) {
showError(e, pullToRefresh);
Logger.d("load data error");
loadDataComplete();
}
@Override
public void loadDataComplete() {
// enable load more after reload completed
searchAdapter.setEnableLoadMore(true);
bind.vContent.setRefreshing(false);
Logger.d("load data complete");
}
@Override
public void loadMore() {
// disable refresh when load more
bind.vContent.setEnabled(false);
presenter.loadMore(searchAdapter.getData().size());
Logger.d("start load more");
}
@Override
public void addData(List<ProjectBean> data) {
if (CollectionUtils.isEmpty(data)) {
// no more data
searchAdapter.loadMoreEnd();
} else {
searchAdapter.loadMoreComplete();
}
searchAdapter.addData(data);
Logger.d("add data");
loadMoreComplete();
}
@Override
public void loadMoreError(Throwable e) {
// showError(e, false);
searchAdapter.loadMoreFail();
Logger.d("load more error");
loadMoreComplete();
}
@Override
public void loadMoreComplete() {
// enable reload after load more completed
bind.vContent.setEnabled(true);
Logger.d("load more complete");
}
@Override
public <T> T getApp() {
return (T) getApplication();
}
// 友盟统计
public void onResume() {
super.onResume();
MobclickAgent.onResume(this);
}
public void onPause() {
super.onPause();
MobclickAgent.onPause(this);
}
// 友盟统计 结束
}
================================================
FILE: app/src/main/java/com/ittianyu/pocenter/features/search/SearchAdapter.java
================================================
package com.ittianyu.pocenter.features.search;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.ittianyu.pocenter.R;
import com.ittianyu.pocenter.common.base.BaseApplication;
import com.ittianyu.pocenter.common.bean.ProjectBean;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
/**
* Created by yu on 2017/1/17.
*/
public class SearchAdapter extends BaseQuickAdapter<ProjectBean, BaseViewHolder> {
public SearchAdapter(List<ProjectBean> data) {
super(R.layout.item_search, data);
}
@Override
protected void convert(BaseViewHolder baseViewHolder, ProjectBean projectBean) {
baseViewHolder.setText(R.id.tv_title, projectBean.title);
baseViewHolder.setText(R.id.tv_price, projectBean.price);
// baseViewHolder.setText(R.id.tv_reference, projectBean.reference);
// baseViewHolder.setText(R.id.tv_type, transferType(projectBean.type));
baseViewHolder.setText(R.id.tv_description, projectBean.description);
baseViewHolder.setText(R.id.tv_date, new SimpleDateFormat("yyyy-MM-dd", Locale.CHINESE).format(projectBean.time));
baseViewHolder.setText(R.id.tv_people_count, projectBean.people + mContext.getString(R.string.unit_people));
baseViewHolder.setText(R.id.tv_cycle, projectBean.cycle + mContext.getString(R.string.unit_day));
}
/**
* transfer type from code to string
* @param type
* @return
*/
private String transferType(int type) {
List<S
gitextract_i280fmca/ ├── .gitignore ├── LICENSE ├── README.md ├── app/ │ ├── .gitignore │ ├── build.gradle │ ├── libs/ │ │ ├── MobCommons-2016.1222.1756.jar │ │ ├── MobTools-2016.1222.1756.jar │ │ ├── ShareSDK-Core-2.8.0.jar │ │ ├── ShareSDK-Email-2.8.0.jar │ │ ├── ShareSDK-QQ-2.8.0.jar │ │ ├── ShareSDK-Wechat-2.8.0.jar │ │ ├── ShareSDK-Wechat-Core-2.8.0.jar │ │ ├── ShareSDK-Wechat-Favorite-2.8.0.jar │ │ └── ShareSDK-Wechat-Moments-2.8.0.jar │ ├── proguard-rules.pro │ ├── src/ │ │ ├── androidTest/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── ittianyu/ │ │ │ └── pocenter/ │ │ │ └── ExampleInstrumentedTest.java │ │ ├── main/ │ │ │ ├── AndroidManifest.xml │ │ │ ├── assets/ │ │ │ │ └── ShareSDK.xml │ │ │ ├── java/ │ │ │ │ ├── cn/ │ │ │ │ │ └── sharesdk/ │ │ │ │ │ └── onekeyshare/ │ │ │ │ │ ├── CustomerLogo.java │ │ │ │ │ ├── OnekeyShare.java │ │ │ │ │ ├── OnekeySharePage.java │ │ │ │ │ ├── OnekeyShareTheme.java │ │ │ │ │ ├── OnekeyShareThemeImpl.java │ │ │ │ │ ├── ShareContentCustomizeCallback.java │ │ │ │ │ └── themes/ │ │ │ │ │ └── classic/ │ │ │ │ │ ├── ClassicTheme.java │ │ │ │ │ ├── EditPage.java │ │ │ │ │ ├── FriendAdapter.java │ │ │ │ │ ├── FriendListItem.java │ │ │ │ │ ├── FriendListPage.java │ │ │ │ │ ├── IndicatorView.java │ │ │ │ │ ├── PRTHeader.java │ │ │ │ │ ├── PicViewerPage.java │ │ │ │ │ ├── PlatformPage.java │ │ │ │ │ ├── PlatformPageAdapter.java │ │ │ │ │ ├── RotateImageView.java │ │ │ │ │ ├── XView.java │ │ │ │ │ ├── land/ │ │ │ │ │ │ ├── EditPageLand.java │ │ │ │ │ │ ├── FriendListPageLand.java │ │ │ │ │ │ ├── PlatformPageAdapterLand.java │ │ │ │ │ │ └── PlatformPageLand.java │ │ │ │ │ └── port/ │ │ │ │ │ ├── EditPagePort.java │ │ │ │ │ ├── FriendListPagePort.java │ │ │ │ │ ├── PlatformPageAdapterPort.java │ │ │ │ │ └── PlatformPagePort.java │ │ │ │ └── com/ │ │ │ │ └── ittianyu/ │ │ │ │ └── pocenter/ │ │ │ │ ├── common/ │ │ │ │ │ ├── api/ │ │ │ │ │ │ ├── CacheApi.java │ │ │ │ │ │ ├── RemoteApi.java │ │ │ │ │ │ └── Repertories.java │ │ │ │ │ ├── base/ │ │ │ │ │ │ ├── BaseActivity.java │ │ │ │ │ │ ├── BaseApplication.java │ │ │ │ │ │ ├── BaseContract.java │ │ │ │ │ │ ├── BaseFragment.java │ │ │ │ │ │ └── BasePresenter.java │ │ │ │ │ ├── bean/ │ │ │ │ │ │ └── ProjectBean.java │ │ │ │ │ ├── tinker/ │ │ │ │ │ │ └── FetchPatchHandler.java │ │ │ │ │ └── utils/ │ │ │ │ │ ├── CollectionUtils.java │ │ │ │ │ ├── ConfigUtils.java │ │ │ │ │ ├── RxUtils.java │ │ │ │ │ └── UnsafeOkHttpUtils.java │ │ │ │ └── features/ │ │ │ │ ├── MainActivity.java │ │ │ │ ├── SplashActivity.java │ │ │ │ ├── detail/ │ │ │ │ │ └── DetailActivity.java │ │ │ │ ├── find/ │ │ │ │ │ ├── FindAdapter.java │ │ │ │ │ ├── FindContract.java │ │ │ │ │ ├── FindFragment.java │ │ │ │ │ └── FindPresenter.java │ │ │ │ ├── home/ │ │ │ │ │ ├── HomeAdapter.java │ │ │ │ │ ├── HomeContract.java │ │ │ │ │ ├── HomeFragment.java │ │ │ │ │ └── HomePresenter.java │ │ │ │ ├── mime/ │ │ │ │ │ └── MimeFragment.java │ │ │ │ ├── search/ │ │ │ │ │ ├── SearchActivity.java │ │ │ │ │ ├── SearchAdapter.java │ │ │ │ │ ├── SearchContract.java │ │ │ │ │ └── SearchPresenter.java │ │ │ │ ├── type/ │ │ │ │ │ ├── TypeActivity.java │ │ │ │ │ ├── TypeContract.java │ │ │ │ │ └── TypePresenter.java │ │ │ │ ├── version/ │ │ │ │ │ ├── CheckVersionService.java │ │ │ │ │ ├── VersionBean.java │ │ │ │ │ └── VersionUtils.java │ │ │ │ └── wxapi/ │ │ │ │ └── WXEntryActivity.java │ │ │ └── res/ │ │ │ ├── color/ │ │ │ │ └── selector_item_color.xml │ │ │ ├── drawable/ │ │ │ │ ├── ic_about.xml │ │ │ │ ├── ic_cycle.xml │ │ │ │ ├── ic_date.xml │ │ │ │ ├── ic_empty.xml │ │ │ │ ├── ic_error.xml │ │ │ │ ├── ic_find.xml │ │ │ │ ├── ic_github.xml │ │ │ │ ├── ic_home.xml │ │ │ │ ├── ic_logo.xml │ │ │ │ ├── ic_mine.xml │ │ │ │ ├── ic_people.xml │ │ │ │ ├── ic_share.xml │ │ │ │ ├── ic_type.xml │ │ │ │ ├── ic_version_check.xml │ │ │ │ ├── selector_button.xml │ │ │ │ ├── selector_item.xml │ │ │ │ ├── selector_type.xml │ │ │ │ ├── shape_button_normal.xml │ │ │ │ ├── shape_button_pressed.xml │ │ │ │ ├── shape_drive_line.xml │ │ │ │ ├── shape_type_checked.xml │ │ │ │ ├── shape_type_normal.xml │ │ │ │ ├── ssdk_oks_classic_platform_cell_back.xml │ │ │ │ └── ssdk_oks_classic_progressbar.xml │ │ │ ├── drawable-v21/ │ │ │ │ ├── selector_button.xml │ │ │ │ └── selector_item.xml │ │ │ ├── layout/ │ │ │ │ ├── act_detail.xml │ │ │ │ ├── act_main.xml │ │ │ │ ├── act_search.xml │ │ │ │ ├── act_splash.xml │ │ │ │ ├── act_type.xml │ │ │ │ ├── frag_find.xml │ │ │ │ ├── frag_home.xml │ │ │ │ ├── frag_mime.xml │ │ │ │ ├── item_find.xml │ │ │ │ ├── item_home.xml │ │ │ │ ├── item_search.xml │ │ │ │ ├── view_empty.xml │ │ │ │ ├── view_error.xml │ │ │ │ ├── view_loading.xml │ │ │ │ ├── view_search.xml │ │ │ │ └── view_type.xml │ │ │ ├── menu/ │ │ │ │ ├── menu_detail.xml │ │ │ │ ├── menu_navigation.xml │ │ │ │ └── menu_type.xml │ │ │ ├── values/ │ │ │ │ ├── colors.xml │ │ │ │ ├── dimens.xml │ │ │ │ ├── ssdk_instapaper_strings.xml │ │ │ │ ├── ssdk_oks_color_drawables.xml │ │ │ │ ├── ssdk_oks_strings.xml │ │ │ │ ├── ssdk_strings.xml │ │ │ │ ├── strings.xml │ │ │ │ ├── styles.xml │ │ │ │ └── values.xml │ │ │ ├── values-en/ │ │ │ │ ├── ssdk_oks_strings.xml │ │ │ │ └── ssdk_strings.xml │ │ │ └── values-w820dp/ │ │ │ └── dimens.xml │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── ittianyu/ │ │ └── pocenter/ │ │ └── ExampleUnitTest.java │ └── tinkerpatch.gradle ├── build.gradle ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat └── settings.gradle
SYMBOL INDEX (460 symbols across 65 files)
FILE: app/src/androidTest/java/com/ittianyu/pocenter/ExampleInstrumentedTest.java
class ExampleInstrumentedTest (line 17) | @RunWith(AndroidJUnit4.class)
method useAppContext (line 19) | @Test
FILE: app/src/main/java/cn/sharesdk/onekeyshare/CustomerLogo.java
class CustomerLogo (line 15) | public class CustomerLogo {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/OnekeyShare.java
class OnekeyShare (line 32) | public class OnekeyShare {
method OnekeyShare (line 35) | public OnekeyShare() {
method setAddress (line 42) | public void setAddress(String address) {
method setTitle (line 50) | public void setTitle(String title) {
method setTitleUrl (line 55) | public void setTitleUrl(String titleUrl) {
method setText (line 60) | public void setText(String text) {
method getText (line 65) | public String getText() {
method setImagePath (line 70) | public void setImagePath(String imagePath) {
method setImageUrl (line 76) | public void setImageUrl(String imageUrl) {
method setUrl (line 82) | public void setUrl(String url) {
method setFilePath (line 87) | public void setFilePath(String filePath) {
method setComment (line 92) | public void setComment(String comment) {
method setSite (line 97) | public void setSite(String site) {
method setSiteUrl (line 102) | public void setSiteUrl(String siteUrl) {
method setVenueName (line 107) | public void setVenueName(String venueName) {
method setVenueDescription (line 112) | public void setVenueDescription(String venueDescription) {
method setLatitude (line 117) | public void setLatitude(float latitude) {
method setLongitude (line 122) | public void setLongitude(float longitude) {
method setSilent (line 127) | public void setSilent(boolean silent) {
method setPlatform (line 132) | public void setPlatform(String platform) {
method setInstallUrl (line 137) | public void setInstallUrl(String installurl) {
method setExecuteUrl (line 142) | public void setExecuteUrl(String executeurl) {
method setMusicUrl (line 147) | public void setMusicUrl(String musicUrl) {
method setCallback (line 152) | public void setCallback(PlatformActionListener callback) {
method getCallback (line 157) | public PlatformActionListener getCallback() {
method setShareContentCustomizeCallback (line 162) | public void setShareContentCustomizeCallback(ShareContentCustomizeCall...
method getShareContentCustomizeCallback (line 167) | public ShareContentCustomizeCallback getShareContentCustomizeCallback() {
method setCustomerLogo (line 172) | public void setCustomerLogo(Bitmap logo, String label, OnClickListener...
method disableSSOWhenAuthorize (line 182) | public void disableSSOWhenAuthorize() {
method setVideoUrl (line 187) | public void setVideoUrl(String url) {
method setDialogMode (line 193) | @Deprecated
method addHiddenPlatform (line 199) | public void addHiddenPlatform(String platform) {
method setViewToShare (line 205) | public void setViewToShare(View viewToShare) {
method setImageArray (line 215) | public void setImageArray(String[] imageArray) {
method setShareToTencentWeiboWhenPerformingQQOrQZoneSharing (line 220) | public void setShareToTencentWeiboWhenPerformingQQOrQZoneSharing() {
method setTheme (line 225) | public void setTheme(OnekeyShareTheme theme) {
method show (line 229) | @SuppressWarnings("unchecked")
FILE: app/src/main/java/cn/sharesdk/onekeyshare/OnekeySharePage.java
class OnekeySharePage (line 21) | public class OnekeySharePage extends FakeActivity {
method OnekeySharePage (line 24) | public OnekeySharePage(OnekeyShareThemeImpl impl) {
method isDialogMode (line 29) | protected final boolean isDialogMode() {
method getShareParamsMap (line 33) | protected final HashMap<String, Object> getShareParamsMap() {
method isSilent (line 38) | protected final boolean isSilent() {
method getCustomerLogos (line 42) | protected final ArrayList<CustomerLogo> getCustomerLogos() {
method getHiddenPlatforms (line 46) | protected final HashMap<String, String> getHiddenPlatforms() {
method getCallback (line 50) | protected final PlatformActionListener getCallback() {
method getCustomizeCallback (line 54) | protected final ShareContentCustomizeCallback getCustomizeCallback() {
method isDisableSSO (line 58) | protected final boolean isDisableSSO() {
method shareSilently (line 62) | protected final void shareSilently(Platform platform) {
method formateShareData (line 66) | protected final ShareParams formateShareData(Platform platform) {
method isUseClientToShare (line 73) | protected final boolean isUseClientToShare(Platform platform) {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/OnekeyShareTheme.java
type OnekeyShareTheme (line 14) | public enum OnekeyShareTheme {
method OnekeyShareTheme (line 21) | private OnekeyShareTheme(int value, OnekeyShareThemeImpl impl) {
method getValue (line 26) | public int getValue() {
method getImpl (line 30) | public OnekeyShareThemeImpl getImpl() {
method fromValue (line 34) | public static OnekeyShareTheme fromValue(int value) {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/OnekeyShareThemeImpl.java
class OnekeyShareThemeImpl (line 35) | public abstract class OnekeyShareThemeImpl implements PlatformActionList...
method OnekeyShareThemeImpl (line 46) | public OnekeyShareThemeImpl() {
method setDialogMode (line 50) | public final void setDialogMode(boolean dialogMode) {
method setShareParamsMap (line 54) | public final void setShareParamsMap(HashMap<String, Object> shareParam...
method setSilent (line 58) | public final void setSilent(boolean silent) {
method setCustomerLogos (line 62) | public final void setCustomerLogos(ArrayList<CustomerLogo> customerLog...
method setHiddenPlatforms (line 66) | public final void setHiddenPlatforms(HashMap<String, String> hiddenPla...
method setPlatformActionListener (line 70) | public final void setPlatformActionListener(PlatformActionListener cal...
method setShareContentCustomizeCallback (line 74) | public final void setShareContentCustomizeCallback(ShareContentCustomi...
method disableSSO (line 78) | public final void disableSSO() {
method show (line 82) | public final void show(Context context) {
method isUseClientToShare (line 104) | final boolean isUseClientToShare(Platform platform) {
method shareSilently (line 145) | final void shareSilently(Platform platform) {
method prepareForEditPage (line 162) | private void prepareForEditPage(Platform platform) {
method formateShareData (line 176) | final boolean formateShareData(Platform plat) {
method shareDataToShareParams (line 295) | final ShareParams shareDataToShareParams(Platform plat) {
method toast (line 322) | private void toast(final String resOrName) {
method showPlatformPage (line 336) | protected abstract void showPlatformPage(Context context);
method showEditPage (line 338) | protected abstract void showEditPage(Context context, Platform platfor...
method onComplete (line 340) | public final void onComplete(Platform platform, int action,
method onError (line 349) | public final void onError(Platform platform, int action, Throwable t) {
method onCancel (line 362) | public final void onCancel(Platform platform, int action) {
method handleMessage (line 373) | public final boolean handleMessage(Message msg) {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/ShareContentCustomizeCallback.java
type ShareContentCustomizeCallback (line 15) | public interface ShareContentCustomizeCallback {
method onShare (line 17) | public void onShare(Platform platform, ShareParams paramsToShare);
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/ClassicTheme.java
class ClassicTheme (line 22) | public class ClassicTheme extends OnekeyShareThemeImpl {
method showPlatformPage (line 25) | protected void showPlatformPage(Context context) {
method showEditPage (line 37) | protected void showEditPage(Context context, Platform platform, ShareP...
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/EditPage.java
class EditPage (line 43) | public class EditPage extends OnekeySharePage implements OnClickListener...
method EditPage (line 65) | public EditPage(OnekeyShareThemeImpl impl) {
method setPlatform (line 70) | public void setPlatform(Platform platform) {
method setShareParams (line 74) | public void setShareParams(ShareParams sp) {
method setActivity (line 78) | public void setActivity(Activity activity) {
method onCreate (line 96) | public void onCreate() {
method cancelAndFinish (line 101) | private void cancelAndFinish() {
method shareAndFinish (line 108) | private void shareAndFinish() {
method showThumb (line 124) | private void showThumb(Bitmap pic) {
method removeThumb (line 130) | private void removeThumb() {
method showFriendList (line 138) | private void showFriendList() {
method onResult (line 150) | public void onResult(HashMap<String, Object> data) {
method getJoinSelectedUser (line 157) | private String getJoinSelectedUser(HashMap<String, Object> data) {
method isShowAtUserLayout (line 174) | protected boolean isShowAtUserLayout(String platformName) {
method onClick (line 181) | public void onClick(View v) {
method onTextChanged (line 200) | public void onTextChanged(CharSequence s, int start, int before, int c...
method run (line 213) | public void run() {
method afterTextChanged (line 225) | public void afterTextChanged(Editable s) {
method beforeTextChanged (line 229) | public void beforeTextChanged(CharSequence s, int start, int count, in...
method onPause (line 233) | public void onPause() {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/FriendAdapter.java
class FriendAdapter (line 29) | public class FriendAdapter extends PullToRequestListAdapter implements P...
method FriendAdapter (line 46) | public FriendAdapter(FriendListPage activity, PullToRequestView view) {
method setRatio (line 58) | public void setRatio(float ratio) {
method setOnItemClickListener (line 63) | public void setOnItemClickListener(OnItemClickListener listener) {
method setPlatform (line 67) | public void setPlatform(Platform platform) {
method next (line 72) | private void next() {
method onComplete (line 78) | public void onComplete(Platform plat, int action, HashMap<String, Obje...
method parseFollowers (line 109) | private FollowersResult parseFollowers(String platform, HashMap<String...
method onError (line 207) | public void onError(Platform plat, int action, Throwable t) {
method onCancel (line 211) | public void onCancel(Platform plat, int action) {
method getItem (line 220) | public Following getItem(int position) {
method getItemId (line 224) | public long getItemId(int position) {
method getCount (line 228) | public int getCount() {
method getHeaderView (line 232) | public View getHeaderView() {
method onPullDown (line 239) | public void onPullDown(int percent) {
method onRefresh (line 243) | public void onRefresh() {
method onReversed (line 251) | public void onReversed() {
method getView (line 255) | public View getView(int position, View convertView, ViewGroup parent) {
class Following (line 269) | public static class Following {
class FollowersResult (line 279) | private static class FollowersResult {
method getFooterView (line 284) | public View getFooterView() {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/FriendListItem.java
class FriendListItem (line 26) | public class FriendListItem extends LinearLayout {
method FriendListItem (line 40) | public FriendListItem(Context context, float ratio) {
method update (line 80) | public void update(Following following, boolean fling) {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/FriendListPage.java
class FriendListPage (line 35) | public abstract class FriendListPage extends OnekeySharePage implements ...
method FriendListPage (line 48) | public FriendListPage(OnekeyShareThemeImpl impl) {
method setPlatform (line 52) | public void setPlatform(Platform platform) {
method onCreate (line 56) | public void onCreate() {
method getRatio (line 101) | protected abstract float getRatio();
method getDesignTitleHeight (line 103) | protected abstract int getDesignTitleHeight();
method initTitle (line 105) | private void initTitle(RelativeLayout rlTitle, float ratio) {
method onClick (line 147) | public void onClick(View v) {
method onItemClick (line 166) | public void onItemClick(AdapterView<?> parent, View view, int position...
method updateConfirmView (line 187) | private void updateConfirmView() {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/IndicatorView.java
class IndicatorView (line 17) | public class IndicatorView extends View {
method IndicatorView (line 26) | public IndicatorView(Context context) {
method setScreenCount (line 30) | public void setScreenCount(int count) {
method onScreenChange (line 34) | public void onScreenChange(int currentScreen, int lastScreen) {
method onDraw (line 41) | protected void onDraw(Canvas canvas) {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PRTHeader.java
class PRTHeader (line 23) | public class PRTHeader extends LinearLayout {
method PRTHeader (line 32) | public PRTHeader(Context context) {
method onPullDown (line 73) | public void onPullDown(int percent) {
method onRequest (line 100) | public void onRequest() {
method reverse (line 109) | public void reverse() {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PicViewerPage.java
class PicViewerPage (line 21) | public class PicViewerPage extends OnekeySharePage implements OnGlobalLa...
method PicViewerPage (line 26) | public PicViewerPage(OnekeyShareThemeImpl impl) {
method setImageBitmap (line 31) | public void setImageBitmap(Bitmap pic) {
method onCreate (line 35) | public void onCreate() {
method onGlobalLayout (line 46) | public void onGlobalLayout() {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PlatformPage.java
class PlatformPage (line 34) | public abstract class PlatformPage extends OnekeySharePage {
method PlatformPage (line 45) | public PlatformPage(OnekeyShareThemeImpl impl) {
method onCreate (line 50) | public void onCreate() {
method newAdapter (line 92) | protected abstract PlatformPageAdapter newAdapter(ArrayList<Object> ce...
method collectCells (line 94) | protected ArrayList<Object> collectCells() {
method showEditPage (line 119) | public final void showEditPage(final Platform platform) {
method performCustomLogoClick (line 143) | public final void performCustomLogoClick(final View v, final CustomerL...
method initAnims (line 152) | private void initAnims() {
method onFinish (line 168) | public boolean onFinish() {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PlatformPageAdapter.java
class PlatformPageAdapter (line 31) | public abstract class PlatformPageAdapter extends ViewPagerAdapter imple...
method PlatformPageAdapter (line 51) | public PlatformPageAdapter(PlatformPage page, ArrayList<Object> cells) {
method calculateSize (line 60) | protected abstract void calculateSize(Context context, ArrayList<Objec...
method collectCells (line 63) | protected abstract void collectCells(ArrayList<Object> plats);
method getBottomHeight (line 65) | public int getBottomHeight() {
method getPanelHeight (line 69) | public int getPanelHeight() {
method getCount (line 73) | public int getCount() {
method setIndicator (line 77) | public void setIndicator(IndicatorView view) {
method onScreenChange (line 81) | public void onScreenChange(int currentScreen, int lastScreen) {
method getView (line 88) | public View getView(int index, View convertView, ViewGroup parent) {
method createPanel (line 99) | private View createPanel(Context context) {
method refreshPanel (line 153) | private void refreshPanel(LinearLayout[] llCells, Object[] logos) {
method onClick (line 203) | public void onClick(View v) {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/RotateImageView.java
class RotateImageView (line 16) | public class RotateImageView extends ImageView {
method RotateImageView (line 19) | public RotateImageView(Context context) {
method setRotation (line 23) | public void setRotation(float rotation) {
method onDraw (line 28) | protected void onDraw(Canvas canvas) {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/XView.java
class XView (line 17) | public class XView extends View {
method XView (line 20) | public XView(Context context) {
method setRatio (line 24) | public void setRatio(float ratio) {
method onDraw (line 28) | protected void onDraw(Canvas canvas) {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/EditPageLand.java
class EditPageLand (line 35) | public class EditPageLand extends EditPage implements OnClickListener, T...
method EditPageLand (line 43) | public EditPageLand(OnekeyShareThemeImpl impl) {
method onCreate (line 47) | public void onCreate() {
method initTitle (line 85) | private void initTitle(RelativeLayout rlTitle, float ratio) {
method initBody (line 127) | private void initBody(RelativeLayout rlBody, float ratio) {
method initBottom (line 176) | private void initBottom(LinearLayout llBottom, float ratio) {
method initShadow (line 217) | private void initShadow(LinearLayout llShadow, float ratio) {
method initThumb (line 234) | private void initThumb(AsyncImageView aivThumb) {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/FriendListPageLand.java
class FriendListPageLand (line 17) | public class FriendListPageLand extends FriendListPage {
method FriendListPageLand (line 21) | public FriendListPageLand(OnekeyShareThemeImpl impl) {
method getRatio (line 25) | protected float getRatio() {
method getDesignTitleHeight (line 30) | protected int getDesignTitleHeight() {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/PlatformPageAdapterLand.java
class PlatformPageAdapterLand (line 20) | public class PlatformPageAdapterLand extends PlatformPageAdapter {
method PlatformPageAdapterLand (line 27) | public PlatformPageAdapterLand(PlatformPage page, ArrayList<Object> ce...
method calculateSize (line 31) | protected void calculateSize(Context context, ArrayList<Object> plats) {
method collectCells (line 46) | protected void collectCells(ArrayList<Object> plats) {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/PlatformPageLand.java
class PlatformPageLand (line 18) | public class PlatformPageLand extends PlatformPage {
method PlatformPageLand (line 20) | public PlatformPageLand(OnekeyShareThemeImpl impl) {
method onCreate (line 24) | public void onCreate() {
method newAdapter (line 29) | protected PlatformPageAdapter newAdapter(ArrayList<Object> cells) {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/EditPagePort.java
class EditPagePort (line 33) | public class EditPagePort extends EditPage {
method EditPagePort (line 41) | public EditPagePort(OnekeyShareThemeImpl impl) {
method onCreate (line 45) | public void onCreate() {
method initTitle (line 83) | private void initTitle(RelativeLayout rlTitle, float ratio) {
method initBody (line 125) | private void initBody(RelativeLayout rlBody, float ratio) {
method initBottom (line 173) | private void initBottom(LinearLayout llBottom, float ratio) {
method initShadow (line 214) | private void initShadow(LinearLayout llShadow, float ratio) {
method initThumb (line 231) | private void initThumb(AsyncImageView aivThumb) {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/FriendListPagePort.java
class FriendListPagePort (line 17) | public class FriendListPagePort extends FriendListPage {
method FriendListPagePort (line 21) | public FriendListPagePort(OnekeyShareThemeImpl impl) {
method getRatio (line 25) | protected float getRatio() {
method getDesignTitleHeight (line 30) | protected int getDesignTitleHeight() {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/PlatformPageAdapterPort.java
class PlatformPageAdapterPort (line 20) | public class PlatformPageAdapterPort extends PlatformPageAdapter {
method PlatformPageAdapterPort (line 28) | public PlatformPageAdapterPort(PlatformPage page, ArrayList<Object> ce...
method calculateSize (line 32) | protected void calculateSize(Context context, ArrayList<Object> plats) {
method collectCells (line 52) | protected void collectCells(ArrayList<Object> plats) {
FILE: app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/PlatformPagePort.java
class PlatformPagePort (line 18) | public class PlatformPagePort extends PlatformPage {
method PlatformPagePort (line 20) | public PlatformPagePort(OnekeyShareThemeImpl impl) {
method onCreate (line 24) | public void onCreate() {
method newAdapter (line 29) | protected PlatformPageAdapter newAdapter(ArrayList<Object> cells) {
FILE: app/src/main/java/com/ittianyu/pocenter/common/api/CacheApi.java
type CacheApi (line 17) | public interface CacheApi {
method getList (line 19) | @LifeCache(duration = 15, timeUnit = TimeUnit.MINUTES)
FILE: app/src/main/java/com/ittianyu/pocenter/common/api/RemoteApi.java
type RemoteApi (line 15) | public interface RemoteApi {
type Type (line 16) | interface Type {
type Status (line 29) | interface Status {
method getList (line 44) | @GET("list")
FILE: app/src/main/java/com/ittianyu/pocenter/common/api/Repertories.java
class Repertories (line 32) | public class Repertories {
method Repertories (line 40) | public Repertories(File cacheDir) {
method getList (line 70) | public Observable<List<ProjectBean>> getList(int start, int count, int...
method generateKey (line 88) | @NonNull
method getAllTypes (line 107) | public List<String> getAllTypes() {
method isSettingTypes (line 111) | public boolean isSettingTypes() {
method getTypes (line 119) | public int[] getTypes() {
method setTypes (line 134) | public void setTypes(Set<Integer> set) {
FILE: app/src/main/java/com/ittianyu/pocenter/common/base/BaseActivity.java
class BaseActivity (line 14) | @Lcee(loadingViewId = R.id.v_loading, contentViewId = R.id.v_content, er...
method onStart (line 20) | @Override
method initView (line 37) | protected abstract void initView();
method getErrorMessage (line 39) | @Override
method onSetErrorViewText (line 45) | @Override
FILE: app/src/main/java/com/ittianyu/pocenter/common/base/BaseApplication.java
class BaseApplication (line 21) | public class BaseApplication extends Application {
method onCreate (line 28) | @Override
method tinkerPatchConfig (line 44) | private void tinkerPatchConfig() {
method initLeakCanary (line 63) | private void initLeakCanary() {
method initLogger (line 75) | private void initLogger() {
method getContext (line 83) | public static Context getContext() {
method getRepertories (line 87) | public static Repertories getRepertories() {
method attachBaseContext (line 96) | @Override
FILE: app/src/main/java/com/ittianyu/pocenter/common/base/BaseContract.java
type BaseContract (line 10) | public interface BaseContract {
type View (line 11) | interface View<M> extends MvpLceeView<M> {
method getApp (line 12) | <T> T getApp();
type Presenter (line 15) | interface Presenter<V extends View> extends MvpPresenter<V> {
method getApp (line 16) | BaseApplication getApp();
FILE: app/src/main/java/com/ittianyu/pocenter/common/base/BaseFragment.java
class BaseFragment (line 17) | @Lcee(loadingViewId = R.id.v_loading, contentViewId = R.id.v_content, er...
method setUserVisibleHint (line 25) | @Override
method lazyLoad (line 36) | private void lazyLoad() {
method onViewCreated (line 43) | @Override
method initView (line 55) | protected abstract void initView(View view);
method getErrorMessage (line 57) | @Override
method onSetErrorViewText (line 63) | @Override
method getApp (line 69) | @Override
method showLoading (line 74) | @Override
FILE: app/src/main/java/com/ittianyu/pocenter/common/base/BasePresenter.java
class BasePresenter (line 9) | public class BasePresenter<V extends BaseContract.View>
method attachView (line 14) | @Override
method getApp (line 20) | @Override
FILE: app/src/main/java/com/ittianyu/pocenter/common/bean/ProjectBean.java
class ProjectBean (line 8) | public class ProjectBean {
method toString (line 23) | @Override
FILE: app/src/main/java/com/ittianyu/pocenter/common/tinker/FetchPatchHandler.java
class FetchPatchHandler (line 12) | public class FetchPatchHandler extends Handler {
method fetchPatchWithInterval (line 21) | public void fetchPatchWithInterval(int hour) {
method handleMessage (line 28) | @Override
FILE: app/src/main/java/com/ittianyu/pocenter/common/utils/CollectionUtils.java
class CollectionUtils (line 8) | public class CollectionUtils {
method isEmpty (line 14) | public static boolean isEmpty(Collection collection) {
FILE: app/src/main/java/com/ittianyu/pocenter/common/utils/ConfigUtils.java
class ConfigUtils (line 10) | public class ConfigUtils {
method putString (line 21) | public static void putString(Context context, String key, String value) {
method getString (line 35) | public static String getString(Context context, String key, String def...
method putInt (line 46) | public static void putInt(Context context, String key, int value) {
method getInt (line 60) | public static int getInt(Context context, String key, int defaultValue) {
FILE: app/src/main/java/com/ittianyu/pocenter/common/utils/RxUtils.java
class RxUtils (line 16) | public class RxUtils {
method netScheduler (line 24) | public static <T> ObservableTransformer<T, T> netScheduler() {
method notEmptyOrError (line 39) | public static <T> ObservableTransformer<T, T> notEmptyOrError() {
FILE: app/src/main/java/com/ittianyu/pocenter/common/utils/UnsafeOkHttpUtils.java
class UnsafeOkHttpUtils (line 14) | public class UnsafeOkHttpUtils {
method getClient (line 19) | public static OkHttpClient getClient() {
FILE: app/src/main/java/com/ittianyu/pocenter/features/MainActivity.java
class MainActivity (line 23) | public class MainActivity extends AppCompatActivity {
method onCreate (line 31) | @Override
method initData (line 42) | private void initData() {
method initView (line 51) | private void initView() {
method checkVersion (line 64) | private void checkVersion() {
method onKeyDown (line 68) | @Override
method exit (line 81) | private void exit() {
class VpAdapter (line 94) | private static class VpAdapter extends FragmentPagerAdapter {
method VpAdapter (line 97) | public VpAdapter(FragmentManager fm, List<Fragment> data) {
method getCount (line 102) | @Override
method getItem (line 107) | @Override
method onResume (line 115) | public void onResume() {
method onPause (line 120) | public void onPause() {
FILE: app/src/main/java/com/ittianyu/pocenter/features/SplashActivity.java
class SplashActivity (line 17) | public class SplashActivity extends AppCompatActivity {
method onCreate (line 20) | @Override
method start (line 39) | private void start() {
method onResume (line 52) | public void onResume() {
method onPause (line 56) | public void onPause() {
FILE: app/src/main/java/com/ittianyu/pocenter/features/detail/DetailActivity.java
class DetailActivity (line 21) | public class DetailActivity extends AppCompatActivity {
method onCreate (line 30) | @Override
method onCreateOptionsMenu (line 58) | @Override
method onOptionsItemSelected (line 70) | @Override
method showShare (line 91) | private void showShare() {
method onResume (line 115) | public void onResume() {
method onPause (line 119) | public void onPause() {
FILE: app/src/main/java/com/ittianyu/pocenter/features/find/FindAdapter.java
class FindAdapter (line 17) | public class FindAdapter extends BaseQuickAdapter<ProjectBean, BaseViewH...
method FindAdapter (line 18) | public FindAdapter(List<ProjectBean> data) {
method convert (line 22) | @Override
method transferType (line 39) | private String transferType(int type) {
FILE: app/src/main/java/com/ittianyu/pocenter/features/find/FindContract.java
type FindContract (line 12) | public interface FindContract {
type View (line 13) | interface View extends BaseContract.View<List<ProjectBean>> {
method loadDataError (line 14) | void loadDataError(Throwable e, boolean pullToRefresh);
method loadDataComplete (line 15) | void loadDataComplete();
method loadMore (line 16) | void loadMore();
method addData (line 17) | void addData(List<ProjectBean> data);
method loadMoreError (line 18) | void loadMoreError(Throwable e);
method loadMoreComplete (line 19) | void loadMoreComplete();
type Presenter (line 22) | interface Presenter extends BaseContract.Presenter<View> {
method loadData (line 23) | void loadData(boolean pullToRefresh);
method loadMore (line 24) | void loadMore(int start);
FILE: app/src/main/java/com/ittianyu/pocenter/features/find/FindFragment.java
class FindFragment (line 32) | public class FindFragment extends BaseFragment<SwipeRefreshLayout, List<...
method onCreateView (line 37) | @Nullable
method createPresenter (line 44) | @Override
method initView (line 49) | @Override
method initEvent (line 67) | private void initEvent() {
method loadData (line 112) | @Override
method setData (line 124) | @Override
method loadDataError (line 137) | @Override
method loadDataComplete (line 144) | @Override
method loadMore (line 152) | @Override
method addData (line 161) | @Override
method loadMoreError (line 175) | @Override
method loadMoreComplete (line 183) | @Override
FILE: app/src/main/java/com/ittianyu/pocenter/features/find/FindPresenter.java
class FindPresenter (line 15) | public class FindPresenter extends BasePresenter<FindContract.View> impl...
method loadData (line 18) | @Override
method loadMore (line 35) | @Override
FILE: app/src/main/java/com/ittianyu/pocenter/features/home/HomeAdapter.java
class HomeAdapter (line 17) | public class HomeAdapter extends BaseQuickAdapter<ProjectBean, BaseViewH...
method HomeAdapter (line 18) | public HomeAdapter(List<ProjectBean> data) {
method convert (line 22) | @Override
method transferType (line 39) | private String transferType(int type) {
FILE: app/src/main/java/com/ittianyu/pocenter/features/home/HomeContract.java
type HomeContract (line 12) | public interface HomeContract {
type View (line 13) | interface View extends BaseContract.View<List<ProjectBean>> {
method loadDataError (line 14) | void loadDataError(Throwable e, boolean pullToRefresh);
method loadDataComplete (line 15) | void loadDataComplete();
method loadMore (line 16) | void loadMore();
method addData (line 17) | void addData(List<ProjectBean> data);
method loadMoreError (line 18) | void loadMoreError(Throwable e);
method loadMoreComplete (line 19) | void loadMoreComplete();
type Presenter (line 22) | interface Presenter extends BaseContract.Presenter<View> {
method loadData (line 23) | void loadData(boolean pullToRefresh);
method loadMore (line 24) | void loadMore(int start);
FILE: app/src/main/java/com/ittianyu/pocenter/features/home/HomeFragment.java
class HomeFragment (line 30) | public class HomeFragment extends BaseFragment<SwipeRefreshLayout, List<...
method onCreateView (line 35) | @Nullable
method createPresenter (line 42) | @Override
method initView (line 47) | @Override
method initEvent (line 65) | private void initEvent() {
method loadData (line 102) | @Override
method setData (line 114) | @Override
method loadDataError (line 127) | @Override
method loadDataComplete (line 134) | @Override
method loadMore (line 142) | @Override
method addData (line 151) | @Override
method loadMoreError (line 165) | @Override
method loadMoreComplete (line 173) | @Override
FILE: app/src/main/java/com/ittianyu/pocenter/features/home/HomePresenter.java
class HomePresenter (line 16) | public class HomePresenter extends BasePresenter<HomeContract.View> impl...
method HomePresenter (line 20) | public HomePresenter() {
method loadTypes (line 27) | private void loadTypes() {
method loadData (line 32) | @Override
method loadMore (line 53) | @Override
FILE: app/src/main/java/com/ittianyu/pocenter/features/mime/MimeFragment.java
class MimeFragment (line 24) | public class MimeFragment extends Fragment {
method onCreateView (line 28) | @Nullable
method onViewCreated (line 34) | @Override
method initView (line 42) | private void initView(View view) {
method initEvent (line 46) | private void initEvent() {
FILE: app/src/main/java/com/ittianyu/pocenter/features/search/SearchActivity.java
class SearchActivity (line 33) | @Lcee(loadingViewId = R.id.v_loading, contentViewId = R.id.v_content, er...
method onCreate (line 39) | @Override
method getErrorMessage (line 47) | @Override
method onSetErrorViewText (line 53) | @Override
method showLoading (line 59) | @Override
method createPresenter (line 67) | @Override
method initView (line 72) | protected void initView() {
method initEvent (line 88) | private void initEvent() {
method loadData (line 141) | @Override
method setData (line 153) | @Override
method loadDataError (line 167) | @Override
method loadDataComplete (line 174) | @Override
method loadMore (line 182) | @Override
method addData (line 191) | @Override
method loadMoreError (line 205) | @Override
method loadMoreComplete (line 213) | @Override
method getApp (line 220) | @Override
method onResume (line 226) | public void onResume() {
method onPause (line 230) | public void onPause() {
FILE: app/src/main/java/com/ittianyu/pocenter/features/search/SearchAdapter.java
class SearchAdapter (line 17) | public class SearchAdapter extends BaseQuickAdapter<ProjectBean, BaseVie...
method SearchAdapter (line 18) | public SearchAdapter(List<ProjectBean> data) {
method convert (line 22) | @Override
method transferType (line 39) | private String transferType(int type) {
FILE: app/src/main/java/com/ittianyu/pocenter/features/search/SearchContract.java
type SearchContract (line 12) | public interface SearchContract {
type View (line 13) | interface View extends BaseContract.View<List<ProjectBean>> {
method loadDataError (line 14) | void loadDataError(Throwable e, boolean pullToRefresh);
method loadDataComplete (line 15) | void loadDataComplete();
method loadMore (line 16) | void loadMore();
method addData (line 17) | void addData(List<ProjectBean> data);
method loadMoreError (line 18) | void loadMoreError(Throwable e);
method loadMoreComplete (line 19) | void loadMoreComplete();
type Presenter (line 22) | interface Presenter extends BaseContract.Presenter<View> {
method loadData (line 23) | void loadData(boolean pullToRefresh);
method loadMore (line 24) | void loadMore(int start);
method setSearchString (line 25) | void setSearchString(String search);
FILE: app/src/main/java/com/ittianyu/pocenter/features/search/SearchPresenter.java
class SearchPresenter (line 15) | public class SearchPresenter extends BasePresenter<SearchContract.View> ...
method loadData (line 19) | @Override
method loadMore (line 36) | @Override
method setSearchString (line 53) | @Override
FILE: app/src/main/java/com/ittianyu/pocenter/features/type/TypeActivity.java
class TypeActivity (line 28) | public class TypeActivity extends MvpActivity<TypeContract.View, TypeCon...
method onCreate (line 33) | @Override
method createPresenter (line 44) | @NonNull
method initView (line 50) | private void initView() {
method initEvent (line 55) | private void initEvent() {
method setData (line 76) | @Override
method onCreateOptionsMenu (line 90) | @Override
method onOptionsItemSelected (line 96) | @Override
method cancelAll (line 113) | private void cancelAll() {
method selectAll (line 120) | private void selectAll() {
class MyTagAdapter (line 129) | private static class MyTagAdapter extends TagAdapter<String> {
method MyTagAdapter (line 131) | public MyTagAdapter(List<String> data) {
method getView (line 135) | @Override
method onResume (line 144) | public void onResume() {
method onPause (line 148) | public void onPause() {
FILE: app/src/main/java/com/ittianyu/pocenter/features/type/TypeContract.java
type TypeContract (line 12) | public interface TypeContract {
type View (line 13) | interface View extends MvpView {
method setData (line 14) | void setData(List<String> data, int[] types);
type Presenter (line 17) | interface Presenter extends MvpPresenter<View> {
method loadData (line 18) | void loadData();
method isFirstSetting (line 19) | boolean isFirstSetting();
FILE: app/src/main/java/com/ittianyu/pocenter/features/type/TypePresenter.java
class TypePresenter (line 13) | public class TypePresenter extends MvpNullObjectBasePresenter<TypeContra...
method loadData (line 16) | @Override
method isFirstSetting (line 27) | @Override
FILE: app/src/main/java/com/ittianyu/pocenter/features/version/CheckVersionService.java
class CheckVersionService (line 14) | public class CheckVersionService extends AVersionService {
method CheckVersionService (line 19) | public CheckVersionService() {
method onStartCommand (line 23) | @Override
method onBind (line 29) | @Override
method onResponses (line 34) | @Override
FILE: app/src/main/java/com/ittianyu/pocenter/features/version/VersionBean.java
class VersionBean (line 7) | public class VersionBean {
FILE: app/src/main/java/com/ittianyu/pocenter/features/version/VersionUtils.java
class VersionUtils (line 12) | public class VersionUtils {
method check (line 17) | public static void check(Context context) {
method check (line 26) | public static void check(Context context, boolean showLast) {
FILE: app/src/main/java/com/ittianyu/pocenter/features/wxapi/WXEntryActivity.java
class WXEntryActivity (line 18) | public class WXEntryActivity extends WechatHandlerActivity {
method onGetMessageFromWXReq (line 27) | public void onGetMessageFromWXReq(WXMediaMessage msg) {
method onShowMessageFromWXReq (line 44) | public void onShowMessageFromWXReq(WXMediaMessage msg) {
FILE: app/src/test/java/com/ittianyu/pocenter/ExampleUnitTest.java
class ExampleUnitTest (line 24) | public class ExampleUnitTest {
type RemoteApi (line 30) | interface RemoteApi {
method getList (line 31) | @GET("list")
method testSearch (line 38) | @Test
method addition_isCorrect (line 63) | @Test
Condensed preview — 148 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (343K chars).
[
{
"path": ".gitignore",
"chars": 118,
"preview": "*.iml\n.gradle\n/local.properties\n/.idea/workspace.xml\n/.idea/libraries\n.DS_Store\n/build\n/captures\n.externalNativeBuild\n"
},
{
"path": "LICENSE",
"chars": 1065,
"preview": "MIT License\n\nCopyright (c) 2017 ittianyu\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\no"
},
{
"path": "README.md",
"chars": 3898,
"preview": "## 外包集中营 ##\n\n整合多个软件外包平台项目信息,替你筛选优质项目\n\n ![api "
},
{
"path": "app/.gitignore",
"chars": 7,
"preview": "/build\n"
},
{
"path": "app/build.gradle",
"chars": 3814,
"preview": "apply plugin: 'com.android.application'\n\nandroid {\n// signingConfigs {\n// release {\n// keyAlias 'po"
},
{
"path": "app/proguard-rules.pro",
"chars": 3714,
"preview": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in E:"
},
{
"path": "app/src/androidTest/java/com/ittianyu/pocenter/ExampleInstrumentedTest.java",
"chars": 746,
"preview": "package com.ittianyu.pocenter;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimp"
},
{
"path": "app/src/main/AndroidManifest.xml",
"chars": 3388,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:to"
},
{
"path": "app/src/main/assets/ShareSDK.xml",
"chars": 9840,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<DevInfor>\n <!--\n \t说明:\n \t\n \t1、表格中的第一项\n \t\t<ShareSDK \n \t\tAppK"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/CustomerLogo.java",
"chars": 446,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/OnekeyShare.java",
"chars": 7267,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/OnekeySharePage.java",
"chars": 1786,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/OnekeyShareTheme.java",
"chars": 910,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/OnekeyShareThemeImpl.java",
"chars": 13332,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/ShareContentCustomizeCallback.java",
"chars": 481,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/ClassicTheme.java",
"chars": 1590,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/EditPage.java",
"chars": 6643,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/FriendAdapter.java",
"chars": 8650,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/FriendListItem.java",
"chars": 3108,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/FriendListPage.java",
"chars": 6308,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/IndicatorView.java",
"chars": 1746,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PRTHeader.java",
"chars": 3426,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PicViewerPage.java",
"chars": 1453,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PlatformPage.java",
"chars": 5553,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/PlatformPageAdapter.java",
"chars": 6734,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/RotateImageView.java",
"chars": 749,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/XView.java",
"chars": 1134,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/EditPageLand.java",
"chars": 9573,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/FriendListPageLand.java",
"chars": 886,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/PlatformPageAdapterLand.java",
"chars": 2135,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/land/PlatformPageLand.java",
"chars": 828,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/EditPagePort.java",
"chars": 9461,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/FriendListPagePort.java",
"chars": 885,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/PlatformPageAdapterPort.java",
"chars": 2311,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/cn/sharesdk/onekeyshare/themes/classic/port/PlatformPagePort.java",
"chars": 826,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/common/api/CacheApi.java",
"chars": 544,
"preview": "package com.ittianyu.pocenter.common.api;\n\nimport com.ittianyu.pocenter.common.bean.ProjectBean;\n\nimport java.util.List;"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/common/api/RemoteApi.java",
"chars": 1250,
"preview": "package com.ittianyu.pocenter.common.api;\n\nimport com.ittianyu.pocenter.common.bean.ProjectBean;\n\nimport java.util.List;"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/common/api/Repertories.java",
"chars": 5450,
"preview": "package com.ittianyu.pocenter.common.api;\n\nimport android.content.Context;\nimport android.support.annotation.NonNull;\nim"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/common/base/BaseActivity.java",
"chars": 1518,
"preview": "package com.ittianyu.pocenter.common.base;\n\nimport android.view.View;\nimport android.widget.TextView;\n\nimport com.ittian"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/common/base/BaseApplication.java",
"chars": 2883,
"preview": "package com.ittianyu.pocenter.common.base;\n\nimport android.app.Application;\nimport android.content.Context;\nimport andro"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/common/base/BaseContract.java",
"chars": 397,
"preview": "package com.ittianyu.pocenter.common.base;\n\nimport com.hannesdorfmann.mosby.mvp.MvpPresenter;\nimport com.ittianyu.mvp.lc"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/common/base/BaseFragment.java",
"chars": 2427,
"preview": "package com.ittianyu.pocenter.common.base;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/common/base/BasePresenter.java",
"chars": 580,
"preview": "package com.ittianyu.pocenter.common.base;\n\nimport com.hannesdorfmann.mosby.mvp.MvpNullObjectBasePresenter;\n\n/**\n * Crea"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/common/bean/ProjectBean.java",
"chars": 1031,
"preview": "package com.ittianyu.pocenter.common.bean;\n\nimport java.sql.Timestamp;\n\n/**\n * Created by yu on 2017/1/14.\n */\npublic cl"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/common/tinker/FetchPatchHandler.java",
"chars": 931,
"preview": "package com.ittianyu.pocenter.common.tinker;\n\nimport android.os.Handler;\nimport android.os.Message;\n\nimport com.tinkerpa"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/common/utils/CollectionUtils.java",
"chars": 450,
"preview": "package com.ittianyu.pocenter.common.utils;\n\nimport java.util.Collection;\n\n/**\n * Created by yu on 2017/1/17.\n */\npublic"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/common/utils/ConfigUtils.java",
"chars": 2020,
"preview": "package com.ittianyu.pocenter.common.utils;\n\nimport android.content.Context;\nimport android.content.SharedPreferences;\n\n"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/common/utils/RxUtils.java",
"chars": 1551,
"preview": "package com.ittianyu.pocenter.common.utils;\n\n\nimport java.util.NoSuchElementException;\n\nimport io.reactivex.Observable;\n"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/common/utils/UnsafeOkHttpUtils.java",
"chars": 2198,
"preview": "package com.ittianyu.pocenter.common.utils;\n\nimport javax.net.ssl.HostnameVerifier;\nimport javax.net.ssl.SSLContext;\nimp"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/MainActivity.java",
"chars": 3361,
"preview": "package com.ittianyu.pocenter.features;\n\nimport android.databinding.DataBindingUtil;\nimport android.os.Bundle;\nimport an"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/SplashActivity.java",
"chars": 1742,
"preview": "package com.ittianyu.pocenter.features;\n\nimport android.content.Intent;\nimport android.os.Bundle;\nimport android.support"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/detail/DetailActivity.java",
"chars": 3682,
"preview": "package com.ittianyu.pocenter.features.detail;\n\nimport android.content.Intent;\nimport android.databinding.DataBindingUti"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/find/FindAdapter.java",
"chars": 1725,
"preview": "package com.ittianyu.pocenter.features.find;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.chad.lib"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/find/FindContract.java",
"chars": 718,
"preview": "package com.ittianyu.pocenter.features.find;\n\nimport com.ittianyu.pocenter.common.base.BaseContract;\nimport com.ittianyu"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/find/FindFragment.java",
"chars": 6104,
"preview": "package com.ittianyu.pocenter.features.find;\n\nimport android.content.Intent;\nimport android.databinding.DataBindingUtil;"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/find/FindPresenter.java",
"chars": 1899,
"preview": "package com.ittianyu.pocenter.features.find;\n\nimport com.ittianyu.pocenter.common.api.RemoteApi;\nimport com.ittianyu.poc"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/home/HomeAdapter.java",
"chars": 1723,
"preview": "package com.ittianyu.pocenter.features.home;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.chad.lib"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/home/HomeContract.java",
"chars": 718,
"preview": "package com.ittianyu.pocenter.features.home;\n\nimport com.ittianyu.pocenter.common.base.BaseContract;\nimport com.ittianyu"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/home/HomeFragment.java",
"chars": 5737,
"preview": "package com.ittianyu.pocenter.features.home;\n\nimport android.content.Intent;\nimport android.databinding.DataBindingUtil;"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/home/HomePresenter.java",
"chars": 2322,
"preview": "package com.ittianyu.pocenter.features.home;\n\nimport com.ittianyu.pocenter.common.api.RemoteApi;\nimport com.ittianyu.poc"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/mime/MimeFragment.java",
"chars": 2388,
"preview": "package com.ittianyu.pocenter.features.mime;\n\nimport android.content.Context;\nimport android.content.Intent;\nimport andr"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/search/SearchActivity.java",
"chars": 7390,
"preview": "package com.ittianyu.pocenter.features.search;\n\nimport android.content.Intent;\nimport android.databinding.DataBindingUti"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/search/SearchAdapter.java",
"chars": 1735,
"preview": "package com.ittianyu.pocenter.features.search;\n\nimport com.chad.library.adapter.base.BaseQuickAdapter;\nimport com.chad.l"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/search/SearchContract.java",
"chars": 767,
"preview": "package com.ittianyu.pocenter.features.search;\n\nimport com.ittianyu.pocenter.common.base.BaseContract;\nimport com.ittian"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/search/SearchPresenter.java",
"chars": 2117,
"preview": "package com.ittianyu.pocenter.features.search;\n\nimport com.ittianyu.pocenter.common.api.RemoteApi;\nimport com.ittianyu.p"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/type/TypeActivity.java",
"chars": 4318,
"preview": "package com.ittianyu.pocenter.features.type;\n\nimport android.content.Intent;\nimport android.databinding.DataBindingUtil;"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/type/TypeContract.java",
"chars": 456,
"preview": "package com.ittianyu.pocenter.features.type;\n\nimport com.hannesdorfmann.mosby.mvp.MvpPresenter;\nimport com.hannesdorfman"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/type/TypePresenter.java",
"chars": 857,
"preview": "package com.ittianyu.pocenter.features.type;\n\nimport com.hannesdorfmann.mosby.mvp.MvpNullObjectBasePresenter;\nimport com"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/version/CheckVersionService.java",
"chars": 1659,
"preview": "package com.ittianyu.pocenter.features.version;\n\nimport android.content.Intent;\nimport android.os.IBinder;\nimport androi"
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/version/VersionBean.java",
"chars": 450,
"preview": "package com.ittianyu.pocenter.features.version;\n\n/**\n * Created by yu on 2017/1/19.\n */\n\npublic class VersionBean {\n "
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/version/VersionUtils.java",
"chars": 1382,
"preview": "package com.ittianyu.pocenter.features.version;\n\nimport android.content.Context;\nimport android.content.Intent;\n\nimport "
},
{
"path": "app/src/main/java/com/ittianyu/pocenter/features/wxapi/WXEntryActivity.java",
"chars": 1440,
"preview": "/*\n * 官网地站:http://www.mob.com\n * 技术支持QQ: 4006852216\n * 官方微信:ShareSDK (如果发布新版本的话,我们将会第一时间通过微信将版本更新内容推送给您。如果使用过程中有任何问题,也"
},
{
"path": "app/src/main/res/color/selector_item_color.xml",
"chars": 319,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <item a"
},
{
"path": "app/src/main/res/drawable/ic_about.xml",
"chars": 799,
"preview": "<vector android:height=\"24dp\" android:viewportHeight=\"1024.0\"\n android:viewportWidth=\"1024.0\" android:width=\"24dp\" xm"
},
{
"path": "app/src/main/res/drawable/ic_cycle.xml",
"chars": 1352,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"20dp\"\n android:height=\"20dp\"\n "
},
{
"path": "app/src/main/res/drawable/ic_date.xml",
"chars": 1730,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"20dp\"\n android:height=\"20dp\"\n "
},
{
"path": "app/src/main/res/drawable/ic_empty.xml",
"chars": 1708,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"128dp\"\n android:height=\"128dp\"\n"
},
{
"path": "app/src/main/res/drawable/ic_error.xml",
"chars": 4953,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"128dp\"\n android:height=\"128dp\"\n"
},
{
"path": "app/src/main/res/drawable/ic_find.xml",
"chars": 733,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\"24dp\"\n "
},
{
"path": "app/src/main/res/drawable/ic_github.xml",
"chars": 1112,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"64dp\"\n android:height=\"64dp\"\n "
},
{
"path": "app/src/main/res/drawable/ic_home.xml",
"chars": 1368,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\"24dp\"\n "
},
{
"path": "app/src/main/res/drawable/ic_logo.xml",
"chars": 4405,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"93dp\"\n android:height=\""
},
{
"path": "app/src/main/res/drawable/ic_mine.xml",
"chars": 654,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\"24dp\"\n "
},
{
"path": "app/src/main/res/drawable/ic_people.xml",
"chars": 792,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"20dp\"\n android:height=\"20dp\"\n "
},
{
"path": "app/src/main/res/drawable/ic_share.xml",
"chars": 848,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\"24dp\"\n "
},
{
"path": "app/src/main/res/drawable/ic_type.xml",
"chars": 749,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\"24dp\"\n "
},
{
"path": "app/src/main/res/drawable/ic_version_check.xml",
"chars": 1272,
"preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:width=\"24dp\"\n android:height=\"24dp\"\n "
},
{
"path": "app/src/main/res/drawable/selector_button.xml",
"chars": 274,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <item a"
},
{
"path": "app/src/main/res/drawable/selector_item.xml",
"chars": 251,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <item a"
},
{
"path": "app/src/main/res/drawable/selector_type.xml",
"chars": 280,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <item a"
},
{
"path": "app/src/main/res/drawable/shape_button_normal.xml",
"chars": 202,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <solid and"
},
{
"path": "app/src/main/res/drawable/shape_button_pressed.xml",
"chars": 204,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <solid and"
},
{
"path": "app/src/main/res/drawable/shape_drive_line.xml",
"chars": 201,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <solid and"
},
{
"path": "app/src/main/res/drawable/shape_type_checked.xml",
"chars": 273,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <solid and"
},
{
"path": "app/src/main/res/drawable/shape_type_normal.xml",
"chars": 203,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <solid and"
},
{
"path": "app/src/main/res/drawable/ssdk_oks_classic_platform_cell_back.xml",
"chars": 311,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<selector xmlns:android=\"http://schemas.android.com/apk/res/android\" >\n\t<item and"
},
{
"path": "app/src/main/res/drawable/ssdk_oks_classic_progressbar.xml",
"chars": 682,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<rotate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n\t android:f"
},
{
"path": "app/src/main/res/drawable-v21/selector_button.xml",
"chars": 223,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:co"
},
{
"path": "app/src/main/res/drawable-v21/selector_item.xml",
"chars": 207,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n android:co"
},
{
"path": "app/src/main/res/layout/act_detail.xml",
"chars": 1361,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:app="
},
{
"path": "app/src/main/res/layout/act_main.xml",
"chars": 1265,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:app="
},
{
"path": "app/src/main/res/layout/act_search.xml",
"chars": 1996,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:app="
},
{
"path": "app/src/main/res/layout/act_splash.xml",
"chars": 1189,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "app/src/main/res/layout/act_type.xml",
"chars": 1965,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout>\n\n <data></data>\n\n <RelativeLayout xmlns:android=\"http://schemas.an"
},
{
"path": "app/src/main/res/layout/frag_find.xml",
"chars": 1755,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n <data></"
},
{
"path": "app/src/main/res/layout/frag_home.xml",
"chars": 1848,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:app="
},
{
"path": "app/src/main/res/layout/frag_mime.xml",
"chars": 4756,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:app="
},
{
"path": "app/src/main/res/layout/item_find.xml",
"chars": 4969,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andr"
},
{
"path": "app/src/main/res/layout/item_home.xml",
"chars": 5825,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmln"
},
{
"path": "app/src/main/res/layout/item_search.xml",
"chars": 5135,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.v7.widget.CardView xmlns:android=\"http://schemas.android.com/apk"
},
{
"path": "app/src/main/res/layout/view_empty.xml",
"chars": 829,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "app/src/main/res/layout/view_error.xml",
"chars": 999,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "app/src/main/res/layout/view_loading.xml",
"chars": 813,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xm"
},
{
"path": "app/src/main/res/layout/view_search.xml",
"chars": 928,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n andr"
},
{
"path": "app/src/main/res/layout/view_type.xml",
"chars": 619,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<CheckedTextView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n a"
},
{
"path": "app/src/main/res/menu/menu_detail.xml",
"chars": 591,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:app=\"h"
},
{
"path": "app/src/main/res/menu/menu_navigation.xml",
"chars": 533,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\">\n <item\n "
},
{
"path": "app/src/main/res/menu/menu_type.xml",
"chars": 425,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<menu xmlns:android=\"http://schemas.android.com/apk/res/android\"\n xmlns:app=\"h"
},
{
"path": "app/src/main/res/values/colors.xml",
"chars": 545,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <color name=\"colorPrimary\">#03A9F4</color>\n <color name=\"color"
},
{
"path": "app/src/main/res/values/dimens.xml",
"chars": 260,
"preview": "<resources>\n <!-- Default screen margins, per the Android Design guidelines. -->\n <dimen name=\"activity_horizontal"
},
{
"path": "app/src/main/res/values/ssdk_instapaper_strings.xml",
"chars": 1904,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<resources>\n <string name=\"ssdk_instapager_login_html\" formatted=\"false\" tran"
},
{
"path": "app/src/main/res/values/ssdk_oks_color_drawables.xml",
"chars": 228,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <drawable name=\"ssdk_oks_classic_platfrom_cell_back_nor\">#fffffff"
},
{
"path": "app/src/main/res/values/ssdk_oks_strings.xml",
"chars": 703,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"ssdk_oks_share\">分享</string>\n <string name=\"ssdk_"
},
{
"path": "app/src/main/res/values/ssdk_strings.xml",
"chars": 4265,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"ssdk_weibo_oauth_regiseter\">应用授权</string>\n <stri"
},
{
"path": "app/src/main/res/values/strings.xml",
"chars": 2556,
"preview": "<resources>\n <string name=\"app_name\" translatable=\"false\">外包集中营</string>\n <string name=\"no_data\" translatable=\"fal"
},
{
"path": "app/src/main/res/values/styles.xml",
"chars": 1541,
"preview": "<resources>\n\n <!-- Base application theme. -->\n <!--<style name=\"AppTheme\" parent=\"Theme.AppCompat.Light.DarkActio"
},
{
"path": "app/src/main/res/values/values.xml",
"chars": 219,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <item name=\"v_content\" type=\"id\" />\n <item name=\"v_loading\" ty"
},
{
"path": "app/src/main/res/values-en/ssdk_oks_strings.xml",
"chars": 842,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"ssdk_oks_share\">Share</string>\n <string name=\"ss"
},
{
"path": "app/src/main/res/values-en/ssdk_strings.xml",
"chars": 4783,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <string name=\"ssdk_weibo_oauth_regiseter\">Authorization</string>\n"
},
{
"path": "app/src/main/res/values-w820dp/dimens.xml",
"chars": 358,
"preview": "<resources>\n <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n (such as s"
},
{
"path": "app/src/test/java/com/ittianyu/pocenter/ExampleUnitTest.java",
"chars": 2378,
"preview": "package com.ittianyu.pocenter;\n\nimport com.ittianyu.pocenter.common.utils.UnsafeOkHttpUtils;\nimport com.jakewharton.retr"
},
{
"path": "app/tinkerpatch.gradle",
"chars": 3080,
"preview": "apply plugin: 'tinkerpatch-support'\n\ndef bakPath = file(\"${buildDir}/bakApk/\")\n\ndef baseInfo = \"app-0115-23-11-20\"\ndef v"
},
{
"path": "build.gradle",
"chars": 639,
"preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n r"
},
{
"path": "gradle/wrapper/gradle-wrapper.properties",
"chars": 233,
"preview": "#Mon Dec 28 10:00:20 PST 2015\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
},
{
"path": "gradle.properties",
"chars": 730,
"preview": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will o"
},
{
"path": "gradlew",
"chars": 4971,
"preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n## Gradle start "
},
{
"path": "gradlew.bat",
"chars": 2314,
"preview": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem "
},
{
"path": "settings.gradle",
"chars": 15,
"preview": "include ':app'\n"
}
]
// ... and 10 more files (download for full content)
About this extraction
This page contains the full source code of the ittianyu/POCenter GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 148 files (292.2 KB), approximately 90.9k tokens, and a symbol index with 460 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.