commit
1b2ce1a309
|
@ -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…</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>
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue