Merge pull request #1 from siacs/development

pull
This commit is contained in:
Dominik Schürmann 2014-05-08 14:40:03 +02:00
commit 1b2ce1a309
8 changed files with 282 additions and 231 deletions

View File

@ -83,4 +83,7 @@
<string name="openkeychain_required_long">Conversations utilizes a third party app called <b>OpenKeychain</b> to encrypt and decrypt messages and to mange your public keys.\n\nOpenKeychain is licensed under GPLv3 and available on F-Droid and Google Play.\n\n<small>(Please restart Conversations afterwards.)</small></string> <string name="openkeychain_required_long">Conversations utilizes a third party app called <b>OpenKeychain</b> to encrypt and decrypt messages and to mange your public keys.\n\nOpenKeychain is licensed under GPLv3 and available on F-Droid and Google Play.\n\n<small>(Please restart Conversations afterwards.)</small></string>
<string name="restart">Restart</string> <string name="restart">Restart</string>
<string name="install">Install</string> <string name="install">Install</string>
<string name="offering">offering&#8230;</string>
<string name="no_pgp_key">No openPGP Key found</string>
<string name="contact_has_no_pgp_key">Conversations is unable to encrypt your messages because your contact is not announcing his or hers public key.\n\n<small>Please ask your contact to setup openPGP.</small></string>
</resources> </resources>

View File

@ -15,7 +15,6 @@ import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.database.Cursor; import android.database.Cursor;
import android.net.Uri; import android.net.Uri;
import android.util.Log;
public class Conversation extends AbstractEntity { public class Conversation extends AbstractEntity {
@ -238,7 +237,6 @@ public class Conversation extends AbstractEntity {
} }
return this.otrSession; return this.otrSession;
} catch (OtrException e) { } catch (OtrException e) {
Log.d("xmppServic", "couldnt start otr");
return null; return null;
} }
} }
@ -347,7 +345,6 @@ public class Conversation extends AbstractEntity {
} }
public void setNextMessage(String message) { public void setNextMessage(String message) {
Log.d("xmppService","saving text: "+message);
this.nextMessage = message; this.nextMessage = message;
} }
} }

View File

@ -17,7 +17,6 @@ public class Message extends AbstractEntity {
public static final int STATUS_SEND = 2; public static final int STATUS_SEND = 2;
public static final int STATUS_SEND_FAILED = 3; public static final int STATUS_SEND_FAILED = 3;
public static final int STATUS_SEND_REJECTED = 4; public static final int STATUS_SEND_REJECTED = 4;
public static final int STATUS_PREPARING = 5;
public static final int STATUS_OFFERED = 6; public static final int STATUS_OFFERED = 6;
public static final int ENCRYPTION_NONE = 0; public static final int ENCRYPTION_NONE = 0;

View File

@ -451,18 +451,14 @@ public class XmppConnectionService extends Service {
final Message message = new Message(conversation, "",Message.ENCRYPTION_NONE); final Message message = new Message(conversation, "",Message.ENCRYPTION_NONE);
message.setPresence(presence); message.setPresence(presence);
message.setType(Message.TYPE_IMAGE); message.setType(Message.TYPE_IMAGE);
message.setStatus(Message.STATUS_PREPARING); message.setStatus(Message.STATUS_OFFERED);
conversation.getMessages().add(message);
if (convChangedListener != null) {
convChangedListener.onConversationListChanged();
}
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
getFileBackend().copyImageToPrivateStorage(message, uri); getFileBackend().copyImageToPrivateStorage(message, uri);
message.setStatus(Message.STATUS_OFFERED);
databaseBackend.createMessage(message); databaseBackend.createMessage(message);
conversation.getMessages().add(message);
if (convChangedListener != null) { if (convChangedListener != null) {
convChangedListener.onConversationListChanged(); convChangedListener.onConversationListChanged();
} }
@ -477,14 +473,13 @@ public class XmppConnectionService extends Service {
final Message message = new Message(conversation, "",Message.ENCRYPTION_DECRYPTED); final Message message = new Message(conversation, "",Message.ENCRYPTION_DECRYPTED);
message.setPresence(presence); message.setPresence(presence);
message.setType(Message.TYPE_IMAGE); message.setType(Message.TYPE_IMAGE);
message.setStatus(Message.STATUS_PREPARING); message.setStatus(Message.STATUS_OFFERED);
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
getFileBackend().copyImageToPrivateStorage(message, uri); getFileBackend().copyImageToPrivateStorage(message, uri);
getPgpEngine().encrypt(message, callback); getPgpEngine().encrypt(message, callback);
message.setStatus(Message.STATUS_OFFERED);
} }
}).start(); }).start();
return message; return message;

View File

@ -178,16 +178,14 @@ public class ConversationActivity extends XmppActivity {
convLastMsg.setVisibility(View.VISIBLE); convLastMsg.setVisibility(View.VISIBLE);
imagePreview.setVisibility(View.GONE); imagePreview.setVisibility(View.GONE);
} else if (latestMessage.getType() == Message.TYPE_IMAGE) { } else if (latestMessage.getType() == Message.TYPE_IMAGE) {
if ((latestMessage.getStatus() >= Message.STATUS_RECIEVED)&&(latestMessage.getStatus() != Message.STATUS_PREPARING)) { if (latestMessage.getStatus() >= Message.STATUS_RECIEVED) {
convLastMsg.setVisibility(View.GONE); convLastMsg.setVisibility(View.GONE);
imagePreview.setVisibility(View.VISIBLE); imagePreview.setVisibility(View.VISIBLE);
loadBitmap(latestMessage, imagePreview); loadBitmap(latestMessage, imagePreview);
} else { } else {
convLastMsg.setVisibility(View.VISIBLE); convLastMsg.setVisibility(View.VISIBLE);
imagePreview.setVisibility(View.GONE); imagePreview.setVisibility(View.GONE);
if (latestMessage.getStatus() == Message.STATUS_PREPARING) { if (latestMessage.getStatus() == Message.STATUS_RECEIVED_OFFER) {
convLastMsg.setText(getText(R.string.preparing_image));
} else if (latestMessage.getStatus() == Message.STATUS_RECEIVED_OFFER) {
convLastMsg.setText(getText(R.string.image_offered_for_download)); convLastMsg.setText(getText(R.string.image_offered_for_download));
} else if (latestMessage.getStatus() == Message.STATUS_RECIEVING) { } else if (latestMessage.getStatus() == Message.STATUS_RECIEVING) {
convLastMsg.setText(getText(R.string.receiving_image)); convLastMsg.setText(getText(R.string.receiving_image));
@ -343,26 +341,42 @@ public class ConversationActivity extends XmppActivity {
} }
private void attachFile() { private void attachFile() {
if (getSelectedConversation().getNextEncryption() == Message.ENCRYPTION_PGP) { final Conversation conversation = getSelectedConversation();
if (conversation.getNextEncryption() == Message.ENCRYPTION_PGP) {
if (hasPgp()) { if (hasPgp()) {
xmppConnectionService.getPgpEngine().hasKey(getSelectedConversation().getContact(), new OnPgpEngineResult() { if (conversation.getContact().getPgpKeyId()!=0) {
xmppConnectionService.getPgpEngine().hasKey(conversation.getContact(), new OnPgpEngineResult() {
@Override
public void userInputRequried(PendingIntent pi) {
ConversationActivity.this.runIntent(pi, REQUEST_SEND_PGP_IMAGE);
}
@Override
public void success() {
attachFileDialog();
}
@Override
public void error(OpenPgpError openPgpError) {
// TODO Auto-generated method stub
@Override
public void userInputRequried(PendingIntent pi) {
ConversationActivity.this.runIntent(pi, REQUEST_SEND_PGP_IMAGE);
}
@Override
public void success() {
attachFileDialog();
}
@Override
public void error(OpenPgpError openPgpError) {
// TODO Auto-generated method stub
}
});
} else {
final ConversationFragment fragment = (ConversationFragment) getFragmentManager()
.findFragmentByTag("conversation");
if (fragment != null) {
fragment.showNoPGPKeyDialog(new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
conversation.setNextEncryption(Message.ENCRYPTION_NONE);
attachFileDialog();
}
});
} }
}); }
} }
} else if (getSelectedConversation().getNextEncryption() == Message.ENCRYPTION_NONE) { } else if (getSelectedConversation().getNextEncryption() == Message.ENCRYPTION_NONE) {
attachFileDialog(); attachFileDialog();
@ -409,7 +423,7 @@ public class ConversationActivity extends XmppActivity {
startActivity(inviteIntent); startActivity(inviteIntent);
break; break;
case R.id.action_security: case R.id.action_security:
final Conversation selConv = getSelectedConversation(); final Conversation conversation = getSelectedConversation();
View menuItemView = findViewById(R.id.action_security); View menuItemView = findViewById(R.id.action_security);
PopupMenu popup = new PopupMenu(this, menuItemView); PopupMenu popup = new PopupMenu(this, menuItemView);
final ConversationFragment fragment = (ConversationFragment) getFragmentManager() final ConversationFragment fragment = (ConversationFragment) getFragmentManager()
@ -421,19 +435,25 @@ public class ConversationActivity extends XmppActivity {
public boolean onMenuItemClick(MenuItem item) { public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.encryption_choice_none: case R.id.encryption_choice_none:
selConv.setNextEncryption(Message.ENCRYPTION_NONE); conversation.setNextEncryption(Message.ENCRYPTION_NONE);
item.setChecked(true); item.setChecked(true);
break; break;
case R.id.encryption_choice_otr: case R.id.encryption_choice_otr:
selConv.setNextEncryption(Message.ENCRYPTION_OTR); conversation.setNextEncryption(Message.ENCRYPTION_OTR);
item.setChecked(true); item.setChecked(true);
break; break;
case R.id.encryption_choice_pgp: case R.id.encryption_choice_pgp:
selConv.setNextEncryption(Message.ENCRYPTION_PGP); if (hasPgp()) {
item.setChecked(true); if (conversation.getAccount().getKeys().has("pgp_signature")) {
conversation.setNextEncryption(Message.ENCRYPTION_PGP);
item.setChecked(true);
} else {
announcePgp(conversation.getAccount());
}
}
break; break;
default: default:
selConv.setNextEncryption(Message.ENCRYPTION_NONE); conversation.setNextEncryption(Message.ENCRYPTION_NONE);
break; break;
} }
fragment.updateChatMsgHint(); fragment.updateChatMsgHint();
@ -441,7 +461,7 @@ public class ConversationActivity extends XmppActivity {
} }
}); });
popup.inflate(R.menu.encryption_choices); popup.inflate(R.menu.encryption_choices);
switch (selConv.getNextEncryption()) { switch (conversation.getNextEncryption()) {
case Message.ENCRYPTION_NONE: case Message.ENCRYPTION_NONE:
popup.getMenu().findItem(R.id.encryption_choice_none) popup.getMenu().findItem(R.id.encryption_choice_none)
.setChecked(true); .setChecked(true);
@ -454,10 +474,6 @@ public class ConversationActivity extends XmppActivity {
popup.getMenu().findItem(R.id.encryption_choice_pgp) popup.getMenu().findItem(R.id.encryption_choice_pgp)
.setChecked(true); .setChecked(true);
break; break;
case Message.ENCRYPTION_DECRYPTED:
popup.getMenu().findItem(R.id.encryption_choice_pgp)
.setChecked(true);
break;
default: default:
popup.getMenu().findItem(R.id.encryption_choice_none) popup.getMenu().findItem(R.id.encryption_choice_none)
.setChecked(true); .setChecked(true);

View File

@ -192,6 +192,155 @@ public class ConversationFragment extends Fragment {
} }
} }
private void displayStatus(ViewHolder viewHolder, Message message) {
String filesize = null;
String info = null;
boolean error = false;
if (message.getType() == Message.TYPE_IMAGE) {
String[] fileParams = message.getBody().split(",");
long size = Long.parseLong(fileParams[0]);
filesize = size / 1024 + " KB";
}
switch (message.getStatus()) {
case Message.STATUS_UNSEND:
info = getString(R.string.sending);
break;
case Message.STATUS_OFFERED:
info = getString(R.string.offering);
break;
case Message.STATUS_SEND_FAILED:
info = getString(R.string.send_failed);
error = true;
break;
case Message.STATUS_SEND_REJECTED:
info = getString(R.string.send_rejected);
error = true;
break;
default:
if ((message.getConversation().getMode() == Conversation.MODE_MULTI)
&& (message.getStatus() <= Message.STATUS_RECIEVED)) {
info = message.getCounterpart();
}
break;
}
if (error) {
viewHolder.time.setTextColor(0xFFe92727);
} else {
viewHolder.time.setTextColor(0xFF8e8e8e);
}
if (message.getEncryption() == Message.ENCRYPTION_NONE) {
viewHolder.indicator.setVisibility(View.GONE);
} else {
viewHolder.indicator.setVisibility(View.VISIBLE);
}
String formatedTime = UIHelper.readableTimeDifference(message
.getTimeSent());
if (message.getStatus() <= Message.STATUS_RECIEVED) {
if ((filesize != null) && (info != null)) {
viewHolder.time.setText(filesize + " \u00B7 " + info);
} else if ((filesize == null) && (info != null)) {
viewHolder.time.setText(formatedTime + " \u00B7 "
+ info);
} else if ((filesize != null) && (info == null)) {
viewHolder.time.setText(formatedTime + " \u00B7 "
+ filesize);
} else {
viewHolder.time.setText(formatedTime);
}
} else {
if ((filesize != null) && (info != null)) {
viewHolder.time.setText(filesize + " \u00B7 " + info);
} else if ((filesize == null) && (info != null)) {
viewHolder.time.setText(info + " \u00B7 "
+ formatedTime);
} else if ((filesize != null) && (info == null)) {
viewHolder.time.setText(filesize + " \u00B7 "
+ formatedTime);
} else {
viewHolder.time.setText(formatedTime);
}
}
}
private void displayInfoMessage(ViewHolder viewHolder, int r) {
viewHolder.download_button.setVisibility(View.GONE);
viewHolder.image.setVisibility(View.GONE);
viewHolder.messageBody.setVisibility(View.VISIBLE);
viewHolder.messageBody.setText(getString(r));
viewHolder.messageBody.setTextColor(0xff33B5E5);
viewHolder.messageBody.setTypeface(null, Typeface.ITALIC);
}
private void displayDecryptionFailed(ViewHolder viewHolder) {
viewHolder.download_button.setVisibility(View.GONE);
viewHolder.image.setVisibility(View.GONE);
viewHolder.messageBody.setVisibility(View.VISIBLE);
viewHolder.messageBody
.setText(getString(R.string.decryption_failed));
viewHolder.messageBody.setTextColor(0xFFe92727);
viewHolder.messageBody.setTypeface(null, Typeface.NORMAL);
}
private void displayTextMessage(ViewHolder viewHolder, String text) {
if (viewHolder.download_button != null) {
viewHolder.download_button.setVisibility(View.GONE);
}
viewHolder.image.setVisibility(View.GONE);
viewHolder.messageBody.setVisibility(View.VISIBLE);
if (text != null) {
viewHolder.messageBody.setText(text.trim());
} else {
viewHolder.messageBody.setText("");
}
viewHolder.messageBody.setTextColor(0xff333333);
viewHolder.messageBody.setTypeface(null, Typeface.NORMAL);
}
private void displayImageMessage(ViewHolder viewHolder,
final Message message) {
if (viewHolder.download_button != null) {
viewHolder.download_button.setVisibility(View.GONE);
}
viewHolder.messageBody.setVisibility(View.GONE);
viewHolder.image.setVisibility(View.VISIBLE);
String[] fileParams = message.getBody().split(",");
if (fileParams.length == 3) {
double target = metrics.density * 288;
int w = Integer.parseInt(fileParams[1]);
int h = Integer.parseInt(fileParams[2]);
int scalledW;
int scalledH;
if (w <= h) {
scalledW = (int) (w / ((double) h / target));
scalledH = (int) target;
} else {
scalledW = (int) target;
scalledH = (int) (h / ((double) w / target));
}
viewHolder.image
.setLayoutParams(new LinearLayout.LayoutParams(
scalledW, scalledH));
}
activity.loadBitmap(message, viewHolder.image);
viewHolder.image.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Uri uri = Uri
.parse("content://eu.siacs.conversations.images/"
+ message.getConversationUuid()
+ "/"
+ message.getUuid());
Log.d("xmppService",
"staring intent with uri:" + uri.toString());
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "image/*");
startActivity(intent);
}
});
}
@Override @Override
public View getView(int position, View view, ViewGroup parent) { public View getView(int position, View view, ViewGroup parent) {
final Message item = getItem(position); final Message item = getItem(position);
@ -265,38 +414,9 @@ public class ConversationFragment extends Fragment {
} }
} }
if (item.getEncryption() == Message.ENCRYPTION_NONE) { if (item.getType() == Message.TYPE_IMAGE) {
viewHolder.indicator.setVisibility(View.GONE); if (item.getStatus() == Message.STATUS_RECIEVING) {
} else { displayInfoMessage(viewHolder, R.string.receiving_image);
viewHolder.indicator.setVisibility(View.VISIBLE);
}
String filesize = "";
if ((item.getType() == Message.TYPE_IMAGE)
&& ((item.getEncryption() == Message.ENCRYPTION_DECRYPTED) || (item
.getEncryption() == Message.ENCRYPTION_NONE))) {
String[] fileParams = item.getBody().split(",");
if ((fileParams.length >= 1)
&& (item.getStatus() != Message.STATUS_PREPARING)) {
long size = Long.parseLong(fileParams[0]);
filesize = size / 1024 + " KB \u00B7 ";
}
if ((item.getStatus() == Message.STATUS_PREPARING)
|| (item.getStatus() == Message.STATUS_RECIEVING)) {
viewHolder.image.setVisibility(View.GONE);
viewHolder.messageBody.setVisibility(View.VISIBLE);
if (item.getStatus() == Message.STATUS_PREPARING) {
viewHolder.messageBody
.setText(getString(R.string.preparing_image));
} else if (item.getStatus() == Message.STATUS_RECIEVING) {
viewHolder.download_button.setVisibility(View.GONE);
viewHolder.messageBody
.setText(getString(R.string.receiving_image));
}
viewHolder.messageBody.setTextColor(0xff33B5E5);
viewHolder.messageBody.setTypeface(null,
Typeface.ITALIC);
} else if (item.getStatus() == Message.STATUS_RECEIVED_OFFER) { } else if (item.getStatus() == Message.STATUS_RECEIVED_OFFER) {
viewHolder.image.setVisibility(View.GONE); viewHolder.image.setVisibility(View.GONE);
viewHolder.messageBody.setVisibility(View.GONE); viewHolder.messageBody.setVisibility(View.GONE);
@ -316,114 +436,28 @@ public class ConversationFragment extends Fragment {
} }
} }
}); });
} else if ((item.getEncryption() == Message.ENCRYPTION_DECRYPTED)
|| (item.getEncryption() == Message.ENCRYPTION_NONE)) {
displayImageMessage(viewHolder, item);
} else if (item.getEncryption() == Message.ENCRYPTION_PGP) {
displayInfoMessage(viewHolder,
R.string.encrypted_message);
} else { } else {
viewHolder.messageBody.setVisibility(View.GONE); displayDecryptionFailed(viewHolder);
viewHolder.image.setVisibility(View.VISIBLE);
if (fileParams.length == 3) {
double target = metrics.density * 288;
int w = Integer.parseInt(fileParams[1]);
int h = Integer.parseInt(fileParams[2]);
int scalledW;
int scalledH;
if (w <= h) {
scalledW = (int) (w / ((double) h / target));
scalledH = (int) target;
} else {
scalledW = (int) target;
scalledH = (int) (h / ((double) w / target));
}
viewHolder.image
.setLayoutParams(new LinearLayout.LayoutParams(
scalledW, scalledH));
} else {
Log.d("xmppService",
"message body has less than 3 params");
}
activity.loadBitmap(item, viewHolder.image);
viewHolder.image
.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Uri uri = Uri.parse("content://eu.siacs.conversations.images/"
+ item.getConversationUuid()
+ "/" + item.getUuid());
Log.d("xmppService",
"staring intent with uri:"
+ uri.toString());
Intent intent = new Intent(
Intent.ACTION_VIEW);
intent.setDataAndType(uri, "image/*");
startActivity(intent);
}
});
} }
} else { } else {
viewHolder.image.setVisibility(View.GONE); if (item.getEncryption() == Message.ENCRYPTION_PGP) {
viewHolder.messageBody.setVisibility(View.VISIBLE); displayInfoMessage(viewHolder,
String body = item.getBody(); R.string.encrypted_message);
if (body != null) { } else if (item.getEncryption() == Message.ENCRYPTION_DECRYPTION_FAILED) {
if (item.getEncryption() == Message.ENCRYPTION_PGP) { displayDecryptionFailed(viewHolder);
viewHolder.messageBody
.setText(getString(R.string.encrypted_message));
viewHolder.messageBody.setTextColor(0xff33B5E5);
viewHolder.messageBody.setTypeface(null,
Typeface.ITALIC);
} else if (item.getEncryption() == Message.ENCRYPTION_DECRYPTION_FAILED) {
viewHolder.messageBody
.setText(getString(R.string.decryption_failed));
viewHolder.messageBody.setTextColor(0xFFe92727);
viewHolder.messageBody.setTypeface(null,
Typeface.NORMAL);
} else {
viewHolder.messageBody.setText(body.trim());
viewHolder.messageBody.setTextColor(0xff333333);
viewHolder.messageBody.setTypeface(null,
Typeface.NORMAL);
}
}
}
switch (item.getStatus()) {
case Message.STATUS_UNSEND:
viewHolder.time.setTypeface(null, Typeface.ITALIC);
viewHolder.time.setTextColor(0xFF8e8e8e);
viewHolder.time.setText(filesize + "sending\u2026");
break;
case Message.STATUS_OFFERED:
viewHolder.time.setTypeface(null, Typeface.ITALIC);
viewHolder.time.setTextColor(0xFF8e8e8e);
viewHolder.time.setText(filesize + "offering\u2026");
break;
case Message.STATUS_SEND_FAILED:
viewHolder.time.setText(filesize
+ getString(R.string.send_failed)
+ " \u00B7 "
+ UIHelper.readableTimeDifference(item
.getTimeSent()));
viewHolder.time.setTextColor(0xFFe92727);
viewHolder.time.setTypeface(null, Typeface.NORMAL);
break;
case Message.STATUS_SEND_REJECTED:
viewHolder.time.setText(filesize
+ getString(R.string.send_rejected));
viewHolder.time.setTextColor(0xFFe92727);
viewHolder.time.setTypeface(null, Typeface.NORMAL);
break;
default:
viewHolder.time.setTypeface(null, Typeface.NORMAL);
viewHolder.time.setTextColor(0xFF8e8e8e);
if (item.getConversation().getMode() == Conversation.MODE_SINGLE) {
viewHolder.time.setText(filesize
+ UIHelper.readableTimeDifference(item
.getTimeSent()));
} else { } else {
viewHolder.time.setText(item.getCounterpart() displayTextMessage(viewHolder, item.getBody());
+ " \u00B7 "
+ UIHelper.readableTimeDifference(item
.getTimeSent()));
} }
break;
} }
displayStatus(viewHolder, item);
return view; return view;
} }
}; };
@ -518,7 +552,6 @@ public class ConversationFragment extends Fragment {
} }
private void decryptMessage(final Message message) { private void decryptMessage(final Message message) {
Log.d("xmppService", "called to decrypt");
PgpEngine engine = activity.xmppConnectionService.getPgpEngine(); PgpEngine engine = activity.xmppConnectionService.getPgpEngine();
if (engine != null) { if (engine != null) {
engine.decrypt(message, new OnPgpEngineResult() { engine.decrypt(message, new OnPgpEngineResult() {
@ -531,7 +564,6 @@ public class ConversationFragment extends Fragment {
@Override @Override
public void success() { public void success() {
Log.d("xmppService", "successfully decrypted");
activity.xmppConnectionService.databaseBackend activity.xmppConnectionService.databaseBackend
.updateMessage(message); .updateMessage(message);
updateMessages(); updateMessages();
@ -546,7 +578,7 @@ public class ConversationFragment extends Fragment {
} }
}); });
} else { } else {
Log.d("xmppService", "engine was null"); pgpInfo.setVisibility(View.VISIBLE);
} }
} }
@ -686,29 +718,32 @@ public class ConversationFragment extends Fragment {
}); });
} else { } else {
AlertDialog.Builder builder = new AlertDialog.Builder( showNoPGPKeyDialog(new DialogInterface.OnClickListener() {
getActivity());
builder.setTitle("No openPGP key found");
builder.setIconAttribute(android.R.attr.alertDialogIcon);
builder.setMessage("There is no openPGP key associated with this contact");
builder.setNegativeButton("Cancel", null);
builder.setPositiveButton("Send plain text",
new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, public void onClick(DialogInterface dialog,
int which) { int which) {
conversation conversation
.setNextEncryption(Message.ENCRYPTION_NONE); .setNextEncryption(Message.ENCRYPTION_NONE);
message.setEncryption(Message.ENCRYPTION_NONE); message.setEncryption(Message.ENCRYPTION_NONE);
xmppService.sendMessage(message, null); xmppService.sendMessage(message, null);
chatMsg.setText(""); chatMsg.setText("");
} }
}); });
builder.create().show();
} }
} }
} }
public void showNoPGPKeyDialog(DialogInterface.OnClickListener listener) {
AlertDialog.Builder builder = new AlertDialog.Builder(
getActivity());
builder.setTitle(getString(R.string.no_pgp_key));
builder.setIconAttribute(android.R.attr.alertDialogIcon);
builder.setMessage(getText(R.string.contact_has_no_pgp_key));
builder.setNegativeButton(getString(R.string.cancel), null);
builder.setPositiveButton(getString(R.string.send_unencrypted),listener);
builder.create().show();
}
protected void sendOtrMessage(final Message message) { protected void sendOtrMessage(final Message message) {
ConversationActivity activity = (ConversationActivity) getActivity(); ConversationActivity activity = (ConversationActivity) getActivity();

View File

@ -38,8 +38,6 @@ import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;
public class ManageAccountActivity extends XmppActivity { public class ManageAccountActivity extends XmppActivity {
public static final int REQUEST_ANNOUNCE_PGP = 0x73731;
protected boolean isActionMode = false; protected boolean isActionMode = false;
protected ActionMode actionMode; protected ActionMode actionMode;
@ -281,7 +279,7 @@ public class ManageAccountActivity extends XmppActivity {
} else if (item.getItemId()==R.id.mgmt_account_announce_pgp) { } else if (item.getItemId()==R.id.mgmt_account_announce_pgp) {
if (activity.hasPgp()) { if (activity.hasPgp()) {
mode.finish(); mode.finish();
announcePgp(); announcePgp(selectedAccountForActionMode);
} }
} else if (item.getItemId() == R.id.mgmt_otr_key) { } else if (item.getItemId() == R.id.mgmt_otr_key) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity); AlertDialog.Builder builder = new AlertDialog.Builder(activity);
@ -361,33 +359,6 @@ public class ManageAccountActivity extends XmppActivity {
} }
}); });
} }
private void announcePgp() {
final Account account = selectedAccountForActionMode;
xmppConnectionService.getPgpEngine().generateSignature(account, "online", new OnPgpEngineResult() {
@Override
public void userInputRequried(PendingIntent pi) {
try {
startIntentSenderForResult(pi.getIntentSender(), REQUEST_ANNOUNCE_PGP, null, 0, 0, 0);
} catch (SendIntentException e) {
Log.d("xmppService","coulnd start intent for pgp anncouncment");
}
}
@Override
public void success() {
xmppConnectionService.databaseBackend.updateAccount(account);
xmppConnectionService.sendPgpPresence(account, account.getPgpSignature());
}
@Override
public void error(OpenPgpError openPgpError) {
// TODO Auto-generated method stub
}
});
}
@Override @Override
protected void onStop() { protected void onStop() {
@ -487,7 +458,7 @@ public class ManageAccountActivity extends XmppActivity {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
if (requestCode == REQUEST_ANNOUNCE_PGP) { if (requestCode == REQUEST_ANNOUNCE_PGP) {
announcePgp(); announcePgp(selectedAccountForActionMode);
} }
} }
} }

View File

@ -1,28 +1,37 @@
package eu.siacs.conversations.ui; package eu.siacs.conversations.ui;
import org.openintents.openpgp.OpenPgpError;
import eu.siacs.conversations.R; import eu.siacs.conversations.R;
import eu.siacs.conversations.crypto.OnPgpEngineResult;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.services.XmppConnectionService.XmppConnectionBinder; import eu.siacs.conversations.services.XmppConnectionService.XmppConnectionBinder;
import eu.siacs.conversations.utils.ExceptionHelper; import eu.siacs.conversations.utils.ExceptionHelper;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
import android.app.PendingIntent;
import android.app.AlertDialog.Builder; import android.app.AlertDialog.Builder;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener; import android.content.DialogInterface.OnClickListener;
import android.content.IntentSender.SendIntentException;
import android.content.Intent; import android.content.Intent;
import android.content.ServiceConnection; import android.content.ServiceConnection;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.IBinder; import android.os.IBinder;
import android.util.Log;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
public abstract class XmppActivity extends Activity { public abstract class XmppActivity extends Activity {
public static final int REQUEST_ANNOUNCE_PGP = 0x73731;
protected final static String LOGTAG = "xmppService"; protected final static String LOGTAG = "xmppService";
public XmppConnectionService xmppConnectionService; public XmppConnectionService xmppConnectionService;
@ -152,4 +161,30 @@ public abstract class XmppActivity extends Activity {
| Intent.FLAG_ACTIVITY_CLEAR_TOP); | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(viewConversationIntent); startActivity(viewConversationIntent);
} }
protected void announcePgp(final Account account) {
xmppConnectionService.getPgpEngine().generateSignature(account, "online", new OnPgpEngineResult() {
@Override
public void userInputRequried(PendingIntent pi) {
try {
startIntentSenderForResult(pi.getIntentSender(), REQUEST_ANNOUNCE_PGP, null, 0, 0, 0);
} catch (SendIntentException e) {
Log.d("xmppService","coulnd start intent for pgp anncouncment");
}
}
@Override
public void success() {
xmppConnectionService.databaseBackend.updateAccount(account);
xmppConnectionService.sendPgpPresence(account, account.getPgpSignature());
}
@Override
public void error(OpenPgpError openPgpError) {
// TODO Auto-generated method stub
}
});
}
} }