package com.basic.security.fragment; import android.content.Context; import android.os.Bundle; import android.os.SystemClock; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.CheckBox; import android.widget.ListView; import android.widget.RadioButton; import android.widget.Spinner; import com.basic.security.base.BaseApplication; import com.basic.security.base.BaseFragment; import com.basic.security.manager.BaseSettingManager; import com.basic.security.manager.DeviceManager; import com.basic.security.manager.IdentityManager; import com.basic.security.manager.PersonIdentityManager; import com.basic.security.model.ModelAdapter; import com.basic.security.model.Person; import com.basic.security.utils.ResolutionAdaptation; import com.basic.security.utils.ToastUtil; import com.basic.security.widget.abslistview.CommonAdapter; import com.basic.security.widget.abslistview.ViewHolder; import com.basic.security.widget.hlistview.HListView; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Click; import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.UiThread; import org.androidannotations.annotations.ViewById; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @EFragment public class PersonIdentityFragment extends BaseFragment { @ViewById public HListView identity_list; @ViewById public Button save, tempSave, deletePerson, giveUpSave; @ViewById public RadioButton clusterDevices, thisDevice; @ViewById public View next; @ViewById public ListView cluster_devices; @ViewById public View cluster_devices_parent; public List identityList = new ArrayList<>(); public Map checkedIdentityMapByPerson = new HashMap<>(); public ModelAdapter checkedPerson = null; public IdentityAdapter identityAdapter; public ClusterDeviceAdapter clusterDeviceAdapter; public Set identityCheckBoxSet = new HashSet<>(); long lastLoadIdentityListFromDB = 0; @Click public void clusterDevices() { if (clusterDevices.isChecked()) { mainActivity().fragment_device_list_dialog.showDeviceListDialog(); } } public void loadClusterDeviceFromDb() { BaseApplication.getApplication().executorService.execute(() -> { clusterDeviceAdapter.deviceList.clear(); clusterDeviceAdapter.deviceList.addAll(DeviceManager.findList("select * from device")); showClusterDevices(); }); } @UiThread public void showClusterDevices() { clusterDeviceAdapter.notifyDataSetChanged(); } public void loadIdentityListFromDB() { BaseApplication.getApplication().executorService.execute(() -> { identityList.clear(); identityList.addAll(IdentityManager.findIdentityList()); SystemClock.sleep(100); showIdentityList(); }); } @UiThread public void showIdentityList() { identityAdapter.notifyDataSetChanged(); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(ResolutionAdaptation.fragment_person_identity(), container, false); } @AfterViews public void afterViews() { setIsTempSave(true); thisDevice.setChecked(true); identityAdapter = new IdentityAdapter(mainActivity(), com.basic.security.utils.ResolutionAdaptation.identity_checkbox_item(), identityList); identity_list.setAdapter(identityAdapter); clusterDeviceAdapter = new ClusterDeviceAdapter(); cluster_devices.setAdapter(clusterDeviceAdapter); } @Click public void thisDevice() { thisDevice.setChecked(true); } public void show() { super.show(); if (System.currentTimeMillis() - lastLoadIdentityListFromDB > 5 * 1000) { lastLoadIdentityListFromDB = System.currentTimeMillis(); loadIdentityListFromDB(); } if (mainActivity().currentFragment == mainActivity().fragment_su_logged_ic_wait_face) { deletePerson.setVisibility(View.VISIBLE); } if (mainActivity().currentFragment == mainActivity().fragment_su_logged_ic_compare_success) { deletePerson.setVisibility(View.VISIBLE); } if (mainActivity().currentFragment == mainActivity().fragment_su_logged_ic_wait_idcard) { deletePerson.setVisibility(View.VISIBLE); } } @UiThread public void setIsTempSave(boolean isTempSave) { if (save != null && tempSave != null) { boolean alwaysShowSave = mainActivity().currentFragment == mainActivity().fragment_person_manage && "已注册".equals(mainActivity().fragment_face_list.isRegister()); if (isTempSave && !alwaysShowSave) { save.setVisibility(View.GONE); tempSave.setVisibility(View.VISIBLE); } else { tempSave.setVisibility(View.GONE); save.setVisibility(View.VISIBLE); } } } @Click public void save() { mainActivity().fragment_person_manage.savePerson(); FaceListFragment.treeAdapter.clearUI(); } @Click public void tempSave() { mainActivity().fragment_person_manage.savePerson(); } @Click public void deletePerson() { mainActivity().fragment_person_manage.deletePerson(); FaceListFragment.treeAdapter.clearUI(); } @Click public void giveUpSave() { mainActivity().fragment_person_manage.giveUpSave(); } public void updateIdentityListUI(ModelAdapter person) { checkedPerson = person; if (checkedPerson == null) { checkThisDevice(); checkedIdentityMapByPerson.clear(); } else { setDevice(checkedPerson.getString("all_device")); checkedIdentityMapByPerson.clear(); checkedIdentityMapByPerson.putAll(PersonIdentityManager.findIdentityMapByPersonId(person.getString(Person.id))); } showIdentityList(); } public void updateIdentityListUI2(ModelAdapter person) { checkedPerson = person; if (checkedPerson == null) { checkThisDevice(); checkedIdentityMapByPerson.clear(); } else { setDevice(checkedPerson.getString("all_device")); checkedIdentityMapByPerson.clear(); checkedIdentityMapByPerson.putAll(PersonIdentityManager.findIdentityMapByPersonId(person.getString(Person.id))); } showIdentityList(); } public void updateIdentityListUI1(ModelAdapter person) { checkedPerson = person; if (checkedPerson == null) { checkThisDevice(); } else { setDevice(checkedPerson.getString("all_device")); } showIdentityList(); } @UiThread public void checkThisDevice() { thisDevice.setChecked(true); } @UiThread public void setDevice(String all_device) {// 1 所有设备 0 当前设备 if ("1".equals(all_device)) { clusterDevices.setChecked(true); } else { thisDevice.setChecked(true); } } /** * 保存人员信息时,如果checkedIdentityMapByPerson为null时返回FALSE会影响其他逻辑 * 所以写了一个checkedIdentityMapByPerson.keySet().size()方法 */ public boolean savePersonIdentity(String personId) { List nameList = new ArrayList<>(); for (ModelAdapter identityModelAdapter : checkedIdentityMapByPerson.values()) { if (identityModelAdapter != null && !TextUtils.isEmpty(identityModelAdapter.getString("name"))) { nameList.add(identityModelAdapter.getString("name")); } } if (nameList.contains("黑名单") && nameList.contains("管理员")) { ToastUtil.show("管理员和黑名单不能同时选中"); return false; } if (mainActivity().currentFragment == mainActivity().fragment_su_auto_ic_compare_success || mainActivity().currentFragment == mainActivity().fragment_su_auto_nic_wait_detail || mainActivity().currentFragment == mainActivity().fragment_sign_up_success || mainActivity().currentFragment == mainActivity().fragment_su_auto_ic_wait_idcard || mainActivity().currentFragment == mainActivity().fragment_su_auto_wait_face ) { checkedIdentityMapByPerson.clear(); String id = BaseSettingManager.getDefaultIdentityId(); if (id != null) { if (IdentityManager.findIdentityById(id) == null) { ToastUtil.show("自助注册默认身份出错,请联系管理员"); } else { checkedIdentityMapByPerson.put(id, IdentityManager.findIdentityById(id)); } } } Map dbCheckedIdentityMapByPerson = PersonIdentityManager.findIdentityMapByPersonId(personId); for (String identityId : checkedIdentityMapByPerson.keySet()) { if (!dbCheckedIdentityMapByPerson.containsKey(identityId)) { PersonIdentityManager.save(personId, identityId); if (IdentityManager.findIdentityById(identityId) != null && "管理员".equals(IdentityManager.findIdentityById(identityId).getString("name"))) { PersonIdentityManager.saveAdminIdentity(personId); } } } for (String identityId : dbCheckedIdentityMapByPerson.keySet()) { if (!checkedIdentityMapByPerson.containsKey(identityId)) { PersonIdentityManager.delete(personId, identityId); if (IdentityManager.findIdentityById(identityId) != null && "管理员".equals(IdentityManager.findIdentityById(identityId).getString("name"))) { PersonIdentityManager.delAdminIdentity(personId); } } } return true; } public String aboutDevice() { if (clusterDevices.isChecked()) { return "1"; } if (thisDevice.isChecked()) { return "0"; } return null; } public int getIdentitySize() { return checkedIdentityMapByPerson.values().size(); } @Click void next() { int position = identity_list.getFirstVisiblePosition(); if (position + 2 > identityList.size()) { position = identityList.size(); } else { position += 2; } identity_list.setSelection(position); } public void notifyDataSetChanged() { } public class ClusterDeviceAdapter extends BaseAdapter { public List checkedDeviceList = new ArrayList<>(); private List deviceList = new ArrayList<>(); public ClusterDeviceAdapter() { } public int getCount() { return deviceList == null ? 0 : deviceList.size(); } public Object getItem(int position) { return deviceList.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ClusterDeviceAdapter.ViewHolder viewHolder; if (convertView == null) { viewHolder = new ClusterDeviceAdapter.ViewHolder(); convertView = LayoutInflater.from(getActivity()).inflate(com.basic.security.utils.ResolutionAdaptation.checkbox_spinner_item(), null); viewHolder.checkBox = convertView.findViewById(com.basic.security.utils.RUtils.R_id_ck_item_spinner); viewHolder.spinner = convertView.findViewById(com.basic.security.utils.RUtils.R_id_spinner_item_spinner); initSpinner(viewHolder.spinner); convertView.setTag(viewHolder); } else { viewHolder = (ClusterDeviceAdapter.ViewHolder) convertView.getTag(); } viewHolder.checkBox.setText(deviceList.get(position).getString("name")); checkedDeviceList.add(deviceList.get(position).getString("name")); ClusterDeviceAdapter.ViewHolder finalViewHolder = viewHolder; viewHolder.checkBox.setOnCheckedChangeListener((buttonView, isChecked) -> { if (finalViewHolder.checkBox.isChecked()) { checkedDeviceList.add(deviceList.get(position).getString("name")); } else { if (checkedDeviceList.contains(deviceList.get(position).getString("name"))) { checkedDeviceList.remove(deviceList.get(position).getString("name")); } } }); return convertView; } private void initSpinner(Spinner spinner) { String[] signUpRuleArray = {"允许通行", "有效时间内通行", "确认通行", "拒绝通行"}; ArrayAdapter adapter = new ArrayAdapter(getContext(), com.basic.security.utils.ResolutionAdaptation.spinner_item(), signUpRuleArray); spinner.setPopupBackgroundResource(com.basic.security.utils.RUtils.R_color_press_menu_text); spinner.setAdapter(adapter); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView parent, View view, int position, long id) { } public void onNothingSelected(AdapterView parent) { } }); } class ViewHolder { CheckBox checkBox; Spinner spinner; } } public class IdentityAdapter extends CommonAdapter { public IdentityAdapter(Context context, int layoutId, List datas) { super(context, layoutId, datas); } protected void convert(ViewHolder viewHolder, ModelAdapter identity, int position) { CheckBox identityCB = viewHolder.getView(com.basic.security.utils.RUtils.R_id_identity_checkbox); identityCheckBoxSet.add(identityCB); identityCB.setText(identity.getString("name")); identityCB.setTag(identity); identityCB.setChecked(checkedIdentityMapByPerson.containsKey(identity.getId())); identityCB.setClickable(true); if (checkedPerson != null && "1".equals(checkedPerson.getString("auto_init"))) { identityCB.setClickable(false); } else { identityCB.setClickable(true); identityCB.setOnCheckedChangeListener((buttonView, isChecked) -> { if (isChecked) { if (!checkedIdentityMapByPerson.containsKey(identity.getId())) { checkedIdentityMapByPerson.put(identity.getId(), identity); } } else { if (checkedIdentityMapByPerson.containsKey(identity.getId())) { checkedIdentityMapByPerson.remove(identity.getId()); } } identityAdapter.notifyDataSetChanged(); }); } } } }