package eoc.studio.voicecard.contact;
import eoc.studio.voicecard.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.SQLException;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.OnItemClickListener;
public class ContactActivity extends Activity implements OnClickListener, OnItemClickListener, OnScrollListener
{
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////About search
private EditText searchEditText;
/////About main page view
private static ImageView checkBox;
/////About Dynamic Loading
private boolean refreshFlag = false, selectItemsCheck = false, checkLoadingDBStatus = false,
dataProcessFunStatus = false, loadDBThreadCheck = false;
private int lastVisibleListItemSite, firstVisibleListItemSite, maxLoadDataNo, minLoadDataNo;
/////About DB
private Cursor cur = null;
private static Thread dataThread;
/////About ListView
private int selectItem = -1;
private String selectItemUid, selectItemLookupKey;
private ListView listView;
private MyAdapter mainListView;
private ArrayList<Map<String, String>> data;
private Bitmap resizeBmp, bitmap, bmp;
private static Map<String, String> item;
/////About Button
private ImageView searchBtn, mOkBtn, backBtn;
////About Toast
private static Context mContext;
private static AlertDialog alertDialogBuilder;
private boolean mIsOneTouch = false;
private long mOneTouchStartTime = 0, BACK_TIMEOUT = 500;
private static final int PHONE_NUMBER = 0, PHONE_TYPE = 1;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@Override
public void onResume()
{
super.onResume();
if (refreshFlag)
{
loadDatabaseThread();
}
overridePendingTransition(0, 0);
refreshFlag = false;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_select_friend);
mContext = ContactActivity.this;
findView();
buttonFunction();
if (!refreshFlag)
{
loadDatabaseThread();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@Override
public void onPause()
{
super.onPause();
ShowDialog.dismissLoadingDialog();
ShowDialog.dismissCountDialog();
if (alertDialogBuilder != null && alertDialogBuilder.isShowing())
{
alertDialogBuilder.dismiss();
alertDialogBuilder = null;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@Override
public void onDestroy()
{
super.onDestroy();
if (cur != null && !cur.isClosed())
{
cur.close();
cur = null;
}
if (resizeBmp != null && !resizeBmp.isRecycled())
{
resizeBmp.recycle();
}
if (bitmap != null && !bitmap.isRecycled())
{
bitmap.recycle();
}
if (bmp != null && !bmp.isRecycled())
{
bmp.recycle();
}
if (mainListView != null && !mainListView.isEmpty())
{
if (mainListView.mList != null && !mainListView.mList.isEmpty())
{
mainListView.mList.clear();
mainListView.mList = null;
}
if (mainListView.map != null && !mainListView.map.isEmpty())
{
mainListView.map.clear();
mainListView.map = null;
}
}
if (data != null && !data.isEmpty())
{
data.clear();
data = null;
}
if (item != null && !item.isEmpty())
{
item.clear();
item = null;
}
System.gc();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///findView Function
private void findView()
{
searchEditText = (EditText) findViewById(R.id.act_select_friend_et_search_bar);
searchBtn = (ImageView) findViewById(R.id.act_select_friend_iv_search_button);
mOkBtn = (ImageView) findViewById(R.id.act_select_friend_iv_button_ok);
backBtn = (ImageView) findViewById(R.id.act_select_friend_iv_button_return);
checkBox = (ImageView) findViewById(R.id.glb_selectfriend_list_item_check_icon);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.dummy);
Matrix matrix = new Matrix();
matrix.postScale((float) 50 / bitmap.getWidth(), (float) 50 / bitmap.getWidth());
resizeBmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///Button Function
private void buttonFunction()
{
searchBtn.setOnClickListener(this);
mOkBtn.setOnClickListener(this);
backBtn.setOnClickListener(this);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
@Override
public void onClick(View view)
{
if (mIsOneTouch == false)
{
new CounterBackKeyThread().start();
}
else
{
if (mIsOneTouch)
{
return;
}
}
switch (view.getId())
{
case R.id.act_select_friend_iv_search_button:
{
if (loadDBThreadCheck)
{
return;
}
loadDatabaseThread();
}
break;
case R.id.act_select_friend_iv_button_ok:
{
if (loadDBThreadCheck)
{
return;
}
dataProcessFunction();
}
break;
case R.id.act_select_friend_iv_button_return:
{
if (loadDBThreadCheck)
{
return;
}
finish();
}
break;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private void loadDatabaseThread()
{
loadDBThreadCheck = true;
if (!checkLoadingDBStatus)
{
ShowDialog.showLoadingDialog(mContext);
dataThread = new Thread(new Runnable()
{
@Override
public void run()
{
loadDatabaseFunction();
if (data.isEmpty())
{
data = new ArrayList<Map<String, String>>();
selectItemsCheck = true;
item = new HashMap<String, String>();
item.put(DataProcess.USER_NAME_INDEX, getResources().getString(R.string.noData));
item.put(DataProcess.USER_ID_INDEX, "");
data.add(item);
}
Message status = updaListViewHandler.obtainMessage();
updaListViewHandler.sendMessage(status);
ShowDialog.dismissLoadingDialog();
}
});
dataThread.start();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///Load Database
private void loadDatabaseFunction()
{
if (!checkLoadingDBStatus)
{
String where, selection[], id, name, sort_key_alt, lookupKey;
listView = (ListView) findViewById(R.id.act_select_friend_lv);
data = new ArrayList<Map<String, String>>();
ContentResolver cr = getContentResolver();
if (searchEditText.getText().toString().equals(""))
{
where = null;
selection = null;
}
else
{
where = "sort_key_alt like ? OR " + ContactsContract.Contacts.DISPLAY_NAME + " like ?";
selection = new String[]
{ searchEditText.getText().toString() + "%", searchEditText.getText().toString() + "%" };
}
try
{
cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, where, selection, "sort_key_alt");
if (cur != null && cur.getCount() > 0)
{
selectItemsCheck = false;
while (cur.moveToNext())
{
if (!ShowDialog.isShowLoadingDialog())
{
break;
}
if (cur.getString(cur.getColumnIndex("sort_key_alt")) != null)
{
id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
sort_key_alt = cur.getString(cur.getColumnIndex("sort_key_alt")).toUpperCase();
lookupKey = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
if (sort_key_alt.indexOf(searchEditText.getText().toString().toUpperCase()) != -1
|| name.indexOf(searchEditText.getText().toString()) != -1)
{
item = new HashMap<String, String>();
item.put(DataProcess.USER_ID_INDEX, id);
item.put(DataProcess.USER_NAME_INDEX, name);
item.put(DataProcess.LOOK_UP_KEY_INDEX, lookupKey);
item.put(DataProcess.PHONE_NUMBER_INDEX, "");
item.put(DataProcess.TEL_TYPE_INDEX, "");
data.add(item);
}
}
}
}
}
catch (SQLException e)
{
System.out.println("[ContactActivity]SQLException" + e);
}
catch (Exception ex)
{
System.out.println("[ContactActivity]Exception" + ex);
}
finally
{
}
}
checkLoadingDBStatus = true;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
Handler updaListViewHandler = new Handler()
{
public void handleMessage(Message msg)
{
sendDataToMyAdapter();
if (!selectItemsCheck && !refreshFlag)
{
if ((listView.getCount() > 0) && (listView.getCount() < 5))
{
maxLoadDataNo = 0;
minLoadDataNo = 0;
updataListData(0, listView.getCount());
}
else
{
maxLoadDataNo = 10;
minLoadDataNo = 1;
updataListData(1, 3);
}
}
if (!mainListView.mList.get(0).get(DataProcess.USER_ID_INDEX).equals(""))
{
if ((listView.getCount() > 0) && (listView.getCount() < 5))
{
maxLoadDataNo = 0;
minLoadDataNo = 0;
updataListData(0, listView.getCount());
}
else
{
maxLoadDataNo = 10;
minLoadDataNo = 1;
updataListData(selectItem, selectItem);
}
}
}
};
////////////////////////////////////////////////////////////////////////////////////////////////////
private void sendDataToMyAdapter()
{
if (cur == null)
{
return;
}
if (cur.getCount() > 0)
{
mainListView = new MyAdapter(this, data, R.layout.select_friend_list_item, new String[]
{ DataProcess.USER_NAME_INDEX, DataProcess.PHONE_NUMBER_INDEX, DataProcess.TEL_TYPE_INDEX,
DataProcess.USER_ID_INDEX, DataProcess.LOOK_UP_KEY_INDEX }, new int[]
{ R.id.glb_selectfriend_list_item_header, R.id.glb_selectfriend_list_item_name,
R.id.glb_selectfriend_list_item_check_icon });
listView.setAdapter(mainListView);
listView.setOnItemClickListener(this);
listView.setOnScrollListener(this);
listView.setSelectionFromTop(selectItem, 0);
}
else
{
mainListView = new MyAdapter(this, data, R.layout.select_friend_list_item, new String[]
{ DataProcess.USER_NAME_INDEX, DataProcess.PHONE_NUMBER_INDEX, DataProcess.TEL_TYPE_INDEX,
DataProcess.USER_ID_INDEX, DataProcess.LOOK_UP_KEY_INDEX }, new int[]
{ R.id.glb_selectfriend_list_item_header, R.id.glb_selectfriend_list_item_name,
R.id.glb_selectfriend_list_item_check_icon });
listView.setAdapter(mainListView);
}
if (cur != null && !cur.isClosed())
{
cur.close();
}
loadDBThreadCheck = false;
checkLoadingDBStatus = false;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public class MyAdapter extends SimpleAdapter
{
Map<Integer, Boolean> map = null;
LayoutInflater mInflater;
private List<? extends Map<String, ?>> mList;
public MyAdapter(Context context, List<Map<String, String>> data, int resource, String[] from, int[] to)
{
super(context, data, resource, from, to);
map = new HashMap<Integer, Boolean>();
mInflater = LayoutInflater.from(context);
if (data != null)
{
mList = data;
}
else
{
List<Map<String, String>> createData = new ArrayList<Map<String, String>>();
selectItemsCheck = true;
item = new HashMap<String, String>();
item.put(DataProcess.USER_NAME_INDEX, getResources().getString(R.string.noData));
item.put(DataProcess.USER_ID_INDEX, "");
createData.add(item);
mList = createData;
return;
}
for (int i = 0; i < data.size(); i++)
{
map.put(i, false);
}
}
@Override
public int getCount()
{
if (mList != null)
{
return mList.size();
}
return 0;
}
@Override
public Object getItem(int position)
{
return position;
}
@Override
public long getItemId(int position)
{
return position;
}
public void setSelectItem(int sItem)
{
selectItem = sItem;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
convertView = mInflater.inflate(R.layout.select_friend_list_item, null);
}
ImageView user_pic = (ImageView) convertView.findViewById(R.id.glb_selectfriend_list_item_header);
TextView select_listView_name = (TextView) convertView.findViewById(R.id.glb_selectfriend_list_item_name);
checkBox = (ImageView) convertView.findViewById(R.id.glb_selectfriend_list_item_check_icon);
if (mList == null)
{
return convertView;
}
if (listView.getCount() == selectItem)
{
selectItem = selectItem - 1;
}
if (position == selectItem)
{
selectItemUid = (String) mList.get(position).get(DataProcess.USER_ID_INDEX);
selectItemLookupKey = (String) mList.get(position).get(DataProcess.LOOK_UP_KEY_INDEX);
}
else if ((selectItem == -1) && (selectItem == position))
{
selectItemUid = (String) mList.get(position).get(DataProcess.USER_ID_INDEX);
selectItemLookupKey = (String) mList.get(position).get(DataProcess.LOOK_UP_KEY_INDEX);
}
else
{
}
if (!selectItemsCheck)
{
select_listView_name.setText((String) mList.get(position).get(DataProcess.USER_NAME_INDEX));
bmp = ImageProcess.getPhoto(getContentResolver(),
Integer.parseInt((String) mList.get(position).get(DataProcess.USER_ID_INDEX)));
if (bmp != null)
{
Matrix matrix = new Matrix();
matrix.postScale((float) 50 / bmp.getWidth(), (float) 50 / bmp.getWidth());
Bitmap resizeBmps = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
user_pic.setImageBitmap(resizeBmps);
bmp.recycle();
bmp = null;
}
else
{
user_pic.setImageBitmap(resizeBmp);
}
if (map.get(position))
{
checkBox.setImageDrawable(mContext.getResources().getDrawable(R.drawable.icon_checkbox_check));
}
else
{
checkBox.setImageDrawable(mContext.getResources().getDrawable(R.drawable.icon_checkbox));
}
}
else
{
selectItem = -1;
selectItemUid = null;
selectItemLookupKey = null;
select_listView_name.setText(getResources().getString(R.string.noData));
checkBox.setVisibility(View.GONE);
}
return convertView;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
checkBox = (ImageView) view.findViewById(R.id.glb_selectfriend_list_item_check_icon);
if (mainListView.map.get(position))
{
mainListView.map.put(position, false);
}
else
{
mainListView.map.put(position, true);
}
mainListView.notifyDataSetChanged();
mainListView.setSelectItem(position);
mainListView.notifyDataSetInvalidated();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
lastVisibleListItemSite = firstVisibleItem + visibleItemCount - 1;
if (firstVisibleListItemSite == 0)
{
firstVisibleListItemSite = 1;
}
else
{
firstVisibleListItemSite = firstVisibleItem;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@Override
public void onScrollStateChanged(AbsListView view, int scrollState)
{
if (mainListView != null && mainListView.mList.size() > 1)
{
if (minLoadDataNo == 1 && !refreshFlag)
{
String itemCheckA = "", itemCheckB = "", itemCheckC = "", itemCheckD = "";
if (mainListView.getCount() <= 1)
{
itemCheckA = (String) mainListView.mList.get(firstVisibleListItemSite + 1).get(
DataProcess.PHONE_NUMBER_INDEX);
}
if (mainListView.getCount() <= 2)
{
itemCheckB = (String) mainListView.mList.get(firstVisibleListItemSite + 2).get(
DataProcess.PHONE_NUMBER_INDEX);
}
if (mainListView.getCount() <= 3)
{
itemCheckC = (String) mainListView.mList.get(firstVisibleListItemSite + 3).get(
DataProcess.PHONE_NUMBER_INDEX);
}
if (mainListView.getCount() <= 4)
{
itemCheckD = (String) mainListView.mList.get(firstVisibleListItemSite + 4).get(
DataProcess.PHONE_NUMBER_INDEX);
}
if (scrollState == 0)
{
if (itemCheckA.equals("") || itemCheckB.equals("") || itemCheckC.equals("")
|| itemCheckD.equals(""))
{
updataListData(firstVisibleListItemSite, lastVisibleListItemSite);
}
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@Override
public boolean dispatchKeyEvent(KeyEvent event)
{
if (event.getAction() == KeyEvent.ACTION_UP)
{
switch (event.getKeyCode())
{
case KeyEvent.KEYCODE_BACK:
keyEventFunction();
return true;
}
}
return super.dispatchKeyEvent(event);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private void keyEventFunction()
{
if (!dataProcessFunStatus)
{
finish();
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private void updataListData(int firstVisibleListItemSite, int lastVisibleListItemSite)
{
String PhoneNumberAndType[] = null;
lastVisibleListItemSite = lastVisibleListItemSite + maxLoadDataNo;
firstVisibleListItemSite = firstVisibleListItemSite - minLoadDataNo;
if (firstVisibleListItemSite < 0)
{
firstVisibleListItemSite = 0;
}
if (listView.getCount() < lastVisibleListItemSite)
{
lastVisibleListItemSite = listView.getCount();
}
for (int x = firstVisibleListItemSite; x < lastVisibleListItemSite; x++)
{
if ((x > (listView.getCount() - minLoadDataNo - 1)) && (x < 0))
{
break;
}
else
{
item = (HashMap<String, String>) mainListView.mList.get(x);
PhoneNumberAndType = DataProcess.getPhoneNumberAndType(mContext,
mainListView.mList.get(x).get(DataProcess.USER_ID_INDEX).toString());
if (PhoneNumberAndType != null
&& mainListView.mList.get(x).get(DataProcess.PHONE_NUMBER_INDEX).equals(""))
{
item.put(DataProcess.TEL_TYPE_INDEX, PhoneNumberAndType[PHONE_TYPE]);
item.put(DataProcess.PHONE_NUMBER_INDEX, PhoneNumberAndType[PHONE_NUMBER]);
}
}
}
mainListView.notifyDataSetChanged();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private void dataProcessFunction()
{
dataProcessFunStatus = true;
List<Map<String, Object>> newData = new ArrayList<Map<String, Object>>();
Map<String, Object> newItem;
for (int i = 0; i < mainListView.getCount(); i++)
{
if (mainListView.map.get(i))
{
newItem = new HashMap<String, Object>();
newItem.put(DataProcess.USER_NAME_INDEX, mainListView.mList.get(i).get(DataProcess.USER_NAME_INDEX)
.toString());
newItem.put(DataProcess.PHONE_NUMBER_INDEX,
mainListView.mList.get(i).get(DataProcess.PHONE_NUMBER_INDEX).toString());
newData.add(newItem);
}
}
for (int i = 0; i < newData.size(); i++)
{
System.out.println("NAME:" + newData.get(i).get(DataProcess.USER_NAME_INDEX).toString());
System.out.println("TEL:" + newData.get(i).get(DataProcess.PHONE_NUMBER_INDEX).toString());
}
setResultIntent(newData);
dataProcessFunStatus = false;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private void setResultIntent(List<Map<String, Object>> data)
{
Intent intent = new Intent();
Bundle bundle = new Bundle();
ArrayList bundlelist = new ArrayList();
bundlelist.add(data);
bundle.putParcelableArrayList(DataProcess.PROCESS_SELECTION_FRIEND_LIST, bundlelist);
intent.putExtras(bundle);
setResult(RESULT_OK, intent);
finish();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class CounterBackKeyThread extends Thread
{
public void run()
{
mIsOneTouch = true;
mOneTouchStartTime = System.currentTimeMillis();
while (true)
{
long currentTime = System.currentTimeMillis();
if (currentTime - mOneTouchStartTime >= BACK_TIMEOUT)
{
mIsOneTouch = false;
break;
}
try
{
Thread.sleep(50);
}
catch (Exception ex)
{
}
}
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}