Merge branch 'siacs/master' into development

This commit is contained in:
Christian S 2016-03-17 20:26:23 +01:00
commit 5ae161a593
10 changed files with 104 additions and 60 deletions

View file

@ -1,5 +1,8 @@
###Changelog
####Version 1.11.1
* fixed some bugs when sharing files with Conversations
####Version 1.11.0
* OMEMO encrypted conferences
* resend failed filetransfers automatically

View file

@ -61,8 +61,8 @@ android {
defaultConfig {
minSdkVersion 14
targetSdkVersion 23
versionCode 132
versionName "1.11.0"
versionCode 133
versionName "1.11.1"
archivesBaseName += "-$versionName"
applicationId "eu.siacs.conversations"
}

View file

@ -345,17 +345,8 @@ public class MucOptions {
}
public List<User> getUsers(int max) {
ArrayList<User> users = new ArrayList<>();
int i = 1;
for(User user : this.users.values()) {
users.add(user);
if (i >= max) {
break;
} else {
++i;
}
}
return users;
ArrayList<User> users = getUsers();
return users.subList(0, Math.min(max, users.size()));
}
public int getUserCount() {

View file

@ -1651,9 +1651,14 @@ public class ConversationActivity extends XmppActivity
protected void refreshUiReal() {
updateConversationList();
if (conversationList.size() > 0) {
if (!this.mConversationFragment.isAdded()) {
Log.d(Config.LOGTAG,"fragment NOT added to activity. detached="+Boolean.toString(mConversationFragment.isDetached()));
}
ConversationActivity.this.mConversationFragment.updateMessages();
updateActionBarTitle();
invalidateOptionsMenu();
} else {
Log.d(Config.LOGTAG,"not updating conversations fragment because conversations list size was 0");
}
}

View file

@ -5,7 +5,6 @@ import android.app.PendingIntent;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
@ -21,13 +20,10 @@ import android.widget.Toast;
import com.soundcloud.android.crop.Crop;
import java.io.File;
import java.io.FileNotFoundException;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.persistance.FileBackend;
import eu.siacs.conversations.utils.ExifHelper;
import eu.siacs.conversations.utils.FileUtils;
import eu.siacs.conversations.utils.PhoneHelper;
import eu.siacs.conversations.xmpp.pep.Avatar;
@ -184,7 +180,7 @@ public class PublishProfilePictureActivity extends XmppActivity {
}
return true;
} else {
return onOptionsItemSelected(item);
return super.onOptionsItemSelected(item);
}
}

View file

@ -17,17 +17,24 @@ import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.Message;
import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.ui.adapter.ConversationAdapter;
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
import eu.siacs.conversations.xmpp.jid.Jid;
public class ShareWithActivity extends XmppActivity {
public class ShareWithActivity extends XmppActivity implements XmppConnectionService.OnConversationUpdate {
@Override
public void onConversationUpdate() {
refreshUi();
}
private class Share {
public List<Uri> uris = new ArrayList<>();
@ -36,14 +43,17 @@ public class ShareWithActivity extends XmppActivity {
public String contact;
public String text;
public String uuid;
public boolean multiple = false;
}
private Share share;
private static final int REQUEST_START_NEW_CONVERSATION = 0x0501;
private ListView mListView;
private ConversationAdapter mAdapter;
private List<Conversation> mConversations = new ArrayList<>();
private Toast mToast;
private AtomicInteger attachmentCounter = new AtomicInteger(0);
private UiCallback<Message> attachFileCallback = new UiCallback<Message>() {
@ -59,26 +69,52 @@ public class ShareWithActivity extends XmppActivity {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (mToast != null) {
mToast.cancel();
}
if (share.uuid != null) {
mToast = Toast.makeText(getApplicationContext(),
getString(share.image ? R.string.shared_image_with_x : R.string.shared_file_with_x,message.getConversation().getName()),
Toast.LENGTH_SHORT);
mToast.show();
if (attachmentCounter.decrementAndGet() <=0 ) {
int resId;
if (share.image && share.multiple) {
resId = R.string.shared_images_with_x;
} else if (share.image) {
resId = R.string.shared_image_with_x;
} else {
resId = R.string.shared_file_with_x;
}
replaceToast(getString(resId, message.getConversation().getName()));
if (share.uuid != null) {
finish();
} else {
switchToConversation(message.getConversation());
}
}
}
});
}
@Override
public void error(int errorCode, Message object) {
// TODO Auto-generated method stub
public void error(final int errorCode, Message object) {
runOnUiThread(new Runnable() {
@Override
public void run() {
replaceToast(getString(errorCode));
if (attachmentCounter.decrementAndGet() <=0 ) {
finish();
}
}
});
}
};
protected void hideToast() {
if (mToast != null) {
mToast.cancel();
}
}
protected void replaceToast(String msg) {
hideToast();
mToast = Toast.makeText(this, msg ,Toast.LENGTH_LONG);
mToast.show();
}
protected void onActivityResult(int requestCode, int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_START_NEW_CONVERSATION
@ -107,8 +143,7 @@ public class ShareWithActivity extends XmppActivity {
setTitle(getString(R.string.title_activity_sharewith));
mListView = (ListView) findViewById(R.id.choose_conversation_list);
ConversationAdapter mAdapter = new ConversationAdapter(this,
this.mConversations);
mAdapter = new ConversationAdapter(this, this.mConversations);
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(new OnItemClickListener() {
@ -146,23 +181,24 @@ public class ShareWithActivity extends XmppActivity {
return;
}
final String type = intent.getType();
Log.d(Config.LOGTAG, "action: "+intent.getAction()+ ", type:"+type);
final String action = intent.getAction();
Log.d(Config.LOGTAG, "action: "+action+ ", type:"+type);
share.uuid = intent.getStringExtra("uuid");
if (Intent.ACTION_SEND.equals(intent.getAction())) {
final Uri uri = getIntent().getParcelableExtra(Intent.EXTRA_STREAM);
if (type != null && uri != null && !type.equalsIgnoreCase("text/plain")) {
if (Intent.ACTION_SEND.equals(action)) {
final String text = intent.getStringExtra(Intent.EXTRA_TEXT);
final Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
if (type != null && uri != null && text == null) {
this.share.uris.clear();
this.share.uris.add(uri);
this.share.image = type.startsWith("image/") || isImage(uri);
} else {
this.share.text = getIntent().getStringExtra(Intent.EXTRA_TEXT);
this.share.text = text;
}
} else if (Intent.ACTION_SEND_MULTIPLE.equals(intent.getAction())) {
} else if (Intent.ACTION_SEND_MULTIPLE.equals(action)) {
this.share.image = type != null && type.startsWith("image/");
if (!this.share.image) {
return;
}
this.share.uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
}
if (xmppConnectionServiceBound) {
@ -191,8 +227,7 @@ public class ShareWithActivity extends XmppActivity {
share();
return;
}
xmppConnectionService.populateWithOrderedConversations(mConversations,
this.share != null && this.share.uris.size() == 0);
refreshUiReal();
}
private void share() {
@ -224,6 +259,7 @@ public class ShareWithActivity extends XmppActivity {
}
private void share(final Conversation conversation) {
mListView.setEnabled(false);
if (conversation.getNextEncryption() == Message.ENCRYPTION_PGP && !hasPgp()) {
if (share.uuid == null) {
showInstallPgpDialog();
@ -237,29 +273,21 @@ public class ShareWithActivity extends XmppActivity {
OnPresenceSelected callback = new OnPresenceSelected() {
@Override
public void onPresenceSelected() {
attachmentCounter.set(share.uris.size());
if (share.image) {
mToast = Toast.makeText(getApplicationContext(),
getText(R.string.preparing_image),
Toast.LENGTH_LONG);
mToast.show();
share.multiple = share.uris.size() > 1;
replaceToast(getString(share.multiple ? R.string.preparing_images : R.string.preparing_image));
for (Iterator<Uri> i = share.uris.iterator(); i.hasNext(); i.remove()) {
ShareWithActivity.this.xmppConnectionService
.attachImageToConversation(conversation, i.next(),
attachFileCallback);
}
} else {
mToast = Toast.makeText(getApplicationContext(),
getText(R.string.preparing_file),
Toast.LENGTH_LONG);
mToast.show();
replaceToast(getString(R.string.preparing_file));
ShareWithActivity.this.xmppConnectionService
.attachFileToConversation(conversation, share.uris.get(0),
attachFileCallback);
}
if (share.uuid == null) {
switchToConversation(conversation, null, true);
}
finish();
}
};
if (conversation.getAccount().httpUploadAvailable()) {
@ -269,13 +297,21 @@ public class ShareWithActivity extends XmppActivity {
}
} else {
switchToConversation(conversation, this.share.text, true);
finish();
}
}
public void refreshUiReal() {
//nothing to do. This Activity doesn't implement any listeners
xmppConnectionService.populateWithOrderedConversations(mConversations, this.share != null && this.share.uris.size() == 0);
mAdapter.notifyDataSetChanged();
}
@Override
public void onBackPressed() {
if (attachmentCounter.get() >= 1) {
replaceToast(getString(R.string.sharing_files_please_wait));
} else {
super.onBackPressed();
}
}
}

View file

@ -1177,6 +1177,7 @@ public abstract class XmppActivity extends Activity {
} else {
if (cancelPotentialWork(message, imageView)) {
imageView.setBackgroundColor(0xff333333);
imageView.setImageDrawable(null);
final BitmapWorkerTask task = new BitmapWorkerTask(imageView);
final AsyncDrawable asyncDrawable = new AsyncDrawable(
getResources(), null, task);

View file

@ -10,6 +10,8 @@ import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import java.io.File;
public class FileUtils {
/**
@ -77,7 +79,14 @@ public class FileUtils {
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
return getDataColumn(context, uri, null, null);
String path = getDataColumn(context, uri, null, null);
if (path != null) {
File file = new File(path);
if (!file.canRead()) {
return null;
}
}
return path;
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {

View file

@ -508,8 +508,8 @@
<string name="pref_away_when_screen_off_summary">Setzt deinen Status auf \"abwesend\", solange dein Bildschirm abgeschaltet ist</string>
<string name="pref_xa_on_silent_mode">Nicht verfügbar bei Stummschaltung</string>
<string name="pref_xa_on_silent_mode_summary">Setzt deinen Status auf \"nicht verfügbar\", solange dein Gerät lautlos ist</string>
<string name="pref_treat_vibrate_as_silent">Behandle Vibration als stumm</string>
<string name="pref_treat_vibrate_as_silent_summary">Setze deinen Status auf \"nicht verfügbar\" solange dein Gerät auf \"vibrieren\" ist.</string>
<string name="pref_treat_vibrate_as_silent">Vibration als Lautlos behandeln</string>
<string name="pref_treat_vibrate_as_silent_summary">Setzt deinen Status auf \"nicht verfügbar\", solange das Gerät auf Vibration geschaltet ist</string>
<string name="hostname_example">xmpp.domain.de</string>
<string name="action_add_account_with_certificate">Konto mit Zertifikat hinzufügen</string>
<string name="unable_to_parse_certificate">Zertifikat kann nicht gelesen werden</string>
@ -596,9 +596,9 @@
<string name="conference_shutdown">Konferenz wurde geschlossen</string>
<string name="conference_name">Konferenz-Name</string>
<string name="invalid_conference_name">Ungültiger Konferenz-Name</string>
<string name="check_x_filesize_on_host">%1$s-Größe auf %2$s prüfen</string>
<string name="check_x_filesize_on_host">%1$s-Größe auf %2$s prüfen</string>
<string name="contact_has_no_pgp_key">Pix-Art Messenger ist nicht in der Lage, deine Nachrichten zu verschlüsseln, weil dein Kontakt seinen Schlüssel nicht preisgibt.\n\n</string>
<string name="no_keys_just_confirm">Du vertraust diesem Kontakt bereits. In dem du \'Fertig\' auswählst bestätigst Du, dass %s Teil dieser Konferenz ist.</string>
<string name="no_keys_just_confirm">Du vertraust diesem Kontakt bereits. Durch Auswählen von \"Fertig\" bestätigst du, dass %s Teil dieser Konferenz ist.</string>
<string name="select_image_and_crop">Bild auswählen und zuschneiden</string>
<string name="this_account_is_disabled">Du hast diesen Account deaktiviert</string>

View file

@ -72,6 +72,8 @@
<string name="send_failed">delivery failed</string>
<string name="send_rejected">rejected</string>
<string name="preparing_image">Preparing image for transmission</string>
<string name="preparing_images">Preparing images for transmission</string>
<string name="sharing_files_please_wait">Sharing files. Please wait…</string>
<string name="action_clear_history">Clear history</string>
<string name="clear_conversation_history">Clear Conversation History</string>
<string name="clear_histor_msg">Do you want to delete all messages within this Conversation?\n\n<b>Warning:</b> This will not influence messages stored on other devices or servers.</string>
@ -594,6 +596,7 @@
<string name="shared_file_with_x">Shared file with %s</string>
<string name="shared_image_with_x">Shared image with %s</string>
<string name="no_storage_permission">Pix-Art Messenger needs access to external storage</string>
<string name="shared_images_with_x">Shared images with %s</string>
<string name="sync_with_contacts">Synchronize with contacts</string>
<string name="sync_with_contacts_long">Pix-Art Messenger wants to match your XMPP roster with your contacts to show their full names and avatars.\n\nPix-Art Messenger will only read your contacts and match them locally without uploading them to your server.\n\nYou will now be asked to grant permission to access your contacts.</string>
<string name="certificate_information">Certificate Information</string>