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