package com.application.zhangshi_app_android.ui.personal_center; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.PopupWindow; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; import com.android.app_base.base.dialog.BaseDialog; import com.android.app_base.base.dialog.UIDialog; import com.android.app_base.base.dialog.WaitDialog; import com.android.app_base.base.view.BaseFragment; import com.android.app_base.manager.AppManager; import com.android.app_base.manager.UserManager; import com.android.app_base.utils.GlideEngine; import com.android.app_base.utils.ScreenSizeUtils; import com.android.app_base.utils.Utils; import com.android.app_base.utils.rxbus.MessageEvent; import com.android.app_base.utils.rxbus.RxBus; import com.application.zhangshi_app_android.BR; import com.application.zhangshi_app_android.R; import com.application.zhangshi_app_android.bean.AnnualHealthStatusBean; import com.application.zhangshi_app_android.bean.GrowthExperienceInformationBean; import com.application.zhangshi_app_android.databinding.FragmentPersonalCenterBinding; import com.application.zhangshi_app_android.ui.DLBaseFragment; import com.application.zhangshi_app_android.ui.dialog.PetOwnerInfoDialog; import com.application.zhangshi_app_android.ui.function.PetMemoActivity; import com.application.zhangshi_app_android.ui.login.LoginActivity; import com.bumptech.glide.Glide; import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.transition.Transition; import com.luck.picture.lib.basic.PictureSelector; import com.luck.picture.lib.config.SelectMimeType; import com.luck.picture.lib.engine.CropFileEngine; import com.luck.picture.lib.entity.LocalMedia; import com.luck.picture.lib.interfaces.OnResultCallbackListener; import com.luck.picture.lib.style.PictureSelectorStyle; import com.luck.picture.lib.style.SelectMainStyle; import com.luck.picture.lib.style.TitleBarStyle; import com.luck.picture.lib.utils.PictureFileUtils; import com.luck.picture.lib.utils.StyleUtils; import com.yalantis.ucrop.UCrop; import com.yalantis.ucrop.UCropImageEngine; import com.yalantis.ucrop.model.AspectRatio; import java.io.File; import java.util.ArrayList; import java.util.List; import io.reactivex.Observer; import io.reactivex.functions.Consumer; /** * @author Ljj * @date 2023.03.15. 20:19 * @desc 个人中心 Fragment */ public class PersonalCenterFragment extends DLBaseFragment { private PopupWindow popupWindow; private BaseDialog mWaitDialog; public PersonalCenterFragment() { } public static PersonalCenterFragment newInstance() { PersonalCenterFragment fragment = new PersonalCenterFragment(); Bundle args = new Bundle(); fragment.setArguments(args); return fragment; } @Override protected int getLayoutId() { return R.layout.fragment_personal_center; } @Override protected int getVariableId() { return BR.viewModel; } @Override protected void initParam() { } @Override protected void initView() { View view = View.inflate(getSelfActivity(),R.layout.pop_operate_person_center,null); popupWindow = initPopUpWindow(view); setOnClickListener( view.findViewById(R.id.tv_basic_info), view.findViewById(R.id.tv_change_login_bg) ); binding.ivOperate.setOnClickListener(v -> { popupWindow.showAsDropDown(binding.ivOperate,-ScreenSizeUtils.dip2px(getSelfActivity(),85) +binding.ivOperate.getWidth(),0); }); binding.tvLoginOut.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new UIDialog.Builder(getSelfActivity()) .setTitle("提示") .setContent("确定要退出登录吗?") .setConfirm("确定") .setCancel("取消") .setListener(new UIDialog.OnListener() { @Override public void onConfirm(BaseDialog dialog) { UserManager.getInstance().loginOut(); AppManager.getAppManager().startActivity(new Intent(getSelfActivity(), LoginActivity.class)); getSelfActivity().finish(); } }) .show(); } }); binding.ivHead.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PictureSelector.create(getSelfActivity()) .openGallery(SelectMimeType.ofImage()) .setImageEngine(GlideEngine.createGlideEngine()) .setCropEngine(new ImageFileCropEngine())// 设置裁剪引擎 .isMaxSelectEnabledMask(true)// 达到最大选择数是否开启禁选蒙层 .setMaxSelectNum(1) .forResult(new OnResultCallbackListener() { @Override public void onResult(ArrayList result) { if (result.size() == 0) return; for (LocalMedia media : result) { if (media.isCut()){ viewModel.updateInfo(media.getCutPath()); }else { viewModel.updateInfo(media.getRealPath()); } } } @Override public void onCancel() { } }); } }); } @Override protected void initData() { viewModel.getInfo(); } @Override public void onResume() { super.onResume(); initData(); } @Override protected void initLiveDataObserve() { } @Override public void onClick(View v) { super.onClick(v); int id = v.getId(); if (id == R.id.tv_basic_info){ popupWindow.dismiss(); AppManager.getAppManager().startActivity(new Intent(getSelfActivity(),BasicInfoActivity.class) .putExtra("bean",viewModel.getInfoLiveData().getValue())); }else if (id == R.id.tv_change_login_bg){ popupWindow.dismiss(); AppManager.getAppManager().startActivity(LoginBgChangeActivity.class); } } @Override protected boolean isStatusBarImmersionEnabled() { return true; } @Override protected void dialogLoading() { if (mWaitDialog == null) { mWaitDialog = new WaitDialog.Builder(getSelfActivity()) // 消息文本可以不用填写 .setMessage("正在上传头像") .create(); } if (!mWaitDialog.isShowing()) { mWaitDialog.show(); } } @Override protected void dialogDismiss() { if (mWaitDialog != null && mWaitDialog.isShowing()) { mWaitDialog.dismiss(); mWaitDialog = null; } } /** * 自定义裁剪 */ private class ImageFileCropEngine implements CropFileEngine { @Override public void onStartCrop(Fragment fragment, Uri srcUri, Uri destinationUri, ArrayList dataSource, int requestCode) { UCrop.Options options = buildOptions(); UCrop uCrop = UCrop.of(srcUri, destinationUri, dataSource); uCrop.withOptions(options); uCrop.setImageEngine(new UCropImageEngine() { @Override public void loadImage(Context context, String url, ImageView imageView) { Glide.with(context).load(url).override(180, 180).into(imageView); } @Override public void loadImage(Context context, Uri url, int maxWidth, int maxHeight, OnCallbackListener call) { Glide.with(context).asBitmap().load(url).override(maxWidth, maxHeight).into(new CustomTarget() { @Override public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition transition) { if (call != null) { call.onCall(resource); } } @Override public void onLoadCleared(@Nullable Drawable placeholder) { if (call != null) { call.onCall(null); } } }); } }); uCrop.start(fragment.requireActivity(), fragment, requestCode); } } /** * 配制UCrop,可根据需求自我扩展 * * @return */ private UCrop.Options buildOptions() { PictureSelectorStyle selectorStyle = new PictureSelectorStyle(); UCrop.Options options = new UCrop.Options(); options.setHideBottomControls(true);//是否显示底部裁剪菜单栏 options.setFreeStyleCropEnabled(false);//裁剪框or图片拖动 options.setShowCropFrame(true);//是否显示裁剪边框 options.setShowCropGrid(true);//是否显示裁剪网格线 options.setCircleDimmedLayer(false);//是否圆形裁剪 options.withAspectRatio(1, 1);//裁剪比例 options.setAspectRatioOptions(3, new AspectRatio("16:9", 16, 9), new AspectRatio("3:2", 3, 2), new AspectRatio("4:3", 4, 3), new AspectRatio("1:1", 1, 1));//自选裁剪比例,受setHideBottomControls影响可见 options.setCropOutputPathDir(getSandboxPath());//裁剪输出路径 options.isCropDragSmoothToCenter(false);//裁剪拖动是否自动居中 options.isForbidSkipMultipleCrop(true);//是否多图裁剪时禁止跳过 options.setMaxScaleMultiplier(100);//设置最大缩放比例 if (selectorStyle != null && selectorStyle.getSelectMainStyle().getStatusBarColor() != 0) { SelectMainStyle mainStyle = selectorStyle.getSelectMainStyle(); boolean isDarkStatusBarBlack = mainStyle.isDarkStatusBarBlack(); int statusBarColor = mainStyle.getStatusBarColor(); options.isDarkStatusBarBlack(isDarkStatusBarBlack); if (StyleUtils.checkStyleValidity(statusBarColor)) { options.setStatusBarColor(statusBarColor); options.setToolbarColor(statusBarColor); } else { options.setStatusBarColor(ContextCompat.getColor(getSelfActivity(), com.luck.picture.lib.R.color.ps_color_grey)); options.setToolbarColor(ContextCompat.getColor(getSelfActivity(), com.luck.picture.lib.R.color.ps_color_grey)); } TitleBarStyle titleBarStyle = selectorStyle.getTitleBarStyle(); if (StyleUtils.checkStyleValidity(titleBarStyle.getTitleTextColor())) { options.setToolbarWidgetColor(titleBarStyle.getTitleTextColor()); } else { options.setToolbarWidgetColor(ContextCompat.getColor(getSelfActivity(), com.luck.picture.lib.R.color.ps_color_white)); } } else { options.setStatusBarColor(ContextCompat.getColor(getSelfActivity(), com.luck.picture.lib.R.color.ps_color_grey)); options.setToolbarColor(ContextCompat.getColor(getSelfActivity(), com.luck.picture.lib.R.color.ps_color_grey)); options.setToolbarWidgetColor(ContextCompat.getColor(getSelfActivity(), com.luck.picture.lib.R.color.ps_color_white)); } return options; } /** * 创建自定义输出目录 * * @return */ private String getSandboxPath() { File externalFilesDir = getSelfActivity().getExternalFilesDir(""); File customFile = new File(externalFilesDir.getAbsolutePath(), "Sandbox"); if (!customFile.exists()) { customFile.mkdirs(); } return customFile.getAbsolutePath() + File.separator; } }