You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

304 lines
9.8 KiB

package com.community.pocket.ui.main.ui.info;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AlertDialog;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import com.community.pocket.R;
import com.community.pocket.data.model.LocalToken;
import com.community.pocket.data.model.MyInfo;
import com.community.pocket.ui.BaseFragment;
import com.community.pocket.ui.listener.MyTextChange;
import com.community.pocket.ui.login.LoginActivity;
import com.community.pocket.ui.main.ui.share.Response;
import com.community.pocket.util.AppDatabase;
import com.community.pocket.util.PropertiesUtil;
import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
import org.xutils.view.annotation.ContentView;
import org.xutils.view.annotation.Event;
import org.xutils.view.annotation.ViewInject;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* 我的信息框架
*/
@ContentView(R.layout.info_fragment)
public class InfoFragment extends BaseFragment {
//昵称
@ViewInject(R.id.nickname)
private TextView nickname;
//信用分
@ViewInject(R.id.credit_score)
private TextView creditScore;
//头像
@ViewInject(R.id.headimg)
private ImageView headimg;
//最近发帖数
@ViewInject(R.id.recentPosts)
private TextView recentPosts;
//最近访客数
@ViewInject(R.id.recentVisitors)
private TextView recentVisitors;
//手机号
@ViewInject(R.id.mobie)
private TextView mobie;
//邮箱
@ViewInject(R.id.email)
private TextView email;
//信用分活动图表
@ViewInject(R.id.chart)
private LineChart lineChart;
//原密码
private EditText oldPwd;
//新密码
private EditText newPwd;
//确认新密码
private EditText confirmNewPwd;
//修改密码按钮
private Button modifyPwdBtn;
//打开修改密码弹窗
@ViewInject(R.id.open_modify_password)
private Button openModify;
private InfoViewModel viewModel;
//注销登录
@ViewInject(R.id.logout)
private Button logout;
private Handler handler;
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
viewModel = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(InfoViewModel.class);
viewModel.loadInfo();
//监听修改密码表单状态
viewModel.getModifyFormState().observe(getViewLifecycleOwner(), new Observer<InfoFormState>() {
@Override
public void onChanged(InfoFormState infoFormState) {
if (infoFormState == null) {
return;
}
if (infoFormState.getOldPwdError() != null) {
oldPwd.setError(getString(infoFormState.getOldPwdError(), PropertiesUtil.getIntValue("password.length")));
}
if (infoFormState.getNewPwdError() != null) {
newPwd.setError(getString(infoFormState.getNewPwdError(), PropertiesUtil.getIntValue("password.length")));
}
if (infoFormState.getConfirmNewPwdError() != null) {
if (infoFormState.getConfirmNewPwdError() == R.string.invalid_password) {
confirmNewPwd.setError(getString(infoFormState.getConfirmNewPwdError(), PropertiesUtil.getIntValue("password.length")));
} else {
confirmNewPwd.setError(getString(infoFormState.getConfirmNewPwdError()));
}
}
modifyPwdBtn.setEnabled(infoFormState.isDataValid());
}
});
//监听修改密码的请求状态
viewModel.getModifyResponse().observe(getViewLifecycleOwner(), new Observer<InfoResponse>() {
@Override
public void onChanged(InfoResponse infoResponse) {
if (infoResponse == null) {
return;
}
infoResponse.toast(getContext());
if (infoResponse.getResult() == Response.Result.OK) {
handler.sendEmptyMessage(0);
logout(logout);
}
}
});
//监听个人信息请求状态
viewModel.getInfoResponse().observe(getViewLifecycleOwner(), new Observer<InfoResponse>() {
@Override
public void onChanged(InfoResponse myInfoInfoResponse) {
if (myInfoInfoResponse == null) {
return;
}
myInfoInfoResponse.toast(getContext());
if (myInfoInfoResponse.getResult() == Response.Result.OK) {
loadInfo(myInfoInfoResponse.getMyInfo());
}
}
});
//打开修改密码弹窗
openModify.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
openModifyPassword();
}
});
}
/**
* 加载个人信息
*
* @param myInfo 个人信息
*/
private void loadInfo(MyInfo myInfo) {
nickname.setText(getString(R.string.nick_name, myInfo.getUsername()));
creditScore.setText(getString(R.string.credit_score, myInfo.getCreditScore()));
recentVisitors.setText(getString(R.string.recent_visitors, myInfo.getVisitors()));
recentPosts.setText(getString(R.string.recent_posts, myInfo.getPosts()));
mobie.setText(myInfo.getMobie());
email.setText(myInfo.getEmail());
if (myInfo.getScoreHistory() != null) {
loadChart(myInfo.getScoreHistory());
}
}
/**
* 打开修改密码弹窗
*/
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private void openModifyPassword() {
View view = View.inflate(getContext(), R.layout.modify_password, null);
//原密码
oldPwd = view.findViewById(R.id.old_password);
//新密码
newPwd = view.findViewById(R.id.new_password);
//确认新密码
confirmNewPwd = view.findViewById(R.id.new_confirm_password);
TextWatcher textWatcher = new MyTextChange() {
@Override
public void afterTextChanged(Editable s) {
viewModel.modifyPwdChanged(oldPwd.getText().toString(), newPwd.getText().toString(), confirmNewPwd.getText().toString());
}
};
oldPwd.addTextChangedListener(textWatcher);
newPwd.addTextChangedListener(textWatcher);
confirmNewPwd.addTextChangedListener(textWatcher);
//修改密码按钮
modifyPwdBtn = view.findViewById(R.id.modify_password);
modifyPwdBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModel.modifyPwd(oldPwd.getText().toString(), newPwd.getText().toString());
}
});
AlertDialog.Builder alert = new AlertDialog.Builder(Objects.requireNonNull(getContext()));
final AlertDialog alertDialog = alert.setTitle(R.string.modify_password).setView(view).create();
handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
alertDialog.dismiss();
}
};
Button close = view.findViewById(R.id.close);
close.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handler.sendEmptyMessage(0);
}
});
alertDialog.show();
}
/**
* 注销登录
*/
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Event(value = R.id.logout)
private void logout(final View view) {
new Thread(new Runnable() {
@Override
public void run() {
AppDatabase.getInstance(getContext()).tokenDao().delete(LocalToken.getTokenInstance());
LocalToken.logout();
startActivity(new Intent(view.getContext(), LoginActivity.class));
}
}).start();
}
//加载图表数据
private void loadChart(List<Integer> values) {
LineData lineData;
ILineDataSet lineDataSet;
if (lineChart.getData() == null) {
lineData = new LineData();
lineChart.setData(lineData);
List<Entry> entries = new ArrayList<>();
for (int i = 0; i < values.size(); i++) {
entries.add(new Entry(i, values.get(i)));
}
lineDataSet = new LineDataSet(entries, getString(R.string.active_history));
lineData.addDataSet(lineDataSet);
} else {
lineData = lineChart.getData();
lineDataSet = lineData.getDataSetByIndex(0);
lineDataSet.clear();
for (int i = 0; i < values.size(); i++) {
lineDataSet.addEntry(new Entry(i, values.get(i)));
}
}
lineChart.getDescription().setEnabled(false);
lineChart.notifyDataSetChanged();
lineChart.invalidate();
}
}