;
}
--keep class rx.schedulers.Schedulers {
+-keep class io.reactivex.schedulers.Schedulers {
public static ** test();
}
--keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
+-keepclassmembers class io.reactivex.internal.util.unsafe.*ArrayQueue*Field* {
long producerIndex;
long consumerIndex;
}
--keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
+-keepclassmembers class io.reactivex.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
long producerNode;
long consumerNode;
}
--keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
- rx.internal.util.atomic.LinkedQueueNode producerNode;
+-keepclassmembers class io.reactivex.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
+ io.reactivex.internal.util.atomic.LinkedQueueNode producerNode;
}
--keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
- rx.internal.util.atomic.LinkedQueueNode consumerNode;
+-keepclassmembers class io.reactivex.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
+ io.reactivex.internal.util.atomic.LinkedQueueNode consumerNode;
}
--dontwarn rx.internal.util.unsafe.**
-
-
+-dontwarn io.reactivex.internal.util.unsafe.**
-################nineoldandroids###############
--keep class com.nineoldandroids.animation.** { *; }
--keep interface com.nineoldandroids.animation.** { *; }
--keep class com.nineoldandroids.view.** { *; }
--keep interface com.nineoldandroids.view.** { *; }
-
-################epresso###############
+################espresso###############
-keep class android.support.test.espresso.** { *; }
-keep interface android.support.test.espresso.** { *; }
-################autobahn###############
--keep class de.tavendo.autobahn.** { *; }
--keep interface de.tavendo.autobahn.** { *; }
-
-
-################shareSdk###############
--keep class cn.sharesdk.** { *; }
--keep interface cn.sharesdk.** { *; }
-
-################crop###############
--keep class com.soundcloud.android.** { *; }
--keep interface com.soundcloud.android.** { *; }
-
################annotation###############
-keep class android.support.annotation.** { *; }
-keep interface android.support.annotation.** { *; }
-################pickerview###############
--keep class com.bigkoo.pickerview.** { *; }
--keep interface com.bigkoo.pickerview.** { *; }
-
-################carousellayoutmanager###############
--keep class com.azoft.carousellayoutmanager.** { *; }
--keep interface com.azoft.carousellayoutmanager.** { *; }
-
-################messagepack###############
--keep class org.** { *; }
--keep interface org.** { *; }
+################RxLifeCycle#################
+-keep class com.trello.rxlifecycle2.** { *; }
+-keep interface com.trello.rxlifecycle2.** { *; }
-################javassist###############
--keep class javassist.** { *; }
--keep interface javassist.** { *; }
-################RxLifeCycle#################
--keep class com.trello.rxlifecycle.** { *; }
--keep interface com.trello.rxlifecycle.** { *; }
+################RxPermissions#################
+-keep class com.tbruyelle.rxpermissions2.** { *; }
+-keep interface com.tbruyelle.rxpermissions2.** { *; }
################RxCache#################
--dontwarn io.rx_cache.internal.**
--keep class io.rx_cache.internal.Record { *; }
--keep class io.rx_cache.Source { *; }
+-dontwarn io.rx_cache2.internal.**
+-keep class io.rx_cache2.internal.Record { *; }
+-keep class io.rx_cache2.Source { *; }
-keep class io.victoralbertos.jolyglot.** { *; }
-keep interface io.victoralbertos.jolyglot.** { *; }
diff --git a/arms/src/main/java/com/jess/arms/base/BaseActivity.java b/arms/src/main/java/com/jess/arms/base/BaseActivity.java
index c8ceb6203..22a3e7377 100644
--- a/arms/src/main/java/com/jess/arms/base/BaseActivity.java
+++ b/arms/src/main/java/com/jess/arms/base/BaseActivity.java
@@ -12,6 +12,9 @@
import javax.inject.Inject;
+import butterknife.ButterKnife;
+import butterknife.Unbinder;
+
import static com.jess.arms.utils.ThirdViewUtil.convertAutoView;
/**
@@ -20,6 +23,7 @@
*/
public abstract class BaseActivity extends RxAppCompatActivity implements IActivity {
protected final String TAG = this.getClass().getSimpleName();
+ private Unbinder mUnbinder;
@Inject
protected P mPresenter;
@@ -32,13 +36,27 @@ public View onCreateView(String name, Context context, AttributeSet attrs) {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ try {
+ int layoutResID = initView(savedInstanceState);
+ if (layoutResID != 0) {//如果initView返回0,框架则不会调用setContentView(),当然也不会 Bind ButterKnife
+ setContentView(layoutResID);
+ //绑定到butterknife
+ mUnbinder = ButterKnife.bind(this);
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
initData(savedInstanceState);
}
@Override
protected void onDestroy() {
super.onDestroy();
- if (mPresenter != null) mPresenter.onDestroy();//释放资源
+ if (mUnbinder != null && mUnbinder != Unbinder.EMPTY)
+ mUnbinder.unbind();
+ this.mUnbinder = null;
+ if (mPresenter != null)
+ mPresenter.onDestroy();//释放资源
this.mPresenter = null;
}
diff --git a/arms/src/main/java/com/jess/arms/base/BaseApplication.java b/arms/src/main/java/com/jess/arms/base/BaseApplication.java
index 7c7f20c71..7243513c5 100644
--- a/arms/src/main/java/com/jess/arms/base/BaseApplication.java
+++ b/arms/src/main/java/com/jess/arms/base/BaseApplication.java
@@ -1,8 +1,10 @@
package com.jess.arms.base;
import android.app.Application;
+import android.content.Context;
import com.jess.arms.base.delegate.AppDelegate;
+import com.jess.arms.base.delegate.AppLifecycles;
import com.jess.arms.di.component.AppComponent;
/**
@@ -16,14 +18,25 @@
* 请配合官方wiki文档https://github.com/JessYanCoding/MVPArms/wiki,学习本框架
*/
public class BaseApplication extends Application implements App {
- private AppDelegate mAppDelegate;
+ private AppLifecycles mAppDelegate;
+ /**
+ * 这里会在 {@link BaseApplication#onCreate} 之前被调用,可以做一些较早的初始化
+ * 常用于 MultiDex 以及插件化框架的初始化
+ *
+ * @param base
+ */
+ @Override
+ protected void attachBaseContext(Context base) {
+ super.attachBaseContext(base);
+ this.mAppDelegate = new AppDelegate(base);
+ this.mAppDelegate.attachBaseContext(base);
+ }
@Override
public void onCreate() {
super.onCreate();
- this.mAppDelegate = new AppDelegate(this);
- this.mAppDelegate.onCreate();
+ this.mAppDelegate.onCreate(this);
}
/**
@@ -33,10 +46,9 @@ public void onCreate() {
public void onTerminate() {
super.onTerminate();
if (mAppDelegate != null)
- this.mAppDelegate.onTerminate();
+ this.mAppDelegate.onTerminate(this);
}
-
/**
* 将AppComponent返回出去,供其它地方使用, AppComponent接口中声明的方法返回的实例,在getAppComponent()拿到对象后都可以直接使用
*
@@ -44,7 +56,7 @@ public void onTerminate() {
*/
@Override
public AppComponent getAppComponent() {
- return mAppDelegate.getAppComponent();
+ return ((App) mAppDelegate).getAppComponent();
}
}
diff --git a/arms/src/main/java/com/jess/arms/base/delegate/ActivityDelegateImpl.java b/arms/src/main/java/com/jess/arms/base/delegate/ActivityDelegateImpl.java
index fd8264635..366a10222 100644
--- a/arms/src/main/java/com/jess/arms/base/delegate/ActivityDelegateImpl.java
+++ b/arms/src/main/java/com/jess/arms/base/delegate/ActivityDelegateImpl.java
@@ -8,9 +8,6 @@
import org.simple.eventbus.EventBus;
-import butterknife.ButterKnife;
-import butterknife.Unbinder;
-
/**
* Created by jess on 26/04/2017 20:23
* Contact with jess.yan.effort@gmail.com
@@ -19,7 +16,6 @@
public class ActivityDelegateImpl implements ActivityDelegate {
private Activity mActivity;
private IActivity iActivity;
- private Unbinder mUnbinder;
public ActivityDelegateImpl(Activity activity) {
this.mActivity = activity;
@@ -31,15 +27,6 @@ public void onCreate(Bundle savedInstanceState) {
if (iActivity.useEventBus())//如果要使用eventbus请将此方法返回true
EventBus.getDefault().register(mActivity);//注册到事件主线
iActivity.setupActivityComponent(((App) mActivity.getApplication()).getAppComponent());//依赖注入
- try {
- int layoutResID = iActivity.initView(savedInstanceState);
- if (layoutResID != 0)//如果initView返回0,框架则不会调用setContentView()
- mActivity.setContentView(layoutResID);
- } catch (Exception e) {
- e.printStackTrace();
- }
- //绑定到butterknife
- mUnbinder = ButterKnife.bind(mActivity);
}
@Override
@@ -69,10 +56,8 @@ public void onSaveInstanceState(Bundle outState) {
@Override
public void onDestroy() {
- if (mUnbinder != Unbinder.EMPTY) mUnbinder.unbind();
- if (iActivity.useEventBus())//如果要使用eventbus请将此方法返回true
+ if (iActivity != null && iActivity.useEventBus())//如果要使用eventbus请将此方法返回true
EventBus.getDefault().unregister(mActivity);
- this.mUnbinder = null;
this.iActivity = null;
this.mActivity = null;
}
@@ -90,7 +75,6 @@ public void writeToParcel(Parcel dest, int flags) {
protected ActivityDelegateImpl(Parcel in) {
this.mActivity = in.readParcelable(Activity.class.getClassLoader());
this.iActivity = in.readParcelable(IActivity.class.getClassLoader());
- this.mUnbinder = in.readParcelable(Unbinder.class.getClassLoader());
}
public static final Creator CREATOR = new Creator() {
diff --git a/arms/src/main/java/com/jess/arms/base/delegate/AppDelegate.java b/arms/src/main/java/com/jess/arms/base/delegate/AppDelegate.java
index 22ee7c37f..e8d9ef1be 100644
--- a/arms/src/main/java/com/jess/arms/base/delegate/AppDelegate.java
+++ b/arms/src/main/java/com/jess/arms/base/delegate/AppDelegate.java
@@ -2,6 +2,7 @@
import android.app.Application;
import android.content.ComponentCallbacks2;
+import android.content.Context;
import android.content.res.Configuration;
import com.jess.arms.base.App;
@@ -22,35 +23,41 @@
/**
* AppDelegate可以代理Application的生命周期,在对应的生命周期,执行对应的逻辑,因为Java只能单继承
- * 而我的框架要求Application要继承于BaseApplication
- * 所以当遇到某些三方库需要继承于它的Application的时候,就只有自定义Application继承于三方库的Application
- * 再将BaseApplication的代码复制进去,而现在就不用再复制代码,只用在对应的生命周期调用AppDelegate对应的方法(Application一定要实现APP接口)
+ * 所以当遇到某些三方库需要继承于它的Application的时候,就只有自定义Application并继承于三方库的Application,这时就不用再继承BaseApplication
+ * 只用在自定义Application中对应的生命周期调用AppDelegate对应的方法(Application一定要实现APP接口),框架就能照常运行
*
* Created by jess on 24/04/2017 09:44
* Contact with jess.yan.effort@gmail.com
*/
-public class AppDelegate implements App {
+public class AppDelegate implements App, AppLifecycles {
private Application mApplication;
private AppComponent mAppComponent;
@Inject
protected ActivityLifecycle mActivityLifecycle;
private final List mModules;
- private List mAppLifecycles = new ArrayList<>();
+ private List mAppLifecycles = new ArrayList<>();
private List mActivityLifecycles = new ArrayList<>();
private ComponentCallbacks2 mComponentCallback;
- public AppDelegate(Application application) {
- this.mApplication = application;
- this.mModules = new ManifestParser(mApplication).parse();
+ public AppDelegate(Context context) {
+ this.mModules = new ManifestParser(context).parse();
for (ConfigModule module : mModules) {
- module.injectAppLifecycle(mApplication, mAppLifecycles);
- module.injectActivityLifecycle(mApplication, mActivityLifecycles);
+ module.injectAppLifecycle(context, mAppLifecycles);
+ module.injectActivityLifecycle(context, mActivityLifecycles);
}
}
+ @Override
+ public void attachBaseContext(Context base) {
+ for (AppLifecycles lifecycle : mAppLifecycles) {
+ lifecycle.attachBaseContext(base);
+ }
+ }
- public void onCreate() {
+ @Override
+ public void onCreate(Application application) {
+ this.mApplication = application;
mAppComponent = DaggerAppComponent
.builder()
.appModule(new AppModule(mApplication))//提供application
@@ -67,11 +74,7 @@ public void onCreate() {
mApplication.registerActivityLifecycleCallbacks(lifecycle);
}
- for (ConfigModule module : mModules) {
- module.registerComponents(mApplication, mAppComponent.repositoryManager());
- }
-
- for (Lifecycle lifecycle : mAppLifecycles) {
+ for (AppLifecycles lifecycle : mAppLifecycles) {
lifecycle.onCreate(mApplication);
}
@@ -81,8 +84,8 @@ public void onCreate() {
}
-
- public void onTerminate() {
+ @Override
+ public void onTerminate(Application application) {
if (mActivityLifecycle != null) {
mApplication.unregisterActivityLifecycleCallbacks(mActivityLifecycle);
}
@@ -95,7 +98,7 @@ public void onTerminate() {
}
}
if (mAppLifecycles != null && mAppLifecycles.size() > 0) {
- for (Lifecycle lifecycle : mAppLifecycles) {
+ for (AppLifecycles lifecycle : mAppLifecycles) {
lifecycle.onTerminate(mApplication);
}
}
@@ -114,7 +117,7 @@ public void onTerminate() {
*
* @return
*/
- private GlobalConfigModule getGlobalConfigModule(Application context, List modules) {
+ private GlobalConfigModule getGlobalConfigModule(Context context, List modules) {
GlobalConfigModule.Builder builder = GlobalConfigModule
.builder();
@@ -138,12 +141,6 @@ public AppComponent getAppComponent() {
}
- public interface Lifecycle {
- void onCreate(Application application);
-
- void onTerminate(Application application);
- }
-
private static class AppComponentCallbacks implements ComponentCallbacks2 {
private Application mApplication;
private AppComponent mAppComponent;
diff --git a/arms/src/main/java/com/jess/arms/base/delegate/AppLifecycles.java b/arms/src/main/java/com/jess/arms/base/delegate/AppLifecycles.java
new file mode 100644
index 000000000..45d39aa20
--- /dev/null
+++ b/arms/src/main/java/com/jess/arms/base/delegate/AppLifecycles.java
@@ -0,0 +1,17 @@
+package com.jess.arms.base.delegate;
+
+import android.app.Application;
+import android.content.Context;
+
+/**
+ * Created by jess on 18/07/2017 17:43
+ * Contact with jess.yan.effort@gmail.com
+ */
+
+public interface AppLifecycles {
+ void attachBaseContext(Context base);
+
+ void onCreate(Application application);
+
+ void onTerminate(Application application);
+}
diff --git a/arms/src/main/java/com/jess/arms/base/delegate/FragmentDelegateImpl.java b/arms/src/main/java/com/jess/arms/base/delegate/FragmentDelegateImpl.java
index ce1359cab..24d43db53 100644
--- a/arms/src/main/java/com/jess/arms/base/delegate/FragmentDelegateImpl.java
+++ b/arms/src/main/java/com/jess/arms/base/delegate/FragmentDelegateImpl.java
@@ -97,7 +97,7 @@ public void onDestroyView() {
@Override
public void onDestroy() {
- if (iFragment.useEventBus())//如果要使用eventbus请将此方法返回true
+ if (iFragment != null && iFragment.useEventBus())//如果要使用eventbus请将此方法返回true
EventBus.getDefault().unregister(mFragment);//注册到事件主线
this.mUnbinder = null;
this.mFragmentManager = null;
diff --git a/arms/src/main/java/com/jess/arms/di/module/ClientModule.java b/arms/src/main/java/com/jess/arms/di/module/ClientModule.java
index 1b05a2956..6c95b0b34 100644
--- a/arms/src/main/java/com/jess/arms/di/module/ClientModule.java
+++ b/arms/src/main/java/com/jess/arms/di/module/ClientModule.java
@@ -4,6 +4,7 @@
import android.content.Context;
import android.support.annotation.Nullable;
+import com.google.gson.Gson;
import com.jess.arms.http.GlobalHttpHandler;
import com.jess.arms.http.RequestInterceptor;
import com.jess.arms.utils.DataHelper;
@@ -49,12 +50,13 @@ public class ClientModule {
*/
@Singleton
@Provides
- Retrofit provideRetrofit(Application application, @Nullable RetrofitConfiguration configuration, Retrofit.Builder builder, OkHttpClient client, HttpUrl httpUrl) {
+ Retrofit provideRetrofit(Application application, @Nullable RetrofitConfiguration configuration, Retrofit.Builder builder, OkHttpClient client
+ , HttpUrl httpUrl, Gson gson) {
builder
.baseUrl(httpUrl)//域名
.client(client)//设置okhttp
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())//使用rxjava
- .addConverterFactory(GsonConverterFactory.create());//使用Gson
+ .addConverterFactory(GsonConverterFactory.create(gson));//使用Gson
if (configuration != null)
configuration.configRetrofit(application, builder);
return builder.build();
diff --git a/arms/src/main/java/com/jess/arms/di/module/GlobalConfigModule.java b/arms/src/main/java/com/jess/arms/di/module/GlobalConfigModule.java
index 42ff00cdc..7b2e766b5 100644
--- a/arms/src/main/java/com/jess/arms/di/module/GlobalConfigModule.java
+++ b/arms/src/main/java/com/jess/arms/di/module/GlobalConfigModule.java
@@ -4,7 +4,9 @@
import android.support.annotation.Nullable;
import android.text.TextUtils;
+import com.jess.arms.http.BaseUrl;
import com.jess.arms.http.GlobalHttpHandler;
+import com.jess.arms.http.RequestInterceptor;
import com.jess.arms.utils.DataHelper;
import com.jess.arms.widget.imageloader.BaseImageLoaderStrategy;
import com.jess.arms.widget.imageloader.glide.GlideImageLoaderStrategy;
@@ -27,6 +29,7 @@
@Module
public class GlobalConfigModule {
private HttpUrl mApiUrl;
+ private BaseUrl mBaseUrl;
private BaseImageLoaderStrategy mLoaderStrategy;
private GlobalHttpHandler mHandler;
private List mInterceptors;
@@ -36,6 +39,7 @@ public class GlobalConfigModule {
private ClientModule.OkhttpConfiguration mOkhttpConfiguration;
private ClientModule.RxCacheConfiguration mRxCacheConfiguration;
private AppModule.GsonConfiguration mGsonConfiguration;
+ private RequestInterceptor.Level mPrintHttpLogLevel;
/**
* @author: jess
@@ -44,6 +48,7 @@ public class GlobalConfigModule {
*/
private GlobalConfigModule(Builder builder) {
this.mApiUrl = builder.apiUrl;
+ this.mBaseUrl = builder.baseUrl;
this.mLoaderStrategy = builder.loaderStrategy;
this.mHandler = builder.handler;
this.mInterceptors = builder.interceptors;
@@ -53,6 +58,7 @@ private GlobalConfigModule(Builder builder) {
this.mOkhttpConfiguration = builder.okhttpConfiguration;
this.mRxCacheConfiguration = builder.rxCacheConfiguration;
this.mGsonConfiguration = builder.gsonConfiguration;
+ this.mPrintHttpLogLevel = builder.printHttpLogLevel;
}
public static Builder builder() {
@@ -71,6 +77,12 @@ List provideInterceptors() {
@Singleton
@Provides
HttpUrl provideBaseUrl() {
+ if (mBaseUrl != null) {
+ HttpUrl httpUrl = mBaseUrl.url();
+ if (httpUrl != null) {
+ return httpUrl;
+ }
+ }
return mApiUrl == null ? HttpUrl.parse("https://api.github.com/") : mApiUrl;
}
@@ -140,9 +152,17 @@ AppModule.GsonConfiguration provideGsonConfiguration() {
return mGsonConfiguration;
}
+ @Singleton
+ @Provides
+ @Nullable
+ RequestInterceptor.Level providePrintHttpLogLevel() {
+ return mPrintHttpLogLevel;
+ }
+
public static final class Builder {
private HttpUrl apiUrl;
+ private BaseUrl baseUrl;
private BaseImageLoaderStrategy loaderStrategy;
private GlobalHttpHandler handler;
private List interceptors;
@@ -152,15 +172,24 @@ public static final class Builder {
private ClientModule.OkhttpConfiguration okhttpConfiguration;
private ClientModule.RxCacheConfiguration rxCacheConfiguration;
private AppModule.GsonConfiguration gsonConfiguration;
+ private RequestInterceptor.Level printHttpLogLevel;
private Builder() {
}
- public Builder baseurl(String baseurl) {//基础url
- if (TextUtils.isEmpty(baseurl)) {
- throw new IllegalArgumentException("baseurl can not be empty");
+ public Builder baseurl(String baseUrl) {//基础url
+ if (TextUtils.isEmpty(baseUrl)) {
+ throw new IllegalArgumentException("BaseUrl can not be empty");
}
- this.apiUrl = HttpUrl.parse(baseurl);
+ this.apiUrl = HttpUrl.parse(baseUrl);
+ return this;
+ }
+
+ public Builder baseurl(BaseUrl baseUrl) {
+ if (baseUrl == null) {
+ throw new IllegalArgumentException("BaseUrl can not be null");
+ }
+ this.baseUrl = baseUrl;
return this;
}
@@ -213,6 +242,11 @@ public Builder gsonConfiguration(AppModule.GsonConfiguration gsonConfiguration)
return this;
}
+ public Builder printHttpLogLevel(RequestInterceptor.Level printHttpLogLevel) { //是否让框架打印 Http 的请求和响应信息
+ if (printHttpLogLevel == null) throw new IllegalArgumentException("printHttpLogLevel == null. Use RequestInterceptor.Level.NONE instead.");
+ this.printHttpLogLevel = printHttpLogLevel;
+ return this;
+ }
public GlobalConfigModule build() {
return new GlobalConfigModule(this);
diff --git a/arms/src/main/java/com/jess/arms/http/BaseUrl.java b/arms/src/main/java/com/jess/arms/http/BaseUrl.java
new file mode 100644
index 000000000..d78fea2d6
--- /dev/null
+++ b/arms/src/main/java/com/jess/arms/http/BaseUrl.java
@@ -0,0 +1,17 @@
+package com.jess.arms.http;
+
+import okhttp3.HttpUrl;
+
+/**
+ * Created by jess on 11/07/2017 14:58
+ * Contact with jess.yan.effort@gmail.com
+ */
+
+public interface BaseUrl {
+ /**
+ * 针对于 BaseUrl 在 App 启动时不能确定,需要请求服务器接口动态获取的应用场景
+ * 在调用 Retrofit 接口之前,使用 Okhttp 或其他方式,请求到正确的 BaseUrl 并通过此方法返回
+ * @return
+ */
+ HttpUrl url();
+}
diff --git a/arms/src/main/java/com/jess/arms/http/RequestInterceptor.java b/arms/src/main/java/com/jess/arms/http/RequestInterceptor.java
index 85f423493..4dec7ad33 100644
--- a/arms/src/main/java/com/jess/arms/http/RequestInterceptor.java
+++ b/arms/src/main/java/com/jess/arms/http/RequestInterceptor.java
@@ -32,26 +32,42 @@
@Singleton
public class RequestInterceptor implements Interceptor {
private GlobalHttpHandler mHandler;
+ private final Level printLevel;
+
+ public enum Level {
+ NONE, //不打印log
+ REQUEST, //只打印请求信息
+ RESPONSE, //只打印响应信息
+ ALL //所有数据全部打印
+ }
@Inject
- public RequestInterceptor(@Nullable GlobalHttpHandler handler) {
+ public RequestInterceptor(@Nullable GlobalHttpHandler handler, @Nullable Level level) {
this.mHandler = handler;
+ if (level == null)
+ printLevel = Level.ALL;
+ else
+ printLevel = level;
}
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
- boolean hasRequestBody = request.body() != null;
+ boolean logRequest = printLevel == Level.ALL || (printLevel != Level.NONE && printLevel == Level.REQUEST);
- //打印请求信息
- Timber.tag(getTag(request, "Request_Info")).w("Params : 「 %s 」%nConnection : 「 %s 」%nHeaders : %n「 %s 」"
- , hasRequestBody ? parseParams(request.newBuilder().build().body()) : "Null"
- , chain.connection()
- , request.headers());
+ if (logRequest) {
+ boolean hasRequestBody = request.body() != null;
+ //打印请求信息
+ Timber.tag(getTag(request, "Request_Info")).w("Params : 「 %s 」%nConnection : 「 %s 」%nHeaders : %n「 %s 」"
+ , hasRequestBody ? parseParams(request.newBuilder().build().body()) : "Null"
+ , chain.connection()
+ , request.headers());
+ }
- long t1 = System.nanoTime();
+ boolean logResponse = printLevel == Level.ALL || (printLevel != Level.NONE && printLevel == Level.RESPONSE);
+ long t1 = logResponse ? System.nanoTime() : 0;
Response originalResponse;
try {
originalResponse = chain.proceed(request);
@@ -59,16 +75,17 @@ public Response intercept(Chain chain) throws IOException {
Timber.w("Http Error: " + e);
throw e;
}
- long t2 = System.nanoTime();
+ long t2 = logResponse ? System.nanoTime() : 0;
- String bodySize = originalResponse.body().contentLength() != -1 ? originalResponse.body().contentLength() + "-byte" : "unknown-length";
-
- //打印响应时间以及响应头
- Timber.tag(getTag(request, "Response_Info")).w("Received response in [ %d-ms ] , [ %s ]%n%s"
- , TimeUnit.NANOSECONDS.toMillis(t2 - t1), bodySize, originalResponse.headers());
+ if (logResponse) {
+ String bodySize = originalResponse.body().contentLength() != -1 ? originalResponse.body().contentLength() + "-byte" : "unknown-length";
+ //打印响应时间以及响应头
+ Timber.tag(getTag(request, "Response_Info")).w("Received response in [ %d-ms ] , [ %s ]%n%s"
+ , TimeUnit.NANOSECONDS.toMillis(t2 - t1), bodySize, originalResponse.headers());
+ }
//打印响应结果
- String bodyString = printResult(request, originalResponse);
+ String bodyString = printResult(request, originalResponse.newBuilder().build(), logResponse);
if (mHandler != null)//这里可以比客户端提前一步拿到服务器返回的结果,可以做一些操作,比如token超时,重新获取
return mHandler.onHttpResultResponse(bodyString, chain, originalResponse);
@@ -80,35 +97,45 @@ public Response intercept(Chain chain) throws IOException {
* 打印响应结果
*
* @param request
- * @param originalResponse
+ * @param response
+ * @param logResponse
* @return
* @throws IOException
*/
@Nullable
- private String printResult(Request request, Response originalResponse) throws IOException {
+ private String printResult(Request request, Response response, boolean logResponse) throws IOException {
//读取服务器返回的结果
- ResponseBody responseBody = originalResponse.body();
+ ResponseBody responseBody = response.body();
String bodyString = null;
if (isParseable(responseBody.contentType())) {
- BufferedSource source = responseBody.source();
- source.request(Long.MAX_VALUE); // Buffer the entire body.
- Buffer buffer = source.buffer();
-
- //获取content的压缩类型
- String encoding = originalResponse
- .headers()
- .get("Content-Encoding");
+ try {
+ BufferedSource source = responseBody.source();
+ source.request(Long.MAX_VALUE); // Buffer the entire body.
+ Buffer buffer = source.buffer();
- Buffer clone = buffer.clone();
+ //获取content的压缩类型
+ String encoding = response
+ .headers()
+ .get("Content-Encoding");
+ Buffer clone = buffer.clone();
- //解析response content
- bodyString = parseContent(responseBody, encoding, clone);
- Timber.tag(getTag(request, "Response_Result")).w(isJson(responseBody.contentType()) ? CharactorHandler.jsonFormat(bodyString) : bodyString);
+ //解析response content
+ bodyString = parseContent(responseBody, encoding, clone);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ if (logResponse) {
+ Timber.tag(getTag(request, "Response_Result")).w(isJson(responseBody.contentType()) ?
+ CharactorHandler.jsonFormat(bodyString) : isXml(responseBody.contentType()) ?
+ CharactorHandler.xmlFormat(bodyString) : bodyString);
+ }
} else {
- Timber.tag(getTag(request, "Response_Result")).w("This result isn't parsed");
+ if (logResponse) {
+ Timber.tag(getTag(request, "Response_Result")).w("This result isn't parsed");
+ }
}
return bodyString;
}
diff --git a/arms/src/main/java/com/jess/arms/integration/ActivityLifecycle.java b/arms/src/main/java/com/jess/arms/integration/ActivityLifecycle.java
index 27aae6209..c719751e9 100644
--- a/arms/src/main/java/com/jess/arms/integration/ActivityLifecycle.java
+++ b/arms/src/main/java/com/jess/arms/integration/ActivityLifecycle.java
@@ -36,7 +36,7 @@ public class ActivityLifecycle implements Application.ActivityLifecycleCallbacks
private AppManager mAppManager;
private Application mApplication;
private Map mExtras;
- private FragmentLifecycle mFragmentLifecycle;
+ private FragmentManager.FragmentLifecycleCallbacks mFragmentLifecycle;
private List mFragmentLifecycles;
@Inject
diff --git a/arms/src/main/java/com/jess/arms/integration/AppManager.java b/arms/src/main/java/com/jess/arms/integration/AppManager.java
index 4b709b682..54f42b712 100644
--- a/arms/src/main/java/com/jess/arms/integration/AppManager.java
+++ b/arms/src/main/java/com/jess/arms/integration/AppManager.java
@@ -33,7 +33,7 @@
public final class AppManager {
protected final String TAG = this.getClass().getSimpleName();
public static final String APPMANAGER_MESSAGE = "appmanager_message";
- public static final String IS_NOT_ADD_ACTIVITY_LIST = "is_add_activity_list";//是否加入到activity的list,管理
+ public static final String IS_NOT_ADD_ACTIVITY_LIST = "is_not_add_activity_list";//true 为不需要加入到 Activity 容器进行统一管理,反之亦然
public static final int START_ACTIVITY = 0;
public static final int SHOW_SNACKBAR = 1;
public static final int KILL_ALL = 2;
@@ -155,7 +155,9 @@ public void setCurrentActivity(Activity currentActivity) {
* @return
*/
public Activity getCurrentActivity() {
- return mCurrentActivity;
+ return mCurrentActivity != null ?
+ mCurrentActivity : mActivityList != null && mActivityList.size() > 0 ?
+ mActivityList.get(mActivityList.size() - 1) : null;
}
/**
diff --git a/arms/src/main/java/com/jess/arms/integration/ConfigModule.java b/arms/src/main/java/com/jess/arms/integration/ConfigModule.java
index b51e49269..ef1fdc153 100644
--- a/arms/src/main/java/com/jess/arms/integration/ConfigModule.java
+++ b/arms/src/main/java/com/jess/arms/integration/ConfigModule.java
@@ -4,7 +4,7 @@
import android.content.Context;
import android.support.v4.app.FragmentManager;
-import com.jess.arms.base.delegate.AppDelegate;
+import com.jess.arms.base.delegate.AppLifecycles;
import com.jess.arms.di.module.GlobalConfigModule;
import java.util.List;
@@ -24,18 +24,10 @@ public interface ConfigModule {
void applyOptions(Context context, GlobalConfigModule.Builder builder);
/**
- * 使用{@link IRepositoryManager}给框架注入一些网络请求和数据缓存等服务
- * @param context
- * @param repositoryManager
- */
- void registerComponents(Context context,IRepositoryManager repositoryManager);
-
-
- /**
- * 使用{@link AppDelegate.Lifecycle}在Application的生命周期中注入一些操作
+ * 使用{@link AppLifecycles}在Application的生命周期中注入一些操作
* @return
*/
- void injectAppLifecycle(Context context, List lifecycles);
+ void injectAppLifecycle(Context context, List lifecycles);
/**
* 使用{@link Application.ActivityLifecycleCallbacks}在Activity的生命周期中注入一些操作
diff --git a/arms/src/main/java/com/jess/arms/integration/IRepositoryManager.java b/arms/src/main/java/com/jess/arms/integration/IRepositoryManager.java
index 5b91de70b..5fc8fdb93 100644
--- a/arms/src/main/java/com/jess/arms/integration/IRepositoryManager.java
+++ b/arms/src/main/java/com/jess/arms/integration/IRepositoryManager.java
@@ -1,7 +1,5 @@
package com.jess.arms.integration;
-import android.content.Context;
-
/**
* Created by jess on 17/03/2017 11:15
* Contact with jess.yan.effort@gmail.com
@@ -9,20 +7,6 @@
public interface IRepositoryManager {
- /**
- * 注入RetrofitService,在{@link ConfigModule#registerComponents(Context, IRepositoryManager)}中进行注入
- * @param services
- */
- void injectRetrofitService(Class>... services);
-
-
- /**
- * 注入CacheService,在{@link ConfigModule#registerComponents(Context, IRepositoryManager)}中进行注入
- * @param services
- */
- void injectCacheService(Class>... services);
-
-
/**
* 根据传入的Class获取对应的Retrift service
*
@@ -41,4 +25,9 @@ public interface IRepositoryManager {
*/
T obtainCacheService(Class cache);
+ /**
+ * 清理所有缓存
+ */
+ void clearAllCache();
+
}
diff --git a/arms/src/main/java/com/jess/arms/integration/ManifestParser.java b/arms/src/main/java/com/jess/arms/integration/ManifestParser.java
index 7c9589eb5..379dc894d 100644
--- a/arms/src/main/java/com/jess/arms/integration/ManifestParser.java
+++ b/arms/src/main/java/com/jess/arms/integration/ManifestParser.java
@@ -1,6 +1,5 @@
package com.jess.arms.integration;
-import android.app.Application;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -17,7 +16,7 @@ public final class ManifestParser {
private final Context context;
- public ManifestParser(Application context) {
+ public ManifestParser(Context context) {
this.context = context;
}
diff --git a/arms/src/main/java/com/jess/arms/integration/RepositoryManager.java b/arms/src/main/java/com/jess/arms/integration/RepositoryManager.java
index 48ceabb23..918fe7ed0 100644
--- a/arms/src/main/java/com/jess/arms/integration/RepositoryManager.java
+++ b/arms/src/main/java/com/jess/arms/integration/RepositoryManager.java
@@ -1,62 +1,34 @@
package com.jess.arms.integration;
-import android.content.Context;
-
-import com.jess.arms.utils.Preconditions;
-
-import java.util.LinkedHashMap;
+import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
+import dagger.Lazy;
import io.rx_cache2.internal.RxCache;
import retrofit2.Retrofit;
/**
* 用来管理网络请求层,以及数据缓存层,以后可能添加数据库请求层
- * 需要在{@link ConfigModule}的实现类中先inject需要的服务
+ *
* Created by jess on 13/04/2017 09:52
* Contact with jess.yan.effort@gmail.com
*/
@Singleton
public class RepositoryManager implements IRepositoryManager {
- private Retrofit mRetrofit;
- private RxCache mRxCache;
- private final Map mRetrofitServiceCache = new LinkedHashMap<>();
- private final Map mCacheServiceCache = new LinkedHashMap<>();
+ private Lazy mRetrofit;
+ private Lazy mRxCache;
+ private final Map mRetrofitServiceCache = new HashMap<>();
+ private final Map mCacheServiceCache = new HashMap<>();
@Inject
- public RepositoryManager(Retrofit retrofit, RxCache rxCache) {
+ public RepositoryManager(Lazy retrofit, Lazy rxCache) {
this.mRetrofit = retrofit;
this.mRxCache = rxCache;
}
- /**
- * 注入RetrofitService,在{@link ConfigModule#registerComponents(Context, IRepositoryManager)}中进行注入
- * @param services
- */
- @Override
- public void injectRetrofitService(Class>... services) {
- for (Class> service : services) {
- if (mRetrofitServiceCache.containsKey(service.getName())) continue;
- mRetrofitServiceCache.put(service.getName(), mRetrofit.create(service));
- }
-
- }
-
- /**
- * 注入CacheService,在{@link ConfigModule#registerComponents(Context, IRepositoryManager)}中进行注入
- * @param services
- */
- @Override
- public void injectCacheService(Class>... services) {
- for (Class> service : services) {
- if (mCacheServiceCache.containsKey(service.getName())) continue;
- mCacheServiceCache.put(service.getName(), mRxCache.using(service));
- }
- }
-
/**
* 根据传入的Class获取对应的Retrift service
*
@@ -66,9 +38,15 @@ public void injectCacheService(Class>... services) {
*/
@Override
public T obtainRetrofitService(Class service) {
- Preconditions.checkState(mRetrofitServiceCache.containsKey(service.getName())
- ,"Unable to find %s,first call injectRetrofitService(%s) in ConfigModule",service.getName(),service.getSimpleName());
- return (T) mRetrofitServiceCache.get(service.getName());
+ T retrofitService;
+ synchronized (mRetrofitServiceCache) {
+ retrofitService = (T) mRetrofitServiceCache.get(service.getName());
+ if (retrofitService == null) {
+ retrofitService = mRetrofit.get().create(service);
+ mRetrofitServiceCache.put(service.getName(), retrofitService);
+ }
+ }
+ return retrofitService;
}
/**
@@ -80,8 +58,22 @@ public T obtainRetrofitService(Class service) {
*/
@Override
public T obtainCacheService(Class cache) {
- Preconditions.checkState(mCacheServiceCache.containsKey(cache.getName())
- ,"Unable to find %s,first call injectCacheService(%s) in ConfigModule",cache.getName(),cache.getSimpleName());
- return (T) mCacheServiceCache.get(cache.getName());
+ T cacheService;
+ synchronized (mCacheServiceCache) {
+ cacheService = (T) mCacheServiceCache.get(cache.getName());
+ if (cacheService == null) {
+ cacheService = mRxCache.get().using(cache);
+ mCacheServiceCache.put(cache.getName(), cacheService);
+ }
+ }
+ return cacheService;
+ }
+
+ /**
+ * 清理所有缓存
+ */
+ @Override
+ public void clearAllCache() {
+ mRxCache.get().evictAll();
}
}
diff --git a/arms/src/main/java/com/jess/arms/utils/CharactorHandler.java b/arms/src/main/java/com/jess/arms/utils/CharactorHandler.java
index 2878aad2e..18d464613 100644
--- a/arms/src/main/java/com/jess/arms/utils/CharactorHandler.java
+++ b/arms/src/main/java/com/jess/arms/utils/CharactorHandler.java
@@ -2,14 +2,25 @@
import android.text.InputFilter;
import android.text.Spanned;
+import android.text.TextUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
+import java.io.StringReader;
+import java.io.StringWriter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
/**
* Created by zhiyicx on 2016/3/16.
*/
@@ -62,23 +73,54 @@ public static String str2HexStr(String str) {
/**
* json 格式化
- * @param bodyString
+ *
+ * @param json
* @return
*/
- public static String jsonFormat(String bodyString) {
+ public static String jsonFormat(String json) {
+ if (TextUtils.isEmpty(json)) {
+ return "Empty/Null json content";
+ }
String message;
try {
- if (bodyString.startsWith("{")) {
- JSONObject jsonObject = new JSONObject(bodyString);
+ json = json.trim();
+ if (json.startsWith("{")) {
+ JSONObject jsonObject = new JSONObject(json);
message = jsonObject.toString(4);
- } else if (bodyString.startsWith("[")) {
- JSONArray jsonArray = new JSONArray(bodyString);
+ } else if (json.startsWith("[")) {
+ JSONArray jsonArray = new JSONArray(json);
message = jsonArray.toString(4);
} else {
- message = bodyString;
+ message = json;
}
} catch (JSONException e) {
- message = bodyString;
+ message = json;
+ }
+ return message;
+ }
+
+
+ /**
+ * xml 格式化
+ *
+ * @param xml
+ * @return
+ */
+ public static String xmlFormat(String xml) {
+ if (TextUtils.isEmpty(xml)) {
+ return "Empty/Null xml content";
+ }
+ String message;
+ try {
+ Source xmlInput = new StreamSource(new StringReader(xml));
+ StreamResult xmlOutput = new StreamResult(new StringWriter());
+ Transformer transformer = TransformerFactory.newInstance().newTransformer();
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+ transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
+ transformer.transform(xmlInput, xmlOutput);
+ message = xmlOutput.getWriter().toString().replaceFirst(">", ">\n");
+ } catch (TransformerException e) {
+ message = xml;
}
return message;
}
diff --git a/arms/src/main/java/com/jess/arms/utils/DataHelper.java b/arms/src/main/java/com/jess/arms/utils/DataHelper.java
index b0a74ed5b..39629b8d9 100644
--- a/arms/src/main/java/com/jess/arms/utils/DataHelper.java
+++ b/arms/src/main/java/com/jess/arms/utils/DataHelper.java
@@ -167,7 +167,7 @@ public static File getCacheFile(Context context) {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File file = null;
file = context.getExternalCacheDir();//获取系统管理的sd卡缓存文件
- if (file == null) {//如果获取的为空,就是用自己定义的缓存文件夹做缓存路径
+ if (file == null) {//如果获取的文件为空,就使用自己定义的缓存文件夹做缓存路径
file = new File(getCacheFilePath(context));
makeDirs(file);
}
diff --git a/build.gradle b/build.gradle
index 90392c3b9..0233dd9ba 100644
--- a/build.gradle
+++ b/build.gradle
@@ -5,7 +5,7 @@ buildscript {
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:2.3.2'
+ classpath 'com.android.tools.build:gradle:2.3.3'
//Gradle Android Maven plugin
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
//Gradle Bintray Plugin
@@ -19,6 +19,7 @@ allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
+ maven { url "https://maven.google.com" }
}
}
diff --git a/config.gradle b/config.gradle
index 593b92f2a..c31212b59 100644
--- a/config.gradle
+++ b/config.gradle
@@ -5,17 +5,17 @@ ext {
buildToolsVersion : "25.0.3",
minSdkVersion : 15,
targetSdkVersion : 25,
- versionCode : 125,
- versionName : "2.1.0"
+ versionCode : 130,
+ versionName : "2.1.5"
]
version = [
- androidSupportSdkVersion: "25.3.1",
+ androidSupportSdkVersion: "25.4.0",
retrofitSdkVersion : "2.3.0",
- dagger2SdkVersion : "2.10",
- butterknifeSdkVersion : "8.6.0",
+ dagger2SdkVersion : "2.11",
+ butterknifeSdkVersion : "8.7.0",
rxlifecycleSdkVersion : "1.0",
- rxlifecycle2SdkVersion : "2.0.1",
+ rxlifecycle2SdkVersion : "2.1.0",
espressoSdkVersion : "2.2.2",
canarySdkVersion : "1.5.1"
]
@@ -34,7 +34,7 @@ ext {
"retrofit-converter-gson" : "com.squareup.retrofit2:converter-gson:${version["retrofitSdkVersion"]}",
"retrofit-adapter-rxjava" : "com.squareup.retrofit2:adapter-rxjava:${version["retrofitSdkVersion"]}",
"retrofit-adapter-rxjava2" : "com.squareup.retrofit2:adapter-rxjava2:${version["retrofitSdkVersion"]}",
- "okhttp3" : "com.squareup.okhttp3:okhttp:3.8.0",
+ "okhttp3" : "com.squareup.okhttp3:okhttp:3.8.1",
"okhttp-urlconnection" : "com.squareup.okhttp:okhttp-urlconnection:2.0.0",
"glide" : "com.github.bumptech.glide:glide:3.8.0",
"picasso" : "com.squareup.picasso:picasso:2.5.2",
@@ -48,7 +48,7 @@ ext {
"numberprogressbar" : "com.daimajia.numberprogressbar:library:1.2@aar",
"nineoldandroids" : "com.nineoldandroids:library:2.4.0",
"paginate" : "com.github.markomilos:paginate:0.5.1",
- "vlayout" : "com.alibaba.android:vlayout:1.0.6@aar",
+ "vlayout" : "com.alibaba.android:vlayout:1.0.9@aar",
//rx1
"rxandroid" : "io.reactivex:rxandroid:1.2.1",
@@ -63,10 +63,10 @@ ext {
//rx2
"rxandroid2" : "io.reactivex.rxjava2:rxandroid:2.0.1",
- "rxjava2" : "io.reactivex.rxjava2:rxjava:2.1.0",
+ "rxjava2" : "io.reactivex.rxjava2:rxjava:2.1.1",
"rxlifecycle2" : "com.trello.rxlifecycle2:rxlifecycle:${version["rxlifecycle2SdkVersion"]}",
"rxlifecycle2-components" : "com.trello.rxlifecycle2:rxlifecycle-components:${version["rxlifecycle2SdkVersion"]}",
- "rxcache2" : "com.github.VictorAlbertos.RxCache:runtime:1.8.0-2.x",
+ "rxcache2" : "com.github.VictorAlbertos.RxCache:runtime:1.8.1-2.x",
"rxpermissions2" : "com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar",
"rxerrorhandler2" : "me.jessyan:rxerrorhandler:2.0.2",
@@ -75,12 +75,12 @@ ext {
"dagger2-compiler" : "com.google.dagger:dagger-compiler:${version["dagger2SdkVersion"]}",
"androideventbus" : "org.simple:androideventbus:1.0.5.1",
"otto" : "com.squareup:otto:1.3.8",
- "gson" : "com.google.code.gson:gson:2.8.0",
+ "gson" : "com.google.code.gson:gson:2.8.1",
"multidex" : "com.android.support:multidex:1.0.1",
"javax.annotation" : "javax.annotation:jsr250-api:1.0",
"arouter" : "com.alibaba:arouter-api:1.2.1.1",
"arouter-compiler" : "com.alibaba:arouter-compiler:1.1.2.1",
- "progressmanager" : "me.jessyan:progressmanager:1.2.5",
+ "progressmanager" : "me.jessyan:progressmanager:+",
//test
"junit" : "junit:junit:4.12",
@@ -91,6 +91,7 @@ ext {
"espresso-intents" : "com.android.support.test.espresso:espresso-intents:${version["espressoSdkVersion"]}",
"mockito-core" : "org.mockito:mockito-core:1.+",
"timber" : "com.jakewharton.timber:timber:4.5.1",
+ "logger" : "com.orhanobut:logger:2.1.1",
"canary-debug" : "com.squareup.leakcanary:leakcanary-android:${version["canarySdkVersion"]}",
"canary-release" : "com.squareup.leakcanary:leakcanary-android-no-op:${version["canarySdkVersion"]}",
"umeng-analytics" : "com.umeng.analytics:analytics:6.0.1"
diff --git a/image/android_logo.png b/image/android_logo.png
new file mode 100644
index 000000000..7cf776bba
Binary files /dev/null and b/image/android_logo.png differ
diff --git a/image/hui_cai_fu_logo.png b/image/hui_cai_fu_logo.png
new file mode 100644
index 000000000..af830c460
Binary files /dev/null and b/image/hui_cai_fu_logo.png differ
diff --git a/image/mi_lu_logo.png b/image/mi_lu_logo.png
new file mode 100644
index 000000000..55e192e5e
Binary files /dev/null and b/image/mi_lu_logo.png differ
diff --git a/image/mi_wo_logo.png b/image/mi_wo_logo.png
new file mode 100644
index 000000000..2d0ba9a26
Binary files /dev/null and b/image/mi_wo_logo.png differ
diff --git a/image/tiantian_live_logo.png b/image/tiantian_live_logo.png
new file mode 100644
index 000000000..1e68881c9
Binary files /dev/null and b/image/tiantian_live_logo.png differ
diff --git a/image/tiantian_video_logo.png b/image/tiantian_video_logo.png
new file mode 100644
index 000000000..6cd986822
Binary files /dev/null and b/image/tiantian_video_logo.png differ
diff --git a/image/tong_hang_logo.png b/image/tong_hang_logo.png
new file mode 100644
index 000000000..4d012bd68
Binary files /dev/null and b/image/tong_hang_logo.png differ
diff --git a/image/top_net_work_logo.png b/image/top_net_work_logo.png
new file mode 100644
index 000000000..2deb0a6ab
Binary files /dev/null and b/image/top_net_work_logo.png differ
diff --git a/image/xiang_yun_logo.png b/image/xiang_yun_logo.png
new file mode 100644
index 000000000..0ed3f25bc
Binary files /dev/null and b/image/xiang_yun_logo.png differ
diff --git a/image/xiaoding_foreman_logo.png b/image/xiaoding_foreman_logo.png
new file mode 100644
index 000000000..dfb4c74dc
Binary files /dev/null and b/image/xiaoding_foreman_logo.png differ
diff --git a/image/xiaoding_material_logo.png b/image/xiaoding_material_logo.png
new file mode 100644
index 000000000..437157b39
Binary files /dev/null and b/image/xiaoding_material_logo.png differ
diff --git a/image/xiaoding_worker_logo.png b/image/xiaoding_worker_logo.png
new file mode 100644
index 000000000..db74b0675
Binary files /dev/null and b/image/xiaoding_worker_logo.png differ
diff --git a/image/zhibo_logo.png b/image/zhibo_logo.png
new file mode 100644
index 000000000..61cd1ba6d
Binary files /dev/null and b/image/zhibo_logo.png differ