package com.doumee.keyCabinet.ui.face; import androidx.annotation.CallSuper; import androidx.annotation.Nullable; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.RecyclerView; import android.content.Context; import android.graphics.Color; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.doumee.keyCabinet.R; import com.doumee.keyCabinet.base.MyBaseActivity; import com.doumee.keyCabinet.databinding.UserManagerActivityBinding; import com.doumee.keyCabinet.ui.face.adapter.FaceUserAdapter; import com.doumee.keyCabinet.ui.view.TipDialog; import com.doumee.keyCabinet.utils.face.model.SingleBaseConfig; import com.example.datalibrary.api.FaceApi; import com.example.datalibrary.listener.DBLoadListener; import com.example.datalibrary.listener.OnItemClickListener; import com.example.datalibrary.listener.OnRemoveListener; import com.example.datalibrary.manager.FaceSDKManager; import com.example.datalibrary.model.KeyboardsUtils; import com.example.datalibrary.model.User; import com.example.datalibrary.utils.DensityUtils; import java.util.List; import dagger.hilt.android.AndroidEntryPoint; import timber.log.Timber; @AndroidEntryPoint public class UserManagerActivity extends MyBaseActivity implements View.OnClickListener, CompoundButton.OnCheckedChangeListener, OnItemClickListener, TipDialog.OnTipDialogClickListener, OnRemoveListener { // view private RecyclerView mRecyclerUserManager; private ImageView mImageIconSearch; // title中的搜索按钮 private RelativeLayout mRelativeStandard; // title中的常规布局 private LinearLayout mLinearSearch; // title中的搜索布局 private ImageView mImageMenu; // title中的菜单 private boolean isCheck = false; // title菜单点击状态 private TextView mTextCancel; // title中的取消按钮 private RelativeLayout mRelativeEmpty; // 暂无内容 private TextView mTextEmpty; private EditText mEditTitleSearch; private PopupWindow mPopupMenu; private RelativeLayout mRelativeDelete; // 删除布局 private CheckBox mCheckAll; // 全选 private TextView mTextDelete; // 删除 private TipDialog mTipDialog; private Context mContext; private UserListListener mUserListListener; private FaceUserAdapter mFaceUserAdapter; private List mUserInfoList; private int mSelectCount; // 选中的个数 private boolean mIsLongClick; // 是否是长按 private int mLiveType; private ProgressBar progressBar; private TextView progressText; private View progressGroup; private boolean isDBLoad; @Override public int getLayoutId() { return R.layout.user_manager_activity; } @Override public void initView(@Nullable Bundle savedInstanceState) { isAddCountTimer = false; normalConfig(); getDB().setModel(getVM()); mContext = this; FaceSDKManager.getInstance().initDataBases(this); initView(); } @Override public void initData(@Nullable Bundle savedInstanceState) { initData(); } @Override protected void onRestart() { super.onRestart(); // 读取数据库,获取用户信息 UserInfoManager.getInstance().getUserListInfo(null, mUserListListener); } @Override protected void onDestroy() { super.onDestroy(); // 数据变化,更新内存 // FaceSDKManager.getInstance().initDatabases(); } private void initView() { mRecyclerUserManager = findViewById(R.id.recycler_user_manager); mRecyclerUserManager.setOnClickListener(this); RecyclerView.LayoutManager layoutManager = new GridLayoutManager(mContext,2); mRecyclerUserManager.setLayoutManager(layoutManager); // title相关的控件 mRelativeStandard = findViewById(R.id.relative_standard); mLinearSearch = findViewById(R.id.linear_title_search); mImageIconSearch = findViewById(R.id.image_icon_research); mImageIconSearch.setOnClickListener(this); mImageMenu = findViewById(R.id.image_menu); mImageMenu.setOnClickListener(this); mTextCancel = findViewById(R.id.text_cancel); mTextCancel.setOnClickListener(this); mRelativeEmpty = findViewById(R.id.relative_empty); mTextEmpty = findViewById(R.id.text_empty); // 删除相关的控件 mRelativeDelete = findViewById(R.id.relative_botton_delete); mRelativeDelete.setOnClickListener(this); mCheckAll = findViewById(R.id.check_all); mCheckAll.setOnCheckedChangeListener(this); mTextDelete = findViewById(R.id.text_delete); mTextDelete.setOnClickListener(this); // title中的搜索框取消按钮 Button btnTitleCancel = findViewById(R.id.btn_title_cancel); btnTitleCancel.setOnClickListener(this); ImageView imageBack = findViewById(R.id.image_back); imageBack.setOnClickListener(this); ImageView imageInputDelete = findViewById(R.id.image_input_delete); imageInputDelete.setOnClickListener(this); // 初始化PopupWindow initPopupWindow(); mTipDialog = new TipDialog(mContext); mTipDialog.setOnTipDialogClickListener(this); mFaceUserAdapter = new FaceUserAdapter(); mRecyclerUserManager.setAdapter(mFaceUserAdapter); mFaceUserAdapter.setItemClickListener(this); mFaceUserAdapter.setOnRemoveListener(this); progressBar = findViewById(R.id.progress_bar); progressText = findViewById(R.id.progress_text); progressGroup = findViewById(R.id.progress_group); // title中的搜索框 mEditTitleSearch = findViewById(R.id.edit_title_search); // 搜索框输入监听事件 mEditTitleSearch.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (mUserListListener != null && s != null) { // 读取数据库,获取用户信息 UserInfoManager.getInstance().getUserListInfo(s.toString(), mUserListListener); } } @Override public void afterTextChanged(Editable s) { } }); } /** * 初始化PopupWindow */ private void initPopupWindow() { View contentView = LayoutInflater.from(UserManagerActivity.this).inflate(R.layout.userpopup_menu, null); mPopupMenu = new PopupWindow(contentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true); mPopupMenu.setFocusable(true); mPopupMenu.setOutsideTouchable(true); mPopupMenu.setBackgroundDrawable(getResources().getDrawable(R.drawable.menu_round)); RelativeLayout relativeRegister = contentView.findViewById(R.id.relative_register); RelativeLayout relativeDelete = contentView.findViewById(R.id.relative_delete); relativeRegister.setOnClickListener(this); relativeDelete.setOnClickListener(this); mPopupMenu.setContentView(contentView); } private void initData() { mLiveType = SingleBaseConfig.getBaseConfig().getType(); mUserListListener = new UserListListener(); // 读取数据库,获取用户信息 UserInfoManager.getInstance().getUserListInfo(null, mUserListListener); } @Override public void onClick(View v) { int id = v.getId(); if (id == R.id.btn_title_cancel) { // 取消按钮 mEditTitleSearch.setText(""); mLinearSearch.setVisibility(View.GONE); mRelativeStandard.setVisibility(View.VISIBLE); UserInfoManager.getInstance().getUserListInfo(null, mUserListListener); } else if (id == R.id.image_icon_research) { // 搜索按钮 if (!isDBLoad){ return; } mLinearSearch.setVisibility(View.VISIBLE); mRelativeStandard.setVisibility(View.GONE); } else if (id == R.id.image_back) { if (FaceApi.getInstance().isDelete){ mTipDialog = new TipDialog(mContext); mTipDialog.setOnTipDialogClickListener(new TipDialog.OnTipDialogClickListener() { @Override public void onCancel() { mTipDialog.dismiss(); } @Override public void onConfirm(String tipType) { mTipDialog.dismiss(); UserInfoManager.getInstance().release(); // 返回 finish(); } }); mTipDialog.show(); mTipDialog.setTextMessage(getString(R.string.user_tip3)); mTipDialog.setTextConfirm(getString(R.string.user_qd)); mTipDialog.setTextCancel(getString(R.string.cancel)); mTipDialog.setTextTitle(getString(R.string.user_ts)); } else { UserInfoManager.getInstance().release(); // 返回 finish(); } } else if (id == R.id.image_menu) { if (!isDBLoad){ return; } if (!isCheck) { isCheck = true; mImageMenu.setImageResource(R.mipmap.icon_titlebar_menu_hl); showPopupWindow(mImageMenu); } } else if (id == R.id.relative_register) { // 进入注册页面 if (!isDBLoad){ return; } dismissPopupWindow(); startActivity(AddFaceActivity.class); } else if (id == R.id.relative_delete) { // 显示删除UI if (!isDBLoad){ return; } dismissPopupWindow(); updateDeleteUI(true); } else if (id == R.id.text_cancel) { // 批量删除取消 if (!isDBLoad){ return; } updateDeleteUI(false); } else if (id == R.id.text_delete) { // 批量删除 if (!isDBLoad){ return; } if (mSelectCount == 0) { Toast.makeText(mContext, getString(R.string.user_tip4), Toast.LENGTH_SHORT).show(); return; } mTipDialog.show(); mTipDialog.setTextTitle(getString(R.string.user_qrsc)); mTipDialog.setTextMessage(getString(R.string.user_tip5)); mTipDialog.setTextConfirm(getString(R.string.deleted)+"(" + mSelectCount + ")"); mTipDialog.setCancelable(false); } else if (id == R.id.image_input_delete) { mEditTitleSearch.setText(""); } else if (id == R.id.recycler_user_manager) { KeyboardsUtils.hintKeyBoards(v); } else if (id == R.id.relative_botton_delete) { Timber.d( "relative_botton_delete"); } } /** * 全选多选框的监听事件 */ @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (!isDBLoad){ mCheckAll.setChecked(true); return; } if (isChecked) { // 全选 mSelectCount = mUserInfoList.size(); for (int i = 0; i < mUserInfoList.size(); i++) { mUserInfoList.get(i).setChecked(true); mTextDelete.setText(getString(R.string.deleted)+"(" + mSelectCount + ")"); mTextDelete.setTextColor(Color.parseColor("#F34B56")); } } else { // 取消全选 mSelectCount = 0; for (int i = 0; i < mUserInfoList.size(); i++) { mUserInfoList.get(i).setChecked(false); mTextDelete.setText(getString(R.string.deleted)+"(" + mSelectCount + ")"); mTextDelete.setTextColor(Color.parseColor("#666666")); } } mFaceUserAdapter.notifyDataSetChanged(); } // 用于adapter的item点击事件 @Override public void onItemClick(View view, int position) { if (!isDBLoad){ return; } if (mRelativeDelete.getVisibility() != View.VISIBLE) { return; } // 如果当前item未选中,则选中 if (!mUserInfoList.get(position).isChecked()) { mUserInfoList.get(position).setChecked(true); mSelectCount++; mTextDelete.setText(getString(R.string.deleted)+"(" + mSelectCount + ")"); mTextDelete.setTextColor(Color.parseColor("#F34B56")); } else { // 如果当前item已经选中,则取消选中 mUserInfoList.get(position).setChecked(false); mSelectCount--; mTextDelete.setText(getString(R.string.deleted)+"(" + mSelectCount + ")"); if (mSelectCount == 0) { mTextDelete.setTextColor(Color.parseColor("#666666")); } } mFaceUserAdapter.notifyDataSetChanged(); } @Override public void onRemove(int position) { mUserInfoList.get(position).setChecked(true); mSelectCount = 1; mIsLongClick = true; mTipDialog.show(); mTipDialog.setTextTitle(getString(R.string.err_tip1)); mTipDialog.setTextMessage(getString(R.string.err_tip2)); mTipDialog.setTextConfirm(getString(R.string.deleted)); mTipDialog.setCancelable(false); } // 对话框“取消”按钮 @Override public void onCancel() { if (mIsLongClick) { resetDeleteData(); mIsLongClick = false; } mFaceUserAdapter.notifyDataSetChanged(); if (mTipDialog != null) { mTipDialog.dismiss(); } } private DBLoadListener loadListener = new DBLoadListener() { @Override public void onStart(final int successCount) { runOnUiThread(new Runnable() { @Override public void run() { progressGroup.setVisibility(View.VISIBLE); /* if (successCount < 50 && successCount !=0){ loadProgress(10); }*/ } }); } @Override public void onLoad(final int finishCount, final int successCount, final float progress) { // if (successCount > 50 || successCount == 0) { runOnUiThread(new Runnable() { @Override public void run() { progressBar.setProgress((int) (progress * 100)); progressText.setText(finishCount + "/" + successCount); } }); // } } @Override public void onComplete(List features, final int successCount) { } @Override public void onFail(int finishCount, int successCount, List features) { } }; // 对话框“删除”按钮 @Override public void onConfirm(String tipType) { if (mTipDialog != null) { mTipDialog.dismiss(); } if (mSelectCount != 0) { isDBLoad = false; UserInfoManager.getInstance().deleteUserListInfo(mUserInfoList, mEditTitleSearch.getText().toString() , mUserListListener, loadListener); } else { updateDeleteUI(false); } if (mSelectCount == mUserInfoList.size()) { // 设置数据库状态 ShareManager.getInstance(mContext).setDBState(false); } } // 更新删除相关的UI private void updateDeleteUI(boolean isShowDeleteUI) { if (isShowDeleteUI) { mRelativeDelete.setVisibility(View.VISIBLE); mImageMenu.setVisibility(View.GONE); mImageIconSearch.setVisibility(View.GONE); mTextCancel.setVisibility(View.VISIBLE); // 列表显示复选框 mFaceUserAdapter.setShowCheckBox(true); mFaceUserAdapter.notifyDataSetChanged(); } else { mRelativeDelete.setVisibility(View.GONE); mImageMenu.setVisibility(View.VISIBLE); mImageIconSearch.setVisibility(View.VISIBLE); mTextCancel.setVisibility(View.GONE); // 列表隐藏复选框 mFaceUserAdapter.setShowCheckBox(false); mFaceUserAdapter.notifyDataSetChanged(); if (mUserInfoList != null) { for (int i = 0; i < mUserInfoList.size(); i++) { mUserInfoList.get(i).setChecked(false); } } mCheckAll.setChecked(false); mSelectCount = 0; mTextDelete.setText(getString(R.string.deleted)); } } private void showPopupWindow(ImageView imageView) { if (mPopupMenu != null && imageView != null) { // if (mUserInfoList == null || mUserInfoList.size() == 0) { // mPopRelativeImport.setBackgroundColor(Color.parseColor("#777777")); // } else { // mPopRelativeImport.setBackgroundColor(Color.parseColor("#666666")); // mPopRelativeImport.setBackground(this.getResources() // .getDrawable(R.drawable.button_selector_homemenu_item2)); // } int marginRight = DensityUtils.dip2px(mContext, 20); int marginTop = DensityUtils.dip2px(mContext, 56); mPopupMenu.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { isCheck = false; mImageMenu.setImageResource(R.mipmap.icon_titlebar_menu); } }); mPopupMenu.showAtLocation(imageView, Gravity.END | Gravity.TOP, marginRight, marginTop); } } private void dismissPopupWindow() { if (mPopupMenu != null) { mPopupMenu.dismiss(); } } private void resetDeleteData() { mSelectCount = 0; for (int i = 0; i < mUserInfoList.size(); i++) { mUserInfoList.get(i).setChecked(false); } mTextDelete.setText(getString(R.string.deleted)); } // 用于返回读取用户的结果 private class UserListListener extends UserInfoManager.UserInfoListener { // 读取用户列表成功 @Override public void userListQuerySuccess(final String userName, final List listUserInfo) { runOnUiThread(new Runnable() { @Override public void run() { progressGroup.setVisibility(View.GONE); isDBLoad = true; mUserInfoList = listUserInfo; if (listUserInfo == null || listUserInfo.size() == 0) { mFaceUserAdapter.setDataList(listUserInfo); mFaceUserAdapter.notifyDataSetChanged(); mRelativeEmpty.setVisibility(View.VISIBLE); mRecyclerUserManager.setVisibility(View.GONE); // 显示无内容判断 if (userName == null) { mTextEmpty.setText(getString(R.string.addface_zwnr)); updateDeleteUI(false); } else { mTextEmpty.setText(getString(R.string.addface_tip1)); mRelativeDelete.setVisibility(View.GONE); } return; } // 恢复默认状态 resetDeleteData(); mRelativeEmpty.setVisibility(View.GONE); mRecyclerUserManager.setVisibility(View.VISIBLE); if (userName == null || userName.length() == 0) { updateDeleteUI(false); } else { updateDeleteUI(true); } mFaceUserAdapter.setDataList(listUserInfo); mFaceUserAdapter.notifyDataSetChanged(); } }); } // 读取用户列表失败 @Override public void userListQueryFailure(final String message) { runOnUiThread(new Runnable() { @Override public void run() { if (mContext == null) { return; } Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show(); } }); } // 删除用户列表成功 @Override public void userListDeleteSuccess() { UserInfoManager.getInstance().getUserListInfo(null, mUserListListener); } // 删除用户列表失败 @Override public void userListDeleteFailure(final String message) { runOnUiThread(new Runnable() { @Override public void run() { if (mContext == null) { return; } Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show(); } }); } } /** * 点击非编辑区域收起键盘 * 获取点击事件 */ @CallSuper @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { View view = getCurrentFocus(); if (KeyboardsUtils.isShouldHideKeyBord(view, ev)) { KeyboardsUtils.hintKeyBoards(view); } } return super.dispatchTouchEvent(ev); } }