470 lines
20 KiB
Java
470 lines
20 KiB
Java
package com.gh.gamecenter.personal;
|
||
|
||
import android.arch.lifecycle.Lifecycle;
|
||
import android.arch.lifecycle.Observer;
|
||
import android.arch.lifecycle.ViewModelProviders;
|
||
import android.content.Intent;
|
||
import android.content.SharedPreferences;
|
||
import android.os.Bundle;
|
||
import android.preference.PreferenceManager;
|
||
import android.support.annotation.Nullable;
|
||
import android.text.TextUtils;
|
||
import android.view.View;
|
||
import android.widget.ImageView;
|
||
import android.widget.TextView;
|
||
|
||
import com.facebook.drawee.view.SimpleDraweeView;
|
||
import com.gh.base.fragment.BaseFragment;
|
||
import com.gh.base.fragment.WaitingDialogFragment;
|
||
import com.gh.common.util.CheckLoginUtils;
|
||
import com.gh.common.util.DataCollectionUtils;
|
||
import com.gh.common.util.DataUtils;
|
||
import com.gh.common.util.DialogUtils;
|
||
import com.gh.common.util.GetLoginDataUtils;
|
||
import com.gh.common.util.PackageUtils;
|
||
import com.gh.gamecenter.CollectionActivity;
|
||
import com.gh.gamecenter.GameDetailActivity;
|
||
import com.gh.gamecenter.InstallActivity;
|
||
import com.gh.gamecenter.LoginActivity;
|
||
import com.gh.gamecenter.MainActivity;
|
||
import com.gh.gamecenter.MessageActivity;
|
||
import com.gh.gamecenter.NewsDetailActivity;
|
||
import com.gh.gamecenter.R;
|
||
import com.gh.gamecenter.SettingActivity;
|
||
import com.gh.gamecenter.ShareGhActivity;
|
||
import com.gh.gamecenter.SubjectActivity;
|
||
import com.gh.gamecenter.SuggestSelectActivity;
|
||
import com.gh.gamecenter.UserInfoActivity;
|
||
import com.gh.gamecenter.entity.AppEntity;
|
||
import com.gh.gamecenter.entity.LoginTokenEntity;
|
||
import com.gh.gamecenter.entity.SignEntity;
|
||
import com.gh.gamecenter.entity.UserInfoEntity;
|
||
import com.gh.gamecenter.eventbus.EBConcernChanged;
|
||
import com.gh.gamecenter.eventbus.EBNetworkState;
|
||
import com.gh.gamecenter.eventbus.EBReuse;
|
||
import com.gh.gamecenter.eventbus.EBSkip;
|
||
import com.gh.gamecenter.manager.UserManager;
|
||
import com.gh.gamecenter.message.MessageUnreadViewModel;
|
||
import com.gh.gamecenter.qa.myqa.MyAskActivity;
|
||
import com.gh.gamecenter.retrofit.Response;
|
||
import com.gh.gamecenter.retrofit.RetrofitManager;
|
||
import com.gh.gamecenter.room.AppDatabase;
|
||
import com.gh.gamecenter.user.ApiResponse;
|
||
import com.gh.gamecenter.user.LoginTag;
|
||
import com.gh.gamecenter.user.UserViewModel;
|
||
import com.halo.assistant.HaloApp;
|
||
import com.jakewharton.rxbinding.view.RxView;
|
||
import com.lightgame.config.CommonDebug;
|
||
import com.lightgame.utils.Utils;
|
||
import com.tencent.connect.common.Constants;
|
||
|
||
import org.greenrobot.eventbus.EventBus;
|
||
import org.greenrobot.eventbus.Subscribe;
|
||
import org.greenrobot.eventbus.ThreadMode;
|
||
import org.json.JSONObject;
|
||
|
||
import java.text.SimpleDateFormat;
|
||
import java.util.Locale;
|
||
import java.util.concurrent.TimeUnit;
|
||
|
||
import butterknife.BindView;
|
||
import butterknife.OnClick;
|
||
import retrofit2.HttpException;
|
||
import rx.android.schedulers.AndroidSchedulers;
|
||
import rx.schedulers.Schedulers;
|
||
|
||
public class PersonalFragment extends BaseFragment implements Observer<ApiResponse<UserInfoEntity>>, GetLoginDataUtils.OnLoginDataListener {
|
||
|
||
@BindView(R.id.personal_login_qq)
|
||
View mLoginQq;
|
||
@BindView(R.id.personal_login_wechat)
|
||
View mLoginWechat;
|
||
@BindView(R.id.personal_login_weibo)
|
||
View mLoginWeibo;
|
||
@BindView(R.id.personal_user_icon)
|
||
SimpleDraweeView mUserIcon;
|
||
@BindView(R.id.personal_user_name)
|
||
TextView mUserName;
|
||
@BindView(R.id.login_qq_icon)
|
||
ImageView mLoginQqIcon;
|
||
@BindView(R.id.login_qq_tv)
|
||
TextView mLoginQqTv;
|
||
@BindView(R.id.login_wechat_icon)
|
||
ImageView mLoginWechatIcon;
|
||
@BindView(R.id.login_wechat_tv)
|
||
TextView mLoginWechatTv;
|
||
@BindView(R.id.login_weibo_icon)
|
||
ImageView mLoginWeiboIcon;
|
||
@BindView(R.id.login_weibo_tv)
|
||
TextView mLoginWeiboTv;
|
||
@BindView(R.id.personal_game)
|
||
View mPersonalGame;
|
||
@BindView(R.id.personal_share)
|
||
View mPersonalShare;
|
||
@BindView(R.id.personal_suggestion)
|
||
View mPersonalSuggestion;
|
||
@BindView(R.id.personal_setting_update_hint)
|
||
TextView mPersonalSettingUpdateHint;
|
||
@BindView(R.id.personal_setting)
|
||
View mPersonalSetting;
|
||
@BindView(R.id.login_message_hint)
|
||
View mLoginMessageHint;
|
||
@BindView(R.id.user_icon_hint)
|
||
View mIconHint;
|
||
@BindView(R.id.personal_ask)
|
||
View mPersonalAsk;
|
||
// @BindView(R.id.personal_game_rv)
|
||
// RecyclerView mGameRv;
|
||
|
||
public final static String LOGIN_TAG = "login_tag"; //登入标识
|
||
public final static String LOGOUT_TAG = "logout_tag"; // 登出标识
|
||
public final static String MESSAGE_UNREAD_TAG = "message_unread_tag";
|
||
public final static String MESSAGE_READ_OVER = "MESSAGE_READ_OVER";
|
||
public static final int REQUEST_MESSAGE = 199;
|
||
|
||
private UserInfoEntity mUserInfoEntity;
|
||
|
||
private WaitingDialogFragment mLoginDialog;
|
||
|
||
private SharedPreferences sp;
|
||
private AppDatabase mDatabase;
|
||
|
||
private UserViewModel mUserViewModel;
|
||
private MessageUnreadViewModel mUnreadViewModel;
|
||
|
||
|
||
@Override
|
||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||
super.onActivityResult(requestCode, resultCode, data);
|
||
if (requestCode == Constants.REQUEST_LOGIN) { // QQ Login callback
|
||
GetLoginDataUtils.getInstance(getContext()).onQQCallback(requestCode, resultCode, data);
|
||
} else if (requestCode == 32973) {// 32973 WeiBo requestCode
|
||
GetLoginDataUtils.getInstance(getContext()).onWeiboCallback(requestCode, resultCode, data);
|
||
} else if (requestCode == REQUEST_MESSAGE) {
|
||
if (mUnreadViewModel != null) mUnreadViewModel.retry();
|
||
}
|
||
}
|
||
|
||
@Override
|
||
protected int getLayoutId() {
|
||
return R.layout.fragment_personal;
|
||
}
|
||
|
||
@Override
|
||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||
super.onCreate(savedInstanceState);
|
||
|
||
sp = PreferenceManager.getDefaultSharedPreferences(getContext());
|
||
mDatabase = AppDatabase.getInstance(getContext());
|
||
|
||
checkUpdate();
|
||
|
||
final UserViewModel.Factory factory = new UserViewModel.Factory(getActivity().getApplication());
|
||
mUserViewModel = ViewModelProviders.of(this, factory).get(UserViewModel.class);
|
||
mUserViewModel.getLoginObsUserinfo().observe(this, this);
|
||
|
||
mUnreadViewModel = ViewModelProviders.of(this,
|
||
new MessageUnreadViewModel.Factory(HaloApp.getInstance().getApplication())).get(MessageUnreadViewModel.class);
|
||
mUnreadViewModel.getLiveData().observe(this
|
||
, messageUnread -> {
|
||
if (messageUnread != null && messageUnread.getTotal() > 0) {
|
||
mLoginMessageHint.setVisibility(View.VISIBLE);
|
||
EventBus.getDefault().post(new EBReuse(MESSAGE_UNREAD_TAG));
|
||
} else {
|
||
mLoginMessageHint.setVisibility(View.GONE);
|
||
EventBus.getDefault().post(new EBReuse(MESSAGE_READ_OVER));
|
||
}
|
||
});
|
||
|
||
// 微信/签到
|
||
RxView.clicks(mLoginWechat)
|
||
.throttleFirst(1, TimeUnit.SECONDS)
|
||
.subscribe(aVoid -> {
|
||
if (mUserInfoEntity != null) {
|
||
DataUtils.onEvent(getActivity(), "我的光环", "签到");
|
||
sign();
|
||
} else {
|
||
DataUtils.onEvent(getActivity(), "我的光环", "微信登录");
|
||
GetLoginDataUtils.getInstance(getActivity()).WCLogin(this);
|
||
}
|
||
});
|
||
}
|
||
|
||
|
||
// 连接上网络事件
|
||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||
public void onEventMainThread(EBNetworkState busNetworkState) {
|
||
if (busNetworkState.isNetworkConnected()
|
||
&& mUserViewModel.isLogin()
|
||
&& (mUserInfoEntity == null || TextUtils.isEmpty(UserManager.getInstance().getToken()))) {
|
||
mUserViewModel.retryCheckLogin();
|
||
}
|
||
}
|
||
|
||
@Subscribe(threadMode = ThreadMode.MAIN)
|
||
public void onEventMainThread(EBReuse reuse) {
|
||
if (MESSAGE_READ_OVER.equals(reuse.getType())) { // 消息阅读完成
|
||
if (mLoginMessageHint != null) {
|
||
mLoginMessageHint.setVisibility(View.GONE);
|
||
}
|
||
} else if (LOGOUT_TAG.equals(reuse.getType())) {
|
||
mUserViewModel.logout();
|
||
}
|
||
}
|
||
|
||
@OnClick({R.id.personal_login_qq, R.id.personal_login_weibo, R.id.personal_user_icon,
|
||
R.id.personal_user_name, R.id.personal_game, R.id.personal_share, R.id.personal_suggestion,
|
||
R.id.personal_setting, R.id.personal_ask})
|
||
public void onViewClicked(View view) {
|
||
switch (view.getId()) {
|
||
case R.id.personal_login_qq:
|
||
if (mUserInfoEntity != null) {
|
||
DataUtils.onEvent(getActivity(), "我的光环", "收藏");
|
||
startActivity(CollectionActivity.getCollectionActivity(getContext()));
|
||
} else {
|
||
DataUtils.onEvent(getActivity(), "我的光环", "QQ登录");
|
||
GetLoginDataUtils.getInstance(getActivity()).QQLogin(this, getActivity());
|
||
}
|
||
break;
|
||
case R.id.personal_login_weibo:
|
||
if (mUserInfoEntity != null) {
|
||
DataUtils.onEvent(getActivity(), "我的光环", "消息");
|
||
startActivityForResult(MessageActivity.getIntent(getContext(), "(我的光环)+(消息中心)"), REQUEST_MESSAGE);
|
||
} else {
|
||
DataUtils.onEvent(getActivity(), "我的光环", "微博登录");
|
||
GetLoginDataUtils.getInstance(getActivity()).WeiBoLogin(this, getActivity());
|
||
}
|
||
break;
|
||
case R.id.personal_user_icon:
|
||
case R.id.personal_user_name:
|
||
if (mIconHint.getVisibility() == View.VISIBLE) {
|
||
LoginTokenEntity loginToken = UserManager.getInstance().getLoginTokenEntity();
|
||
mIconHint.setVisibility(View.GONE);
|
||
if (loginToken != null && loginToken.getId() != null)
|
||
sp.edit().putBoolean(loginToken.getId(), false).apply();
|
||
}
|
||
|
||
if (mUserInfoEntity != null) {
|
||
DataUtils.onEvent(getActivity(), "我的光环", "个人中心");
|
||
startActivity(UserInfoActivity.getIntent(getContext()));
|
||
} else {
|
||
DataUtils.onEvent(getActivity(), "我的光环", "手机登录");
|
||
startActivity(LoginActivity.getIntent(getContext()));
|
||
}
|
||
break;
|
||
case R.id.personal_game:
|
||
DataUtils.onEvent(getActivity(), "我的光环", "我的游戏");
|
||
startActivity(InstallActivity.getIntent(getContext()));
|
||
break;
|
||
case R.id.personal_share:
|
||
DataUtils.onEvent(getActivity(), "我的光环", "分享");
|
||
startActivity(ShareGhActivity.getIntent(getContext()));
|
||
break;
|
||
case R.id.personal_suggestion:
|
||
DataUtils.onEvent(getActivity(), "我的光环", "反馈");
|
||
startActivity(SuggestSelectActivity.getIntent(getActivity()));
|
||
break;
|
||
case R.id.personal_setting:
|
||
DataUtils.onEvent(getActivity(), "我的光环", "设置图标");
|
||
DataCollectionUtils.uploadClick(getActivity(), "设置图标", "我的光环");
|
||
startActivity(SettingActivity.getIntent(getContext(),
|
||
mPersonalSettingUpdateHint.getVisibility() == View.VISIBLE, "(我的光环)"));
|
||
break;
|
||
case R.id.personal_ask:
|
||
DataUtils.onEvent(getActivity(), "我的光环", "我的问答");
|
||
CheckLoginUtils.checkLogin(getContext(), () -> startActivity(MyAskActivity.getIntent(getContext())));
|
||
break;
|
||
}
|
||
}
|
||
|
||
private boolean isCanSign(long time) {
|
||
SimpleDateFormat formatDay = new SimpleDateFormat("dd", Locale.CHINA);
|
||
|
||
long lastSignTime = time * 1000;
|
||
long curTime = Utils.getTime(getContext()) * 1000;
|
||
int lastSignDay = Integer.parseInt(formatDay.format(lastSignTime));
|
||
int curDay = Integer.parseInt(formatDay.format(curTime));
|
||
if (lastSignDay != curDay || curTime - lastSignTime > 24 * 60 * 60 * 1000) {
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
private void sign() {
|
||
RetrofitManager.getInstance(getContext()).getApi()
|
||
.postSign(UserManager.getInstance().getUserId())
|
||
.subscribeOn(Schedulers.io())
|
||
.observeOn(AndroidSchedulers.mainThread())
|
||
.subscribe(new Response<SignEntity>() {
|
||
@Override
|
||
public void onResponse(SignEntity signEntity) {
|
||
mLoginWechatTv.setText("已签到");
|
||
signEntity.setId(UserManager.getInstance().getUserId());
|
||
if (mDatabase.signDao().updateSignEntity(signEntity) <= 0) {
|
||
mDatabase.signDao().addSignEntity(signEntity);
|
||
}
|
||
if (isCanSign(signEntity.getLastTime())) {
|
||
DialogUtils.showSignDialog(getContext(), "签到成功,获得经验:1"
|
||
, getString(R.string.sign_dialog_content, signEntity.getSerialSign())
|
||
, getString(R.string.sign_dialog_content2, signEntity.getExperience())
|
||
, getSignSkipText(signEntity.getTitle()), () -> {
|
||
signSkip(signEntity);
|
||
}
|
||
);
|
||
} else {
|
||
DialogUtils.showSignDialog(getContext(), "今天已签到,明天再来吧~"
|
||
, getString(R.string.sign_dialog_content, signEntity.getSerialSign())
|
||
, getString(R.string.sign_dialog_content2, signEntity.getExperience())
|
||
, getSignSkipText(signEntity.getTitle()), () -> {
|
||
signSkip(signEntity);
|
||
}
|
||
);
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public void onFailure(HttpException e) {
|
||
toast(R.string.loading_network_error);
|
||
}
|
||
});
|
||
|
||
}
|
||
|
||
private String getSignSkipText(String text) {
|
||
return TextUtils.isEmpty(text) ? "去首页看看" : text;
|
||
}
|
||
|
||
private void signSkip(SignEntity signEntity) {
|
||
SignEntity.Data data = signEntity.getData();
|
||
String entrance = "(我的光环)+(签到)";
|
||
if (data == null || TextUtils.isEmpty(data.getType())) {
|
||
EventBus.getDefault().post(new EBSkip(MainActivity.EB_SKIP_GAMEFRAGMENT, 0));
|
||
return;
|
||
}
|
||
switch (data.getType()) {
|
||
case "game":
|
||
DataUtils.onMtaEvent(getActivity(), "我的光环_签到跳转", "游戏", signEntity.getTitle());
|
||
GameDetailActivity.startGameDetailActivity(getContext(), data.getLink(), entrance);
|
||
break;
|
||
case "news":
|
||
DataUtils.onMtaEvent(getActivity(), "我的光环_签到跳转", "文章", signEntity.getTitle());
|
||
startActivity(NewsDetailActivity.getIntentById(getContext(), data.getLink(), entrance));
|
||
break;
|
||
case "column":
|
||
DataUtils.onMtaEvent(getActivity(), "我的光环_签到跳转", "专题", signEntity.getTitle());
|
||
SubjectActivity.startSubjectActivity(getContext(), data.getLink(), null, false, entrance);
|
||
break;
|
||
}
|
||
}
|
||
|
||
|
||
private void changeLoginState(boolean isLogin) {
|
||
if (isLogin) {
|
||
SignEntity signEntity = mDatabase.signDao().getSignEntityById(UserManager.getInstance().getUserId());
|
||
if (signEntity != null && !isCanSign(signEntity.getLastTime())) {
|
||
mLoginWechatTv.setText("已签到");
|
||
} else {
|
||
mLoginWechatTv.setText("签到");
|
||
}
|
||
if (mUserInfoEntity != null) {
|
||
mUserIcon.setImageURI(mUserInfoEntity.getIcon());
|
||
mUserName.setText(mUserInfoEntity.getName());
|
||
}
|
||
mLoginQqIcon.setImageResource(R.drawable.personal_collection_icon);
|
||
mLoginQqTv.setText("收藏");
|
||
mLoginWechatIcon.setImageResource(R.drawable.personal_sign_icon);
|
||
mLoginWeiboIcon.setImageResource(R.drawable.personal_message_icon);
|
||
mLoginWeiboTv.setText("消息");
|
||
} else {
|
||
mIconHint.setVisibility(View.GONE);
|
||
mLoginQqIcon.setImageResource(R.drawable.qq_login_icon);
|
||
mLoginQqTv.setText(getString(R.string.QQ));
|
||
mLoginWechatIcon.setImageResource(R.drawable.wechat_login_icon);
|
||
mLoginWechatTv.setText(getString(R.string.wechat));
|
||
mLoginWeiboIcon.setImageResource(R.drawable.weibo_login_icon);
|
||
mLoginWeiboTv.setText(getString(R.string.sina_weibo));
|
||
mUserIcon.setImageURI("");
|
||
mUserName.setText("手机登录");
|
||
if (mLoginMessageHint.getVisibility() == View.VISIBLE) {
|
||
mLoginMessageHint.setVisibility(View.GONE);
|
||
EventBus.getDefault().post(new EBReuse(MESSAGE_READ_OVER));
|
||
}
|
||
}
|
||
}
|
||
|
||
private void checkUpdate() {
|
||
String channel = HaloApp.getInstance().getChannel();
|
||
RetrofitManager.getInstance(getContext())
|
||
.getApi()
|
||
.getUpdate(PackageUtils.getVersionName(getContext()), channel)
|
||
.subscribeOn(Schedulers.io())
|
||
.observeOn(AndroidSchedulers.mainThread())
|
||
.subscribe(new Response<AppEntity>() {
|
||
@Override
|
||
public void onResponse(AppEntity response) {
|
||
super.onResponse(response);
|
||
float version = Float.valueOf(response.getVersion());
|
||
float currentVersion = Float.valueOf(PackageUtils.getVersionName(getContext()));
|
||
if (version > currentVersion) {
|
||
mPersonalSettingUpdateHint.setVisibility(View.VISIBLE);
|
||
} else {
|
||
mPersonalSettingUpdateHint.setVisibility(View.GONE);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
|
||
@Override
|
||
public void OnLoginData(JSONObject content, LoginTag loginTag) {
|
||
if (CommonDebug.IS_DEBUG)
|
||
Utils.log("======获取第三方登录信息成功" + content.toString() + "===" + loginTag.name());
|
||
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
|
||
mLoginDialog = WaitingDialogFragment.newInstance(getString(R.string.logging));
|
||
mLoginDialog.show(getChildFragmentManager(), null);
|
||
}
|
||
mUserViewModel.login(content, loginTag);
|
||
}
|
||
|
||
@Override
|
||
public void onChanged(@Nullable ApiResponse<UserInfoEntity> userInfoEntity) {
|
||
UserInfoEntity notifyUserInfo;
|
||
if (userInfoEntity != null) {
|
||
notifyUserInfo = userInfoEntity.getData();
|
||
} else {
|
||
notifyUserInfo = null;
|
||
}
|
||
|
||
if (notifyUserInfo != null && mUserInfoEntity == null) { // 单个用户,首次触发
|
||
mUnreadViewModel.retry(); // 检查是否有未读消息
|
||
EventBus.getDefault().post(new EBConcernChanged());
|
||
EventBus.getDefault().post(new EBReuse(PersonalFragment.LOGIN_TAG));
|
||
/**
|
||
* default_icon_ 判断是不是默认头像
|
||
* 具体默认头像链接请看:
|
||
* {@link com.gh.common.util.UserIconUtils#getUserIconUrl(int)}
|
||
*/
|
||
LoginTokenEntity loginToken = UserManager.getInstance().getLoginTokenEntity();
|
||
if (loginToken != null && loginToken.getId() != null &&
|
||
sp.getBoolean(loginToken.getId(), true) &&
|
||
notifyUserInfo.getIcon() != null &&
|
||
notifyUserInfo.getIcon().contains("default_icon_")) {
|
||
mIconHint.setVisibility(View.VISIBLE);
|
||
}
|
||
}
|
||
|
||
mUserInfoEntity = notifyUserInfo;
|
||
if (notifyUserInfo == null) {
|
||
mUnreadViewModel.clean();
|
||
changeLoginState(false);
|
||
EventBus.getDefault().post(new EBConcernChanged());
|
||
} else {
|
||
changeLoginState(true);
|
||
}
|
||
|
||
if (mLoginDialog != null) {
|
||
mLoginDialog.dismissAllowingStateLoss();
|
||
}
|
||
}
|
||
}
|