aboutsummaryrefslogtreecommitdiffstats
path: root/OpenKeychain/src
diff options
context:
space:
mode:
authorAdithya Abraham Philip <adithyaphilip@gmail.com>2015-03-10 01:05:40 +0530
committerAdithya Abraham Philip <adithyaphilip@gmail.com>2015-03-10 01:08:09 +0530
commitf8a6f814dd4f4e015707085c297b91abf237ed14 (patch)
tree61645e70ea19d7a97441760e36c19d9177a1d72b /OpenKeychain/src
parentbc43797c32542aa48a34f44d486645d24fca06ba (diff)
downloadopen-keychain-f8a6f814dd4f4e015707085c297b91abf237ed14.tar.gz
open-keychain-f8a6f814dd4f4e015707085c297b91abf237ed14.tar.bz2
open-keychain-f8a6f814dd4f4e015707085c297b91abf237ed14.zip
added contact linking
Diffstat (limited to 'OpenKeychain/src')
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java61
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java28
-rw-r--r--OpenKeychain/src/main/res/layout/view_key_fragment.xml23
-rw-r--r--OpenKeychain/src/main/res/values/strings.xml2
4 files changed, 102 insertions, 12 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
index 389b39c82..f4cbe88a9 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
@@ -18,25 +18,31 @@
package org.sufficientlysecure.keychain.ui;
+import android.content.ContentResolver;
+import android.content.Context;
import android.content.DialogInterface;
+import android.content.Intent;
import android.database.Cursor;
+import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
+import android.provider.ContactsContract;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ListView;
+import android.widget.*;
import org.sufficientlysecure.keychain.Constants;
import org.sufficientlysecure.keychain.R;
import org.sufficientlysecure.keychain.compatibility.DialogFragmentWorkaround;
+import org.sufficientlysecure.keychain.pgp.KeyRing;
import org.sufficientlysecure.keychain.provider.KeychainContract;
import org.sufficientlysecure.keychain.ui.adapter.UserIdsAdapter;
import org.sufficientlysecure.keychain.ui.dialog.UserIdInfoDialogFragment;
+import org.sufficientlysecure.keychain.util.ContactHelper;
import org.sufficientlysecure.keychain.util.Log;
public class ViewKeyFragment extends LoaderFragment implements
@@ -45,12 +51,18 @@ public class ViewKeyFragment extends LoaderFragment implements
public static final String ARG_DATA_URI = "uri";
private ListView mUserIds;
- private ListView mLinkedSystemContact;
+ //private ListView mLinkedSystemContact;
boolean mIsSecret = false;
+ private String mName;
+
+ LinearLayout mSystemContactLayout;
+ ImageView mSystemContactPicture;
+ TextView mSystemContactName;
private static final int LOADER_ID_UNIFIED = 0;
private static final int LOADER_ID_USER_IDS = 1;
+ private static final int LOADER_ID_SYSTEM_CONTACT = 2;
private UserIdsAdapter mUserIdsAdapter;
@@ -83,15 +95,17 @@ public class ViewKeyFragment extends LoaderFragment implements
}
});
- mLinkedSystemContact = (ListView) view.findViewById(R.id.view_key_linked_system_contact);
+ mSystemContactLayout = (LinearLayout) view.findViewById(R.id.system_contact_layout);
+ mSystemContactName = (TextView) view.findViewById(R.id.system_contact_name);
+ mSystemContactPicture = (ImageView) view.findViewById(R.id.system_contact_picture);
+ // mLinkedSystemContact = (ListView) view.findViewById(R.id.view_key_linked_system_contact);
- mLinkedSystemContact.setOnItemClickListener(new AdapterView.OnItemClickListener() {
+ /* mLinkedSystemContact.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
showSystemContact(position);
}
- });
-
+ });*/
return root;
}
@@ -111,8 +125,32 @@ public class ViewKeyFragment extends LoaderFragment implements
}
}
- private void showSystemContact(final int position) {
+ private void loadLinkedSystemContact(String name, final long masterKeyId) {
+ final Context context = mSystemContactName.getContext();
+ final ContentResolver resolver = context.getContentResolver();
+
+ final long contactId = ContactHelper.findContactId(resolver, masterKeyId);
+
+ if (contactId != -1) {//contact exists for given master key
+ mSystemContactName.setText(name);
+
+ Bitmap picture = ContactHelper.loadPhotoByMasterKeyId(resolver, masterKeyId, true);
+ if (picture != null) mSystemContactPicture.setImageBitmap(picture);
+ mSystemContactLayout.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ launchContactActivity(contactId, context);
+ }
+ });
+ }
+ }
+
+ private void launchContactActivity(final long contactId, Context context) {
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(contactId));
+ intent.setData(uri);
+ context.startActivity(intent);
}
@Override
@@ -196,7 +234,12 @@ public class ViewKeyFragment extends LoaderFragment implements
if (data.moveToFirst()) {
mIsSecret = data.getInt(INDEX_HAS_ANY_SECRET) != 0;
-
+ if (mName == null) {//to ensure we load the linked system contact only once
+ String[] mainUserId = KeyRing.splitUserId(data.getString(INDEX_USER_ID));
+ mName = mainUserId[0];
+ long masterKeyId = data.getLong(INDEX_MASTER_KEY_ID);
+ loadLinkedSystemContact(mName, masterKeyId);
+ }
// load user ids after we know if it's a secret key
mUserIdsAdapter = new UserIdsAdapter(getActivity(), null, 0, !mIsSecret, null);
mUserIds.setAdapter(mUserIdsAdapter);
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java
index 08c7c02fb..f1ed36a8d 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java
@@ -267,6 +267,34 @@ public class ContactHelper {
return null;
}
+ /**
+ * returns the CONTACT_ID of the raw contact to which a masterKeyId is associated, if the
+ * raw contact has not been marked for deletion
+ * @param resolver
+ * @param masterKeyId
+ * @return CONTACT_ID (id of aggregated contact) linked to masterKeyId
+ */
+ public static long findContactId(ContentResolver resolver, long masterKeyId) {
+ long contactId = -1;
+ Cursor raw = resolver.query(ContactsContract.RawContacts.CONTENT_URI,
+ new String[]{
+ ContactsContract.RawContacts.CONTACT_ID
+ },
+ ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " +
+ ContactsContract.RawContacts.SOURCE_ID + "=? AND " +
+ ContactsContract.RawContacts.DELETED + "=?",
+ new String[]{//"0" for "not deleted"
+ Constants.ACCOUNT_TYPE, Long.toString(masterKeyId), "0"
+ }, null);
+ if (raw != null) {
+ if (raw.moveToNext()) {
+ contactId = raw.getLong(0);
+ }
+ raw.close();
+ }
+ return contactId;
+ }
+
public static Bitmap getCachedPhotoByMasterKeyId(ContentResolver contentResolver, long masterKeyId) {
if (masterKeyId == -1) {
return null;
diff --git a/OpenKeychain/src/main/res/layout/view_key_fragment.xml b/OpenKeychain/src/main/res/layout/view_key_fragment.xml
index 7f3ef0f1e..d8584bca6 100644
--- a/OpenKeychain/src/main/res/layout/view_key_fragment.xml
+++ b/OpenKeychain/src/main/res/layout/view_key_fragment.xml
@@ -62,11 +62,28 @@
android:layout_height="wrap_content"
android:text="@string/section_linked_system_contact"/>
- <org.sufficientlysecure.keychain.ui.widget.FixedListView
- android:id="@+id/view_key_linked_system_contact"
+ <LinearLayout
+ android:id='@+id/system_contact_layout'
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginBottom="4dp"/>
+ android:orientation="horizontal">
+
+ <ImageView
+ android:id="@+id/system_contact_picture"
+ android:layout_margin="6dp"
+ android:layout_width="60dp"
+ android:layout_height="60dp"
+ android:scaleType="centerCrop"
+ android:src="@color/bg_gray"/>
+
+ <TextView
+ android:id="@+id/system_contact_name"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:textAppearance="?android:attr/textAppearanceMedium"
+ android:text="@string/view_key_fragment_no_system_contact"/>
+ </LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
diff --git a/OpenKeychain/src/main/res/values/strings.xml b/OpenKeychain/src/main/res/values/strings.xml
index 61c406d48..784f2825c 100644
--- a/OpenKeychain/src/main/res/values/strings.xml
+++ b/OpenKeychain/src/main/res/values/strings.xml
@@ -639,6 +639,8 @@
<string name="view_key_verified">"Confirmed Key"</string>
<string name="view_key_unverified">"Unconfirmed: Scan QR Code to confirm key!"</string>
+ <string name="view_key_fragment_no_system_contact">"&lt;none&gt;"</string>
+
<!-- Navigation Drawer -->
<string name="nav_keys">"Keys"</string>
<string name="nav_encrypt_decrypt">"Encrypt/Decrypt"</string>