refactored avatar generation. first step
This commit is contained in:
parent
0bb2c3c4d5
commit
21961673cb
|
@ -14,14 +14,10 @@ import org.json.JSONObject;
|
||||||
import eu.siacs.conversations.Config;
|
import eu.siacs.conversations.Config;
|
||||||
import eu.siacs.conversations.R;
|
import eu.siacs.conversations.R;
|
||||||
import eu.siacs.conversations.crypto.OtrEngine;
|
import eu.siacs.conversations.crypto.OtrEngine;
|
||||||
import eu.siacs.conversations.persistance.FileBackend;
|
|
||||||
import eu.siacs.conversations.services.XmppConnectionService;
|
import eu.siacs.conversations.services.XmppConnectionService;
|
||||||
import eu.siacs.conversations.utils.UIHelper;
|
|
||||||
import eu.siacs.conversations.xmpp.XmppConnection;
|
import eu.siacs.conversations.xmpp.XmppConnection;
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
|
|
||||||
public class Account extends AbstractEntity {
|
public class Account extends AbstractEntity {
|
||||||
|
@ -72,7 +68,7 @@ public class Account extends AbstractEntity {
|
||||||
private long mEndGracePeriod = 0L;
|
private long mEndGracePeriod = 0L;
|
||||||
private String otrFingerprint;
|
private String otrFingerprint;
|
||||||
private Roster roster = null;
|
private Roster roster = null;
|
||||||
|
|
||||||
private List<Bookmark> bookmarks = new CopyOnWriteArrayList<Bookmark>();
|
private List<Bookmark> bookmarks = new CopyOnWriteArrayList<Bookmark>();
|
||||||
public List<Conversation> pendingConferenceJoins = new CopyOnWriteArrayList<Conversation>();
|
public List<Conversation> pendingConferenceJoins = new CopyOnWriteArrayList<Conversation>();
|
||||||
public List<Conversation> pendingConferenceLeaves = new CopyOnWriteArrayList<Conversation>();
|
public List<Conversation> pendingConferenceLeaves = new CopyOnWriteArrayList<Conversation>();
|
||||||
|
@ -345,20 +341,6 @@ public class Account extends AbstractEntity {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Bitmap getImage(Context context, int size) {
|
|
||||||
if (this.avatar != null) {
|
|
||||||
Bitmap bm = FileBackend.getAvatar(this.avatar, size, context);
|
|
||||||
if (bm == null) {
|
|
||||||
return UIHelper.getContactPicture(getJid(), size, context,
|
|
||||||
false);
|
|
||||||
} else {
|
|
||||||
return bm;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return UIHelper.getContactPicture(getJid(), size, context, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean setAvatar(String filename) {
|
public boolean setAvatar(String filename) {
|
||||||
if (this.avatar != null && this.avatar.equals(filename)) {
|
if (this.avatar != null && this.avatar.equals(filename)) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -401,7 +383,7 @@ public class Account extends AbstractEntity {
|
||||||
return R.string.account_status_unknown;
|
return R.string.account_status_unknown;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void activateGracePeriod() {
|
public void activateGracePeriod() {
|
||||||
this.mEndGracePeriod = SystemClock.elapsedRealtime()
|
this.mEndGracePeriod = SystemClock.elapsedRealtime()
|
||||||
+ (Config.CARBON_GRACE_PERIOD * 1000);
|
+ (Config.CARBON_GRACE_PERIOD * 1000);
|
||||||
|
|
|
@ -2,9 +2,6 @@ package eu.siacs.conversations.entities;
|
||||||
|
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import eu.siacs.conversations.utils.UIHelper;
|
|
||||||
import eu.siacs.conversations.xml.Element;
|
import eu.siacs.conversations.xml.Element;
|
||||||
|
|
||||||
public class Bookmark extends Element implements ListItem {
|
public class Bookmark extends Element implements ListItem {
|
||||||
|
@ -120,21 +117,14 @@ public class Bookmark extends Element implements ListItem {
|
||||||
return this.account;
|
return this.account;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Bitmap getImage(int dpSize, Context context) {
|
|
||||||
if (this.mJoinedConversation == null) {
|
|
||||||
return UIHelper.getContactPicture(getDisplayName(), dpSize,
|
|
||||||
context, false);
|
|
||||||
} else {
|
|
||||||
return UIHelper.getContactPicture(this.mJoinedConversation, dpSize,
|
|
||||||
context, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setConversation(Conversation conversation) {
|
public void setConversation(Conversation conversation) {
|
||||||
this.mJoinedConversation = conversation;
|
this.mJoinedConversation = conversation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Conversation getConversation() {
|
||||||
|
return this.mJoinedConversation;
|
||||||
|
}
|
||||||
|
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return this.getAttribute("name");
|
return this.getAttribute("name");
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,13 +8,9 @@ import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import eu.siacs.conversations.persistance.FileBackend;
|
|
||||||
import eu.siacs.conversations.utils.UIHelper;
|
|
||||||
import eu.siacs.conversations.xml.Element;
|
import eu.siacs.conversations.xml.Element;
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.graphics.Bitmap;
|
|
||||||
|
|
||||||
public class Contact implements ListItem {
|
public class Contact implements ListItem {
|
||||||
public static final String TABLENAME = "contacts";
|
public static final String TABLENAME = "contacts";
|
||||||
|
@ -330,20 +326,6 @@ public class Contact implements ListItem {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Bitmap getImage(int size, Context context) {
|
|
||||||
if (this.avatar != null) {
|
|
||||||
Bitmap bm = FileBackend.getAvatar(avatar, size, context);
|
|
||||||
if (bm == null) {
|
|
||||||
return UIHelper.getContactPicture(this, size, context, false);
|
|
||||||
} else {
|
|
||||||
return bm;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return UIHelper.getContactPicture(this, size, context, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean setAvatar(String filename) {
|
public boolean setAvatar(String filename) {
|
||||||
if (this.avatar != null && this.avatar.equals(filename)) {
|
if (this.avatar != null && this.avatar.equals(filename)) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -353,6 +335,10 @@ public class Contact implements ListItem {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getAvatar() {
|
||||||
|
return this.avatar;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean deleteOtrFingerprint(String fingerprint) {
|
public boolean deleteOtrFingerprint(String fingerprint) {
|
||||||
boolean success = false;
|
boolean success = false;
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -8,7 +8,6 @@ import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
||||||
import eu.siacs.conversations.services.XmppConnectionService;
|
import eu.siacs.conversations.services.XmppConnectionService;
|
||||||
import eu.siacs.conversations.utils.UIHelper;
|
|
||||||
|
|
||||||
import net.java.otr4j.OtrException;
|
import net.java.otr4j.OtrException;
|
||||||
import net.java.otr4j.crypto.OtrCryptoEngineImpl;
|
import net.java.otr4j.crypto.OtrCryptoEngineImpl;
|
||||||
|
@ -17,9 +16,7 @@ import net.java.otr4j.session.SessionID;
|
||||||
import net.java.otr4j.session.SessionImpl;
|
import net.java.otr4j.session.SessionImpl;
|
||||||
import net.java.otr4j.session.SessionStatus;
|
import net.java.otr4j.session.SessionStatus;
|
||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.graphics.Bitmap;
|
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
|
|
||||||
public class Conversation extends AbstractEntity {
|
public class Conversation extends AbstractEntity {
|
||||||
|
@ -329,9 +326,8 @@ public class Conversation extends AbstractEntity {
|
||||||
|
|
||||||
public synchronized MucOptions getMucOptions() {
|
public synchronized MucOptions getMucOptions() {
|
||||||
if (this.mucOptions == null) {
|
if (this.mucOptions == null) {
|
||||||
this.mucOptions = new MucOptions(this.getAccount());
|
this.mucOptions = new MucOptions(this);
|
||||||
}
|
}
|
||||||
this.mucOptions.setConversation(this);
|
|
||||||
return this.mucOptions;
|
return this.mucOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -428,14 +424,6 @@ public class Conversation extends AbstractEntity {
|
||||||
return this.bookmark;
|
return this.bookmark;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Bitmap getImage(Context context, int size) {
|
|
||||||
if (mode == MODE_SINGLE) {
|
|
||||||
return getContact().getImage(size, context);
|
|
||||||
} else {
|
|
||||||
return UIHelper.getContactPicture(this, size, context, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean hasDuplicateMessage(Message message) {
|
public boolean hasDuplicateMessage(Message message) {
|
||||||
for (int i = this.getMessages().size() - 1; i >= 0; --i) {
|
for (int i = this.getMessages().size() - 1; i >= 0; --i) {
|
||||||
if (this.messages.get(i).equals(message)) {
|
if (this.messages.get(i).equals(message)) {
|
||||||
|
@ -496,7 +484,7 @@ public class Conversation extends AbstractEntity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void add(Message message) {
|
public void add(Message message) {
|
||||||
message.setConversation(this);
|
message.setConversation(this);
|
||||||
synchronized (this.messages) {
|
synchronized (this.messages) {
|
||||||
|
|
|
@ -1,12 +1,7 @@
|
||||||
package eu.siacs.conversations.entities;
|
package eu.siacs.conversations.entities;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.graphics.Bitmap;
|
|
||||||
|
|
||||||
public interface ListItem extends Comparable<ListItem> {
|
public interface ListItem extends Comparable<ListItem> {
|
||||||
public String getDisplayName();
|
public String getDisplayName();
|
||||||
|
|
||||||
public String getJid();
|
public String getJid();
|
||||||
|
|
||||||
public Bitmap getImage(int dpSize, Context context);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,6 +102,10 @@ public class MucOptions {
|
||||||
public long getPgpKeyId() {
|
public long getPgpKeyId() {
|
||||||
return this.pgpKeyId;
|
return this.pgpKeyId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Contact getContact() {
|
||||||
|
return account.getRoster().getContactFromRoster(getJid());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Account account;
|
private Account account;
|
||||||
|
@ -116,8 +120,9 @@ public class MucOptions {
|
||||||
private String joinnick;
|
private String joinnick;
|
||||||
private String password = null;
|
private String password = null;
|
||||||
|
|
||||||
public MucOptions(Account account) {
|
public MucOptions(Conversation conversation) {
|
||||||
this.account = account;
|
this.account = conversation.getAccount();
|
||||||
|
this.conversation = conversation;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void deleteUser(String name) {
|
public void deleteUser(String name) {
|
||||||
|
@ -253,10 +258,6 @@ public class MucOptions {
|
||||||
this.joinnick = nick;
|
this.joinnick = nick;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setConversation(Conversation conversation) {
|
|
||||||
this.conversation = conversation;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean online() {
|
public boolean online() {
|
||||||
return this.isOnline;
|
return this.isOnline;
|
||||||
}
|
}
|
||||||
|
@ -361,4 +362,8 @@ public class MucOptions {
|
||||||
conversation
|
conversation
|
||||||
.setAttribute(Conversation.ATTRIBUTE_MUC_PASSWORD, password);
|
.setAttribute(Conversation.ATTRIBUTE_MUC_PASSWORD, password);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Conversation getConversation() {
|
||||||
|
return this.conversation;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -15,6 +15,9 @@ public class Roster {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Contact getContactFromRoster(String jid) {
|
public Contact getContactFromRoster(String jid) {
|
||||||
|
if (jid == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
String cleanJid = jid.split("/", 2)[0];
|
String cleanJid = jid.split("/", 2)[0];
|
||||||
Contact contact = contacts.get(cleanJid);
|
Contact contact = contacts.get(cleanJid);
|
||||||
if (contact != null && contact.showInRoster()) {
|
if (contact != null && contact.showInRoster()) {
|
||||||
|
|
|
@ -91,17 +91,20 @@ public class HttpConnection implements Downloadable {
|
||||||
this.mStatus = status;
|
this.mStatus = status;
|
||||||
mXmppConnectionService.updateConversationUi();
|
mXmppConnectionService.updateConversationUi();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupTrustManager(HttpsURLConnection connection, boolean interactive) {
|
private void setupTrustManager(HttpsURLConnection connection,
|
||||||
|
boolean interactive) {
|
||||||
X509TrustManager trustManager;
|
X509TrustManager trustManager;
|
||||||
if (interactive) {
|
if (interactive) {
|
||||||
trustManager = mXmppConnectionService.getMemorizingTrustManager();
|
trustManager = mXmppConnectionService.getMemorizingTrustManager();
|
||||||
} else {
|
} else {
|
||||||
trustManager = mXmppConnectionService.getMemorizingTrustManager().getNonInteractive();
|
trustManager = mXmppConnectionService.getMemorizingTrustManager()
|
||||||
|
.getNonInteractive();
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
SSLContext sc = SSLContext.getInstance("TLS");
|
SSLContext sc = SSLContext.getInstance("TLS");
|
||||||
sc.init(null,new X509TrustManager[] { trustManager },mXmppConnectionService.getRNG());
|
sc.init(null, new X509TrustManager[] { trustManager },
|
||||||
|
mXmppConnectionService.getRNG());
|
||||||
connection.setSSLSocketFactory(sc.getSocketFactory());
|
connection.setSSLSocketFactory(sc.getSocketFactory());
|
||||||
} catch (KeyManagementException e) {
|
} catch (KeyManagementException e) {
|
||||||
return;
|
return;
|
||||||
|
@ -111,7 +114,7 @@ public class HttpConnection implements Downloadable {
|
||||||
}
|
}
|
||||||
|
|
||||||
private class FileSizeChecker implements Runnable {
|
private class FileSizeChecker implements Runnable {
|
||||||
|
|
||||||
private boolean interactive = false;
|
private boolean interactive = false;
|
||||||
|
|
||||||
public FileSizeChecker(boolean interactive) {
|
public FileSizeChecker(boolean interactive) {
|
||||||
|
@ -139,7 +142,8 @@ public class HttpConnection implements Downloadable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private long retrieveFileSize() throws IOException, SSLHandshakeException {
|
private long retrieveFileSize() throws IOException,
|
||||||
|
SSLHandshakeException {
|
||||||
HttpURLConnection connection = (HttpURLConnection) mUrl
|
HttpURLConnection connection = (HttpURLConnection) mUrl
|
||||||
.openConnection();
|
.openConnection();
|
||||||
connection.setRequestMethod("HEAD");
|
connection.setRequestMethod("HEAD");
|
||||||
|
|
|
@ -152,13 +152,12 @@ public class DatabaseBackend extends SQLiteOpenHelper {
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<Message> getMessages(
|
public ArrayList<Message> getMessages(Conversation conversations, int limit) {
|
||||||
Conversation conversations, int limit) {
|
|
||||||
return getMessages(conversations, limit, -1);
|
return getMessages(conversations, limit, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<Message> getMessages(Conversation conversation,
|
public ArrayList<Message> getMessages(Conversation conversation, int limit,
|
||||||
int limit, long timestamp) {
|
long timestamp) {
|
||||||
ArrayList<Message> list = new ArrayList<Message>();
|
ArrayList<Message> list = new ArrayList<Message>();
|
||||||
SQLiteDatabase db = this.getReadableDatabase();
|
SQLiteDatabase db = this.getReadableDatabase();
|
||||||
Cursor cursor;
|
Cursor cursor;
|
||||||
|
|
|
@ -35,7 +35,6 @@ import eu.siacs.conversations.entities.Conversation;
|
||||||
import eu.siacs.conversations.entities.DownloadableFile;
|
import eu.siacs.conversations.entities.DownloadableFile;
|
||||||
import eu.siacs.conversations.entities.Message;
|
import eu.siacs.conversations.entities.Message;
|
||||||
import eu.siacs.conversations.utils.CryptoHelper;
|
import eu.siacs.conversations.utils.CryptoHelper;
|
||||||
import eu.siacs.conversations.utils.UIHelper;
|
|
||||||
import eu.siacs.conversations.xmpp.pep.Avatar;
|
import eu.siacs.conversations.xmpp.pep.Avatar;
|
||||||
|
|
||||||
public class FileBackend {
|
public class FileBackend {
|
||||||
|
@ -69,8 +68,7 @@ public class FileBackend {
|
||||||
return getFile(message, true);
|
return getFile(message, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public DownloadableFile getFile(Message message,
|
public DownloadableFile getFile(Message message, boolean decrypted) {
|
||||||
boolean decrypted) {
|
|
||||||
StringBuilder filename = new StringBuilder();
|
StringBuilder filename = new StringBuilder();
|
||||||
filename.append(getConversationsDirectory());
|
filename.append(getConversationsDirectory());
|
||||||
filename.append(message.getUuid());
|
filename.append(message.getUuid());
|
||||||
|
@ -85,10 +83,11 @@ public class FileBackend {
|
||||||
}
|
}
|
||||||
return new DownloadableFile(filename.toString());
|
return new DownloadableFile(filename.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getConversationsDirectory() {
|
public static String getConversationsDirectory() {
|
||||||
return Environment.getExternalStoragePublicDirectory(
|
return Environment.getExternalStoragePublicDirectory(
|
||||||
Environment.DIRECTORY_PICTURES).getAbsolutePath()+"/Conversations/";
|
Environment.DIRECTORY_PICTURES).getAbsolutePath()
|
||||||
|
+ "/Conversations/";
|
||||||
}
|
}
|
||||||
|
|
||||||
public Bitmap resize(Bitmap originalBitmap, int size) {
|
public Bitmap resize(Bitmap originalBitmap, int size) {
|
||||||
|
@ -219,8 +218,7 @@ public class FileBackend {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Bitmap getImageFromMessage(Message message) {
|
public Bitmap getImageFromMessage(Message message) {
|
||||||
return BitmapFactory.decodeFile(getFile(message)
|
return BitmapFactory.decodeFile(getFile(message).getAbsolutePath());
|
||||||
.getAbsolutePath());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Bitmap getThumbnail(Message message, int size, boolean cacheOnly)
|
public Bitmap getThumbnail(Message message, int size, boolean cacheOnly)
|
||||||
|
@ -306,7 +304,7 @@ public class FileBackend {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isAvatarCached(Avatar avatar) {
|
public boolean isAvatarCached(Avatar avatar) {
|
||||||
File file = new File(getAvatarPath(context, avatar.getFilename()));
|
File file = new File(getAvatarPath(avatar.getFilename()));
|
||||||
return file.exists();
|
return file.exists();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -314,7 +312,7 @@ public class FileBackend {
|
||||||
if (isAvatarCached(avatar)) {
|
if (isAvatarCached(avatar)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
String filename = getAvatarPath(context, avatar.getFilename());
|
String filename = getAvatarPath(avatar.getFilename());
|
||||||
File file = new File(filename + ".tmp");
|
File file = new File(filename + ".tmp");
|
||||||
file.getParentFile().mkdirs();
|
file.getParentFile().mkdirs();
|
||||||
try {
|
try {
|
||||||
|
@ -346,10 +344,14 @@ public class FileBackend {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getAvatarPath(Context context, String avatar) {
|
public String getAvatarPath(String avatar) {
|
||||||
return context.getFilesDir().getAbsolutePath() + "/avatars/" + avatar;
|
return context.getFilesDir().getAbsolutePath() + "/avatars/" + avatar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Uri getAvatarUri(String avatar) {
|
||||||
|
return Uri.parse("file:" + getAvatarPath(avatar));
|
||||||
|
}
|
||||||
|
|
||||||
public Bitmap cropCenterSquare(Uri image, int size) {
|
public Bitmap cropCenterSquare(Uri image, int size) {
|
||||||
try {
|
try {
|
||||||
BitmapFactory.Options options = new BitmapFactory.Options();
|
BitmapFactory.Options options = new BitmapFactory.Options();
|
||||||
|
@ -371,7 +373,40 @@ public class FileBackend {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Bitmap cropCenterSquare(Bitmap input, int size) {
|
public Bitmap cropCenter(Uri image, int newHeight, int newWidth) {
|
||||||
|
try {
|
||||||
|
BitmapFactory.Options options = new BitmapFactory.Options();
|
||||||
|
options.inSampleSize = calcSampleSize(image,
|
||||||
|
Math.max(newHeight, newWidth));
|
||||||
|
InputStream is = context.getContentResolver()
|
||||||
|
.openInputStream(image);
|
||||||
|
Bitmap source = BitmapFactory.decodeStream(is, null, options);
|
||||||
|
|
||||||
|
int sourceWidth = source.getWidth();
|
||||||
|
int sourceHeight = source.getHeight();
|
||||||
|
float xScale = (float) newWidth / sourceWidth;
|
||||||
|
float yScale = (float) newHeight / sourceHeight;
|
||||||
|
float scale = Math.max(xScale, yScale);
|
||||||
|
float scaledWidth = scale * sourceWidth;
|
||||||
|
float scaledHeight = scale * sourceHeight;
|
||||||
|
float left = (newWidth - scaledWidth) / 2;
|
||||||
|
float top = (newHeight - scaledHeight) / 2;
|
||||||
|
|
||||||
|
RectF targetRect = new RectF(left, top, left + scaledWidth, top
|
||||||
|
+ scaledHeight);
|
||||||
|
Bitmap dest = Bitmap.createBitmap(newWidth, newHeight,
|
||||||
|
source.getConfig());
|
||||||
|
Canvas canvas = new Canvas(dest);
|
||||||
|
canvas.drawBitmap(source, null, targetRect, null);
|
||||||
|
|
||||||
|
return dest;
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap cropCenterSquare(Bitmap input, int size) {
|
||||||
int w = input.getWidth();
|
int w = input.getWidth();
|
||||||
int h = input.getHeight();
|
int h = input.getHeight();
|
||||||
|
|
||||||
|
@ -440,13 +475,15 @@ public class FileBackend {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Bitmap getAvatar(String avatar, int size, Context context) {
|
public Bitmap getAvatar(String avatar, int size) {
|
||||||
Bitmap bm = BitmapFactory.decodeFile(FileBackend.getAvatarPath(context,
|
if (avatar == null) {
|
||||||
avatar));
|
return null;
|
||||||
|
}
|
||||||
|
Bitmap bm = cropCenter(getAvatarUri(avatar), size, size);
|
||||||
if (bm == null) {
|
if (bm == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return cropCenterSquare(bm, UIHelper.getRealPx(size, context));
|
return bm;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isFileAvailable(Message message) {
|
public boolean isFileAvailable(Message message) {
|
||||||
|
|
194
src/eu/siacs/conversations/services/AvatarService.java
Normal file
194
src/eu/siacs/conversations/services/AvatarService.java
Normal file
|
@ -0,0 +1,194 @@
|
||||||
|
package eu.siacs.conversations.services;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
|
||||||
|
import eu.siacs.conversations.entities.Account;
|
||||||
|
import eu.siacs.conversations.entities.Bookmark;
|
||||||
|
import eu.siacs.conversations.entities.Contact;
|
||||||
|
import eu.siacs.conversations.entities.Conversation;
|
||||||
|
import eu.siacs.conversations.entities.ListItem;
|
||||||
|
import eu.siacs.conversations.entities.MucOptions;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.Canvas;
|
||||||
|
import android.graphics.Paint;
|
||||||
|
import android.graphics.Rect;
|
||||||
|
import android.graphics.Typeface;
|
||||||
|
import android.net.Uri;
|
||||||
|
|
||||||
|
public class AvatarService {
|
||||||
|
|
||||||
|
private static final int FG_COLOR = 0xFFFAFAFA;
|
||||||
|
private static final int TRANSPARENT = 0x00000000;
|
||||||
|
|
||||||
|
protected XmppConnectionService mXmppConnectionService = null;
|
||||||
|
|
||||||
|
public AvatarService(XmppConnectionService service) {
|
||||||
|
this.mXmppConnectionService = service;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap getAvatar(Contact contact, int size) {
|
||||||
|
Bitmap avatar = mXmppConnectionService.getFileBackend().getAvatar(
|
||||||
|
contact.getAvatar(), size);
|
||||||
|
if (avatar == null) {
|
||||||
|
if (contact.getProfilePhoto() != null) {
|
||||||
|
avatar = mXmppConnectionService.getFileBackend()
|
||||||
|
.cropCenterSquare(Uri.parse(contact.getProfilePhoto()),
|
||||||
|
size);
|
||||||
|
if (avatar == null) {
|
||||||
|
avatar = getAvatar(contact.getDisplayName(), size);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
avatar = getAvatar(contact.getDisplayName(), size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return avatar;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap getAvatar(ListItem item, int size) {
|
||||||
|
if (item instanceof Contact) {
|
||||||
|
return getAvatar((Contact) item, size);
|
||||||
|
} else if (item instanceof Bookmark) {
|
||||||
|
Bookmark bookmark = (Bookmark) item;
|
||||||
|
if (bookmark.getConversation() != null) {
|
||||||
|
return getAvatar(bookmark.getConversation(), size);
|
||||||
|
} else {
|
||||||
|
return getAvatar(bookmark.getDisplayName(), size);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return getAvatar(item.getDisplayName(), size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap getAvatar(Conversation conversation, int size) {
|
||||||
|
if (conversation.getMode() == Conversation.MODE_SINGLE) {
|
||||||
|
return getAvatar(conversation.getContact(), size);
|
||||||
|
} else {
|
||||||
|
return getAvatar(conversation.getMucOptions(), size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap getAvatar(MucOptions mucOptions, int size) {
|
||||||
|
List<MucOptions.User> users = mucOptions.getUsers();
|
||||||
|
int count = users.size();
|
||||||
|
Bitmap bitmap = Bitmap
|
||||||
|
.createBitmap(size, size, Bitmap.Config.ARGB_8888);
|
||||||
|
Canvas canvas = new Canvas(bitmap);
|
||||||
|
bitmap.eraseColor(TRANSPARENT);
|
||||||
|
|
||||||
|
if (count == 0) {
|
||||||
|
String name = mucOptions.getConversation().getName();
|
||||||
|
String letter = name.substring(0, 1);
|
||||||
|
int color = this.getColorForName(name);
|
||||||
|
drawTile(canvas, letter, color, 0, 0, size, size);
|
||||||
|
} else if (count == 1) {
|
||||||
|
drawTile(canvas, users.get(0), 0, 0, size, size);
|
||||||
|
} else if (count == 2) {
|
||||||
|
drawTile(canvas, users.get(0), 0, 0, size / 2 - 1, size);
|
||||||
|
drawTile(canvas, users.get(1), size / 2 + 1, 0, size, size);
|
||||||
|
} else if (count == 3) {
|
||||||
|
drawTile(canvas, users.get(0), 0, 0, size / 2 - 1, size);
|
||||||
|
drawTile(canvas, users.get(1), size / 2 + 1, 0, size, size / 2 - 1);
|
||||||
|
drawTile(canvas, users.get(2), size / 2 + 1, size / 2 + 1, size,
|
||||||
|
size);
|
||||||
|
} else if (count == 4) {
|
||||||
|
drawTile(canvas, users.get(0), 0, 0, size / 2 - 1, size / 2 - 1);
|
||||||
|
drawTile(canvas, users.get(1), 0, size / 2 + 1, size / 2 - 1, size);
|
||||||
|
drawTile(canvas, users.get(2), size / 2 + 1, 0, size, size / 2 - 1);
|
||||||
|
drawTile(canvas, users.get(3), size / 2 + 1, size / 2 + 1, size,
|
||||||
|
size);
|
||||||
|
} else {
|
||||||
|
drawTile(canvas, users.get(0), 0, 0, size / 2 - 1, size / 2 - 1);
|
||||||
|
drawTile(canvas, users.get(1), 0, size / 2 + 1, size / 2 - 1, size);
|
||||||
|
drawTile(canvas, users.get(2), size / 2 + 1, 0, size, size / 2 - 1);
|
||||||
|
drawTile(canvas, "\u2026", 0xFF202020, size / 2 + 1, size / 2 + 1,
|
||||||
|
size, size);
|
||||||
|
}
|
||||||
|
return bitmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap getAvatar(Account account, int size) {
|
||||||
|
Bitmap avatar = mXmppConnectionService.getFileBackend().getAvatar(
|
||||||
|
account.getAvatar(), size);
|
||||||
|
if (avatar == null) {
|
||||||
|
avatar = getAvatar(account.getJid(), size);
|
||||||
|
}
|
||||||
|
return avatar;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Bitmap getAvatar(String name, int size) {
|
||||||
|
Bitmap bitmap = Bitmap
|
||||||
|
.createBitmap(size, size, Bitmap.Config.ARGB_8888);
|
||||||
|
Canvas canvas = new Canvas(bitmap);
|
||||||
|
String letter = name.substring(0, 1);
|
||||||
|
int color = this.getColorForName(name);
|
||||||
|
drawTile(canvas, letter, color, 0, 0, size, size);
|
||||||
|
return bitmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawTile(Canvas canvas, String letter, int tileColor,
|
||||||
|
int left, int top, int right, int bottom) {
|
||||||
|
letter = letter.toUpperCase(Locale.getDefault());
|
||||||
|
Paint tilePaint = new Paint(), textPaint = new Paint();
|
||||||
|
tilePaint.setColor(tileColor);
|
||||||
|
textPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
|
||||||
|
textPaint.setColor(FG_COLOR);
|
||||||
|
textPaint.setTypeface(Typeface.create("sans-serif-light",
|
||||||
|
Typeface.NORMAL));
|
||||||
|
textPaint.setTextSize((float) ((right - left) * 0.8));
|
||||||
|
Rect rect = new Rect();
|
||||||
|
|
||||||
|
canvas.drawRect(new Rect(left, top, right, bottom), tilePaint);
|
||||||
|
textPaint.getTextBounds(letter, 0, 1, rect);
|
||||||
|
float width = textPaint.measureText(letter);
|
||||||
|
canvas.drawText(letter, (right + left) / 2 - width / 2, (top + bottom)
|
||||||
|
/ 2 + rect.height() / 2, textPaint);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawTile(Canvas canvas, MucOptions.User user, int left,
|
||||||
|
int top, int right, int bottom) {
|
||||||
|
Contact contact = user.getContact();
|
||||||
|
if (contact != null) {
|
||||||
|
Uri uri = null;
|
||||||
|
if (contact.getAvatar() != null) {
|
||||||
|
uri = mXmppConnectionService.getFileBackend().getAvatarUri(
|
||||||
|
contact.getAvatar());
|
||||||
|
} else if (contact.getProfilePhoto() != null) {
|
||||||
|
uri = Uri.parse(contact.getProfilePhoto());
|
||||||
|
}
|
||||||
|
if (uri != null) {
|
||||||
|
Bitmap bitmap = mXmppConnectionService.getFileBackend()
|
||||||
|
.cropCenter(uri, bottom - top, right - left);
|
||||||
|
if (bitmap != null) {
|
||||||
|
drawTile(canvas, bitmap, left, top, right, bottom);
|
||||||
|
} else {
|
||||||
|
String letter = user.getName().substring(0, 1);
|
||||||
|
int color = this.getColorForName(user.getName());
|
||||||
|
drawTile(canvas, letter, color, left, top, right, bottom);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
String letter = user.getName().substring(0, 1);
|
||||||
|
int color = this.getColorForName(user.getName());
|
||||||
|
drawTile(canvas, letter, color, left, top, right, bottom);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
String letter = user.getName().substring(0, 1);
|
||||||
|
int color = this.getColorForName(user.getName());
|
||||||
|
drawTile(canvas, letter, color, left, top, right, bottom);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void drawTile(Canvas canvas, Bitmap bm, int dstleft, int dsttop,
|
||||||
|
int dstright, int dstbottom) {
|
||||||
|
Rect dst = new Rect(dstleft, dsttop, dstright, dstbottom);
|
||||||
|
canvas.drawBitmap(bm, null, dst, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getColorForName(String name) {
|
||||||
|
int holoColors[] = { 0xFFe91e63, 0xFF9c27b0, 0xFF673ab7, 0xFF3f51b5,
|
||||||
|
0xFF5677fc, 0xFF03a9f4, 0xFF00bcd4, 0xFF009688, 0xFFff5722,
|
||||||
|
0xFF795548, 0xFF607d8b };
|
||||||
|
return holoColors[(int) ((name.hashCode() & 0xffffffffl) % holoColors.length)];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -33,7 +33,7 @@ public class NotificationService {
|
||||||
public int NOTIFICATION_ID = 0x2342;
|
public int NOTIFICATION_ID = 0x2342;
|
||||||
private Conversation mOpenConversation;
|
private Conversation mOpenConversation;
|
||||||
private boolean mIsInForeground;
|
private boolean mIsInForeground;
|
||||||
|
|
||||||
public NotificationService(XmppConnectionService service) {
|
public NotificationService(XmppConnectionService service) {
|
||||||
this.mXmppConnectionService = service;
|
this.mXmppConnectionService = service;
|
||||||
this.mNotificationManager = (NotificationManager) service
|
this.mNotificationManager = (NotificationManager) service
|
||||||
|
@ -97,8 +97,8 @@ public class NotificationService {
|
||||||
if (messages.size() >= 1) {
|
if (messages.size() >= 1) {
|
||||||
Conversation conversation = messages.get(0)
|
Conversation conversation = messages.get(0)
|
||||||
.getConversation();
|
.getConversation();
|
||||||
mBuilder.setLargeIcon(conversation.getImage(
|
// mBuilder.setLargeIcon(conversation.getImage(mXmppConnectionService,
|
||||||
mXmppConnectionService, 64));
|
// 64));
|
||||||
mBuilder.setContentTitle(conversation.getName());
|
mBuilder.setContentTitle(conversation.getName());
|
||||||
StringBuilder text = new StringBuilder();
|
StringBuilder text = new StringBuilder();
|
||||||
for (int i = 0; i < messages.size(); ++i) {
|
for (int i = 0; i < messages.size(); ++i) {
|
||||||
|
|
|
@ -111,6 +111,7 @@ public class XmppConnectionService extends Service {
|
||||||
this);
|
this);
|
||||||
private HttpConnectionManager mHttpConnectionManager = new HttpConnectionManager(
|
private HttpConnectionManager mHttpConnectionManager = new HttpConnectionManager(
|
||||||
this);
|
this);
|
||||||
|
private AvatarService mAvatarService = new AvatarService(this);
|
||||||
|
|
||||||
private OnConversationUpdate mOnConversationUpdate = null;
|
private OnConversationUpdate mOnConversationUpdate = null;
|
||||||
private Integer convChangedListenerCount = 0;
|
private Integer convChangedListenerCount = 0;
|
||||||
|
@ -144,9 +145,10 @@ public class XmppConnectionService extends Service {
|
||||||
startService(intent);
|
startService(intent);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
private FileObserver fileObserver = new FileObserver(FileBackend.getConversationsDirectory()) {
|
private FileObserver fileObserver = new FileObserver(
|
||||||
|
FileBackend.getConversationsDirectory()) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEvent(int event, String path) {
|
public void onEvent(int event, String path) {
|
||||||
if (event == FileObserver.DELETE) {
|
if (event == FileObserver.DELETE) {
|
||||||
|
@ -286,6 +288,10 @@ public class XmppConnectionService extends Service {
|
||||||
return this.fileBackend;
|
return this.fileBackend;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AvatarService getAvatarService() {
|
||||||
|
return this.mAvatarService;
|
||||||
|
}
|
||||||
|
|
||||||
public Message attachImageToConversation(final Conversation conversation,
|
public Message attachImageToConversation(final Conversation conversation,
|
||||||
final Uri uri, final UiCallback<Message> callback) {
|
final Uri uri, final UiCallback<Message> callback) {
|
||||||
final Message message;
|
final Message message;
|
||||||
|
@ -346,7 +352,7 @@ public class XmppConnectionService extends Service {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.wakeLock.acquire();
|
this.wakeLock.acquire();
|
||||||
|
|
||||||
for (Account account : accounts) {
|
for (Account account : accounts) {
|
||||||
if (!account.isOptionSet(Account.OPTION_DISABLED)) {
|
if (!account.isOptionSet(Account.OPTION_DISABLED)) {
|
||||||
if (!hasInternetConnection()) {
|
if (!hasInternetConnection()) {
|
||||||
|
@ -407,7 +413,7 @@ public class XmppConnectionService extends Service {
|
||||||
}
|
}
|
||||||
return START_STICKY;
|
return START_STICKY;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasInternetConnection() {
|
public boolean hasInternetConnection() {
|
||||||
ConnectivityManager cm = (ConnectivityManager) getApplicationContext()
|
ConnectivityManager cm = (ConnectivityManager) getApplicationContext()
|
||||||
.getSystemService(Context.CONNECTIVITY_SERVICE);
|
.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||||
|
@ -818,21 +824,24 @@ public class XmppConnectionService extends Service {
|
||||||
}
|
}
|
||||||
return this.conversations;
|
return this.conversations;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkDeletedFiles(Conversation conversation) {
|
private void checkDeletedFiles(Conversation conversation) {
|
||||||
for(Message message : conversation.getMessages()) {
|
for (Message message : conversation.getMessages()) {
|
||||||
if (message.getType() == Message.TYPE_IMAGE && message.getEncryption() != Message.ENCRYPTION_PGP) {
|
if (message.getType() == Message.TYPE_IMAGE
|
||||||
|
&& message.getEncryption() != Message.ENCRYPTION_PGP) {
|
||||||
if (!getFileBackend().isFileAvailable(message)) {
|
if (!getFileBackend().isFileAvailable(message)) {
|
||||||
message.setDownloadable(new DeletedDownloadable());
|
message.setDownloadable(new DeletedDownloadable());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void markFileDeleted(String uuid) {
|
private void markFileDeleted(String uuid) {
|
||||||
for(Conversation conversation : getConversations()) {
|
for (Conversation conversation : getConversations()) {
|
||||||
for(Message message : conversation.getMessages()) {
|
for (Message message : conversation.getMessages()) {
|
||||||
if (message.getType() == Message.TYPE_IMAGE && message.getEncryption() != Message.ENCRYPTION_PGP && message.getUuid().equals(uuid)) {
|
if (message.getType() == Message.TYPE_IMAGE
|
||||||
|
&& message.getEncryption() != Message.ENCRYPTION_PGP
|
||||||
|
&& message.getUuid().equals(uuid)) {
|
||||||
if (!getFileBackend().isFileAvailable(message)) {
|
if (!getFileBackend().isFileAvailable(message)) {
|
||||||
message.setDownloadable(new DeletedDownloadable());
|
message.setDownloadable(new DeletedDownloadable());
|
||||||
updateConversationUi();
|
updateConversationUi();
|
||||||
|
@ -1113,7 +1122,7 @@ public class XmppConnectionService extends Service {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log.d(Config.LOGTAG,"app switched into foreground");
|
Log.d(Config.LOGTAG, "app switched into foreground");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void switchToBackground() {
|
private void switchToBackground() {
|
||||||
|
@ -1126,7 +1135,7 @@ public class XmppConnectionService extends Service {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.mNotificationService.setIsInForeground(false);
|
this.mNotificationService.setIsInForeground(false);
|
||||||
Log.d(Config.LOGTAG,"app switched into background");
|
Log.d(Config.LOGTAG, "app switched into background");
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isScreenOn() {
|
private boolean isScreenOn() {
|
||||||
|
@ -1288,7 +1297,9 @@ public class XmppConnectionService extends Service {
|
||||||
leaveMuc(conversation);
|
leaveMuc(conversation);
|
||||||
} else {
|
} else {
|
||||||
if (conversation.endOtrIfNeeded()) {
|
if (conversation.endOtrIfNeeded()) {
|
||||||
Log.d(Config.LOGTAG,account.getJid()+": ended otr session with "+conversation.getContactJid());
|
Log.d(Config.LOGTAG, account.getJid()
|
||||||
|
+ ": ended otr session with "
|
||||||
|
+ conversation.getContactJid());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1871,7 +1882,7 @@ public class XmppConnectionService extends Service {
|
||||||
public HttpConnectionManager getHttpConnectionManager() {
|
public HttpConnectionManager getHttpConnectionManager() {
|
||||||
return this.mHttpConnectionManager;
|
return this.mHttpConnectionManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
private class DeletedDownloadable implements Downloadable {
|
private class DeletedDownloadable implements Downloadable {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1888,6 +1899,6 @@ public class XmppConnectionService extends Service {
|
||||||
public long getFileSize() {
|
public long getFileSize() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -201,7 +201,8 @@ public class ConferenceDetailsActivity extends XmppActivity {
|
||||||
private void populateView() {
|
private void populateView() {
|
||||||
mAccountJid.setText(getString(R.string.using_account, conversation
|
mAccountJid.setText(getString(R.string.using_account, conversation
|
||||||
.getAccount().getJid()));
|
.getAccount().getJid()));
|
||||||
mYourPhoto.setImageBitmap(conversation.getAccount().getImage(this, 48));
|
mYourPhoto.setImageBitmap(xmppConnectionService.getAvatarService()
|
||||||
|
.getAvatar(conversation.getAccount(), getPixel(48)));
|
||||||
setTitle(conversation.getName());
|
setTitle(conversation.getName());
|
||||||
mFullJid.setText(conversation.getContactJid().split("/", 2)[0]);
|
mFullJid.setText(conversation.getContactJid().split("/", 2)[0]);
|
||||||
mYourNick.setText(conversation.getMucOptions().getActualNick());
|
mYourNick.setText(conversation.getMucOptions().getActualNick());
|
||||||
|
@ -248,21 +249,23 @@ public class ConferenceDetailsActivity extends XmppActivity {
|
||||||
}
|
}
|
||||||
Bitmap bm;
|
Bitmap bm;
|
||||||
if (user.getJid() != null) {
|
if (user.getJid() != null) {
|
||||||
Contact contact = account.getRoster().getContact(user.getJid());
|
Contact contact = account.getRoster().getContactFromRoster(
|
||||||
if (contact.showInRoster()) {
|
user.getJid());
|
||||||
bm = contact.getImage(48, this);
|
if (contact != null) {
|
||||||
|
bm = xmppConnectionService.getAvatarService().getAvatar(
|
||||||
|
contact, getPixel(48));
|
||||||
name.setText(contact.getDisplayName());
|
name.setText(contact.getDisplayName());
|
||||||
role.setText(user.getName() + " \u2022 "
|
role.setText(user.getName() + " \u2022 "
|
||||||
+ getReadableRole(user.getRole()));
|
+ getReadableRole(user.getRole()));
|
||||||
} else {
|
} else {
|
||||||
bm = UIHelper.getContactPicture(user.getName(), 48, this,
|
bm = xmppConnectionService.getAvatarService().getAvatar(
|
||||||
false);
|
user.getName(), getPixel(48));
|
||||||
name.setText(user.getName());
|
name.setText(user.getName());
|
||||||
role.setText(getReadableRole(user.getRole()));
|
role.setText(getReadableRole(user.getRole()));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
bm = UIHelper
|
bm = xmppConnectionService.getAvatarService().getAvatar(
|
||||||
.getContactPicture(user.getName(), 48, this, false);
|
user.getName(), getPixel(48));
|
||||||
name.setText(user.getName());
|
name.setText(user.getName());
|
||||||
role.setText(getReadableRole(user.getRole()));
|
role.setText(getReadableRole(user.getRole()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -313,10 +313,7 @@ public class ContactDetailsActivity extends XmppActivity {
|
||||||
}
|
}
|
||||||
accountJidTv.setText(getString(R.string.using_account, contact
|
accountJidTv.setText(getString(R.string.using_account, contact
|
||||||
.getAccount().getJid()));
|
.getAccount().getJid()));
|
||||||
|
prepareContactBadge(badge, contact);
|
||||||
UIHelper.prepareContactBadge(this, badge, contact,
|
|
||||||
getApplicationContext());
|
|
||||||
|
|
||||||
if (contact.getSystemAccount() == null) {
|
if (contact.getSystemAccount() == null) {
|
||||||
badge.setOnClickListener(onBadgeClick);
|
badge.setOnClickListener(onBadgeClick);
|
||||||
}
|
}
|
||||||
|
@ -383,6 +380,16 @@ public class ContactDetailsActivity extends XmppActivity {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void prepareContactBadge(QuickContactBadge badge, Contact contact) {
|
||||||
|
if (contact.getSystemAccount() != null) {
|
||||||
|
String[] systemAccount = contact.getSystemAccount().split("#");
|
||||||
|
long id = Long.parseLong(systemAccount[0]);
|
||||||
|
badge.assignContactUri(Contacts.getLookupUri(id, systemAccount[1]));
|
||||||
|
}
|
||||||
|
badge.setImageBitmap(xmppConnectionService.getAvatarService()
|
||||||
|
.getAvatar(contact, getPixel(72)));
|
||||||
|
}
|
||||||
|
|
||||||
protected void confirmToDeleteFingerprint(final String fingerprint) {
|
protected void confirmToDeleteFingerprint(final String fingerprint) {
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
AlertDialog.Builder builder = new AlertDialog.Builder(this);
|
||||||
builder.setTitle(R.string.delete_fingerprint);
|
builder.setTitle(R.string.delete_fingerprint);
|
||||||
|
|
|
@ -158,8 +158,8 @@ public class PublishProfilePictureActivity extends XmppActivity {
|
||||||
if (this.avatarUri == null) {
|
if (this.avatarUri == null) {
|
||||||
if (this.account.getAvatar() != null
|
if (this.account.getAvatar() != null
|
||||||
|| this.defaultUri == null) {
|
|| this.defaultUri == null) {
|
||||||
this.avatar.setImageBitmap(this.account.getImage(
|
// this.avatar.setImageBitmap(this.account.getImage(getApplicationContext(),
|
||||||
getApplicationContext(), 384));
|
// 384));
|
||||||
if (this.defaultUri != null) {
|
if (this.defaultUri != null) {
|
||||||
this.avatar
|
this.avatar
|
||||||
.setOnLongClickListener(this.backToDefaultListener);
|
.setOnLongClickListener(this.backToDefaultListener);
|
||||||
|
|
|
@ -526,6 +526,11 @@ public abstract class XmppActivity extends Activity {
|
||||||
return this.mSecondaryBackgroundColor;
|
return this.mSecondaryBackgroundColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getPixel(int dp) {
|
||||||
|
DisplayMetrics metrics = getResources().getDisplayMetrics();
|
||||||
|
return ((int) (dp * metrics.density));
|
||||||
|
}
|
||||||
|
|
||||||
class BitmapWorkerTask extends AsyncTask<Message, Void, Bitmap> {
|
class BitmapWorkerTask extends AsyncTask<Message, Void, Bitmap> {
|
||||||
private final WeakReference<ImageView> imageViewReference;
|
private final WeakReference<ImageView> imageViewReference;
|
||||||
private Message message = null;
|
private Message message = null;
|
||||||
|
|
|
@ -34,7 +34,8 @@ public class AccountAdapter extends ArrayAdapter<Account> {
|
||||||
jid.setText(account.getJid());
|
jid.setText(account.getJid());
|
||||||
TextView statusView = (TextView) view.findViewById(R.id.account_status);
|
TextView statusView = (TextView) view.findViewById(R.id.account_status);
|
||||||
ImageView imageView = (ImageView) view.findViewById(R.id.account_image);
|
ImageView imageView = (ImageView) view.findViewById(R.id.account_image);
|
||||||
imageView.setImageBitmap(account.getImage(activity, 48));
|
imageView.setImageBitmap(activity.xmppConnectionService
|
||||||
|
.getAvatarService().getAvatar(account, activity.getPixel(48)));
|
||||||
switch (account.getStatus()) {
|
switch (account.getStatus()) {
|
||||||
case Account.STATUS_DISABLED:
|
case Account.STATUS_DISABLED:
|
||||||
statusView.setText(getContext().getString(
|
statusView.setText(getContext().getString(
|
||||||
|
|
|
@ -127,7 +127,9 @@ public class ConversationAdapter extends ArrayAdapter<Conversation> {
|
||||||
|
|
||||||
ImageView profilePicture = (ImageView) view
|
ImageView profilePicture = (ImageView) view
|
||||||
.findViewById(R.id.conversation_image);
|
.findViewById(R.id.conversation_image);
|
||||||
profilePicture.setImageBitmap(conversation.getImage(activity, 56));
|
profilePicture.setImageBitmap(activity.xmppConnectionService
|
||||||
|
.getAvatarService().getAvatar(conversation,
|
||||||
|
activity.getPixel(56)));
|
||||||
|
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import java.util.List;
|
||||||
|
|
||||||
import eu.siacs.conversations.R;
|
import eu.siacs.conversations.R;
|
||||||
import eu.siacs.conversations.entities.ListItem;
|
import eu.siacs.conversations.entities.ListItem;
|
||||||
|
import eu.siacs.conversations.ui.XmppActivity;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
@ -14,8 +15,11 @@ import android.widget.TextView;
|
||||||
|
|
||||||
public class ListItemAdapter extends ArrayAdapter<ListItem> {
|
public class ListItemAdapter extends ArrayAdapter<ListItem> {
|
||||||
|
|
||||||
public ListItemAdapter(Context context, List<ListItem> objects) {
|
protected XmppActivity activity;
|
||||||
super(context, 0, objects);
|
|
||||||
|
public ListItemAdapter(XmppActivity activity, List<ListItem> objects) {
|
||||||
|
super(activity, 0, objects);
|
||||||
|
this.activity = activity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -32,7 +36,8 @@ public class ListItemAdapter extends ArrayAdapter<ListItem> {
|
||||||
|
|
||||||
jid.setText(item.getJid());
|
jid.setText(item.getJid());
|
||||||
name.setText(item.getDisplayName());
|
name.setText(item.getDisplayName());
|
||||||
picture.setImageBitmap(item.getImage(48, getContext()));
|
picture.setImageBitmap(activity.xmppConnectionService
|
||||||
|
.getAvatarService().getAvatar(item, activity.getPixel(48)));
|
||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -59,8 +59,10 @@ public class MessageAdapter extends ArrayAdapter<Message> {
|
||||||
if (this.accountBitmap == null) {
|
if (this.accountBitmap == null) {
|
||||||
|
|
||||||
if (getCount() > 0) {
|
if (getCount() > 0) {
|
||||||
this.accountBitmap = getItem(0).getConversation().getAccount()
|
this.accountBitmap = activity.xmppConnectionService
|
||||||
.getImage(getContext(), 48);
|
.getAvatarService().getAvatar(
|
||||||
|
getItem(0).getConversation().getAccount(),
|
||||||
|
activity.getPixel(48));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return this.accountBitmap;
|
return this.accountBitmap;
|
||||||
|
@ -494,9 +496,12 @@ public class MessageAdapter extends ArrayAdapter<Message> {
|
||||||
&& d.getStatus() == Downloadable.STATUS_DELETED) {
|
&& d.getStatus() == Downloadable.STATUS_DELETED) {
|
||||||
displayInfoMessage(viewHolder, R.string.image_file_deleted);
|
displayInfoMessage(viewHolder, R.string.image_file_deleted);
|
||||||
} else if (d != null && d.getStatus() == Downloadable.STATUS_OFFER) {
|
} else if (d != null && d.getStatus() == Downloadable.STATUS_OFFER) {
|
||||||
displayDownloadableMessage(viewHolder, item,R.string.download_image);
|
displayDownloadableMessage(viewHolder, item,
|
||||||
} else if (d != null && d.getStatus() == Downloadable.STATUS_OFFER_CHECK_FILESIZE) {
|
R.string.download_image);
|
||||||
displayDownloadableMessage(viewHolder, item,R.string.check_image_filesize);
|
} else if (d != null
|
||||||
|
&& d.getStatus() == Downloadable.STATUS_OFFER_CHECK_FILESIZE) {
|
||||||
|
displayDownloadableMessage(viewHolder, item,
|
||||||
|
R.string.check_image_filesize);
|
||||||
} else if ((item.getEncryption() == Message.ENCRYPTION_DECRYPTED)
|
} else if ((item.getEncryption() == Message.ENCRYPTION_DECRYPTED)
|
||||||
|| (item.getEncryption() == Message.ENCRYPTION_NONE)
|
|| (item.getEncryption() == Message.ENCRYPTION_NONE)
|
||||||
|| (item.getEncryption() == Message.ENCRYPTION_OTR)) {
|
|| (item.getEncryption() == Message.ENCRYPTION_OTR)) {
|
||||||
|
@ -564,7 +569,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
|
||||||
public Bitmap get(Contact contact, Context context) {
|
public Bitmap get(Contact contact, Context context) {
|
||||||
if (!contactBitmaps.containsKey(contact.getJid())) {
|
if (!contactBitmaps.containsKey(contact.getJid())) {
|
||||||
contactBitmaps.put(contact.getJid(),
|
contactBitmaps.put(contact.getJid(),
|
||||||
contact.getImage(48, context));
|
activity.xmppConnectionService.getAvatarService()
|
||||||
|
.getAvatar(contact, activity.getPixel(48)));
|
||||||
}
|
}
|
||||||
return contactBitmaps.get(contact.getJid());
|
return contactBitmaps.get(contact.getJid());
|
||||||
}
|
}
|
||||||
|
@ -573,8 +579,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
|
||||||
if (unknownBitmaps.containsKey(name)) {
|
if (unknownBitmaps.containsKey(name)) {
|
||||||
return unknownBitmaps.get(name);
|
return unknownBitmaps.get(name);
|
||||||
} else {
|
} else {
|
||||||
Bitmap bm = UIHelper
|
Bitmap bm = activity.xmppConnectionService.getAvatarService()
|
||||||
.getContactPicture(name, 48, context, false);
|
.getAvatar(name, activity.getPixel(48));
|
||||||
unknownBitmaps.put(name, bm);
|
unknownBitmaps.put(name, bm);
|
||||||
return bm;
|
return bm;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ public class PhoneHelper {
|
||||||
|
|
||||||
final String[] PROJECTION = new String[] { ContactsContract.Data._ID,
|
final String[] PROJECTION = new String[] { ContactsContract.Data._ID,
|
||||||
ContactsContract.Data.DISPLAY_NAME,
|
ContactsContract.Data.DISPLAY_NAME,
|
||||||
ContactsContract.Data.PHOTO_THUMBNAIL_URI,
|
ContactsContract.Data.PHOTO_URI,
|
||||||
ContactsContract.Data.LOOKUP_KEY,
|
ContactsContract.Data.LOOKUP_KEY,
|
||||||
ContactsContract.CommonDataKinds.Im.DATA };
|
ContactsContract.CommonDataKinds.Im.DATA };
|
||||||
|
|
||||||
|
@ -50,10 +50,8 @@ public class PhoneHelper {
|
||||||
"displayname",
|
"displayname",
|
||||||
cursor.getString(cursor
|
cursor.getString(cursor
|
||||||
.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)));
|
.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)));
|
||||||
contact.putString(
|
contact.putString("photouri", cursor.getString(cursor
|
||||||
"photouri",
|
.getColumnIndex(ContactsContract.Data.PHOTO_URI)));
|
||||||
cursor.getString(cursor
|
|
||||||
.getColumnIndex(ContactsContract.Data.PHOTO_THUMBNAIL_URI)));
|
|
||||||
contact.putString("lookup", cursor.getString(cursor
|
contact.putString("lookup", cursor.getString(cursor
|
||||||
.getColumnIndex(ContactsContract.Data.LOOKUP_KEY)));
|
.getColumnIndex(ContactsContract.Data.LOOKUP_KEY)));
|
||||||
|
|
||||||
|
|
|
@ -123,167 +123,6 @@ public class UIHelper {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getRealPx(int dp, Context context) {
|
|
||||||
final DisplayMetrics metrics = context.getResources()
|
|
||||||
.getDisplayMetrics();
|
|
||||||
return ((int) (dp * metrics.density));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int getNameColor(String name) {
|
|
||||||
/*
|
|
||||||
* int holoColors[] = { 0xFF1da9da, 0xFFb368d9, 0xFF83b600, 0xFFffa713,
|
|
||||||
* 0xFFe92727 };
|
|
||||||
*/
|
|
||||||
int holoColors[] = { 0xFFe91e63, 0xFF9c27b0, 0xFF673ab7, 0xFF3f51b5,
|
|
||||||
0xFF5677fc, 0xFF03a9f4, 0xFF00bcd4, 0xFF009688, 0xFFff5722,
|
|
||||||
0xFF795548, 0xFF607d8b };
|
|
||||||
return holoColors[(int) ((name.hashCode() & 0xffffffffl) % holoColors.length)];
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void drawTile(Canvas canvas, String letter, int tileColor,
|
|
||||||
int textColor, int left, int top, int right, int bottom) {
|
|
||||||
Paint tilePaint = new Paint(), textPaint = new Paint();
|
|
||||||
tilePaint.setColor(tileColor);
|
|
||||||
textPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
|
|
||||||
textPaint.setColor(textColor);
|
|
||||||
textPaint.setTypeface(Typeface.create("sans-serif-light",
|
|
||||||
Typeface.NORMAL));
|
|
||||||
textPaint.setTextSize((float) ((right - left) * 0.8));
|
|
||||||
Rect rect = new Rect();
|
|
||||||
|
|
||||||
canvas.drawRect(new Rect(left, top, right, bottom), tilePaint);
|
|
||||||
textPaint.getTextBounds(letter, 0, 1, rect);
|
|
||||||
float width = textPaint.measureText(letter);
|
|
||||||
canvas.drawText(letter, (right + left) / 2 - width / 2, (top + bottom)
|
|
||||||
/ 2 + rect.height() / 2, textPaint);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Bitmap getUnknownContactPicture(String[] names, int size,
|
|
||||||
int bgColor, int fgColor) {
|
|
||||||
int tiles = (names.length > 4) ? 4 : (names.length < 1) ? 1
|
|
||||||
: names.length;
|
|
||||||
Bitmap bitmap = Bitmap
|
|
||||||
.createBitmap(size, size, Bitmap.Config.ARGB_8888);
|
|
||||||
Canvas canvas = new Canvas(bitmap);
|
|
||||||
|
|
||||||
String[] letters = new String[tiles];
|
|
||||||
int[] colors = new int[tiles];
|
|
||||||
if (names.length < 1) {
|
|
||||||
letters[0] = "?";
|
|
||||||
colors[0] = 0xFFe92727;
|
|
||||||
} else {
|
|
||||||
for (int i = 0; i < tiles; ++i) {
|
|
||||||
letters[i] = (names[i].length() > 0) ? names[i].substring(0, 1)
|
|
||||||
.toUpperCase(Locale.US) : " ";
|
|
||||||
colors[i] = getNameColor(names[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (names.length > 4) {
|
|
||||||
letters[3] = "\u2026"; // Unicode ellipsis
|
|
||||||
colors[3] = 0xFF202020;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bitmap.eraseColor(bgColor);
|
|
||||||
|
|
||||||
switch (tiles) {
|
|
||||||
case 1:
|
|
||||||
drawTile(canvas, letters[0], colors[0], fgColor, 0, 0, size, size);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 2:
|
|
||||||
drawTile(canvas, letters[0], colors[0], fgColor, 0, 0,
|
|
||||||
size / 2 - 1, size);
|
|
||||||
drawTile(canvas, letters[1], colors[1], fgColor, size / 2 + 1, 0,
|
|
||||||
size, size);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 3:
|
|
||||||
drawTile(canvas, letters[0], colors[0], fgColor, 0, 0,
|
|
||||||
size / 2 - 1, size);
|
|
||||||
drawTile(canvas, letters[1], colors[1], fgColor, size / 2 + 1, 0,
|
|
||||||
size, size / 2 - 1);
|
|
||||||
drawTile(canvas, letters[2], colors[2], fgColor, size / 2 + 1,
|
|
||||||
size / 2 + 1, size, size);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 4:
|
|
||||||
drawTile(canvas, letters[0], colors[0], fgColor, 0, 0,
|
|
||||||
size / 2 - 1, size / 2 - 1);
|
|
||||||
drawTile(canvas, letters[1], colors[1], fgColor, 0, size / 2 + 1,
|
|
||||||
size / 2 - 1, size);
|
|
||||||
drawTile(canvas, letters[2], colors[2], fgColor, size / 2 + 1, 0,
|
|
||||||
size, size / 2 - 1);
|
|
||||||
drawTile(canvas, letters[3], colors[3], fgColor, size / 2 + 1,
|
|
||||||
size / 2 + 1, size, size);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return bitmap;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Bitmap getMucContactPicture(Conversation conversation,
|
|
||||||
int size, int bgColor, int fgColor) {
|
|
||||||
List<User> members = conversation.getMucOptions().getUsers();
|
|
||||||
if (members.size() == 0) {
|
|
||||||
return getUnknownContactPicture(
|
|
||||||
new String[] { conversation.getName() }, size, bgColor,
|
|
||||||
fgColor);
|
|
||||||
}
|
|
||||||
ArrayList<String> names = new ArrayList<String>();
|
|
||||||
names.add(conversation.getMucOptions().getActualNick());
|
|
||||||
for (User user : members) {
|
|
||||||
names.add(user.getName());
|
|
||||||
if (names.size() > 4) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String[] mArrayNames = new String[names.size()];
|
|
||||||
names.toArray(mArrayNames);
|
|
||||||
return getUnknownContactPicture(mArrayNames, size, bgColor, fgColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Bitmap getContactPicture(Conversation conversation,
|
|
||||||
int dpSize, Context context, boolean notification) {
|
|
||||||
if (conversation.getMode() == Conversation.MODE_SINGLE) {
|
|
||||||
return getContactPicture(conversation.getContact(), dpSize,
|
|
||||||
context, notification);
|
|
||||||
} else {
|
|
||||||
int fgColor = UIHelper.FG_COLOR, bgColor = (notification) ? UIHelper.BG_COLOR
|
|
||||||
: UIHelper.TRANSPARENT;
|
|
||||||
|
|
||||||
return getMucContactPicture(conversation,
|
|
||||||
getRealPx(dpSize, context), bgColor, fgColor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Bitmap getContactPicture(Contact contact, int dpSize,
|
|
||||||
Context context, boolean notification) {
|
|
||||||
String uri = contact.getProfilePhoto();
|
|
||||||
if (uri == null) {
|
|
||||||
return getContactPicture(contact.getDisplayName(), dpSize, context,
|
|
||||||
notification);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Bitmap bm = BitmapFactory.decodeStream(context.getContentResolver()
|
|
||||||
.openInputStream(Uri.parse(uri)));
|
|
||||||
return Bitmap.createScaledBitmap(bm, getRealPx(dpSize, context),
|
|
||||||
getRealPx(dpSize, context), false);
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
return getContactPicture(contact.getDisplayName(), dpSize, context,
|
|
||||||
notification);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Bitmap getContactPicture(String name, int dpSize,
|
|
||||||
Context context, boolean notification) {
|
|
||||||
int fgColor = UIHelper.FG_COLOR, bgColor = (notification) ? UIHelper.BG_COLOR
|
|
||||||
: UIHelper.TRANSPARENT;
|
|
||||||
|
|
||||||
return getUnknownContactPicture(new String[] { name },
|
|
||||||
getRealPx(dpSize, context), bgColor, fgColor);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void showErrorNotification(Context context,
|
public static void showErrorNotification(Context context,
|
||||||
List<Account> accounts) {
|
List<Account> accounts) {
|
||||||
NotificationManager mNotificationManager = (NotificationManager) context
|
NotificationManager mNotificationManager = (NotificationManager) context
|
||||||
|
@ -326,16 +165,6 @@ public class UIHelper {
|
||||||
mNotificationManager.notify(1111, notification);
|
mNotificationManager.notify(1111, notification);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void prepareContactBadge(final Activity activity,
|
|
||||||
QuickContactBadge badge, final Contact contact, Context context) {
|
|
||||||
if (contact.getSystemAccount() != null) {
|
|
||||||
String[] systemAccount = contact.getSystemAccount().split("#");
|
|
||||||
long id = Long.parseLong(systemAccount[0]);
|
|
||||||
badge.assignContactUri(Contacts.getLookupUri(id, systemAccount[1]));
|
|
||||||
}
|
|
||||||
badge.setImageBitmap(contact.getImage(72, context));
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressLint("InflateParams")
|
@SuppressLint("InflateParams")
|
||||||
public static AlertDialog getVerifyFingerprintDialog(
|
public static AlertDialog getVerifyFingerprintDialog(
|
||||||
final ConversationActivity activity,
|
final ConversationActivity activity,
|
||||||
|
@ -370,25 +199,6 @@ public class UIHelper {
|
||||||
return builder.create();
|
return builder.create();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Bitmap getSelfContactPicture(Account account, int size,
|
|
||||||
boolean showPhoneSelfContactPicture, Context context) {
|
|
||||||
if (showPhoneSelfContactPicture) {
|
|
||||||
Uri selfiUri = PhoneHelper.getSefliUri(context);
|
|
||||||
if (selfiUri != null) {
|
|
||||||
try {
|
|
||||||
return BitmapFactory.decodeStream(context
|
|
||||||
.getContentResolver().openInputStream(selfiUri));
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
return getContactPicture(account.getJid(), size, context,
|
|
||||||
false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return getContactPicture(account.getJid(), size, context, false);
|
|
||||||
} else {
|
|
||||||
return getContactPicture(account.getJid(), size, context, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private final static class EmoticonPattern {
|
private final static class EmoticonPattern {
|
||||||
Pattern pattern;
|
Pattern pattern;
|
||||||
String replacement;
|
String replacement;
|
||||||
|
|
|
@ -110,7 +110,7 @@ public class XmppConnection implements Runnable {
|
||||||
private OnBindListener bindListener = null;
|
private OnBindListener bindListener = null;
|
||||||
private OnMessageAcknowledged acknowledgedListener = null;
|
private OnMessageAcknowledged acknowledgedListener = null;
|
||||||
private MemorizingTrustManager mMemorizingTrustManager;
|
private MemorizingTrustManager mMemorizingTrustManager;
|
||||||
private final Context applicationContext;
|
private final Context applicationContext;
|
||||||
|
|
||||||
public XmppConnection(Account account, XmppConnectionService service) {
|
public XmppConnection(Account account, XmppConnectionService service) {
|
||||||
this.mRandom = service.getRNG();
|
this.mRandom = service.getRNG();
|
||||||
|
@ -119,7 +119,7 @@ public class XmppConnection implements Runnable {
|
||||||
this.wakeLock = service.getPowerManager().newWakeLock(
|
this.wakeLock = service.getPowerManager().newWakeLock(
|
||||||
PowerManager.PARTIAL_WAKE_LOCK, account.getJid());
|
PowerManager.PARTIAL_WAKE_LOCK, account.getJid());
|
||||||
tagWriter = new TagWriter();
|
tagWriter = new TagWriter();
|
||||||
applicationContext = service.getApplicationContext();
|
applicationContext = service.getApplicationContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void changeStatus(int nextStatus) {
|
protected void changeStatus(int nextStatus) {
|
||||||
|
@ -172,13 +172,15 @@ public class XmppConnection implements Runnable {
|
||||||
} else {
|
} else {
|
||||||
boolean socketError = true;
|
boolean socketError = true;
|
||||||
int srvIndex = 0;
|
int srvIndex = 0;
|
||||||
while (socketError && namePort.containsKey("name" + srvIndex)){
|
while (socketError
|
||||||
|
&& namePort.containsKey("name" + srvIndex)) {
|
||||||
try {
|
try {
|
||||||
srvRecordServer = namePort.getString("name" + srvIndex);
|
srvRecordServer = namePort.getString("name"
|
||||||
|
+ srvIndex);
|
||||||
srvRecordPort = namePort.getInt("port" + srvIndex);
|
srvRecordPort = namePort.getInt("port" + srvIndex);
|
||||||
Log.d(Config.LOGTAG, account.getJid()
|
Log.d(Config.LOGTAG, account.getJid()
|
||||||
+ ": using values from dns " + srvRecordServer
|
+ ": using values from dns "
|
||||||
+ ":" + srvRecordPort);
|
+ srvRecordServer + ":" + srvRecordPort);
|
||||||
socket = new Socket(srvRecordServer, srvRecordPort);
|
socket = new Socket(srvRecordServer, srvRecordPort);
|
||||||
socketError = false;
|
socketError = false;
|
||||||
} catch (UnknownHostException e) {
|
} catch (UnknownHostException e) {
|
||||||
|
@ -384,13 +386,13 @@ public class XmppConnection implements Runnable {
|
||||||
iq.addChild("ping", "urn:xmpp:ping");
|
iq.addChild("ping", "urn:xmpp:ping");
|
||||||
this.sendIqPacket(iq, new OnIqPacketReceived() {
|
this.sendIqPacket(iq, new OnIqPacketReceived() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onIqPacketReceived(Account account, IqPacket packet) {
|
public void onIqPacketReceived(Account account, IqPacket packet) {
|
||||||
Log.d(Config.LOGTAG, account.getJid()
|
Log.d(Config.LOGTAG, account.getJid()
|
||||||
+ ": online with resource " + account.getResource());
|
+ ": online with resource " + account.getResource());
|
||||||
changeStatus(Account.STATUS_ONLINE);
|
changeStatus(Account.STATUS_ONLINE);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private Element processPacket(Tag currentTag, int packetType)
|
private Element processPacket(Tag currentTag, int packetType)
|
||||||
|
@ -527,7 +529,8 @@ public class XmppConnection implements Runnable {
|
||||||
}
|
}
|
||||||
|
|
||||||
private SharedPreferences getPreferences() {
|
private SharedPreferences getPreferences() {
|
||||||
return PreferenceManager.getDefaultSharedPreferences(applicationContext);
|
return PreferenceManager
|
||||||
|
.getDefaultSharedPreferences(applicationContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean enableLegacySSL() {
|
private boolean enableLegacySSL() {
|
||||||
|
@ -551,14 +554,15 @@ public class XmppConnection implements Runnable {
|
||||||
true);
|
true);
|
||||||
|
|
||||||
// Support all protocols except legacy SSL.
|
// Support all protocols except legacy SSL.
|
||||||
// The min SDK version prevents us having to worry about SSLv2. In future, this may be
|
// The min SDK version prevents us having to worry about SSLv2. In
|
||||||
|
// future, this may be
|
||||||
// true of SSLv3 as well.
|
// true of SSLv3 as well.
|
||||||
final String[] supportProtocols;
|
final String[] supportProtocols;
|
||||||
if (enableLegacySSL()) {
|
if (enableLegacySSL()) {
|
||||||
supportProtocols = sslSocket.getSupportedProtocols();
|
supportProtocols = sslSocket.getSupportedProtocols();
|
||||||
} else {
|
} else {
|
||||||
final List<String> supportedProtocols = new LinkedList<String>(Arrays.asList(
|
final List<String> supportedProtocols = new LinkedList<String>(
|
||||||
sslSocket.getSupportedProtocols()));
|
Arrays.asList(sslSocket.getSupportedProtocols()));
|
||||||
supportedProtocols.remove("SSLv3");
|
supportedProtocols.remove("SSLv3");
|
||||||
supportProtocols = new String[supportedProtocols.size()];
|
supportProtocols = new String[supportedProtocols.size()];
|
||||||
supportedProtocols.toArray(supportProtocols);
|
supportedProtocols.toArray(supportProtocols);
|
||||||
|
@ -613,7 +617,8 @@ public class XmppConnection implements Runnable {
|
||||||
} else if (compressionAvailable()) {
|
} else if (compressionAvailable()) {
|
||||||
sendCompressionZlib();
|
sendCompressionZlib();
|
||||||
} else if (this.streamFeatures.hasChild("register")
|
} else if (this.streamFeatures.hasChild("register")
|
||||||
&& account.isOptionSet(Account.OPTION_REGISTER) && usingEncryption) {
|
&& account.isOptionSet(Account.OPTION_REGISTER)
|
||||||
|
&& usingEncryption) {
|
||||||
sendRegistryRequest();
|
sendRegistryRequest();
|
||||||
} else if (!this.streamFeatures.hasChild("register")
|
} else if (!this.streamFeatures.hasChild("register")
|
||||||
&& account.isOptionSet(Account.OPTION_REGISTER)) {
|
&& account.isOptionSet(Account.OPTION_REGISTER)) {
|
||||||
|
@ -637,7 +642,8 @@ public class XmppConnection implements Runnable {
|
||||||
} else if (this.streamFeatures.hasChild("bind") && shouldBind) {
|
} else if (this.streamFeatures.hasChild("bind") && shouldBind) {
|
||||||
sendBindRequest();
|
sendBindRequest();
|
||||||
} else {
|
} else {
|
||||||
Log.d(Config.LOGTAG,account.getJid()+": incompatible server. disconnecting");
|
Log.d(Config.LOGTAG, account.getJid()
|
||||||
|
+ ": incompatible server. disconnecting");
|
||||||
disconnect(true);
|
disconnect(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -358,8 +358,8 @@ public class JingleConnection implements Downloadable {
|
||||||
Content content = new Content(this.contentCreator, this.contentName);
|
Content content = new Content(this.contentCreator, this.contentName);
|
||||||
if (message.getType() == Message.TYPE_IMAGE) {
|
if (message.getType() == Message.TYPE_IMAGE) {
|
||||||
content.setTransportId(this.transportId);
|
content.setTransportId(this.transportId);
|
||||||
this.file = this.mXmppConnectionService.getFileBackend()
|
this.file = this.mXmppConnectionService.getFileBackend().getFile(
|
||||||
.getFile(message, false);
|
message, false);
|
||||||
if (message.getEncryption() == Message.ENCRYPTION_OTR) {
|
if (message.getEncryption() == Message.ENCRYPTION_OTR) {
|
||||||
Conversation conversation = this.message.getConversation();
|
Conversation conversation = this.message.getConversation();
|
||||||
this.mXmppConnectionService.renewSymmetricKey(conversation);
|
this.mXmppConnectionService.renewSymmetricKey(conversation);
|
||||||
|
@ -634,7 +634,7 @@ public class JingleConnection implements Downloadable {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendFallbackToIbb() {
|
private void sendFallbackToIbb() {
|
||||||
Log.d(Config.LOGTAG,"sending fallback to ibb");
|
Log.d(Config.LOGTAG, "sending fallback to ibb");
|
||||||
JinglePacket packet = this.bootstrapPacket("transport-replace");
|
JinglePacket packet = this.bootstrapPacket("transport-replace");
|
||||||
Content content = new Content(this.contentCreator, this.contentName);
|
Content content = new Content(this.contentCreator, this.contentName);
|
||||||
this.transportId = this.mJingleConnectionManager.nextRandomId();
|
this.transportId = this.mJingleConnectionManager.nextRandomId();
|
||||||
|
@ -646,7 +646,7 @@ public class JingleConnection implements Downloadable {
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean receiveFallbackToIbb(JinglePacket packet) {
|
private boolean receiveFallbackToIbb(JinglePacket packet) {
|
||||||
Log.d(Config.LOGTAG,"receiving fallack to ibb");
|
Log.d(Config.LOGTAG, "receiving fallack to ibb");
|
||||||
String receivedBlockSize = packet.getJingleContent().ibbTransport()
|
String receivedBlockSize = packet.getJingleContent().ibbTransport()
|
||||||
.getAttribute("block-size");
|
.getAttribute("block-size");
|
||||||
if (receivedBlockSize != null) {
|
if (receivedBlockSize != null) {
|
||||||
|
@ -881,7 +881,7 @@ public class JingleConnection implements Downloadable {
|
||||||
if (account.getStatus() == Account.STATUS_ONLINE) {
|
if (account.getStatus() == Account.STATUS_ONLINE) {
|
||||||
if (mJingleStatus == JINGLE_STATUS_INITIATED) {
|
if (mJingleStatus == JINGLE_STATUS_INITIATED) {
|
||||||
new Thread(new Runnable() {
|
new Thread(new Runnable() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
sendAccept();
|
sendAccept();
|
||||||
|
|
Loading…
Reference in a new issue