package com.ittianyu.mobileguard.activity; import android.content.DialogInterface; import android.content.Intent; import android.support.v7.app.AlertDialog; import android.text.TextUtils; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageView; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; import com.ittianyu.mobileguard.R; import com.ittianyu.mobileguard.activity.base.BaseActivityUpEnableWithMenu; import com.ittianyu.mobileguard.constant.Constant; import com.ittianyu.mobileguard.dao.BlacklistDao; import com.ittianyu.mobileguard.db.BlacklistDb; import com.ittianyu.mobileguard.domain.BlacklistBean; import java.util.List; import java.util.Vector; /** * Msg safe activity * show the blacklist */ public class MsgSafeActivity extends BaseActivityUpEnableWithMenu { // constants private static final int PER_COUNT = 20; // dialog view private EditText etPhoneNumber; private CheckBox cbCallIntercept; private CheckBox cbSmsIntercept; // frame view private ProgressBar pbLoading; private TextView tvNoData; private ListView lvBlacklist; //data private BlacklistDao dao; private Vector<BlacklistBean> blacklists = new Vector<>(0); private BlacklistAdapter adapter; // thread private Thread getMoreDataThread; public MsgSafeActivity() { super(R.string.msg_safe, R.menu.menu_msg_safe); } /** * 1 */ @Override protected void initView() { setContentView(R.layout.activity_msg_safe); // bind view pbLoading = (ProgressBar) findViewById(R.id.pb_loading); tvNoData = (TextView) findViewById(R.id.tv_no_data); lvBlacklist = (ListView) findViewById(R.id.lv_blacklist); } /** * 2 */ @Override protected void initData() { // create some object dao = new BlacklistDao(this); adapter = new BlacklistAdapter(); lvBlacklist.setAdapter(adapter); // get data getMoreData(); } /** * get more data and add to list */ private void getMoreData() { // show progress bar before read data pbLoading.setVisibility(View.VISIBLE); // if the previous thread is running, no need run a new thread if (null != getMoreDataThread && getMoreDataThread.isAlive()) { return; } // read data getMoreDataThread = new Thread() { @Override public void run() { // select data final List<BlacklistBean> tempList = dao.select(blacklists.size(), PER_COUNT); if (0 == tempList.size()) { // have no more data runOnUiThread(new Runnable() { @Override public void run() { // hide progress bar pbLoading.setVisibility(View.GONE); // the first get data, and database is empty if (0 == blacklists.size()) { // refresh ui onDataChanged(); return; } // tips Toast.makeText(MsgSafeActivity.this, R.string.no_more_data, Toast.LENGTH_SHORT).show(); } }); return; } // read data finish, need to hide progress bar and show other view runOnUiThread(new Runnable() { @Override public void run() { // add to list blacklists.addAll(tempList); // hide progress bar pbLoading.setVisibility(View.GONE); // change ui onDataChanged(); } }); } }; // start thead getMoreDataThread.start(); } /** * on get data finish * when add or delete data, need call this method to update UI * show list view if data exist, otherwise show TextView that content is "no data" */ private void onDataChanged() { // check data if (0 == blacklists.size()) { // no data, show TextView tvNoData.setVisibility(View.VISIBLE); // hide list view lvBlacklist.setVisibility(View.GONE); } else { // have data, show ListView lvBlacklist.setVisibility(View.VISIBLE); // hide text view tvNoData.setVisibility(View.GONE); // notify data changed adapter.notifyDataSetChanged(); } } /** * 3 */ @Override protected void initEvent() { // set scroll listener for get more datas when see the last view lvBlacklist.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // the scroll state is idle and last view is showed if (SCROLL_STATE_IDLE == scrollState && view.getLastVisiblePosition() == blacklists.size() - 1) { // get more data getMoreData(); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); } /** * on menu selected * * @param item * @return */ @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.m_manually_add: manuallyAdd(); break; case R.id.m_add_from_contacts: addFromContacts(); break; case R.id.m_add_from_phone_history: addFromPhoneHistory(); break; case R.id.m_add_from_sms_history: addFromSmsHistory(); break; } return super.onOptionsItemSelected(item);// can't be replace by true, the super class have deal BACK menu } /** * start SmsContactsActivity for result */ private void addFromSmsHistory() { startActivityForResult(new Intent(this, SmsContactsActivity.class), 0);// no need to identify request } /** * start the CallContactsActivity for result */ private void addFromPhoneHistory() { startActivityForResult(new Intent(this, CallContactsActivity.class), 0);// no need to identify request } /** * start ContactsActivity for result */ private void addFromContacts() { startActivityForResult(new Intent(this, ContactsActivity.class), 0);// no need to identify request } /** * When the Contacts Activity finish, it will be call. * * @param requestCode * @param resultCode * @param data */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (data != null) { String phone = data.getStringExtra(Constant.KEY_CONTACT_PHONE); showAddDialog(phone); } } /** * manually add blacklist * show a custom */ private void manuallyAdd() { showAddDialog(null); } /** * manually add blacklist * show a custom */ private void showAddDialog(String phone) { // create custom view View view = View.inflate(this, R.layout.dialog_manually_add_blacklist, null); etPhoneNumber = (EditText) view.findViewById(R.id.et_phone_number); cbCallIntercept = (CheckBox) view.findViewById(R.id.cb_call_intercept); cbSmsIntercept = (CheckBox) view.findViewById(R.id.cb_sms_intercept); // set phone on edit text if (!TextUtils.isEmpty(phone)) etPhoneNumber.setText(phone); // builder dialog and show new AlertDialog.Builder(this) .setTitle(R.string.manually_add) .setView(view) .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { onDataAdd(); } }) .setNegativeButton(R.string.cancel, null) .show(); } /** * will be call when select ok in add dialog * add number to */ private void onDataAdd() { // check empty String phoneNumber = etPhoneNumber.getText().toString().trim(); if (TextUtils.isEmpty(phoneNumber)) { Toast.makeText(this, R.string.phone_number_can_not_be_empty, Toast.LENGTH_SHORT).show(); return; } // check intercept if (!cbCallIntercept.isChecked() && !cbSmsIntercept.isChecked()) { Toast.makeText(this, R.string.tips_intercept_is_not_selected, Toast.LENGTH_SHORT).show(); return; } // get mode int mode = 0; if (cbCallIntercept.isChecked()) mode |= BlacklistDb.MODE_CALL; if (cbSmsIntercept.isChecked()) mode |= BlacklistDb.MODE_SMS; // prevent repeat data BlacklistBean bean = dao.selectByPhone(phoneNumber); if (bean != null) { // the phone already exist, need update bean.setMode(mode); if (!dao.updateModeById(bean)) { // update failed Toast.makeText(this, R.string.failed_to_add, Toast.LENGTH_SHORT).show(); return; } // update success, need update in list blacklists.remove(bean);// BlacklistBean override equal and hashcode method: according to phone // add to list first position blacklists.add(0, bean); // add success Toast.makeText(this, R.string.success_to_add, Toast.LENGTH_SHORT).show(); // refresh list view onDataChanged(); return; } // if not exist, create a new bean and add it bean = new BlacklistBean(0, phoneNumber, mode); // add to database if (!dao.add(bean)) { // add failed Toast.makeText(this, R.string.failed_to_add, Toast.LENGTH_SHORT).show(); return; } // add success Toast.makeText(this, R.string.success_to_add, Toast.LENGTH_SHORT).show(); // add to list first position blacklists.add(0, bean); // refresh list view onDataChanged(); } /** * blacklist adapter */ private class BlacklistAdapter extends BaseAdapter { @Override public int getCount() { return blacklists.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewItemBean item = null; if (null == convertView) {// if not have create view // new item item = new ViewItemBean(); // create view convertView = View.inflate(MsgSafeActivity.this, R.layout.item_msg_safe_blacklist_lv, null); // bind child view to item item.tvPhoneNumber = (TextView) convertView.findViewById(R.id.tv_phone_number); item.tvMode = (TextView) convertView.findViewById(R.id.tv_mode); item.ivDelete = (ImageView) convertView.findViewById(R.id.iv_delete); // set item to tag convertView.setTag(item); } else { // get item item = (ViewItemBean) convertView.getTag(); } // get data final BlacklistBean blacklist = blacklists.get(position); // set data item.tvPhoneNumber.setText(blacklist.getPhone()); switch (blacklist.getMode()) { case BlacklistDb.MODE_CALL: item.tvMode.setText(R.string.call_intercept); break; case BlacklistDb.MODE_SMS: item.tvMode.setText(R.string.sms_intercept); break; case BlacklistDb.MODE_ALL: item.tvMode.setText(getString(R.string.call_intercept) + " " + getString(R.string.sms_intercept)); break; } // init event // delete event item.ivDelete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // show a dialog to query user whether delete new AlertDialog.Builder(MsgSafeActivity.this) .setTitle(R.string.tips) .setMessage(getString(R.string.whether_delete_phone_number) + blacklist.getPhone()) .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // delete if (dao.deleteByPhone(blacklist.getPhone())) { // success Toast.makeText(MsgSafeActivity.this, R.string.success_to_delete, Toast.LENGTH_SHORT).show(); // remove it from list(remember to do this operator) blacklists.remove(position); // refresh list view onDataChanged(); // check the count, get more data if current data less than 10 if (blacklists.size() == 10) { getMoreData(); } } else { // failed // System.out.println("delete failed. id:" + blacklist.getId() + " phone:" + blacklist.getPhone()); Toast.makeText(MsgSafeActivity.this, R.string.failed_to_delete, Toast.LENGTH_SHORT).show(); } } }) .setNegativeButton(R.string.cancel, null) .show(); } }); return convertView; } } /** * package ListView item child view */ private static class ViewItemBean { private TextView tvPhoneNumber; private TextView tvMode; private ImageView ivDelete; } }