/*
* Copyright 2011 Adi Sayoga.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.adisayoga.earthquake.ui;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;
import com.adisayoga.earthquake.R;
import com.adisayoga.earthquake.dto.ContactDTO;
import com.adisayoga.earthquake.models.ContactModel;
import com.adisayoga.earthquake.providers.ContactColumns;
import com.adisayoga.earthquake.providers.ContactProvider;
import com.adisayoga.earthquake.wrapper.Prefs;
/**
* Activity daftar kontak.
*
* @author Adi Sayoga
*/
public class ContactActivity extends Activity {
private static final String TAG = "ContactActivity";
private static final int PICK_CONTACT_REQUEST = 1;
private static final int NEW_CONTACT_REQUEST = 2;
private static Prefs prefs;
private final List<ContactDTO> contacts = new ArrayList<ContactDTO>();
private ContactAdapter adapter;
private ListView list;
private LinearLayout noContact;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate");
super.onCreate(savedInstanceState);
prefs = Prefs.getInstance(this);
setTheme(prefs.getTheme().resId);
setContentView(R.layout.contact);
setupListAdapter();
// Load data dari database
noContact = (LinearLayout) findViewById(R.id.no_contact);
updateListContact();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = new MenuInflater(this);
inflater.inflate(R.menu.contact_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case R.id.contact_add:
Intent intentContactPick = new Intent(Intent.ACTION_PICK,
ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intentContactPick, PICK_CONTACT_REQUEST);
return true;
case R.id.contact_new:
Intent intentContactNew = new Intent(this, ContactEditActivity.class);
startActivityForResult(intentContactNew, NEW_CONTACT_REQUEST);
return true;
}
return false;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "RequestCode = " + requestCode + ", resultCode=" + resultCode);
switch (requestCode) {
// Mengambil data dari daftar kontak
case PICK_CONTACT_REQUEST:
if (data != null && resultCode == Activity.RESULT_OK) {
pickContact(data);
}
break;
// Menginput kontak manual
case NEW_CONTACT_REQUEST:
if (resultCode == Activity.RESULT_OK) updateListContact();
break;
}
}
/**
* Mengambil data kontak dari daftar kontak telepon.
*
* @param data Data
*/
private void pickContact(Intent data) {
Log.i(TAG, data.getDataString());
ContactModel contactTable = new ContactModel(this);
ContactDTO contact = contactTable.getSystemContact(data.getData());
if (contact != null) {
if (!contact.phoneNumber.equals("") || !contact.mail.equals("")) {
addContact(contact);
updateListContact();
return;
}
}
Toast.makeText(this, R.string.no_contact, Toast.LENGTH_SHORT).show();
}
/**
* Menambahkan data contact baru ke database.
*
* @param contact Contact
* @return id tabel yang baru saja diinsert
*/
private long addContact(ContactDTO contact) {
Log.d(TAG, "Menyimpan kontak...");
contacts.add(contact);
ContentValues values = new ContentValues();
values.put(ContactColumns.NAME, contact.name);
values.put(ContactColumns.PHONE_NUMBER, contact.phoneNumber);
values.put(ContactColumns.MAIL, contact.mail);
ContentResolver resolver = getContentResolver();
Uri uri = resolver.insert(ContactProvider.CONTENT_URI, values);
// Mendapatkan id dari data yang baru saja diinsert
long segment = Long.parseLong(uri.getPathSegments().get(1));
return segment;
}
/**
* Setup list adapter.
*/
private void setupListAdapter() {
list = (ListView) findViewById(R.id.listview);
adapter = new ContactAdapter(this, R.layout.contact_detail, contacts);
list.setAdapter(adapter);
list.setOnItemClickListener(itemClickListener);
list.setOnItemLongClickListener(itemLongClickListener);
}
/**
* Load data dari provider, kemudian update list. (pada background thread)
*/
private void updateListContact() {
new AsyncTask<Void, Void, List<ContactDTO>>() {
@Override
protected List<ContactDTO> doInBackground(Void... params) {
// Load data dari provider
ContactModel table = new ContactModel(ContactActivity.this);
List<ContactDTO> newContacts = table.getContacts();
return newContacts;
}
@Override
protected void onPostExecute(List<ContactDTO> newContacts) {
// Tambahkan ke contacts
contacts.clear();
if (newContacts != null) {
for (ContactDTO contact : newContacts) {
contacts.add(contact);
}
}
// Perlihatkan atau sembunyikan view
if (contacts.size() > 0) {
Log.d(TAG, "Terdapat data, memperlihatkan list");
noContact.setVisibility(View.GONE);
list.setVisibility(View.VISIBLE);
} else {
Log.d(TAG, "Tidak terdapat data, menyembunyikan list");
noContact.setVisibility(View.VISIBLE);
list.setVisibility(View.GONE);
}
adapter.notifyDataSetChanged();
}
}.execute();
}
/**
* Memanggil activity edit kontak untuk mengedit data ini.
*
* @param contact Data kontak
*/
private void editContact(ContactDTO contact) {
Intent intent = new Intent(this, ContactEditActivity.class);
intent.putExtra(ContactColumns.TABLE_NAME, contact);
startActivityForResult(intent, NEW_CONTACT_REQUEST);
}
/**
* Menghapus data kontak.
*
* @param contact Data kontak
*/
private void deleteContact(ContactDTO contact) {
ContentResolver resolver = getContentResolver();
resolver.delete(ContactProvider.CONTENT_URI, ContactColumns._ID + " = ?",
new String[] { "" + contact.id });
}
/**
* Listener saat item list diklik.
*/
private final AdapterView.OnItemClickListener itemClickListener
= new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
editContact(contacts.get(position));
}
};
/**
* Listener untuk menampilkan context menu.
*/
private final AdapterView.OnItemLongClickListener itemLongClickListener
= new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
final ContactDTO contact = contacts.get(position);
AlertDialog.Builder builder = new AlertDialog.Builder(ContactActivity.this);
builder.setTitle(contact.name);
builder.setItems(R.array.contact_list_options, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0: // Edit kontak
editContact(contact);
updateListContact();
break;
case 1: // Hapus kontak
deleteContact(contact);
updateListContact();
break;
}
}
});
builder.show();
return true;
}
};
}