Files
assistant-android/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java

470 lines
20 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}
}