Skip to content

Commit e2393ac

Browse files
committed
修复线上BUG
1 parent 3c4d36c commit e2393ac

11 files changed

+179
-10
lines changed

app/build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ android {
4545
applicationId "com.rae.cnblogs"
4646
minSdkVersion rootProject.ext.minSdkVersion
4747
targetSdkVersion rootProject.ext.targetSdkVersion
48-
versionCode 6
49-
versionName "1.1.3"
48+
versionCode 7
49+
versionName "1.1.4"
5050
multiDexEnabled true
5151
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
5252
buildConfigField 'String', 'BUGLY_APP_ID', '"' + buglyAppId + '"'

app/src/main/java/com/rae/cnblogs/CnblogsApplication.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,16 @@ public void onCreate() {
5555
AVOSCloud.initialize(getApplication(), BuildConfig.LEAN_CLOUD_APP_ID, BuildConfig.LEAN_CLOUD_APP_KEY);
5656
FeedbackThread.getInstance();
5757

58-
5958
// 加载皮肤
60-
SkinCompatManager.withoutActivity(getApplication()).loadSkin();
59+
SkinCompatManager.init(getApplicationContext());
60+
SkinActivityLifecycleCompat.init(this);
6161
SkinCompatManager.getInstance()
6262
.addHookInflater(new ThemeCompat.CnblogsThemeHookInflater())
6363
.addInflater(new CnblogsLayoutInflater())
6464
.addInflater(new SkinMaterialViewInflater());
6565

66+
SkinCompatManager.getInstance().loadSkin();
67+
6668
// 一些要求不高的初始化操作放到线程中去操作
6769
new Thread(new Runnable() {
6870
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
package com.rae.cnblogs;
2+
3+
import android.app.Activity;
4+
import android.app.Application;
5+
import android.graphics.drawable.ColorDrawable;
6+
import android.graphics.drawable.Drawable;
7+
import android.os.Build;
8+
import android.os.Bundle;
9+
import android.support.v4.view.LayoutInflaterCompat;
10+
import android.support.v7.app.AppCompatActivity;
11+
import android.view.LayoutInflater;
12+
13+
import java.lang.reflect.Field;
14+
import java.util.WeakHashMap;
15+
16+
import skin.support.SkinCompatManager;
17+
import skin.support.app.SkinCompatDelegate;
18+
import skin.support.content.res.SkinCompatResources;
19+
import skin.support.observe.SkinObservable;
20+
import skin.support.observe.SkinObserver;
21+
import skin.support.widget.SkinCompatThemeUtils;
22+
23+
import static skin.support.widget.SkinCompatHelper.INVALID_ID;
24+
import static skin.support.widget.SkinCompatHelper.checkResourceId;
25+
26+
/**
27+
* 扩展
28+
* Created by ChenRui on 2018/3/1 0001 14:58.
29+
*/
30+
public class SkinActivityLifecycleCompat implements Application.ActivityLifecycleCallbacks {
31+
private static volatile SkinActivityLifecycleCompat sInstance = null;
32+
private WeakHashMap<Activity, SkinCompatDelegate> mSkinDelegateMap;
33+
private WeakHashMap<Activity, SkinObserver> mSkinObserverMap;
34+
35+
public static SkinActivityLifecycleCompat init(Application application) {
36+
if (sInstance == null) {
37+
synchronized (SkinActivityLifecycleCompat.class) {
38+
if (sInstance == null) {
39+
sInstance = new SkinActivityLifecycleCompat(application);
40+
}
41+
}
42+
}
43+
return sInstance;
44+
}
45+
46+
private SkinActivityLifecycleCompat(Application application) {
47+
application.registerActivityLifecycleCallbacks(this);
48+
}
49+
50+
private SkinCompatDelegate getSkinDelegate(AppCompatActivity activity) {
51+
if (mSkinDelegateMap == null) {
52+
mSkinDelegateMap = new WeakHashMap<>();
53+
}
54+
55+
SkinCompatDelegate mSkinDelegate = mSkinDelegateMap.get(activity);
56+
if (mSkinDelegate == null) {
57+
mSkinDelegate = SkinCompatDelegate.create(activity);
58+
}
59+
mSkinDelegateMap.put(activity, mSkinDelegate);
60+
return mSkinDelegate;
61+
}
62+
63+
private SkinObserver getObserver(final Activity activity) {
64+
if (mSkinObserverMap == null) {
65+
mSkinObserverMap = new WeakHashMap<>();
66+
}
67+
SkinObserver observer = mSkinObserverMap.get(activity);
68+
if (observer == null) {
69+
observer = new SkinObserver() {
70+
@Override
71+
public void updateSkin(SkinObservable observable, Object o) {
72+
updateStatusBarColor(activity);
73+
updateWindowBackground(activity);
74+
getSkinDelegate((AppCompatActivity) activity).applySkin();
75+
}
76+
};
77+
}
78+
mSkinObserverMap.put(activity, observer);
79+
return observer;
80+
}
81+
82+
private void updateStatusBarColor(Activity activity) {
83+
if (SkinCompatManager.getInstance().isSkinStatusBarColorEnable()
84+
&& Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
85+
int statusBarColorResId = SkinCompatThemeUtils.getStatusBarColorResId(activity);
86+
int colorPrimaryDarkResId = SkinCompatThemeUtils.getColorPrimaryDarkResId(activity);
87+
if (checkResourceId(statusBarColorResId) != INVALID_ID) {
88+
activity.getWindow().setStatusBarColor(SkinCompatResources.getInstance().getColor(statusBarColorResId));
89+
} else if (checkResourceId(colorPrimaryDarkResId) != INVALID_ID) {
90+
activity.getWindow().setStatusBarColor(SkinCompatResources.getInstance().getColor(colorPrimaryDarkResId));
91+
}
92+
}
93+
}
94+
95+
private void updateWindowBackground(Activity activity) {
96+
if (SkinCompatManager.getInstance().isSkinWindowBackgroundEnable()) {
97+
int windowBackgroundResId = SkinCompatThemeUtils.getWindowBackgroundResId(activity);
98+
if (checkResourceId(windowBackgroundResId) != INVALID_ID) {
99+
String typeName = activity.getResources().getResourceTypeName(windowBackgroundResId);
100+
if ("color".equals(typeName)) {
101+
Drawable drawable = new ColorDrawable(SkinCompatResources.getInstance().getColor(windowBackgroundResId));
102+
activity.getWindow().setBackgroundDrawable(drawable);
103+
} else if ("drawable".equals(typeName)) {
104+
Drawable drawable = SkinCompatResources.getInstance().getDrawable(windowBackgroundResId);
105+
activity.getWindow().setBackgroundDrawable(drawable);
106+
} else if ("mipmap".equals(typeName)) {
107+
Drawable drawable = SkinCompatResources.getInstance().getMipmap(windowBackgroundResId);
108+
activity.getWindow().setBackgroundDrawable(drawable);
109+
}
110+
}
111+
}
112+
}
113+
114+
@Override
115+
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
116+
if (activity instanceof AppCompatActivity) {
117+
LayoutInflater layoutInflater = activity.getLayoutInflater();
118+
try {
119+
Field field = LayoutInflater.class.getDeclaredField("mFactorySet");
120+
field.setAccessible(true);
121+
field.setBoolean(layoutInflater, false);
122+
LayoutInflaterCompat.setFactory(activity.getLayoutInflater(),
123+
getSkinDelegate((AppCompatActivity) activity));
124+
} catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) {
125+
e.printStackTrace();
126+
}
127+
updateStatusBarColor(activity);
128+
updateWindowBackground(activity);
129+
}
130+
}
131+
132+
@Override
133+
public void onActivityStarted(Activity activity) {
134+
135+
}
136+
137+
@Override
138+
public void onActivityResumed(Activity activity) {
139+
SkinCompatManager.getInstance().addObserver(getObserver(activity));
140+
}
141+
142+
@Override
143+
public void onActivityPaused(Activity activity) {
144+
}
145+
146+
@Override
147+
public void onActivityStopped(Activity activity) {
148+
149+
}
150+
151+
@Override
152+
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
153+
154+
}
155+
156+
@Override
157+
public void onActivityDestroyed(Activity activity) {
158+
if (mSkinDelegateMap == null || SkinCompatManager.getInstance() == null) return;
159+
SkinCompatManager.getInstance().deleteObserver(getObserver(activity));
160+
mSkinObserverMap.remove(activity);
161+
mSkinDelegateMap.remove(activity);
162+
}
163+
}

app/src/main/java/com/rae/cnblogs/fragment/HomeFragment.java

+2
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ public void onTabReselected(DesignTabLayout.Tab tab) {
130130

131131
@Override
132132
public void onLoadHotSearchData(String keyword) {
133+
// fix bug #3653
134+
if (getContext() == null || mSearchView == null) return;
133135
Animation anim = AnimationUtils.loadAnimation(getContext(), android.R.anim.fade_in);
134136
anim.setDuration(800);
135137
mSearchView.startAnimation(anim);

app/src/main/java/com/rae/cnblogs/presenter/impl/MomentPresenterImpl.java

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ protected void onError(String message) {
7171

7272
@Override
7373
protected void accept(String s) {
74+
if (mView == null) return;
7475
mAtMeCount = Rx.parseInt(s);
7576
mView.onMessageCountChanged(mReplyMeCount, mAtMeCount);
7677
}

app/src/main/java/com/rae/cnblogs/presenter/impl/blog/BlogListPresenterImpl.java

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public BlogListPresenterImpl(Context context, IBlogListPresenter.IBlogListView v
4949

5050
@Override
5151
public void start() {
52+
if (mView == null) return;
5253
mPageIndex = 1;
5354
mBlogList.clear();
5455
// 加载列表

app/src/main/res/layout/item_moment_comment.xml

-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
android:layout_height="wrap_content"
88
android:layout_marginBottom="0dp"
99
android:background="@drawable/bg_blog_item_selector"
10-
android:foreground="?selectableItemBackground"
1110
android:orientation="vertical"
1211
android:paddingLeft="@dimen/default_margin"
1312
android:paddingRight="@dimen/default_margin"

app/src/main/res/layout/item_moment_list.xml

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
android:layout_height="wrap_content"
66
android:layout_marginBottom="1dp"
77
android:background="@drawable/bg_blog_item_selector"
8-
android:foreground="?selectableItemBackground"
98
android:orientation="vertical"
109
android:paddingBottom="12dp"
1110
android:paddingLeft="@dimen/default_margin"

app/tinker-support.gradle

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ tinkerSupport {
4040
tinkerId = "cnblogs-basic-1.1.2"
4141

4242
// 构建多渠道补丁时使用
43-
buildAllFlavorsDir = "${bakPath}/${baseApkDir}"
43+
// buildAllFlavorsDir = "${bakPath}/${baseApkDir}"
4444

4545
// 是否启用加固模式,默认为false.(tinker-spport 1.0.7起支持)
4646
// isProtectedApp = true

build.gradle

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,12 @@ buildscript {
1616

1717
allprojects {
1818
repositories {
19-
google()
2019
maven { url 'http://maven.raeblog.com:8081/repository/maven-public/' }
2120
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
21+
maven { url "http://mvn.leancloud.cn/nexus/content/repositories/public" }
22+
maven { url "https://jitpack.io" }
2223
jcenter()
24+
google()
2325
}
2426
}
2527

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
#Sat Feb 10 17:03:03 CST 2018
1+
#Thu Mar 01 11:25:28 CST 2018
22
distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip

0 commit comments

Comments
 (0)