Skip to content
Permalink
Browse files

// 添加声明

  • Loading branch information...
razerdp committed Dec 20, 2017
1 parent 16a798f commit babdf696675a8becab4b887c6ada1475866c7927
@@ -3,19 +3,27 @@

欢迎来到本项目,这个项目是一个尝试性项目,目的在于从无到有撸出一个微信朋友圈。</br>

#### 在更新了Gradle 3.0后,可能会出现dexMerge错误,定位知道是bmob的sdk内含gson与gson2.8的冲突
#### 事实上暂时来说我不知道哪里引用了gson2.8(打印dependences Tree也找不到),所以如果出现这个情况,请删除bmob包下的gson-2.6.2.jar
>具体方法:
> - 切换到Project标签
> - 定位到External Libraries
> - 找到cn.bmob.android:bmob-sdk-xxx,展开
> - 找到gson-2.6.2.jar,右键delete即可
##### 如果您需要bmob的后台数据查看,可以提交issue,留下用户名或者邮箱,我拉你进团队管理(无修改权限)

##### 因为采取组件化,所以可能push上来的是组件的build,如果您要build整个app,请把gradle.properties下的 isModule=true 切换为false并sync gradle

##### 【简略更新日志】
>**来自项目作者(我)的一句话:**
>
> - 本项目后台采取`Bmob`作为后端支持,但因为这是一个开源的项目,并非商业盈利项目,因此使用的方案仅仅是免费版本
>
> **但是免费版本意味着不稳定以及限制,目前就有着每个月流量20G的限制。**
>
> 自从开发了发布朋友圈之后,很多开发者或者感兴趣的朋友不断的上传图片,上传重复的动态,甚至有着一条动态发布数十条之多。
>
> 这急剧的消耗着我后端的流量,要知道你的一条动态可不是只给你测试的啊,而是很多人一起共用的
>
> 一直以来我也有维护,虽然不是很经常,但是这个项目至少还远远没到心中的效果,所以会不断的优化/重构下去,只是服务器的压力我真的吃不消
>
> 所以拜托诸位,如果有闲钱,可以去打赏一下,我去买流量(0.3RMB/GB),如果不想打赏也没问题,但请不要不断的去发布动态,消耗不必要的流量,毕竟20G真的,很少很少,这个月消耗完了,就要等下个月了。
>
> 最后,如果您遇到图片加载失败,请不要担心,纯粹就是没流量而已。
## 【简略更新日志】

- 2017/12/20
+ 添加服务器消息
+ 优化`CommentContentsLayout`,在`circle_dev_commentcontentslayout`分支中开发收起/展开评论功能

- 2017/12/13
+ 修复`PraiseWidget`点赞控件可能出现的无限回调`draw()`方法的问题,感谢[@Leu-Z](https://github.com/Leu-Z)
@@ -31,18 +39,6 @@
+ 修复相册扫描没有进度条的问题
+ 增加kotlin分支(用于学习并逐渐转换到kotlin)

- 2017/10/24
+ 现在可以发布动态了哦~
+ 增加删除动态功能
+ 调整动态布局,看起来更和谐

- 2017/10/12
+ 重新构建了选择图片的代码
+ 初步完成发布动态(仅完成选择图片)

- 2017/09/07
+ 增加了权限兼容(到7.0)

- ...more

- 更多日志请看 → [更新日志](https://github.com/razerdp/FriendCircle/blob/master/UPDATE_LOG.md)
@@ -54,31 +50,34 @@
[代码实现逻辑(简书合集)](http://www.jianshu.com/notebooks/3224048/latest)


#### 【最新进度:发布动态】
##### 2017-10-24
## 【最新进度:发布动态】
### 2017-10-24

发布页面完成(图片选择)

![](https://github.com/razerdp/FriendCirclePreview/blob/master/img/device-2017-10-24.gif)

***

#### 如果您遇到popup的导入失败,请在工程的gradle(不是app的gradle哦)加上这句话:
## 部分问题解决:

```xml
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
```
#### 在更新了Gradle 3.0后,可能会出现dexMerge错误,定位知道是bmob的sdk内含gson与gson2.8的冲突
#### 事实上暂时来说我不知道哪里引用了gson2.8(打印dependences Tree也找不到),所以如果出现这个情况,请删除bmob包下的gson-2.6.2.jar
>具体方法:
> - 切换到Project标签
> - 定位到External Libraries
> - 找到cn.bmob.android:bmob-sdk-xxx,展开
> - 找到gson-2.6.2.jar,右键delete即可
##### 如果您需要bmob的后台数据查看,可以提交issue,留下用户名或者邮箱,我拉你进团队管理(无修改权限)

##### 因为采取组件化,所以可能push上来的是组件的build,如果您要build整个app,请把gradle.properties下的 isModule=true 切换为false并sync gradle


##### 关于作者我:
## 关于作者我:
普普通通的安卓开发者一枚。

##### 关于项目:
## 关于项目:
本项目意在按照我的经验弄出一个微信朋友圈,也许无法完全实现,但高仿应该是没问题的,只是时间问题←_←。
如果您感兴趣,欢迎加群一起讨论,本群新创建,暂时没有什么特别的要求哈,大家都是因为兴趣-V-
@@ -87,9 +86,11 @@
如果您愿意捐助一下项目,可以通过微信捐助哟~
如果您愿意捐助一下项目,可以通过微信/支付宝捐助哟~
| 微信 | 支付宝 |
| ---- | ---- |
| ![](https://github.com/razerdp/FriendCircle/blob/master/wechat.png)| ![](https://github.com/razerdp/FriendCircle/blob/master/alipay.png) |
![](https://github.com/razerdp/FriendCircle/blob/master/wechat.jpg)
BIN +65.5 KB alipay.png
Binary file not shown.
@@ -31,6 +31,11 @@
android:screenOrientation="portrait"
android:theme="@style/Transparent"/>

<activity
android:name=".activity.other.ServiceInfoActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
/>

<provider
android:name="android.support.v4.content.FileProvider"
@@ -7,12 +7,14 @@
import android.support.annotation.Nullable;

import com.razerdp.github.com.common.entity.PhotoBrowseInfo;
import com.razerdp.github.com.common.entity.other.ServiceInfo;
import com.razerdp.github.com.common.router.RouterList;

import java.util.ArrayList;
import java.util.List;

import razerdp.friendcircle.activity.gallery.PhotoBrowseActivity;
import razerdp.friendcircle.activity.other.ServiceInfoActivity;
import razerdp.github.com.lib.common.entity.ImageInfo;
import razerdp.github.com.photoselect.PhotoSelectActivity;
import razerdp.github.com.publish.PublishActivity;
@@ -58,6 +60,18 @@ public static void startToPhotoSelectActivity(Activity act, int requestCode) {
Intent intent = new Intent(act, PhotoSelectActivity.class);
act.startActivityForResult(intent, requestCode);
SwitchActivityTransitionUtil.transitionVerticalIn(act);
}

/**
* 发射到服务器消息页面
*
* @param act
*/
public static void startToServiceInfoActivity(Activity act, ServiceInfo info) {
Intent intent = new Intent(act, ServiceInfoActivity.class);
intent.putExtra("info", info);
act.startActivity(intent);
SwitchActivityTransitionUtil.transitionVerticalIn(act);
}

}
@@ -1,5 +1,6 @@
package razerdp.friendcircle.activity.circledemo;

import android.animation.Animator;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
@@ -17,17 +18,20 @@
import com.razerdp.github.com.common.entity.LikesInfo;
import com.razerdp.github.com.common.entity.MomentsInfo;
import com.razerdp.github.com.common.entity.UserInfo;
import com.razerdp.github.com.common.entity.other.ServiceInfo;
import com.razerdp.github.com.common.manager.LocalHostManager;
import com.razerdp.github.com.common.request.MomentsRequest;
import com.razerdp.github.com.common.router.RouterList;
import com.socks.library.KLog;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

import cn.bmob.v3.exception.BmobException;
import razerdp.friendcircle.R;
import razerdp.friendcircle.activity.ActivityLauncher;
import razerdp.friendcircle.app.manager.ServiceInfoManager;
import razerdp.friendcircle.app.manager.UpdateInfoManager;
import razerdp.friendcircle.app.mvp.presenter.impl.MomentPresenter;
import razerdp.friendcircle.app.mvp.view.IMomentView;
@@ -45,6 +49,7 @@
import razerdp.github.com.ui.base.BaseTitleBarActivity;
import razerdp.github.com.ui.helper.PhotoHelper;
import razerdp.github.com.ui.imageloader.ImageLoadMnanger;
import razerdp.github.com.ui.util.AnimUtils;
import razerdp.github.com.ui.util.UIHelper;
import razerdp.github.com.ui.widget.commentwidget.CommentBox;
import razerdp.github.com.ui.widget.commentwidget.CommentWidget;
@@ -53,6 +58,9 @@
import razerdp.github.com.ui.widget.pullrecyclerview.CircleRecyclerView;
import razerdp.github.com.ui.widget.pullrecyclerview.CircleRecyclerView.OnPreDispatchTouchListener;
import razerdp.github.com.ui.widget.pullrecyclerview.interfaces.OnRefreshListener2;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;

/**
* Created by 大灯泡 on 2016/10/26.
@@ -67,6 +75,7 @@


private CircleRecyclerView circleRecyclerView;
private TextView mServiceTipsView;
private CommentBox commentBox;
private HostViewHolder hostViewHolder;
private CircleMomentsAdapter adapter;
@@ -88,9 +97,11 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
initView();
initKeyboardHeightObserver();
UIHelper.ToastMessage("请尽量不要上传黄图,谢谢");
delayCheckServiceInfo();

}


@Override
public void onHandleIntent(Intent intent) {

@@ -114,16 +125,18 @@ private void initView() {
circleRecyclerView.setOnPreDispatchTouchListener(this);
circleRecyclerView.addHeaderView(hostViewHolder.getView());

mServiceTipsView = (TextView) findViewById(R.id.service_tips);

commentBox = (CommentBox) findViewById(R.id.widget_comment);
commentBox.setOnCommentSendClickListener(onCommentSendClickListener);

CircleMomentsAdapter.Builder<MomentsInfo> builder = new CircleMomentsAdapter.Builder<>(this);
builder.addType(EmptyMomentsVH.class, MomentsType.EMPTY_CONTENT, R.layout.moments_empty_content)
.addType(MultiImageMomentsVH.class, MomentsType.MULTI_IMAGES, R.layout.moments_multi_image)
.addType(TextOnlyMomentsVH.class, MomentsType.TEXT_ONLY, R.layout.moments_only_text)
.addType(WebMomentsVH.class, MomentsType.WEB, R.layout.moments_web)
.setData(momentsInfoList)
.setPresenter(presenter);
.addType(MultiImageMomentsVH.class, MomentsType.MULTI_IMAGES, R.layout.moments_multi_image)
.addType(TextOnlyMomentsVH.class, MomentsType.TEXT_ONLY, R.layout.moments_only_text)
.addType(WebMomentsVH.class, MomentsType.WEB, R.layout.moments_web)
.setData(momentsInfoList)
.setPresenter(presenter);
adapter = builder.build();
circleRecyclerView.setAdapter(adapter);
circleRecyclerView.autoRefresh();
@@ -228,9 +241,9 @@ public void onFinish(String filePath) {
List<ImageInfo> selectedPhotos = new ArrayList<ImageInfo>();
selectedPhotos.add(new ImageInfo(filePath, null, null, 0, 0));
ActivityLauncher.startToPublishActivityWithResult(FriendCircleDemoActivity.this,
RouterList.PublishActivity.MODE_MULTI,
selectedPhotos,
RouterList.PublishActivity.requestCode);
RouterList.PublishActivity.MODE_MULTI,
selectedPhotos,
RouterList.PublishActivity.requestCode);
}

@Override
@@ -355,6 +368,48 @@ public void onBackPressed() {
}
}


//服务器消息检查,非项目所需↓
private void delayCheckServiceInfo() {
Observable.timer(500, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
checkServiceInfo();
}
});
}

private void checkServiceInfo() {
ServiceInfoManager.INSTANCE.check(new ServiceInfoManager.OnCheckServiceInfoListener() {
@Override
public void onCheckFinish(@Nullable final ServiceInfo serviceInfo) {
if (serviceInfo != null) {
mServiceTipsView.setText(serviceInfo.getTips());
mServiceTipsView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ActivityLauncher.startToServiceInfoActivity(FriendCircleDemoActivity.this, serviceInfo);
}
});
mServiceTipsView.animate().alpha(1).translationY(UIHelper.dipToPx(50)).setDuration(500).setListener(new AnimUtils.SimpleAnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
mServiceTipsView.setVisibility(View.VISIBLE);
}

@Override
public void onAnimationEnd(Animator animation) {
mServiceTipsView.requestFocus();
}
}).start();
}
}
});
}
//服务器消息检查,非项目所需↑

//=============================================================call back
private CommentBox.OnCommentSendClickListener onCommentSendClickListener = new CommentBox.OnCommentSendClickListener() {
@Override
Oops, something went wrong.

0 comments on commit babdf69

Please sign in to comment.
You can’t perform that action at this time.