contact badges
This commit is contained in:
parent
c6440aab12
commit
2d0c0e6a40
|
@ -7,23 +7,24 @@
|
||||||
|
|
||||||
<RelativeLayout
|
<RelativeLayout
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="90dp"
|
android:layout_height="72dp"
|
||||||
android:padding="0dp">
|
android:padding="0dp">
|
||||||
|
|
||||||
<ImageView
|
<QuickContactBadge
|
||||||
android:id="@+id/details_contact_picture"
|
android:id="@+id/details_contact_badge"
|
||||||
android:layout_width="96dp"
|
android:layout_width="72dp"
|
||||||
android:layout_height="96dp"
|
android:layout_height="72dp"
|
||||||
android:layout_centerVertical="true"
|
android:layout_centerVertical="true"
|
||||||
android:paddingRight="8dp"/>
|
android:scaleType="fitXY"/>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/details_jidbox"
|
android:id="@+id/details_jidbox"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_toRightOf="@+id/details_contact_picture"
|
android:layout_toRightOf="@+id/details_contact_badge"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_alignParentTop="true">
|
android:layout_alignParentTop="true"
|
||||||
|
android:paddingLeft="8dp">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
|
@ -37,6 +38,7 @@
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="something@jabber.example.com"
|
android:text="something@jabber.example.com"
|
||||||
|
android:singleLine="true"
|
||||||
android:textSize="14sp"
|
android:textSize="14sp"
|
||||||
android:paddingLeft="8dp"/>
|
android:paddingLeft="8dp"/>
|
||||||
|
|
||||||
|
@ -51,8 +53,8 @@
|
||||||
android:textStyle="bold"
|
android:textStyle="bold"
|
||||||
android:gravity="center_vertical"
|
android:gravity="center_vertical"
|
||||||
android:layout_below="@+id/details_jidbox"
|
android:layout_below="@+id/details_jidbox"
|
||||||
android:layout_toRightOf="@id/details_contact_picture"
|
android:layout_toRightOf="@id/details_contact_badge"
|
||||||
android:paddingLeft="8dp"/>
|
android:paddingLeft="16dp"/>
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
|
|
|
@ -24,7 +24,7 @@ public class Contact extends AbstractEntity implements Serializable {
|
||||||
protected String displayName;
|
protected String displayName;
|
||||||
protected String jid;
|
protected String jid;
|
||||||
protected String subscription;
|
protected String subscription;
|
||||||
protected int systemAccount;
|
protected String systemAccount;
|
||||||
protected String photoUri;
|
protected String photoUri;
|
||||||
protected String openPGPKey;
|
protected String openPGPKey;
|
||||||
protected Presences presences = new Presences();
|
protected Presences presences = new Presences();
|
||||||
|
@ -44,7 +44,7 @@ public class Contact extends AbstractEntity implements Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Contact(String uuid, String account, String displayName, String jid,
|
public Contact(String uuid, String account, String displayName, String jid,
|
||||||
String subscription, String photoUri, int systemAccount,
|
String subscription, String photoUri, String systemAccount,
|
||||||
String pgpKey,String presences) {
|
String pgpKey,String presences) {
|
||||||
this.uuid = uuid;
|
this.uuid = uuid;
|
||||||
this.accountUuid = account;
|
this.accountUuid = account;
|
||||||
|
@ -96,7 +96,7 @@ public class Contact extends AbstractEntity implements Serializable {
|
||||||
cursor.getString(cursor.getColumnIndex(JID)),
|
cursor.getString(cursor.getColumnIndex(JID)),
|
||||||
cursor.getString(cursor.getColumnIndex(SUBSCRIPTION)),
|
cursor.getString(cursor.getColumnIndex(SUBSCRIPTION)),
|
||||||
cursor.getString(cursor.getColumnIndex(PHOTOURI)),
|
cursor.getString(cursor.getColumnIndex(PHOTOURI)),
|
||||||
cursor.getInt(cursor.getColumnIndex(SYSTEMACCOUNT)),
|
cursor.getString(cursor.getColumnIndex(SYSTEMACCOUNT)),
|
||||||
cursor.getString(cursor.getColumnIndex(OPENPGPKEY)),
|
cursor.getString(cursor.getColumnIndex(OPENPGPKEY)),
|
||||||
cursor.getString(cursor.getColumnIndex(PRESENCES)));
|
cursor.getString(cursor.getColumnIndex(PRESENCES)));
|
||||||
}
|
}
|
||||||
|
@ -109,7 +109,7 @@ public class Contact extends AbstractEntity implements Serializable {
|
||||||
return this.subscription;
|
return this.subscription;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setSystemAccount(int account) {
|
public void setSystemAccount(String account) {
|
||||||
this.systemAccount = account;
|
this.systemAccount = account;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,4 +161,16 @@ public class Contact extends AbstractEntity implements Serializable {
|
||||||
public void setPresences(Presences pres) {
|
public void setPresences(Presences pres) {
|
||||||
this.presences = pres;
|
this.presences = pres;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setPhotoUri(String uri) {
|
||||||
|
this.photoUri = uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDisplayName(String name) {
|
||||||
|
this.displayName = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSystemAccount() {
|
||||||
|
return systemAccount;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -233,9 +233,15 @@ public class DatabaseBackend extends SQLiteOpenHelper {
|
||||||
public List<Contact> getContacts(Account account) {
|
public List<Contact> getContacts(Account account) {
|
||||||
List<Contact> list = new ArrayList<Contact>();
|
List<Contact> list = new ArrayList<Contact>();
|
||||||
SQLiteDatabase db = this.getReadableDatabase();
|
SQLiteDatabase db = this.getReadableDatabase();
|
||||||
String args[] = {account.getUuid()};
|
Cursor cursor;
|
||||||
Cursor cursor = db.query(Contact.TABLENAME, null, Contact.ACCOUNT+"=?", args, null,
|
if (account==null) {
|
||||||
|
cursor = db.query(Contact.TABLENAME, null, null, null, null,
|
||||||
null, null);
|
null, null);
|
||||||
|
} else {
|
||||||
|
String args[] = {account.getUuid()};
|
||||||
|
cursor = db.query(Contact.TABLENAME, null, Contact.ACCOUNT+"=?", args, null,
|
||||||
|
null, null);
|
||||||
|
}
|
||||||
while (cursor.moveToNext()) {
|
while (cursor.moveToNext()) {
|
||||||
list.add(Contact.fromCursor(cursor));
|
list.add(Contact.fromCursor(cursor));
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,8 @@ import de.gultsch.chat.persistance.DatabaseBackend;
|
||||||
import de.gultsch.chat.ui.OnAccountListChangedListener;
|
import de.gultsch.chat.ui.OnAccountListChangedListener;
|
||||||
import de.gultsch.chat.ui.OnConversationListChangedListener;
|
import de.gultsch.chat.ui.OnConversationListChangedListener;
|
||||||
import de.gultsch.chat.ui.OnRosterFetchedListener;
|
import de.gultsch.chat.ui.OnRosterFetchedListener;
|
||||||
|
import de.gultsch.chat.utils.OnPhoneContactsLoadedListener;
|
||||||
|
import de.gultsch.chat.utils.PhoneHelper;
|
||||||
import de.gultsch.chat.utils.UIHelper;
|
import de.gultsch.chat.utils.UIHelper;
|
||||||
import de.gultsch.chat.xml.Element;
|
import de.gultsch.chat.xml.Element;
|
||||||
import de.gultsch.chat.xmpp.IqPacket;
|
import de.gultsch.chat.xmpp.IqPacket;
|
||||||
|
@ -258,45 +260,12 @@ public class XmppConnectionService extends Service {
|
||||||
public void updateRoster(final Account account,
|
public void updateRoster(final Account account,
|
||||||
final OnRosterFetchedListener listener) {
|
final OnRosterFetchedListener listener) {
|
||||||
|
|
||||||
final Hashtable<String, Bundle> phoneContacts = new Hashtable<String, Bundle>();
|
PhoneHelper.loadPhoneContacts(this,
|
||||||
final List<Contact> contacts = new ArrayList<Contact>();
|
new OnPhoneContactsLoadedListener() {
|
||||||
|
|
||||||
final String[] PROJECTION = new String[] {
|
|
||||||
ContactsContract.Data.CONTACT_ID,
|
|
||||||
ContactsContract.Data.DISPLAY_NAME,
|
|
||||||
ContactsContract.Data.PHOTO_THUMBNAIL_URI,
|
|
||||||
ContactsContract.CommonDataKinds.Im.DATA };
|
|
||||||
|
|
||||||
final String SELECTION = "(" + ContactsContract.Data.MIMETYPE + "=\""
|
|
||||||
+ ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE
|
|
||||||
+ "\") AND (" + ContactsContract.CommonDataKinds.Im.PROTOCOL
|
|
||||||
+ "=\"" + ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER
|
|
||||||
+ "\")";
|
|
||||||
|
|
||||||
CursorLoader mCursorLoader = new CursorLoader(this,
|
|
||||||
ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, null,
|
|
||||||
null);
|
|
||||||
mCursorLoader.registerListener(0, new OnLoadCompleteListener<Cursor>() {
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onLoadComplete(Loader<Cursor> arg0, Cursor cursor) {
|
public void onPhoneContactsLoaded(
|
||||||
while (cursor.moveToNext()) {
|
final Hashtable<String, Bundle> phoneContacts) {
|
||||||
Bundle contact = new Bundle();
|
|
||||||
contact.putInt("phoneid", cursor.getInt(cursor
|
|
||||||
.getColumnIndex(ContactsContract.Data.CONTACT_ID)));
|
|
||||||
contact.putString(
|
|
||||||
"displayname",
|
|
||||||
cursor.getString(cursor
|
|
||||||
.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)));
|
|
||||||
contact.putString(
|
|
||||||
"photouri",
|
|
||||||
cursor.getString(cursor
|
|
||||||
.getColumnIndex(ContactsContract.Data.PHOTO_THUMBNAIL_URI)));
|
|
||||||
phoneContacts.put(
|
|
||||||
cursor.getString(cursor
|
|
||||||
.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)),
|
|
||||||
contact);
|
|
||||||
}
|
|
||||||
IqPacket iqPacket = new IqPacket(IqPacket.TYPE_GET);
|
IqPacket iqPacket = new IqPacket(IqPacket.TYPE_GET);
|
||||||
Element query = new Element("query");
|
Element query = new Element("query");
|
||||||
query.setAttribute("xmlns", "jabber:iq:roster");
|
query.setAttribute("xmlns", "jabber:iq:roster");
|
||||||
|
@ -306,17 +275,28 @@ public class XmppConnectionService extends Service {
|
||||||
new OnIqPacketReceived() {
|
new OnIqPacketReceived() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onIqPacketReceived(Account account,
|
public void onIqPacketReceived(
|
||||||
IqPacket packet) {
|
Account account, IqPacket packet) {
|
||||||
Element roster = packet.findChild("query");
|
List<Contact> contacts = new ArrayList<Contact>();
|
||||||
|
Element roster = packet
|
||||||
|
.findChild("query");
|
||||||
if (roster != null) {
|
if (roster != null) {
|
||||||
for (Element item : roster.getChildren()) {
|
for (Element item : roster
|
||||||
|
.getChildren()) {
|
||||||
Contact contact;
|
Contact contact;
|
||||||
String name = item.getAttribute("name");
|
String name = item
|
||||||
String jid = item.getAttribute("jid");
|
.getAttribute("name");
|
||||||
if (phoneContacts.containsKey(jid)) {
|
String jid = item
|
||||||
|
.getAttribute("jid");
|
||||||
|
if (phoneContacts
|
||||||
|
.containsKey(jid)) {
|
||||||
Bundle phoneContact = phoneContacts
|
Bundle phoneContact = phoneContacts
|
||||||
.get(jid);
|
.get(jid);
|
||||||
|
String systemAccount = phoneContact
|
||||||
|
.getInt("phoneid")
|
||||||
|
+ "#"
|
||||||
|
+ phoneContact
|
||||||
|
.getString("lookup");
|
||||||
contact = new Contact(
|
contact = new Contact(
|
||||||
account,
|
account,
|
||||||
phoneContact
|
phoneContact
|
||||||
|
@ -324,14 +304,14 @@ public class XmppConnectionService extends Service {
|
||||||
jid,
|
jid,
|
||||||
phoneContact
|
phoneContact
|
||||||
.getString("photouri"));
|
.getString("photouri"));
|
||||||
contact.setSystemAccount(phoneContact
|
contact.setSystemAccount(systemAccount);
|
||||||
.getInt("phoneid"));
|
|
||||||
} else {
|
} else {
|
||||||
if (name == null) {
|
if (name == null) {
|
||||||
name = jid.split("@")[0];
|
name = jid.split("@")[0];
|
||||||
}
|
}
|
||||||
contact = new Contact(account,
|
contact = new Contact(
|
||||||
name, jid, null);
|
account, name, jid,
|
||||||
|
null);
|
||||||
|
|
||||||
}
|
}
|
||||||
contact.setAccount(account);
|
contact.setAccount(account);
|
||||||
|
@ -339,7 +319,8 @@ public class XmppConnectionService extends Service {
|
||||||
.getAttribute("subscription"));
|
.getAttribute("subscription"));
|
||||||
contacts.add(contact);
|
contacts.add(contact);
|
||||||
}
|
}
|
||||||
databaseBackend.mergeContacts(contacts);
|
databaseBackend
|
||||||
|
.mergeContacts(contacts);
|
||||||
if (listener != null) {
|
if (listener != null) {
|
||||||
listener.onRosterFetched(contacts);
|
listener.onRosterFetched(contacts);
|
||||||
}
|
}
|
||||||
|
@ -349,7 +330,42 @@ public class XmppConnectionService extends Service {
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
mCursorLoader.startLoading();
|
}
|
||||||
|
|
||||||
|
public void mergePhoneContactsWithRoster() {
|
||||||
|
PhoneHelper.loadPhoneContacts(this,
|
||||||
|
new OnPhoneContactsLoadedListener() {
|
||||||
|
@Override
|
||||||
|
public void onPhoneContactsLoaded(
|
||||||
|
Hashtable<String, Bundle> phoneContacts) {
|
||||||
|
List<Contact> contacts = databaseBackend
|
||||||
|
.getContacts(null);
|
||||||
|
for (int i = 0; i < contacts.size(); ++i) {
|
||||||
|
Contact contact = contacts.get(i);
|
||||||
|
if (phoneContacts.containsKey(contact.getJid())) {
|
||||||
|
Bundle phoneContact = phoneContacts.get(contact
|
||||||
|
.getJid());
|
||||||
|
String systemAccount = phoneContact
|
||||||
|
.getInt("phoneid")
|
||||||
|
+ "#"
|
||||||
|
+ phoneContact.getString("lookup");
|
||||||
|
contact.setSystemAccount(systemAccount);
|
||||||
|
contact.setPhotoUri(phoneContact
|
||||||
|
.getString("photouri"));
|
||||||
|
contact.setDisplayName(phoneContact
|
||||||
|
.getString("displayname"));
|
||||||
|
databaseBackend.updateContact(contact);
|
||||||
|
} else {
|
||||||
|
if ((contact.getSystemAccount() != null)
|
||||||
|
|| (contact.getProfilePhoto() != null)) {
|
||||||
|
contact.setSystemAccount(null);
|
||||||
|
contact.setPhotoUri(null);
|
||||||
|
databaseBackend.updateContact(contact);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addConversation(Conversation conversation) {
|
public void addConversation(Conversation conversation) {
|
||||||
|
|
|
@ -38,6 +38,8 @@ public class ConversationActivity extends XmppActivity {
|
||||||
public static final String VIEW_CONVERSATION = "viewConversation";
|
public static final String VIEW_CONVERSATION = "viewConversation";
|
||||||
public static final String CONVERSATION = "conversationUuid";
|
public static final String CONVERSATION = "conversationUuid";
|
||||||
|
|
||||||
|
public static final int INSERT_CONTACT = 0x9889;
|
||||||
|
|
||||||
protected SlidingPaneLayout spl;
|
protected SlidingPaneLayout spl;
|
||||||
|
|
||||||
private List<Conversation> conversationList = new ArrayList<Conversation>();
|
private List<Conversation> conversationList = new ArrayList<Conversation>();
|
||||||
|
@ -83,6 +85,7 @@ public class ConversationActivity extends XmppActivity {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
private boolean contactInserted = false;
|
||||||
|
|
||||||
|
|
||||||
public List<Conversation> getConversationList() {
|
public List<Conversation> getConversationList() {
|
||||||
|
@ -229,6 +232,8 @@ public class ConversationActivity extends XmppActivity {
|
||||||
if (this.getSelectedConversation()!=null) {
|
if (this.getSelectedConversation()!=null) {
|
||||||
if (this.getSelectedConversation().getMode() == Conversation.MODE_MULTI) {
|
if (this.getSelectedConversation().getMode() == Conversation.MODE_MULTI) {
|
||||||
((MenuItem) menu.findItem(R.id.action_security)).setVisible(false);
|
((MenuItem) menu.findItem(R.id.action_security)).setVisible(false);
|
||||||
|
((MenuItem) menu.findItem(R.id.action_details)).setVisible(false);
|
||||||
|
((MenuItem) menu.findItem(R.id.action_archive)).setTitle("Leave conference");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -322,6 +327,13 @@ public class ConversationActivity extends XmppActivity {
|
||||||
@Override
|
@Override
|
||||||
void onBackendConnected() {
|
void onBackendConnected() {
|
||||||
|
|
||||||
|
|
||||||
|
if (contactInserted) {
|
||||||
|
Log.d("xmppService","merge phone contacts with roster");
|
||||||
|
contactInserted = false;
|
||||||
|
xmppConnectionService.mergePhoneContactsWithRoster();
|
||||||
|
}
|
||||||
|
|
||||||
xmppConnectionService.setOnConversationListChangedListener(this.onConvChanged);
|
xmppConnectionService.setOnConversationListChangedListener(this.onConvChanged);
|
||||||
|
|
||||||
if (conversationList.size()==0) {
|
if (conversationList.size()==0) {
|
||||||
|
@ -375,4 +387,11 @@ public class ConversationActivity extends XmppActivity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
|
if (requestCode==INSERT_CONTACT) {
|
||||||
|
Log.d("xmppService","contact inserted");
|
||||||
|
this.contactInserted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import de.gultsch.chat.R;
|
import de.gultsch.chat.R;
|
||||||
|
import de.gultsch.chat.entities.Contact;
|
||||||
import de.gultsch.chat.entities.Conversation;
|
import de.gultsch.chat.entities.Conversation;
|
||||||
import de.gultsch.chat.entities.Message;
|
import de.gultsch.chat.entities.Message;
|
||||||
import de.gultsch.chat.utils.UIHelper;
|
import de.gultsch.chat.utils.UIHelper;
|
||||||
|
@ -32,6 +33,7 @@ public class ConversationFragment extends Fragment {
|
||||||
protected LayoutInflater inflater;
|
protected LayoutInflater inflater;
|
||||||
protected List<Message> messageList = new ArrayList<Message>();
|
protected List<Message> messageList = new ArrayList<Message>();
|
||||||
protected ArrayAdapter<Message> messageListAdapter;
|
protected ArrayAdapter<Message> messageListAdapter;
|
||||||
|
protected Contact contact;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(final LayoutInflater inflater,
|
public View onCreateView(final LayoutInflater inflater,
|
||||||
|
@ -40,7 +42,6 @@ public class ConversationFragment extends Fragment {
|
||||||
this.inflater = inflater;
|
this.inflater = inflater;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
final View view = inflater.inflate(R.layout.fragment_conversation,
|
final View view = inflater.inflate(R.layout.fragment_conversation,
|
||||||
container, false);
|
container, false);
|
||||||
((ImageButton) view.findViewById(R.id.textSendButton))
|
((ImageButton) view.findViewById(R.id.textSendButton))
|
||||||
|
|
|
@ -7,12 +7,19 @@ import de.gultsch.chat.utils.UIHelper;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.app.DialogFragment;
|
import android.app.DialogFragment;
|
||||||
|
import android.content.DialogInterface;
|
||||||
|
import android.content.Intent;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.provider.ContactsContract.CommonDataKinds;
|
||||||
|
import android.provider.ContactsContract.Contacts;
|
||||||
|
import android.provider.ContactsContract.Intents;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.view.View.OnClickListener;
|
||||||
import android.widget.CheckBox;
|
import android.widget.CheckBox;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
|
import android.widget.QuickContactBadge;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
public class DialogContactDetails extends DialogFragment {
|
public class DialogContactDetails extends DialogFragment {
|
||||||
|
@ -34,7 +41,8 @@ public class DialogContactDetails extends DialogFragment {
|
||||||
TextView status = (TextView) view.findViewById(R.id.details_contactstatus);
|
TextView status = (TextView) view.findViewById(R.id.details_contactstatus);
|
||||||
CheckBox send = (CheckBox) view.findViewById(R.id.details_send_presence);
|
CheckBox send = (CheckBox) view.findViewById(R.id.details_send_presence);
|
||||||
CheckBox receive = (CheckBox) view.findViewById(R.id.details_receive_presence);
|
CheckBox receive = (CheckBox) view.findViewById(R.id.details_receive_presence);
|
||||||
ImageView contactPhoto = (ImageView) view.findViewById(R.id.details_contact_picture);
|
//ImageView contactPhoto = (ImageView) view.findViewById(R.id.details_contact_picture);
|
||||||
|
QuickContactBadge badge = (QuickContactBadge) view.findViewById(R.id.details_contact_badge);
|
||||||
|
|
||||||
boolean subscriptionSend = false;
|
boolean subscriptionSend = false;
|
||||||
boolean subscriptionReceive = false;
|
boolean subscriptionReceive = false;
|
||||||
|
@ -85,10 +93,34 @@ public class DialogContactDetails extends DialogFragment {
|
||||||
contactJid.setText(contact.getJid());
|
contactJid.setText(contact.getJid());
|
||||||
accountJid.setText(contact.getAccount().getJid());
|
accountJid.setText(contact.getAccount().getJid());
|
||||||
|
|
||||||
if (contact.getProfilePhoto()!=null) {
|
UIHelper.prepareContactBadge(getActivity(), badge, contact);
|
||||||
contactPhoto.setImageURI(Uri.parse(contact.getProfilePhoto()));
|
|
||||||
} else {
|
if (contact.getSystemAccount()==null) {
|
||||||
contactPhoto.setImageBitmap(UIHelper.getUnknownContactPicture(contact.getDisplayName(), 300));
|
final DialogContactDetails details = this;
|
||||||
|
badge.setOnClickListener(new OnClickListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||||
|
builder.setTitle("Add to contacts");
|
||||||
|
builder.setMessage("Do you want to add "+contact.getJid()+" to your contact list?");
|
||||||
|
builder.setNegativeButton("Cancel", null);
|
||||||
|
builder.setPositiveButton("Add", new DialogInterface.OnClickListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
|
Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT);
|
||||||
|
intent.setType(Contacts.CONTENT_ITEM_TYPE);
|
||||||
|
intent.putExtra(Intents.Insert.IM_HANDLE,contact.getJid());
|
||||||
|
intent.putExtra(Intents.Insert.IM_PROTOCOL,CommonDataKinds.Im.PROTOCOL_JABBER);
|
||||||
|
intent.putExtra("finishActivityOnSaveCompleted", true);
|
||||||
|
getActivity().startActivityForResult(intent,ConversationActivity.INSERT_CONTACT);
|
||||||
|
details.dismiss();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
builder.create().show();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.setView(view);
|
builder.setView(view);
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
package de.gultsch.chat.utils;
|
||||||
|
|
||||||
|
import java.util.Hashtable;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
public interface OnPhoneContactsLoadedListener {
|
||||||
|
public void onPhoneContactsLoaded(Hashtable<String, Bundle> phoneContacts);
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
package de.gultsch.chat.utils;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Hashtable;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.CursorLoader;
|
||||||
|
import android.content.Loader;
|
||||||
|
import android.content.Loader.OnLoadCompleteListener;
|
||||||
|
import android.database.Cursor;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.provider.ContactsContract;
|
||||||
|
|
||||||
|
public class PhoneHelper {
|
||||||
|
|
||||||
|
public static void loadPhoneContacts(Context context, final OnPhoneContactsLoadedListener listener) {
|
||||||
|
final Hashtable<String, Bundle> phoneContacts = new Hashtable<String, Bundle>();
|
||||||
|
|
||||||
|
final String[] PROJECTION = new String[] {
|
||||||
|
ContactsContract.Data._ID,
|
||||||
|
ContactsContract.Data.DISPLAY_NAME,
|
||||||
|
ContactsContract.Data.PHOTO_THUMBNAIL_URI,
|
||||||
|
ContactsContract.Data.LOOKUP_KEY,
|
||||||
|
ContactsContract.CommonDataKinds.Im.DATA };
|
||||||
|
|
||||||
|
final String SELECTION = "(" + ContactsContract.Data.MIMETYPE + "=\""
|
||||||
|
+ ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE
|
||||||
|
+ "\") AND (" + ContactsContract.CommonDataKinds.Im.PROTOCOL
|
||||||
|
+ "=\"" + ContactsContract.CommonDataKinds.Im.PROTOCOL_JABBER
|
||||||
|
+ "\")";
|
||||||
|
|
||||||
|
CursorLoader mCursorLoader = new CursorLoader(context,
|
||||||
|
ContactsContract.Data.CONTENT_URI, PROJECTION, SELECTION, null,
|
||||||
|
null);
|
||||||
|
mCursorLoader.registerListener(0, new OnLoadCompleteListener<Cursor>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onLoadComplete(Loader<Cursor> arg0, Cursor cursor) {
|
||||||
|
while (cursor.moveToNext()) {
|
||||||
|
Bundle contact = new Bundle();
|
||||||
|
contact.putInt("phoneid", cursor.getInt(cursor
|
||||||
|
.getColumnIndex(ContactsContract.Data._ID)));
|
||||||
|
contact.putString(
|
||||||
|
"displayname",
|
||||||
|
cursor.getString(cursor
|
||||||
|
.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)));
|
||||||
|
contact.putString(
|
||||||
|
"photouri",
|
||||||
|
cursor.getString(cursor
|
||||||
|
.getColumnIndex(ContactsContract.Data.PHOTO_THUMBNAIL_URI)));
|
||||||
|
contact.putString("lookup",cursor.getString(cursor
|
||||||
|
.getColumnIndex(ContactsContract.Data.LOOKUP_KEY)));
|
||||||
|
phoneContacts.put(
|
||||||
|
cursor.getString(cursor
|
||||||
|
.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA)),
|
||||||
|
contact);
|
||||||
|
}
|
||||||
|
if (listener!=null) {
|
||||||
|
listener.onPhoneContactsLoaded(phoneContacts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
mCursorLoader.startLoading();
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,28 +1,43 @@
|
||||||
package de.gultsch.chat.utils;
|
package de.gultsch.chat.utils;
|
||||||
|
|
||||||
|
import java.io.FileDescriptor;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
import de.gultsch.chat.R;
|
import de.gultsch.chat.R;
|
||||||
|
import de.gultsch.chat.entities.Contact;
|
||||||
import de.gultsch.chat.entities.Conversation;
|
import de.gultsch.chat.entities.Conversation;
|
||||||
import de.gultsch.chat.ui.ConversationActivity;
|
import de.gultsch.chat.ui.ConversationActivity;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.app.AlertDialog;
|
||||||
import android.app.Notification;
|
import android.app.Notification;
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.res.AssetFileDescriptor;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
import android.graphics.Paint;
|
import android.graphics.Paint;
|
||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
|
import android.provider.ContactsContract;
|
||||||
|
import android.provider.ContactsContract.CommonDataKinds;
|
||||||
|
import android.provider.ContactsContract.Contacts;
|
||||||
|
import android.provider.ContactsContract.Intents;
|
||||||
import android.support.v4.app.NotificationCompat;
|
import android.support.v4.app.NotificationCompat;
|
||||||
import android.support.v4.app.TaskStackBuilder;
|
import android.support.v4.app.TaskStackBuilder;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.View.OnClickListener;
|
||||||
|
import android.widget.QuickContactBadge;
|
||||||
|
|
||||||
public class UIHelper {
|
public class UIHelper {
|
||||||
public static String readableTimeDifference(long time) {
|
public static String readableTimeDifference(long time) {
|
||||||
|
@ -71,43 +86,61 @@ public class UIHelper {
|
||||||
return bitmap;
|
return bitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Notification getUnreadMessageNotification(Context context, Conversation conversation) {
|
public static Notification getUnreadMessageNotification(Context context,
|
||||||
|
Conversation conversation) {
|
||||||
|
|
||||||
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(context);
|
SharedPreferences sharedPref = PreferenceManager
|
||||||
String ringtone = sharedPref.getString("notification_ringtone",null);
|
.getDefaultSharedPreferences(context);
|
||||||
|
String ringtone = sharedPref.getString("notification_ringtone", null);
|
||||||
|
|
||||||
Resources res = context.getResources();
|
Resources res = context.getResources();
|
||||||
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context);
|
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
|
||||||
mBuilder.setLargeIcon(UIHelper.getUnknownContactPicture(conversation.getName(),(int) res.getDimension(android.R.dimen.notification_large_icon_width)));
|
context);
|
||||||
|
mBuilder.setLargeIcon(UIHelper.getUnknownContactPicture(conversation
|
||||||
|
.getName(), (int) res
|
||||||
|
.getDimension(android.R.dimen.notification_large_icon_width)));
|
||||||
mBuilder.setContentTitle(conversation.getName());
|
mBuilder.setContentTitle(conversation.getName());
|
||||||
mBuilder.setContentText(conversation.getLatestMessage());
|
mBuilder.setContentText(conversation.getLatestMessage());
|
||||||
mBuilder.setSmallIcon(R.drawable.notification);
|
mBuilder.setSmallIcon(R.drawable.notification);
|
||||||
mBuilder.setLights(0xffffffff, 2000, 4000);
|
mBuilder.setLights(0xffffffff, 2000, 4000);
|
||||||
if (ringtone!=null) {
|
if (ringtone != null) {
|
||||||
mBuilder.setSound(Uri.parse(ringtone));
|
mBuilder.setSound(Uri.parse(ringtone));
|
||||||
}
|
}
|
||||||
|
|
||||||
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
|
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
|
||||||
stackBuilder.addParentStack(ConversationActivity.class);
|
stackBuilder.addParentStack(ConversationActivity.class);
|
||||||
|
|
||||||
Intent viewConversationIntent = new Intent(context,ConversationActivity.class);
|
Intent viewConversationIntent = new Intent(context,
|
||||||
|
ConversationActivity.class);
|
||||||
viewConversationIntent.setAction(Intent.ACTION_VIEW);
|
viewConversationIntent.setAction(Intent.ACTION_VIEW);
|
||||||
viewConversationIntent.putExtra(
|
viewConversationIntent.putExtra(ConversationActivity.CONVERSATION,
|
||||||
ConversationActivity.CONVERSATION,
|
|
||||||
conversation.getUuid());
|
conversation.getUuid());
|
||||||
viewConversationIntent
|
viewConversationIntent.setType(ConversationActivity.VIEW_CONVERSATION);
|
||||||
.setType(ConversationActivity.VIEW_CONVERSATION);
|
|
||||||
|
|
||||||
stackBuilder.addNextIntent(viewConversationIntent);
|
stackBuilder.addNextIntent(viewConversationIntent);
|
||||||
|
|
||||||
PendingIntent resultPendingIntent =
|
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,
|
||||||
stackBuilder.getPendingIntent(
|
PendingIntent.FLAG_UPDATE_CURRENT);
|
||||||
0,
|
|
||||||
PendingIntent.FLAG_UPDATE_CURRENT
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
mBuilder.setContentIntent(resultPendingIntent);
|
mBuilder.setContentIntent(resultPendingIntent);
|
||||||
return mBuilder.build();
|
return mBuilder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void prepareContactBadge(final Activity activity,
|
||||||
|
QuickContactBadge badge, final Contact contact) {
|
||||||
|
if (contact.getSystemAccount()!=null) {
|
||||||
|
String[] systemAccount = contact.getSystemAccount().split("#");
|
||||||
|
long id = Long.parseLong(systemAccount[0]);
|
||||||
|
badge.assignContactUri(Contacts.getLookupUri(id, systemAccount[1]));
|
||||||
|
|
||||||
|
if (contact.getProfilePhoto() != null) {
|
||||||
|
badge.setImageURI(Uri.parse(contact.getProfilePhoto()));
|
||||||
|
} else {
|
||||||
|
badge.setImageBitmap(UIHelper.getUnknownContactPicture(contact.getDisplayName(), 400));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
badge.setImageBitmap(UIHelper.getUnknownContactPicture(contact.getDisplayName(), 400));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue