Skip to content

Commit 4dd466a

Browse files
committed
添加用户反馈功能,集成leancloud
1 parent 9cc8536 commit 4dd466a

File tree

11 files changed

+156
-36
lines changed

11 files changed

+156
-36
lines changed

app/build.gradle

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ def signStorePassword = properties.getProperty("keystore.storePassword")
1111
def signStoreFile = properties.getProperty("keystore.file")
1212
def umengAppKey = properties.getProperty("umengAppKey")
1313
def buglyAppId = properties.getProperty("buglyAppId")
14+
def leancloudAppId = properties.getProperty("leancloudAppId")
15+
def leancloudAppKey = properties.getProperty("leancloudAppKey")
1416

1517

1618
android {
@@ -39,6 +41,8 @@ android {
3941
multiDexEnabled true
4042
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
4143
buildConfigField 'String', 'BUGLY_APP_ID', '"' + buglyAppId + '"'
44+
buildConfigField 'String', 'LEAN_CLOUD_APP_ID', '"' + leancloudAppId + '"'
45+
buildConfigField 'String', 'LEAN_CLOUD_APP_KEY', '"' + leancloudAppKey + '"'
4246
manifestPlaceholders = [
4347
UMENG_APPKEY : umengAppKey,
4448
UMENG_CHANNEL: 'DEV'
@@ -51,7 +55,6 @@ android {
5155
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
5256
}
5357
debug {
54-
// applicationIdSuffix '.debug'
5558
minifyEnabled false
5659
debuggable true
5760
signingConfig signingConfigs.release
@@ -88,6 +91,10 @@ dependencies {
8891
compile 'com.tencent.bugly:crashreport_upgrade:1.3.1'
8992
// 非常强悍的RecyclerView
9093
compile 'eu.davidea:flexible-adapter:5.0.0-rc2'
94+
// LeanCloud 基础包
95+
compile 'cn.leancloud.android:avoscloud-sdk:v4.4.3'
96+
// LeanCloud 用户反馈包
97+
compile 'cn.leancloud.android:avoscloud-feedback:v4.4.3@aar'
9198
}
9299

93100
// 热更新

app/src/main/AndroidManifest.xml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,22 @@
164164

165165
</activity>
166166

167+
<provider
168+
android:name="android.support.v4.content.FileProvider"
169+
android:authorities="com.rae.cnblogs.fileprovider"
170+
android:exported="false"
171+
android:grantUriPermissions="true">
172+
<meta-data
173+
android:name="android.support.FILE_PROVIDER_PATHS"
174+
android:resource="@xml/lc_fileprovider_path" />
175+
</provider>
176+
177+
<activity
178+
android:name=".activity.FeedbackActivity"
179+
android:label="@string/feedback"
180+
android:launchMode="singleTop"
181+
android:windowSoftInputMode="stateHidden"/>
182+
167183

168184
<meta-data
169185
android:name="UMENG_APPKEY"

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

Lines changed: 63 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
import android.content.Context;
55
import android.content.Intent;
66
import android.net.Uri;
7+
import android.support.annotation.NonNull;
78
import android.text.TextUtils;
89

910
import com.rae.cnblogs.activity.BlogContentActivity;
1011
import com.rae.cnblogs.activity.BloggerActivity;
1112
import com.rae.cnblogs.activity.CategoryActivity;
1213
import com.rae.cnblogs.activity.FavoritesActivity;
14+
import com.rae.cnblogs.activity.FeedbackActivity;
1315
import com.rae.cnblogs.activity.FriendsActivity;
1416
import com.rae.cnblogs.activity.LoginActivity;
1517
import com.rae.cnblogs.activity.MainActivity;
@@ -33,8 +35,10 @@ public final class AppRoute {
3335
/*朋友界面 - 来自粉丝*/
3436
public static final int ACTIVITY_FRIENDS_TYPE_FANS = 1;
3537
/*朋友界面 - 来自关注*/
36-
public static final int ACTIVITY_FRIENDS_TYPE_FOLLOW = 2;
38+
private static final int ACTIVITY_FRIENDS_TYPE_FOLLOW = 2;
39+
// 分类
3740
public static final int REQ_CODE_CATEGORY = 102;
41+
// 收藏
3842
public static final int REQ_CODE_FAVORITES = 103;
3943

4044
private static void startActivity(Context context, Intent intent) {
@@ -53,39 +57,59 @@ private static void startActivityForResult(Activity context, Class<?> cls, int r
5357
startActivityForResult(context, new Intent(context, cls), requestCode);
5458
}
5559

60+
/**
61+
* 博客正文界面
62+
*
63+
* @param blog 博客实体
64+
* @param type 博客类型
65+
*/
5666
public static void jumpToBlogContent(Context context, BlogBean blog, BlogType type) {
5767
Intent intent = new Intent(context, BlogContentActivity.class);
5868
intent.putExtra("blog", blog);
5969
intent.putExtra("type", type.getTypeName());
6070
startActivity(context, intent);
6171
}
6272

73+
/**
74+
* 网页
75+
*
76+
* @param url 路径
77+
*/
6378
public static void jumpToWeb(Context context, String url) {
6479
Intent intent = new Intent(context, WebActivity.class);
6580
intent.setData(Uri.parse(url));
6681
startActivity(context, intent);
6782
}
6883

84+
/**
85+
* 用户反馈
86+
*/
87+
public static void jumpToFeedback(Context context) {
88+
Intent intent = new Intent(context, FeedbackActivity.class);
89+
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
90+
startActivity(context, intent);
91+
}
92+
93+
94+
/**
95+
* 网页,新线程
96+
*
97+
* @param url 路径
98+
*/
6999
public static void jumpToWebNewTask(Context context, String url) {
70100
Intent intent = new Intent(context, WebActivity.class);
71101
intent.setData(Uri.parse(url));
72102
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
73103
startActivity(context, intent);
74104
}
75105

106+
/**
107+
* 主界面
108+
*/
76109
public static void jumpToMain(Context context) {
77110
startActivity(context, MainActivity.class);
78111
}
79112

80-
// public static void jumpToDownload(Context context, String url) {
81-
// try {
82-
// Intent intent = new Intent();
83-
// intent.setData(Uri.parse(url));
84-
// startActivity(context, intent);
85-
// } catch (Exception e) {
86-
// e.printStackTrace();
87-
// }
88-
// }
89113

90114
/**
91115
* 登录
@@ -95,16 +119,28 @@ public static void jumpToLogin(Context context) {
95119
}
96120

97121
/**
98-
* 登录
122+
* 登录,有回调结果
99123
*/
100124
public static void jumpToWebLogin(Activity context) {
101125
startActivityForResult(context, WebLoginActivity.class, REQ_CODE_WEB_LOGIN);
102126
}
103127

128+
/**
129+
* 粉丝
130+
*
131+
* @param bloggerName 博主昵称
132+
* @param userId 博主ID
133+
*/
104134
public static void jumpToFans(Context context, String bloggerName, String userId) {
105135
jumpToFriends(context, ACTIVITY_FRIENDS_TYPE_FANS, bloggerName, userId);
106136
}
107137

138+
/**
139+
* 关注
140+
*
141+
* @param bloggerName 博主昵称
142+
* @param userId 博主ID
143+
*/
108144
public static void jumpToFollow(Context context, String bloggerName, String userId) {
109145
jumpToFriends(context, ACTIVITY_FRIENDS_TYPE_FOLLOW, bloggerName, userId);
110146
}
@@ -116,21 +152,32 @@ public static void jumpToFollow(Context context, String bloggerName, String user
116152
* @param bloggerName 博主昵称
117153
* @param userId 博主ID
118154
*/
119-
public static void jumpToFriends(Context context, int type, String bloggerName, String userId) {
155+
private static void jumpToFriends(Context context, int type, String bloggerName, String userId) {
120156
Intent intent = new Intent(context, FriendsActivity.class);
121157
intent.putExtra("userId", userId);
122158
intent.putExtra("bloggerName", bloggerName);
123159
intent.putExtra("fromType", type);
124160
startActivity(context, intent);
125161
}
126162

127-
public static void jumpToImagePreview(Context context, ArrayList<String> images, int position) {
163+
/**
164+
* 图片大图预览
165+
*
166+
* @param images 图片数组
167+
* @param position 跳转到低几张图片,默认传0
168+
*/
169+
public static void jumpToImagePreview(Context context, @NonNull ArrayList<String> images, int position) {
128170
Intent intent = new Intent(context, ImagePreviewActivity.class);
129171
intent.putStringArrayListExtra("images", images);
130172
intent.putExtra("position", position);
131173
startActivity(context, intent);
132174
}
133175

176+
/**
177+
* 博主界面
178+
*
179+
* @param blogApp 博客APP
180+
*/
134181
public static void jumpToBlogger(Context context, String blogApp) {
135182
if (TextUtils.isEmpty(blogApp)) {
136183
AppUI.toast(context, "博主信息为空!");
@@ -142,6 +189,9 @@ public static void jumpToBlogger(Context context, String blogApp) {
142189
}
143190

144191

192+
/**
193+
* 分类管理
194+
*/
145195
public static void jumpToCategoryForResult(Activity context) {
146196
Intent intent = new Intent(context, CategoryActivity.class);
147197
startActivityForResult(context, intent, REQ_CODE_CATEGORY);

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.content.Context;
55
import android.support.multidex.MultiDex;
66

7+
import com.avos.avoscloud.AVOSCloud;
78
import com.nostra13.universalimageloader.core.ImageLoader;
89
import com.rae.cnblogs.sdk.UserProvider;
910
import com.rae.cnblogs.sdk.bean.UserInfoBean;
@@ -12,7 +13,6 @@
1213
import com.rae.swift.session.SessionManager;
1314
import com.squareup.leakcanary.LeakCanary;
1415
import com.squareup.leakcanary.RefWatcher;
15-
import com.tencent.bugly.Bugly;
1616
import com.tencent.bugly.beta.Beta;
1717
import com.tencent.tinker.loader.app.TinkerApplication;
1818
import com.tencent.tinker.loader.shareutil.ShareConstants;
@@ -49,6 +49,11 @@ public void onCreate() {
4949
refWatcher = LeakCanary.install(this);
5050
}
5151

52+
// LeanCloud用户反馈初始化
53+
AVOSCloud.initialize(getApplication(), BuildConfig.LEAN_CLOUD_APP_ID, BuildConfig.LEAN_CLOUD_APP_KEY);
54+
AVOSCloud.setDebugLogEnabled(BuildConfig.DEBUG);
55+
56+
5257
// 一些要求不高的初始化操作放到线程中去操作
5358
new Thread(new Runnable() {
5459
@Override
@@ -57,15 +62,15 @@ public void run() {
5762
SessionManager.initWithConfig(new SessionManager.ConfigBuilder().context(getApplication()).userClass(UserInfoBean.class).build());
5863
initUmengShareConfig();
5964

65+
6066
// 日志上报
61-
Bugly.init(getApplication(), BuildConfig.BUGLY_APP_ID, BuildConfig.DEBUG);
67+
// Bugly.init(getApplication(), BuildConfig.BUGLY_APP_ID, BuildConfig.DEBUG);
6268

6369
if (BuildConfig.BUILD_TYPE.equals("debug") || BuildConfig.DEBUG) {
6470
onDebugMode();
6571
}
6672
}
6773
}).start();
68-
6974
}
7075

7176
/**

app/src/main/java/com/rae/cnblogs/activity/LauncherActivity.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ public void onJumpToBlog(String id) {
8888

8989
@Override
9090
public void onNormalImage() {
91+
mDisplayView.setImageResource(R.drawable.launcher_background);
9192
mDisplayView.startAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
9293
}
9394

app/src/main/java/com/rae/cnblogs/activity/MainActivity.java

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,12 @@
1616
import android.view.View;
1717
import android.widget.TextView;
1818

19+
import com.avos.avoscloud.AVException;
20+
import com.avos.avoscloud.feedback.Comment;
21+
import com.avos.avoscloud.feedback.FeedbackThread;
1922
import com.nostra13.universalimageloader.core.ImageLoader;
2023
import com.rae.cnblogs.AppMobclickAgent;
24+
import com.rae.cnblogs.AppRoute;
2125
import com.rae.cnblogs.AppStatusBar;
2226
import com.rae.cnblogs.AppUI;
2327
import com.rae.cnblogs.R;
@@ -43,6 +47,8 @@
4347
import org.greenrobot.eventbus.EventBus;
4448
import org.greenrobot.eventbus.Subscribe;
4549

50+
import java.util.List;
51+
4652
import butterknife.BindView;
4753

4854
public class MainActivity extends BaseActivity {
@@ -142,10 +148,42 @@ protected void accept(VersionInfo versionInfo) {
142148
}
143149
});
144150

145-
151+
// 意见反馈的回复
152+
checkFeedbackMessage();
146153
requestPermissions();
147154
}
148155

156+
/**
157+
* 检查是否有新的意见反馈回复消息
158+
*/
159+
private void checkFeedbackMessage() {
160+
final int originalCount = FeedbackThread.getInstance().getCommentsList().size();
161+
FeedbackThread.getInstance().sync(new FeedbackThread.SyncCallback() {
162+
@Override
163+
public void onCommentsSend(List<Comment> list, AVException e) {
164+
165+
}
166+
167+
@Override
168+
public void onCommentsFetch(List<Comment> list, AVException e) {
169+
if (list.size() > originalCount) {
170+
HintCardDialog dialog = new HintCardDialog(getContext());
171+
dialog.setMessage(getString(R.string.feedback_message));
172+
dialog.showCloseButton();
173+
dialog.setEnSureText(getString(R.string.view_now));
174+
dialog.setOnEnSureListener(new IAppDialogClickListener() {
175+
@Override
176+
public void onClick(IAppDialog dialog, int buttonType) {
177+
dialog.dismiss();
178+
AppRoute.jumpToFeedback(getContext());
179+
}
180+
});
181+
dialog.show();
182+
}
183+
}
184+
});
185+
}
186+
149187
/**
150188
* 申请权限
151189
*/

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,9 +195,9 @@ public void onFavoritesClick() {
195195
/**
196196
* 问题反馈
197197
*/
198-
@OnClick(R.id.ll_issue)
199-
public void onIssueClick() {
200-
AppRoute.jumpToWeb(this.getContext(), getString(R.string.github_issue_url));
198+
@OnClick(R.id.ll_feedback)
199+
public void onFeedbackClick() {
200+
AppRoute.jumpToFeedback(getContext());
201201
}
202202

203203
/**

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@
147147
</LinearLayout>
148148

149149
<LinearLayout
150-
android:id="@+id/ll_issue"
150+
android:id="@+id/ll_feedback"
151151
style="@style/ItemStyle"
152152
android:layout_width="match_parent"
153153
android:layout_height="wrap_content">
@@ -156,7 +156,7 @@
156156
style="@style/ItemTitleStyle"
157157
android:layout_width="match_parent"
158158
android:layout_height="wrap_content"
159-
android:text="@string/issue"
159+
android:text="@string/feedback"
160160
android:textSize="@dimen/h2"/>
161161

162162
</LinearLayout>

0 commit comments

Comments
 (0)